Repository: tomee Updated Branches: refs/heads/master eec7ca53e -> 2cef2ddbd
Delegate RemoteServer.destroy() to usage Project: http://git-wip-us.apache.org/repos/asf/tomee/repo Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/2cef2ddb Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/2cef2ddb Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/2cef2ddb Branch: refs/heads/master Commit: 2cef2ddbd3348c9001cba74201db914521e7ce94 Parents: eec7ca5 Author: [email protected] <[email protected]> Authored: Sat Nov 7 03:30:06 2015 +0100 Committer: [email protected] <[email protected]> Committed: Sat Nov 7 03:30:06 2015 +0100 ---------------------------------------------------------------------- .../arquillian/remote/RemoteTomEEContainer.java | 9 +- .../arquillian/webapp/TomEEWebappContainer.java | 11 +- .../org/apache/openejb/config/RemoteServer.java | 34 +- .../openejb/maven/plugin/AbstractTomEEMojo.java | 3 +- .../openejb/maven/plugin/runner/ExecRunner.java | 9 +- .../openejb/tck/impl/ContainersImplTomEE.java | 335 ++++++++++--------- .../openejb/tck/impl/FullRestartContainer.java | 273 +++++++-------- .../apache/tomee/RemoteTomEEEJBContainer.java | 331 +++++++++--------- 8 files changed, 525 insertions(+), 480 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tomee/blob/2cef2ddb/arquillian/arquillian-tomee-remote/src/main/java/org/apache/tomee/arquillian/remote/RemoteTomEEContainer.java ---------------------------------------------------------------------- diff --git a/arquillian/arquillian-tomee-remote/src/main/java/org/apache/tomee/arquillian/remote/RemoteTomEEContainer.java b/arquillian/arquillian-tomee-remote/src/main/java/org/apache/tomee/arquillian/remote/RemoteTomEEContainer.java index 110e113..e5ce343 100644 --- a/arquillian/arquillian-tomee-remote/src/main/java/org/apache/tomee/arquillian/remote/RemoteTomEEContainer.java +++ b/arquillian/arquillian-tomee-remote/src/main/java/org/apache/tomee/arquillian/remote/RemoteTomEEContainer.java @@ -116,7 +116,14 @@ public class RemoteTomEEContainer extends TomEEContainer<RemoteTomEEConfiguratio container = new RemoteServer(); container.setPortStartup(httpPort); - container.start(args(), "start", true); + + try { + container.start(args(), "start", true); + } catch (final Exception e) { + container.destroy(); + throw e; + } + container.killOnExit(); if (configuration.getProperties() != null) { http://git-wip-us.apache.org/repos/asf/tomee/blob/2cef2ddb/arquillian/arquillian-tomee-webapp-remote/src/main/java/org/apache/tomee/arquillian/webapp/TomEEWebappContainer.java ---------------------------------------------------------------------- diff --git a/arquillian/arquillian-tomee-webapp-remote/src/main/java/org/apache/tomee/arquillian/webapp/TomEEWebappContainer.java b/arquillian/arquillian-tomee-webapp-remote/src/main/java/org/apache/tomee/arquillian/webapp/TomEEWebappContainer.java index 90ca223..bfd8fc4 100644 --- a/arquillian/arquillian-tomee-webapp-remote/src/main/java/org/apache/tomee/arquillian/webapp/TomEEWebappContainer.java +++ b/arquillian/arquillian-tomee-webapp-remote/src/main/java/org/apache/tomee/arquillian/webapp/TomEEWebappContainer.java @@ -146,7 +146,13 @@ public class TomEEWebappContainer extends TomEEContainer<TomEEWebappConfiguratio final RemoteServer tmpContainer = new RemoteServer(); tmpContainer.setPortStartup(httpPort); - tmpContainer.start(); + + try { + tmpContainer.start(); + } catch (final Exception e) { + tmpContainer.destroy(); + throw e; + } final URL url = new URL(baseUrl); logger.info("Calling TomEE Installer Servlet on " + url); @@ -179,7 +185,8 @@ public class TomEEWebappContainer extends TomEEContainer<TomEEWebappConfiguratio "-Dorg.apache.openejb.servlet.filters=" + ArquillianFilterRunner.class.getName() + "=" + ServletMethodExecutor.ARQUILLIAN_SERVLET_MAPPING), "start", true); container.killOnExit(); } catch (final Exception e) { - throw new LifecycleException("Unable to start remote container", e); + if(null != container){container.destroy();} + throw new LifecycleException("Unable to start remote container on port: " + httpPort, e); } } http://git-wip-us.apache.org/repos/asf/tomee/blob/2cef2ddb/container/openejb-core/src/main/java/org/apache/openejb/config/RemoteServer.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/main/java/org/apache/openejb/config/RemoteServer.java b/container/openejb-core/src/main/java/org/apache/openejb/config/RemoteServer.java index 5de85cc..f024610 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/config/RemoteServer.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/config/RemoteServer.java @@ -37,6 +37,8 @@ import java.util.Properties; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; +import java.util.logging.Level; +import java.util.logging.Logger; /** * NOTE: Do not add inner or anonymous classes or a dependency without updating ExecMojo @@ -108,7 +110,13 @@ public class RemoteServer { public static void main(final String[] args) { assert args.length > 0 : "no arguments supplied: valid arguments are 'start' or 'stop'"; if (args[0].equalsIgnoreCase(START)) { - new RemoteServer().start(); + final RemoteServer remoteServer = new RemoteServer(); + try { + remoteServer.start(); + } catch (final Exception e) { + remoteServer.destroy(); + throw e; + } } else if (args[0].equalsIgnoreCase(STOP)) { final RemoteServer remoteServer = new RemoteServer(); remoteServer.serverHasAlreadyBeenStarted = false; @@ -136,16 +144,20 @@ public class RemoteServer { public void destroy() { - final boolean stopSent = stop(); + try { + final boolean stopSent = stop(); - final Process p = server.get(); - if (p != null) { + final Process p = server.get(); + if (p != null) { - if (stopSent) { - waitFor(p); - } else { - p.destroy(); + if (stopSent) { + waitFor(p); + } else { + p.destroy(); + } } + } catch (final Exception e) { + Logger.getLogger(RemoteServer.class.getName()).log(Level.WARNING, "Failed to destroy server", e); } } @@ -360,13 +372,11 @@ public class RemoteServer { if (port > 0) { if (debug) { if (!connect(port, Integer.MAX_VALUE)) { - destroy(); - throw new OpenEJBRuntimeException("Could not connect to server"); + throw new OpenEJBRuntimeException("Could not connect to server: " + this.host + ":" + port); } } else { if (!connect(port, tries)) { - destroy(); - throw new OpenEJBRuntimeException("Could not connect to server"); + throw new OpenEJBRuntimeException("Could not connect to server: " + this.host + ":" + port); } } } http://git-wip-us.apache.org/repos/asf/tomee/blob/2cef2ddb/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/AbstractTomEEMojo.java ---------------------------------------------------------------------- diff --git a/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/AbstractTomEEMojo.java b/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/AbstractTomEEMojo.java index d28a6c8..02444f6 100644 --- a/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/AbstractTomEEMojo.java +++ b/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/AbstractTomEEMojo.java @@ -1352,7 +1352,8 @@ public abstract class AbstractTomEEMojo extends AbstractAddressMojo { protected void serverCmd(final RemoteServer server, final List<String> strings) { try { server.start(strings, getCmd(), checkStarted); - } catch (final OpenEJBRuntimeException e) { + } catch (final Exception e) { + //TODO - Optional server.destroy() getLog().warn("Failed to check or track server startup on port: " + this.tomeeHttpPort); } } http://git-wip-us.apache.org/repos/asf/tomee/blob/2cef2ddb/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/runner/ExecRunner.java ---------------------------------------------------------------------- diff --git a/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/runner/ExecRunner.java b/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/runner/ExecRunner.java index 52132df..0b76bed 100644 --- a/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/runner/ExecRunner.java +++ b/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/runner/ExecRunner.java @@ -152,7 +152,14 @@ public class ExecRunner { if ("run".equals(args[0])) { args[0] = "start"; } - server.start(jvmArgs, args[0], true); + + try { + server.start(jvmArgs, args[0], true); + } catch (final Exception e) { + server.destroy(); + throw e; + } + if (doWait) { server.getServer().waitFor(); } http://git-wip-us.apache.org/repos/asf/tomee/blob/2cef2ddb/tck/tck-common/src/main/java/org/apache/openejb/tck/impl/ContainersImplTomEE.java ---------------------------------------------------------------------- diff --git a/tck/tck-common/src/main/java/org/apache/openejb/tck/impl/ContainersImplTomEE.java b/tck/tck-common/src/main/java/org/apache/openejb/tck/impl/ContainersImplTomEE.java index 40cf5c3..813ff75 100644 --- a/tck/tck-common/src/main/java/org/apache/openejb/tck/impl/ContainersImplTomEE.java +++ b/tck/tck-common/src/main/java/org/apache/openejb/tck/impl/ContainersImplTomEE.java @@ -1,165 +1,170 @@ -/* - * 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.openejb.tck.impl; - -import org.apache.openejb.assembler.Deployer; -import org.apache.openejb.assembler.classic.AppInfo; -import org.apache.openejb.client.RemoteInitialContextFactory; -import org.apache.openejb.config.RemoteServer; -import org.apache.openejb.config.ValidationException; -import org.apache.openejb.loader.Options; -import org.apache.openejb.tck.OpenEJBTCKRuntimeException; -import org.apache.openejb.tck.util.ServerLocal; -import org.jboss.testharness.api.DeploymentException; -import org.jboss.testharness.spi.Containers; - -import javax.naming.Context; -import javax.naming.InitialContext; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.util.Arrays; -import java.util.Properties; - -/** - * @version $Rev$ $Date$ - */ -public class ContainersImplTomEE extends AbstractContainers implements Containers { - private static int count = 0; - private final RemoteServer server; - private Deployer deployer = null; - private Exception exception; - private AppInfo appInfo; - private File currentFile = null; - private final int port = ServerLocal.getPort(8080); - - private Deployer lookup() { - final Options options = new Options(System.getProperties()); - final Properties props = new Properties(); - props.put(Context.INITIAL_CONTEXT_FACTORY, RemoteInitialContextFactory.class.getName()); - props.put(Context.PROVIDER_URL, options.get(Context.PROVIDER_URL, "http://localhost:" + port + "/tomee/ejb")); - - final String deployerJndi = System.getProperty("openejb.deployer.jndiname", "openejb/DeployerBusinessRemote"); - - try { - final InitialContext context = new InitialContext(props); - return (Deployer) context.lookup(deployerJndi); - } catch (final Exception e) { - throw new OpenEJBTCKRuntimeException(e); - } - } - - public ContainersImplTomEE() { - System.out.println("ContainersImpl=" + ContainersImplTomEE.class.getName()); - System.out.println("Initialized ContainersImplTomEE " + (++count) + ", wait port = " + port); - server = new RemoteServer(); - server.setPortStartup(this.port); - } - - @Override - public boolean deploy(final InputStream archive, final String name) throws IOException { - exception = null; - appInfo = null; - - System.out.println("Deploying " + archive + " with name " + name); - - currentFile = getFile(name); - System.out.println(currentFile); - writeToFile(currentFile, archive); - try { - if (deployer == null) { - deployer = lookup(); - } - appInfo = deployer.deploy(currentFile.getAbsolutePath()); - } catch (final Exception ex) { - Exception e = ex; - if (e.getCause() instanceof ValidationException) { - e = (Exception) e.getCause(); - } - - if (name.contains(".broken.")) { - // Tests that contain the name '.broken.' are expected to fail deployment - // This is how the TCK verifies the container is doing the required error checking - exception = (DeploymentException) new DeploymentException("deploy failed").initCause(e); - } else { - // This on the other hand is not good .... - System.out.println("FIX Deployment of " + name); - e.printStackTrace(); - exception = e; - } - - return false; - } - return true; - } - - @Override - public DeploymentException getDeploymentException() { - try { - return (DeploymentException) exception; - } catch (final Exception e) { - System.out.println("BADCAST"); - return new DeploymentException("", exception); - } - } - - @Override - public void undeploy(final String name) throws IOException { - if (appInfo == null) { - if (!(exception instanceof DeploymentException)) { - System.out.println("Nothing to undeploy" + name); - } - return; - } - - System.out.println("Undeploying " + name); - try { - deployer.undeploy(appInfo.path); - } catch (final Exception e) { - e.printStackTrace(); - throw new OpenEJBTCKRuntimeException(e); - } - - final File toDelete; - if (currentFile != null && (toDelete = currentFile.getParentFile()).exists()) { - System.out.println("deleting " + toDelete.getAbsolutePath()); - delete(toDelete); - } - } - - protected File getFile(final String name) { - final File dir = new File(tmpDir, Math.random() + ""); - if (!dir.exists() && !dir.mkdir()) { - throw new RuntimeException("Failed to create directory: " + dir); - } - dir.deleteOnExit(); - return new File(dir, name); - } - - @Override - public void setup() throws IOException { - System.out.println("Setup called"); - server.start(Arrays.asList("-Dopenejb.classloader.forced-load=org.apache.openejb.tck"), "start", true); - System.out.println("Started"); - } - - @Override - public void cleanup() throws IOException { - System.out.println("Cleanup called"); - server.destroy(); - } -} +/* + * 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.openejb.tck.impl; + +import org.apache.openejb.assembler.Deployer; +import org.apache.openejb.assembler.classic.AppInfo; +import org.apache.openejb.client.RemoteInitialContextFactory; +import org.apache.openejb.config.RemoteServer; +import org.apache.openejb.config.ValidationException; +import org.apache.openejb.loader.Options; +import org.apache.openejb.tck.OpenEJBTCKRuntimeException; +import org.apache.openejb.tck.util.ServerLocal; +import org.jboss.testharness.api.DeploymentException; +import org.jboss.testharness.spi.Containers; + +import javax.naming.Context; +import javax.naming.InitialContext; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.Arrays; +import java.util.Properties; + +/** + * @version $Rev$ $Date$ + */ +public class ContainersImplTomEE extends AbstractContainers implements Containers { + private static int count = 0; + private final RemoteServer server; + private Deployer deployer = null; + private Exception exception; + private AppInfo appInfo; + private File currentFile = null; + private final int port = ServerLocal.getPort(8080); + + private Deployer lookup() { + final Options options = new Options(System.getProperties()); + final Properties props = new Properties(); + props.put(Context.INITIAL_CONTEXT_FACTORY, RemoteInitialContextFactory.class.getName()); + props.put(Context.PROVIDER_URL, options.get(Context.PROVIDER_URL, "http://localhost:" + port + "/tomee/ejb")); + + final String deployerJndi = System.getProperty("openejb.deployer.jndiname", "openejb/DeployerBusinessRemote"); + + try { + final InitialContext context = new InitialContext(props); + return (Deployer) context.lookup(deployerJndi); + } catch (final Exception e) { + throw new OpenEJBTCKRuntimeException(e); + } + } + + public ContainersImplTomEE() { + System.out.println("ContainersImpl=" + ContainersImplTomEE.class.getName()); + System.out.println("Initialized ContainersImplTomEE " + (++count) + ", wait port = " + port); + server = new RemoteServer(); + server.setPortStartup(this.port); + } + + @Override + public boolean deploy(final InputStream archive, final String name) throws IOException { + exception = null; + appInfo = null; + + System.out.println("Deploying " + archive + " with name " + name); + + currentFile = getFile(name); + System.out.println(currentFile); + writeToFile(currentFile, archive); + try { + if (deployer == null) { + deployer = lookup(); + } + appInfo = deployer.deploy(currentFile.getAbsolutePath()); + } catch (final Exception ex) { + Exception e = ex; + if (e.getCause() instanceof ValidationException) { + e = (Exception) e.getCause(); + } + + if (name.contains(".broken.")) { + // Tests that contain the name '.broken.' are expected to fail deployment + // This is how the TCK verifies the container is doing the required error checking + exception = (DeploymentException) new DeploymentException("deploy failed").initCause(e); + } else { + // This on the other hand is not good .... + System.out.println("FIX Deployment of " + name); + e.printStackTrace(); + exception = e; + } + + return false; + } + return true; + } + + @Override + public DeploymentException getDeploymentException() { + try { + return (DeploymentException) exception; + } catch (final Exception e) { + System.out.println("BADCAST"); + return new DeploymentException("", exception); + } + } + + @Override + public void undeploy(final String name) throws IOException { + if (appInfo == null) { + if (!(exception instanceof DeploymentException)) { + System.out.println("Nothing to undeploy" + name); + } + return; + } + + System.out.println("Undeploying " + name); + try { + deployer.undeploy(appInfo.path); + } catch (final Exception e) { + e.printStackTrace(); + throw new OpenEJBTCKRuntimeException(e); + } + + final File toDelete; + if (currentFile != null && (toDelete = currentFile.getParentFile()).exists()) { + System.out.println("deleting " + toDelete.getAbsolutePath()); + delete(toDelete); + } + } + + protected File getFile(final String name) { + final File dir = new File(tmpDir, Math.random() + ""); + if (!dir.exists() && !dir.mkdir()) { + throw new RuntimeException("Failed to create directory: " + dir); + } + dir.deleteOnExit(); + return new File(dir, name); + } + + @Override + public void setup() throws IOException { + System.out.println("Setup called"); + try { + server.start(Arrays.asList("-Dopenejb.classloader.forced-load=org.apache.openejb.tck"), "start", true); + } catch (final Exception e) { + cleanup(); + throw e; + } + System.out.println("Started"); + } + + @Override + public void cleanup() throws IOException { + System.out.println("Cleanup called"); + server.destroy(); + } +} http://git-wip-us.apache.org/repos/asf/tomee/blob/2cef2ddb/tck/tck-common/src/main/java/org/apache/openejb/tck/impl/FullRestartContainer.java ---------------------------------------------------------------------- diff --git a/tck/tck-common/src/main/java/org/apache/openejb/tck/impl/FullRestartContainer.java b/tck/tck-common/src/main/java/org/apache/openejb/tck/impl/FullRestartContainer.java index 090a816..98d00e6 100644 --- a/tck/tck-common/src/main/java/org/apache/openejb/tck/impl/FullRestartContainer.java +++ b/tck/tck-common/src/main/java/org/apache/openejb/tck/impl/FullRestartContainer.java @@ -1,136 +1,137 @@ -/* - * 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.openejb.tck.impl; - -import org.apache.openejb.client.RemoteInitialContextFactory; -import org.apache.openejb.config.RemoteServer; -import org.apache.openejb.loader.Options; -import org.apache.openejb.tck.OpenEJBTCKRuntimeException; -import org.apache.openejb.tck.util.ServerLocal; -import org.apache.tomee.catalina.facade.ExceptionManagerFacade; -import org.jboss.testharness.api.DeploymentException; -import org.jboss.testharness.spi.Containers; - -import javax.naming.Context; -import javax.naming.InitialContext; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.util.Properties; - -/** - * flow: - * - copy file - * - start the server - * - stop the server - * - remove the file - */ -public class FullRestartContainer extends AbstractContainers implements Containers { - private static final File WEBAPP_DIR = new File(System.getProperty("openejb.home"), "webapps/"); - private static final File APPS_DIR = new File(System.getProperty("openejb.home"), "apps/"); - - private RemoteServer server; - private Exception exception; - private File currentFile; - - public FullRestartContainer() { - System.out.println("ContainersImpl=" + FullRestartContainer.class.getName()); - } - - @Override - public DeploymentException getDeploymentException() { - if (exception instanceof DeploymentException) { - return (DeploymentException) exception; - } - System.out.println("BADCAST"); - return new DeploymentException("", exception); - } - - @Override - public boolean deploy(final InputStream archive, final String name) throws IOException { - if (name.endsWith("war")) { - currentFile = new File(WEBAPP_DIR, name); - } else { - currentFile = new File(APPS_DIR, name); - } - - System.out.println(currentFile); - writeToFile(currentFile, archive); - - final int port = ServerLocal.getPort(-1); - if (port > 0) { - server = new RemoteServer(100, true); - server.setPortStartup(port); - } else { - throw new OpenEJBTCKRuntimeException("Please set the tomee port using the system property 'server.http.port'"); - } - - try { - server.start(); - } catch (final RuntimeException e) { - e.printStackTrace(); - throw e; - } - - return (exception = lookup().exception()) == null; - } - - @Override - public void undeploy(final String name) throws IOException { - - if (null != server) { - server.destroy(); - } - - final File folder = new File(currentFile.getParentFile(), currentFile.getName().substring(0, currentFile.getName().length() - 4)); - if (folder.exists()) { - delete(folder); - } - delete(currentFile); - } - - @Override - public void setup() throws IOException { - // no-op - } - - @Override - public void cleanup() throws IOException { - // no-op - } - - private ExceptionManagerFacade lookup() { - final Options options = new Options(System.getProperties()); - final Properties props = new Properties(); - props.put(Context.INITIAL_CONTEXT_FACTORY, RemoteInitialContextFactory.class.getName()); - final int port = ServerLocal.getPort(-1); - if (port > 0) { - System.out.println("provider url = " + "http://localhost:" + port + "/tomee/ejb"); - props.put(Context.PROVIDER_URL, options.get(Context.PROVIDER_URL, "http://localhost:" + port + "/tomee/ejb")); - } else { - throw new OpenEJBTCKRuntimeException("Please set the tomee port using the system property 'server.http.port'"); - } - - try { - final InitialContext context = new InitialContext(props); - return (ExceptionManagerFacade) context.lookup("openejb/ExceptionManagerFacadeBusinessRemote"); - } catch (final Exception e) { - throw new OpenEJBTCKRuntimeException(e); - } - } -} +/* + * 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.openejb.tck.impl; + +import org.apache.openejb.client.RemoteInitialContextFactory; +import org.apache.openejb.config.RemoteServer; +import org.apache.openejb.loader.Options; +import org.apache.openejb.tck.OpenEJBTCKRuntimeException; +import org.apache.openejb.tck.util.ServerLocal; +import org.apache.tomee.catalina.facade.ExceptionManagerFacade; +import org.jboss.testharness.api.DeploymentException; +import org.jboss.testharness.spi.Containers; + +import javax.naming.Context; +import javax.naming.InitialContext; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; + +/** + * flow: + * - copy file + * - start the server + * - stop the server + * - remove the file + */ +public class FullRestartContainer extends AbstractContainers implements Containers { + private static final File WEBAPP_DIR = new File(System.getProperty("openejb.home"), "webapps/"); + private static final File APPS_DIR = new File(System.getProperty("openejb.home"), "apps/"); + + private RemoteServer server; + private Exception exception; + private File currentFile; + + public FullRestartContainer() { + System.out.println("ContainersImpl=" + FullRestartContainer.class.getName()); + } + + @Override + public DeploymentException getDeploymentException() { + if (exception instanceof DeploymentException) { + return (DeploymentException) exception; + } + System.out.println("BADCAST"); + return new DeploymentException("", exception); + } + + @Override + public boolean deploy(final InputStream archive, final String name) throws IOException { + if (name.endsWith("war")) { + currentFile = new File(WEBAPP_DIR, name); + } else { + currentFile = new File(APPS_DIR, name); + } + + System.out.println(currentFile); + writeToFile(currentFile, archive); + + final int port = ServerLocal.getPort(-1); + if (port > 0) { + server = new RemoteServer(100, true); + server.setPortStartup(port); + } else { + throw new OpenEJBTCKRuntimeException("Please set the tomee port using the system property 'server.http.port'"); + } + + try { + server.start(); + } catch (final Exception e) { + server.destroy(); + e.printStackTrace(); + throw e; + } + + return (exception = lookup().exception()) == null; + } + + @Override + public void undeploy(final String name) throws IOException { + + if (null != server) { + server.destroy(); + } + + final File folder = new File(currentFile.getParentFile(), currentFile.getName().substring(0, currentFile.getName().length() - 4)); + if (folder.exists()) { + delete(folder); + } + delete(currentFile); + } + + @Override + public void setup() throws IOException { + // no-op + } + + @Override + public void cleanup() throws IOException { + // no-op + } + + private ExceptionManagerFacade lookup() { + final Options options = new Options(System.getProperties()); + final Properties props = new Properties(); + props.put(Context.INITIAL_CONTEXT_FACTORY, RemoteInitialContextFactory.class.getName()); + final int port = ServerLocal.getPort(-1); + if (port > 0) { + System.out.println("provider url = " + "http://localhost:" + port + "/tomee/ejb"); + props.put(Context.PROVIDER_URL, options.get(Context.PROVIDER_URL, "http://localhost:" + port + "/tomee/ejb")); + } else { + throw new OpenEJBTCKRuntimeException("Please set the tomee port using the system property 'server.http.port'"); + } + + try { + final InitialContext context = new InitialContext(props); + return (ExceptionManagerFacade) context.lookup("openejb/ExceptionManagerFacadeBusinessRemote"); + } catch (final Exception e) { + throw new OpenEJBTCKRuntimeException(e); + } + } +} http://git-wip-us.apache.org/repos/asf/tomee/blob/2cef2ddb/tomee/apache-tomee/src/main/java/org/apache/tomee/RemoteTomEEEJBContainer.java ---------------------------------------------------------------------- diff --git a/tomee/apache-tomee/src/main/java/org/apache/tomee/RemoteTomEEEJBContainer.java b/tomee/apache-tomee/src/main/java/org/apache/tomee/RemoteTomEEEJBContainer.java index 189bc12..bc3f961 100644 --- a/tomee/apache-tomee/src/main/java/org/apache/tomee/RemoteTomEEEJBContainer.java +++ b/tomee/apache-tomee/src/main/java/org/apache/tomee/RemoteTomEEEJBContainer.java @@ -1,162 +1,169 @@ -/** - * 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; - -import org.apache.geronimo.osgi.locator.ProviderLocator; -import org.apache.openejb.OpenEJBException; -import org.apache.openejb.assembler.Deployer; -import org.apache.openejb.assembler.DeployerEjb; -import org.apache.openejb.client.RemoteInitialContextFactory; -import org.apache.openejb.config.RemoteServer; -import org.apache.openejb.loader.IO; -import org.apache.tomee.util.QuickServerXmlParser; - -import javax.ejb.EJBException; -import javax.ejb.embeddable.EJBContainer; -import javax.ejb.spi.EJBContainerProvider; -import javax.naming.Context; -import javax.naming.InitialContext; -import javax.validation.ValidationException; -import java.io.File; -import java.io.IOException; -import java.net.MalformedURLException; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.Properties; - -public class RemoteTomEEEJBContainer extends EJBContainer { - private static RemoteTomEEEJBContainer instance; - private RemoteServer container; - private InitialContext context; - - @Override - public void close() { - instance.container.destroy(); - instance.container = null; - } - - @Override - public Context getContext() { - return context; - } - - public static class Provider implements EJBContainerProvider { - private static final List<String> CONTAINER_NAMES = Arrays.asList(RemoteTomEEEJBContainer.class.getName(), "tomee-remote", "remote-tomee"); - - @Override - public EJBContainer createEJBContainer(final Map<?, ?> properties) { - final Object provider = properties.get(EJBContainer.PROVIDER); - int ejbContainerProviders = 1; - try { - ejbContainerProviders = ProviderLocator.getServices(EJBContainerProvider.class.getName(), EJBContainer.class, Thread.currentThread().getContextClassLoader()).size(); - } catch (final Exception e) { - // no-op - } - - if ((provider == null && ejbContainerProviders > 1) - || (!RemoteTomEEEJBContainer.class.equals(provider) - && !CONTAINER_NAMES.contains(String.valueOf(provider)))) { - return null; - } - - if (instance != null) { - return instance; - } - - final Object modules = properties.get(EJBContainer.MODULES); - - System.getProperties().putAll(properties); - final File home = new File(System.getProperty("openejb.home", "doesn't exist")); - if (!home.exists()) { - throw new IllegalArgumentException("You need to set openejb.home"); - } - - final QuickServerXmlParser parser = QuickServerXmlParser.parse(new File(home, "conf/server.xml")); - final String remoteEjb = System.getProperty(Context.PROVIDER_URL, "http://" + parser.host() + ":" + parser.http() + "/tomee/ejb"); - System.setProperty(RemoteServer.SERVER_SHUTDOWN_PORT, parser.stop()); - - try { - instance = new RemoteTomEEEJBContainer(); - instance.container = new RemoteServer(); - instance.container.setPortStartup(Integer.parseInt(parser.http())); - instance.container.start(); - instance.context = new InitialContext(new Properties() {{ - setProperty(Context.INITIAL_CONTEXT_FACTORY, RemoteInitialContextFactory.class.getName()); - setProperty(Context.PROVIDER_URL, remoteEjb); - }}); - - Deployer deployer = null; - for (int i = 0; i < (properties.containsKey("retries") ? Integer.parseInt(String.class.cast(properties.get("retries"))) : 20); i++) { - deployer = Deployer.class.cast(instance.context.lookup("openejb/DeployerBusinessRemote")); - if (deployer != null) { - break; - } - } - if (deployer == null) { - throw new TomEERemoteEJBContainerException("Can't lookup deployer, eother increse retries or setup it correctly", new IllegalStateException()); - } - - if (modules instanceof File) { - final File file = File.class.cast(modules); - deployFile(deployer, file); - } else if (modules instanceof String) { - final String path = String.class.cast(modules); - final File file = new File(path); - deployFile(deployer, file); - } else if (modules instanceof String[]) { - for (final String path : (String[]) modules) { - deployFile(deployer, new File(path)); - } - } else if (modules instanceof File[]) { - for (final File file : (File[]) modules) { - deployFile(deployer, file); - } - } // else suppose already deployed - - return instance; - } catch (final OpenEJBException | MalformedURLException e) { - throw new EJBException(e); - } catch (final ValidationException ve) { - throw ve; - } catch (final Exception e) { - if (e instanceof EJBException) { - throw (EJBException) e; - } - throw new TomEERemoteEJBContainerException("initialization exception", e); - } - } - } - - private static void deployFile(final Deployer deployer, final File file) throws IOException, OpenEJBException { - if ("true".equalsIgnoreCase(System.getProperty(DeployerEjb.OPENEJB_USE_BINARIES, "false"))) { - final Properties props = new Properties(); - final byte[] slurpBinaries = IO.slurp(file).getBytes(); - props.put(DeployerEjb.OPENEJB_VALUE_BINARIES, slurpBinaries); - props.put(DeployerEjb.OPENEJB_PATH_BINARIES, file.getName()); - deployer.deploy(file.getAbsolutePath(), props); - } else { - deployer.deploy(file.getAbsolutePath()); - } - } - - protected static class TomEERemoteEJBContainerException extends RuntimeException { - protected TomEERemoteEJBContainerException(final String s, final Exception e) { - super(s, e); - } - } -} +/** + * 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; + +import org.apache.geronimo.osgi.locator.ProviderLocator; +import org.apache.openejb.OpenEJBException; +import org.apache.openejb.assembler.Deployer; +import org.apache.openejb.assembler.DeployerEjb; +import org.apache.openejb.client.RemoteInitialContextFactory; +import org.apache.openejb.config.RemoteServer; +import org.apache.openejb.loader.IO; +import org.apache.tomee.util.QuickServerXmlParser; + +import javax.ejb.EJBException; +import javax.ejb.embeddable.EJBContainer; +import javax.ejb.spi.EJBContainerProvider; +import javax.naming.Context; +import javax.naming.InitialContext; +import javax.validation.ValidationException; +import java.io.File; +import java.io.IOException; +import java.net.MalformedURLException; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Properties; + +public class RemoteTomEEEJBContainer extends EJBContainer { + private static RemoteTomEEEJBContainer instance; + private RemoteServer container; + private InitialContext context; + + @Override + public void close() { + instance.container.destroy(); + instance.container = null; + } + + @Override + public Context getContext() { + return context; + } + + public static class Provider implements EJBContainerProvider { + private static final List<String> CONTAINER_NAMES = Arrays.asList(RemoteTomEEEJBContainer.class.getName(), "tomee-remote", "remote-tomee"); + + @Override + public EJBContainer createEJBContainer(final Map<?, ?> properties) { + final Object provider = properties.get(EJBContainer.PROVIDER); + int ejbContainerProviders = 1; + try { + ejbContainerProviders = ProviderLocator.getServices(EJBContainerProvider.class.getName(), EJBContainer.class, Thread.currentThread().getContextClassLoader()).size(); + } catch (final Exception e) { + // no-op + } + + if ((provider == null && ejbContainerProviders > 1) + || (!RemoteTomEEEJBContainer.class.equals(provider) + && !CONTAINER_NAMES.contains(String.valueOf(provider)))) { + return null; + } + + if (instance != null) { + return instance; + } + + final Object modules = properties.get(EJBContainer.MODULES); + + System.getProperties().putAll(properties); + final File home = new File(System.getProperty("openejb.home", "doesn't exist")); + if (!home.exists()) { + throw new IllegalArgumentException("You need to set openejb.home"); + } + + final QuickServerXmlParser parser = QuickServerXmlParser.parse(new File(home, "conf/server.xml")); + final String remoteEjb = System.getProperty(Context.PROVIDER_URL, "http://" + parser.host() + ":" + parser.http() + "/tomee/ejb"); + System.setProperty(RemoteServer.SERVER_SHUTDOWN_PORT, parser.stop()); + + try { + instance = new RemoteTomEEEJBContainer(); + instance.container = new RemoteServer(); + instance.container.setPortStartup(Integer.parseInt(parser.http())); + + try { + instance.container.start(); + } catch (final Exception e) { + instance.container.destroy(); + throw e; + } + + instance.context = new InitialContext(new Properties() {{ + setProperty(Context.INITIAL_CONTEXT_FACTORY, RemoteInitialContextFactory.class.getName()); + setProperty(Context.PROVIDER_URL, remoteEjb); + }}); + + Deployer deployer = null; + for (int i = 0; i < (properties.containsKey("retries") ? Integer.parseInt(String.class.cast(properties.get("retries"))) : 20); i++) { + deployer = Deployer.class.cast(instance.context.lookup("openejb/DeployerBusinessRemote")); + if (deployer != null) { + break; + } + } + if (deployer == null) { + throw new TomEERemoteEJBContainerException("Can't lookup deployer, eother increse retries or setup it correctly", new IllegalStateException()); + } + + if (modules instanceof File) { + final File file = File.class.cast(modules); + deployFile(deployer, file); + } else if (modules instanceof String) { + final String path = String.class.cast(modules); + final File file = new File(path); + deployFile(deployer, file); + } else if (modules instanceof String[]) { + for (final String path : (String[]) modules) { + deployFile(deployer, new File(path)); + } + } else if (modules instanceof File[]) { + for (final File file : (File[]) modules) { + deployFile(deployer, file); + } + } // else suppose already deployed + + return instance; + } catch (final OpenEJBException | MalformedURLException e) { + throw new EJBException(e); + } catch (final ValidationException ve) { + throw ve; + } catch (final Exception e) { + if (e instanceof EJBException) { + throw (EJBException) e; + } + throw new TomEERemoteEJBContainerException("initialization exception", e); + } + } + } + + private static void deployFile(final Deployer deployer, final File file) throws IOException, OpenEJBException { + if ("true".equalsIgnoreCase(System.getProperty(DeployerEjb.OPENEJB_USE_BINARIES, "false"))) { + final Properties props = new Properties(); + final byte[] slurpBinaries = IO.slurp(file).getBytes(); + props.put(DeployerEjb.OPENEJB_VALUE_BINARIES, slurpBinaries); + props.put(DeployerEjb.OPENEJB_PATH_BINARIES, file.getName()); + deployer.deploy(file.getAbsolutePath(), props); + } else { + deployer.deploy(file.getAbsolutePath()); + } + } + + protected static class TomEERemoteEJBContainerException extends RuntimeException { + protected TomEERemoteEJBContainerException(final String s, final Exception e) { + super(s, e); + } + } +}
