You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by ga...@apache.org on 2010/04/13 20:02:10 UTC

svn commit: r933722 - in /geronimo/server/trunk/plugins: connector-1_6/geronimo-connector-builder-1_6/src/main/java/org/apache/geronimo/connector/deployment/ connector-1_6/geronimo-connector-builder-1_6/src/main/java/org/apache/geronimo/datasource/depl...

Author: gawor
Date: Tue Apr 13 18:02:09 2010
New Revision: 933722

URL: http://svn.apache.org/viewvc?rev=933722&view=rev
Log:
GERONIMO-5232: Support @Resource.lookup for env-entry, resource-ref, resource-env-ref, and message-destination-ref. Also fixes java:app jndi namespace

Modified:
    geronimo/server/trunk/plugins/connector-1_6/geronimo-connector-builder-1_6/src/main/java/org/apache/geronimo/connector/deployment/AdminObjectRefBuilder.java
    geronimo/server/trunk/plugins/connector-1_6/geronimo-connector-builder-1_6/src/main/java/org/apache/geronimo/connector/deployment/ResourceRefBuilder.java
    geronimo/server/trunk/plugins/connector-1_6/geronimo-connector-builder-1_6/src/main/java/org/apache/geronimo/datasource/deployment/DataSourceBuilder.java
    geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/EARConfigBuilder.java
    geronimo/server/trunk/plugins/j2ee/geronimo-j2ee/src/main/java/org/apache/geronimo/j2ee/jndi/ApplicationJndi.java
    geronimo/server/trunk/plugins/j2ee/geronimo-j2ee/src/main/java/org/apache/geronimo/j2ee/jndi/JndiScope.java
    geronimo/server/trunk/plugins/j2ee/geronimo-naming-builder/src/main/java/org/apache/geronimo/naming/deployment/AbstractNamingBuilder.java
    geronimo/server/trunk/plugins/j2ee/geronimo-naming-builder/src/main/java/org/apache/geronimo/naming/deployment/EnvironmentEntryBuilder.java
    geronimo/server/trunk/plugins/wab/geronimo-web-extender/src/main/java/org/apache/geronimo/osgi/web/extender/WebApplication.java

Modified: geronimo/server/trunk/plugins/connector-1_6/geronimo-connector-builder-1_6/src/main/java/org/apache/geronimo/connector/deployment/AdminObjectRefBuilder.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/connector-1_6/geronimo-connector-builder-1_6/src/main/java/org/apache/geronimo/connector/deployment/AdminObjectRefBuilder.java?rev=933722&r1=933721&r2=933722&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/connector-1_6/geronimo-connector-builder-1_6/src/main/java/org/apache/geronimo/connector/deployment/AdminObjectRefBuilder.java (original)
+++ geronimo/server/trunk/plugins/connector-1_6/geronimo-connector-builder-1_6/src/main/java/org/apache/geronimo/connector/deployment/AdminObjectRefBuilder.java Tue Apr 13 18:02:09 2010
@@ -19,6 +19,7 @@ package org.apache.geronimo.connector.de
 
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -43,6 +44,7 @@ import org.apache.geronimo.kernel.GBeanN
 import org.apache.geronimo.kernel.config.Configuration;
 import org.apache.geronimo.kernel.repository.Environment;
 import org.apache.geronimo.naming.deployment.AbstractNamingBuilder;
+import org.apache.geronimo.naming.reference.JndiReference;
 import org.apache.geronimo.naming.reference.ResourceReferenceFactory;
 import org.apache.geronimo.naming.reference.UserTransactionReference;
 import org.apache.geronimo.xbeans.geronimo.naming.GerMessageDestinationDocument;
@@ -114,9 +116,8 @@ public class AdminObjectRefBuilder exten
     public void buildNaming(XmlObject specDD, XmlObject plan, Module module, Map componentContext) throws DeploymentException {
         XmlObject[] gerResourceEnvRefsUntyped = plan == null ? NO_REFS : plan.selectChildren(GER_ADMIN_OBJECT_REF_QNAME_SET);
         Map<String, GerResourceEnvRefType> refMap = mapResourceEnvRefs(gerResourceEnvRefsUntyped);
-        int initialGerRefSize = refMap.size();
         Map<String, Map<String, GerMessageDestinationType>> messageDestinations = module.getRootEarContext().getMessageDestinations();
-
+        
         // Discover and process any @Resource annotations (if !metadata-complete)
         if (module.getClassFinder() != null) {
 
@@ -129,42 +130,42 @@ public class AdminObjectRefBuilder exten
             }
         }
 
-        List<ResourceEnvRefType> resourceEnvRefsUntyped = convert(specDD.selectChildren(adminOjbectRefQNameSet), JEE_CONVERTER, ResourceEnvRefType.class, ResourceEnvRefType.type);
-        int unresolvedRefSize = resourceEnvRefsUntyped.size();
-        Bundle bundle = module.getEarContext().getDeploymentBundle();
+        List<ResourceEnvRefType> resourceEnvRefsUntyped = convert(specDD.selectChildren(adminOjbectRefQNameSet), JEE_CONVERTER, ResourceEnvRefType.class, ResourceEnvRefType.type);        
+        List<String> unresolvedRefs = new ArrayList<String>();  
         for (ResourceEnvRefType resourceEnvRef : resourceEnvRefsUntyped) {
-            String name = resourceEnvRef.getResourceEnvRefName().getStringValue().trim();
-            if (lookupJndiContextMap(componentContext, ENV + name) != null) {
+            String name = getStringValue(resourceEnvRef.getResourceEnvRefName());
+            if (lookupJndiContextMap(componentContext, name) != null) {
                 // some other builder handled this entry already
                 continue;
             }
             addInjections(name, resourceEnvRef.getInjectionTargetArray(), componentContext);
-            String type = resourceEnvRef.getResourceEnvRefType().getStringValue().trim();
-            Class iface;
-            try {
-                iface = bundle.loadClass(type);
-            } catch (ClassNotFoundException e) {
-                throw new DeploymentException("could not load class " + type, e);
-            }
-            GerResourceEnvRefType gerResourceEnvRef = refMap.get(name);
-            refMap.remove(name);
-            try {
-                String refType = getStringValue(resourceEnvRef.getResourceEnvRefType());
-                if (refType.equals("javax.transaction.UserTransaction")) {
-                    Reference ref = new UserTransactionReference();
-                    put(name, ref, getJndiContextMap(componentContext));
-                } else {
-                    AbstractNameQuery containerId = getAdminObjectContainerId(name, gerResourceEnvRef);
-                    ResourceReferenceFactory<RuntimeException> ref = buildAdminObjectReference(module, containerId, iface);
-                    put(name, ref, getJndiContextMap(componentContext));
+            String type = getStringValue(resourceEnvRef.getResourceEnvRefType());
+            GerResourceEnvRefType gerResourceEnvRef = refMap.remove(name);
+            
+            Object value = null;
+            if (gerResourceEnvRef == null) {
+                String lookupName = getStringValue(resourceEnvRef.getLookupName());
+                if (lookupName != null) {
+                    if (lookupName.equals(getJndiName(name))) {
+                        throw new DeploymentException("resource-env-ref lookup name refers to itself");
+                    }
+                    value = new JndiReference(lookupName);
                 }
-            } catch (UnresolvedReferenceException e) {
-                throw new DeploymentException("Unable to resolve resource env reference '" + name + "' (" + (e.isMultiple() ? "found multiple matching resources" : "no matching resources found") + ")", e);
             }
+            
+            if (value == null) {
+                value = buildResourceReference(module, name, type, gerResourceEnvRef);
+            }
+            
+            if (value == null) {
+                unresolvedRefs.add(name);
+            } else {
+                put(name, value, getJndiContextMap(componentContext));
+            }            
         }
         
-        if (refMap.size() > 0 && ((initialGerRefSize - unresolvedRefSize) != refMap.size())) {
-            log.warn("Failed to build reference to Admin object reference "+refMap.keySet()+" defined in plan file, reason - corresponding entry in deployment descriptor missing.");
+        if (unresolvedRefs.size() > 0) {
+            log.warn("Failed to build reference to resource env reference " + unresolvedRefs + " defined in plan file. The corresponding entry in Geronimo deployment descriptor is missing.");
         }
         
         //message-destination-refs
@@ -191,44 +192,95 @@ public class AdminObjectRefBuilder exten
                 }
                 type = getStringValue(targets[0].getInjectionTargetClass());
                 if (type == null) {
-                    throw new DeploymentException("no type for message destination ref in injection target: " + targets[0]);
+                    throw new DeploymentException("No type for message-destination-ref in injection target: " + targets[0]);
                 }
             }
-            Class iface;
-            try {
-                iface = bundle.loadClass(type);
-            } catch (ClassNotFoundException e) {
-                throw new DeploymentException("could not load class " + type, e);
-            }
-            String moduleURI = null;
+
             GerMessageDestinationType destination = getMessageDestination(linkName, messageDestinations);
-            if (destination != null) {
-                if (destination.isSetAdminObjectLink()) {
-                    if (destination.isSetAdminObjectModule()) {
-                        moduleURI = destination.getAdminObjectModule().trim();
+            
+            Object value = null;
+            if (destination == null) {
+                String lookupName = getStringValue(messageDestinationRef.getLookupName());
+                if (lookupName != null) {
+                    if (lookupName.equals(getJndiName(name))) {
+                        throw new DeploymentException("message-destination-ref lookup name refers to itself");
                     }
-                    linkName = destination.getAdminObjectLink().trim();
-                }
-            } else {
-                //well, we know for sure an admin object is not going to be defined in a modules that can have a message-destination
-                int pos = linkName.indexOf('#');
-                if (pos > -1) {
-                    //AMM -- the following line causes blowups; e.g. to look in DayTrader EJB module for a RA -- why is that?!?
-                    //moduleURI = linkName.substring(0, pos);
-                    linkName = linkName.substring(pos + 1);
+                    value = new JndiReference(lookupName);
                 }
             }
+            
+            if (value == null) {
+                value = buildMessageReference(module, linkName, type, destination);
+            }
+            
+            if (value != null) {
+                put(name, value, getJndiContextMap(componentContext));
+            }
+        }
 
-            //try to resolve ref based only matching resource-ref-name
-            //throws exception if it can't locate ref.
-            AbstractNameQuery containerId = buildAbstractNameQuery(null, moduleURI, linkName, NameFactory.JCA_ADMIN_OBJECT, NameFactory.RESOURCE_ADAPTER_MODULE);
-            ResourceReferenceFactory<RuntimeException> ref = buildAdminObjectReference(module, containerId, iface);
-            put(name, ref, getJndiContextMap(componentContext));
+    }
 
+    private Object buildResourceReference(Module module, String name, String type, GerResourceEnvRefType gerResourceEnvRef) 
+        throws DeploymentException {
+        Bundle bundle = module.getEarContext().getDeploymentBundle();
+    
+        Class iface;
+        try {
+            iface = bundle.loadClass(type);
+        } catch (ClassNotFoundException e) {
+            throw new DeploymentException("Could not load resource-env-ref entry class " + type, e);
+        }
+    
+        if (type.equals("javax.transaction.UserTransaction")) {
+            return new UserTransactionReference();
+        } else {
+            try {
+                AbstractNameQuery containerId = getAdminObjectContainerId(name, gerResourceEnvRef);
+                ResourceReferenceFactory<RuntimeException> ref = buildAdminObjectReference(module, containerId, iface);
+                return ref;
+            } catch (UnresolvedReferenceException e) {
+                throw new DeploymentException("Unable to resolve resource env reference '" + name + "' (" + (e.isMultiple() ? "found multiple matching resources" : "no matching resources found") + ")", e);
+            }
+        } 
+    }
+    
+    private Object buildMessageReference(Module module, String linkName, String type, GerMessageDestinationType destination) 
+        throws DeploymentException {
+        Bundle bundle = module.getEarContext().getDeploymentBundle();
+        
+        Class iface;
+        try {
+            iface = bundle.loadClass(type);
+        } catch (ClassNotFoundException e) {
+            throw new DeploymentException("Could not load message-destination-ref entry type class " + type, e);
+        }
+        
+        String moduleURI = null;
+        
+        if (destination != null) {
+            if (destination.isSetAdminObjectLink()) {
+                if (destination.isSetAdminObjectModule()) {
+                    moduleURI = destination.getAdminObjectModule().trim();
+                }
+                linkName = destination.getAdminObjectLink().trim();
+            }
+        } else {
+            //well, we know for sure an admin object is not going to be defined in a modules that can have a message-destination
+            int pos = linkName.indexOf('#');
+            if (pos > -1) {
+                //AMM -- the following line causes blowups; e.g. to look in DayTrader EJB module for a RA -- why is that?!?
+                //moduleURI = linkName.substring(0, pos);
+                linkName = linkName.substring(pos + 1);
+            }
         }
 
+        //try to resolve ref based only matching resource-ref-name
+        //throws exception if it can't locate ref.
+        AbstractNameQuery containerId = buildAbstractNameQuery(null, moduleURI, linkName, NameFactory.JCA_ADMIN_OBJECT, NameFactory.RESOURCE_ADAPTER_MODULE);
+        ResourceReferenceFactory<RuntimeException> ref = buildAdminObjectReference(module, containerId, iface);
+        return ref;
     }
-
+    
     public static GerMessageDestinationType getMessageDestination(String messageDestinationLink, Map<String, Map<String, GerMessageDestinationType>> messageDestinations) throws DeploymentException {
         GerMessageDestinationType destination = null;
         int pos = messageDestinationLink.indexOf('#');

Modified: geronimo/server/trunk/plugins/connector-1_6/geronimo-connector-builder-1_6/src/main/java/org/apache/geronimo/connector/deployment/ResourceRefBuilder.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/connector-1_6/geronimo-connector-builder-1_6/src/main/java/org/apache/geronimo/connector/deployment/ResourceRefBuilder.java?rev=933722&r1=933721&r2=933722&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/connector-1_6/geronimo-connector-builder-1_6/src/main/java/org/apache/geronimo/connector/deployment/ResourceRefBuilder.java (original)
+++ geronimo/server/trunk/plugins/connector-1_6/geronimo-connector-builder-1_6/src/main/java/org/apache/geronimo/connector/deployment/ResourceRefBuilder.java Tue Apr 13 18:02:09 2010
@@ -54,6 +54,7 @@ import org.apache.geronimo.kernel.reposi
 import org.apache.geronimo.naming.deployment.AbstractNamingBuilder;
 import org.apache.geronimo.naming.deployment.ResourceEnvironmentBuilder;
 import org.apache.geronimo.naming.deployment.ResourceEnvironmentSetter;
+import org.apache.geronimo.naming.reference.JndiReference;
 import org.apache.geronimo.naming.reference.ORBReference;
 import org.apache.geronimo.naming.reference.ResourceReferenceFactory;
 import org.apache.geronimo.naming.reference.URLReference;
@@ -86,7 +87,6 @@ public class ResourceRefBuilder extends 
     private static final String JAXR_CONNECTION_FACTORY_CLASS = "javax.xml.registry.ConnectionFactory";
     private static final String JAVAX_MAIL_SESSION_CLASS = "javax.mail.Session";
 
-
     private final QNameSet resourceRefQNameSet;
     private final Environment corbaEnvironment;
     private final SingleElementCollection corbaGBeanNameSourceCollection;
@@ -119,115 +119,131 @@ public class ResourceRefBuilder extends 
 
         List<ResourceRefType> resourceRefsUntyped = convert(specDD.selectChildren(resourceRefQNameSet), J2EE_CONVERTER, ResourceRefType.class, ResourceRefType.type);
         XmlObject[] gerResourceRefsUntyped = plan == null ? NO_REFS : plan.selectChildren(GER_RESOURCE_REF_QNAME_SET);
-        Map refMap = mapResourceRefs(gerResourceRefsUntyped);
-        List unresolvedRefs = new ArrayList();
-        Bundle bundle = module.getEarContext().getDeploymentBundle();
+        Map<String, GerResourceRefType> refMap = mapResourceRefs(gerResourceRefsUntyped);
+        List<String> unresolvedRefs = new ArrayList<String>();        
         for (ResourceRefType resourceRef : resourceRefsUntyped) {
-            String name = resourceRef.getResRefName().getStringValue().trim();
-            if (lookupJndiContextMap(componentContext, ENV + name) != null) {
+            String name = getStringValue(resourceRef.getResRefName());            
+            if (lookupJndiContextMap(componentContext, name) != null) {
                 // some other builder handled this entry already
                 continue;
-            }
+            }            
             addInjections(name, resourceRef.getInjectionTargetArray(), componentContext);
-            String type = resourceRef.getResType().getStringValue().trim();
-            GerResourceRefType gerResourceRef = (GerResourceRefType) refMap.get(name);
+            String type = getStringValue(resourceRef.getResType());
+            GerResourceRefType gerResourceRef = refMap.get(name);
             log.debug("trying to resolve " + name + ", type " + type + ", resourceRef " + gerResourceRef);
-            if(!refMap.containsKey(name)){
-                unresolvedRefs.add(name);
-            } 
-            Class iface;
-            try {
-                iface = bundle.loadClass(type);
-            } catch (ClassNotFoundException e) {
-                throw new DeploymentException("could not load class " + type, e);
-            }
-            if (iface == URL.class) {
-                if (gerResourceRef == null || !gerResourceRef.isSetUrl()) {
-                    throw new DeploymentException("No url supplied to resolve: " + name);
-                }
-                String url = gerResourceRef.getUrl().trim();
-                //TODO expose jsr-77 objects for these guys
-                try {
-                    //check for malformed URL
-                    new URL(url);
-                } catch (MalformedURLException e) {
-                    throw new DeploymentException("Could not convert " + url + " to URL", e);
-                }
-                put(name, new URLReference(url), getJndiContextMap(componentContext));
-                unresolvedRefs.remove(name);
-            } else if (ORB.class.isAssignableFrom(iface)) {
-                CorbaGBeanNameSource corbaGBeanNameSource = (CorbaGBeanNameSource) corbaGBeanNameSourceCollection.getElement();
-                if (corbaGBeanNameSource == null) {
-                    throw new DeploymentException("No orb setup but there is a orb reference");
-                }
-                AbstractNameQuery corbaName = corbaGBeanNameSource.getCorbaGBeanName();
-                if (corbaName != null) {
-                    Artifact[] moduleId = module.getConfigId();
-                    Map context = getJndiContextMap(componentContext);
-                    context.put(ENV + name, new ORBReference(moduleId, corbaName));
-                    unresolvedRefs.remove(name);
-                    EnvironmentBuilder.mergeEnvironments(module.getEnvironment(), corbaEnvironment);
+            
+            Object value = null;
+            if (gerResourceRef == null) {
+                String lookupName = getStringValue(resourceRef.getLookupName());
+                if (lookupName != null) {
+                    if (lookupName.equals(getJndiName(name))) {
+                        throw new DeploymentException("resource-ref lookup name refers to itself");
+                    }
+                    value = new JndiReference(lookupName);
                 }
+            }
+            
+            if (value == null) {
+                value = buildReference(module, name, type, gerResourceRef);
+            }
+            
+            if (value == null) {
+                unresolvedRefs.add(name);
             } else {
-                //determine jsr-77 type from interface
-                String j2eeType;
+                put(name, value, getJndiContextMap(componentContext));
+            }
+            
+        }
 
+        if (unresolvedRefs.size() > 0) {
+            log.warn("Failed to build reference to resource reference " + unresolvedRefs + " defined in plan file. The corresponding entry in Geronimo deployment descriptor is missing.");
+        }
+    }
 
-                if (JAVAX_MAIL_SESSION_CLASS.equals(type)) {
-                    j2eeType = NameFactory.JAVA_MAIL_RESOURCE;
-                } else if (JAXR_CONNECTION_FACTORY_CLASS.equals(type)) {
-                    j2eeType = NameFactory.JAXR_CONNECTION_FACTORY;
-                } else {
-                    j2eeType = NameFactory.JCA_CONNECTION_FACTORY;
-                }
-                try {
-                    AbstractNameQuery containerId = getResourceContainerId(name, j2eeType, null, gerResourceRef);
+    private Object buildReference(Module module, String name, String type, GerResourceRefType gerResourceRef) 
+        throws DeploymentException {
+        Bundle bundle = module.getEarContext().getDeploymentBundle();
+        
+        Class iface;
+        try {
+            iface = bundle.loadClass(type);
+        } catch (ClassNotFoundException e) {
+            throw new DeploymentException("Could not resource-ref entry class " + type, e);
+        }
+        
+        if (iface == URL.class) {
+            if (gerResourceRef == null || !gerResourceRef.isSetUrl()) {
+                throw new DeploymentException("No url supplied to resolve: " + name);
+            }
+            String url = gerResourceRef.getUrl().trim();
+            //TODO expose jsr-77 objects for these guys
+            try {
+                //check for malformed URL
+                new URL(url);
+            } catch (MalformedURLException e) {
+                throw new DeploymentException("Could not convert " + url + " to URL", e);
+            }
+            return new URLReference(url);
+        } else if (ORB.class.isAssignableFrom(iface)) {
+            CorbaGBeanNameSource corbaGBeanNameSource = (CorbaGBeanNameSource) corbaGBeanNameSourceCollection.getElement();
+            if (corbaGBeanNameSource == null) {
+                throw new DeploymentException("No orb setup but there is a orb reference");
+            }
+            AbstractNameQuery corbaName = corbaGBeanNameSource.getCorbaGBeanName();
+            if (corbaName != null) {
+                Artifact[] moduleId = module.getConfigId();
+                EnvironmentBuilder.mergeEnvironments(module.getEnvironment(), corbaEnvironment);
+                return new ORBReference(moduleId, corbaName);
+            }
+        } else {
+            //determine jsr-77 type from interface
+            String j2eeType;
 
-                    module.getEarContext().findGBean(containerId);
+            if (JAVAX_MAIL_SESSION_CLASS.equals(type)) {
+                j2eeType = NameFactory.JAVA_MAIL_RESOURCE;
+            } else if (JAXR_CONNECTION_FACTORY_CLASS.equals(type)) {
+                j2eeType = NameFactory.JAXR_CONNECTION_FACTORY;
+            } else {
+                j2eeType = NameFactory.JCA_CONNECTION_FACTORY;
+            }
+            try {
+                AbstractNameQuery containerId = getResourceContainerId(name, j2eeType, null, gerResourceRef);
 
-                    Object ref = new ResourceReferenceFactory<ResourceException>(module.getConfigId(), containerId, iface);
-                    put(name, ref, getJndiContextMap(componentContext));
-                    // we thought that this might be an unresolved
-                    // name because it wasn't in the refMap, but now
-                    // we've found it so we can take it out of the
-                    // unresolvedRefs list
-                    unresolvedRefs.remove(name);
-                } catch (GBeanNotFoundException e) {
-
-                    StringBuffer errorMessage = new StringBuffer("Unable to resolve resource reference '");
-                    errorMessage.append(name);
-                    errorMessage.append("' (");
-                    if (e.hasMatches()) {
-                        errorMessage.append("Found multiple matching resources.  Try being more specific in a resource-ref mapping in your Geronimo deployment plan.\n");
-                        for (AbstractName match : e.getMatches()) {
-                            errorMessage.append(match).append("\n");
-                        }
-                    } else if (gerResourceRef == null) {
-                        errorMessage.append("Could not auto-map to resource.  Try adding a resource-ref mapping to your Geronimo deployment plan.");
-                    } else if (gerResourceRef.isSetResourceLink()) {
-                        errorMessage.append("Could not find resource '");
-                        errorMessage.append(gerResourceRef.getResourceLink());
-                        errorMessage.append("'.  Perhaps it has not yet been configured, or your application does not have a dependency declared for that resource module?");
-                    } else {
-                        errorMessage.append("Could not find the resource specified in your Geronimo deployment plan:");
-                        errorMessage.append(gerResourceRef.getPattern());
-                    }
-                    errorMessage.append("\nSearch conducted in current module and dependencies:\n");
-                    for (Dependency dependency : module.getEnvironment().getDependencies()) {
-                        errorMessage.append(dependency).append("\n");
-                    }
-                    errorMessage.append(")");
+                module.getEarContext().findGBean(containerId);
 
-                    throw new DeploymentException(errorMessage.toString());
+                return new ResourceReferenceFactory<ResourceException>(module.getConfigId(), containerId, iface);
+            } catch (GBeanNotFoundException e) {
+                StringBuffer errorMessage = new StringBuffer("Unable to resolve resource reference '");
+                errorMessage.append(name);
+                errorMessage.append("' (");
+                if (e.hasMatches()) {
+                    errorMessage.append("Found multiple matching resources.  Try being more specific in a resource-ref mapping in your Geronimo deployment plan.\n");
+                    for (AbstractName match : e.getMatches()) {
+                        errorMessage.append(match).append("\n");
+                    }
+                } else if (gerResourceRef == null) {
+                    errorMessage.append("Could not auto-map to resource.  Try adding a resource-ref mapping to your Geronimo deployment plan.");
+                } else if (gerResourceRef.isSetResourceLink()) {
+                    errorMessage.append("Could not find resource '");
+                    errorMessage.append(gerResourceRef.getResourceLink());
+                    errorMessage.append("'.  Perhaps it has not yet been configured, or your application does not have a dependency declared for that resource module?");
+                } else {
+                    errorMessage.append("Could not find the resource specified in your Geronimo deployment plan:");
+                    errorMessage.append(gerResourceRef.getPattern());
                 }
-            }
-        }
+                errorMessage.append("\nSearch conducted in current module and dependencies:\n");
+                for (Dependency dependency : module.getEnvironment().getDependencies()) {
+                    errorMessage.append(dependency).append("\n");
+                }
+                errorMessage.append(")");
 
-        if (unresolvedRefs.size() > 0) {
-            log.warn("Failed to build reference to resource reference "+ unresolvedRefs +" defined in plan file, reason - corresponding entry in deployment descriptor missing.");
+                throw new DeploymentException(errorMessage.toString());
+            }
         }
+        
+        return null;
     }
-
+    
     public void setResourceEnvironment(ResourceEnvironmentBuilder builder, XmlObject[] resourceRefs, GerResourceRefType[] gerResourceRefs) throws DeploymentException {
         List<ResourceRefType> resourceRefList = convert(resourceRefs, J2EE_CONVERTER, ResourceRefType.class, ResourceRefType.type);
         Map refMap = mapResourceRefs(gerResourceRefs);

Modified: geronimo/server/trunk/plugins/connector-1_6/geronimo-connector-builder-1_6/src/main/java/org/apache/geronimo/datasource/deployment/DataSourceBuilder.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/connector-1_6/geronimo-connector-builder-1_6/src/main/java/org/apache/geronimo/datasource/deployment/DataSourceBuilder.java?rev=933722&r1=933721&r2=933722&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/connector-1_6/geronimo-connector-builder-1_6/src/main/java/org/apache/geronimo/datasource/deployment/DataSourceBuilder.java (original)
+++ geronimo/server/trunk/plugins/connector-1_6/geronimo-connector-builder-1_6/src/main/java/org/apache/geronimo/datasource/deployment/DataSourceBuilder.java Tue Apr 13 18:02:09 2010
@@ -373,15 +373,7 @@ public class DataSourceBuilder extends A
         
         return dsDescription;
     }
-    
-    private static String getJndiName(String name) {
-        if (name.startsWith("java:")) {
-            return name;
-        } else {
-            return "java:comp/env/" + name;
-        }
-    }
-    
+        
     public QNameSet getPlanQNameSet() {
         return QNameSet.EMPTY; 
     }

Modified: geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/EARConfigBuilder.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/EARConfigBuilder.java?rev=933722&r1=933721&r2=933722&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/EARConfigBuilder.java (original)
+++ geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/EARConfigBuilder.java Tue Apr 13 18:02:09 2010
@@ -600,6 +600,9 @@ public class EARConfigBuilder implements
                 }
             }
 
+            Map<JndiKey, Map<String, Object>> contexts = NamingBuilder.JNDI_KEY.get(earContext.getGeneralData());
+            contexts.put(JndiScope.app, new HashMap<String, Object>());
+            
             // give each module a chance to populate the earContext now that a classloader is available
             Bundle bundle = earContext.getDeploymentBundle();
             for (Module module : applicationInfo.getModules()) {
@@ -679,10 +682,10 @@ public class EARConfigBuilder implements
                 EARConfigBuilder.appInfo.set(applicationInfo);
                 throw new DeploymentException();
             }
-            Map<JndiKey, Map<String, Object>> contexts = NamingBuilder.JNDI_KEY.get(earContext.getGeneralData());
+            
             GBeanData appContexts = new GBeanData(appJndiName, ApplicationJndi.class);
             appContexts.setAttribute("globalContextSegment", contexts.get(JndiScope.global));
-            appContexts.setAttribute("applicationContextMap", contexts.get(JndiScope.application));
+            appContexts.setAttribute("applicationContextMap", contexts.get(JndiScope.app));
             appContexts.setReferencePattern("GlobalContext", globalContextAbstractName);
             earContext.addGBean(appContexts);
 

Modified: geronimo/server/trunk/plugins/j2ee/geronimo-j2ee/src/main/java/org/apache/geronimo/j2ee/jndi/ApplicationJndi.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/j2ee/geronimo-j2ee/src/main/java/org/apache/geronimo/j2ee/jndi/ApplicationJndi.java?rev=933722&r1=933721&r2=933722&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/j2ee/geronimo-j2ee/src/main/java/org/apache/geronimo/j2ee/jndi/ApplicationJndi.java (original)
+++ geronimo/server/trunk/plugins/j2ee/geronimo-j2ee/src/main/java/org/apache/geronimo/j2ee/jndi/ApplicationJndi.java Tue Apr 13 18:02:09 2010
@@ -53,7 +53,7 @@ public class ApplicationJndi implements 
         this.globalAdditions = EnterpriseNamingContext.livenReferences(globalContextSegment, null, kernel, classLoader, JndiScope.global.name() + "/");
         this.globalContext = globalContext;
         this.globalContext.federateContext(this.globalAdditions);
-        this.applicationContext = EnterpriseNamingContext.livenReferences(applicationContext, null, kernel, classLoader, JndiScope.application.name() + "/");
+        this.applicationContext = EnterpriseNamingContext.livenReferences(applicationContext, null, kernel, classLoader, JndiScope.app.name() + "/");
     }
 
     public Context getApplicationContext() {

Modified: geronimo/server/trunk/plugins/j2ee/geronimo-j2ee/src/main/java/org/apache/geronimo/j2ee/jndi/JndiScope.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/j2ee/geronimo-j2ee/src/main/java/org/apache/geronimo/j2ee/jndi/JndiScope.java?rev=933722&r1=933721&r2=933722&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/j2ee/geronimo-j2ee/src/main/java/org/apache/geronimo/j2ee/jndi/JndiScope.java (original)
+++ geronimo/server/trunk/plugins/j2ee/geronimo-j2ee/src/main/java/org/apache/geronimo/j2ee/jndi/JndiScope.java Tue Apr 13 18:02:09 2010
@@ -24,5 +24,5 @@ package org.apache.geronimo.j2ee.jndi;
  * @version $Rev$ $Date$
  */
 public enum JndiScope implements JndiKey {
-    global, application, module, comp
+    global, app, module, comp
 }

Modified: geronimo/server/trunk/plugins/j2ee/geronimo-naming-builder/src/main/java/org/apache/geronimo/naming/deployment/AbstractNamingBuilder.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/j2ee/geronimo-naming-builder/src/main/java/org/apache/geronimo/naming/deployment/AbstractNamingBuilder.java?rev=933722&r1=933721&r2=933722&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/j2ee/geronimo-naming-builder/src/main/java/org/apache/geronimo/naming/deployment/AbstractNamingBuilder.java (original)
+++ geronimo/server/trunk/plugins/j2ee/geronimo-naming-builder/src/main/java/org/apache/geronimo/naming/deployment/AbstractNamingBuilder.java Tue Apr 13 18:02:09 2010
@@ -169,6 +169,14 @@ public abstract class AbstractNamingBuil
         return NamingBuilder.JNDI_KEY.get(sharedContext);
     }
 
+    protected String getJndiName(String name) {
+        if (name.indexOf(':') != -1) {   
+            return "java:comp/env/" + name;
+        } else {
+            return name;
+        }
+    }
+    
     protected AbstractName getGBeanName(Map<EARContext.Key, Object> sharedContext) {
         return GBEAN_NAME_KEY.get(sharedContext);
     }

Modified: geronimo/server/trunk/plugins/j2ee/geronimo-naming-builder/src/main/java/org/apache/geronimo/naming/deployment/EnvironmentEntryBuilder.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/j2ee/geronimo-naming-builder/src/main/java/org/apache/geronimo/naming/deployment/EnvironmentEntryBuilder.java?rev=933722&r1=933721&r2=933722&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/j2ee/geronimo-naming-builder/src/main/java/org/apache/geronimo/naming/deployment/EnvironmentEntryBuilder.java (original)
+++ geronimo/server/trunk/plugins/j2ee/geronimo-naming-builder/src/main/java/org/apache/geronimo/naming/deployment/EnvironmentEntryBuilder.java Tue Apr 13 18:02:09 2010
@@ -121,6 +121,9 @@ public class EnvironmentEntryBuilder ext
                 if (strValue == null) {
                     String lookupName = getStringValue(envEntry.getLookupName());
                     if (lookupName != null) {
+                        if (lookupName.equals(getJndiName(name))) {
+                            throw new DeploymentException("env-entry lookup name refers to itself");
+                        }
                         value = new JndiReference(lookupName);
                     }
                 }

Modified: geronimo/server/trunk/plugins/wab/geronimo-web-extender/src/main/java/org/apache/geronimo/osgi/web/extender/WebApplication.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/wab/geronimo-web-extender/src/main/java/org/apache/geronimo/osgi/web/extender/WebApplication.java?rev=933722&r1=933721&r2=933722&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/wab/geronimo-web-extender/src/main/java/org/apache/geronimo/osgi/web/extender/WebApplication.java (original)
+++ geronimo/server/trunk/plugins/wab/geronimo-web-extender/src/main/java/org/apache/geronimo/osgi/web/extender/WebApplication.java Tue Apr 13 18:02:09 2010
@@ -200,10 +200,13 @@ public class WebApplication implements R
                         bundle);
                 webModule.setEarContext(deploymentContext);
                 webModule.setRootEarContext(deploymentContext);
-
+                
                 deploymentContext.flush();
                 deploymentContext.initializeConfiguration();
 
+                Map<JndiKey, Map<String, Object>> contexts = NamingBuilder.JNDI_KEY.get(deploymentContext.getGeneralData());
+                contexts.put(JndiScope.app, new HashMap<String, Object>());
+                
                 webModuleBuilder.initContext(deploymentContext, webModule, bundle);
 
                 AbstractName appJndiName = naming.createChildName(deploymentContext.getModuleName(), "ApplicationJndi", "ApplicationJndi");
@@ -211,10 +214,9 @@ public class WebApplication implements R
 
                 webModuleBuilder.addGBeans(deploymentContext, webModule, bundle, extender.getRepositories());
 
-                Map<JndiKey, Map<String, Object>> contexts = NamingBuilder.JNDI_KEY.get(deploymentContext.getGeneralData());
                 GBeanData appContexts = new GBeanData(appJndiName, ApplicationJndi.class);
                 appContexts.setAttribute("globalContextSegment", contexts.get(JndiScope.global));
-                appContexts.setAttribute("applicationContextMap", contexts.get(JndiScope.application));
+                appContexts.setAttribute("applicationContextMap", contexts.get(JndiScope.app));
                 appContexts.setReferencePattern("GlobalContext", extender.getGlobalContextAbstractName());
                 deploymentContext.addGBean(appContexts);