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());
}
}