Author: rmannibucau
Date: Sun Jul 1 22:39:33 2012
New Revision: 1356039
URL: http://svn.apache.org/viewvc?rev=1356039&view=rev
Log:
TOMEE-264 adding hooks to filter spec jar from webapp. This commit filter JTA
and JPA.
Modified:
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopWebappClassLoader.java
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEClassLoaderHelper.java
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappLoader.java
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
Modified:
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopWebappClassLoader.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopWebappClassLoader.java?rev=1356039&r1=1356038&r2=1356039&view=diff
==============================================================================
---
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopWebappClassLoader.java
(original)
+++
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopWebappClassLoader.java
Sun Jul 1 22:39:33 2012
@@ -20,6 +20,8 @@ import org.apache.catalina.LifecycleExce
import org.apache.catalina.loader.WebappClassLoader;
import org.apache.openejb.loader.SystemInstance;
+import java.io.File;
+import java.io.IOException;
import java.net.URL;
public class LazyStopWebappClassLoader extends WebappClassLoader {
@@ -74,4 +76,12 @@ public class LazyStopWebappClassLoader e
}
super.start();
}
+
+ @Override
+ protected boolean validateJarFile(File file) throws IOException {
+ if (!super.validateJarFile(file)) {
+ return false;
+ }
+ return TomEEClassLoaderHelper.validateJarFile(file);
+ }
}
Modified:
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEClassLoaderHelper.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEClassLoaderHelper.java?rev=1356039&r1=1356038&r2=1356039&view=diff
==============================================================================
---
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEClassLoaderHelper.java
(original)
+++
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEClassLoaderHelper.java
Sun Jul 1 22:39:33 2012
@@ -19,22 +19,37 @@ package org.apache.tomee.catalina;
import org.apache.openejb.OpenEJB;
import org.apache.openejb.loader.JarLocation;
import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.util.LogCategory;
+import org.apache.openejb.util.Logger;
import org.apache.tomee.installer.Paths;
import java.io.File;
+import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
public final class TomEEClassLoaderHelper {
+ private static final Logger LOGGER =
Logger.getInstance(LogCategory.OPENEJB, TomEEClassLoaderHelper.class);
+
+ private TomEEClassLoaderHelper() {
+ // no-op
+ }
+
+ /**
+ * Enrichement part
+ */
+
public static final String TOMEE_WEBAPP_CLASSLOADER_ENRICHMENT_SKIP =
"tomee.webapp.classloader.enrichment.skip";
public static final String TOMEE_WEBAPP_CLASSLOADER_ENRICHMENT_CLASSES =
"tomee.webapp.classloader.enrichment.classes";
public static final String TOMEE_WEBAPP_CLASSLOADER_ENRICHMENT_PREFIXES =
"tomee.webapp.classloader.enrichment.prefixes";
- private static final String[] DEFAULT_JAR_TO_ADD_CLASS_HELPERS = new
String[] {
+ private static final String[] DEFAULT_JAR_TO_ADD_CLASS_HELPERS = new
String[]{
// openejb-jsf and openwebbeans-jsf to be able to embedded the jsf
impl keeping CDI features
"org.apache.openejb.jsf.CustomApplicationFactory",
"org.apache.webbeans.jsf.OwbApplicationFactory",
@@ -44,7 +59,7 @@ public final class TomEEClassLoaderHelpe
};
private static final String[] JAR_TO_ADD_CLASS_HELPERS;
- private static final String[] DEFAULT_PREFIXES_TO_ADD = new String[] {
+ private static final String[] DEFAULT_PREFIXES_TO_ADD = new String[]{
"tomee-mojarra"
};
private static final String[] PREFIXES_TO_ADD;
@@ -73,10 +88,6 @@ public final class TomEEClassLoaderHelpe
PREFIXES_TO_ADD = prefixes.toArray(new String[prefixes.size()]);
}
- private TomEEClassLoaderHelper() {
- // no-op
- }
-
public static URL[] tomEEWebappIntegrationLibraries() {
final Collection<URL> urls = new ArrayList<URL>();
@@ -115,4 +126,46 @@ public final class TomEEClassLoaderHelpe
return urls.toArray(new URL[urls.size()]);
}
+
+ /**
+ * Validation part
+ */
+ private static final String[] FORBIDDEN_CLASSES = new String[]{
+ "javax.persistence.Entity", // JPA
+ "javax.transaction.Transaction" // JTA
+ };
+
+ public static boolean validateJarFile(final File file) throws IOException {
+ final ClassLoader parent =
TomEEClassLoaderHelper.class.getClassLoader();
+
+ JarFile jarFile = null;
+
+ try {
+ jarFile = new JarFile(file);
+ for (String name : FORBIDDEN_CLASSES) {
+ try { // if we can't load if from our classloader we'll not
impose anything on this class
+ parent.loadClass(name);
+ } catch (Exception e) {
+ continue;
+ }
+
+ final String entry = name.replace('.', '/') + ".class";
+ final JarEntry jarEntry = jarFile.getJarEntry(entry);
+ if (jarEntry != null) {
+ LOGGER.warning("jar '" + file.getAbsolutePath() + "'
contains offending class: " + name
+ + ". It will be ignored.");
+ return false;
+ }
+ }
+ return true;
+ } finally {
+ if (jarFile != null) {
+ try {
+ jarFile.close();
+ } catch (IOException ioe) {
+ // Ignored
+ }
+ }
+ }
+ }
}
Modified:
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappLoader.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappLoader.java?rev=1356039&r1=1356038&r2=1356039&view=diff
==============================================================================
---
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappLoader.java
(original)
+++
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappLoader.java
Sun Jul 1 22:39:33 2012
@@ -30,8 +30,6 @@ import org.apache.catalina.loader.Webapp
import org.apache.catalina.mbeans.MBeanUtils;
import org.apache.naming.resources.DirContextURLStreamHandler;
import org.apache.openejb.ClassLoaderUtil;
-import org.apache.openejb.loader.event.ComponentAdded;
-import org.apache.openejb.loader.event.ComponentRemoved;
import org.apache.openejb.util.ArrayEnumeration;
import org.apache.openejb.util.URLs;
import org.apache.tomcat.util.ExceptionUtils;
@@ -123,7 +121,6 @@ public class TomEEWebappLoader extends W
private ClassLoader app;
private WebappClassLoader webapp;
private String appPath;
- private final HashMap<Class, Object> components = new HashMap<Class,
Object>();
public TomEEClassLoader(final String appId, final ClassLoader appCl,
final WebappClassLoader webappCl) {
super(enrichedUrls(webappCl.getURLs()), webappCl); // in fact this
classloader = webappclassloader since we add nothing to this
@@ -133,10 +130,34 @@ public class TomEEWebappLoader extends W
}
private static URL[] enrichedUrls(final URL[] urLs) {
+ final List<Integer> skipped = new ArrayList<Integer>();
+
+ // while we are here validate the urls regading tomee rules
+ for (int i = 0; i < urLs.length; i++) {
+ final File file;
+ try {
+ file = URLs.toFile(urLs[i]);
+ } catch (IllegalStateException ise) {
+ continue;
+ }
+
+ try {
+ if (!TomEEClassLoaderHelper.validateJarFile(file)) {
+ skipped.add(i);
+ }
+ } catch (IOException e) {
+ // ignored
+ }
+ }
+
final URL[] additional =
TomEEClassLoaderHelper.tomEEWebappIntegrationLibraries();
- final URL[] urls = new URL[urLs.length + additional.length];
+ final URL[] urls = new URL[urLs.length + additional.length -
skipped.size()];
for (int i = 0; i < urLs.length; i++) {
- urls[i] = urLs[i];
+ if (!skipped.contains(i)) {
+ urls[i] = urLs[i];
+ } else {
+ i--;
+ }
}
for (int i = 0; i < additional.length; i++) {
urls[urLs.length + i] = additional[i];
@@ -144,21 +165,6 @@ public class TomEEWebappLoader extends W
return urls;
}
- public <T> T getComponent(final Class<T> type) {
- return (T) components.get(type);
- }
-
- public <T> T removeComponent(final Class<T> type) {
- return (T) components.remove(type);
- }
-
- /**
- * @param type the class type of the component required
- */
- public <T> T setComponent(final Class<T> type, final T value) {
- return (T) components.put(type, value);
- }
-
/**
* we totally override this method to be able to remove duplicated
resources.
*
Modified:
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java?rev=1356039&r1=1356038&r2=1356039&view=diff
==============================================================================
---
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
(original)
+++
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
Sun Jul 1 22:39:33 2012
@@ -511,6 +511,9 @@ public class TomcatWebAppBuilder impleme
*/
@Override
public void init(final StandardContext standardContext) {
+ // just adding a carriage return to get logs more readable
+ logger.info("-------------------------\nTomcatWebAppBuilder.init " +
standardContext.getPath());
+
standardContext.setCrossContext(SystemInstance.get().getOptions().get(OPENEJB_CROSSCONTEXT_PROPERTY,
false));
standardContext.setNamingResources(new OpenEJBNamingResource());
@@ -650,8 +653,6 @@ public class TomcatWebAppBuilder impleme
*/
// @Override
private void startInternal(final StandardContext standardContext) {
- // just adding a carriage return to get logs more readable
- logger.info("-------------------------\nTomcatWebAppBuilder.start " +
standardContext.getPath());
if (isIgnored(standardContext)) return;
final CoreContainerSystem cs = getContainerSystem();