Repository: tomee Updated Branches: refs/heads/master 710448afb -> 3d8d8af0e
TOMEE-1916 conf option to tomee embedded Project: http://git-wip-us.apache.org/repos/asf/tomee/repo Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/6bf49291 Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/6bf49291 Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/6bf49291 Branch: refs/heads/master Commit: 6bf49291bca020ae8c1656e2a45c4f67e22bc47b Parents: 710448a Author: Romain manni-Bucau <rmannibu...@gmail.com> Authored: Sat Aug 27 18:22:43 2016 +0200 Committer: Romain manni-Bucau <rmannibu...@gmail.com> Committed: Sat Aug 27 18:22:43 2016 +0200 ---------------------------------------------------------------------- .../gradle/embedded/TomEEEmbeddedTask.java | 4 ++ .../maven/plugins/TomEEEmbeddedMojo.java | 9 ++- .../event/TomEEEmbeddedScannerCreated.java | 33 ++++++++++ .../apache/tomee/embedded/Configuration.java | 15 +++++ .../org/apache/tomee/embedded/Container.java | 63 +++++++++++++++++--- .../org/apache/tomee/embedded/ConfTest.java | 46 ++++++++++++++ .../src/test/resources/ConfTest/server.xml | 40 +++++++++++++ .../test/resources/ConfTest/system.properties | 18 ++++++ 8 files changed, 216 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tomee/blob/6bf49291/gradle/gradle-tomee-embedded/src/main/java/org/apache/tomee/gradle/embedded/TomEEEmbeddedTask.java ---------------------------------------------------------------------- diff --git a/gradle/gradle-tomee-embedded/src/main/java/org/apache/tomee/gradle/embedded/TomEEEmbeddedTask.java b/gradle/gradle-tomee-embedded/src/main/java/org/apache/tomee/gradle/embedded/TomEEEmbeddedTask.java index b5c3e27..bf06e0b 100644 --- a/gradle/gradle-tomee-embedded/src/main/java/org/apache/tomee/gradle/embedded/TomEEEmbeddedTask.java +++ b/gradle/gradle-tomee-embedded/src/main/java/org/apache/tomee/gradle/embedded/TomEEEmbeddedTask.java @@ -175,6 +175,10 @@ public class TomEEEmbeddedTask extends DefaultTask { @Input private String dir; + @Optional + @Input + private String conf; + /* TODO if needed @Parameter //a dvanced config but a simple boolean will be used for defaults (withLiveReload) private LiveReload liveReload; http://git-wip-us.apache.org/repos/asf/tomee/blob/6bf49291/maven/tomee-embedded-maven-plugin/src/main/java/org/apache/openejb/maven/plugins/TomEEEmbeddedMojo.java ---------------------------------------------------------------------- diff --git a/maven/tomee-embedded-maven-plugin/src/main/java/org/apache/openejb/maven/plugins/TomEEEmbeddedMojo.java b/maven/tomee-embedded-maven-plugin/src/main/java/org/apache/openejb/maven/plugins/TomEEEmbeddedMojo.java index 8f841b7..95038ab 100644 --- a/maven/tomee-embedded-maven-plugin/src/main/java/org/apache/openejb/maven/plugins/TomEEEmbeddedMojo.java +++ b/maven/tomee-embedded-maven-plugin/src/main/java/org/apache/openejb/maven/plugins/TomEEEmbeddedMojo.java @@ -32,7 +32,6 @@ import org.apache.maven.plugins.annotations.ResolutionScope; import org.apache.maven.project.MavenProject; import org.apache.openejb.OpenEJBException; import org.apache.openejb.UndeployException; -import org.apache.openejb.assembler.classic.AppInfo; import org.apache.openejb.assembler.classic.Assembler; import org.apache.openejb.core.ParentClassLoaderFinder; import org.apache.openejb.core.ProvidedClassLoaderFinder; @@ -41,7 +40,6 @@ import org.apache.openejb.loader.IO; import org.apache.openejb.loader.SystemInstance; import org.apache.openejb.maven.util.MavenLogStreamFactory; import org.apache.openejb.maven.util.XmlFormatter; -import org.apache.openejb.spi.ContainerSystem; import org.apache.openejb.util.JuliLogStreamFactory; import org.apache.tomee.catalina.TomEERuntimeException; import org.apache.tomee.embedded.Configuration; @@ -59,7 +57,6 @@ import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; -import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -228,6 +225,12 @@ public class TomEEEmbeddedMojo extends AbstractMojo { protected String context; /** + * Conf classpath folder. + */ + @Parameter(property = "tomee-embedded-plugin.conf") + protected String conf; + + /** * TomEE properties. */ @Parameter // don't call it properties to avoid to break getConfig() http://git-wip-us.apache.org/repos/asf/tomee/blob/6bf49291/tomee/tomee-embedded#src/main/java/org/apache/tomee/embedded/event/TomEEEmbeddedScannerCreated.java ---------------------------------------------------------------------- diff --git a/tomee/tomee-embedded#src/main/java/org/apache/tomee/embedded/event/TomEEEmbeddedScannerCreated.java b/tomee/tomee-embedded#src/main/java/org/apache/tomee/embedded/event/TomEEEmbeddedScannerCreated.java new file mode 100644 index 0000000..4110593 --- /dev/null +++ b/tomee/tomee-embedded#src/main/java/org/apache/tomee/embedded/event/TomEEEmbeddedScannerCreated.java @@ -0,0 +1,33 @@ +/** + * 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 + * <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.tomee.embedded.event; + +import org.apache.openejb.observer.Event; +import org.apache.xbean.finder.IAnnotationFinder; + +@Event +public class TomEEEmbeddedScannerCreated { + private final IAnnotationFinder finder; + + public TomEEEmbeddedScannerCreated(final IAnnotationFinder finder) { + this.finder = finder; + } + + public IAnnotationFinder getFinder() { + return finder; + } +} http://git-wip-us.apache.org/repos/asf/tomee/blob/6bf49291/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Configuration.java ---------------------------------------------------------------------- diff --git a/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Configuration.java b/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Configuration.java index 7871812..c0b1e6e 100644 --- a/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Configuration.java +++ b/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Configuration.java @@ -75,6 +75,8 @@ public class Configuration { private boolean webResourceCached = true; + private String conf; + public int getHttpPort() { return httpPort; } @@ -366,6 +368,19 @@ public class Configuration { configurationCustomizer.customize(this); } + public Configuration conf(final String config) { + setConf(config); + return this; + } + + public String getConf() { + return conf; + } + + public void setConf(final String conf) { + this.conf = conf; + } + public interface ConfigurationCustomizer { void customize(Configuration configuration); } http://git-wip-us.apache.org/repos/asf/tomee/blob/6bf49291/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java ---------------------------------------------------------------------- diff --git a/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java b/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java index d3d5538..a3c521d 100644 --- a/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java +++ b/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java @@ -83,6 +83,7 @@ import org.apache.velocity.app.VelocityEngine; import org.apache.velocity.runtime.log.NullLogChute; import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader; import org.apache.xbean.finder.AnnotationFinder; +import org.apache.xbean.finder.ResourceFinder; import org.apache.xbean.finder.UrlSet; import org.apache.xbean.finder.filter.Filters; import org.apache.xbean.recipe.ObjectRecipe; @@ -391,12 +392,35 @@ public class Container implements AutoCloseable { Files.mkdirs(base); Files.deleteOnExit(base); - createDirectory(base, "conf"); + final File conf = createDirectory(base, "conf"); createDirectory(base, "lib"); createDirectory(base, "logs"); createDirectory(base, "temp"); createDirectory(base, "work"); createDirectory(base, "webapps"); + + synchronize(conf, configuration.getConf()); + } + + private void synchronize(final File base, final String resourceBase) { + if (resourceBase == null) { + return; + } + + try { + final Map<String, URL> urls = new ResourceFinder("").getResourcesMap(resourceBase); + for (final Map.Entry<String, URL> u : urls.entrySet()) { + try (final InputStream is = u.getValue().openStream()) { + final File to = new File(base, u.getKey()); + IO.copy(is, to); + if ("server.xml".equals(u.getKey())) { + configuration.setServerXml(to.getAbsolutePath()); + } + } + } + } catch (final IOException e) { + throw new IllegalStateException(e); + } } public File getBase() { @@ -459,11 +483,13 @@ public class Container implements AutoCloseable { final boolean initialized; if (configuration.hasServerXml()) { final File file = new File(conf, "server.xml"); - final FileOutputStream fos = new FileOutputStream(file); - try { - IO.copy(configuration.getServerXmlFile(), fos); - } finally { - IO.close(fos); + if (!file.equals(configuration.getServerXmlFile())) { + final FileOutputStream fos = new FileOutputStream(file); + try { + IO.copy(configuration.getServerXmlFile(), fos); + } finally { + IO.close(fos); + } } // respect config (host/port) of the Configuration @@ -488,7 +514,16 @@ public class Container implements AutoCloseable { } if (props != null && !props.isEmpty()) { - final FileWriter systemProperties = new FileWriter(new File(conf, "system.properties")); + final File file = new File(conf, "system.properties"); + if (file.isFile()) { + final Properties existing = IO.readProperties(file); + for (final String key : existing.stringPropertyNames()) { + if (!props.containsKey(key)) { + props.put(key, existing.getProperty(key)); + } + } + } + final FileWriter systemProperties = new FileWriter(file); try { props.store(systemProperties, ""); } finally { @@ -897,6 +932,11 @@ public class Container implements AutoCloseable { } private void copyTemplateTo(final File targetDir, final String filename) throws Exception { + final File file = new File(targetDir, filename); + if (file.exists()) { + return; + } + // don't break apps using Velocity facade final VelocityEngine engine = new VelocityEngine(); engine.setProperty(Velocity.RUNTIME_LOG_LOGSYSTEM, new NullLogChute()); @@ -908,17 +948,22 @@ public class Container implements AutoCloseable { final VelocityContext context = new VelocityContext(); context.put("tomcatHttpPort", Integer.toString(configuration.getHttpPort())); context.put("tomcatShutdownPort", Integer.toString(configuration.getStopPort())); - final Writer writer = new FileWriter(new File(targetDir, filename)); + final Writer writer = new FileWriter(file); template.merge(context, writer); writer.flush(); writer.close(); } private void copyFileTo(final File targetDir, final String filename) throws IOException { + final File to = new File(targetDir, filename); + if (to.exists()) { // user provided one + return; + } + final InputStream is = getClass().getResourceAsStream("/org/apache/tomee/configs/" + filename); if (is != null) { // should be null since we are using default conf try { - IO.copy(is, new File(targetDir, filename)); + IO.copy(is, to); } finally { IO.close(is); } http://git-wip-us.apache.org/repos/asf/tomee/blob/6bf49291/tomee/tomee-embedded/src/test/java/org/apache/tomee/embedded/ConfTest.java ---------------------------------------------------------------------- diff --git a/tomee/tomee-embedded/src/test/java/org/apache/tomee/embedded/ConfTest.java b/tomee/tomee-embedded/src/test/java/org/apache/tomee/embedded/ConfTest.java new file mode 100644 index 0000000..d1670dc --- /dev/null +++ b/tomee/tomee-embedded/src/test/java/org/apache/tomee/embedded/ConfTest.java @@ -0,0 +1,46 @@ +/** + * 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.embedded; + +import org.apache.catalina.Realm; +import org.apache.catalina.core.StandardServer; +import org.apache.catalina.realm.JAASRealm; +import org.apache.openejb.loader.SystemInstance; +import org.apache.tomee.catalina.TomEERealm; +import org.apache.tomee.loader.TomcatHelper; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class ConfTest { + @Test + public void run() { + try (final Container container = new Container(new Configuration().conf("ConfTest"))) { + final StandardServer standardServer = TomcatHelper.getServer(); + final Realm engineRealm = standardServer.findServices()[0].getContainer().getRealm(); + assertTrue(String.valueOf(engineRealm), TomEERealm.class.isInstance(engineRealm)); + assertTrue(String.valueOf(engineRealm), JAASRealm.class.isInstance(TomEERealm.class.cast(engineRealm).getNestedRealms()[0])); + final JAASRealm jaas = JAASRealm.class.cast(TomEERealm.class.cast(engineRealm).getNestedRealms()[0]); + assertEquals("PropertiesLoginModule", jaas.getAppName()); + assertEquals("org.apache.openejb.core.security.jaas.UserPrincipal", jaas.getUserClassNames()); + assertEquals("org.apache.openejb.core.security.jaas.GroupPrincipal", jaas.getRoleClassNames()); + + assertEquals("test", SystemInstance.get().getProperty("ConfTest.value")); + } + } +} http://git-wip-us.apache.org/repos/asf/tomee/blob/6bf49291/tomee/tomee-embedded/src/test/resources/ConfTest/server.xml ---------------------------------------------------------------------- diff --git a/tomee/tomee-embedded/src/test/resources/ConfTest/server.xml b/tomee/tomee-embedded/src/test/resources/ConfTest/server.xml new file mode 100644 index 0000000..62be947 --- /dev/null +++ b/tomee/tomee-embedded/src/test/resources/ConfTest/server.xml @@ -0,0 +1,40 @@ +<?xml version='1.0' encoding='utf-8'?> +<!-- + 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. +--> +<Server port="8005" shutdown="SHUTDOWN"> + <Listener className="org.apache.tomee.catalina.ServerListener"/> + <Listener className="org.apache.catalina.security.SecurityListener"/> + + <Service name="Catalina"> + <Connector port="8080" protocol="HTTP/1.1" + connectionTimeout="20000" + redirectPort="8443"/> + <Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/> + <Engine name="Catalina" defaultHost="localhost"> + + <Realm className="org.apache.catalina.realm.JAASRealm" appName="PropertiesLoginModule" + userClassNames="org.apache.openejb.core.security.jaas.UserPrincipal" + roleClassNames="org.apache.openejb.core.security.jaas.GroupPrincipal"> + </Realm> + + <Host name="localhost" appBase="webapps" + unpackWARs="true" autoDeploy="true"/> + </Engine> + </Service> +</Server> http://git-wip-us.apache.org/repos/asf/tomee/blob/6bf49291/tomee/tomee-embedded/src/test/resources/ConfTest/system.properties ---------------------------------------------------------------------- diff --git a/tomee/tomee-embedded/src/test/resources/ConfTest/system.properties b/tomee/tomee-embedded/src/test/resources/ConfTest/system.properties new file mode 100644 index 0000000..554c50a --- /dev/null +++ b/tomee/tomee-embedded/src/test/resources/ConfTest/system.properties @@ -0,0 +1,18 @@ +# +# 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. +# +ConfTest.value = test +