Author: dblevins
Date: Wed Jan 13 21:49:18 2010
New Revision: 898947

URL: http://svn.apache.org/viewvc?rev=898947&view=rev
Log:
OPENEJB-1130: Stricter ClientModule classpath discovery prevents 
NameAlreadyBoundException

Added:
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/RequireDescriptors.java
   (with props)
Modified:
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentsResolver.java

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java?rev=898947&r1=898946&r2=898947&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
 Wed Jan 13 21:49:18 2010
@@ -1137,6 +1137,17 @@
     }
 
     public static Class<? extends DeploymentModule> discoverModuleType(URL 
baseUrl, ClassLoader classLoader, boolean searchForDescriptorlessApplications) 
throws IOException, UnknownModuleTypeException {
+        Set<RequireDescriptors> search = new HashSet<RequireDescriptors>();
+
+        if (!searchForDescriptorlessApplications) 
search.addAll(Arrays.asList(RequireDescriptors.values()));
+
+        return discoverModuleType(baseUrl, classLoader, search);
+    }
+
+    public static Class<? extends DeploymentModule> discoverModuleType(URL 
baseUrl, ClassLoader classLoader, Set<RequireDescriptors> requireDescriptor) 
throws IOException, UnknownModuleTypeException {
+        final boolean scanPotentialEjbModules = 
!requireDescriptor.contains(RequireDescriptors.EJB);
+        final boolean scanPotentialClientModules = 
!requireDescriptor.contains(RequireDescriptors.CLIENT);
+
         ResourceFinder finder = new ResourceFinder("", classLoader, baseUrl);
         Map<String, URL> descriptors = 
altDDSources(finder.getResourcesMap("META-INF/"), false);
 
@@ -1165,7 +1176,8 @@
         }
 
         URL manifestUrl = descriptors.get("MANIFEST.MF");
-        if (manifestUrl != null) {
+        if (scanPotentialClientModules && manifestUrl != null) {
+            // In this case scanPotentialClientModules really means "require 
application-client.xml"
             InputStream is = manifestUrl.openStream();
             Manifest manifest = new Manifest(is);
             String mainClass = 
manifest.getMainAttributes().getValue(Attributes.Name.MAIN_CLASS);
@@ -1174,7 +1186,7 @@
             }
         }
 
-        if (searchForDescriptorlessApplications) {
+        if (scanPotentialEjbModules || scanPotentialClientModules) {
             AnnotationFinder classFinder = new AnnotationFinder(classLoader, 
baseUrl);
 
             final Set<Class<? extends DeploymentModule>> otherTypes = new 
LinkedHashSet();
@@ -1182,12 +1194,12 @@
             AnnotationFinder.Filter filter = new AnnotationFinder.Filter() {
                 final String packageName = 
LocalClient.class.getName().replace("LocalClient", "");
                 public boolean accept(String annotationName) {
-                    if (annotationName.startsWith("javax.ejb.")) {
+                    if (scanPotentialEjbModules && 
annotationName.startsWith("javax.ejb.")) {
                         if ("javax.ejb.Stateful".equals(annotationName)) 
return true;
                         if ("javax.ejb.Stateless".equals(annotationName)) 
return true;
                         if ("javax.ejb.Singleton".equals(annotationName)) 
return true;
                         if ("javax.ejb.MessageDriven".equals(annotationName)) 
return true;
-                    } else if (annotationName.startsWith(packageName)){
+                    } else if (scanPotentialClientModules && 
annotationName.startsWith(packageName)){
                         if 
(LocalClient.class.getName().equals(annotationName)) 
otherTypes.add(ClientModule.class);
                         if 
(RemoteClient.class.getName().equals(annotationName)) 
otherTypes.add(ClientModule.class);
                     }

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentsResolver.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentsResolver.java?rev=898947&r1=898946&r2=898947&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentsResolver.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentsResolver.java
 Wed Jan 13 21:49:18 2010
@@ -33,6 +33,7 @@
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Set;
 
 /**
  * @version $Rev$ $Date$
@@ -43,7 +44,7 @@
     static final String SEARCH_CLASSPATH_FOR_DEPLOYMENTS_PROPERTY = 
DEPLOYMENTS_CLASSPATH_PROPERTY;
     private static final String CLASSPATH_INCLUDE = 
"openejb.deployments.classpath.include";
     private static final String CLASSPATH_EXCLUDE = 
"openejb.deployments.classpath.exclude";
-    private static final String CLASSPATH_REQUIRE_DESCRIPTOR = 
"openejb.deployments.classpath.require.descriptor";
+    private static final String CLASSPATH_REQUIRE_DESCRIPTOR = 
RequireDescriptors.PROPERTY;
     private static final String CLASSPATH_FILTER_DESCRIPTORS = 
"openejb.deployments.classpath.filter.descriptors";
     private static final String CLASSPATH_FILTER_SYSTEMAPPS = 
"openejb.deployments.classpath.filter.systemapps";
     private static final Logger logger = DeploymentLoader.logger;
@@ -155,7 +156,7 @@
         Options options = SystemInstance.get().getOptions();
         String include = options.get(CLASSPATH_INCLUDE, "");
         String exclude = options.get(CLASSPATH_EXCLUDE, ".*");
-        boolean requireDescriptors = options.get(CLASSPATH_REQUIRE_DESCRIPTOR, 
false);
+        Set<RequireDescriptors> requireDescriptors = 
options.getAll(CLASSPATH_REQUIRE_DESCRIPTOR, RequireDescriptors.CLIENT);
         boolean filterDescriptors = options.get(CLASSPATH_FILTER_DESCRIPTORS, 
false);
         boolean filterSystemApps = options.get(CLASSPATH_FILTER_SYSTEMAPPS, 
true);
 
@@ -246,15 +247,20 @@
                 return;
             } else if (size < 20) {
                 logger.debug("Inspecting classpath for applications: " + 
urls.size() + " urls.");
-            } else if (size < 50 && !requireDescriptors) {
-                logger.info("Inspecting classpath for applications: " + 
urls.size() + " urls. Consider adjusting your exclude/include.  Current 
settings: " + CLASSPATH_EXCLUDE + "='" + exclude + "', " + CLASSPATH_INCLUDE + 
"='" + include + "'");
-            } else if (!requireDescriptors) {
-                logger.warning("Inspecting classpath for applications: " + 
urls.size() + " urls.");
-                logger.warning("ADJUST THE EXCLUDE/INCLUDE!!!.  Current 
settings: " + CLASSPATH_EXCLUDE + "='" + exclude + "', " + CLASSPATH_INCLUDE + 
"='" + include + "'");
+            } else {
+                // Has the user allowed some module types to be discoverable 
via scraping?                                                                  
+                boolean willScrape = requireDescriptors.size() < 
RequireDescriptors.values().length;
+
+                if (size < 50 && willScrape) {
+                    logger.info("Inspecting classpath for applications: " + 
urls.size() + " urls. Consider adjusting your exclude/include.  Current 
settings: " + CLASSPATH_EXCLUDE + "='" + exclude + "', " + CLASSPATH_INCLUDE + 
"='" + include + "'");
+                } else if (willScrape) {
+                    logger.warning("Inspecting classpath for applications: " + 
urls.size() + " urls.");
+                    logger.warning("ADJUST THE EXCLUDE/INCLUDE!!!.  Current 
settings: " + CLASSPATH_EXCLUDE + "='" + exclude + "', " + CLASSPATH_INCLUDE + 
"='" + include + "'");
+                }
             }
 
             long begin = System.currentTimeMillis();
-            processUrls(urls, classLoader, !requireDescriptors, base, jarList);
+            processUrls(urls, classLoader, requireDescriptors, base, jarList);
             long end = System.currentTimeMillis();
             long time = end - begin;
 
@@ -264,7 +270,7 @@
                 if (filterSystemApps){
                     unchecked = 
unchecked.exclude(".*/openejb-[^/]+(.(jar|ear|war)(./)?|/target/classes/?)");
                 }
-                processUrls(unchecked.getUrls(), classLoader, false, base, 
jarList);
+                processUrls(unchecked.getUrls(), classLoader, 
requireDescriptors, base, jarList);
             }
 
             if (logger.isDebugEnabled()) {
@@ -305,12 +311,12 @@
 
     }
 
-    private static void processUrls(List<URL> urls, ClassLoader classLoader, 
boolean searchForDescriptorlessApplications, FileUtils base, List<String> 
jarList) {
+    private static void processUrls(List<URL> urls, ClassLoader classLoader, 
Set<RequireDescriptors> requireDescriptors, FileUtils base, List<String> 
jarList) {
         for (URL url : urls) {
             Deployments deployment;
             String path;
             try {
-                Class<? extends DeploymentModule> moduleType = 
DeploymentLoader.discoverModuleType(url, classLoader, 
searchForDescriptorlessApplications);
+                Class<? extends DeploymentModule> moduleType = 
DeploymentLoader.discoverModuleType(url, classLoader, requireDescriptors);
                 if (AppModule.class.isAssignableFrom(moduleType) || 
EjbModule.class.isAssignableFrom(moduleType) || 
PersistenceModule.class.isAssignableFrom(moduleType) || 
ConnectorModule.class.isAssignableFrom(moduleType) || 
ClientModule.class.isAssignableFrom(moduleType)) {
                     deployment = JaxbOpenejb.createDeployments();
                     if (url.getProtocol().equals("jar")) {

Added: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/RequireDescriptors.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/RequireDescriptors.java?rev=898947&view=auto
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/RequireDescriptors.java
 (added)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/RequireDescriptors.java
 Wed Jan 13 21:49:18 2010
@@ -0,0 +1,26 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE 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.openejb.config;
+
+/**
+ * @version $Rev$ $Date$
+*/
+public enum RequireDescriptors {
+    EJB, CLIENT;
+
+    public static final String PROPERTY = 
"openejb.deployments.classpath.require.descriptor";
+}

Propchange: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/RequireDescriptors.java
------------------------------------------------------------------------------
    svn:eol-style = native


Reply via email to