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 2016/03/01 18:37:18 UTC

tomee git commit: fixing RemoteTomEEEJBContainer and avoiding to loose some system properties

Repository: tomee
Updated Branches:
  refs/heads/master 58cdbbef9 -> a71d6ee27


fixing RemoteTomEEEJBContainer and avoiding to loose some system properties


Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/a71d6ee2
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/a71d6ee2
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/a71d6ee2

Branch: refs/heads/master
Commit: a71d6ee27d1d05331d62960c02bd132f08e06f61
Parents: 58cdbbe
Author: Romain manni-Bucau <rm...@gmail.com>
Authored: Tue Mar 1 18:37:04 2016 +0100
Committer: Romain manni-Bucau <rm...@gmail.com>
Committed: Tue Mar 1 18:37:04 2016 +0100

----------------------------------------------------------------------
 .../apache/openejb/arquillian/common/Setup.java | 12 ++++++
 .../arquillian/common/TomEEContainer.java       | 11 ++++++
 .../embedded/EmbeddedTomEEConfiguration.java    |  1 +
 .../embedded/EmbeddedTomEEContainer.java        |  2 +
 .../arquillian/remote/RemoteTomEEContainer.java |  8 +++-
 .../arquillian/webapp/TomEEWebappContainer.java |  8 +++-
 .../core/rmi/BlacklistClassResolver.java        |  3 ++
 .../apache/openejb/loader/SystemInstance.java   | 19 ++++++++--
 .../openejb/client/EjbObjectInputStream.java    | 40 ++++++++++++--------
 .../apache/tomee/RemoteTomEEEJBContainer.java   | 16 +++++++-
 10 files changed, 95 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tomee/blob/a71d6ee2/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/Setup.java
----------------------------------------------------------------------
diff --git a/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/Setup.java b/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/Setup.java
index 7db26ba..a369129 100644
--- a/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/Setup.java
+++ b/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/Setup.java
@@ -32,6 +32,7 @@ import java.io.File;
 import java.io.FileFilter;
 import java.io.IOException;
 import java.io.InputStream;
+import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.net.Socket;
 import java.util.Collection;
@@ -306,6 +307,8 @@ public class Setup {
         if (configuration.isUnsafeEjbd() && "*".equals(properties.getProperty("tomee.serialization.class.blacklist", "-").trim())) {
             properties.remove("tomee.serialization.class.blacklist");
             properties.put("tomee.serialization.class.whitelist", "*");
+            System.setProperty("tomee.serialization.class.blacklist", System.getProperty("tomee.serialization.class.blacklist", "-"));
+            reloadClientSerializationConfig();
         }
 
         try {
@@ -315,6 +318,15 @@ public class Setup {
         }
     }
 
+    public static void reloadClientSerializationConfig() {
+        try {
+            Thread.currentThread().getContextClassLoader().loadClass("org.apache.openejb.client.EjbObjectInputStream")
+                .getMethod("reloadResolverConfig").invoke(null);
+        } catch (final IllegalAccessException | InvocationTargetException | ClassNotFoundException | NoSuchMethodException e) {
+            // not a pb normally
+        }
+    }
+
 
     public static void synchronizeFolder(final File tomeeHome, final String src, final String dir) {
         if (src != null && !src.isEmpty()) {

http://git-wip-us.apache.org/repos/asf/tomee/blob/a71d6ee2/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java
----------------------------------------------------------------------
diff --git a/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java b/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java
index 5ac79d2..944c3f6 100644
--- a/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java
+++ b/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java
@@ -77,6 +77,13 @@ public abstract class TomEEContainer<Configuration extends TomEEConfiguration> i
         this.options = new Options(System.getProperties());
     }
 
+    protected void resetSerialization() {
+        if (this.configuration.isUnsafeEjbd() && "-".equals(System.getProperty("tomee.serialization.class.blacklist"))) {
+            System.clearProperty("tomee.serialization.class.blacklist");
+            Setup.reloadClientSerializationConfig();
+        }
+    }
+
     protected boolean isTestable(final Archive<?> archive, final DeploymentDescription deploymentDescription) {
         return deploymentDescription != null
                 && deploymentDescription.isArchiveDeployment()
@@ -220,6 +227,10 @@ public abstract class TomEEContainer<Configuration extends TomEEConfiguration> i
             waitForShutdown(socket, 10);
         } catch (final Exception e) {
             throw new LifecycleException("Unable to stop TomEE", e);
+        } finally {
+            if (this.configuration.isUnsafeEjbd() && "-".equals(System.getProperty("tomee.serialization.class.blacklist"))) {
+                System.clearProperty("tomee.serialization.class.blacklist");
+            }
         }
     }
 

http://git-wip-us.apache.org/repos/asf/tomee/blob/a71d6ee2/arquillian/arquillian-tomee-embedded/src/main/java/org/apache/openejb/arquillian/embedded/EmbeddedTomEEConfiguration.java
----------------------------------------------------------------------
diff --git a/arquillian/arquillian-tomee-embedded/src/main/java/org/apache/openejb/arquillian/embedded/EmbeddedTomEEConfiguration.java b/arquillian/arquillian-tomee-embedded/src/main/java/org/apache/openejb/arquillian/embedded/EmbeddedTomEEConfiguration.java
index ea7ea42..950b7cc 100644
--- a/arquillian/arquillian-tomee-embedded/src/main/java/org/apache/openejb/arquillian/embedded/EmbeddedTomEEConfiguration.java
+++ b/arquillian/arquillian-tomee-embedded/src/main/java/org/apache/openejb/arquillian/embedded/EmbeddedTomEEConfiguration.java
@@ -178,6 +178,7 @@ public class EmbeddedTomEEConfiguration extends TomEEConfiguration {
 
             properties.remove("tomee.serialization.class.blacklist");
             properties.put("tomee.serialization.class.whitelist", "*");
+            System.setProperty("tomee.serialization.class.blacklist", System.getProperty("tomee.serialization.class.blacklist", "-"));
         }
 
         return properties;

http://git-wip-us.apache.org/repos/asf/tomee/blob/a71d6ee2/arquillian/arquillian-tomee-embedded/src/main/java/org/apache/openejb/arquillian/embedded/EmbeddedTomEEContainer.java
----------------------------------------------------------------------
diff --git a/arquillian/arquillian-tomee-embedded/src/main/java/org/apache/openejb/arquillian/embedded/EmbeddedTomEEContainer.java b/arquillian/arquillian-tomee-embedded/src/main/java/org/apache/openejb/arquillian/embedded/EmbeddedTomEEContainer.java
index 6f30b11..e2026ea 100644
--- a/arquillian/arquillian-tomee-embedded/src/main/java/org/apache/openejb/arquillian/embedded/EmbeddedTomEEContainer.java
+++ b/arquillian/arquillian-tomee-embedded/src/main/java/org/apache/openejb/arquillian/embedded/EmbeddedTomEEContainer.java
@@ -128,6 +128,8 @@ public class EmbeddedTomEEContainer extends TomEEContainer<EmbeddedTomEEConfigur
             this.container.stop();
         } catch (final Exception e) {
             throw new LifecycleException("Unable to stop server", e);
+        } finally {
+            resetSerialization();
         }
     }
 

http://git-wip-us.apache.org/repos/asf/tomee/blob/a71d6ee2/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 efdc76e..04ca053 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
@@ -300,8 +300,12 @@ public class RemoteTomEEContainer extends TomEEContainer<RemoteTomEEConfiguratio
 
         // only stop the container if we started it
         if (shutdown) {
-            Setup.removeArquillianBeanDiscoverer(tomeeHome);
-            container.destroy();
+            try {
+                Setup.removeArquillianBeanDiscoverer(tomeeHome);
+                container.destroy();
+            } finally {
+                resetSerialization();
+            }
         }
     }
 

http://git-wip-us.apache.org/repos/asf/tomee/blob/a71d6ee2/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 53d139a..852bde2 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
@@ -230,8 +230,12 @@ public class TomEEWebappContainer extends TomEEContainer<TomEEWebappConfiguratio
     public void stop() throws LifecycleException {
         // only stop the container if we started it
         if (shutdown) {
-            Setup.removeArquillianBeanDiscoverer(openejbHome);
-            container.destroy();
+            try {
+                Setup.removeArquillianBeanDiscoverer(openejbHome);
+                container.destroy();
+            } finally {
+                resetSerialization();
+            }
         }
     }
 

http://git-wip-us.apache.org/repos/asf/tomee/blob/a71d6ee2/container/openejb-core/src/main/java/org/apache/openejb/core/rmi/BlacklistClassResolver.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/core/rmi/BlacklistClassResolver.java b/container/openejb-core/src/main/java/org/apache/openejb/core/rmi/BlacklistClassResolver.java
index da34eec..134db76 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/core/rmi/BlacklistClassResolver.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/core/rmi/BlacklistClassResolver.java
@@ -34,6 +34,9 @@ public class BlacklistClassResolver {
     }
 
     protected boolean isBlacklisted(final String name) {
+        if (name != null && name.startsWith("[L") && name.endsWith(";")) {
+            return isBlacklisted(name.substring(2, name.length() - 1));
+        }
         return (whitelist != null && !contains(whitelist, name)) || contains(blacklist, name);
     }
 

http://git-wip-us.apache.org/repos/asf/tomee/blob/a71d6ee2/container/openejb-loader/src/main/java/org/apache/openejb/loader/SystemInstance.java
----------------------------------------------------------------------
diff --git a/container/openejb-loader/src/main/java/org/apache/openejb/loader/SystemInstance.java b/container/openejb-loader/src/main/java/org/apache/openejb/loader/SystemInstance.java
index 8ce4dc0..a8e5cbc 100644
--- a/container/openejb-loader/src/main/java/org/apache/openejb/loader/SystemInstance.java
+++ b/container/openejb-loader/src/main/java/org/apache/openejb/loader/SystemInstance.java
@@ -284,10 +284,15 @@ public final class SystemInstance {
             return;
         }
         system = new SystemInstance(properties);
-        readUserSystemProperties();
-        readSystemProperties();
+        // WARNING: reverse order since we don't overwrite existing entries
         readSystemProperties(get().currentProfile());
-        System.getProperties().putAll(system.getProperties()); // if the user read System.getProperties() instead of our properties, used in bval-tomee tck for instance
+        readSystemProperties();
+        readUserSystemProperties();
+
+
+        // if the user read System.getProperties() instead of our properties, used in bval-tomee tck for instance
+        System.getProperties().putAll(system.getProperties());
+
         initialized = true;
         get().setProperty("openejb.profile.custom", Boolean.toString(!get().isDefaultProfile()));
 
@@ -360,7 +365,13 @@ public final class SystemInstance {
             return;
         }
 
-        system.getProperties().putAll(systemProperties);
+        for (final String key : systemProperties.stringPropertyNames()) {
+            if (system.getProperty(key) == null) {
+                system.setProperty(key, systemProperties.getProperty(key));
+            }
+        }
+        // don't override system props
+        // system.getProperties().putAll(systemProperties);
     }
 
     public static SystemInstance get() {

http://git-wip-us.apache.org/repos/asf/tomee/blob/a71d6ee2/server/openejb-client/src/main/java/org/apache/openejb/client/EjbObjectInputStream.java
----------------------------------------------------------------------
diff --git a/server/openejb-client/src/main/java/org/apache/openejb/client/EjbObjectInputStream.java b/server/openejb-client/src/main/java/org/apache/openejb/client/EjbObjectInputStream.java
index 7e7155b..fa87952 100644
--- a/server/openejb-client/src/main/java/org/apache/openejb/client/EjbObjectInputStream.java
+++ b/server/openejb-client/src/main/java/org/apache/openejb/client/EjbObjectInputStream.java
@@ -5,14 +5,14 @@
  * 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.
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.client;
 
@@ -21,12 +21,18 @@ import java.io.InputStream;
 import java.io.ObjectInputStream;
 import java.io.ObjectStreamClass;
 import java.lang.reflect.Proxy;
+import java.util.concurrent.atomic.AtomicReference;
 
 /**
  * @version $Rev$ $Date$
  */
 public class EjbObjectInputStream extends ObjectInputStream {
-    private static final BlacklistClassResolver DEFAULT = new BlacklistClassResolver();
+    private static final AtomicReference<BlacklistClassResolver> RESOLVER_ATOMIC_REFERENCE =
+        new AtomicReference<>(new BlacklistClassResolver());
+
+    public static void reloadResolverConfig() {
+        RESOLVER_ATOMIC_REFERENCE.set(new BlacklistClassResolver());
+    }
 
     public EjbObjectInputStream(final InputStream in) throws IOException {
         super(in);
@@ -34,7 +40,7 @@ public class EjbObjectInputStream extends ObjectInputStream {
 
     @Override
     protected Class<?> resolveClass(final ObjectStreamClass classDesc) throws IOException, ClassNotFoundException {
-        final String n = DEFAULT.check(classDesc.getName());
+        final String n = RESOLVER_ATOMIC_REFERENCE.get().check(classDesc.getName());
         final ClassLoader classloader = getClassloader();
         try {
             return Class.forName(n, false, classloader);
@@ -89,15 +95,14 @@ public class EjbObjectInputStream extends ObjectInputStream {
     }
 
     public static class BlacklistClassResolver {
-        private static final String[] WHITELIST = toArray(System.getProperty("tomee.serialization.class.whitelist"));
-        private static final String[] BLACKLIST = toArray(System.getProperty(
-            "tomee.serialization.class.blacklist", "org.codehaus.groovy.runtime.,org.apache.commons.collections.functors.,org.apache.xalan,java.lang.Process"));
-
         private final String[] blacklist;
         private final String[] whitelist;
 
         protected BlacklistClassResolver() {
-            this(BLACKLIST, WHITELIST);
+            this(toArray(System.getProperty(
+                "tomee.serialization.class.blacklist",
+                "org.codehaus.groovy.runtime.,org.apache.commons.collections.functors.,org.apache.xalan,java.lang.Process")),
+                toArray(System.getProperty("tomee.serialization.class.whitelist")));
         }
 
         protected BlacklistClassResolver(final String[] blacklist, final String[] whitelist) {
@@ -106,12 +111,15 @@ public class EjbObjectInputStream extends ObjectInputStream {
         }
 
         protected boolean isBlacklisted(final String name) {
+            if (name != null && name.startsWith("[L") && name.endsWith(";")) {
+                return isBlacklisted(name.substring(2, name.length() - 1));
+            }
             return (whitelist != null && !contains(whitelist, name)) || contains(blacklist, name);
         }
 
         public final String check(final String name) {
             if (isBlacklisted(name)) {
-                throw new SecurityException(name + " is not whitelisted as deserialisable, prevented before loading.");
+                throw new SecurityException(name + " is not whitelisted as deserialisable, prevented before loading it.");
             }
             return name;
         }

http://git-wip-us.apache.org/repos/asf/tomee/blob/a71d6ee2/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 4327d82..8adeed7 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
@@ -20,6 +20,7 @@ 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.EjbObjectInputStream;
 import org.apache.openejb.client.RemoteInitialContextFactory;
 import org.apache.openejb.config.RemoteServer;
 import org.apache.openejb.loader.IO;
@@ -90,13 +91,21 @@ public class RemoteTomEEEJBContainer extends EJBContainer {
             final String remoteEjb = System.getProperty(Context.PROVIDER_URL, "http://" + parser.host() + ":" + parser.http() + "/tomee/ejb");
             System.setProperty(RemoteServer.SERVER_SHUTDOWN_PORT, parser.stop());
 
+            final String blacklist = System.getProperty("tomee.serialization.class.blacklist");
+            if (blacklist == null) {
+                System.setProperty("tomee.serialization.class.blacklist", "-");
+                EjbObjectInputStream.reloadResolverConfig();
+            }
             try {
                 instance = new RemoteTomEEEJBContainer();
                 instance.container = new RemoteServer();
                 instance.container.setPortStartup(Integer.parseInt(parser.http()));
 
                 try {
-                    instance.container.start(Arrays.asList("-Dopenejb.system.apps=true", "-Dtomee.remote.support=true"), "start", true);
+                    instance.container.start(Arrays.asList(
+                        "-Dtomee.serialization.class.blacklist=" + System.getProperty("tomee.serialization.class.blacklist"),
+                        "-Dopenejb.system.apps=true", "-Dtomee.remote.support=true"),
+                        "start", true);
                 } catch (final Exception e) {
                     instance.container.destroy();
                     throw e;
@@ -145,6 +154,11 @@ public class RemoteTomEEEJBContainer extends EJBContainer {
                     throw (EJBException) e;
                 }
                 throw new TomEERemoteEJBContainerException("initialization exception", e);
+            } finally {
+                if (blacklist == null) {
+                    System.clearProperty("tomee.serialization.class.blacklist");
+                    EjbObjectInputStream.reloadResolverConfig();
+                }
             }
         }
     }