You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by db...@apache.org on 2012/04/26 05:51:22 UTC

svn commit: r1330642 - in /openejb/branches/openejb-4.0.0: arquillian-tomee/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/ arquillian-tomee/arquillian-tomee-embedded/ arquillian-tomee/arquillian-tomee-webapp-remote/src/test...

Author: dblevins
Date: Thu Apr 26 03:51:21 2012
New Revision: 1330642

URL: http://svn.apache.org/viewvc?rev=1330642&view=rev
Log:
TOMEE-127: Remote Arquillian Adapter for TomEE (related fixes for windows)
TOMEE-164: Optimization on reading built-in tld files
TOMEE-166: Web.xml metadata-complete effectively ignored
TOMEE-168: Load OpenEJB System applications directly, without scanning
TOMEE-169: Optimization scanning for tld files
OPENEJB-1828: Disable hsql ServerService by default
OPENEJB-1829: Plain Java to parse openejb.xml and tomee.xml files
OPENEJB-1830: Omitting <ejb-name> from xml may result in failed deployment

Added:
    openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/SystemApps.java
      - copied, changed from r1330257, openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/SystemApps.java
    openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/TldScanner.java
      - copied unchanged from r1330257, openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/TldScanner.java
    openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/sys/SaxOpenejb.java
      - copied, changed from r1330253, openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/sys/SaxOpenejb.java
    openejb/branches/openejb-4.0.0/container/openejb-core/src/test/java/org/apache/openejb/config/sys/
      - copied from r1330253, openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/config/sys/
    openejb/branches/openejb-4.0.0/container/openejb-core/src/test/java/org/apache/openejb/config/sys/OpenejbTest.java
      - copied unchanged from r1330253, openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/config/sys/OpenejbTest.java
    openejb/branches/openejb-4.0.0/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/Warmup.java
      - copied unchanged from r1330257, openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/Warmup.java
Removed:
    openejb/branches/openejb-4.0.0/container/openejb-core/src/main/resources/META-INF/application-client.xml
Modified:
    openejb/branches/openejb-4.0.0/arquillian-tomee/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java
    openejb/branches/openejb-4.0.0/arquillian-tomee/arquillian-tomee-embedded/pom.xml
    openejb/branches/openejb-4.0.0/arquillian-tomee/arquillian-tomee-webapp-remote/src/test/java/org/apache/openejb/arquillian/TomEEContainerTest.java
    openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
    openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java
    openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
    openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/ReadDescriptors.java
    openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/sys/AbstractService.java
    openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/sys/JaxbOpenejb.java
    openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/util/StringTemplate.java
    openejb/branches/openejb-4.0.0/container/openejb-jee/src/main/java/org/apache/openejb/jee/EjbJar.java
    openejb/branches/openejb-4.0.0/server/openejb-hsql/src/main/resources/META-INF/org.apache.openejb.server.ServerService/hsql
    openejb/branches/openejb-4.0.0/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatLoader.java
    openejb/branches/openejb-4.0.0/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java
    openejb/branches/openejb-4.0.0/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/TomEEJarScanner.java

Modified: openejb/branches/openejb-4.0.0/arquillian-tomee/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.0.0/arquillian-tomee/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java?rev=1330642&r1=1330641&r2=1330642&view=diff
==============================================================================
--- openejb/branches/openejb-4.0.0/arquillian-tomee/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java (original)
+++ openejb/branches/openejb-4.0.0/arquillian-tomee/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java Thu Apr 26 03:51:21 2012
@@ -16,9 +16,11 @@
  */
 package org.apache.openejb.arquillian.common;
 
+import org.apache.openejb.OpenEJBException;
 import org.apache.openejb.assembler.Deployer;
 import org.apache.openejb.assembler.classic.AppInfo;
 import org.apache.openejb.assembler.classic.Info;
+import org.apache.openejb.loader.IO;
 import org.apache.openejb.loader.Options;
 import org.apache.openejb.util.NetworkUtil;
 import org.jboss.arquillian.container.spi.client.container.DeployableContainer;
@@ -37,8 +39,10 @@ import javax.naming.Context;
 import javax.naming.InitialContext;
 import javax.naming.NamingException;
 import java.io.File;
+import java.io.IOException;
 import java.io.OutputStream;
 import java.net.Socket;
+import java.net.URL;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Properties;
@@ -157,11 +161,17 @@ public abstract class TomEEContainer<Con
     public ProtocolMetaData deploy(Archive<?> archive) throws DeploymentException {
         try {
             String tmpDir = configuration.getAppWorkingDir();
-            File file;
+            File file, folderFile;
             int i = 0;
             do { // be sure we don't override something existing
                 file = new File(tmpDir + File.separator + i++ + File.separator + archive.getName());
-            } while (file.exists());
+                if (file.isDirectory() || !file.getName().endsWith("ar")) {
+                	folderFile = file;
+                } else {
+                	final String name = file.getName();
+                	folderFile = new File(file.getParentFile(), name.substring(0, name.length() - 4));
+                }
+            } while (file.exists() || folderFile.exists()); // we unpack the war/ear and the delete of "i" can fail (on win in particular)
             if (!file.getParentFile().exists() && !file.getParentFile().mkdirs()) {
                 LOGGER.warning("can't create " + file.getParent());
             }

Modified: openejb/branches/openejb-4.0.0/arquillian-tomee/arquillian-tomee-embedded/pom.xml
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.0.0/arquillian-tomee/arquillian-tomee-embedded/pom.xml?rev=1330642&r1=1330641&r2=1330642&view=diff
==============================================================================
--- openejb/branches/openejb-4.0.0/arquillian-tomee/arquillian-tomee-embedded/pom.xml (original)
+++ openejb/branches/openejb-4.0.0/arquillian-tomee/arquillian-tomee-embedded/pom.xml Thu Apr 26 03:51:21 2012
@@ -58,6 +58,12 @@
     </dependency>
 
     <dependency>
+      <groupId>org.apache.myfaces.core</groupId>
+      <artifactId>myfaces-api</artifactId>
+      <version>${myfaces.version}</version>
+    </dependency>
+
+    <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
       <scope>test</scope>

Modified: openejb/branches/openejb-4.0.0/arquillian-tomee/arquillian-tomee-webapp-remote/src/test/java/org/apache/openejb/arquillian/TomEEContainerTest.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.0.0/arquillian-tomee/arquillian-tomee-webapp-remote/src/test/java/org/apache/openejb/arquillian/TomEEContainerTest.java?rev=1330642&r1=1330641&r2=1330642&view=diff
==============================================================================
--- openejb/branches/openejb-4.0.0/arquillian-tomee/arquillian-tomee-webapp-remote/src/test/java/org/apache/openejb/arquillian/TomEEContainerTest.java (original)
+++ openejb/branches/openejb-4.0.0/arquillian-tomee/arquillian-tomee-webapp-remote/src/test/java/org/apache/openejb/arquillian/TomEEContainerTest.java Thu Apr 26 03:51:21 2012
@@ -26,6 +26,7 @@ import junit.framework.Assert;
 
 import org.jboss.arquillian.container.test.api.Deployment;
 import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.arquillian.test.api.ArquillianResource;
 import org.jboss.shrinkwrap.api.ShrinkWrap;
 import org.jboss.shrinkwrap.api.asset.StringAsset;
 import org.jboss.shrinkwrap.api.spec.WebArchive;
@@ -34,13 +35,17 @@ import org.jboss.shrinkwrap.descriptor.a
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+// todo: add arquillian enricher to use @ArquillianResource URl url;
 @RunWith(Arquillian.class)
 public class TomEEContainerTest {
 
     @Deployment
     public static WebArchive createDeployment() {
-        return ShrinkWrap.create(WebArchive.class, "test.war").addClass(TestServlet.class).addClass(TestEjb.class).addClass(TomEEContainerTest.class)
-                .setWebXML(new StringAsset(Descriptors.create(WebAppDescriptor.class).version("3.0").servlet(TestServlet.class, "/ejb").exportAsString()));
+        return ShrinkWrap.create(WebArchive.class, "test.war")
+        		.addClass(TestServlet.class).addClass(TestEjb.class).addClass(TomEEContainerTest.class)
+                .setWebXML(new StringAsset(
+                		Descriptors.create(WebAppDescriptor.class)
+                			.version("3.0").servlet(TestServlet.class, "/ejb").exportAsString()));
     }
 
     @EJB
@@ -53,7 +58,7 @@ public class TomEEContainerTest {
 
     @Test
     public void testShouldBeAbleToAccessServletAndEjb() throws Exception {
-        InputStream is = new URL("http://127.0.0.1:" + System.getProperty("tomee.httpPort", "10080") + "/test/ejb").openStream();
+        InputStream is = new URL("http://localhost:" + System.getProperty("tomee.httpPort", "10080") + "/test/ejb").openStream();
         ByteArrayOutputStream os = new ByteArrayOutputStream();
 
         int bytesRead = -1;

Modified: openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java?rev=1330642&r1=1330641&r2=1330642&view=diff
==============================================================================
--- openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java (original)
+++ openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java Thu Apr 26 03:51:21 2012
@@ -1185,6 +1185,36 @@ public class AnnotationDeployer implemen
 
             final Set<Class<?>> specializingClasses = new HashSet<Class<?>>();
 
+
+            // Fill in default sessionType for xml declared EJBs
+            for (EnterpriseBean bean : ejbModule.getEjbJar().getEnterpriseBeans()) {
+                if (!(bean instanceof SessionBean)) continue;
+
+                SessionBean sessionBean = (SessionBean) bean;
+
+                if (sessionBean.getSessionType() != null) continue;
+
+                try {
+                    final Class<?> clazz = ejbModule.getClassLoader().loadClass(bean.getEjbClass());
+                    sessionBean.setSessionType(getSessionType(clazz));
+                } catch (Throwable handledInValidation) {
+                }
+            }
+
+            // Fill in default ejbName for xml declared EJBs
+            for (EnterpriseBean bean : ejbModule.getEjbJar().getEnterpriseBeans()) {
+                if (bean.getEjbClass() == null) continue;
+                if (bean.getEjbName() == null || bean.getEjbName().startsWith("@NULL@")) {
+                    ejbModule.getEjbJar().removeEnterpriseBean(bean.getEjbName());
+                    try {
+                        final Class<?> clazz = ejbModule.getClassLoader().loadClass(bean.getEjbClass());
+                        final String ejbName = getEjbName(bean, clazz);
+                        bean.setEjbName(ejbName);
+                    } catch (Throwable handledInValidation) {
+                    }
+                    ejbModule.getEjbJar().addEnterpriseBean(bean);
+                }
+            }
             /* 19.2:  ejb-name: Default is the unqualified name of the bean class */
 
             EjbJar ejbJar = ejbModule.getEjbJar();
@@ -1397,6 +1427,54 @@ public class AnnotationDeployer implemen
             return ejbModule;
         }
 
+        private SessionType getSessionType(Class<?> clazz) {
+            if (clazz.isAnnotationPresent(Stateful.class)) return SessionType.STATEFUL;
+            if (clazz.isAnnotationPresent(Stateless.class)) return SessionType.STATELESS;
+            if (clazz.isAnnotationPresent(Singleton.class)) return SessionType.SINGLETON;
+            if (clazz.isAnnotationPresent(ManagedBean.class)) return SessionType.MANAGED;
+            return null;
+        }
+
+        private String getEjbName(EnterpriseBean bean, Class<?> clazz) {
+
+            if (bean instanceof SessionBean) {
+                SessionBean sessionBean = (SessionBean) bean;
+                switch (sessionBean.getSessionType()) {
+                    case STATEFUL: {
+                        final Stateful annotation = clazz.getAnnotation(Stateful.class);
+                        if (annotation != null && specified(annotation.name())) {
+                            return annotation.name();
+                        }
+                    }
+                    case STATELESS: {
+                        final Stateless annotation = clazz.getAnnotation(Stateless.class);
+                        if (annotation != null && specified(annotation.name())) {
+                            return annotation.name();
+                        }
+                    }
+                    case SINGLETON: {
+                        final Singleton annotation = clazz.getAnnotation(Singleton.class);
+                        if (annotation != null && specified(annotation.name())) {
+                            return annotation.name();
+                        }
+                    }
+                }
+            }
+
+            if (bean instanceof MessageDrivenBean) {
+                final MessageDriven annotation = clazz.getAnnotation(MessageDriven.class);
+                if (annotation != null && specified(annotation.name())) {
+                    return annotation.name();
+                }
+            }
+
+            return clazz.getSimpleName();
+        }
+
+        private static boolean specified(final String name) {
+            return name != null && name.length() != 0;
+        }
+
         private List<String> getBeanClasses(IAnnotationFinder finder) {
 
             //  What we're hoping in this method is to get lucky and find

Modified: openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java?rev=1330642&r1=1330641&r2=1330642&view=diff
==============================================================================
--- openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java (original)
+++ openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java Thu Apr 26 03:51:21 2012
@@ -447,13 +447,23 @@ public class ConfigurationFactory implem
         }
 
         final boolean embedded = SystemInstance.get().hasProperty(EJBContainer.class.getName());
-        if (SystemInstance.get().getOptions().get(DEPLOYMENTS_CLASSPATH_PROPERTY, !embedded)) {
+        final Options options = SystemInstance.get().getOptions();
+
+        if (options.get("openejb.system.apps", false)) {
+            try {
+                final AppInfo appInfo = configureApplication(new AppModule(SystemApps.getSystemModule()));
+                sys.containerSystem.applications.add(appInfo);
+            } catch (OpenEJBException e) {
+                logger.error("Unable to load the system applications.", e);
+            }
+        } else if (options.get(DEPLOYMENTS_CLASSPATH_PROPERTY, !embedded)) {
+
             final ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
 
             final ArrayList<File> jarFiles = getModulesFromClassPath(declaredApps, classLoader);
             final String appId = "classpath.ear";
 
-            final boolean classpathAsEar = SystemInstance.get().getOptions().get(CLASSPATH_AS_EAR, true);
+            final boolean classpathAsEar = options.get(CLASSPATH_AS_EAR, true);
             try {
                 if (classpathAsEar && !jarFiles.isEmpty()) {
 

Modified: openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java?rev=1330642&r1=1330641&r2=1330642&view=diff
==============================================================================
--- openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java (original)
+++ openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java Thu Apr 26 03:51:21 2012
@@ -51,6 +51,7 @@ import org.apache.xbean.finder.IAnnotati
 import org.apache.xbean.finder.ResourceFinder;
 import org.apache.xbean.finder.UrlSet;
 import org.apache.xbean.finder.archive.Archive;
+import org.apache.xbean.finder.archive.ClassesArchive;
 import org.apache.xbean.finder.archive.JarArchive;
 import org.xml.sax.SAXException;
 
@@ -83,6 +84,8 @@ import java.util.jar.JarFile;
 import java.util.jar.Manifest;
 
 import static org.apache.openejb.config.NewLoaderLogic.applyBuiltinExcludes;
+import static org.apache.openejb.config.TldScanner.scanForTagLibs;
+import static org.apache.openejb.config.TldScanner.scanWarForTagLibs;
 import static org.apache.openejb.util.URLs.toFile;
 
 /**
@@ -677,9 +680,17 @@ public class DeploymentLoader implements
 
         try {
             // TODO:  Put our scanning ehnancements back, here
-            final IAnnotationFinder finder = FinderFactory.createFinder(webModule);
-            webModule.setFinder(finder);
-            webEjbModule.setFinder(finder);
+            fillEjbJar(webModule, webEjbModule);
+
+            if (isMetadataComplete(webModule, webEjbModule)) {
+                final IAnnotationFinder finder = new org.apache.xbean.finder.AnnotationFinder(new ClassesArchive());
+                webModule.setFinder(finder);
+                webEjbModule.setFinder(finder);
+            }  else {
+                final IAnnotationFinder finder = FinderFactory.createFinder(webModule);
+                webModule.setFinder(finder);
+                webEjbModule.setFinder(finder);
+            }
         } catch (Exception e) {
             throw new OpenEJBException("Unable to create annotation scanner for web module " + webModule.getModuleId(), e);
         }
@@ -687,6 +698,40 @@ public class DeploymentLoader implements
         addWebservices(webEjbModule);
     }
 
+    /**
+     * If the web.xml is metadata-complete and there is no ejb-jar.xml
+     * then per specification we use the web.xml metadata-complete setting
+     * to imply the same for EJBs.
+     *
+     * @param webModule
+     * @param ejbModule
+     */
+    private void fillEjbJar(WebModule webModule, EjbModule ejbModule) {
+        final Object o = webModule.getAltDDs().get("ejb-jar.xml");
+        if (o != null) return;
+        if (ejbModule.getEjbJar() != null) return;
+
+        final EjbJar ejbJar = new EjbJar();
+        final WebApp webApp = webModule.getWebApp();
+
+        ejbJar.setMetadataComplete(webApp.isMetadataComplete());
+
+        ejbModule.setEjbJar(ejbJar);
+    }
+
+    private boolean isMetadataComplete(WebModule webModule, EjbModule ejbModule) {
+        if (webModule.getWebApp() == null) return false;
+        if (!webModule.getWebApp().isMetadataComplete()) return false;
+
+        // At this point we know the web.xml is metadata-complete
+        // We need to determine if there are cdi or ejb xml files
+        if (webModule.getAltDDs().get("beans.xml") == null) return true;
+        if (ejbModule.getEjbJar() == null) return true;
+        if (!ejbModule.getEjbJar().isMetadataComplete()) return false;
+
+        return true;
+    }
+
     public WebModule createWebModule(final String appId, final String warPath, final ClassLoader parentClassLoader, final String contextRoot, final String moduleName) throws OpenEJBException {
         File warFile = new File(warPath);
         if (!warFile.isDirectory()) {
@@ -956,7 +1001,7 @@ public class DeploymentLoader implements
 
         // Search all libs
         final ClassLoader parentClassLoader = webModule.getClassLoader().getParent();
-        urls = scanClassLoaderForTagLibs(parentClassLoader);
+        urls = TldScanner.scan(parentClassLoader);
         tldLocations.addAll(urls);
 
         // load the tld files

Modified: openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/ReadDescriptors.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/ReadDescriptors.java?rev=1330642&r1=1330641&r2=1330642&view=diff
==============================================================================
--- openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/ReadDescriptors.java (original)
+++ openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/ReadDescriptors.java Thu Apr 26 03:51:21 2012
@@ -29,6 +29,7 @@ import org.apache.openejb.jee.FacesConfi
 import org.apache.openejb.jee.HandlerChains;
 import org.apache.openejb.jee.JavaWsdlMapping;
 import org.apache.openejb.jee.JaxbJavaee;
+import org.apache.openejb.jee.Listener;
 import org.apache.openejb.jee.TldTaglib;
 import org.apache.openejb.jee.WebApp;
 import org.apache.openejb.jee.Webservices;
@@ -646,6 +647,16 @@ public class ReadDescriptors implements 
     }
 
     public static TldTaglib readTldTaglib(URL url) throws OpenEJBException {
+        // TOMEE-164 Optimization on reading built-in tld files
+        if (url.getPath().contains("jstl-1.2.jar")) return new TldTaglib();
+        if (url.getPath().contains("myfaces-impl")) {
+            final TldTaglib taglib = new TldTaglib();
+            final Listener listener = new Listener();
+            listener.setListenerClass("org.apache.myfaces.webapp.StartupServletContextListener");
+            taglib.getListener().add(listener);
+            return taglib;
+        }
+
         TldTaglib tldTaglib;
         try {
             tldTaglib = (TldTaglib) JaxbJavaee.unmarshalTaglib(TldTaglib.class, IO.read(url));

Copied: openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/SystemApps.java (from r1330257, openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/SystemApps.java)
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/SystemApps.java?p2=openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/SystemApps.java&p1=openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/SystemApps.java&r1=1330257&r2=1330642&rev=1330642&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/SystemApps.java (original)
+++ openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/SystemApps.java Thu Apr 26 03:51:21 2012
@@ -18,7 +18,6 @@ package org.apache.openejb.config;
 
 import org.apache.openejb.assembler.DeployerEjb;
 import org.apache.openejb.assembler.classic.cmd.ConfigurationInfoEjb;
-import org.apache.openejb.assembler.monitoring.JMXDeployer;
 import org.apache.openejb.jee.EjbJar;
 import org.apache.openejb.jee.StatelessBean;
 import org.apache.openejb.jee.oejb3.EjbDeployment;
@@ -40,7 +39,6 @@ public class SystemApps {
         ejbJar.addEnterpriseBean(new StatelessBean(null, DeployerEjb.class));
         ejbJar.addEnterpriseBean(new StatelessBean(null, ConfigurationInfoEjb.class));
         ejbJar.addEnterpriseBean(new StatelessBean(null, MEJBBean.class));
-        module.getMbeans().add(JMXDeployer.class.getName());
 
         final String className = "org.apache.tomee.catalina.deployer.WebappDeployer";
         if (exists(className)) {

Modified: openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/sys/AbstractService.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/sys/AbstractService.java?rev=1330642&r1=1330641&r2=1330642&view=diff
==============================================================================
--- openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/sys/AbstractService.java (original)
+++ openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/sys/AbstractService.java Thu Apr 26 03:51:21 2012
@@ -17,6 +17,7 @@
 package org.apache.openejb.config.sys;
 
 import org.apache.openejb.config.Service;
+import org.apache.openejb.util.SuperProperties;
 
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
@@ -97,7 +98,7 @@ public abstract class AbstractService im
      */
     public Properties getProperties() {
         if (properties == null) {
-            properties = new Properties();
+            properties = new SuperProperties();
         }
         return properties;
     }

Modified: openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/sys/JaxbOpenejb.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/sys/JaxbOpenejb.java?rev=1330642&r1=1330641&r2=1330642&view=diff
==============================================================================
--- openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/sys/JaxbOpenejb.java (original)
+++ openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/sys/JaxbOpenejb.java Thu Apr 26 03:51:21 2012
@@ -224,8 +224,7 @@ public abstract class JaxbOpenejb {
             } else {
                 in = IO.read(new File(configFile));
             }
-            Openejb openejb = (Openejb) unmarshal(SystemInstance.get().getOptions().get("openejb.configuration.class", Openejb.class), in);
-            return openejb;
+            return SaxOpenejb.parse(new InputSource(in));
         } catch (MalformedURLException e) {
             throw new OpenEJBException("Unable to resolve location " + configFile, e);
         } catch (Exception e) {

Copied: openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/sys/SaxOpenejb.java (from r1330253, openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/sys/SaxOpenejb.java)
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/sys/SaxOpenejb.java?p2=openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/sys/SaxOpenejb.java&p1=openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/sys/SaxOpenejb.java&r1=1330253&r2=1330642&rev=1330642&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/sys/SaxOpenejb.java (original)
+++ openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/sys/SaxOpenejb.java Thu Apr 26 03:51:21 2012
@@ -181,6 +181,13 @@ class SaxOpenejb extends DefaultHandler 
         }
 
         @Override
+        public void startElement(String uri, String localName, String qName, Attributes attributes) {
+            super.startElement(uri, localName, qName, attributes);
+            final String ctype = attributes.getValue("ctype");
+            if (ctype != null) service.setType(ctype);
+        }
+
+        @Override
         public void endElement(String uri, String localName, String qName) {
             openejb.getContainer().add(service);
             super.endElement(uri, localName, qName);

Modified: openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/util/StringTemplate.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/util/StringTemplate.java?rev=1330642&r1=1330641&r2=1330642&view=diff
==============================================================================
--- openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/util/StringTemplate.java (original)
+++ openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/util/StringTemplate.java Thu Apr 26 03:51:21 2012
@@ -35,6 +35,9 @@ public class StringTemplate {
  
     	while (matcher.find()) {
     		String key = matcher.group(2);
+
+            if (key == null) throw new IllegalStateException("Key is null. Template '" + template + "'");
+
     		String value = map.get(key);
     		
     		if (key.toLowerCase().endsWith(".lc")) {
@@ -44,8 +47,9 @@ public class StringTemplate {
     		} else if (key.toLowerCase().endsWith(".cc")) {
     			value = Strings.camelCase(map.get(key.substring(0, key.length() - 3)));
 			}
-    		
-    		matcher.appendReplacement(buf, value);
+
+            if (value == null) throw new IllegalStateException("Value is null for key '" + key + "'. Template '" + template + "'. Keys: " + Join.join(", ", map.keySet()));
+            matcher.appendReplacement(buf, value);
     	}
 
     	matcher.appendTail(buf);

Modified: openejb/branches/openejb-4.0.0/container/openejb-jee/src/main/java/org/apache/openejb/jee/EjbJar.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.0.0/container/openejb-jee/src/main/java/org/apache/openejb/jee/EjbJar.java?rev=1330642&r1=1330641&r2=1330642&view=diff
==============================================================================
--- openejb/branches/openejb-4.0.0/container/openejb-jee/src/main/java/org/apache/openejb/jee/EjbJar.java (original)
+++ openejb/branches/openejb-4.0.0/container/openejb-jee/src/main/java/org/apache/openejb/jee/EjbJar.java Thu Apr 26 03:51:21 2012
@@ -179,14 +179,28 @@ public class EjbJar implements NamedModu
 
     public void setEnterpriseBeans(EnterpriseBean[] v) {
         enterpriseBeans.clear();
-        for (EnterpriseBean e : v) enterpriseBeans.put(e.getEjbName(), e);
+        for (EnterpriseBean e : v) {
+            defaultName(e);
+            enterpriseBeans.put(e.getEjbName(), e);
+        }
+    }
+
+    private void defaultName(EnterpriseBean e) {
+        if (e.getEjbName() == null) {
+            e.setEjbName("@NULL@" + e.hashCode());
+        }
     }
 
     public <T extends EnterpriseBean> T addEnterpriseBean(T bean){
+        defaultName(bean);
         enterpriseBeans.put(bean.getEjbName(), bean);
         return bean;
     }
 
+    public EnterpriseBean removeEnterpriseBean(EnterpriseBean bean){
+        return removeEnterpriseBean(bean.getEjbName());
+    }
+
     public EnterpriseBean removeEnterpriseBean(String name){
         EnterpriseBean bean = enterpriseBeans.remove(name);
         return bean;

Modified: openejb/branches/openejb-4.0.0/server/openejb-hsql/src/main/resources/META-INF/org.apache.openejb.server.ServerService/hsql
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.0.0/server/openejb-hsql/src/main/resources/META-INF/org.apache.openejb.server.ServerService/hsql?rev=1330642&r1=1330641&r2=1330642&view=diff
==============================================================================
--- openejb/branches/openejb-4.0.0/server/openejb-hsql/src/main/resources/META-INF/org.apache.openejb.server.ServerService/hsql (original)
+++ openejb/branches/openejb-4.0.0/server/openejb-hsql/src/main/resources/META-INF/org.apache.openejb.server.ServerService/hsql Thu Apr 26 03:51:21 2012
@@ -1,4 +1,4 @@
 server      = org.apache.openejb.server.hsql.HsqlService
 bind        = 127.0.0.1
 port        = 9001
-disabled    = false
+disabled    = true

Modified: openejb/branches/openejb-4.0.0/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatLoader.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.0.0/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatLoader.java?rev=1330642&r1=1330641&r2=1330642&view=diff
==============================================================================
--- openejb/branches/openejb-4.0.0/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatLoader.java (original)
+++ openejb/branches/openejb-4.0.0/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatLoader.java Thu Apr 26 03:51:21 2012
@@ -87,6 +87,10 @@ import java.util.Set;
  */
 public class TomcatLoader implements Loader {
 
+    static {
+        Warmup.warmup();
+    }
+
     private static final Logger logger = Logger.getInstance(LogCategory.OPENEJB_STARTUP, TomcatLoader.class);
     public static final String TOMEE_NOSHUTDOWNHOOK_PROP = "tomee.noshutdownhook";
 
@@ -124,7 +128,8 @@ public class TomcatLoader implements Loa
     }
 
     public void initDefaults(Properties properties) {
-        setIfNull(properties, "openejb.deployments.classpath", "true");
+        setIfNull(properties, "openejb.system.apps", "true");
+        setIfNull(properties, "openejb.deployments.classpath", "false");
         setIfNull(properties, "openejb.deployments.classpath.filter.systemapps", "false");
 
         //Sets default service provider

Modified: openejb/branches/openejb-4.0.0/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.0.0/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java?rev=1330642&r1=1330641&r2=1330642&view=diff
==============================================================================
--- openejb/branches/openejb-4.0.0/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java (original)
+++ openejb/branches/openejb-4.0.0/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java Thu Apr 26 03:51:21 2012
@@ -86,7 +86,7 @@ public class Container {
         final ExecutorService executor = Executors.newFixedThreadPool(4, new DaemonThreadFactory("warmup"));
 
         executor.execute(new JaxbJavaeeLoad(WebApp.class));
-        executor.execute(new JaxbJavaeeLoad(TldTaglib.class));
+//        executor.execute(new JaxbJavaeeLoad(TldTaglib.class));
         executor.execute(new Runnable(){
             @Override
             public void run() {

Modified: openejb/branches/openejb-4.0.0/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/TomEEJarScanner.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.0.0/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/TomEEJarScanner.java?rev=1330642&r1=1330641&r2=1330642&view=diff
==============================================================================
--- openejb/branches/openejb-4.0.0/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/TomEEJarScanner.java (original)
+++ openejb/branches/openejb-4.0.0/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/TomEEJarScanner.java Thu Apr 26 03:51:21 2012
@@ -19,22 +19,143 @@
 
 package org.apache.tomee.loader;
 
+import org.apache.juli.logging.Log;
+import org.apache.juli.logging.LogFactory;
+import org.apache.openejb.OpenEJBException;
+import org.apache.openejb.config.TldScanner;
+import org.apache.openejb.util.URLs;
 import org.apache.tomcat.JarScannerCallback;
+import org.apache.tomcat.util.file.Matcher;
+import org.apache.tomcat.util.res.StringManager;
+import org.apache.tomcat.util.scan.Constants;
 import org.apache.tomcat.util.scan.StandardJarScanner;
 
 import javax.servlet.ServletContext;
+import java.io.File;
+import java.io.IOException;
+import java.net.JarURLConnection;
+import java.net.MalformedURLException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.HashSet;
+import java.util.Iterator;
 import java.util.Set;
+import java.util.StringTokenizer;
 
 public class TomEEJarScanner extends StandardJarScanner {
+
+    private static final Log log = LogFactory.getLog(StandardJarScanner.class);
+
+    private static final Set<String> defaultJarsToSkip = new HashSet<String>();
+
+    /**
+     * The string resources for this package.
+     */
+    private static final StringManager sm = StringManager.getManager(Constants.Package);
+
+    static {
+        String jarList = System.getProperty(Constants.SKIP_JARS_PROPERTY);
+        if (jarList != null) {
+            StringTokenizer tokenizer = new StringTokenizer(jarList, ",");
+            while (tokenizer.hasMoreElements()) {
+                defaultJarsToSkip.add(tokenizer.nextToken());
+            }
+        }
+    }
+
     @Override
     public void scan(ServletContext context, ClassLoader classLoader, JarScannerCallback callback, Set<String> jarsToIgnore) {
         if ("FragmentJarScannerCallback".equals(callback.getClass().getSimpleName())) {
             EmbeddedJarScanner embeddedJarScanner = new EmbeddedJarScanner();
             embeddedJarScanner.scan(context, classLoader, callback, jarsToIgnore);
+        } else if ("TldJarScannerCallback".equals(callback.getClass().getSimpleName())) {
+
+            final Set<String> ignoredJars = defaultJarsToSkip;
+
+            final Set<String[]> ignoredJarsTokens = new HashSet<String[]>();
+
+            for (String pattern : ignoredJars) {
+                ignoredJarsTokens.add(Matcher.tokenizePathAsArray(pattern));
+            }
+
+            // Scan WEB-INF/lib
+            Set<String> dirList = context.getResourcePaths(Constants.WEB_INF_LIB);
+            if (dirList != null) {
+                Iterator<String> it = dirList.iterator();
+                while (it.hasNext()) {
+                    String path = it.next();
+                    if (path.endsWith(Constants.JAR_EXT) &&
+                            !Matcher.matchPath(ignoredJarsTokens,
+                                    path.substring(path.lastIndexOf('/') + 1))) {
+                        // Need to scan this JAR
+                        URL url = null;
+                        try {
+                            // File URLs are always faster to work with so use them
+                            // if available.
+                            String realPath = context.getRealPath(path);
+                            if (realPath == null) {
+                                url = context.getResource(path);
+                            } else {
+                                url = (new File(realPath)).toURI().toURL();
+                            }
+                            process(callback, url);
+                        } catch (IOException e) {
+                            log.warn(sm.getString("jarScan.webinflibFail", url), e);
+                        }
+                    } else {
+                        if (log.isTraceEnabled()) {
+                            log.trace(sm.getString("jarScan.webinflibJarNoScan", path));
+                        }
+                    }
+                }
+            }
+
+            // Scan the classpath
+            if (isScanClassPath()) {
+                if (log.isTraceEnabled()) {
+                    log.trace(sm.getString("jarScan.classloaderStart"));
+                }
+
+
+                try {
+                    final ClassLoader loader = Thread.currentThread().getContextClassLoader();
+                    final Set<URL> tldFileUrls = TldScanner.scan(loader);
+
+                    final Set<URL> jarUlrs = discardFilePaths(tldFileUrls);
+
+                    for (URL url : jarUlrs) {
+                        String jarName = getJarName(url);
+
+                        // Skip JARs known not to be interesting and JARs
+                        // in WEB-INF/lib we have already scanned
+                        if (jarName != null && !(Matcher.matchPath(ignoredJarsTokens, jarName) || url.toString().contains(Constants.WEB_INF_LIB + jarName))) {
+
+                            if (log.isDebugEnabled()) {
+                                log.debug(sm.getString("jarScan.classloaderJarScan", url));
+                            }
+                            try {
+                                process(callback, url);
+                            } catch (IOException ioe) {
+                                log.warn(sm.getString(
+                                        "jarScan.classloaderFail", url), ioe);
+                            }
+                        } else {
+                            if (log.isTraceEnabled()) {
+                                log.trace(sm.getString("jarScan.classloaderJarNoScan", url));
+                            }
+                        }
+                    }
+                } catch (OpenEJBException e) {
+                    log.warn("JarScan.TldScan Failed ", e);
+                }
+            }
+
         } else {
             super.scan(context, classLoader, callback, jarsToIgnore);
         }
 
+
 //        String openejbWar = System.getProperty("tomee.war");
 //
 //        if (openejbWar == null) {
@@ -60,4 +181,100 @@ public class TomEEJarScanner extends Sta
 //
 //        super.scan(context, classLoader, callback, newIgnores);
     }
+
+    private Set<URL> discardFilePaths(Set<URL> tldFileUrls) {
+        final Set<String> jarPaths = new HashSet<String>();
+
+        for (URL tldFileUrl : tldFileUrls) {
+            jarPaths.add(URLs.toFilePath(tldFileUrl));
+        }
+
+        final Set<URL> jars = new HashSet<URL>();
+        for (String jarPath : jarPaths) {
+            try {
+                final URL url = new File(jarPath).toURI().toURL();
+                jars.add(url);
+            } catch (MalformedURLException e) {
+                log.warn("Skipping JAR file " + jarPath, e);
+            }
+        }
+        return jars;
+    }
+
+    /*
+    * Scan a URL for JARs with the optional extensions to look at all files
+    * and all directories.
+    */
+    private void process(JarScannerCallback callback, URL url) throws IOException {
+
+        if (log.isTraceEnabled()) {
+            log.trace(sm.getString("jarScan.jarUrlStart", url));
+        }
+
+        final URLConnection conn = url.openConnection();
+        if (conn instanceof JarURLConnection) {
+
+            callback.scan((JarURLConnection) conn);
+
+        } else {
+
+            final String urlStr = url.toString();
+
+            if (urlStr.startsWith("file:") || urlStr.startsWith("jndi:")) {
+
+                if (urlStr.endsWith(Constants.JAR_EXT)) {
+
+                    final URL jarURL = new URL("jar:" + urlStr + "!/");
+                    callback.scan((JarURLConnection) jarURL.openConnection());
+
+                } else {
+                    try {
+
+                        final File f = new File(url.toURI());
+
+                        if (f.isFile() && isScanAllFiles()) {
+
+                            // Treat this file as a JAR
+                            final URL jarURL = new URL("jar:" + urlStr + "!/");
+                            callback.scan((JarURLConnection) jarURL.openConnection());
+
+                        } else if (f.isDirectory() && isScanAllDirectories()) {
+
+                            final File metainf = new File(f.getAbsoluteFile() + File.separator + "META-INF");
+
+                            if (metainf.isDirectory()) {
+                                callback.scan(f);
+                            }
+                        }
+                    } catch (URISyntaxException e) {
+                        // Wrap the exception and re-throw
+                        IOException ioe = new IOException();
+                        ioe.initCause(e);
+                        throw ioe;
+                    }
+                }
+            }
+        }
+
+    }
+
+    /*
+     * Extract the JAR name, if present, from a URL
+     */
+    private String getJarName(URL url) {
+
+        String name = null;
+
+        String path = url.getPath();
+        int end = path.indexOf(Constants.JAR_EXT);
+        if (end != -1) {
+            int start = path.lastIndexOf('/', end);
+            name = path.substring(start + 1, end + 4);
+        } else if (isScanAllDirectories()) {
+            int start = path.lastIndexOf('/');
+            name = path.substring(start + 1);
+        }
+
+        return name;
+    }
 }