Author: rmannibucau Date: Mon Feb 18 17:10:19 2013 New Revision: 1447395 URL: http://svn.apache.org/r1447395 Log: keeping prefix related to a resource since it can be mandatory while the app is not yet deployed + cleaning up the contextual jndi reference when mandatory
Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/ContextualJndiReference.java tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/IvmContext.java Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?rev=1447395&r1=1447394&r2=1447395&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java Mon Feb 18 17:10:19 2013 @@ -1514,6 +1514,32 @@ public class Assembler extends Assembler } } + for (final String id : appInfo.resourceAliases) { + final String name = OPENEJB_RESOURCE_JNDI_PREFIX + id; + ContextualJndiReference.followReference.set(false); + if (globalContext instanceof IvmContext) { + IvmContext.class.cast(globalContext).ignoreCache(name); + } + try { + final Object object; + try { + object = globalContext.lookup(name); + } finally { + ContextualJndiReference.followReference.remove(); + } + if (object instanceof ContextualJndiReference) { + final ContextualJndiReference contextualJndiReference = ContextualJndiReference.class.cast(object); + contextualJndiReference.removePrefix(appContext.getId()); + if (contextualJndiReference.hasNoMorePrefix()) { + globalContext.unbind(name); + } // else not the last deployed application to use this resource so keep it + } else { + globalContext.unbind(name); + } + } catch (NamingException e) { + logger.warning("can't unbind resource '{0}'", id); + } + } for (final String id : appInfo.resourceIds) { final String name = OPENEJB_RESOURCE_JNDI_PREFIX + id; try { @@ -1530,14 +1556,6 @@ public class Assembler extends Assembler logger.warning("can't unbind resource '{0}'", id); } } - for (final String id : appInfo.resourceAliases) { - final String name = OPENEJB_RESOURCE_JNDI_PREFIX + id; - try { - globalContext.unbind(name); - } catch (NamingException e) { - logger.warning("can't unbind resource '{0}'", id); - } - } containerSystem.removeAppContext(appInfo.appId); @@ -1982,6 +2000,7 @@ public class Assembler extends Assembler final String baseJndiName = serviceInfo.id.substring(serviceInfo.originAppName.length() + 1); serviceInfo.aliases.add(baseJndiName); final ContextualJndiReference ref = new ContextualJndiReference(baseJndiName); + ref.addPrefix(serviceInfo.originAppName); bindResource(baseJndiName, ref); } @@ -1995,10 +2014,14 @@ public class Assembler extends Assembler private void bindResource(final String id, final Object service) throws OpenEJBException { final String name = OPENEJB_RESOURCE_JNDI_PREFIX + id; + final Context jndiContext = containerSystem.getJNDIContext(); Object existing = null; try { ContextualJndiReference.followReference.set(false); - existing = containerSystem.getJNDIContext().lookup(name); + if (jndiContext instanceof IvmContext) { + IvmContext.class.cast(jndiContext).ignoreCache(name); + } + existing = jndiContext.lookup(name); } catch (final Exception ignored) { // no-op } finally { @@ -2015,21 +2038,22 @@ public class Assembler extends Assembler } else if (existingIsContextual && !serviceIsExisting) { ContextualJndiReference.class.cast(existing).setDefaultValue(service); } else if (existingIsContextual) { // && serviceIsExisting is always true here + ContextualJndiReference.class.cast(existing).addPrefix(ContextualJndiReference.class.cast(service).lastPrefix()); return; } } try { if (rebind) { - containerSystem.getJNDIContext().rebind(name, service); + jndiContext.rebind(name, service); } else { - containerSystem.getJNDIContext().bind(name, service); + jndiContext.bind(name, service); } } catch (NameAlreadyBoundException nabe) { logger.warning("unbounding resource " + name + " can happen because of a redeployment or because of a duplicated id"); try { - containerSystem.getJNDIContext().unbind(name); - containerSystem.getJNDIContext().bind(name, service); + jndiContext.unbind(name); + jndiContext.bind(name, service); } catch (NamingException e) { throw new OpenEJBException("Cannot bind resource adapter with id " + id, e); } Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java?rev=1447395&r1=1447394&r2=1447395&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java Mon Feb 18 17:10:19 2013 @@ -947,8 +947,14 @@ public class AutoConfig implements Dynam Collections.sort(resourceInfos, new ConfigurationFactory.ResourceInfoComparator(resourceInfos)); for (ResourceInfo resourceInfo : resourceInfos) { + final int originalSize = resourceInfo.aliases.size(); final String id = installResource(module.getModuleId(), resourceInfo); - resourcesMap.remove(resourceInfo).setId(id); + + final Resource resource = resourcesMap.remove(resourceInfo); + resource.setId(id); + if (resourceInfo.aliases.size() > originalSize) { // an aliases is generally added to be able to bind in global jndi tree + resource.getAliases().add(resourceInfo.aliases.get(resourceInfo.aliases.size() - 1)); + } } resourceInfos.clear(); Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/ContextualJndiReference.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/ContextualJndiReference.java?rev=1447395&r1=1447394&r2=1447395&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/ContextualJndiReference.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/ContextualJndiReference.java Mon Feb 18 17:10:19 2013 @@ -27,6 +27,8 @@ import javax.naming.NameNotFoundExceptio import javax.naming.NamingException; import java.util.ArrayList; import java.util.Collection; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; public class ContextualJndiReference extends IntraVmJndiReference { public static final ThreadLocal<Boolean> followReference = new ThreadLocal<Boolean>() { @@ -37,6 +39,7 @@ public class ContextualJndiReference ext }; private Object defaultValue; + private List<String> prefixes = new CopyOnWriteArrayList<String>(); public ContextualJndiReference(final String jndiName) { super(jndiName); @@ -46,6 +49,29 @@ public class ContextualJndiReference ext this.defaultValue = defaultValue; } + public void addPrefix(final String value) { + if (value != null) { + prefixes.add(value); + } + } + + public void removePrefix(final String value) { + if (value != null) { + prefixes.remove(value); + } + } + + public String lastPrefix() { + if (prefixes.isEmpty()) { + return null; + } + return prefixes.get(prefixes.size() - 1); + } + + public boolean hasNoMorePrefix() { + return prefixes.isEmpty(); + } + @Override public Object getObject() throws NamingException { final Boolean rawValue = !followReference.get(); @@ -66,8 +92,8 @@ public class ContextualJndiReference ext } final Collection<Object> values = new ArrayList<Object>(); - for (final String p : allPrefixes()) { - if (prefix != null && !prefix.isEmpty()) { + for (final String p : prefixes) { + if (p != null && !p.isEmpty()) { try { values.add(lookup(p + '/' + jndiName)); } catch (final NamingException e) { @@ -108,14 +134,6 @@ public class ContextualJndiReference ext return null; } - private Collection<String> allPrefixes() { - final Collection<String> prefixes = new ArrayList<String>(); - for (final AppContext appContext : SystemInstance.get().getComponent(ContainerSystem.class).getAppContexts()) { - prefixes.add(appContext.getId()); - } - return prefixes; - } - private Object lookup(final String s) throws NamingException { final ContainerSystem containerSystem = SystemInstance.get().getComponent(ContainerSystem.class); final Context jndiContext = containerSystem.getJNDIContext(); Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/IvmContext.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/IvmContext.java?rev=1447395&r1=1447394&r2=1447395&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/IvmContext.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/IvmContext.java Mon Feb 18 17:10:19 2013 @@ -469,6 +469,10 @@ public class IvmContext implements Conte if (readOnly) throw new OperationNotSupportedException(); } + public void ignoreCache(final String name) { + fastCache.remove(name); + } + protected class MyBindingEnumeration extends MyNamingEnumeration { public MyBindingEnumeration(NameNode parentNode) {