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 2014/10/28 10:31:58 UTC

git commit: TOMEE-1429 restore fast session id feature of tomee embedded, TOMEE-1430 support roles/users for tomee embedded, TOMEE-1431 use server.xml for tomee embedded

Repository: tomee
Updated Branches:
  refs/heads/develop 736c33041 -> 7d36cc0d7


TOMEE-1429 restore fast session id feature of tomee embedded, TOMEE-1430 support roles/users for tomee embedded, TOMEE-1431 use server.xml for tomee embedded


Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/7d36cc0d
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/7d36cc0d
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/7d36cc0d

Branch: refs/heads/develop
Commit: 7d36cc0d784e44631a8a17faf7b4cc1d5c8f94fd
Parents: 736c330
Author: Romain Manni-Bucau <rm...@apache.org>
Authored: Tue Oct 28 10:31:22 2014 +0100
Committer: Romain Manni-Bucau <rm...@apache.org>
Committed: Tue Oct 28 10:31:36 2014 +0100

----------------------------------------------------------------------
 .../maven/plugins/TomEEEmbeddedMojo.java        |   9 ++
 .../tomee/catalina/TomcatWebAppBuilder.java     |   2 +-
 tomee/tomee-embedded/pom.xml                    |   5 +
 .../apache/tomee/embedded/Configuration.java    |  29 ++++
 .../org/apache/tomee/embedded/Container.java    | 145 ++++++++++++++++---
 5 files changed, 167 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tomee/blob/7d36cc0d/maven/tomee-embedded-maven-plugin/src/main/java/org/apache/openejb/maven/plugins/TomEEEmbeddedMojo.java
----------------------------------------------------------------------
diff --git a/maven/tomee-embedded-maven-plugin/src/main/java/org/apache/openejb/maven/plugins/TomEEEmbeddedMojo.java b/maven/tomee-embedded-maven-plugin/src/main/java/org/apache/openejb/maven/plugins/TomEEEmbeddedMojo.java
index 8ebcb05..cd7b57e 100644
--- a/maven/tomee-embedded-maven-plugin/src/main/java/org/apache/openejb/maven/plugins/TomEEEmbeddedMojo.java
+++ b/maven/tomee-embedded-maven-plugin/src/main/java/org/apache/openejb/maven/plugins/TomEEEmbeddedMojo.java
@@ -132,6 +132,15 @@ public class TomEEEmbeddedMojo extends AbstractMojo {
     @Parameter(property = "tomee-embedded-plugin.mavenLog", defaultValue = "true")
     private boolean mavenLog;
 
+    @Parameter(property = "tomee-embedded-plugin.keepServerXmlAsThis", defaultValue = "false")
+    private boolean keepServerXmlAsThis;
+
+    @Parameter
+    private Map<String, String> users;
+
+    @Parameter
+    private Map<String, String> roles;
+
     @Override
     public void execute() throws MojoExecutionException, MojoFailureException {
         if (!classpathAsWar && "pom".equals(packaging)) {

http://git-wip-us.apache.org/repos/asf/tomee/blob/7d36cc0d/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
----------------------------------------------------------------------
diff --git a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
index d2e06c3..4058e19 100644
--- a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
+++ b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
@@ -800,7 +800,7 @@ public class TomcatWebAppBuilder implements WebAppBuilder, ContextListener, Pare
         if (sessionManager != null) {
             if (sessionManagerClass == null) {
                 try { // the manager should be in standardclassloader
-                    sessionManagerClass = TomcatHelper.getServer().getParentClassLoader().loadClass(sessionManager);
+                    sessionManagerClass = ParentClassLoaderFinder.Helper.get().loadClass(sessionManager);
                 } catch (final ClassNotFoundException e) {
                     logger.error("can't find '" + sessionManager + "', StandardManager will be used", e);
                     sessionManagerClass = StandardManager.class;

http://git-wip-us.apache.org/repos/asf/tomee/blob/7d36cc0d/tomee/tomee-embedded/pom.xml
----------------------------------------------------------------------
diff --git a/tomee/tomee-embedded/pom.xml b/tomee/tomee-embedded/pom.xml
index 072c5c5..1093246 100644
--- a/tomee/tomee-embedded/pom.xml
+++ b/tomee/tomee-embedded/pom.xml
@@ -91,6 +91,11 @@
     </dependency>
     <dependency>
       <groupId>org.apache.openejb</groupId>
+      <artifactId>tomee-util</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.openejb</groupId>
       <artifactId>javaee-api</artifactId>
       <scope>compile</scope>
       <classifier>tomcat</classifier>

http://git-wip-us.apache.org/repos/asf/tomee/blob/7d36cc0d/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Configuration.java
----------------------------------------------------------------------
diff --git a/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Configuration.java b/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Configuration.java
index 55c4717..d4549e7 100644
--- a/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Configuration.java
+++ b/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Configuration.java
@@ -19,6 +19,7 @@ package org.apache.tomee.embedded;
 import org.apache.openejb.util.NetworkUtil;
 
 import java.io.File;
+import java.util.Map;
 import java.util.Properties;
 
 /**
@@ -31,6 +32,7 @@ public class Configuration {
     private String host = "localhost";
     protected String dir;
     private File serverXml;
+    private boolean keepServerXmlAsThis;
     private Properties properties;
     private boolean quickSession = true;
     private boolean skipHttp;
@@ -46,6 +48,9 @@ public class Configuration {
 
     private boolean deployOpenEjbApp;
 
+    private Map<String, String> users;
+    private Map<String, String> roles;
+
     /**
      * when needed temp file only (deployClasspathAsWebapp() for instance)
      */
@@ -223,4 +228,28 @@ public class Configuration {
         setHttpPort(port);
         return this;
     }
+
+    public Map<String, String> getUsers() {
+        return users;
+    }
+
+    public void setUsers(final Map<String, String> users) { // useful for tools like maven plugin
+        this.users = users;
+    }
+
+    public Map<String, String> getRoles() {
+        return roles;
+    }
+
+    public void setRoles(final Map<String, String> roles) {
+        this.roles = roles;
+    }
+
+    public boolean isKeepServerXmlAsThis() {
+        return keepServerXmlAsThis;
+    }
+
+    public void setKeepServerXmlAsThis(final boolean keepServerXmlAsThis) {
+        this.keepServerXmlAsThis = keepServerXmlAsThis;
+    }
 }

http://git-wip-us.apache.org/repos/asf/tomee/blob/7d36cc0d/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java
----------------------------------------------------------------------
diff --git a/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java b/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java
index 35ecc9a..1e9e9d4 100644
--- a/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java
+++ b/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java
@@ -16,13 +16,17 @@
  */
 package org.apache.tomee.embedded;
 
+import org.apache.catalina.Engine;
+import org.apache.catalina.Host;
 import org.apache.catalina.LifecycleException;
+import org.apache.catalina.Manager;
 import org.apache.catalina.Server;
 import org.apache.catalina.Service;
 import org.apache.catalina.connector.Connector;
-import org.apache.catalina.core.StandardContext;
 import org.apache.catalina.core.StandardServer;
+import org.apache.catalina.session.ManagerBase;
 import org.apache.catalina.session.StandardManager;
+import org.apache.catalina.startup.Catalina;
 import org.apache.catalina.startup.CatalinaProperties;
 import org.apache.catalina.startup.Tomcat;
 import org.apache.coyote.http11.Http11Protocol;
@@ -64,8 +68,9 @@ import org.apache.openejb.util.LogCategory;
 import org.apache.openejb.util.Logger;
 import org.apache.tomee.catalina.TomEERuntimeException;
 import org.apache.tomee.catalina.TomcatLoader;
-import org.apache.tomee.catalina.session.FastNonSecureRandom;
+import org.apache.tomee.catalina.session.QuickSessionManager;
 import org.apache.tomee.embedded.internal.StandardContextCustomizer;
+import org.apache.tomee.util.QuickServerXmlParser;
 import org.apache.velocity.Template;
 import org.apache.velocity.VelocityContext;
 import org.apache.velocity.app.Velocity;
@@ -73,6 +78,7 @@ import org.apache.velocity.app.VelocityEngine;
 import org.apache.velocity.runtime.log.NullLogChute;
 import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader;
 import org.apache.xbean.finder.filter.Filters;
+import org.codehaus.swizzle.stream.ReplaceStringsInputStream;
 
 import javax.naming.Context;
 import javax.naming.NamingException;
@@ -108,7 +114,7 @@ public class Container implements AutoCloseable {
     private File base;
     private ConfigurationFactory configurationFactory;
     private Assembler assembler;
-    private Tomcat tomcat;
+    private InternalTomcat tomcat;
 
     // start the container directly
     public Container(final Configuration configuration) {
@@ -259,7 +265,7 @@ public class Container implements AutoCloseable {
         if (configuration.isQuickSession()) {
             tomcat = new TomcatWithFastSessionIDs();
         } else {
-            tomcat = new Tomcat();
+            tomcat = new InternalTomcat();
         }
 
         // create basic installation in setup to be able to handle anything the caller does between setup() and start()
@@ -301,21 +307,53 @@ public class Container implements AutoCloseable {
         final File conf = new File(base, "conf");
         final File webapps = new File(base, "webapps");
 
+        final String catalinaBase = base.getAbsolutePath();
+
+        // set the env before calling anoything on tomcat or Catalina!!
+        System.setProperty("catalina.base", catalinaBase);
+        System.setProperty("openejb.deployments.classpath", "false");
+        System.setProperty("catalina.home", catalinaBase);
+        System.setProperty("catalina.base", catalinaBase);
+        System.setProperty("openejb.home", catalinaBase);
+        System.setProperty("openejb.base", catalinaBase);
+        System.setProperty("openejb.servicemanager.enabled", "false");
+
         copyFileTo(conf, "catalina.policy");
         copyTemplateTo(conf, "catalina.properties");
         copyFileTo(conf, "context.xml");
         copyFileTo(conf, "openejb.xml");
         copyFileTo(conf, "tomcat-users.xml");
         copyFileTo(conf, "web.xml");
+
+        final boolean initialized;
         if (configuration.hasServerXml()) {
-            final FileOutputStream fos = new FileOutputStream(new File(conf, "server.xml"));
+            final File file = new File(conf, "server.xml");
+            final FileOutputStream fos = new FileOutputStream(file);
             try {
                 IO.copy(configuration.getServerXmlFile(), fos);
             } finally {
                 IO.close(fos);
             }
+
+            // respect config (host/port) of the Configuration
+            final QuickServerXmlParser ports = QuickServerXmlParser.parse(file);
+            if (configuration.isKeepServerXmlAsThis()) {
+                // force ports to be able to stop the server and get @ArquillianResource
+                configuration.setHttpPort(Integer.parseInt(ports.http()));
+                configuration.setStopPort(Integer.parseInt(ports.stop()));
+            } else {
+                final Map<String, String> replacements = new HashMap<String, String>();
+                replacements.put(ports.http(), String.valueOf(configuration.getHttpPort()));
+                replacements.put(ports.https(), String.valueOf(configuration.getHttpsPort()));
+                replacements.put(ports.stop(), String.valueOf(configuration.getStopPort()));
+                IO.copy(IO.slurp(new ReplaceStringsInputStream(IO.read(file), replacements)).getBytes(), file);
+            }
+
+            tomcat.server(createServer(file.getAbsolutePath()));
+            initialized = true;
         } else {
             copyFileTo(conf, "server.xml");
+            initialized = false;
         }
 
         if (props != null && !props.isEmpty()) {
@@ -337,17 +375,19 @@ public class Container implements AutoCloseable {
             System.setProperty("java.util.logging.config.file", logging.getAbsolutePath());
         }
         */
-        System.setProperty("catalina.base", base.getAbsolutePath());
 
         // Trigger loading of catalina.properties
         CatalinaProperties.getProperty("foo");
 
         tomcat.setBaseDir(base.getAbsolutePath());
-        tomcat.getHost().setAppBase(webapps.getAbsolutePath());
         tomcat.setHostname(configuration.getHost());
-        tomcat.getEngine().setDefaultHost(configuration.getHost());
+        if (!initialized) {
+            tomcat.getHost().setAppBase(webapps.getAbsolutePath());
+            tomcat.getEngine().setDefaultHost(configuration.getHost());
+            tomcat.setHostname(configuration.getHost());
+        }
 
-        if (!configuration.isSkipHttp()) {
+        if (tomcat.getRawConnector() == null && !configuration.isSkipHttp()) {
             final Connector connector = new Connector(Http11Protocol.class.getName());
             connector.setPort(configuration.getHttpPort());
             connector.setAttribute("connectionTimeout", "3000");
@@ -383,14 +423,21 @@ public class Container implements AutoCloseable {
         // Bootstrap Tomcat
         Logger.getInstance(LogCategory.OPENEJB_STARTUP, Container.class).info("Starting TomEE from: " + base.getAbsolutePath()); // create it after Logger is configured
 
-        final String catalinaBase = base.getAbsolutePath();
-        System.setProperty("openejb.deployments.classpath", "false");
-        System.setProperty("catalina.home", catalinaBase);
-        System.setProperty("catalina.base", catalinaBase);
-        System.setProperty("openejb.home", catalinaBase);
-        System.setProperty("openejb.base", catalinaBase);
-        System.setProperty("openejb.servicemanager.enabled", "false");
-
+        if (configuration.getUsers() != null) {
+            for (final Map.Entry<String, String> user : configuration.getUsers().entrySet()) {
+                tomcat.addUser(user.getKey(), user.getValue());
+            }
+        }
+        if (configuration.getRoles() != null) {
+            for (final Map.Entry<String, String> user : configuration.getRoles().entrySet()) {
+                for (final String role : user.getValue().split(" *, *")) {
+                    tomcat.addRole(user.getKey(), role);
+                }
+            }
+        }
+        if (!initialized) {
+            tomcat.init();
+        }
         tomcat.start();
 
         // Bootstrap OpenEJB
@@ -406,6 +453,9 @@ public class Container implements AutoCloseable {
         if (properties.getProperty("openejb.system.apps") == null) { // will make startup faster and it is rarely useful for embedded case
             properties.setProperty("openejb.system.apps", "false");
         }
+        if (configuration.isQuickSession()) {
+            properties.put("openejb.session.manager", QuickSessionManager.class.getName());
+        }
 
         try {
             final ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
@@ -450,6 +500,29 @@ public class Container implements AutoCloseable {
         configurationFactory = new ConfigurationFactory();
     }
 
+    private static Server createServer(final String serverXml) {
+        final Catalina catalina = new Catalina() {
+            // skip few init we don't need *here*
+            @Override
+            protected void initDirs() {
+                // no-op
+            }
+
+            @Override
+            protected void initStreams() {
+                // no-op
+            }
+
+            @Override
+            protected void initNaming() {
+                // no-op
+            }
+        };
+        catalina.setConfigFile(serverXml);
+        catalina.load();
+        return catalina.getServer();
+    }
+
     public ConfigurationFactory getConfigurationFactory() {
         return configurationFactory;
     }
@@ -728,7 +801,33 @@ public class Container implements AutoCloseable {
         return configuration;
     }
 
-    private static class TomcatWithFastSessionIDs extends Tomcat {
+    private static class InternalTomcat extends Tomcat {
+        private void server(final Server s) {
+            server = s;
+            if (service == null) {
+                final Service[] services = server.findServices();
+                if (services.length > 0) {
+                    service = services[0];
+                    if (service.getContainer() != null) {
+                        engine = Engine.class.cast(service.getContainer());
+                        final org.apache.catalina.Container[] hosts = engine.findChildren();
+                        if (hosts.length > 0) {
+                            host = Host.class.cast(hosts[0]);
+                        }
+                    }
+                }
+                if (service.findConnectors().length > 0) {
+                    connector = service.findConnectors()[0];
+                }
+            }
+        }
+
+        public Connector getRawConnector() {
+            return connector;
+        }
+    }
+
+    private static class TomcatWithFastSessionIDs extends InternalTomcat {
 
         @Override
         public void start() throws LifecycleException {
@@ -738,11 +837,14 @@ public class Container implements AutoCloseable {
                 final org.apache.catalina.Container e = service.getContainer();
                 for (final org.apache.catalina.Container h : e.findChildren()) {
                     for (final org.apache.catalina.Container c : h.findChildren()) {
-                        StandardManager m = (StandardManager) StandardContext.class.cast(c).getManager();
+                        Manager m = ((org.apache.catalina.Context) c).getManager();
                         if (m == null) {
                             m = new StandardManager();
-                            m.setSecureRandomClass(FastNonSecureRandom.class.getName());
-                            StandardContext.class.cast(c).setManager(m);
+                            ((org.apache.catalina.Context) c).setManager(m);
+                        }
+                        if (m instanceof ManagerBase) {
+                            ((ManagerBase) m).setSecureRandomClass(
+                                    "org.apache.catalina.startup.FastNonSecureRandom");
                         }
                     }
                 }
@@ -750,5 +852,4 @@ public class Container implements AutoCloseable {
             super.start();
         }
     }
-
 }