TOMEE-1666 clean up of PersistenceBootstrap setup
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/360ceefe Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/360ceefe Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/360ceefe Branch: refs/heads/tomee-7.0.0-M1 Commit: 360ceefe96090bb2b2c118735a9b211df7219aab Parents: ede8b74 Author: Romain Manni-Bucau <[email protected]> Authored: Wed Nov 25 00:15:31 2015 +0100 Committer: Romain Manni-Bucau <[email protected]> Committed: Wed Nov 25 00:15:31 2015 +0100 ---------------------------------------------------------------------- .../persistence/PersistenceBootstrap.java | 63 ++++++++++++-------- .../org/apache/openejb/javaagent/Agent.java | 32 ++++++---- 2 files changed, 58 insertions(+), 37 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tomee/blob/360ceefe/container/openejb-core/src/main/java/org/apache/openejb/persistence/PersistenceBootstrap.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/main/java/org/apache/openejb/persistence/PersistenceBootstrap.java b/container/openejb-core/src/main/java/org/apache/openejb/persistence/PersistenceBootstrap.java index 697396e..f2de2a0 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/persistence/PersistenceBootstrap.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/persistence/PersistenceBootstrap.java @@ -17,17 +17,24 @@ package org.apache.openejb.persistence; +import org.apache.openejb.config.NewLoaderLogic; import org.apache.openejb.core.TempClassLoader; import org.apache.openejb.javaagent.Agent; import org.apache.openejb.loader.IO; import org.apache.openejb.loader.SystemInstance; import org.apache.openejb.util.Saxs; import org.apache.xbean.finder.ClassLoaders; +import org.apache.xbean.finder.UrlSet; import org.xml.sax.Attributes; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; +import javax.persistence.EntityManagerFactory; +import javax.persistence.spi.PersistenceProvider; +import javax.sql.DataSource; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -54,11 +61,6 @@ import java.util.Properties; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; -import javax.persistence.EntityManagerFactory; -import javax.persistence.spi.PersistenceProvider; -import javax.sql.DataSource; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.parsers.SAXParser; import static org.apache.openejb.loader.JarLocation.decode; @@ -130,27 +132,29 @@ public class PersistenceBootstrap { final List<URL> urls = new LinkedList<URL>(); for (final String pXmlName : pXmlNames) { // find persistence.xml in the classloader and in WEB-INF urls.addAll(Collections.list(classLoader.getResources("META-INF/" + pXmlName))); - try { - final Collection<URL> loaderUrls = ClassLoaders.findUrls(classLoader); - for (final URL url : loaderUrls) { - 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()) { - urls.add(pXml.toURI().toURL()); + if ("true".equals(args.getProperty("web-scan", "false"))) { // findUrls is slow for small tests and rarely needed + try { + final Collection<URL> loaderUrls = findUrls(classLoader, args); + for (final URL url : loaderUrls) { + 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()) { + urls.add(pXml.toURI().toURL()); + } + break; } - break; - } - if (file.getName().endsWith(".jar") && file.getParentFile().getName().equals("lib") && "WEB-INF".equals(file.getParentFile().getParentFile().getName())) { - final File pXml = new File(file.getParentFile().getParentFile(), pXmlName); - if (pXml.exists()) { - urls.add(pXml.toURI().toURL()); + if (file.getName().endsWith(".jar") && file.getParentFile().getName().equals("lib") && "WEB-INF".equals(file.getParentFile().getParentFile().getName())) { + final File pXml = new File(file.getParentFile().getParentFile(), pXmlName); + if (pXml.exists()) { + urls.add(pXml.toURI().toURL()); + } + break; } - break; } + } catch (final Throwable th) { + // no-op } - } catch (final Throwable th) { - // no-op } } @@ -234,6 +238,17 @@ public class PersistenceBootstrap { } } + private static Set<URL> findUrls(final ClassLoader classLoader, final Properties args) throws IOException { + if ("true".equals(args.getProperty("fast-scan", "true"))) { + try { + return new HashSet<>(NewLoaderLogic.applyBuiltinExcludes(new UrlSet(ClassLoaders.findUrls(classLoader)).excludeJvm()).getUrls()); + } catch (final Throwable fallback) { + // let it fallback + } + } + return ClassLoaders.findUrls(classLoader); + } + // don't force eager init private static String getAltDD() { final String property = "openejb.altdd.prefix"; @@ -290,11 +305,11 @@ public class PersistenceBootstrap { final SAXParser parser = Saxs.namespaceAwareFactory().newSAXParser(); parser.parse(inputSource, new DefaultHandler() { - private StringBuilder characters = new StringBuilder(); + private final StringBuilder characters = new StringBuilder(100); private Unit unit; public void startElement(final String uri, final String localName, final String qName, final Attributes attributes) { - characters = new StringBuilder(100); + characters.setLength(0); if (localName.equals("persistence-unit")) { startPersistenceUnit(uri, localName, qName, attributes); http://git-wip-us.apache.org/repos/asf/tomee/blob/360ceefe/container/openejb-javaagent/src/main/java/org/apache/openejb/javaagent/Agent.java ---------------------------------------------------------------------- diff --git a/container/openejb-javaagent/src/main/java/org/apache/openejb/javaagent/Agent.java b/container/openejb-javaagent/src/main/java/org/apache/openejb/javaagent/Agent.java index b249848..43be7b3 100644 --- a/container/openejb-javaagent/src/main/java/org/apache/openejb/javaagent/Agent.java +++ b/container/openejb-javaagent/src/main/java/org/apache/openejb/javaagent/Agent.java @@ -17,7 +17,13 @@ package org.apache.openejb.javaagent; -import java.io.*; +import java.io.Closeable; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; import java.lang.instrument.ClassFileTransformer; import java.lang.instrument.IllegalClassFormatException; import java.lang.instrument.Instrumentation; @@ -252,23 +258,26 @@ public class Agent { } private static class BootstrapTransformer implements ClassFileTransformer { - - private boolean done; - @Override public byte[] transform(final ClassLoader loader, final String className, final Class<?> classBeingRedefined, final ProtectionDomain protectionDomain, final byte[] classfileBuffer) throws IllegalClassFormatException { - try { bootstrap(loader); } catch (final Throwable e) { - done = true; + removeThis(); } - return classfileBuffer; } + private void removeThis() { + try { + instrumentation.removeTransformer(this); + } catch (final Throwable th) { + // no-op + } + } + private void bootstrap(final ClassLoader loader) { - if (loader == null || done) { + if (loader == null) { return; } @@ -279,16 +288,13 @@ public class Agent { return; } - // We found the classloader that has the openejb-core jar - // we need to mark ourselves as "done" so that when we attempt to load - // the PersistenceBootstrap class it doesn't cause an infinite loop - done = true; - try { final Class<?> bootstrapClass = loader.loadClass(bootstrapClassName); final Method bootstrap = bootstrapClass.getMethod("bootstrap", ClassLoader.class); bootstrap.invoke(null, loader); + removeThis(); } catch (final Throwable e) { + removeThis(); Logger.getLogger(Agent.class.getName()).log(Level.WARNING, "Failed to invoke bootstrap: " + e.getMessage()); } }
