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();
}
}
-
}