- xrath.com 에서 번역됨

[선두의 항목] [전의 항목] [다음의 항목] [마지막 항목]

# 부록 A:서비스 프로바이더의 예

이 부록에서는, 간단한 서비스 프로바이더의 예를 나타냅니다. 이 서비스 프로바이더에는, 연합을 지원하지 않는 플랫인 이름 공간이 구현되고 있습니다. `Context` 인터페이스의 메소드를 모두 사용해, 문맥의 구현의 작성 방법을 나타냅니다.

이 문맥의 인스턴스는, 초기 문맥으로서 직접 바인드 됩니다. 이 예에서는, 대응하는 `InitialContextFactory` 의 정의를 나타냅니다.

## A. 1 간단하고 플랫인 문맥

### A. 1.1 문맥의 구현

>     /*
>      * @(#) 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() {
>     	}
>         }
>     };

### A. 1.2 네임 파서

>     /*
>      * @(#) 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);
>         }
>     }

### A. 1.3 초기 문맥 팩토리

>     /*
>      * @(#) 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);
>         }
>     }

[선두의 항목] [전의 항목] [다음의 항목] [마지막 항목]

Copyright © 1999, Sun Microsystems, Inc. All rights reserved.