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 <rmannibu...@gmail.com> Authored: Tue Mar 1 18:37:04 2016 +0100 Committer: Romain manni-Bucau <rmannibu...@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(); + } } } }