Return-Path: Delivered-To: apmail-incubator-oodt-commits-archive@minotaur.apache.org Received: (qmail 71623 invoked from network); 14 Jul 2010 23:07:23 -0000 Received: from unknown (HELO mail.apache.org) (140.211.11.3) by 140.211.11.9 with SMTP; 14 Jul 2010 23:07:23 -0000 Received: (qmail 258 invoked by uid 500); 14 Jul 2010 23:07:23 -0000 Delivered-To: apmail-incubator-oodt-commits-archive@incubator.apache.org Received: (qmail 235 invoked by uid 500); 14 Jul 2010 23:07:23 -0000 Mailing-List: contact oodt-commits-help@incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: oodt-dev@incubator.apache.org Delivered-To: mailing list oodt-commits@incubator.apache.org Received: (qmail 228 invoked by uid 99); 14 Jul 2010 23:07:23 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 14 Jul 2010 23:07:23 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED,T_FILL_THIS_FORM_SHORT X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 14 Jul 2010 23:07:17 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 1FB072388906; Wed, 14 Jul 2010 23:05:53 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r964253 - in /incubator/oodt/trunk/commons/src/main/java/org/apache/oodt/commons/object: ./ jndi/ Date: Wed, 14 Jul 2010 23:05:53 -0000 To: oodt-commits@incubator.apache.org From: kelly@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20100714230553.1FB072388906@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: kelly Date: Wed Jul 14 23:05:52 2010 New Revision: 964253 URL: http://svn.apache.org/viewvc?rev=964253&view=rev Log: WIP OODT-15 Import additional OODT Commons Object Context & JNDI utils. Added: incubator/oodt/trunk/commons/src/main/java/org/apache/oodt/commons/object/ incubator/oodt/trunk/commons/src/main/java/org/apache/oodt/commons/object/jndi/ incubator/oodt/trunk/commons/src/main/java/org/apache/oodt/commons/object/jndi/HTTPContext.java incubator/oodt/trunk/commons/src/main/java/org/apache/oodt/commons/object/jndi/ObjectContext.java incubator/oodt/trunk/commons/src/main/java/org/apache/oodt/commons/object/jndi/ObjectCtxFactory.java incubator/oodt/trunk/commons/src/main/java/org/apache/oodt/commons/object/jndi/ObjectNameParser.java incubator/oodt/trunk/commons/src/main/java/org/apache/oodt/commons/object/jndi/RMIContext.java incubator/oodt/trunk/commons/src/main/java/org/apache/oodt/commons/object/jndi/package.html incubator/oodt/trunk/commons/src/main/java/org/apache/oodt/commons/object/package.html Added: incubator/oodt/trunk/commons/src/main/java/org/apache/oodt/commons/object/jndi/HTTPContext.java URL: http://svn.apache.org/viewvc/incubator/oodt/trunk/commons/src/main/java/org/apache/oodt/commons/object/jndi/HTTPContext.java?rev=964253&view=auto ============================================================================== --- incubator/oodt/trunk/commons/src/main/java/org/apache/oodt/commons/object/jndi/HTTPContext.java (added) +++ incubator/oodt/trunk/commons/src/main/java/org/apache/oodt/commons/object/jndi/HTTPContext.java Wed Jul 14 23:05:52 2010 @@ -0,0 +1,236 @@ +// Licensed to the Apache Software Foundation (ASF) under one or more contributor +// license agreements. See the NOTICE.txt file distributed with this work for +// additional information regarding copyright ownership. The ASF licenses this +// file to you under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy of +// the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. + +package org.apache.oodt.commons.object.jndi; + +import java.net.MalformedURLException; +import java.net.URL; +import java.util.Hashtable; +import java.util.NoSuchElementException; +import javax.naming.CompositeName; +import javax.naming.Context; +import javax.naming.InvalidNameException; +import javax.naming.Name; +import javax.naming.NameParser; +import javax.naming.NamingEnumeration; +import javax.naming.NamingException; +import javax.naming.NotContextException; +import javax.naming.OperationNotSupportedException; + +/** + * This is a pseudo context that yields any name passed in as a URL, if it can be parsed as an URL. + * + * @author Kelly + * @version $Revision: 1.2 $ + */ +public class HTTPContext implements Context { + /** + * Make the HTTPContext. + * + * @param environment Its environment, currently unused. + */ + public HTTPContext(Hashtable environment) { + if (environment == null) + throw new IllegalArgumentException("Nonnull environment required; don't know why, but it is"); + this.environment = (Hashtable) environment.clone(); + } + + public Object lookup(String name) throws NamingException { + checkName(name); + try { + return new URL(name); + } catch (MalformedURLException ex) { + throw new NamingException(ex.getMessage()); + } + } + + public Object lookup(Name name) throws NamingException { + return lookup(name.toString()); + } + + public void bind(String name, Object obj) throws NamingException { + checkName(name); + throw new OperationNotSupportedException("Not possible"); + } + + public void bind(Name name, Object obj) throws NamingException { + bind(name.toString(), obj); + } + + public void rebind(String name, Object obj) throws NamingException { + checkName(name); + throw new OperationNotSupportedException("Not possible"); + } + + public void rebind(Name name, Object obj) throws NamingException { + rebind(name.toString(), obj); + } + + public void unbind(String name) throws NamingException { + checkName(name); + throw new OperationNotSupportedException("Not possible"); + } + + public void unbind(Name name) throws NamingException { + unbind(name.toString()); + } + + public void rename(String oldName, String newName) throws NamingException { + checkName(newName); + throw new OperationNotSupportedException("Not possible"); + } + + public void rename(Name oldName, Name newName) throws NamingException { + rename(oldName.toString(), newName.toString()); + } + + public NamingEnumeration list(String name) throws NamingException { + if (name.length() > 0) + throw new NotContextException("Subcontexts not supported"); + + return new NamingEnumeration() { + public void close() {} + public boolean hasMore() { + return false; + } + public Object next() { + throw new NoSuchElementException(); + } + public boolean hasMoreElements() { + return hasMore(); + } + public Object nextElement() { + return next(); + } + }; + } + + public NamingEnumeration list(Name name) throws NamingException { + return list(name.toString()); + } + + public NamingEnumeration listBindings(String name) throws NamingException { + if (name.length() > 0) + throw new NotContextException("Subcontexts not supported"); + return new NamingEnumeration() { + public void close() {} + public boolean hasMore() { + return false; + } + public Object next() { + throw new NoSuchElementException(); + } + public boolean hasMoreElements() { + return hasMore(); + } + public Object nextElement() { + return next(); + } + }; + } + + public NamingEnumeration listBindings(Name name) throws NamingException { + return listBindings(name.toString()); + } + + public void destroySubcontext(String name) throws NamingException { + throw new OperationNotSupportedException("Not yet implemented"); + } + + public void destroySubcontext(Name name) throws NamingException { + destroySubcontext(name.toString()); + } + + public Context createSubcontext(String name) throws NamingException { + throw new OperationNotSupportedException("Subcontexts not supported"); + } + + public Context createSubcontext(Name name) throws NamingException { + return createSubcontext(name.toString()); + } + + public Object lookupLink(String name) throws NamingException { + return lookup(name); + } + + public Object lookupLink(Name name) throws NamingException { + return lookupLink(name.toString()); + } + + public NameParser getNameParser(String name) throws NamingException { + return nameParser; + } + + public NameParser getNameParser(Name name) throws NamingException { + 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 (environment == null) environment = new Hashtable(); + return environment.put(propName, propVal); + } + + public Object removeFromEnvironment(String propName) throws NamingException { + if (environment == null) return null; + return environment.remove(propName); + } + + public Hashtable getEnvironment() throws NamingException { + if (environment == null) return new Hashtable(); + return (Hashtable) environment.clone(); + } + + public String getNameInNamespace() throws NamingException { + return ""; + } + + public void close() throws NamingException { + environment = null; + } + + /** + * Ensure the name is an HTTP product context name. + * + * @param name Name to check. + * @throws InvalidNameException If name's not an RMI object context name. + */ + protected void checkName(String name) throws InvalidNameException { + if (name == null) + throw new IllegalArgumentException("Can't check a null name"); + if (name.length() == 0) + throw new InvalidNameException("Name's length is zero"); + if (name.startsWith("http:") || name.startsWith("https:")) + return; + throw new InvalidNameException("Not an HTTP name; try http://some.host/some-context/..."); + } + + /** Context's environment; currently unused. */ + private Hashtable environment; + + /** Parser for object names. */ + private static final NameParser nameParser = new ObjectNameParser(); +} + Added: incubator/oodt/trunk/commons/src/main/java/org/apache/oodt/commons/object/jndi/ObjectContext.java URL: http://svn.apache.org/viewvc/incubator/oodt/trunk/commons/src/main/java/org/apache/oodt/commons/object/jndi/ObjectContext.java?rev=964253&view=auto ============================================================================== --- incubator/oodt/trunk/commons/src/main/java/org/apache/oodt/commons/object/jndi/ObjectContext.java (added) +++ incubator/oodt/trunk/commons/src/main/java/org/apache/oodt/commons/object/jndi/ObjectContext.java Wed Jul 14 23:05:52 2010 @@ -0,0 +1,461 @@ +// Licensed to the Apache Software Foundation (ASF) under one or more contributor +// license agreements. See the NOTICE.txt file distributed with this work for +// additional information regarding copyright ownership. The ASF licenses this +// file to you under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy of +// the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. + +package org.apache.oodt.commons.object.jndi; + +import java.io.FileInputStream; +import java.io.IOException; +import java.lang.reflect.Constructor; +import java.net.URI; +import java.util.ArrayList; +import java.util.Hashtable; +import java.util.Iterator; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.Properties; +import javax.naming.CompositeName; +import javax.naming.Context; +import javax.naming.InvalidNameException; +import javax.naming.Name; +import javax.naming.NameAlreadyBoundException; +import javax.naming.NameClassPair; +import javax.naming.NameNotFoundException; +import javax.naming.NameParser; +import javax.naming.NamingEnumeration; +import javax.naming.NamingException; +import javax.naming.OperationNotSupportedException; +import org.apache.oodt.commons.util.Utility; + +/** + * Context for binding and looking up distributed objects. + * + * @author Kelly + * @version $Revision: 1.5 $ + */ +class ObjectContext implements Context { + /** + * Construct the object context. + * + * @param environment Its environment, currently unused. + */ + ObjectContext(Hashtable environment) { + this.environment = environment != null? (Hashtable) environment.clone() : new Hashtable(); + + // Add the CORBA context, but by name so we don't get a compile-time + // coupling with the edm-corba component, and only if CORBA's available. + try { + Class clazz = Class.forName("org.apache.oodt.commons.object.jndi.CORBAContext"); + Constructor ctor = clazz.getConstructor(new Class[]{Hashtable.class}); + Object corbaContext = ctor.newInstance(new Object[]{this.environment}); + contexts.add(corbaContext); + } catch (Throwable ex) {} + + String registryList = (String) environment.get("rmiregistries"); + if (registryList != null) for (Iterator i = Utility.parseCommaList(registryList); i.hasNext();) { + Hashtable rmiEnv = (Hashtable) this.environment.clone(); + URI uri = URI.create((String) i.next()); + rmiEnv.put("host", uri.getHost()); + rmiEnv.put("port", new Integer(uri.getPort())); + contexts.add(new RMIContext(rmiEnv)); + } + + Hashtable httpEnv = (Hashtable) this.environment.clone(); + contexts.add(new HTTPContext(httpEnv)); + + String className = null; + for (Iterator i = org.apache.oodt.commons.util.Utility.parseCommaList(System.getProperty("org.apache.oodt.commons.object.contexts", "")); + i.hasNext();) try { + className = (String) i.next(); + Class clazz = Class.forName(className); + contexts.add(clazz.newInstance()); + } catch (ClassNotFoundException ex) { + System.err.println("Ignoring not-found context class `" + className + "': " + ex.getMessage()); + } catch (InstantiationException ex) { + System.err.println("Ignoring non-instantiable context class `" + className + "': " + ex.getMessage()); + } catch (IllegalAccessException ex) { + System.err.println("Ignoring context class `" + className + "' with non-accessible no-args c'tor: " + + ex.getMessage()); + } + + installAliases(); + System.err.println("Object context ready; delegating to: " + contexts); + } + + /** + * Creates a new ObjectContext instance. This constructor takes a + * list of delegate contexts instead of building them from a passed-in + * environment. Currently, it's used solely for this class's {@link + * ObjectContextTest unit test}. + * + * @param contexts a List of {@link Context}s. + */ + ObjectContext(List contexts) { + this.contexts = contexts; + installAliases(); + } + + /** + * Returns the object to which the given name is bound. Because this context + * delegates to multiple other contexts, the lookup returns the first successful + * match. + * + * @param name a String value. + * @return an Object value. + * @throws NamingException if an error occurs. + */ + public Object lookup(String name) throws NamingException { + if (name == null) throw new IllegalArgumentException("Name required"); + if (name.length() == 0) return this; + + // Let alias redirection do its magic + String alias = aliases.getProperty(name); + if (alias != null) name = alias; + + for (Iterator i = contexts.iterator(); i.hasNext();) { + Context c = (Context) i.next(); + try { + return c.lookup(name); + } catch (InvalidNameException ignore) { + } catch (NameNotFoundException ignore) { + } catch (NamingException ignore){} + } + throw new NameNotFoundException(name + " not found in any managed subcontext"); + } + + public Object lookup(Name name) throws NamingException { + return lookup(name.toString()); + } + + public synchronized void bind(String name, Object obj) throws NamingException { + if (name == null) throw new IllegalArgumentException("Name required"); + if (name.length() == 0) throw new InvalidNameException("Cannot bind object named after context"); + + // If it's an alias name, stop here. + if (aliases.containsKey(name)) + throw new NameAlreadyBoundException("Name \"" + name + "\" already bound as an aliased name"); + + // Make sure it isn't bound anywhere + for (NamingEnumeration e = list(""); e.hasMore();) { + NameClassPair nameClassPair = (NameClassPair) e.next(); + if (name.equals(nameClassPair.getName())) + throw new NameAlreadyBoundException("Name \"" + name + "\" already bound by a managed subcontext"); + } + doRebind(name, obj); + } + + public void bind(Name name, Object obj) throws NamingException { + bind(name.toString(), obj); + } + + /** {@inheritDoc} */ + public synchronized void rebind(String name, Object obj) throws NamingException { + if (name == null) throw new IllegalArgumentException("Name required"); + if (name.length() == 0) throw new InvalidNameException("Cannot rebind object named after context"); + + // If it's an alias name, remove the alias + if (aliases.containsKey(name)) + aliases.remove(name); + + doRebind(name, obj); + } + + /** + * Rebind the given name to the given object. + * + * @param name Name to rebind + * @param obj Object to which it's bound + * @throws NamingException if an error occurs. + */ + private void doRebind(String name, Object obj) throws NamingException { + boolean bound = false; + for (Iterator i = contexts.iterator(); i.hasNext();) { + Context c = (Context) i.next(); + try { + c.rebind(name, obj); + bound = true; + } catch (NamingException ex) {} + } + if (!bound) throw new InvalidNameException("Name \"" + name + "\" not compatible with any managed subcontext"); + } + + public void rebind(Name name, Object obj) throws NamingException { + rebind(name.toString(), obj); + } + + public void unbind(String name) throws NamingException { + if (name == null) throw new IllegalArgumentException("Name required"); + if (name.length() == 0) throw new InvalidNameException("Cannot unbind object named after context"); + + // See if it's an aliased name + if (aliases.containsKey(name)) { + aliases.remove(name); + return; + } + + boolean unbound = false; + for (Iterator i = contexts.iterator(); i.hasNext();) { + Context c = (Context) i.next(); + try { + c.unbind(name); + unbound = true; + } catch (NamingException ignore) {} + } + if (!unbound) throw new InvalidNameException("Name \"" + name + "\" not compatible with any managed subcontext"); + } + + public void unbind(Name name) throws NamingException { + unbind(name.toString()); + } + + public void rename(String oldName, String newName) throws NamingException { + if (oldName == null || newName == null) + throw new IllegalArgumentException("Name required"); + if (oldName.length() == 0 || newName.length() == 0) + throw new InvalidNameException("Cannot rename object named after context"); + + // See if it's an aliased name + String oldValue = (String) aliases.remove(oldName); + if (oldValue != null) { + aliases.setProperty(newName, oldName); + return; + } + + boolean renamed = false; + for (Iterator i = contexts.iterator(); i.hasNext();) { + Context c = (Context) i.next(); + try { + c.rename(oldName, newName); + renamed = true; + } catch (NamingException ignore) {} + } + if (!renamed) throw new InvalidNameException("Names not compatible with any managed subcontext"); + } + + public void rename(Name oldName, Name newName) throws NamingException { + rename(oldName.toString(), newName.toString()); + } + + public NamingEnumeration list(final String name) throws NamingException { + final Iterator eachContext = contexts.iterator(); + return new NamingEnumeration() { + private NamingEnumeration enumeration + = eachContext.hasNext()? ((Context) eachContext.next()).list(name) : null; + private boolean open = true; + public Object next() throws NamingException { + if (!open) throw new NamingException("closed"); + if (enumeration != null && enumeration.hasMore()) + return enumeration.next(); + else if (eachContext.hasNext()) { + enumeration = ((Context) eachContext.next()).list(name); + if (enumeration.hasMore()) + return enumeration.next(); + } + throw new NoSuchElementException("No more objects in context"); + } + public Object nextElement() { + Object rc = null; + try { + rc = next(); + } catch (NamingException ignore) {} + return rc; + } + public boolean hasMore() throws NamingException { + if (!open) return false; + if (enumeration == null) + return false; + else if (enumeration.hasMore()) + return true; + else if (eachContext.hasNext()) { + enumeration = ((Context) eachContext.next()).list(name); + return hasMore(); + } + return false; + } + public boolean hasMoreElements() { + boolean h = false; + try { + h = hasMore(); + } catch (NamingException ignore) {} + return h; + } + public void close() throws NamingException { + open = false; + if (enumeration != null) + enumeration.close(); + } + }; + } + + public NamingEnumeration list(Name name) throws NamingException { + return list(name.toString()); + } + + public NamingEnumeration listBindings(final String name) throws NamingException { + final Iterator eachContext = contexts.iterator(); + return new NamingEnumeration() { + private NamingEnumeration enumeration + = eachContext.hasNext()? ((Context) eachContext.next()).listBindings(name) : null; + private boolean open = true; + public Object next() throws NamingException { + if (!open) throw new NamingException("closed"); + if (enumeration != null && enumeration.hasMore()) + return enumeration.next(); + else if (eachContext.hasNext()) { + enumeration = ((Context) eachContext.next()).listBindings(name); + if (enumeration.hasMore()) + return enumeration.next(); + } + throw new NoSuchElementException("No more objects in context"); + } + public Object nextElement() { + Object rc = null; + try { + rc = next(); + } catch (NamingException ignore) {} + return rc; + } + public boolean hasMore() throws NamingException { + if (!open) return false; + if (enumeration == null) + return false; + else if (enumeration.hasMore()) + return true; + else if (eachContext.hasNext()) { + enumeration = ((Context) eachContext.next()).listBindings(name); + return hasMore(); + } + return false; + } + public boolean hasMoreElements() { + boolean h = false; + try { + h = hasMore(); + } catch (NamingException ignore) {} + return h; + } + public void close() throws NamingException { + open = false; + if (enumeration != null) + enumeration.close(); + } + }; + } + + public NamingEnumeration listBindings(Name name) throws NamingException { + return listBindings(name.toString()); + } + + public void destroySubcontext(String name) throws NamingException { + throw new OperationNotSupportedException("Subcontexts not supported by ObjectContext"); + } + + public void destroySubcontext(Name name) throws NamingException { + destroySubcontext(name.toString()); + } + + public Context createSubcontext(String name) throws NamingException { + throw new OperationNotSupportedException("Subcontexts not supported by ObjectContext"); + } + + public Context createSubcontext(Name name) throws NamingException { + return createSubcontext(name.toString()); + } + + public Object lookupLink(String name) throws NamingException { + return lookup(name); + } + + public Object lookupLink(Name name) throws NamingException { + return lookupLink(name.toString()); + } + + public NameParser getNameParser(String name) throws NamingException { + return nameParser; + } + + public NameParser getNameParser(Name name) throws NamingException { + 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 (environment == null) environment = new Hashtable(); + return environment.put(propName, propVal); + } + + public Object removeFromEnvironment(String propName) throws NamingException { + if (environment == null) return null; + return environment.remove(propName); + } + + public Hashtable getEnvironment() throws NamingException { + if (environment == null) return new Hashtable(); + return (Hashtable) environment.clone(); + } + + public String getNameInNamespace() throws NamingException { + return ""; + } + + public void close() throws NamingException { + environment = null; + } + + /** + * Install aliases specified in the properties file. The properties file simply + * maps a string object name to a new object name. Use the system property + * org.apache.oodt.commons.object.jndi.aliases (preferred) or simply + * aliases to tell the location of the properties file. + */ + private void installAliases() { + String aliasFileName = System.getProperty("org.apache.oodt.commons.object.jndi.aliases", System.getProperty("aliases")); + if (aliasFileName != null && aliasFileName.length() > 0) { + FileInputStream in = null; + try { + in = new FileInputStream(aliasFileName); + aliases.load(in); + } catch (IOException ex) { + throw new IllegalStateException("Cannot handle I/O exception reading alias file " + aliasFileName + + ": " + ex.getMessage()); + } finally { + if (in != null) try { + in.close(); + } catch (IOException ignore) {} + } + } + } + + /** Context's environment; currently unused. */ + private Hashtable environment; + + /** Parser for object names. */ + private static final NameParser nameParser = new ObjectNameParser(); + + /** List of {@link Context}s to which we "multiplex". */ + private List contexts = new ArrayList(); + + /** Aliased names. */ + private Properties aliases = new Properties(); +} Added: incubator/oodt/trunk/commons/src/main/java/org/apache/oodt/commons/object/jndi/ObjectCtxFactory.java URL: http://svn.apache.org/viewvc/incubator/oodt/trunk/commons/src/main/java/org/apache/oodt/commons/object/jndi/ObjectCtxFactory.java?rev=964253&view=auto ============================================================================== --- incubator/oodt/trunk/commons/src/main/java/org/apache/oodt/commons/object/jndi/ObjectCtxFactory.java (added) +++ incubator/oodt/trunk/commons/src/main/java/org/apache/oodt/commons/object/jndi/ObjectCtxFactory.java Wed Jul 14 23:05:52 2010 @@ -0,0 +1,30 @@ +// Licensed to the Apache Software Foundation (ASF) under one or more contributor +// license agreements. See the NOTICE.txt file distributed with this work for +// additional information regarding copyright ownership. The ASF licenses this +// file to you under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy of +// the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. + +package org.apache.oodt.commons.object.jndi; + +import java.util.Hashtable; +import javax.naming.Context; +import javax.naming.spi.InitialContextFactory; + +/** JNDI context factory for object contexts. + * + * @author Kelly + */ +public class ObjectCtxFactory implements InitialContextFactory { + public Context getInitialContext(Hashtable environment) { + return new ObjectContext(environment); + } +} Added: incubator/oodt/trunk/commons/src/main/java/org/apache/oodt/commons/object/jndi/ObjectNameParser.java URL: http://svn.apache.org/viewvc/incubator/oodt/trunk/commons/src/main/java/org/apache/oodt/commons/object/jndi/ObjectNameParser.java?rev=964253&view=auto ============================================================================== --- incubator/oodt/trunk/commons/src/main/java/org/apache/oodt/commons/object/jndi/ObjectNameParser.java (added) +++ incubator/oodt/trunk/commons/src/main/java/org/apache/oodt/commons/object/jndi/ObjectNameParser.java Wed Jul 14 23:05:52 2010 @@ -0,0 +1,38 @@ +// Licensed to the Apache Software Foundation (ASF) under one or more contributor +// license agreements. See the NOTICE.txt file distributed with this work for +// additional information regarding copyright ownership. The ASF licenses this +// file to you under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy of +// the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. + +package org.apache.oodt.commons.object.jndi; + +import java.util.Properties; +import javax.naming.CompoundName; +import javax.naming.Name; +import javax.naming.NameParser; +import javax.naming.NamingException; + +/** JNDI parser for object names. + * + * @author Kelly + */ +class ObjectNameParser implements NameParser { + private static Properties syntax = new Properties(); { + syntax.put("jndi.syntax.direction", "flat"); + syntax.put("jndi.syntax.ignorecase", "false"); + } + public Name parse(String name) throws NamingException { + return new CompoundName(name, syntax); + } +} + + Added: incubator/oodt/trunk/commons/src/main/java/org/apache/oodt/commons/object/jndi/RMIContext.java URL: http://svn.apache.org/viewvc/incubator/oodt/trunk/commons/src/main/java/org/apache/oodt/commons/object/jndi/RMIContext.java?rev=964253&view=auto ============================================================================== --- incubator/oodt/trunk/commons/src/main/java/org/apache/oodt/commons/object/jndi/RMIContext.java (added) +++ incubator/oodt/trunk/commons/src/main/java/org/apache/oodt/commons/object/jndi/RMIContext.java Wed Jul 14 23:05:52 2010 @@ -0,0 +1,374 @@ +// Licensed to the Apache Software Foundation (ASF) under one or more contributor +// license agreements. See the NOTICE.txt file distributed with this work for +// additional information regarding copyright ownership. The ASF licenses this +// file to you under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy of +// the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. + +package org.apache.oodt.commons.object.jndi; + +import java.rmi.AlreadyBoundException; +import java.rmi.NotBoundException; +import java.rmi.Remote; +import java.rmi.RemoteException; +import java.rmi.registry.LocateRegistry; +import java.rmi.registry.Registry; +import java.util.Arrays; +import java.util.Collections; +import java.util.Hashtable; +import java.util.Iterator; +import java.util.List; +import javax.naming.CommunicationException; +import javax.naming.CompositeName; +import javax.naming.Context; +import javax.naming.InvalidNameException; +import javax.naming.Name; +import javax.naming.NameAlreadyBoundException; +import javax.naming.NameClassPair; +import javax.naming.NameNotFoundException; +import javax.naming.NameParser; +import javax.naming.NamingEnumeration; +import javax.naming.NamingException; +import javax.naming.NotContextException; +import javax.naming.OperationNotSupportedException; + +/** + * Context for binding and looking up distributed objects in RMI. + * + * @author Kelly + * @version $Revision: 1.1 $ + */ + + + +public class RMIContext implements Context { + /* + * Construct the RMI object context. + * + * @param host Host name. + * @param port Port number. + */ + public RMIContext(String host, int port) { + Hashtable environment = new Hashtable(); + environment.put("host", host); + environment.put("port", new Integer(port)); + initEnv(environment); + } + + /** + * Construct the RMI object context. + * + * @param environment Its environment, currently unused. + */ + public RMIContext(Hashtable environment) { + initEnv(environment); + } + + /* Initializes environment + * + * @param environment Its environment, currently unused. + */ + private void initEnv(Hashtable environment) { + if (environment == null) + throw new IllegalArgumentException("Nonnull environment required"); + this.environment = (Hashtable) environment.clone(); + } + + public Object lookup(String name) throws NamingException { + checkName(name); + name = toRMIName(name); + if (name.length() == 0) return new RMIContext(environment); + Registry registry = getRegistry(); + try { + return registry.lookup(name); + } catch (NotBoundException ex) { + throw new NameNotFoundException(name + " not found in RMI registry " + registry); + } catch (RemoteException ex) { + throw new NamingException("Remote exception: " + ex.getMessage()); + } + } + + public Object lookup(Name name) throws NamingException { + return lookup(name.toString()); + } + + public void bind(String name, Object obj) throws NamingException { + checkName(name); + Registry registry = getRegistry(); + try { + registry.bind(toRMIName(name), (Remote) obj); + } catch (AlreadyBoundException ex) { + throw new NameAlreadyBoundException(name + " already bound in RMI registry " + registry); + } catch (RemoteException ex) { + throw new NamingException("Remote exception: " + ex.getMessage()); + } + } + + public void bind(Name name, Object obj) throws NamingException { + bind(name.toString(), obj); + } + + public void rebind(String name, Object obj) throws NamingException { + checkName(name); + try { + Registry registry = getRegistry(); + registry.rebind(toRMIName(name), (Remote) obj); + } catch (RemoteException ex) { + ex.printStackTrace(); + throw new NamingException("Remote exception: " + ex.getMessage()); + } + } + + public void rebind(Name name, Object obj) throws NamingException { + rebind(name.toString(), obj); + } + + public void unbind(String name) throws NamingException { + checkName(name); + Registry registry = getRegistry(); + try { + registry.unbind(toRMIName(name)); + } catch (NotBoundException ex) { + throw new NameNotFoundException(name + " not found in RMI registry " + registry); + } catch (RemoteException ex) { + throw new NamingException("Remote exception: " + ex.getMessage()); + } + } + + public void unbind(Name name) throws NamingException { + unbind(name.toString()); + } + + public void rename(String oldName, String newName) throws NamingException { + checkName(newName); + throw new OperationNotSupportedException("Not yet implemented"); + } + + public void rename(Name oldName, Name newName) throws NamingException { + rename(oldName.toString(), newName.toString()); + } + + public NamingEnumeration list(String name) throws NamingException { + if (name.length() > 0) + throw new NotContextException("Subcontexts not supported"); + + final Iterator i = getCurrentBindings().iterator(); + return new NamingEnumeration() { + public void close() {} + public boolean hasMore() { + return i.hasNext(); + } + public Object next() throws NamingException { + String n = "urn:eda:rmi:" + (String) i.next(); + org.apache.oodt.commons.Service server = (org.apache.oodt.commons.Service) lookup(n); + try { + return new NameClassPair(n, server.getServerInterfaceName()); + } catch (RemoteException ex) { + throw new CommunicationException(ex.getMessage()); + } + } + public boolean hasMoreElements() { + return hasMore(); + } + public Object nextElement() { + Object next = null; + try { + next = next(); + } catch (RuntimeException ex) { + throw ex; + } catch (Exception ignore) {} + return next; + } + }; + } + + public NamingEnumeration list(Name name) throws NamingException { + return list(name.toString()); + } + + public NamingEnumeration listBindings(String name) throws NamingException { + if (name.length() > 0) + throw new NotContextException("Subcontexts not supported"); + final Iterator i = getCurrentBindings().iterator(); + return new NamingEnumeration() { + public void close() {} + public boolean hasMore() { + return i.hasNext(); + } + public Object next() throws NamingException { + String n = "urn:eda:rmi:" + (String) i.next(); + return new javax.naming.Binding(n, lookup(n)); + } + public boolean hasMoreElements() { + return hasMore(); + } + public Object nextElement() { + Object next = null; + try { + next = next(); + } catch (RuntimeException ex) { + throw ex; + } catch (Exception ignore) {} + return next; + } + }; + } + + public NamingEnumeration listBindings(Name name) throws NamingException { + return listBindings(name.toString()); + } + + public void destroySubcontext(String name) throws NamingException { + throw new OperationNotSupportedException("Not yet implemented"); + } + + public void destroySubcontext(Name name) throws NamingException { + destroySubcontext(name.toString()); + } + + public Context createSubcontext(String name) throws NamingException { + throw new OperationNotSupportedException("Subcontexts not supported"); + } + + public Context createSubcontext(Name name) throws NamingException { + return createSubcontext(name.toString()); + } + + public Object lookupLink(String name) throws NamingException { + return lookup(name); + } + + public Object lookupLink(Name name) throws NamingException { + return lookupLink(name.toString()); + } + + public NameParser getNameParser(String name) throws NamingException { + return nameParser; + } + + public NameParser getNameParser(Name name) throws NamingException { + 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 (environment == null) environment = new Hashtable(); + return environment.put(propName, propVal); + } + + public Object removeFromEnvironment(String propName) throws NamingException { + if (environment == null) return null; + return environment.remove(propName); + } + + public Hashtable getEnvironment() throws NamingException { + if (environment == null) return new Hashtable(); + return (Hashtable) environment.clone(); + } + + public String getNameInNamespace() throws NamingException { + return ""; + } + + public void close() throws NamingException { + environment = null; + } + + /** + * Get the current bindings in the RMI registry. + * + * @return A list of the current bindings, as simple string names. + */ + private List getCurrentBindings() throws NamingException { + List names = null; + try { + Registry registry = getRegistry(); + names = Arrays.asList(registry.list()); + } catch (RemoteException ex) { + names = Collections.EMPTY_LIST; + } + return names; + } + + /** + * Convert the context object name into an rmiregistry name. + * + * @param name Context name. + * @return rmiregistry name. + */ + private String toRMIName(String name) { + if (name == null) return ""; + if (name.startsWith("urn:eda:rmi:")) + return name.substring(12); + if (name.startsWith("rmi:")) + return name.substring(4); + return name; + } + + /** + * Get the RMI registry. + * + * @return a Registry value. + * @throws NamingException if an error occurs. + */ + private Registry getRegistry() throws NamingException { + if (registry != null) return registry; + try { + String host = environment.containsKey("host")? (String) environment.get("host") : "localhost"; + int port = environment.containsKey("port")? ((Integer) environment.get("port")).intValue() + : Registry.REGISTRY_PORT; + + + registry = LocateRegistry.getRegistry(host, port); + } catch (RemoteException ex) { + throw new NamingException("Remote exception locating registry: " + ex.getMessage()); + } + return registry; + } + + /** + * Ensure the name is an RMI object context name. + * + * RMI object context names are URNs in the eda namespace, in the + * rmi subnamespace. + * + * @param name Name to check. + * @throws InvalidNameException If name's not an RMI object context name. + */ + private void checkName(String name) throws InvalidNameException { + if (name == null) + throw new IllegalArgumentException("Can't check a null name"); + if (name.length() == 0) + throw new InvalidNameException("Name's length is zero"); + if (!name.startsWith("urn:eda:rmi:")) + throw new InvalidNameException("Not an RMI name; try urn:eda:rmi:yadda-yadda"); + } + + /** Context's environment; currently unused. */ + private Hashtable environment; + + /** RMI Registry. */ + private Registry registry; + + /** Parser for object names. */ + private static final NameParser nameParser = new ObjectNameParser(); +} + Added: incubator/oodt/trunk/commons/src/main/java/org/apache/oodt/commons/object/jndi/package.html URL: http://svn.apache.org/viewvc/incubator/oodt/trunk/commons/src/main/java/org/apache/oodt/commons/object/jndi/package.html?rev=964253&view=auto ============================================================================== --- incubator/oodt/trunk/commons/src/main/java/org/apache/oodt/commons/object/jndi/package.html (added) +++ incubator/oodt/trunk/commons/src/main/java/org/apache/oodt/commons/object/jndi/package.html Wed Jul 14 23:05:52 2010 @@ -0,0 +1,14 @@ + + + + Apache OODT Commons: Object Services for JNDI + + + +

Java Naming and Directory Interface (JNDI) service provider for + commons object services. This package defines a standard JNDI SPI + (service provider interface) that encapsulates the binding and + lookup of objects in a distributed network. +

+ + Added: incubator/oodt/trunk/commons/src/main/java/org/apache/oodt/commons/object/package.html URL: http://svn.apache.org/viewvc/incubator/oodt/trunk/commons/src/main/java/org/apache/oodt/commons/object/package.html?rev=964253&view=auto ============================================================================== --- incubator/oodt/trunk/commons/src/main/java/org/apache/oodt/commons/object/package.html (added) +++ incubator/oodt/trunk/commons/src/main/java/org/apache/oodt/commons/object/package.html Wed Jul 14 23:05:52 2010 @@ -0,0 +1,14 @@ + + + + Apache OODT Commons: Object Services + + + +

The object services package includes interfaces, classes, and + utilities for the management of objects. Object services + include locating, resolving, and manipulating objects, as well + as lifecycle management. +

+ +