You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2012/02/20 19:42:15 UTC
svn commit: r1291408 - in
/openejb/trunk/openejb/tomee/tomee-loader/src/main/java/org/apache/tomee/loader:
OpenEJBListener.java TomcatHelper.java
Author: rmannibucau
Date: Mon Feb 20 18:42:15 2012
New Revision: 1291408
URL: http://svn.apache.org/viewvc?rev=1291408&view=rev
Log:
TOMEE-141 trying to find war archive if we don't find the exploded war
Modified:
openejb/trunk/openejb/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/OpenEJBListener.java
openejb/trunk/openejb/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/TomcatHelper.java
Modified: openejb/trunk/openejb/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/OpenEJBListener.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/OpenEJBListener.java?rev=1291408&r1=1291407&r2=1291408&view=diff
==============================================================================
--- openejb/trunk/openejb/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/OpenEJBListener.java (original)
+++ openejb/trunk/openejb/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/OpenEJBListener.java Mon Feb 20 18:42:15 2012
@@ -17,9 +17,6 @@
*/
package org.apache.tomee.loader;
-import java.io.File;
-import java.util.Properties;
-
import org.apache.catalina.Container;
import org.apache.catalina.LifecycleEvent;
import org.apache.catalina.LifecycleListener;
@@ -29,6 +26,18 @@ import org.apache.catalina.core.Standard
import org.apache.catalina.core.StandardHost;
import org.apache.catalina.core.StandardServer;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Enumeration;
+import java.util.Properties;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
/**
* The sole purpose of this class is to call the {@link TomcatEmbedder#embed} method
*
@@ -43,7 +52,10 @@ import org.apache.catalina.core.Standard
* OpenEJB is guaranteed to start before all webapps.
*/
public class OpenEJBListener implements LifecycleListener {
+ private static final Logger LOGGER = Logger.getLogger(OpenEJBListener.class.getName());
+
static private boolean listenerInstalled;
+ static private boolean logWebappNotFound = true;
public static boolean isListenerInstalled() {
return listenerInstalled;
@@ -54,20 +66,81 @@ public class OpenEJBListener implements
if (listenerInstalled) return;
try {
- Properties properties = new Properties();
File webappDir = findOpenEjbWar();
+ if (webappDir == null && event.getSource() instanceof StandardServer) {
+ final StandardServer server = (StandardServer) event.getSource();
+ webappDir = tryToFindAndExtractWar(server);
+ final File exploded = extractDirectory(webappDir);
+ if (webappDir != null) {
+ extract(webappDir, exploded);
+ }
+ webappDir = exploded;
+ TomcatHelper.setServer(server);
+ }
if (webappDir != null) {
+ final Properties properties = new Properties();
properties.setProperty("tomee.war", webappDir.getAbsolutePath());
properties.setProperty("openejb.embedder.source", getClass().getSimpleName());
TomcatEmbedder.embed(properties, StandardServer.class.getClassLoader());
listenerInstalled = true;
- } // webapp can be found lazily in some conditions
+ } else if (logWebappNotFound) {
+ LOGGER.info("tomee webapp not found from the listener, will try from the webapp if exists");
+ logWebappNotFound = false;
+ }
} catch (Exception e) {
- System.out.println("ERROR: OpenEJB webapp was not found");
+ LOGGER.log(Level.SEVERE, "TomEE Listener can't start OpenEJB", e);
// e.printStackTrace(System.err);
}
}
+ private File extractDirectory(final File webappDir) {
+ File exploded = new File(webappDir.getAbsolutePath().replace(".war", ""));
+ int i = 0;
+ while (exploded.exists()) {
+ exploded = new File(exploded.getAbsolutePath() + "_" + i++);
+ }
+ return exploded;
+ }
+
+ private static File tryToFindAndExtractWar(final StandardServer source) {
+ if (System.getProperties().containsKey("openejb.war")) {
+ return new File(System.getProperty("openejb.war"));
+ }
+
+ for (Service service : source.findServices()) {
+ final Container container = service.getContainer();
+ if (container instanceof StandardEngine) {
+ final StandardEngine engine = (StandardEngine) container;
+ for (Container child : engine.findChildren()) {
+ if (child instanceof StandardHost) {
+ final StandardHost host = (StandardHost) child;
+ final File base = hostDir(System.getProperty("catalina.base"), host.getAppBase());
+
+ for (File file : base.listFiles()) {
+ if (isTomEEWar(file)) {
+ return file;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return null;
+ }
+
+ private static boolean isTomEEWar(final File file) {
+ final String name = file.getName();
+ try {
+ final JarFile jarFile = new JarFile(file);
+ return jarFile.getEntry("lib") != null
+ && (name.startsWith("tomee") || name.startsWith("openejb")
+ && name.endsWith(".war"));
+ } catch (IOException e) {
+ return false;
+ }
+ }
+
private static File findOpenEjbWar() {
// in Tomcat 5.5 the OpenEjb war is in the server/webapps director
String catalinaBase = System.getProperty("catalina.base");
@@ -87,13 +160,7 @@ public class OpenEJBListener implements
for (Container child : engine.findChildren()) {
if (child instanceof StandardHost) {
StandardHost host = (StandardHost) child;
- String appBase = host.getAppBase();
-
- // determine the host dir (normally webapps)
- File hostDir = new File(appBase);
- if (!hostDir.isAbsolute()) {
- hostDir = new File(catalinaBase, appBase);
- }
+ final File hostDir = hostDir(catalinaBase, host.getAppBase());
openEjbWar = findOpenEjbWar(hostDir);
if (openEjbWar != null) {
@@ -110,7 +177,15 @@ public class OpenEJBListener implements
return null;
}
-
+
+ private static File hostDir(final String catalinaBase, final String appBase) {
+ File hostDir = new File(appBase);
+ if (!hostDir.isAbsolute()) {
+ hostDir = new File(catalinaBase, appBase);
+ }
+ return hostDir;
+ }
+
private static File findOpenEjbWar(StandardHost standardHost) {
//look for openejb war in a Tomcat context
for(Container container : standardHost.findChildren()) {
@@ -164,4 +239,81 @@ public class OpenEJBListener implements
}
return null;
}
+
+ // copied for classloading reason
+ public static void extract(final File src, final File dest) throws IOException {
+ if (dest.exists()) {
+ return;
+ }
+
+ LOGGER.info("Extracting openejb webapp from " + src.getAbsolutePath() + " to " + dest.getAbsolutePath());
+
+ dest.mkdirs();
+
+ JarFile jarFile = null;
+ InputStream input = null;
+ try {
+ jarFile = new JarFile(src);
+ Enumeration jarEntries = jarFile.entries();
+ while (jarEntries.hasMoreElements()) {
+ JarEntry jarEntry = (JarEntry) jarEntries.nextElement();
+ String name = jarEntry.getName();
+ int last = name.lastIndexOf('/');
+ if (last >= 0) {
+ File parent = new File(dest, name.substring(0, last));
+ parent.mkdirs();
+ }
+ if (name.endsWith("/")) {
+ continue;
+ }
+ input = jarFile.getInputStream(jarEntry);
+
+ final File file = new File(dest, name);
+ BufferedOutputStream output = null;
+ try {
+ output = new BufferedOutputStream(new FileOutputStream(file));
+ byte buffer[] = new byte[2048];
+ while (true) {
+ int n = input.read(buffer);
+ if (n <= 0)
+ break;
+ output.write(buffer, 0, n);
+ }
+ } finally {
+ if (output != null) {
+ try {
+ output.close();
+ } catch (IOException e) {
+ // Ignore
+ }
+ }
+ }
+
+ long lastModified = jarEntry.getTime();
+ if (lastModified != -1 && lastModified != 0 && file != null) {
+ file.setLastModified(lastModified);
+ }
+
+ input.close();
+ input = null;
+ }
+ } finally {
+ if (input != null) {
+ try {
+ input.close();
+ } catch (Throwable t) {
+ // no-op
+ }
+ }
+ if (jarFile != null) {
+ try {
+ jarFile.close();
+ } catch (Throwable t) {
+ // no-op
+ }
+ }
+ }
+
+ LOGGER.info("Extracted openejb webapp");
+ }
}
Modified: openejb/trunk/openejb/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/TomcatHelper.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/TomcatHelper.java?rev=1291408&r1=1291407&r2=1291408&view=diff
==============================================================================
--- openejb/trunk/openejb/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/TomcatHelper.java (original)
+++ openejb/trunk/openejb/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/TomcatHelper.java Mon Feb 20 18:42:15 2012
@@ -30,20 +30,23 @@ import java.lang.reflect.Method;
import java.security.Principal;
public class TomcatHelper {
-
+ private static StandardServer server = null;
private static boolean stopping = false;
public static boolean isStopping() {
return stopping;
}
- public static void setStopping(boolean stopping) {
+ public static void setServer(StandardServer server) {
+ TomcatHelper.server = server;
+ }
+
+ public static void setStopping(boolean stopping) {
TomcatHelper.stopping = stopping;
}
public static StandardServer getServer() {
- StandardServer server = null;
-
+ StandardServer server = null;
Class<?> systemInstanceClass = null;
try {
// server = SystemInstance.get().getComponent(StandardServer.class)
@@ -54,6 +57,7 @@ public class TomcatHelper {
// ignored
}
if (server != null) {
+ TomcatHelper.server = server;
return server;
}
@@ -67,6 +71,7 @@ public class TomcatHelper {
// ignored
}
if (server != null) {
+ TomcatHelper.server = server;
return server;
}
@@ -78,9 +83,13 @@ public class TomcatHelper {
// ignored
}
- // if this still fails, that's too bad.
+ if (server != null) {
+ TomcatHelper.server = server;
+ return server;
+ }
- return server;
+ // if this still fails, that's too bad.
+ return TomcatHelper.server;
}
public static int getContextState(StandardContext standardContext) {