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