Repository: tomee Updated Branches: refs/heads/master 0486f3f7f -> e5b374b54
TOMEE-1872 TOMEE-1873 wiring more options of tomee embedded to its main and adding FatApp for fatjar which is a Main for shades Project: http://git-wip-us.apache.org/repos/asf/tomee/repo Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/e5b374b5 Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/e5b374b5 Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/e5b374b5 Branch: refs/heads/master Commit: e5b374b54b9f287707ec961d969eb0a5422ec517 Parents: 0486f3f Author: Romain manni-Bucau <[email protected]> Authored: Mon Jul 18 08:34:51 2016 +0200 Committer: Romain manni-Bucau <[email protected]> Committed: Mon Jul 18 08:34:51 2016 +0200 ---------------------------------------------------------------------- .../java/org/apache/tomee/embedded/FatApp.java | 41 ++++ .../apache/tomee/embedded/LifecycleTask.java | 23 +++ .../java/org/apache/tomee/embedded/Main.java | 186 ++++++++++++++++++- .../junit/TomEEEmbeddedSingleRunner.java | 7 +- 4 files changed, 244 insertions(+), 13 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tomee/blob/e5b374b5/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/FatApp.java ---------------------------------------------------------------------- diff --git a/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/FatApp.java b/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/FatApp.java new file mode 100644 index 0000000..19e8bd4 --- /dev/null +++ b/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/FatApp.java @@ -0,0 +1,41 @@ +/** + * 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 java.util.ArrayList; +import java.util.Collection; + +import static java.util.Arrays.asList; + +// Main like forcing --as-war --single-classloader +// commong for fatjars +public class FatApp { + public static void main(final String[] args) { + final Collection<String> a = args == null || args.length == 0 ? new ArrayList<String>() : new ArrayList<>(asList(args)); + if (!a.contains("--as-war")) { + a.add("--as-war"); + } + if (!a.contains("--single-classloader")) { + a.add("--single-classloader"); + } + Main.main(a.toArray(new String[a.size()])); + } + + private FatApp() { + // no-op + } +} http://git-wip-us.apache.org/repos/asf/tomee/blob/e5b374b5/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/LifecycleTask.java ---------------------------------------------------------------------- diff --git a/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/LifecycleTask.java b/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/LifecycleTask.java new file mode 100644 index 0000000..194806b --- /dev/null +++ b/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/LifecycleTask.java @@ -0,0 +1,23 @@ +/* + * 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 java.io.Closeable; + +public interface LifecycleTask { + Closeable beforeContainerStartup(); +} http://git-wip-us.apache.org/repos/asf/tomee/blob/e5b374b5/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Main.java ---------------------------------------------------------------------- diff --git a/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Main.java b/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Main.java index fef1b9a..f9cd5af 100644 --- a/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Main.java +++ b/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Main.java @@ -5,17 +5,18 @@ * 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.tomee.embedded; +import org.apache.catalina.realm.JAASRealm; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.CommandLineParser; import org.apache.commons.cli.HelpFormatter; @@ -24,14 +25,24 @@ import org.apache.commons.cli.ParseException; import org.apache.commons.cli.PosixParser; import org.apache.openejb.loader.ProvisioningUtil; +import java.io.Closeable; import java.io.File; +import java.io.IOException; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.net.URI; +import java.util.ArrayList; +import java.util.Collection; +import java.util.ServiceLoader; import java.util.Set; import static org.apache.openejb.loader.JarLocation.jarLocation; +import static org.apache.openejb.util.PropertyPlaceHolderHelper.simpleValue; public class Main { public static final String PORT = "port"; public static final String SHUTDOWN = "shutdown"; + public static final String HOST = "host"; public static final String PATH = "path"; public static final String CONTEXT = "context"; public static final String DIRECTORY = "directory"; @@ -42,6 +53,22 @@ public class Main { public static final String TOMEE_XML = "tomeexml"; public static final String PROPERTY = "property"; public static final String SINGLE_CLASSLOADER = "single-classloader"; + public static final String QUICK_SESSION = "quick-session"; + public static final String SKIP_HTTP = "skip-http"; + public static final String HTTPS_PORT = "https-port"; + public static final String SSL = "ssl"; + public static final String KEYSTORE_FILE = "keystore"; + public static final String KEYSTORE_PASS = "keystore-pass"; + public static final String KEYSTORE_TYPE = "keystore-type"; + public static final String CLIENT_AUTH = "client-auth"; + public static final String KEY_ALIAS = "key-alias"; + public static final String SSL_PROTOCOL = "ssl-protocol"; + public static final String WEB_XML = "web-xml"; + public static final String JAAS_CONFIG = "jaas"; + public static final String CACHE_WEB_RESOURCES = "cache-web-resources"; + public static final String BASIC = "basic"; + public static final String SIMPLE_LOG = "simple-log"; + public static final String PRE_TASK = "pre-task"; public static void main(final String[] args) { final CommandLineParser parser = new PosixParser(); @@ -56,6 +83,35 @@ public class Main { return; } + final Collection<Closeable> post = new ArrayList<>(); + for (final LifecycleTask task : ServiceLoader.load(LifecycleTask.class)) { + final Closeable closeable = task.beforeContainerStartup(); + if (closeable != null) { + post.add(closeable); + } + } + if (line.hasOption(PRE_TASK)) { + final ClassLoader loader = Thread.currentThread().getContextClassLoader(); + for (final String type : line.getOptionValues(PRE_TASK)) { + final Object task; + try { + task = loader.loadClass(type).newInstance(); + } catch (final Exception e) { + throw new IllegalArgumentException(e); + } + if (Runnable.class.isInstance(task)) { + Runnable.class.cast(task).run(); + } else if (LifecycleTask.class.isInstance(task)) { + final Closeable closeable = LifecycleTask.class.cast(task).beforeContainerStartup(); + if (closeable != null) { + post.add(closeable); + } + } else { + throw new IllegalArgumentException(task + " can't be executed"); + } + } + } + // run TomEE try { final Container container = new Container(createConfiguration(line)); @@ -66,7 +122,7 @@ public class Main { contexts = null; } - boolean autoWar = true; + boolean autoWar; if (line.hasOption(PATH)) { int i = 0; for (final String path : line.getOptionValues(PATH)) { @@ -108,12 +164,29 @@ public class Main { container.stop(); } catch (final Exception e) { e.printStackTrace(); // just log the exception + } finally { + close(post); } } }); container.await(); } catch (final Exception e) { e.printStackTrace(); + } finally { + close(post); + } + } + + private static void close(final Collection<Closeable> post) { + synchronized (post) { + for (final Closeable p : post) { + try { + p.close(); + } catch (final IOException e) { + e.printStackTrace(); + } + } + post.clear(); } } @@ -137,6 +210,22 @@ public class Main { options.addOption(null, SERVER_XML, true, "the server.xml path"); options.addOption(null, TOMEE_XML, true, "the tomee.xml path"); options.addOption(null, PROPERTY, true, "some container properties"); + options.addOption(null, HOST, true, "server host"); + options.addOption(null, QUICK_SESSION, true, "use a quick session - it uses Random instead of SecureRandom"); + options.addOption(null, SKIP_HTTP, true, "should http connector be ignored"); + options.addOption(null, HTTPS_PORT, true, "the https port if needed"); + options.addOption(null, SSL, true, "Is https enabled"); + options.addOption(null, KEYSTORE_FILE, true, "the https keystore"); + options.addOption(null, KEYSTORE_PASS, true, "the https keystore password (can use cipher:xxx)"); + options.addOption(null, KEYSTORE_TYPE, true, "the https keystore type"); + options.addOption(null, CLIENT_AUTH, true, "is client_auth used"); + options.addOption(null, KEY_ALIAS, true, "the https key alias"); + options.addOption(null, SSL_PROTOCOL, true, "the https SSL protocols"); + options.addOption(null, WEB_XML, true, "override global web.xml"); + options.addOption(null, JAAS_CONFIG, true, "forces tomee to use JAAS with the set config"); + options.addOption(null, CACHE_WEB_RESOURCES, true, "should web resources be cached"); + options.addOption(null, BASIC, true, "basic authentication if set"); + options.addOption(null, SIMPLE_LOG, true, "should tomee use simple log format (level - message) - demo intended"); return options; } @@ -148,9 +237,15 @@ public class Main { if (args.hasOption(SERVER_XML)) { config.setServerXml(args.getOptionValue(SERVER_XML)); } + if (args.hasOption(WEB_XML)) { + config.setWebXml(args.getOptionValue(WEB_XML)); + } if (args.hasOption(TOMEE_XML)) { config.property("openejb.conf.file", args.getOptionValue(TOMEE_XML)); } + if (args.hasOption(SIMPLE_LOG) && Boolean.parseBoolean(args.getOptionValue(SIMPLE_LOG))) { + config.property("openejb.jul.forceReload", "true"); + } if (args.hasOption(PROPERTY)) { for (final String opt : args.getOptionValues(PROPERTY)) { final int sep = opt.indexOf('='); @@ -161,6 +256,79 @@ public class Main { } } } + if (args.hasOption(JAAS_CONFIG)) { + final String jaas = args.getOptionValue(JAAS_CONFIG); + final File file = new File(jaas); + System.setProperty("java.security.auth.login.config", file.getAbsolutePath()); + final JAASRealm realm = new JAASRealm() { + @Override + protected javax.security.auth.login.Configuration getConfig() { + try { + if (jaasConfigurationLoaded) { + return jaasConfiguration; + } + synchronized (this) { + if (configFile == null) { + jaasConfigurationLoaded = true; + return null; + } + configFile = file.getAbsolutePath(); + final Class<?> sunConfigFile = Class.forName("com.sun.security.auth.login.ConfigFile"); + final Constructor<?> constructor = sunConfigFile.getConstructor(URI.class); + javax.security.auth.login.Configuration config = javax.security.auth.login.Configuration.class.cast(constructor.newInstance(file.toURI())); + this.jaasConfiguration = config; + this.jaasConfigurationLoaded = true; + return this.jaasConfiguration; + } + } catch (final NoSuchMethodException | SecurityException | IllegalArgumentException | IllegalAccessException | + InstantiationException | InvocationTargetException | ClassNotFoundException ex) { + throw new RuntimeException(ex); + } + + } + }; + realm.setAppName("eyes-of-the-tiger"); + realm.setConfigFile(new File(jaas).getAbsolutePath()); + config.setRealm(realm); + } + if (args.hasOption(BASIC)) { + config.loginConfig(new LoginConfigBuilder().basic() + .setRealmName(System.getProperty("tomee.embedded.main.basic.realm", "Security"))); + config.securityConstaint(new SecurityConstaintBuilder().authConstraint(true) + .addAuthRole(System.getProperty("tomee.embedded.main.basic.role", "*")) + .addCollection("Basic", System.getProperty("tomee.embedded.main.basic.pattern", "/*")) + .setDisplayName(System.getProperty("tomee.embedded.main.basic.display-name", "Basic security"))); + } + if (args.hasOption(CACHE_WEB_RESOURCES)) { + config.setWebResourceCached(Boolean.parseBoolean(args.getOptionValue(CACHE_WEB_RESOURCES))); + } + if (args.hasOption(SSL_PROTOCOL)) { + config.setSslProtocol(args.getOptionValue(SSL_PROTOCOL)); + } + if (args.hasOption(KEY_ALIAS)) { + config.setKeyAlias(args.getOptionValue(KEY_ALIAS)); + } + if (args.hasOption(KEYSTORE_TYPE)) { + config.setKeystoreType(args.getOptionValue(KEYSTORE_TYPE)); + } + if (args.hasOption(KEYSTORE_PASS)) { + config.setKeystorePass(simpleValue(args.getOptionValue(KEYSTORE_PASS))); + } + if (args.hasOption(KEYSTORE_FILE)) { + config.setKeystoreFile(args.getOptionValue(KEYSTORE_FILE)); + } + if (args.hasOption(SSL)) { + config.setSsl(Boolean.parseBoolean(args.getOptionValue(SSL))); + } + if (args.hasOption(HTTPS_PORT)) { + config.setHttpsPort(Integer.parseInt(args.getOptionValue(HTTPS_PORT))); + } + if (args.hasOption(SKIP_HTTP)) { + config.setSkipHttp(Boolean.parseBoolean(args.getOptionValue(SKIP_HTTP))); + } + if (args.hasOption(QUICK_SESSION)) { + config.setQuickSession(Boolean.parseBoolean(args.getOptionValue(QUICK_SESSION))); + } return config; } http://git-wip-us.apache.org/repos/asf/tomee/blob/e5b374b5/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/junit/TomEEEmbeddedSingleRunner.java ---------------------------------------------------------------------- diff --git a/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/junit/TomEEEmbeddedSingleRunner.java b/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/junit/TomEEEmbeddedSingleRunner.java index b223663..dbc04a5 100644 --- a/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/junit/TomEEEmbeddedSingleRunner.java +++ b/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/junit/TomEEEmbeddedSingleRunner.java @@ -219,7 +219,7 @@ public class TomEEEmbeddedSingleRunner extends BlockJUnit4ClassRunner { final Collection<Closeable> postTasks = new ArrayList<>(); final LifecycleTasks tasks = appClass.getAnnotation(LifecycleTasks.class); if (tasks != null) { - for (final Class<? extends LifecycleTask> type : tasks.value()) { + for (final Class<? extends org.apache.tomee.embedded.LifecycleTask> type : tasks.value()) { postTasks.add(type.newInstance().beforeContainerStartup()); } } @@ -366,13 +366,12 @@ public class TomEEEmbeddedSingleRunner extends BlockJUnit4ClassRunner { } } - public interface LifecycleTask { - Closeable beforeContainerStartup(); + public interface LifecycleTask extends org.apache.tomee.embedded.LifecycleTask { } @Retention(RUNTIME) @Target(TYPE) public @interface LifecycleTasks { - Class<? extends LifecycleTask>[] value(); + Class<? extends org.apache.tomee.embedded.LifecycleTask>[] value(); } }
