JETTY-1430 local JNDI contexts don't carry environment
This commit is contained in:
parent
9c43e04bb4
commit
61eba95ac6
|
@ -0,0 +1,69 @@
|
|||
// ========================================================================
|
||||
// Copyright (c) 2011 Mort Bay Consulting Pty. Ltd.
|
||||
// ------------------------------------------------------------------------
|
||||
// All rights reserved. This program and the accompanying materials
|
||||
// are made available under the terms of the Eclipse Public License v1.0
|
||||
// and Apache License v2.0 which accompanies this distribution.
|
||||
// The Eclipse Public License is available at
|
||||
// http://www.eclipse.org/legal/epl-v10.html
|
||||
// The Apache License v2.0 is available at
|
||||
// http://www.opensource.org/licenses/apache2.0.php
|
||||
// You may elect to redistribute this code under either of these licenses.
|
||||
// ========================================================================
|
||||
|
||||
|
||||
package org.eclipse.jetty.jndi;
|
||||
|
||||
import java.util.Iterator;
|
||||
|
||||
import javax.naming.Binding;
|
||||
import javax.naming.NamingEnumeration;
|
||||
import javax.naming.NamingException;
|
||||
|
||||
/** BindingEnumeration
|
||||
* <p>Implementation of NamingEnumeration
|
||||
*
|
||||
* <p><h4>Notes</h4>
|
||||
* <p>Used to return results of Context.listBindings();
|
||||
*
|
||||
* <p><h4>Usage</h4>
|
||||
*
|
||||
*/
|
||||
public class BindingEnumeration implements NamingEnumeration<Binding>
|
||||
{
|
||||
Iterator<Binding> _delegate;
|
||||
|
||||
public BindingEnumeration (Iterator<Binding> e)
|
||||
{
|
||||
_delegate = e;
|
||||
}
|
||||
|
||||
public void close()
|
||||
throws NamingException
|
||||
{
|
||||
}
|
||||
|
||||
public boolean hasMore ()
|
||||
throws NamingException
|
||||
{
|
||||
return _delegate.hasNext();
|
||||
}
|
||||
|
||||
public Binding next()
|
||||
throws NamingException
|
||||
{
|
||||
Binding b = (Binding)_delegate.next();
|
||||
return new Binding (b.getName(), b.getClassName(), b.getObject(), true);
|
||||
}
|
||||
|
||||
public boolean hasMoreElements()
|
||||
{
|
||||
return _delegate.hasNext();
|
||||
}
|
||||
|
||||
public Binding nextElement()
|
||||
{
|
||||
Binding b = (Binding)_delegate.next();
|
||||
return new Binding (b.getName(), b.getClassName(), b.getObject(),true);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,69 @@
|
|||
// ========================================================================
|
||||
// Copyright (c) 2011 Mort Bay Consulting Pty. Ltd.
|
||||
// ------------------------------------------------------------------------
|
||||
// All rights reserved. This program and the accompanying materials
|
||||
// are made available under the terms of the Eclipse Public License v1.0
|
||||
// and Apache License v2.0 which accompanies this distribution.
|
||||
// The Eclipse Public License is available at
|
||||
// http://www.eclipse.org/legal/epl-v10.html
|
||||
// The Apache License v2.0 is available at
|
||||
// http://www.opensource.org/licenses/apache2.0.php
|
||||
// You may elect to redistribute this code under either of these licenses.
|
||||
// ========================================================================
|
||||
|
||||
package org.eclipse.jetty.jndi;
|
||||
|
||||
import java.util.Iterator;
|
||||
|
||||
import javax.naming.Binding;
|
||||
import javax.naming.NameClassPair;
|
||||
import javax.naming.NamingEnumeration;
|
||||
import javax.naming.NamingException;
|
||||
|
||||
/** NameEnumeration
|
||||
* <p>Implementation of NamingEnumeration interface.
|
||||
*
|
||||
* <p><h4>Notes</h4>
|
||||
* <p>Used for returning results of Context.list();
|
||||
*
|
||||
* <p><h4>Usage</h4>
|
||||
*
|
||||
*/
|
||||
public class NameEnumeration implements NamingEnumeration<NameClassPair>
|
||||
{
|
||||
Iterator<Binding> _delegate;
|
||||
|
||||
public NameEnumeration (Iterator<Binding> e)
|
||||
{
|
||||
_delegate = e;
|
||||
}
|
||||
|
||||
public void close()
|
||||
throws NamingException
|
||||
{
|
||||
}
|
||||
|
||||
public boolean hasMore ()
|
||||
throws NamingException
|
||||
{
|
||||
return _delegate.hasNext();
|
||||
}
|
||||
|
||||
public NameClassPair next()
|
||||
throws NamingException
|
||||
{
|
||||
Binding b = _delegate.next();
|
||||
return new NameClassPair(b.getName(),b.getClassName(),true);
|
||||
}
|
||||
|
||||
public boolean hasMoreElements()
|
||||
{
|
||||
return _delegate.hasNext();
|
||||
}
|
||||
|
||||
public NameClassPair nextElement()
|
||||
{
|
||||
Binding b = _delegate.next();
|
||||
return new NameClassPair(b.getName(),b.getClassName(),true);
|
||||
}
|
||||
}
|
|
@ -20,7 +20,6 @@ import java.util.Collection;
|
|||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Hashtable;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
|
@ -31,7 +30,6 @@ import javax.naming.InitialContext;
|
|||
import javax.naming.LinkRef;
|
||||
import javax.naming.Name;
|
||||
import javax.naming.NameAlreadyBoundException;
|
||||
import javax.naming.NameClassPair;
|
||||
import javax.naming.NameNotFoundException;
|
||||
import javax.naming.NameParser;
|
||||
import javax.naming.NamingEnumeration;
|
||||
|
@ -53,17 +51,8 @@ import org.eclipse.jetty.util.log.Logger;
|
|||
* <p><h4>Notes</h4>
|
||||
* <p>All Names are expected to be Compound, not Composite.
|
||||
*
|
||||
* <p><h4>Usage</h4>
|
||||
* <pre>
|
||||
*
|
||||
*/
|
||||
/*
|
||||
* </pre>
|
||||
*
|
||||
* @see
|
||||
*
|
||||
*
|
||||
* @version 1.0
|
||||
*/
|
||||
public class NamingContext implements Context, Cloneable, Dumpable
|
||||
{
|
||||
private final static Logger __log=NamingUtil.__log;
|
||||
|
@ -101,123 +90,6 @@ public class NamingContext implements Context, Cloneable, Dumpable
|
|||
void unbind(NamingContext ctx, Binding binding);
|
||||
}
|
||||
|
||||
/*------------------------------------------------*/
|
||||
/** NameEnumeration
|
||||
* <p>Implementation of NamingEnumeration interface.
|
||||
*
|
||||
* <p><h4>Notes</h4>
|
||||
* <p>Used for returning results of Context.list();
|
||||
*
|
||||
* <p><h4>Usage</h4>
|
||||
* <pre>
|
||||
*/
|
||||
/*
|
||||
* </pre>
|
||||
*
|
||||
* @see
|
||||
*
|
||||
*/
|
||||
public class NameEnumeration implements NamingEnumeration<NameClassPair>
|
||||
{
|
||||
Iterator<Binding> _delegate;
|
||||
|
||||
public NameEnumeration (Iterator<Binding> e)
|
||||
{
|
||||
_delegate = e;
|
||||
}
|
||||
|
||||
public void close()
|
||||
throws NamingException
|
||||
{
|
||||
}
|
||||
|
||||
public boolean hasMore ()
|
||||
throws NamingException
|
||||
{
|
||||
return _delegate.hasNext();
|
||||
}
|
||||
|
||||
public NameClassPair next()
|
||||
throws NamingException
|
||||
{
|
||||
Binding b = _delegate.next();
|
||||
return new NameClassPair(b.getName(),b.getClassName(),true);
|
||||
}
|
||||
|
||||
public boolean hasMoreElements()
|
||||
{
|
||||
return _delegate.hasNext();
|
||||
}
|
||||
|
||||
public NameClassPair nextElement()
|
||||
{
|
||||
Binding b = _delegate.next();
|
||||
return new NameClassPair(b.getName(),b.getClassName(),true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*------------------------------------------------*/
|
||||
/** BindingEnumeration
|
||||
* <p>Implementation of NamingEnumeration
|
||||
*
|
||||
* <p><h4>Notes</h4>
|
||||
* <p>Used to return results of Context.listBindings();
|
||||
*
|
||||
* <p><h4>Usage</h4>
|
||||
* <pre>
|
||||
*/
|
||||
/*
|
||||
* </pre>
|
||||
*
|
||||
* @see
|
||||
*
|
||||
*/
|
||||
public class BindingEnumeration implements NamingEnumeration<Binding>
|
||||
{
|
||||
Iterator<Binding> _delegate;
|
||||
|
||||
public BindingEnumeration (Iterator<Binding> e)
|
||||
{
|
||||
_delegate = e;
|
||||
}
|
||||
|
||||
public void close()
|
||||
throws NamingException
|
||||
{
|
||||
}
|
||||
|
||||
public boolean hasMore ()
|
||||
throws NamingException
|
||||
{
|
||||
return _delegate.hasNext();
|
||||
}
|
||||
|
||||
public Binding next()
|
||||
throws NamingException
|
||||
{
|
||||
Binding b = (Binding)_delegate.next();
|
||||
return new Binding (b.getName(), b.getClassName(), b.getObject(), true);
|
||||
}
|
||||
|
||||
public boolean hasMoreElements()
|
||||
{
|
||||
return _delegate.hasNext();
|
||||
}
|
||||
|
||||
public Binding nextElement()
|
||||
{
|
||||
Binding b = (Binding)_delegate.next();
|
||||
return new Binding (b.getName(), b.getClassName(), b.getObject(),true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*------------------------------------------------*/
|
||||
/**
|
||||
* Constructor
|
||||
|
@ -240,26 +112,6 @@ public class NamingContext implements Context, Cloneable, Dumpable
|
|||
}
|
||||
|
||||
|
||||
/*------------------------------------------------*/
|
||||
/**
|
||||
* Creates a new <code>NamingContext</code> instance.
|
||||
*
|
||||
* @param env a <code>Hashtable</code> value
|
||||
*/
|
||||
public NamingContext (Hashtable<String,Object> env)
|
||||
{
|
||||
if (env != null)
|
||||
_env.putAll(env);
|
||||
}
|
||||
|
||||
/*------------------------------------------------*/
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
*/
|
||||
public NamingContext ()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
/*------------------------------------------------*/
|
||||
|
@ -312,8 +164,24 @@ public class NamingContext implements Context, Cloneable, Dumpable
|
|||
_parser = parser;
|
||||
}
|
||||
|
||||
|
||||
public void setEnv (Hashtable<String,Object> env)
|
||||
{
|
||||
_env.clear();
|
||||
_env.putAll(env);
|
||||
}
|
||||
|
||||
|
||||
public Map<String,Binding> getBindings ()
|
||||
{
|
||||
return _bindings;
|
||||
}
|
||||
|
||||
public void setBindings(Map<String,Binding> bindings)
|
||||
{
|
||||
_bindings = bindings;
|
||||
}
|
||||
|
||||
/*------------------------------------------------*/
|
||||
/**
|
||||
* Bind a name to an object
|
||||
|
@ -435,8 +303,6 @@ public class NamingContext implements Context, Cloneable, Dumpable
|
|||
ne.setRemainingName(name);
|
||||
throw ne;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Name cname = toCanonicalName (name);
|
||||
|
||||
|
@ -521,7 +387,7 @@ public class NamingContext implements Context, Cloneable, Dumpable
|
|||
|
||||
/*------------------------------------------------*/
|
||||
/**
|
||||
* Not supported
|
||||
*
|
||||
*
|
||||
* @param name name of subcontext to remove
|
||||
* @exception NamingException if an error occurs
|
||||
|
@ -536,7 +402,7 @@ public class NamingContext implements Context, Cloneable, Dumpable
|
|||
|
||||
/*------------------------------------------------*/
|
||||
/**
|
||||
* Not supported
|
||||
*
|
||||
*
|
||||
* @param name name of subcontext to remove
|
||||
* @exception NamingException if an error occurs
|
||||
|
@ -1128,7 +994,6 @@ public class NamingContext implements Context, Cloneable, Dumpable
|
|||
|
||||
ctx = binding.getObject();
|
||||
|
||||
|
||||
if (ctx instanceof Reference)
|
||||
{
|
||||
//deference the object
|
||||
|
@ -1154,8 +1019,7 @@ public class NamingContext implements Context, Cloneable, Dumpable
|
|||
}
|
||||
else
|
||||
throw new NotContextException ("Object bound at "+firstComponent +" is not a Context");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/*------------------------------------------------*/
|
||||
|
@ -1182,11 +1046,11 @@ public class NamingContext implements Context, Cloneable, Dumpable
|
|||
* @param newName a <code>Name</code> value
|
||||
* @exception NamingException if an error occurs
|
||||
*/ public void rename(String oldName,
|
||||
String newName)
|
||||
throws NamingException
|
||||
{
|
||||
throw new OperationNotSupportedException();
|
||||
}
|
||||
String newName)
|
||||
throws NamingException
|
||||
{
|
||||
throw new OperationNotSupportedException();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@ -1247,9 +1111,7 @@ public class NamingContext implements Context, Cloneable, Dumpable
|
|||
*/
|
||||
public void close ()
|
||||
throws NamingException
|
||||
{
|
||||
|
||||
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
@ -1362,7 +1224,7 @@ public class NamingContext implements Context, Cloneable, Dumpable
|
|||
* @param name a <code>Name</code> value
|
||||
* @param obj an <code>Object</code> value
|
||||
*/
|
||||
protected void addBinding (Name name, Object obj) throws NameAlreadyBoundException
|
||||
public void addBinding (Name name, Object obj) throws NameAlreadyBoundException
|
||||
{
|
||||
String key = name.toString();
|
||||
Binding binding=new Binding (key, obj);
|
||||
|
@ -1394,7 +1256,7 @@ public class NamingContext implements Context, Cloneable, Dumpable
|
|||
* @param name a <code>Name</code> value
|
||||
* @return a <code>Binding</code> value
|
||||
*/
|
||||
protected Binding getBinding (Name name)
|
||||
public Binding getBinding (Name name)
|
||||
{
|
||||
return (Binding) _bindings.get(name.toString());
|
||||
}
|
||||
|
@ -1407,13 +1269,13 @@ public class NamingContext implements Context, Cloneable, Dumpable
|
|||
* @param name as a String
|
||||
* @return null or the Binding
|
||||
*/
|
||||
protected Binding getBinding (String name)
|
||||
public Binding getBinding (String name)
|
||||
{
|
||||
return (Binding) _bindings.get(name);
|
||||
}
|
||||
|
||||
/*------------------------------------------------*/
|
||||
protected void removeBinding (Name name)
|
||||
public void removeBinding (Name name)
|
||||
{
|
||||
String key = name.toString();
|
||||
if (__log.isDebugEnabled())
|
||||
|
@ -1455,7 +1317,7 @@ public class NamingContext implements Context, Cloneable, Dumpable
|
|||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
private boolean isLocked()
|
||||
public boolean isLocked()
|
||||
{
|
||||
if ((_env.get(LOCK_PROPERTY) == null) && (_env.get(UNLOCK_PROPERTY) == null))
|
||||
return false;
|
||||
|
|
|
@ -67,8 +67,7 @@ public class javaRootURLContext implements Context
|
|||
try
|
||||
{
|
||||
__javaNameParser = new javaNameParser();
|
||||
__nameRoot = new NamingContext();
|
||||
__nameRoot.setNameParser(__javaNameParser);
|
||||
__nameRoot = new NamingContext(null,null,null,__javaNameParser);
|
||||
|
||||
StringRefAddr parserAddr = new StringRefAddr("parser", __javaNameParser.getClass().getName());
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -12,11 +12,19 @@
|
|||
// ========================================================================
|
||||
package org.eclipse.jetty.jndi.java;
|
||||
|
||||
import java.util.Hashtable;
|
||||
|
||||
import javax.naming.Context;
|
||||
import javax.naming.InitialContext;
|
||||
import javax.naming.Name;
|
||||
import javax.naming.NameNotFoundException;
|
||||
import javax.naming.NameParser;
|
||||
import javax.naming.NamingException;
|
||||
import javax.naming.RefAddr;
|
||||
import javax.naming.Reference;
|
||||
import javax.naming.Referenceable;
|
||||
import javax.naming.StringRefAddr;
|
||||
import javax.naming.spi.ObjectFactory;
|
||||
|
||||
import org.eclipse.jetty.jndi.NamingUtil;
|
||||
import org.junit.After;
|
||||
|
@ -31,13 +39,152 @@ import static org.junit.Assert.fail;
|
|||
*/
|
||||
public class TestLocalJNDI
|
||||
{
|
||||
public static class FruitFactory implements ObjectFactory
|
||||
{
|
||||
public FruitFactory()
|
||||
{
|
||||
}
|
||||
|
||||
public Object getObjectInstance(Object obj, Name name, Context ctx, Hashtable env) throws Exception
|
||||
{
|
||||
|
||||
if (!env.containsKey("flavour"))
|
||||
throw new Exception ("No flavour!");
|
||||
|
||||
if (obj instanceof Reference)
|
||||
{
|
||||
Reference ref = (Reference)obj;
|
||||
if (ref.getClassName().equals(Fruit.class.getName()))
|
||||
{
|
||||
RefAddr addr = ref.get("fruit");
|
||||
if (addr != null)
|
||||
{
|
||||
return new Fruit((String)addr.getContent());
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static class Fruit implements Referenceable
|
||||
{
|
||||
String fruit;
|
||||
|
||||
public Fruit(String f)
|
||||
{
|
||||
fruit = f;
|
||||
}
|
||||
|
||||
public Reference getReference() throws NamingException
|
||||
{
|
||||
return new Reference(
|
||||
Fruit.class.getName(),
|
||||
new StringRefAddr("fruit", fruit),
|
||||
FruitFactory.class.getName(),
|
||||
null); // Factory location
|
||||
}
|
||||
|
||||
public String toString()
|
||||
{
|
||||
return fruit;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@After
|
||||
public void tearDown() throws Exception
|
||||
{
|
||||
InitialContext ic = new InitialContext();
|
||||
ic.destroySubcontext("a");
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testLocalReferenceable() throws Exception
|
||||
{
|
||||
Hashtable<String,String> env1 = new Hashtable<String,String>();
|
||||
env1.put("flavour", "orange");
|
||||
InitialContext ic1 = new InitialContext(env1);
|
||||
|
||||
ic1.bind("valencia", new Fruit("orange"));
|
||||
|
||||
Object o = ic1.lookup("valencia");
|
||||
|
||||
Hashtable<String,String> env2 = new Hashtable<String,String>();
|
||||
InitialContext ic2 = new InitialContext(env2);
|
||||
try
|
||||
{
|
||||
o = ic2.lookup("valencia");
|
||||
fail("Constructed object from reference without correct environment");
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
assertEquals("No flavour!", e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testLocalEnvironment() throws Exception
|
||||
{
|
||||
Hashtable<String,String> env1 = new Hashtable<String,String>();
|
||||
env1.put("make", "holden");
|
||||
env1.put("model", "commodore");
|
||||
|
||||
Object car1 = new Object();
|
||||
|
||||
InitialContext ic = new InitialContext(env1);
|
||||
ic.bind("car1", car1);
|
||||
assertNotNull(ic.lookup("car1"));
|
||||
assertEquals(car1, ic.lookup("car1"));
|
||||
|
||||
Context carz = ic.createSubcontext("carz");
|
||||
assertNotNull(carz);
|
||||
Hashtable ht = carz.getEnvironment();
|
||||
assertNotNull(ht);
|
||||
assertEquals("holden", ht.get("make"));
|
||||
assertEquals("commodore", ht.get("model"));
|
||||
|
||||
Hashtable<String,String> env2 = new Hashtable<String,String>();
|
||||
env2.put("flavour", "strawberry");
|
||||
InitialContext ic2 = new InitialContext(env2);
|
||||
assertEquals(car1, ic2.lookup("car1"));
|
||||
Context c = (Context)ic2.lookup("carz");
|
||||
assertNotNull(c);
|
||||
ht = c.getEnvironment();
|
||||
assertEquals("holden", ht.get("make"));
|
||||
assertEquals("commodore", ht.get("model"));
|
||||
|
||||
Context icecreamz = ic2.createSubcontext("icecreamz");
|
||||
ht = icecreamz.getEnvironment();
|
||||
assertNotNull(ht);
|
||||
assertEquals("strawberry", ht.get("flavour"));
|
||||
|
||||
Context hatchbackz = ic2.createSubcontext("carz/hatchbackz");
|
||||
assertNotNull(hatchbackz);
|
||||
ht = hatchbackz.getEnvironment();
|
||||
assertNotNull(ht);
|
||||
assertEquals("holden", ht.get("make"));
|
||||
assertEquals("commodore", ht.get("model"));
|
||||
assertEquals(null, ht.get("flavour"));
|
||||
|
||||
c = (Context)ic.lookup("carz/hatchbackz");
|
||||
assertNotNull(c);
|
||||
assertEquals(hatchbackz, c);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@Test
|
||||
public void testLocal () throws Exception
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue