V tomto článku sa detailne pozrieme na to, akým spôsobom môžeme získať informácie obsiahnuté v premenných prostredia. Dozvieme sa, prostredníctvom akého objektu sú tieto informácie dostupné, a v druhej časti sa pozrieme bližšie na možnosti a využitie metódy lookup.

Získanie hodnôt premenných prostredia a objekt Context

Metóda getEnvironment definovaná v rozhraní Context, vráti objekt typu Hashtable obsahujúci všetky premenné prostredia (dvojice kľúč-hodnota), majúce vplyv na objekt Context. Ak budete potrebovať modifikovať tieto premenné za behu programu, musíte využiť metódu addToEnvironment, respektíve metódu removeFromEnvironment.

Vytvorme si teda ukážkový príklad, v ktorom sa pokúsim získať a nejakým jednoduchým spôsobom prečítať hodnoty nastavené v premenných prostredia. Za týmto účelom si vytvoríme konfiguračný súbor jndi.properties, obsahujúci dva záznamy. Nasledujúci výpis zobrazuje spomínaný súbor:

java.naming.factory.initial=
com.sun.jndi.fscontext.RefFSContextFactory
java.naming.provider.url=file:///c:/jndi_root/

Uvedený konfiguračný súbor sa môže nachádzať kdekoľvek v rámci danej classpath. V prípade nejasností sa môžete pozrieť na článok JNDI – environment properties (možnosti nastavenia), v ktorom sú uvedené bližšie informácie.

Nasledovný výpis názorne zobrazuje spôsob, ktorým je možné programovo prečítať a vypísať jednotlivé premenné prostredia.

ListJNDIEnvironment.java:

import javax.naming.*;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Properties;
import java.util.Set;
public class ListJNDIEnvironment {
 ListJNDIEnvironment(){
  super();
 }
 public void listEnvironmentProperties(){
  Context initCtx = null;
  try {
   /*
   * Vytvoríme InitialContext. Súbor jndi.properties
   * bude použitý pre uloženie premenných prostredia
   */

   initCtx = new InitialContext();
   /*
   * Vytvoríme zoznam všetkých premenných prostredia
   * pre tento Context
   */

   Hashtable env = initCtx.getEnvironment();
   Set keys = env.keySet();
   Iterator iter = keys.iterator();
   while( iter.hasNext() ) {
    String key = (String)iter.next();
    String value = (String)env.get( key );
    System.out.println( key + „=“ + value );
   }
  } catch( NoInitialContextException ex ){
   System.out.println( „Nezadali ste InitialContext“ );
   System.out.println( „Skontroluj súbor jndi.properties“ );
  } catch( NamingException ex ){
   ex.printStackTrace();
  } finally {
   // Uzatvoríme používané zdroje
   closeInitialContext( initCtx );
  }
 }
 // Vždy treba uzatvoriť InitialContext
 public void closeInitialContext( Context ctx ){
  try {
   if ( ctx != null ) {
    System.out.println( „Uzatváram InitialContext“ );
    ctx.close();
   }
  } catch ( NamingException ex ) {
   ex.printStackTrace();
  }
 }
 public static void main( String[] args ){
  ListJNDIEnvironment client = new ListJNDIEnvironment();
  // Vypíšeme zoznam použitých premenných prostredia
  client.listEnvironmentProperties();
 }
}

Keď skompilujete a pustíte uvedenú triedu, mali by ste dostať nasledujúci výpis (v prípade, že použijete iného poskytovateľa JNDI služby, výstup sa môže líšiť):

Výsledok spustenia súboru ListJNDIEnvironment.java Výsledok spustenia súboru ListJNDIEnvironment.java (NetBeans 4.1)

Použitie metódy lookup()

Teraz, keď sme sa už naučili ako získať objekt InitialContext, je načase, aby sme ho aj nejakým spôsobom použili. Spomenuté využitie bude spočívať vo vyhľadávaní objektov a referencií na ne. Pretože používame file system implementáciu, objekt, ktorý budeme vyhľadávať, bude súbor. Konkrétne textový súbor.

Vytvorte si preto prázdny súbor, nazvite ho napríklad something.txt a umiestnite ho do adresára jndi_root. Ak chcete, môžete doň uložiť pár riadkov, ale nie je to vôbec v tejto chvíli nutné. Vytvoríme si teraz triedu, ktorá využije JNDI na vyhľadanie tohto súboru a vypíše zopár informácií o ňom. Nasledujúci výpis zobrazuje obsah triedy, ktorá najprv vytvorí InitialContext nad spomínaným adresárom a následne vykoná vyhľadanie zdroja podľa mena. Týmto menom bude názov nášho textového súboru.

JNDILookup.java:

import java.io.File;
import javax.naming.*;
import java.sql.Timestamp;
import java.util.Hashtable;
import java.util.Properties;
public class JNDILookup {
 // Defaultný konštruktor
 public JNDILookup(){
  super();
 }
 public void runExample( String fileName ){
  Context initCtx = null;
  try {
   // Vytvoríme InitialContext
   initCtx = new InitialContext();
   // Vykonáme vyhľadanie cez lookup()
   File file = (File)initCtx.lookup( fileName );
   // Vypíšeme pár informácií o súbore
   long fileSize = file.length();
   Timestamp ts = new Timestamp( file.lastModified() );
   System.out.println( „Názov súboru: “ + fileName );
   System.out.println( „Veľkosť súboru: “ + fileSize );
   System.out.println( „Dátum posl. mod.: “ + ts );
  }catch (Exception ex ) {
    ex.printStackTrace();
  }finally{
   try{
    System.out.println( „Uzatváram InitialContext“ );
    if ( initCtx != null ) initCtx.close();
   }catch( Exception ex ){
    System.out.println( „Nemôžem uzatvoriť InitialContext“ );
   }
  }
 }
 public static void main( String[] args ){
  if ( args.length != 1 ){
   System.out.println( „Použitie: JNDILookup <súbor.txt>“ );
   System.exit( 0 );
  }
  String fileName = args[0];
  JNDILookup example = new JNDILookup();
  example.runExample( fileName );
 }
}

Výsledok spustenia druhého ukážkového programu bude nasledovný:

Výsledok spustenia súboru JNDILookup.java
Výsledok spustenia súboru JNDILookup.java (NetBeans 4.1)

Tento príklad je veľmi jednoduchý a nerobí nič iného, iba že najprv načíta dve premenné prostredia zo súboru jndi.properties (pozor, musí byť v classpath), následne vytvorí InitialContext a potom prostredníctvom metódy lookup() vyhľadá súbor s daným menom. Tento súbor sa musí nachádzať niekde v rámci adresára jndi_root. Ak by ste chceli umiestniť testovací súbor niekde hlbšie (napríklad C:\jndi_root\test\), treba to zohľadniť pri zadávaní parametru programu. Treba takto:

java JNDILookup test/something.txt

Na záver vám ponúkam tu uvedené príklady na stiahnutie.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět