Accedere con JNDI ad un Naming Service: il FileSystem

In questo articolo vedremo come accedere ad un servizio di naming come il FileSystem locale di una macchina. Per poter procedere con l'esempio dobbiamo scaricare un SPI (Service Provider Interface) specifico per il FileSystem dal sito: https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/ViewProductDetail-Start?ProductRef=7110-jndi-1.2.1-oth-JPR@CDS-CDS_Developer

Apache PDFBox: una libreria Java per lavorare con i documenti PDF
Differenza tra i comandi java e javaw
Connettere una applicazione Java ad un database SQL tramite JDBC

In questo articolo vedremo come accedere ad un servizio di naming come il FileSystem locale di una macchina. Per poter procedere con l’esempio dobbiamo scaricare un SPI (Service Provider Interface) specifico per il FileSystem dal sito:

https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/ViewProductDetail-Start?ProductRef=7110-jndi-1.2.1-oth-JPR@CDS-CDS_Developer

scegliamo la versione 1.2 che è la versione più recente. Per un elenco dei SPI disponibili andiamo invece all’url:

http://java.sun.com/products/jndi/serviceproviders.html

Una volta scaricato il pacchetto (fscontext-1_2-beta3.zip), lanciamo Eclipse e creiamo un nuovo progetto Java (File -> New -> Java Project). Creiamo una cartella lib all’interno del progetto e inseriamo le due librerie presenti all’interno dello zip file:

  • fscontext.jar;
  • providerutil.jar.

Facciamo un primo esempio di lookup di un oggetto passandogli il nome, in questo caso il nome sarà il path di una directory o di un file, nel codice seguente effettuiamo questa operazione di lookup su di una stringa (rappresentante il path name) passata come argomento al programma:

package it.appuntisoftware;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.util.Hashtable;
class Lookup {
public static void main(String[] args) {
// Controlliamo che sia stato passato un file o una directory su cui effettuare lookup
if (args.length != 1) {
System.err.println("Inserire una directory o un file: <filename>");
System.exit(-1);
}
String name = args[0];
// Identifichiamo l'SPI
Hashtable<String,String> env = new Hashtable<String,String>(1);
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.fscontext.RefFSContextFactory");
try {
// Creiamo l'initial context
Context ctx = new InitialContext(env);
// Look up di un oggetto
Object obj = ctx.lookup(name);
System.out.println(name + " is bound to: " + obj);
//Chiudiamo il context
ctx.close();
} catch (NamingException e) {
System.err.println("Ci sono stati problemi nel looking up di" + name + ": " + e);
}
}
}

la prima cosa da fare dopo aver creato un Hashtable, è specificare il Service Provider che si vuole utilizzare, indicando la classe Factory che verrà creata dal costruttore di IntialContext. Questa è solo una delle environment properties che possono essere passate al costruttore di IntialContext, le quali si dividono in 5 categorie:

  • Standard
  • Service-specific
  • Feature-specific
  • Provider-specific

per una lista completa delle proprietà che possono essere specificate si rimanda a questo sito: http://download.oracle.com/javase/jndi/tutorial/beyond/env/overview.html

Ovviamente non tutte vanno specificate, nel nostro caso basta specificarne solo una.

Vediamo ora un altro esempio in cui andiamo ad utilizzare il metodo listBindings() di IntialContext, il quale ci fornisce l’elenco di tutti i nomi associati ad oggetti in un determinato contesto; una volta ottenuti tutti i Bindings, possiamo iterare su di essi e recuperare gli oggetti associati, se un nome è associato ad un File possiamo effettuarne il Cast per recuperare l’oggetto File:

package it.appuntisoftware;
import javax.naming.Binding;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import java.io.File;
import java.util.Hashtable;
public class ListBingings {
public static void main(String[] args) {
String directoryName = "file:///C:\Programmi";
// Identifichiamo il Servic eProvider da utilizzare
Hashtable<String, String> env = new Hashtable<String, String>(2);
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.fscontext.RefFSContextFactory");
env.put(Context.PROVIDER_URL, directoryName);
try {
// Creiamo l'initial context passando al costruttore l'hashtable
Context ctx = new InitialContext(env);
NamingEnumeration<Binding> ne = ctx.listBindings("");
while(ne.hasMore()) {
Binding b = ne.next();
if(b.getObject() instanceof File)
System.out.println(b.getName() + " " + b.getObject()+ " è un file ");
else
System.out.println(b.getName() + " " + b.getObject()+ " è una directory");
}
// Una volta finito chiudiamo la connessione
ctx.close();
} catch (NamingException e) {
System.err.println("Problema nel lookup " + directoryName + ": " + e);
}
}
}

in questo esempio abbiamo specificato una seconda environment properties, la Context.PROVIDER_URL che contiene la URL del Context iniziale, in altre parole il pathname della directory su cui effettuare la ricerca dei Bindings.

COMMENTS

WORDPRESS: 0