Author: rmannibucau
Date: Wed Sep 18 16:12:28 2013
New Revision: 1524478

URL: http://svn.apache.org/r1524478
Log:
copying a little bit the altdd logic to avoid classloading loop (and issues) 
when using openejb javaagent

Modified:
    
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
    
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/persistence/PersistenceBootstrap.java
    
tomee/tomee/trunk/container/openejb-loader/src/main/java/org/apache/openejb/loader/Embedder.java

Modified: 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java?rev=1524478&r1=1524477&r2=1524478&view=diff
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
 (original)
+++ 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
 Wed Sep 18 16:12:28 2013
@@ -110,7 +110,7 @@ public class DeploymentLoader implements
 
     private boolean scanManagedBeans = true;
     private static final Collection<String> KNOWN_DESCRIPTORS = 
Arrays.asList("app-ctx.xml", "module.properties", "application.properties", 
"web.xml", "ejb-jar.xml", "openejb-jar.xml", "env-entries.properties", 
"beans.xml", "ra.xml", "application.xml", "application-client.xml", 
"persistence-fragment.xml", "persistence.xml", "validation.xml", 
NewLoaderLogic.EXCLUSION_FILE);
-    public static String ALTDD = 
SystemInstance.get().getOptions().get(OPENEJB_ALTDD_PREFIX, (String) null);
+    private static String ALTDD = 
SystemInstance.get().getOptions().get(OPENEJB_ALTDD_PREFIX, (String) null);
 
     public AppModule load(final File jarFile) throws OpenEJBException {
         // verify we have a valid file

Modified: 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/persistence/PersistenceBootstrap.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/persistence/PersistenceBootstrap.java?rev=1524478&r1=1524477&r2=1524478&view=diff
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/persistence/PersistenceBootstrap.java
 (original)
+++ 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/persistence/PersistenceBootstrap.java
 Wed Sep 18 16:12:28 2013
@@ -16,11 +16,10 @@
  */
 package org.apache.openejb.persistence;
 
-import org.apache.openejb.config.DeploymentLoader;
 import org.apache.openejb.core.TempClassLoader;
 import org.apache.openejb.javaagent.Agent;
 import org.apache.openejb.loader.IO;
-import org.apache.openejb.util.URLs;
+import org.apache.openejb.loader.SystemInstance;
 import org.apache.openejb.util.Saxs;
 import org.apache.xbean.finder.ClassLoaders;
 import org.xml.sax.Attributes;
@@ -40,6 +39,7 @@ import java.io.PrintWriter;
 import java.lang.instrument.ClassFileTransformer;
 import java.lang.instrument.IllegalClassFormatException;
 import java.lang.instrument.Instrumentation;
+import java.net.MalformedURLException;
 import java.net.URL;
 import java.security.ProtectionDomain;
 import java.sql.Connection;
@@ -58,6 +58,8 @@ import java.util.Properties;
 import java.util.Set;
 import java.util.logging.Logger;
 
+import static org.apache.openejb.loader.JarLocation.decode;
+
 /**
  * The goal of this class is to support persistence providers that need to do
  * byte code enhancement in embedded environments like JUnit where all the
@@ -92,8 +94,11 @@ public class PersistenceBootstrap {
 
             // create persistence.xml names respecting altdd
             final Collection<String> pXmlNames = new ArrayList<String>();
-            if (DeploymentLoader.ALTDD != null) {
-                for (final String p : DeploymentLoader.ALTDD.split(",")) {
+
+            // altdd logic duplicated to avoid classloading issue in 
tomee-webapp mode
+            final String altDD = 
SystemInstance.get().getOptions().get("openejb.altdd.prefix", (String) null);
+            if (altDD != null) {
+                for (final String p : altDD.split(",")) {
                     pXmlNames.add(p + ".persistence.xml");
                     pXmlNames.add(p + "-persistence.xml");
                 }
@@ -107,7 +112,7 @@ public class PersistenceBootstrap {
                 try {
                     final Collection<URL> loaderUrls = 
ClassLoaders.findUrls(classLoader);
                     for (final URL url : loaderUrls) {
-                        final File file = URLs.toFile(url);
+                        final File file = toFile(url);
                         if ("classes".equals(file.getName()) && 
"WEB-INF".equals(file.getParentFile().getName())) {
                             final File pXml = new File(file.getParentFile(), 
pXmlName);
                             if (pXml.exists()) {
@@ -224,8 +229,8 @@ public class PersistenceBootstrap {
         String args = Agent.getAgentArgs();
         if (args != null && args.length() != 0) {
             for (String string : args.split("[ ,:&]")) {
-                String[] strings = string.split("=");
-                if (strings != null && strings.length == 2) {
+                final String[] strings = string.split("=");
+                if (strings.length == 2) {
                     properties.put(strings[0], strings[1]);
                 }
             }
@@ -309,6 +314,32 @@ public class PersistenceBootstrap {
         });
     }
 
+    public static File toFile(final URL url) {
+        if ("jar".equals(url.getProtocol())) {
+            try {
+                final String spec = url.getFile();
+
+                int separator = spec.indexOf('!');
+                /*
+                 * REMIND: we don't handle nested JAR URLs
+                 */
+                if (separator == -1) throw new MalformedURLException("no ! 
found in jar url spec:" + spec);
+
+                return toFile(new URL(spec.substring(0, separator++)));
+            } catch (MalformedURLException e) {
+                throw new IllegalStateException(e);
+            }
+        } else if ("file".equals(url.getProtocol())) {
+            String path = decode(url.getFile());
+            if (path.endsWith("!")) {
+                path = path.substring(0, path.length() - 1);
+            }
+            return new File(path);
+        } else {
+            throw new IllegalArgumentException("Unsupported URL scheme: " + 
url.toExternalForm());
+        }
+    }
+
     private static class Unit {
         private String provider;
         private final Set<String> classes = new HashSet<String>();

Modified: 
tomee/tomee/trunk/container/openejb-loader/src/main/java/org/apache/openejb/loader/Embedder.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-loader/src/main/java/org/apache/openejb/loader/Embedder.java?rev=1524478&r1=1524477&r2=1524478&view=diff
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-loader/src/main/java/org/apache/openejb/loader/Embedder.java
 (original)
+++ 
tomee/tomee/trunk/container/openejb-loader/src/main/java/org/apache/openejb/loader/Embedder.java
 Wed Sep 18 16:12:28 2013
@@ -116,8 +116,14 @@ public class Embedder {
 
         try {
             return classLoader.loadClass(className);
+        } catch (final LinkageError le) {
+            try {
+                return classLoader.loadClass(className);
+            } catch (final Exception rethrow) {
+                throw new Exception("Could not load class '" + className + "' 
after embedding libraries. Exception: " + le.getClass().getName() + " " + 
le.getMessage());
+            }
         } catch (Exception e2) {
-            throw new Exception("Could not load class '"+className+"' after 
embedding libraries. Exception: " + e2.getClass().getName() + " " + 
e2.getMessage());
+            throw new Exception("Could not load class '" + className + "' 
after embedding libraries. Exception: " + e2.getClass().getName() + " " + 
e2.getMessage());
         }
     }
 


Reply via email to