この付録では、簡単なサービスプロバイダの例を示します。このサービスプロバイダには、連合をサポートしないフラットな名前空間が実装されています。Context インタフェースのメソッドをすべて使用し、コンテキストの実装の作成方法を示します。
このコンテキストのインスタンスは、初期コンテキストとして直接バインドされます。この例では、対応する InitialContextFactory の定義を示します。
/*
* @(#)FlatCtx.java 1.3 99/07/26
*
* Copyright 1997, 1998, 1999 Sun Microsystems, Inc. All Rights
* Reserved.
*
* Sun grants you ("Licensee") a non-exclusive, royalty free,
* license to use, modify and redistribute this software in source and
* binary code form, provided that i) this copyright notice and license
* appear on all copies of the software; and ii) Licensee does not
* utilize the software in a manner which is disparaging to Sun.
*
* This software is provided "AS IS," without a warranty of any
* kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
* WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE
* HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE LIABLE
* FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING,
* MODIFYING OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN
* NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
* CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
* CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT
* OF THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS
* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* This software is not designed or intended for use in on-line
* control of aircraft, air traffic, aircraft navigation or aircraft
* communications; or in the design, construction, operation or
* maintenance of any nuclear facility. Licensee represents and warrants
* that it will not use or redistribute the Software for such purposes.
*/
package examples.spi.flat;
import javax.naming.*;
import java.util.*;
/**
* A sample service provider that implements a flat namespace in memory.
*/
class FlatCtx implements Context {
Hashtable myEnv;
private Hashtable bindings = new Hashtable(11);
static NameParser myParser = new FlatNameParser();
FlatCtx(Hashtable environment) {
myEnv = (environment != null)
? (Hashtable)(environment.clone())
: null;
}
public Object lookup(String name) throws NamingException {
if (name.equals("")) {
// Asking to look up this context itself. Create and return
// a new instance with its own independent environment.
return (new FlatCtx(myEnv));
}
Object answer = bindings.get(name);
if (answer == null) {
throw new NameNotFoundException(name + " not found");
}
return answer;
}
public Object lookup(Name name) throws NamingException {
// Flat namespace; no federation; just call string version
return lookup(name.toString());
}
public void bind(String name, Object obj) throws NamingException {
if (name.equals("")) {
throw new InvalidNameException("Cannot bind empty name");
}
if (bindings.get(name) != null) {
throw new NameAlreadyBoundException(
"Use rebind to override");
}
bindings.put(name, obj);
}
public void bind(Name name, Object obj) throws NamingException {
// Flat namespace; no federation; just call string version
bind(name.toString(), obj);
}
public void rebind(String name, Object obj) throws NamingException {
if (name.equals("")) {
throw new InvalidNameException("Cannot bind empty name");
}
bindings.put(name, obj);
}
public void rebind(Name name, Object obj) throws NamingException {
// Flat namespace; no federation; just call string version
rebind(name.toString(), obj);
}
public void unbind(String name) throws NamingException {
if (name.equals("")) {
throw new InvalidNameException("Cannot unbind empty name");
}
bindings.remove(name);
}
public void unbind(Name name) throws NamingException {
// Flat namespace; no federation; just call string version
unbind(name.toString());
}
public void rename(String oldname, String newname)
throws NamingException {
if (oldname.equals("") || newname.equals("")) {
throw new InvalidNameException("Cannot rename empty name");
}
// Check if new name exists
if (bindings.get(newname) != null) {
throw new NameAlreadyBoundException(newname +
" is already bound");
}
// Check if old name is bound
Object oldBinding = bindings.remove(oldname);
if (oldBinding == null) {
throw new NameNotFoundException(oldname + " not bound");
}
bindings.put(newname, oldBinding);
}
public void rename(Name oldname, Name newname)
throws NamingException {
// Flat namespace; no federation; just call string version
rename(oldname.toString(), newname.toString());
}
public NamingEnumeration list(String name)
throws NamingException {
if (name.equals("")) {
// listing this context
return new FlatNames(bindings.keys());
}
// Perhaps `name' names a context
Object target = lookup(name);
if (target instanceof Context) {
return ((Context)target).list("");
}
throw new NotContextException(name + " cannot be listed");
}
public NamingEnumeration list(Name name)
throws NamingException {
// Flat namespace; no federation; just call string version
return list(name.toString());
}
public NamingEnumeration listBindings(String name)
throws NamingException {
if (name.equals("")) {
// listing this context
return new FlatBindings(bindings.keys());
}
// Perhaps `name' names a context
Object target = lookup(name);
if (target instanceof Context) {
return ((Context)target).listBindings("");
}
throw new NotContextException(name + " cannot be listed");
}
public NamingEnumeration listBindings(Name name)
throws NamingException {
// Flat namespace; no federation; just call string version
return listBindings(name.toString());
}
public void destroySubcontext(String name) throws NamingException {
throw new OperationNotSupportedException(
"FlatCtx does not support subcontexts");
}
public void destroySubcontext(Name name) throws NamingException {
// Flat namespace; no federation; just call string version
destroySubcontext(name.toString());
}
public Context createSubcontext(String name)
throws NamingException {
throw new OperationNotSupportedException(
"FlatCtx does not support subcontexts");
}
public Context createSubcontext(Name name) throws NamingException {
// Flat namespace; no federation; just call string version
return createSubcontext(name.toString());
}
public Object lookupLink(String name) throws NamingException {
// This flat context does not treat links specially
return lookup(name);
}
public Object lookupLink(Name name) throws NamingException {
// Flat namespace; no federation; just call string version
return lookupLink(name.toString());
}
public NameParser getNameParser(String name)
throws NamingException {
return myParser;
}
public NameParser getNameParser(Name name) throws NamingException {
// Flat namespace; no federation; just call string version
return getNameParser(name.toString());
}
public String composeName(String name, String prefix)
throws NamingException {
Name result = composeName(new CompositeName(name),
new CompositeName(prefix));
return result.toString();
}
public Name composeName(Name name, Name prefix)
throws NamingException {
Name result = (Name)(prefix.clone());
result.addAll(name);
return result;
}
public Object addToEnvironment(String propName, Object propVal)
throws NamingException {
if (myEnv == null) {
myEnv = new Hashtable(5, 0.75f);
}
return myEnv.put(propName, propVal);
}
public Object removeFromEnvironment(String propName)
throws NamingException {
if (myEnv == null)
return null;
return myEnv.remove(propName);
}
public Hashtable getEnvironment() throws NamingException {
if (myEnv == null) {
// Must return non-null
return new Hashtable(3, 0.75f);
} else {
return (Hashtable)myEnv.clone();
}
}
public String getNameInNamespace() throws NamingException {
return "";
}
public void close() throws NamingException {
myEnv = null;
bindings = null;
}
// Class for enumerating name/class pairs
class FlatNames implements NamingEnumeration {
Enumeration names;
FlatNames (Enumeration names) {
this.names = names;
}
public boolean hasMoreElements() {
return names.hasMoreElements();
}
public boolean hasMore() throws NamingException {
return hasMoreElements();
}
public Object nextElement() {
String name = (String)names.nextElement();
String className = bindings.get(name).getClass().getName();
return new NameClassPair(name, className);
}
public Object next() throws NamingException {
return nextElement();
}
public void close() {
}
}
// Class for enumerating bindings
class FlatBindings implements NamingEnumeration {
Enumeration names;
FlatBindings (Enumeration names) {
this.names = names;
}
public boolean hasMoreElements() {
return names.hasMoreElements();
}
public boolean hasMore() throws NamingException {
return hasMoreElements();
}
public Object nextElement() {
String name = (String)names.nextElement();
return new Binding(name, bindings.get(name));
}
public Object next() throws NamingException {
return nextElement();
}
public void close() {
}
}
};
/*
* @(#)FlatNameParser.java 1.3 99/07/26
*
* Copyright 1997, 1998, 1999 Sun Microsystems, Inc. All Rights
* Reserved.
*
* Sun grants you ("Licensee") a non-exclusive, royalty free,
* license to use, modify and redistribute this software in source and
* binary code form, provided that i) this copyright notice and license
* appear on all copies of the software; and ii) Licensee does not
* utilize the software in a manner which is disparaging to Sun.
*
* This software is provided "AS IS," without a warranty of any
* kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
* WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE
* HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE LIABLE
* FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING,
* MODIFYING OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN
* NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
* CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
* CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT
* OF THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS
* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* This software is not designed or intended for use in on-line
* control of aircraft, air traffic, aircraft navigation or aircraft
* communications; or in the design, construction, operation or
* maintenance of any nuclear facility. Licensee represents and warrants
* that it will not use or redistribute the Software for such purposes.
*/
package examples.spi.flat;
import javax.naming.NameParser;
import javax.naming.Name;
import javax.naming.CompoundName;
import javax.naming.NamingException;
import java.util.Properties;
class FlatNameParser implements NameParser {
static Properties syntax = new Properties();
static {
syntax.put("jndi.syntax.direction", "flat");
syntax.put("jndi.syntax.ignorecase", "false");
}
public Name parse(String name) throws NamingException {
return new CompoundName(name, syntax);
}
}
/*
* @(#)FlatInitCtxFactory.java 1.3 99/07/26
*
* Copyright 1997, 1998, 1999 Sun Microsystems, Inc. All Rights
* Reserved.
*
* Sun grants you ("Licensee") a non-exclusive, royalty free,
* license to use, modify and redistribute this software in source and
* binary code form, provided that i) this copyright notice and license
* appear on all copies of the software; and ii) Licensee does not
* utilize the software in a manner which is disparaging to Sun.
*
* This software is provided "AS IS," without a warranty of any
* kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
* WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE
* HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE LIABLE
* FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING,
* MODIFYING OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN
* NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
* CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
* CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT
* OF THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS
* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* This software is not designed or intended for use in on-line
* control of aircraft, air traffic, aircraft navigation or aircraft
* communications; or in the design, construction, operation or
* maintenance of any nuclear facility. Licensee represents and warrants
* that it will not use or redistribute the Software for such purposes.
*/
package examples.spi.flat;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.spi.InitialContextFactory;
public class FlatInitCtxFactory implements InitialContextFactory {
public Context getInitialContext(Hashtable env) {
return new FlatCtx(env);
}
}