Author: rmannibucau Date: Sun Sep 14 14:28:52 2014 New Revision: 1624855 URL: http://svn.apache.org/r1624855 Log: backporting start of work done around TOMEE-1345 for embedded tomee
Added: tomee/tomee/branches/tomee-1.7.x/tomee/tomee-embedded/src/test/java/org/apache/tomee/embedded/ManualDeploymentTest.java Modified: tomee/tomee/branches/tomee-1.7.x/arquillian/pom.xml tomee/tomee/branches/tomee-1.7.x/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java tomee/tomee/branches/tomee-1.7.x/pom.xml tomee/tomee/branches/tomee-1.7.x/tomee/tomee-embedded/pom.xml tomee/tomee/branches/tomee-1.7.x/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Configuration.java tomee/tomee/branches/tomee-1.7.x/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java tomee/tomee/branches/tomee-1.7.x/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/EmbeddedTomEEContainer.java tomee/tomee/branches/tomee-1.7.x/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Main.java Modified: tomee/tomee/branches/tomee-1.7.x/arquillian/pom.xml URL: http://svn.apache.org/viewvc/tomee/tomee/branches/tomee-1.7.x/arquillian/pom.xml?rev=1624855&r1=1624854&r2=1624855&view=diff ============================================================================== --- tomee/tomee/branches/tomee-1.7.x/arquillian/pom.xml (original) +++ tomee/tomee/branches/tomee-1.7.x/arquillian/pom.xml Sun Sep 14 14:28:52 2014 @@ -34,7 +34,6 @@ <properties> <version.arquillian>1.1.5.Final</version.arquillian> <version.shrinkwrap.descriptor>2.0.0-alpha-6</version.shrinkwrap.descriptor> - <version.shrinkwrap.shrinkwrap>1.1.3</version.shrinkwrap.shrinkwrap> <test.coverage.skip>true</test.coverage.skip> </properties> Modified: tomee/tomee/branches/tomee-1.7.x/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java URL: http://svn.apache.org/viewvc/tomee/tomee/branches/tomee-1.7.x/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java?rev=1624855&r1=1624854&r2=1624855&view=diff ============================================================================== --- tomee/tomee/branches/tomee-1.7.x/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java (original) +++ tomee/tomee/branches/tomee-1.7.x/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java Sun Sep 14 14:28:52 2014 @@ -930,11 +930,12 @@ public class DeploymentLoader implements urlSet = NewLoaderLogic.applyBuiltinExcludes(urlSet); containerUrls = urlSet.getUrls(); + final boolean skipContainerFolders = "true".equalsIgnoreCase(SystemInstance.get().getProperty("openejb.scan.webapp.container.skip-folder", "true")); final Iterator<URL> it = containerUrls.iterator(); while (it.hasNext()) { // remove lib/ final File file = URLs.toFile(it.next()); // TODO: see if websocket should be added in default.exclusions - if (file.isDirectory() || file.getName().endsWith("tomcat-websocket.jar")) { + if ((skipContainerFolders && file.isDirectory()) || file.getName().endsWith("tomcat-websocket.jar")) { it.remove(); } } Modified: tomee/tomee/branches/tomee-1.7.x/pom.xml URL: http://svn.apache.org/viewvc/tomee/tomee/branches/tomee-1.7.x/pom.xml?rev=1624855&r1=1624854&r2=1624855&view=diff ============================================================================== --- tomee/tomee/branches/tomee-1.7.x/pom.xml (original) +++ tomee/tomee/branches/tomee-1.7.x/pom.xml Sun Sep 14 14:28:52 2014 @@ -184,6 +184,7 @@ <version.groovy>2.3.0</version.groovy> <!-- arquillian related --> + <version.shrinkwrap.shrinkwrap>1.1.3</version.shrinkwrap.shrinkwrap> <version.arquillian.bom>1.1.5.Final</version.arquillian.bom> <version.shrinkwrap.resolver.bom>2.1.0</version.shrinkwrap.resolver.bom> </properties> Modified: tomee/tomee/branches/tomee-1.7.x/tomee/tomee-embedded/pom.xml URL: http://svn.apache.org/viewvc/tomee/tomee/branches/tomee-1.7.x/tomee/tomee-embedded/pom.xml?rev=1624855&r1=1624854&r2=1624855&view=diff ============================================================================== --- tomee/tomee/branches/tomee-1.7.x/tomee/tomee-embedded/pom.xml (original) +++ tomee/tomee/branches/tomee-1.7.x/tomee/tomee-embedded/pom.xml Sun Sep 14 14:28:52 2014 @@ -187,6 +187,12 @@ <artifactId>commons-io</artifactId> <scope>test</scope> </dependency> + <dependency> + <groupId>org.jboss.shrinkwrap</groupId> + <artifactId>shrinkwrap-impl-base</artifactId> + <version>${version.shrinkwrap.shrinkwrap}</version> + <scope>test</scope> + </dependency> </dependencies> </project> Modified: tomee/tomee/branches/tomee-1.7.x/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Configuration.java URL: http://svn.apache.org/viewvc/tomee/tomee/branches/tomee-1.7.x/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Configuration.java?rev=1624855&r1=1624854&r2=1624855&view=diff ============================================================================== --- tomee/tomee/branches/tomee-1.7.x/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Configuration.java (original) +++ tomee/tomee/branches/tomee-1.7.x/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Configuration.java Sun Sep 14 14:28:52 2014 @@ -16,6 +16,8 @@ */ package org.apache.tomee.embedded; +import org.apache.openejb.util.NetworkUtil; + import java.io.File; import java.util.Properties; @@ -50,6 +52,11 @@ public class Configuration { this.httpPort = httpPort; } + public Configuration randomHttpPort() { + this.httpPort = NetworkUtil.getNextAvailablePort(); + return this; + } + public int getStopPort() { return stopPort; } @@ -180,4 +187,12 @@ public class Configuration { public void setSslProtocol(final String sslProtocol) { this.sslProtocol = sslProtocol; } + + public Configuration property(final String key, final String value) { + if (properties == null) { + properties = new Properties(); + } + properties.setProperty(key, value); + return this; + } } Modified: tomee/tomee/branches/tomee-1.7.x/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java URL: http://svn.apache.org/viewvc/tomee/tomee/branches/tomee-1.7.x/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java?rev=1624855&r1=1624854&r2=1624855&view=diff ============================================================================== --- tomee/tomee/branches/tomee-1.7.x/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java (original) +++ tomee/tomee/branches/tomee-1.7.x/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java Sun Sep 14 14:28:52 2014 @@ -20,6 +20,7 @@ import org.apache.catalina.LifecycleExce 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.StandardManager; import org.apache.catalina.startup.CatalinaProperties; @@ -46,6 +47,7 @@ import org.apache.openejb.util.LogCatego import org.apache.openejb.util.Logger; import org.apache.tomee.catalina.TomEERuntimeException; import org.apache.tomee.catalina.TomcatLoader; +import org.apache.tomee.catalina.TomcatWebAppBuilder; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; @@ -54,6 +56,7 @@ import org.apache.velocity.runtime.resou import javax.naming.Context; import javax.naming.NamingException; +import java.io.Closeable; import java.io.File; import java.io.FileOutputStream; import java.io.FileWriter; @@ -63,11 +66,12 @@ import java.io.Writer; import java.util.HashMap; import java.util.Map; import java.util.Properties; +import java.util.concurrent.CountDownLatch; /** * @version $Rev$ $Date$ */ -public class Container { +public class Container implements Closeable { static { // org.apache.naming Assembler.installNaming("org.apache.naming", true); @@ -82,10 +86,16 @@ public class Container { private Assembler assembler; private Tomcat tomcat; + // start the container directly + public Container(final Configuration configuration) throws Exception { + setup(configuration); + start(); + } + public Container() { - configuration = new Configuration(); - configuration.setHttpPort(23880); - configuration.setStopPort(23881); + this.configuration = new Configuration(); + this.configuration.setHttpPort(23880); + this.configuration.setStopPort(23881); } private static boolean sameApplication(final File file, final WebAppInfo webApp) { @@ -301,9 +311,7 @@ public class Container { } private String getBaseDir() { - - File file = null; - + File file; try { final String dir = configuration.getDir(); @@ -330,7 +338,7 @@ public class Container { return file.getAbsolutePath(); } catch (final IOException e) { - throw new TomEERuntimeException("Failed to get or create base dir: " + file, e); + throw new TomEERuntimeException("Failed to get or create base dir: " + configuration.getDir(), e); } } @@ -494,10 +502,63 @@ public class Container { return dir; } + public Tomcat getTomcat() { + return tomcat; + } + public void await() { tomcat.getServer().await(); } + @Override + public void close() throws IOException { + final CountDownLatch end = new CountDownLatch(1); + new Thread() { + { + setName("tomee-embedded-await-" + hashCode()); + } + + @Override + public void run() { + try { + Container.this.await(); + end.countDown(); + } catch (final Exception e) { + throw new IllegalStateException(e); + } + } + }.start(); + new Thread() { + { + setName("tomee-embedded-stop-" + hashCode()); + } + + @Override + public void run() { + try { + Container.this.stop(); + } catch (final Exception e) { + throw new IllegalStateException(e); + } + } + }.start(); + try { + end.await(); + } catch (final InterruptedException e) { + Thread.interrupted(); + } + } + + public org.apache.catalina.Context addContext(final String context, final String path) { + final File root = new File(path); + if (!root.exists()) { + Files.mkdirs(root); + } + final org.apache.catalina.Context ctx = getTomcat().addContext(context, root.getAbsolutePath()); // we don't want to be relative + SystemInstance.get().getComponent(TomcatWebAppBuilder.class).init(StandardContext.class.cast(ctx)); + return ctx; + } + private static class TomcatWithFastSessionIDs extends Tomcat { @Override Modified: tomee/tomee/branches/tomee-1.7.x/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/EmbeddedTomEEContainer.java URL: http://svn.apache.org/viewvc/tomee/tomee/branches/tomee-1.7.x/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/EmbeddedTomEEContainer.java?rev=1624855&r1=1624854&r2=1624855&view=diff ============================================================================== --- tomee/tomee/branches/tomee-1.7.x/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/EmbeddedTomEEContainer.java (original) +++ tomee/tomee/branches/tomee-1.7.x/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/EmbeddedTomEEContainer.java Sun Sep 14 14:28:52 2014 @@ -71,7 +71,7 @@ public final class EmbeddedTomEEContaine deployedIds.clear(); try { - tomEEContainer.container.stop(); + tomEEContainer.container.close(); } catch (final Exception ex) { errors.add(ex); Logger.getInstance(LogCategory.OPENEJB, EmbeddedTomEEContainer.class).error(ex.getMessage(), ex); Modified: tomee/tomee/branches/tomee-1.7.x/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Main.java URL: http://svn.apache.org/viewvc/tomee/tomee/branches/tomee-1.7.x/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Main.java?rev=1624855&r1=1624854&r2=1624855&view=diff ============================================================================== --- tomee/tomee/branches/tomee-1.7.x/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Main.java (original) +++ tomee/tomee/branches/tomee-1.7.x/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Main.java Sun Sep 14 14:28:52 2014 @@ -47,10 +47,7 @@ public class Main { // run TomEE try { - final Container container = new Container(); - container.setup(createConfiguration(line)); - container.start(); - + final Container container = new Container(createConfiguration(line)); if (line.hasOption(PATH)) { final String[] contexts; if (line.hasOption(CONTEXT)) { Added: tomee/tomee/branches/tomee-1.7.x/tomee/tomee-embedded/src/test/java/org/apache/tomee/embedded/ManualDeploymentTest.java URL: http://svn.apache.org/viewvc/tomee/tomee/branches/tomee-1.7.x/tomee/tomee-embedded/src/test/java/org/apache/tomee/embedded/ManualDeploymentTest.java?rev=1624855&view=auto ============================================================================== --- tomee/tomee/branches/tomee-1.7.x/tomee/tomee-embedded/src/test/java/org/apache/tomee/embedded/ManualDeploymentTest.java (added) +++ tomee/tomee/branches/tomee-1.7.x/tomee/tomee-embedded/src/test/java/org/apache/tomee/embedded/ManualDeploymentTest.java Sun Sep 14 14:28:52 2014 @@ -0,0 +1,87 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.tomee.embedded; + +import org.apache.catalina.Context; +import org.apache.catalina.Wrapper; +import org.apache.catalina.startup.Tomcat; +import org.apache.openejb.loader.Files; +import org.apache.openejb.loader.IO; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.asset.EmptyAsset; +import org.jboss.shrinkwrap.api.exporter.ExplodedExporter; +import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.junit.Test; + +import javax.inject.Inject; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.IOException; +import java.net.URL; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + +public class ManualDeploymentTest { + @Test + public void run() throws Exception { + final Configuration configuration = new Configuration().randomHttpPort(); + configuration.setDir(Files.mkdirs(new File("target/" + getClass().getSimpleName() + "-tomcat")).getAbsolutePath()); + + final Container container = new Container(configuration); + try { + // tomee-embedded (this "container url" is filtered: name prefix + it is a directory (target/test-classes) + final File parent = Files.mkdirs(new File("target/" + getClass().getSimpleName())); + final File war = ShrinkWrap.create(WebArchive.class, "the-webapp") + .addClass(Foo.class) + .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml") // activate CDI + .as(ExplodedExporter.class) + .exportExploded(parent); + + final Context ctx = container.addContext("/", war.getAbsolutePath()); + + final Wrapper wrapper = Tomcat.addServlet(ctx, "awesome", AServlet.class.getName()); + ctx.addServletMapping("/awesome", wrapper.getName()); + + assertEquals("Awesome", IO.slurp(new URL("http://localhost:" + configuration.getHttpPort() + "/awesome")).trim()); + } catch (final Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } finally { + container.close(); + } + } + + public static class AServlet extends HttpServlet { + @Inject + private Foo foo; + + @Override + protected void service(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException { + resp.getWriter().write(foo.howIsIt()); + } + } + + public static class Foo { + public String howIsIt() { + return "Awesome"; + } + } +}