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/05/26 23:04:14 UTC
svn commit: r1597647 - in /tomee/tomee/trunk/tomee: apache-tomee/
apache-tomee/src/main/java/ apache-tomee/src/main/java/org/
apache-tomee/src/main/java/org/apache/
apache-tomee/src/main/java/org/apache/tomee/
apache-tomee/src/main/resources/META-INF/s...
Author: rmannibucau
Date: Mon May 26 21:04:13 2014
New Revision: 1597647
URL: http://svn.apache.org/r1597647
Log:
TOMEE-1224 TomEE Remote EJBContainer
Added:
tomee/tomee/trunk/tomee/apache-tomee/src/main/java/
tomee/tomee/trunk/tomee/apache-tomee/src/main/java/org/
tomee/tomee/trunk/tomee/apache-tomee/src/main/java/org/apache/
tomee/tomee/trunk/tomee/apache-tomee/src/main/java/org/apache/tomee/
tomee/tomee/trunk/tomee/apache-tomee/src/main/java/org/apache/tomee/RemoteTomEEEJBContainer.java
tomee/tomee/trunk/tomee/apache-tomee/src/main/resources/META-INF/services/
tomee/tomee/trunk/tomee/apache-tomee/src/main/resources/META-INF/services/javax.ejb.spi.EJBContainerProvider
tomee/tomee/trunk/tomee/apache-tomee/src/test/
tomee/tomee/trunk/tomee/apache-tomee/src/test/java/
tomee/tomee/trunk/tomee/apache-tomee/src/test/java/org/
tomee/tomee/trunk/tomee/apache-tomee/src/test/java/org/apache/
tomee/tomee/trunk/tomee/apache-tomee/src/test/java/org/apache/tomee/
tomee/tomee/trunk/tomee/apache-tomee/src/test/java/org/apache/tomee/RemoteTomEEEJBContainerIT.java
Modified:
tomee/tomee/trunk/tomee/apache-tomee/pom.xml
tomee/tomee/trunk/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/EmbeddedTomEEContainer.java
Modified: tomee/tomee/trunk/tomee/apache-tomee/pom.xml
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/apache-tomee/pom.xml?rev=1597647&r1=1597646&r2=1597647&view=diff
==============================================================================
--- tomee/tomee/trunk/tomee/apache-tomee/pom.xml (original)
+++ tomee/tomee/trunk/tomee/apache-tomee/pom.xml Mon May 26 21:04:13 2014
@@ -29,7 +29,7 @@
<modelVersion>4.0.0</modelVersion>
<artifactId>apache-tomee</artifactId>
- <packaging>pom</packaging>
+ <packaging>jar</packaging>
<name>OpenEJB :: TomEE :: Apache TomEE</name>
<properties>
@@ -105,6 +105,18 @@
<type>war</type>
<scope>provided</scope>
</dependency>
+
+ <!-- needed for EJBContainer impl so scope compile -->
+ <dependency>
+ <groupId>org.apache.openejb</groupId>
+ <artifactId>tomee-util</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.openejb</groupId>
+ <artifactId>openejb-client</artifactId>
+ <version>4.7.0-SNAPSHOT</version>
+ </dependency>
</dependencies>
<build>
@@ -128,6 +140,30 @@
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-jar-plugin</artifactId>
+ <version>2.4</version>
+ <configuration>
+ <includes>
+ <include>**/RemoteTomEEEJBContainer*.class</include>
+ <include>**/META-INF/services/javax.ejb.spi.EJBContainerProvider</include>
+ </includes>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-failsafe-plugin</artifactId>
+ <version>2.17</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>integration-test</goal>
+ <goal>verify</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<executions>
<execution>
Added: tomee/tomee/trunk/tomee/apache-tomee/src/main/java/org/apache/tomee/RemoteTomEEEJBContainer.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/apache-tomee/src/main/java/org/apache/tomee/RemoteTomEEEJBContainer.java?rev=1597647&view=auto
==============================================================================
--- tomee/tomee/trunk/tomee/apache-tomee/src/main/java/org/apache/tomee/RemoteTomEEEJBContainer.java (added)
+++ tomee/tomee/trunk/tomee/apache-tomee/src/main/java/org/apache/tomee/RemoteTomEEEJBContainer.java Mon May 26 21:04:13 2014
@@ -0,0 +1,153 @@
+/**
+ * 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 = null;
+ private RemoteServer container = null;
+ private InitialContext context = null;
+
+ @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");
+
+ try {
+ instance = new RemoteTomEEEJBContainer();
+ instance.container = new RemoteServer();
+ instance.container.start();
+ instance.context = new InitialContext(new Properties() {{
+ setProperty(Context.INITIAL_CONTEXT_FACTORY, RemoteInitialContextFactory.class.getName());
+ setProperty(Context.PROVIDER_URL, remoteEjb);
+ }});
+
+ final Deployer deployer = Deployer.class.cast(instance.context.lookup("openejb/DeployerBusinessRemote"));
+
+ 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 e) {
+ throw new EJBException(e);
+ } catch (final 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(Deployer deployer, 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);
+ }
+ }
+}
Added: tomee/tomee/trunk/tomee/apache-tomee/src/main/resources/META-INF/services/javax.ejb.spi.EJBContainerProvider
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/apache-tomee/src/main/resources/META-INF/services/javax.ejb.spi.EJBContainerProvider?rev=1597647&view=auto
==============================================================================
--- tomee/tomee/trunk/tomee/apache-tomee/src/main/resources/META-INF/services/javax.ejb.spi.EJBContainerProvider (added)
+++ tomee/tomee/trunk/tomee/apache-tomee/src/main/resources/META-INF/services/javax.ejb.spi.EJBContainerProvider Mon May 26 21:04:13 2014
@@ -0,0 +1 @@
+org.apache.tomee.RemoteTomEEEJBContainer$Provider
Added: tomee/tomee/trunk/tomee/apache-tomee/src/test/java/org/apache/tomee/RemoteTomEEEJBContainerIT.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/apache-tomee/src/test/java/org/apache/tomee/RemoteTomEEEJBContainerIT.java?rev=1597647&view=auto
==============================================================================
--- tomee/tomee/trunk/tomee/apache-tomee/src/test/java/org/apache/tomee/RemoteTomEEEJBContainerIT.java (added)
+++ tomee/tomee/trunk/tomee/apache-tomee/src/test/java/org/apache/tomee/RemoteTomEEEJBContainerIT.java Mon May 26 21:04:13 2014
@@ -0,0 +1,62 @@
+/**
+ * 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.openejb.loader.Files;
+import org.apache.openejb.loader.IO;
+import org.junit.Test;
+
+import javax.ejb.embeddable.EJBContainer;
+import java.io.File;
+import java.io.FileFilter;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.net.URL;
+import java.util.HashMap;
+
+import static org.junit.Assert.assertEquals;
+
+public class RemoteTomEEEJBContainerIT {
+ @Test
+ public void run() throws IOException {
+ final File app = new File("target/mock/webapp");
+ Files.mkdirs(app);
+
+ final FileWriter writer = new FileWriter(new File(app, "index.html"));
+ writer.write("Hello");
+ writer.close();
+
+ EJBContainer container = null;
+ try {
+ container = EJBContainer.createEJBContainer(new HashMap<Object, Object>() {{
+ put(EJBContainer.PROVIDER, "tomee-remote");
+ put(EJBContainer.MODULES, app.getAbsolutePath());
+ put("openejb.home", new File("target/webprofile-work-dir/").listFiles(new FileFilter() {
+ @Override
+ public boolean accept(final File pathname) {
+ return pathname.isDirectory() && pathname.getName().startsWith("apache-tomcat-");
+ }
+ })[0].getAbsolutePath());
+ }});
+ assertEquals("Hello", IO.slurp(new URL("http://localhost:8080/webapp/index.html")));
+ } finally {
+ if (container != null) {
+ container.close();
+ }
+ }
+ }
+}
Modified: tomee/tomee/trunk/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/EmbeddedTomEEContainer.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/EmbeddedTomEEContainer.java?rev=1597647&r1=1597646&r2=1597647&view=diff
==============================================================================
--- tomee/tomee/trunk/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/EmbeddedTomEEContainer.java (original)
+++ tomee/tomee/trunk/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/EmbeddedTomEEContainer.java Mon May 26 21:04:13 2014
@@ -101,7 +101,7 @@ public class EmbeddedTomEEContainer exte
if ((provider == null && ejbContainerProviders > 1)
|| (!EmbeddedTomEEContainer.class.equals(provider)
- && !CONTAINER_NAMES.contains(provider))) {
+ && !CONTAINER_NAMES.contains(String.valueOf(provider)))) {
return null;
}