http://git-wip-us.apache.org/repos/asf/tomee/blob/52567075/container/openejb-core/src/main/java/org/apache/openejb/config/RemoteServer.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/main/java/org/apache/openejb/config/RemoteServer.java b/container/openejb-core/src/main/java/org/apache/openejb/config/RemoteServer.java index 9f7da52..50c0fa9 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/config/RemoteServer.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/config/RemoteServer.java @@ -1,714 +1,714 @@ -/* - * 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.openejb.config; - -import org.apache.openejb.OpenEJBRuntimeException; -import org.apache.openejb.loader.Options; -import org.apache.openejb.util.Join; -import org.apache.openejb.util.Pipe; - -import java.io.File; -import java.io.IOException; -import java.io.OutputStream; -import java.lang.reflect.Field; -import java.net.InetSocketAddress; -import java.net.Socket; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicReference; -import java.util.logging.Level; -import java.util.logging.Logger; - -//import org.apache.openejb.loader.IO; - -/** - * NOTE: Do not add inner or anonymous classes or a dependency without updating ExecMojo - * - * @version $Rev$ $Date$ - */ -@SuppressWarnings("UseOfSystemOutOrSystemErr") -public class RemoteServer { - - private static final Options options = new Options(System.getProperties()); - public static final String SERVER_DEBUG_PORT = "server.debug.port"; - public static final String SERVER_SHUTDOWN_PORT = "server.shutdown.port"; - public static final String SERVER_SHUTDOWN_HOST = "server.shutdown.host"; - public static final String SERVER_SHUTDOWN_COMMAND = "server.shutdown.command"; - public static final String OPENEJB_SERVER_DEBUG = "openejb.server.debug"; - public static final String START = "start"; - public static final String STOP = "stop"; - - private final boolean debug = options.get(OPENEJB_SERVER_DEBUG, false); - private final boolean profile = options.get("openejb.server.profile", false); - private final boolean tomcat; - private final String javaOpts = System.getProperty("java.opts"); - private String additionalClasspath; - - /** - * Has the remote server's instance been already running ? - */ - private boolean serverHasAlreadyBeenStarted = true; - - private Properties properties; - private final AtomicReference<Process> server = new AtomicReference<Process>(); - private final int tries; - private final boolean verbose; - private final int portShutdown; - private final String host; - private final String command; - private File home; - private int portStartup; - - public RemoteServer() { - this(options.get("connect.tries", 60), options.get("verbose", false)); - } - - public RemoteServer(final int tries, final boolean verbose) { - this.tries = (tries < 1 ? 1 : (tries > 3600 ? 3600 : tries)); //Wait at least 1 second to start or stop, but not more than an hour. - this.verbose = verbose; - home = getHome(); - tomcat = (home != null) && (new File(new File(home, "bin"), "catalina.sh").exists()); - - portShutdown = options.get(SERVER_SHUTDOWN_PORT, tomcat ? 8005 : 4200); - portStartup = portShutdown; - command = options.get(SERVER_SHUTDOWN_COMMAND, "SHUTDOWN"); - host = options.get(SERVER_SHUTDOWN_HOST, "localhost"); - } - - public void init(final Properties props) { - properties = props; - - props.put("java.naming.factory.initial", "org.apache.openejb.client.RemoteInitialContextFactory"); - final int port = options.get("ejbd.port", 4201); - props.put("java.naming.provider.url", options.get("java.naming.provider.url", "127.0.0.1:" + port)); - props.put("java.naming.security.principal", "testuser"); - props.put("java.naming.security.credentials", "testpassword"); - } - - public static void main(final String[] args) { - assert args.length > 0 : "no arguments supplied: valid arguments are 'start' or 'stop'"; - if (args[0].equalsIgnoreCase(START)) { - final RemoteServer remoteServer = new RemoteServer(); - try { - remoteServer.start(); - } catch (final Exception e) { - remoteServer.destroy(); - e.printStackTrace(System.err); - } - } else if (args[0].equalsIgnoreCase(STOP)) { - final RemoteServer remoteServer = new RemoteServer(); - remoteServer.serverHasAlreadyBeenStarted = false; - try { - remoteServer.forceStop(); - } catch (final Exception e) { - e.printStackTrace(System.err); - } - } else { - throw new OpenEJBRuntimeException("valid arguments are 'start' or 'stop'"); - } - } - - public int getPortStartup() { - return this.portStartup; - } - - public void setPortStartup(final int portStartup) { - this.portStartup = portStartup; - } - - public Properties getProperties() { - return this.properties; - } - - public void destroy() { - - try { - final boolean stopSent = stop(); - - final Process p = server.get(); - if (p != null) { - - if (stopSent) { - waitFor(p); - } else { - p.destroy(); - } - } - } catch (final Exception e) { - Logger.getLogger(RemoteServer.class.getName()).log(Level.WARNING, "Failed to destroy remote server process", e); - } - } - - public void start() { - start(Collections.<String>emptyList(), START, true); - } - - public void start(final List<String> additionalArgs, final String cmd, final boolean checkPortAvailable) { - cmd(additionalArgs, cmd, checkPortAvailable); - } - - private void cmd(final List<String> additionalArgs, final String cmd, final boolean checkPortAvailable) { - boolean ok = true; - final int port = START.equals(cmd) ? portStartup : portShutdown; - - if (checkPortAvailable) { - ok = !connect(port, 1); - } - - if (ok) { - try { - if (verbose) { - System.out.println("[] " + cmd.toUpperCase() + " SERVER"); - } - - final File home = getHome(); - final String javaVersion = System.getProperty("java.version"); - if (verbose) { - System.out.println("OPENEJB_HOME = " + home.getAbsolutePath()); - final String systemInfo = "Java " + javaVersion + "; " + System.getProperty("os.name") + "/" + System.getProperty("os.version"); - System.out.println("SYSTEM_INFO = " + systemInfo); - } - - serverHasAlreadyBeenStarted = false; - - final File lib = new File(home, "lib"); - final File webapplib = new File(new File(new File(home, "webapps"), "tomee"), "lib"); - - File javaagentJar = null; - try { - javaagentJar = lib("openejb-javaagent", lib, webapplib); - } catch (final IllegalStateException ise) { - // no-op - } - - final File conf = new File(home, "conf"); - final File loggingProperties = new File(conf, "logging.properties"); - - //File openejbJar = new File(lib, "openejb-core-" + version + ".jar"); - - final String java; - final boolean isWindows = System.getProperty("os.name", "unknown").toLowerCase().startsWith("windows"); - if (isWindows && START.equals(cmd) && options.get("server.windows.fork", false)) { - // run and forget - java = new File(System.getProperty("java.home"), "bin/javaw").getAbsolutePath(); - } else { - java = new File(System.getProperty("java.home"), "bin/java").getAbsolutePath(); - } - - final List<String> argsList = new ArrayList<String>(20); - argsList.add(java); - argsList.add("-XX:+HeapDumpOnOutOfMemoryError"); - - if (debug) { - argsList.add("-Xdebug"); - argsList.add("-Xnoagent"); - argsList.add("-Djava.compiler=NONE"); - argsList.add("-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=" + options.get(SERVER_DEBUG_PORT, 5005)); - } - - if (profile) { - String yourkitHome = options.get("yourkit.home", "/Applications/YourKit_Java_Profiler_9.5.6.app/bin/mac/"); - if (!yourkitHome.endsWith("/")) { - yourkitHome += "/"; - } - final String yourkitOpts = options.get("yourkit.opts", "disablestacktelemetry,disableexceptiontelemetry,builtinprobes=none,delay=10000,sessionname=Tomcat"); - argsList.add("-agentpath:" + yourkitHome + "libyjpagent.jnilib=" + yourkitOpts); - } - - if (javaOpts != null) { - Collections.addAll(argsList, javaOpts.split(" +")); - } - - final Map<String, String> addedArgs = new HashMap<String, String>(); - if (additionalArgs != null) { - for (final String arg : additionalArgs) { - final String[] values = arg.split("="); - if (values.length == 1) { - addedArgs.put(values[0], "null"); - } else { - addedArgs.put(values[0], values[1]); - } - argsList.add(arg); - } - } - - if (!addedArgs.containsKey("-Djava.util.logging.config.file") && loggingProperties.exists()) { - argsList.add("-Djava.util.logging.config.file=" + loggingProperties.getAbsolutePath()); - } - - if (javaagentJar != null && javaagentJar.exists()) { - argsList.add("-javaagent:" + javaagentJar.getAbsolutePath()); - } - - //DMB: If you don't use an array, you get problems with jar paths containing spaces - // the command won't parse correctly - final String ps = File.pathSeparator; - - final String[] args; - if (!tomcat) { - final File openejbJar = lib("openejb-core", lib, webapplib); - final StringBuilder cp = new StringBuilder(openejbJar.getAbsolutePath()); - if (additionalClasspath != null) { - cp.append(ps).append(additionalClasspath); - } - - argsList.add("-cp"); - argsList.add(cp.toString()); - argsList.add("org.apache.openejb.cli.Bootstrap"); - } else { - final File bin = new File(home, "bin"); - final File tlib = new File(home, "lib"); - final File bootstrapJar = new File(bin, "bootstrap.jar"); - final File juliJar = new File(bin, "tomcat-juli.jar"); - final File commonsLoggingJar = new File(bin, "commons-logging-api.jar"); - - final File endorsed = new File(home, "endorsed"); - final File temp = new File(home, "temp"); - -// if (!addedArgs.containsKey("-Dcom.sun.management.jmxremote")) { -// argsList.add("-Dcom.sun.management.jmxremote"); -// } - if (!addedArgs.containsKey("-Djava.util.logging.manager")) { - argsList.add("-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager"); - } - if (!addedArgs.containsKey("-Djava.io.tmpdir")) { - argsList.add("-Djava.io.tmpdir=" + temp.getAbsolutePath()); - } - if (!addedArgs.containsKey("-Djava.endorsed.dirs")) { - argsList.add("-Djava.endorsed.dirs=" + endorsed.getAbsolutePath()); - } - if (!addedArgs.containsKey("-Dcatalina.base")) { - argsList.add("-Dcatalina.base=" + home.getAbsolutePath()); - } - if (!addedArgs.containsKey("-Dcatalina.home")) { - argsList.add("-Dcatalina.home=" + home.getAbsolutePath()); - } - if (!addedArgs.containsKey("-Dcatalina.ext.dirs")) { - argsList.add("-Dcatalina.ext.dirs=" + tlib.getAbsolutePath()); - } - if (!addedArgs.containsKey("-Dorg.apache.catalina.STRICT_SERVLET_COMPLIANCE")) { - argsList.add("-Dorg.apache.catalina.STRICT_SERVLET_COMPLIANCE=true"); - } - if (!addedArgs.containsKey("-Dorg.apache.tomcat.util.http.ServerCookie.ALLOW_HTTP_SEPARATORS_IN_V0")) { - argsList.add("-Dorg.apache.tomcat.util.http.ServerCookie.ALLOW_HTTP_SEPARATORS_IN_V0=true"); - } - - if (addedArgs.isEmpty()) { // default case - addIfSet(argsList, "javax.net.ssl.keyStore"); - addIfSet(argsList, "javax.net.ssl.keyStorePassword"); - addIfSet(argsList, "javax.net.ssl.trustStore"); - addIfSet(argsList, "java.protocol.handler.pkgs"); - } - - argsList.add("-ea"); - argsList.add("-classpath"); - - final StringBuilder cp = new StringBuilder(bootstrapJar.getAbsolutePath()).append(ps).append(juliJar.getAbsolutePath()); - if (commonsLoggingJar.exists()) { - cp.append(ps).append(commonsLoggingJar.getAbsolutePath()); - } - if (additionalClasspath != null) { - cp.append(ps).append(additionalClasspath); - } - argsList.add(cp.toString()); - - argsList.add("org.apache.catalina.startup.Bootstrap"); - } - - if (cmd == null) { - argsList.add(START); - } else { - argsList.add(cmd); - } - args = argsList.toArray(new String[argsList.size()]); - - if (verbose) { - System.out.println(Join.join("\n", args)); - } - - // kill3UNIXDebug(); - final ProcessBuilder pb = new ProcessBuilder(args); - pb.directory(home.getAbsoluteFile()); - Process p = pb.start(); - - //Process p = Runtime.getRuntime().exec(args); - Pipe.pipeOut(p); // why would we need to redirect System.in to the process, TomEE doesn't use it - - if (START.equals(cmd)) { - server.set(p); - } else if (STOP.equals(cmd)) { - waitFor(p); - p = server.get(); - if (p != null) { - waitFor(p); - } - } - - System.out.println("Started server process on port: " + port); - - } catch (final Exception e) { - throw (RuntimeException) new OpenEJBRuntimeException("Cannot start the server. Exception: " + e.getClass().getName() + ": " + e.getMessage()).initCause(e); - } - - if (debug) { - if (!connect(port, Integer.MAX_VALUE)) { - throw new OpenEJBRuntimeException("Could not connect to server: " + this.host + ":" + port); - } - } else { - if (!connect(port, tries)) { - throw new OpenEJBRuntimeException("Could not connect to server: " + this.host + ":" + port); - } - } - - } else { - if (verbose) { - System.out.println("[] FOUND STARTED SERVER"); - } - } - } - - private void waitFor(final Process p) { - final CountDownLatch latch = new CountDownLatch(1); - final Thread t = new Thread(new Runnable() { - @Override - public void run() { - try { - p.waitFor(); - } catch (final InterruptedException e) { - //Ignore - } - - latch.countDown(); - } - }, "process-waitFor"); - - t.start(); - - try { - if (!latch.await(10, TimeUnit.SECONDS)) { - killOnExit(p); - throw new RuntimeException("Timeout waiting for process"); - } - } catch (final InterruptedException e) { - killOnExit(p); - } - } - - public void kill3UNIX() { // debug purpose only - if (System.getProperty("os.name", "unknown").toLowerCase().startsWith("windows")) { - return; - } - - try { - final Field f = server.get().getClass().getDeclaredField("pid"); - f.setAccessible(true); - final int pid = (Integer) f.get(server.get()); - Pipe.pipe(Runtime.getRuntime().exec("kill -3 " + pid)); - } catch (final Exception e1) { - e1.printStackTrace(); - } - } - - private File lib(final String name, final File... dirs) { - for (final File dir : dirs) { - final File[] files = dir.listFiles(); - if (files != null) { - for (final File file : files) { - if (!file.isFile()) { - continue; - } - if (!file.getName().endsWith(".jar")) { - continue; - } - if (file.getName().startsWith(name)) { - return file; - } - } - } - } - - if (debug) { - for (final File dir : dirs) { - dumpLibs(dir); - } - } - throw new IllegalStateException("Cannot find the " + name + " jar"); - } - - // for debug purpose - private static void dumpLibs(final File dir) { - if (!dir.exists()) { - System.out.println("lib dir doesn't exist"); - return; - } - final File[] files = dir.listFiles(); - if (files != null) { - for (final File lib : files) { - System.out.println(lib.getAbsolutePath()); - } - } - } - - public Process getServer() { - return server.get(); - } - - private void addIfSet(final List<String> argsList, final String key) { - if (System.getProperties().containsKey(key)) { - argsList.add("-D" + key + "=" + System.getProperty(key)); - } - } - - private File getHome() { - if (home != null) { - return home; - } - - final String openejbHome = System.getProperty("openejb.home"); - - if (openejbHome != null) { - home = new File(openejbHome); - } - return home; - } - - public boolean stop() { - if (sendShutdown(5)) { - return true; - } else { - if (verbose) { - notSent(); - } - - return false; - } - } - - private void notSent() { - System.out.println("Failed to send the shutdown notification - TomEE is likely shut down already"); - } - - public void forceStop() throws Exception { - if (sendShutdown(5)) { - - // Check TomEE was effectively shut down after getting the message - // There can be concurrent shutdown operations (catalina shutdown hook for instance), - // so we have to wait here since it is important to be synchronous in this method - waitForServerShutdown(); - } else { - if (verbose) { - notSent(); - } - } - } - - private void waitForServerShutdown() throws Exception { - - if (verbose) { - System.out.print("Waiting for TomEE shutdown."); - } - - final boolean b = disconnect(portShutdown, tries); - - if (verbose) { - System.out.println(); - } - - if (!b) { - //We need to know about this - System.out.println("SEVERE: Failed to shutdown TomEE running on port " + portStartup + " using shutdown port: " + portShutdown); - } - } - - /** - * Send the shutdown message to the running server - * - * @param attempts How many times to try to send the message before giving up - * @return True is the message was sent, else false if unable to connect after the defined number of attempts - */ - private boolean sendShutdown(int attempts) { - Socket socket = null; - OutputStream stream = null; - try { - socket = new Socket(host, portShutdown); - stream = socket.getOutputStream(); - final String shutdown = command + Character.toString((char) 0); - for (int i = 0; i < shutdown.length(); i++) { - stream.write(shutdown.charAt(i)); - } - stream.flush(); - } catch (final Exception e) { - if (attempts > 0) { - try { - Thread.sleep(1000); - } catch (final InterruptedException ie) { - return false; - } - return sendShutdown(--attempts); - } else { - return false; - } - } finally { - if (null != stream) { - try { - stream.close(); - } catch (final Exception e) { - // Ignore - } - } - if (socket != null) { - try { - socket.close(); - } catch (final Exception e) { - // Ignore - } - } - } - - return true; - } - - private boolean connect(final int port, int tries) { - if (verbose) { - System.out.println("[] CONNECT ATTEMPT " + (this.tries - tries) + " on port: " + port); - } - - Socket s = null; - try { - s = new Socket(); - s.connect(new InetSocketAddress(this.host, port), 1000); - s.getOutputStream().close(); - if (verbose) { - System.out.println("[] CONNECTED IN " + (this.tries - tries)); - } - } catch (final Exception e) { - if (tries < 2) { - if (verbose) { - System.out.println("[] CONNECT ATTEMPTS FAILED ( " + (this.tries - tries) + " ATTEMPTS)"); - } - return false; - } else { - try { - Thread.sleep(1000); - } catch (final Exception e2) { - e2.printStackTrace(); - } - return connect(port, --tries); - } - } finally { - if (s != null) { - try { - s.close(); - } catch (final Exception ignored) { - // no-op - } - } - } - - return true; - } - - private boolean disconnect(final int port, int tries) { - if (verbose) { - System.out.println("[] DISCONNECT ATTEMPT " + (this.tries - tries) + " on port: " + port); - } - - Socket s = null; - try { - s = new Socket(); - s.connect(new InetSocketAddress(this.host, port), 500); - s.getOutputStream().close(); - - if (verbose) { - System.out.println("[] NOT DISCONNECTED AFTER ( " + (this.tries - tries) + " ATTEMPTS)"); - } - - if (tries < 2) { - //Give up - return false; - } else { - try { - Thread.sleep(1000); - } catch (final Exception e2) { - e2.printStackTrace(); - } - - return disconnect(port, --tries); - } - - } catch (final IOException e) { - //This is what we want - } finally { - if (s != null) { - try { - s.close(); - } catch (final Exception ignored) { - // no-op - } - } - } - - return true; - } - - public void setAdditionalClasspath(final String additionalClasspath) { - this.additionalClasspath = additionalClasspath; - } - - public void killOnExit() { - final Process p = this.server.get(); - if (!serverHasAlreadyBeenStarted && kill.contains(p)) { - return; - } - - killOnExit(p); - } - - private static void killOnExit(final Process p) { - kill.add(p); - } - - // Shutdown hook for processes - private static final List<Process> kill = new ArrayList<Process>(); - - static { - Runtime.getRuntime().addShutdownHook(new CleanUpThread()); - } - - public static class CleanUpThread extends Thread { - @Override - public void run() { - for (final Process server : kill) { - try { - if (server != null) { - server.destroy(); - server.waitFor(); - } - } catch (final Throwable e) { - //Ignore - } - } - } - } -} +/* + * 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.openejb.config; + +import org.apache.openejb.OpenEJBRuntimeException; +import org.apache.openejb.loader.Options; +import org.apache.openejb.util.Join; +import org.apache.openejb.util.Pipe; + +import java.io.File; +import java.io.IOException; +import java.io.OutputStream; +import java.lang.reflect.Field; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; +import java.util.logging.Level; +import java.util.logging.Logger; + +//import org.apache.openejb.loader.IO; + +/** + * NOTE: Do not add inner or anonymous classes or a dependency without updating ExecMojo + * + * @version $Rev$ $Date$ + */ +@SuppressWarnings("UseOfSystemOutOrSystemErr") +public class RemoteServer { + + private static final Options options = new Options(System.getProperties()); + public static final String SERVER_DEBUG_PORT = "server.debug.port"; + public static final String SERVER_SHUTDOWN_PORT = "server.shutdown.port"; + public static final String SERVER_SHUTDOWN_HOST = "server.shutdown.host"; + public static final String SERVER_SHUTDOWN_COMMAND = "server.shutdown.command"; + public static final String OPENEJB_SERVER_DEBUG = "openejb.server.debug"; + public static final String START = "start"; + public static final String STOP = "stop"; + + private final boolean debug = options.get(OPENEJB_SERVER_DEBUG, false); + private final boolean profile = options.get("openejb.server.profile", false); + private final boolean tomcat; + private final String javaOpts = System.getProperty("java.opts"); + private String additionalClasspath; + + /** + * Has the remote server's instance been already running ? + */ + private boolean serverHasAlreadyBeenStarted = true; + + private Properties properties; + private final AtomicReference<Process> server = new AtomicReference<Process>(); + private final int tries; + private final boolean verbose; + private final int portShutdown; + private final String host; + private final String command; + private File home; + private int portStartup; + + public RemoteServer() { + this(options.get("connect.tries", 60), options.get("verbose", false)); + } + + public RemoteServer(final int tries, final boolean verbose) { + this.tries = (tries < 1 ? 1 : (tries > 3600 ? 3600 : tries)); //Wait at least 1 second to start or stop, but not more than an hour. + this.verbose = verbose; + home = getHome(); + tomcat = (home != null) && (new File(new File(home, "bin"), "catalina.sh").exists()); + + portShutdown = options.get(SERVER_SHUTDOWN_PORT, tomcat ? 8005 : 4200); + portStartup = portShutdown; + command = options.get(SERVER_SHUTDOWN_COMMAND, "SHUTDOWN"); + host = options.get(SERVER_SHUTDOWN_HOST, "localhost"); + } + + public void init(final Properties props) { + properties = props; + + props.put("java.naming.factory.initial", "org.apache.openejb.client.RemoteInitialContextFactory"); + final int port = options.get("ejbd.port", 4201); + props.put("java.naming.provider.url", options.get("java.naming.provider.url", "127.0.0.1:" + port)); + props.put("java.naming.security.principal", "testuser"); + props.put("java.naming.security.credentials", "testpassword"); + } + + public static void main(final String[] args) { + assert args.length > 0 : "no arguments supplied: valid arguments are 'start' or 'stop'"; + if (args[0].equalsIgnoreCase(START)) { + final RemoteServer remoteServer = new RemoteServer(); + try { + remoteServer.start(); + } catch (final Exception e) { + remoteServer.destroy(); + e.printStackTrace(System.err); + } + } else if (args[0].equalsIgnoreCase(STOP)) { + final RemoteServer remoteServer = new RemoteServer(); + remoteServer.serverHasAlreadyBeenStarted = false; + try { + remoteServer.forceStop(); + } catch (final Exception e) { + e.printStackTrace(System.err); + } + } else { + throw new OpenEJBRuntimeException("valid arguments are 'start' or 'stop'"); + } + } + + public int getPortStartup() { + return this.portStartup; + } + + public void setPortStartup(final int portStartup) { + this.portStartup = portStartup; + } + + public Properties getProperties() { + return this.properties; + } + + public void destroy() { + + try { + final boolean stopSent = stop(); + + final Process p = server.get(); + if (p != null) { + + if (stopSent) { + waitFor(p); + } else { + p.destroy(); + } + } + } catch (final Exception e) { + Logger.getLogger(RemoteServer.class.getName()).log(Level.WARNING, "Failed to destroy remote server process", e); + } + } + + public void start() { + start(Collections.<String>emptyList(), START, true); + } + + public void start(final List<String> additionalArgs, final String cmd, final boolean checkPortAvailable) { + cmd(additionalArgs, cmd, checkPortAvailable); + } + + private void cmd(final List<String> additionalArgs, final String cmd, final boolean checkPortAvailable) { + boolean ok = true; + final int port = START.equals(cmd) ? portStartup : portShutdown; + + if (checkPortAvailable) { + ok = !connect(port, 1); + } + + if (ok) { + try { + if (verbose) { + System.out.println("[] " + cmd.toUpperCase() + " SERVER"); + } + + final File home = getHome(); + final String javaVersion = System.getProperty("java.version"); + if (verbose) { + System.out.println("OPENEJB_HOME = " + home.getAbsolutePath()); + final String systemInfo = "Java " + javaVersion + "; " + System.getProperty("os.name") + "/" + System.getProperty("os.version"); + System.out.println("SYSTEM_INFO = " + systemInfo); + } + + serverHasAlreadyBeenStarted = false; + + final File lib = new File(home, "lib"); + final File webapplib = new File(new File(new File(home, "webapps"), "tomee"), "lib"); + + File javaagentJar = null; + try { + javaagentJar = lib("openejb-javaagent", lib, webapplib); + } catch (final IllegalStateException ise) { + // no-op + } + + final File conf = new File(home, "conf"); + final File loggingProperties = new File(conf, "logging.properties"); + + //File openejbJar = new File(lib, "openejb-core-" + version + ".jar"); + + final String java; + final boolean isWindows = System.getProperty("os.name", "unknown").toLowerCase().startsWith("windows"); + if (isWindows && START.equals(cmd) && options.get("server.windows.fork", false)) { + // run and forget + java = new File(System.getProperty("java.home"), "bin/javaw").getAbsolutePath(); + } else { + java = new File(System.getProperty("java.home"), "bin/java").getAbsolutePath(); + } + + final List<String> argsList = new ArrayList<String>(20); + argsList.add(java); + argsList.add("-XX:+HeapDumpOnOutOfMemoryError"); + + if (debug) { + argsList.add("-Xdebug"); + argsList.add("-Xnoagent"); + argsList.add("-Djava.compiler=NONE"); + argsList.add("-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=" + options.get(SERVER_DEBUG_PORT, 5005)); + } + + if (profile) { + String yourkitHome = options.get("yourkit.home", "/Applications/YourKit_Java_Profiler_9.5.6.app/bin/mac/"); + if (!yourkitHome.endsWith("/")) { + yourkitHome += "/"; + } + final String yourkitOpts = options.get("yourkit.opts", "disablestacktelemetry,disableexceptiontelemetry,builtinprobes=none,delay=10000,sessionname=Tomcat"); + argsList.add("-agentpath:" + yourkitHome + "libyjpagent.jnilib=" + yourkitOpts); + } + + if (javaOpts != null) { + Collections.addAll(argsList, javaOpts.split(" +")); + } + + final Map<String, String> addedArgs = new HashMap<String, String>(); + if (additionalArgs != null) { + for (final String arg : additionalArgs) { + final String[] values = arg.split("="); + if (values.length == 1) { + addedArgs.put(values[0], "null"); + } else { + addedArgs.put(values[0], values[1]); + } + argsList.add(arg); + } + } + + if (!addedArgs.containsKey("-Djava.util.logging.config.file") && loggingProperties.exists()) { + argsList.add("-Djava.util.logging.config.file=" + loggingProperties.getAbsolutePath()); + } + + if (javaagentJar != null && javaagentJar.exists()) { + argsList.add("-javaagent:" + javaagentJar.getAbsolutePath()); + } + + //DMB: If you don't use an array, you get problems with jar paths containing spaces + // the command won't parse correctly + final String ps = File.pathSeparator; + + final String[] args; + if (!tomcat) { + final File openejbJar = lib("openejb-core", lib, webapplib); + final StringBuilder cp = new StringBuilder(openejbJar.getAbsolutePath()); + if (additionalClasspath != null) { + cp.append(ps).append(additionalClasspath); + } + + argsList.add("-cp"); + argsList.add(cp.toString()); + argsList.add("org.apache.openejb.cli.Bootstrap"); + } else { + final File bin = new File(home, "bin"); + final File tlib = new File(home, "lib"); + final File bootstrapJar = new File(bin, "bootstrap.jar"); + final File juliJar = new File(bin, "tomcat-juli.jar"); + final File commonsLoggingJar = new File(bin, "commons-logging-api.jar"); + + final File endorsed = new File(home, "endorsed"); + final File temp = new File(home, "temp"); + +// if (!addedArgs.containsKey("-Dcom.sun.management.jmxremote")) { +// argsList.add("-Dcom.sun.management.jmxremote"); +// } + if (!addedArgs.containsKey("-Djava.util.logging.manager")) { + argsList.add("-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager"); + } + if (!addedArgs.containsKey("-Djava.io.tmpdir")) { + argsList.add("-Djava.io.tmpdir=" + temp.getAbsolutePath()); + } + if (!addedArgs.containsKey("-Djava.endorsed.dirs")) { + argsList.add("-Djava.endorsed.dirs=" + endorsed.getAbsolutePath()); + } + if (!addedArgs.containsKey("-Dcatalina.base")) { + argsList.add("-Dcatalina.base=" + home.getAbsolutePath()); + } + if (!addedArgs.containsKey("-Dcatalina.home")) { + argsList.add("-Dcatalina.home=" + home.getAbsolutePath()); + } + if (!addedArgs.containsKey("-Dcatalina.ext.dirs")) { + argsList.add("-Dcatalina.ext.dirs=" + tlib.getAbsolutePath()); + } + if (!addedArgs.containsKey("-Dorg.apache.catalina.STRICT_SERVLET_COMPLIANCE")) { + argsList.add("-Dorg.apache.catalina.STRICT_SERVLET_COMPLIANCE=true"); + } + if (!addedArgs.containsKey("-Dorg.apache.tomcat.util.http.ServerCookie.ALLOW_HTTP_SEPARATORS_IN_V0")) { + argsList.add("-Dorg.apache.tomcat.util.http.ServerCookie.ALLOW_HTTP_SEPARATORS_IN_V0=true"); + } + + if (addedArgs.isEmpty()) { // default case + addIfSet(argsList, "javax.net.ssl.keyStore"); + addIfSet(argsList, "javax.net.ssl.keyStorePassword"); + addIfSet(argsList, "javax.net.ssl.trustStore"); + addIfSet(argsList, "java.protocol.handler.pkgs"); + } + + argsList.add("-ea"); + argsList.add("-classpath"); + + final StringBuilder cp = new StringBuilder(bootstrapJar.getAbsolutePath()).append(ps).append(juliJar.getAbsolutePath()); + if (commonsLoggingJar.exists()) { + cp.append(ps).append(commonsLoggingJar.getAbsolutePath()); + } + if (additionalClasspath != null) { + cp.append(ps).append(additionalClasspath); + } + argsList.add(cp.toString()); + + argsList.add("org.apache.catalina.startup.Bootstrap"); + } + + if (cmd == null) { + argsList.add(START); + } else { + argsList.add(cmd); + } + args = argsList.toArray(new String[argsList.size()]); + + if (verbose) { + System.out.println(Join.join("\n", args)); + } + + // kill3UNIXDebug(); + final ProcessBuilder pb = new ProcessBuilder(args); + pb.directory(home.getAbsoluteFile()); + Process p = pb.start(); + + //Process p = Runtime.getRuntime().exec(args); + Pipe.pipeOut(p); // why would we need to redirect System.in to the process, TomEE doesn't use it + + if (START.equals(cmd)) { + server.set(p); + } else if (STOP.equals(cmd)) { + waitFor(p); + p = server.get(); + if (p != null) { + waitFor(p); + } + } + + System.out.println("Started server process on port: " + port); + + } catch (final Exception e) { + throw (RuntimeException) new OpenEJBRuntimeException("Cannot start the server. Exception: " + e.getClass().getName() + ": " + e.getMessage()).initCause(e); + } + + if (debug) { + if (!connect(port, Integer.MAX_VALUE)) { + throw new OpenEJBRuntimeException("Could not connect to server: " + this.host + ":" + port); + } + } else { + if (!connect(port, tries)) { + throw new OpenEJBRuntimeException("Could not connect to server: " + this.host + ":" + port); + } + } + + } else { + if (verbose) { + System.out.println("[] FOUND STARTED SERVER"); + } + } + } + + private void waitFor(final Process p) { + final CountDownLatch latch = new CountDownLatch(1); + final Thread t = new Thread(new Runnable() { + @Override + public void run() { + try { + p.waitFor(); + } catch (final InterruptedException e) { + //Ignore + } + + latch.countDown(); + } + }, "process-waitFor"); + + t.start(); + + try { + if (!latch.await(10, TimeUnit.SECONDS)) { + killOnExit(p); + throw new RuntimeException("Timeout waiting for process"); + } + } catch (final InterruptedException e) { + killOnExit(p); + } + } + + public void kill3UNIX() { // debug purpose only + if (System.getProperty("os.name", "unknown").toLowerCase().startsWith("windows")) { + return; + } + + try { + final Field f = server.get().getClass().getDeclaredField("pid"); + f.setAccessible(true); + final int pid = (Integer) f.get(server.get()); + Pipe.pipe(Runtime.getRuntime().exec("kill -3 " + pid)); + } catch (final Exception e1) { + e1.printStackTrace(); + } + } + + private File lib(final String name, final File... dirs) { + for (final File dir : dirs) { + final File[] files = dir.listFiles(); + if (files != null) { + for (final File file : files) { + if (!file.isFile()) { + continue; + } + if (!file.getName().endsWith(".jar")) { + continue; + } + if (file.getName().startsWith(name)) { + return file; + } + } + } + } + + if (debug) { + for (final File dir : dirs) { + dumpLibs(dir); + } + } + throw new IllegalStateException("Cannot find the " + name + " jar"); + } + + // for debug purpose + private static void dumpLibs(final File dir) { + if (!dir.exists()) { + System.out.println("lib dir doesn't exist"); + return; + } + final File[] files = dir.listFiles(); + if (files != null) { + for (final File lib : files) { + System.out.println(lib.getAbsolutePath()); + } + } + } + + public Process getServer() { + return server.get(); + } + + private void addIfSet(final List<String> argsList, final String key) { + if (System.getProperties().containsKey(key)) { + argsList.add("-D" + key + "=" + System.getProperty(key)); + } + } + + private File getHome() { + if (home != null) { + return home; + } + + final String openejbHome = System.getProperty("openejb.home"); + + if (openejbHome != null) { + home = new File(openejbHome); + } + return home; + } + + public boolean stop() { + if (sendShutdown(5)) { + return true; + } else { + if (verbose) { + notSent(); + } + + return false; + } + } + + private void notSent() { + System.out.println("Failed to send the shutdown notification - TomEE is likely shut down already"); + } + + public void forceStop() throws Exception { + if (sendShutdown(5)) { + + // Check TomEE was effectively shut down after getting the message + // There can be concurrent shutdown operations (catalina shutdown hook for instance), + // so we have to wait here since it is important to be synchronous in this method + waitForServerShutdown(); + } else { + if (verbose) { + notSent(); + } + } + } + + private void waitForServerShutdown() throws Exception { + + if (verbose) { + System.out.print("Waiting for TomEE shutdown."); + } + + final boolean b = disconnect(portShutdown, tries); + + if (verbose) { + System.out.println(); + } + + if (!b) { + //We need to know about this + System.out.println("SEVERE: Failed to shutdown TomEE running on port " + portStartup + " using shutdown port: " + portShutdown); + } + } + + /** + * Send the shutdown message to the running server + * + * @param attempts How many times to try to send the message before giving up + * @return True is the message was sent, else false if unable to connect after the defined number of attempts + */ + private boolean sendShutdown(int attempts) { + Socket socket = null; + OutputStream stream = null; + try { + socket = new Socket(host, portShutdown); + stream = socket.getOutputStream(); + final String shutdown = command + Character.toString((char) 0); + for (int i = 0; i < shutdown.length(); i++) { + stream.write(shutdown.charAt(i)); + } + stream.flush(); + } catch (final Exception e) { + if (attempts > 0) { + try { + Thread.sleep(1000); + } catch (final InterruptedException ie) { + return false; + } + return sendShutdown(--attempts); + } else { + return false; + } + } finally { + if (null != stream) { + try { + stream.close(); + } catch (final Exception e) { + // Ignore + } + } + if (socket != null) { + try { + socket.close(); + } catch (final Exception e) { + // Ignore + } + } + } + + return true; + } + + private boolean connect(final int port, int tries) { + if (verbose) { + System.out.println("[] CONNECT ATTEMPT " + (this.tries - tries) + " on port: " + port); + } + + Socket s = null; + try { + s = new Socket(); + s.connect(new InetSocketAddress(this.host, port), 1000); + s.getOutputStream().close(); + if (verbose) { + System.out.println("[] CONNECTED IN " + (this.tries - tries)); + } + } catch (final Exception e) { + if (tries < 2) { + if (verbose) { + System.out.println("[] CONNECT ATTEMPTS FAILED ( " + (this.tries - tries) + " ATTEMPTS)"); + } + return false; + } else { + try { + Thread.sleep(1000); + } catch (final Exception e2) { + e2.printStackTrace(); + } + return connect(port, --tries); + } + } finally { + if (s != null) { + try { + s.close(); + } catch (final Exception ignored) { + // no-op + } + } + } + + return true; + } + + private boolean disconnect(final int port, int tries) { + if (verbose) { + System.out.println("[] DISCONNECT ATTEMPT " + (this.tries - tries) + " on port: " + port); + } + + Socket s = null; + try { + s = new Socket(); + s.connect(new InetSocketAddress(this.host, port), 500); + s.getOutputStream().close(); + + if (verbose) { + System.out.println("[] NOT DISCONNECTED AFTER ( " + (this.tries - tries) + " ATTEMPTS)"); + } + + if (tries < 2) { + //Give up + return false; + } else { + try { + Thread.sleep(1000); + } catch (final Exception e2) { + e2.printStackTrace(); + } + + return disconnect(port, --tries); + } + + } catch (final IOException e) { + //This is what we want + } finally { + if (s != null) { + try { + s.close(); + } catch (final Exception ignored) { + // no-op + } + } + } + + return true; + } + + public void setAdditionalClasspath(final String additionalClasspath) { + this.additionalClasspath = additionalClasspath; + } + + public void killOnExit() { + final Process p = this.server.get(); + if (!serverHasAlreadyBeenStarted && kill.contains(p)) { + return; + } + + killOnExit(p); + } + + private static void killOnExit(final Process p) { + kill.add(p); + } + + // Shutdown hook for processes + private static final List<Process> kill = new ArrayList<Process>(); + + static { + Runtime.getRuntime().addShutdownHook(new CleanUpThread()); + } + + public static class CleanUpThread extends Thread { + @Override + public void run() { + for (final Process server : kill) { + try { + if (server != null) { + server.destroy(); + server.waitFor(); + } + } catch (final Throwable e) { + //Ignore + } + } + } + } +}
http://git-wip-us.apache.org/repos/asf/tomee/blob/52567075/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckAnnotations.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckAnnotations.java b/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckAnnotations.java index 8a6adce..1ff2611 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckAnnotations.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckAnnotations.java @@ -1,96 +1,96 @@ -/* - * 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.openejb.config.rules; - -import org.apache.openejb.config.AppModule; -import org.apache.openejb.config.EjbModule; -import org.apache.openejb.config.WebModule; -import org.apache.openejb.util.LogCategory; -import org.apache.openejb.util.Logger; -import org.apache.xbean.finder.IAnnotationFinder; - -import javax.jws.WebService; -import java.lang.annotation.Annotation; -import java.util.Arrays; -import java.util.List; - -public class CheckAnnotations extends ValidationBase { - - Logger logger = Logger.getInstance(LogCategory.OPENEJB_STARTUP_VALIDATION, CheckAnnotations.class); - - @Override - public void validate(final AppModule appModule) { - try { - - for (final EjbModule ejbModule : appModule.getEjbModules()) { - module = ejbModule; - findClassesAnnotatedWithWebService(ejbModule); - } - - for (final WebModule webModule : appModule.getWebModules()) { - module = webModule; - findClassesAnnotatedWithWebService(webModule); - } - - } catch (final Exception e) { - logger.error("Error while validating @WebService annotation", e); - } - - - } - - private void findClassesAnnotatedWithWebService(final EjbModule ejbModule) { - - final IAnnotationFinder finder = ejbModule.getFinder(); - if (finder != null) { - findIncorrectAnnotationAndWarn(finder, ejbModule.toString()); - } - } - - - private void findClassesAnnotatedWithWebService(final WebModule webModule) { - final IAnnotationFinder finder = webModule.getFinder(); - if (finder != null) { - findIncorrectAnnotationAndWarn(finder, webModule.toString()); - } - - } - - private void findIncorrectAnnotationAndWarn(final IAnnotationFinder finder, final String component) { - final List<Class<?>> webserviceAnnotatedClasses = finder.findAnnotatedClasses(WebService.class); - for (final Class clazz : webserviceAnnotatedClasses) { - final Annotation[] annotations = clazz.getDeclaredAnnotations(); - - final List<Annotation> declaredAnnotations = Arrays.asList(annotations); - for (final Annotation declaredAnn : declaredAnnotations) { - if (declaredAnn.annotationType().getName().equals("javax.ejb.Stateful")) { - warn(component, "annotation.invalid.stateful.webservice", clazz.getName()); - } - if (declaredAnn.annotationType().getName().equals("javax.annotation.ManagedBean")) { - warn(component, "annotation.invalid.managedbean.webservice", clazz.getName()); - } - if (declaredAnn.annotationType().getName().equals("javax.ejb.MessageDriven")) { - warn(component, "annotation.invalid.messagedriven.webservice", clazz.getName()); - } - - } - } - } - - +/* + * 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.openejb.config.rules; + +import org.apache.openejb.config.AppModule; +import org.apache.openejb.config.EjbModule; +import org.apache.openejb.config.WebModule; +import org.apache.openejb.util.LogCategory; +import org.apache.openejb.util.Logger; +import org.apache.xbean.finder.IAnnotationFinder; + +import javax.jws.WebService; +import java.lang.annotation.Annotation; +import java.util.Arrays; +import java.util.List; + +public class CheckAnnotations extends ValidationBase { + + Logger logger = Logger.getInstance(LogCategory.OPENEJB_STARTUP_VALIDATION, CheckAnnotations.class); + + @Override + public void validate(final AppModule appModule) { + try { + + for (final EjbModule ejbModule : appModule.getEjbModules()) { + module = ejbModule; + findClassesAnnotatedWithWebService(ejbModule); + } + + for (final WebModule webModule : appModule.getWebModules()) { + module = webModule; + findClassesAnnotatedWithWebService(webModule); + } + + } catch (final Exception e) { + logger.error("Error while validating @WebService annotation", e); + } + + + } + + private void findClassesAnnotatedWithWebService(final EjbModule ejbModule) { + + final IAnnotationFinder finder = ejbModule.getFinder(); + if (finder != null) { + findIncorrectAnnotationAndWarn(finder, ejbModule.toString()); + } + } + + + private void findClassesAnnotatedWithWebService(final WebModule webModule) { + final IAnnotationFinder finder = webModule.getFinder(); + if (finder != null) { + findIncorrectAnnotationAndWarn(finder, webModule.toString()); + } + + } + + private void findIncorrectAnnotationAndWarn(final IAnnotationFinder finder, final String component) { + final List<Class<?>> webserviceAnnotatedClasses = finder.findAnnotatedClasses(WebService.class); + for (final Class clazz : webserviceAnnotatedClasses) { + final Annotation[] annotations = clazz.getDeclaredAnnotations(); + + final List<Annotation> declaredAnnotations = Arrays.asList(annotations); + for (final Annotation declaredAnn : declaredAnnotations) { + if (declaredAnn.annotationType().getName().equals("javax.ejb.Stateful")) { + warn(component, "annotation.invalid.stateful.webservice", clazz.getName()); + } + if (declaredAnn.annotationType().getName().equals("javax.annotation.ManagedBean")) { + warn(component, "annotation.invalid.managedbean.webservice", clazz.getName()); + } + if (declaredAnn.annotationType().getName().equals("javax.ejb.MessageDriven")) { + warn(component, "annotation.invalid.messagedriven.webservice", clazz.getName()); + } + + } + } + } + + } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/tomee/blob/52567075/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckIncorrectPropertyNames.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckIncorrectPropertyNames.java b/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckIncorrectPropertyNames.java index e2e3eaf..8b85bb3 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckIncorrectPropertyNames.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckIncorrectPropertyNames.java @@ -1,84 +1,84 @@ -/* - * 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.openejb.config.rules; - -import org.apache.openejb.config.AppModule; -import org.apache.openejb.loader.SystemInstance; - -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.Properties; - -public class CheckIncorrectPropertyNames extends ValidationBase { - - Map incorrectAndCorrectPropNames = new HashMap<String, String>(); - - { - //incorrect property key : correct property key - incorrectAndCorrectPropNames.put("java.persistence.provider", "javax.persistence.provider"); - incorrectAndCorrectPropNames.put("java.persistence.transactionType", "javax.persistence.transactionType"); - incorrectAndCorrectPropNames.put("java.persistence.jtaDataSource", "javax.persistence.jtaDataSource"); - incorrectAndCorrectPropNames.put("java.persistence.nonJtaDataSource", "javax.persistence.nonJtaDataSource"); - incorrectAndCorrectPropNames.put("java.net.ssl.keyStore", "javax.net.ssl.keyStore"); - incorrectAndCorrectPropNames.put("java.net.ssl.keyStorePassword", "javax.net.ssl.keyStorePassword"); - incorrectAndCorrectPropNames.put("java.net.ssl.trustStore", "javax.net.ssl.trustStore"); - incorrectAndCorrectPropNames.put("java.security.jacc.PolicyConfigurationFactory.provider", "javax.security.jacc.PolicyConfigurationFactory.provider"); - incorrectAndCorrectPropNames.put("java.security.jacc.policy.provider", "javax.security.jacc.policy.provider"); - incorrectAndCorrectPropNames.put("java.xml.ws.spi.Provider", "javax.xml.ws.spi.Provider"); - incorrectAndCorrectPropNames.put("java.xml.soap.MessageFactory", "javax.xml.soap.MessageFactory"); - incorrectAndCorrectPropNames.put("java.xml.soap.SOAPFactory", "javax.xml.soap.SOAPFactory"); - incorrectAndCorrectPropNames.put("java.xml.soap.SOAPConnectionFactory", "javax.xml.soap.SOAPConnectionFactory"); - incorrectAndCorrectPropNames.put("java.xml.soap.MetaFactory", "javax.xml.soap.MetaFactory"); - incorrectAndCorrectPropNames.put("java.persistence.sharedCache.mode", "javax.persistence.sharedCache.mode"); - incorrectAndCorrectPropNames.put("java.persistence.validation.mode", "javax.persistence.validation.mode"); - incorrectAndCorrectPropNames.put("java.persistence.transactionType", "javax.persistence.transactionType"); - - incorrectAndCorrectPropNames.put("javax.naming.applet", "java.naming.applet"); - incorrectAndCorrectPropNames.put("javax.naming.authoritative", "java.naming.authoritative"); - incorrectAndCorrectPropNames.put("javax.naming.batchsize", "java.naming.batchsize"); - incorrectAndCorrectPropNames.put("javax.naming.dns.url", "java.naming.dns.url"); - incorrectAndCorrectPropNames.put("javax.naming.factory.initial", "java.naming.factory.initial"); - incorrectAndCorrectPropNames.put("javax.naming.factory.object", "java.naming.factory.object"); - incorrectAndCorrectPropNames.put("javax.naming.factory.state", "java.naming.factory.state"); - incorrectAndCorrectPropNames.put("javax.naming.factory.url.pkgs", "java.naming.factory.url.pkgs"); - incorrectAndCorrectPropNames.put("javax.naming.language", "java.naming.language"); - incorrectAndCorrectPropNames.put("javax.naming.provider.url", "java.naming.provider.url"); - incorrectAndCorrectPropNames.put("javax.naming.referral", "java.naming.referral"); - incorrectAndCorrectPropNames.put("javax.naming.security.authentication", "java.naming.security.authentication"); - incorrectAndCorrectPropNames.put("javax.naming.security.credentials", "java.naming.security.credentials"); - incorrectAndCorrectPropNames.put("javax.naming.security.principal", "java.naming.security.principal"); - incorrectAndCorrectPropNames.put("javax.naming.security.protocol", "java.naming.security.protocol"); - - } - - @Override - public void validate(final AppModule appModule) { - this.module = appModule; - final Properties systemProperties = SystemInstance.get().getProperties(); - - final Iterator iterator = incorrectAndCorrectPropNames.entrySet().iterator(); - while (iterator.hasNext()) { - final Map.Entry<String, String> entry = (Map.Entry<String, String>) iterator.next(); - if (systemProperties.containsKey(entry.getKey())) { - warn(appModule.toString(), "incorrect.property.name", entry.getKey(), entry.getValue()); - } - } - - } -} +/* + * 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.openejb.config.rules; + +import org.apache.openejb.config.AppModule; +import org.apache.openejb.loader.SystemInstance; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Properties; + +public class CheckIncorrectPropertyNames extends ValidationBase { + + Map incorrectAndCorrectPropNames = new HashMap<String, String>(); + + { + //incorrect property key : correct property key + incorrectAndCorrectPropNames.put("java.persistence.provider", "javax.persistence.provider"); + incorrectAndCorrectPropNames.put("java.persistence.transactionType", "javax.persistence.transactionType"); + incorrectAndCorrectPropNames.put("java.persistence.jtaDataSource", "javax.persistence.jtaDataSource"); + incorrectAndCorrectPropNames.put("java.persistence.nonJtaDataSource", "javax.persistence.nonJtaDataSource"); + incorrectAndCorrectPropNames.put("java.net.ssl.keyStore", "javax.net.ssl.keyStore"); + incorrectAndCorrectPropNames.put("java.net.ssl.keyStorePassword", "javax.net.ssl.keyStorePassword"); + incorrectAndCorrectPropNames.put("java.net.ssl.trustStore", "javax.net.ssl.trustStore"); + incorrectAndCorrectPropNames.put("java.security.jacc.PolicyConfigurationFactory.provider", "javax.security.jacc.PolicyConfigurationFactory.provider"); + incorrectAndCorrectPropNames.put("java.security.jacc.policy.provider", "javax.security.jacc.policy.provider"); + incorrectAndCorrectPropNames.put("java.xml.ws.spi.Provider", "javax.xml.ws.spi.Provider"); + incorrectAndCorrectPropNames.put("java.xml.soap.MessageFactory", "javax.xml.soap.MessageFactory"); + incorrectAndCorrectPropNames.put("java.xml.soap.SOAPFactory", "javax.xml.soap.SOAPFactory"); + incorrectAndCorrectPropNames.put("java.xml.soap.SOAPConnectionFactory", "javax.xml.soap.SOAPConnectionFactory"); + incorrectAndCorrectPropNames.put("java.xml.soap.MetaFactory", "javax.xml.soap.MetaFactory"); + incorrectAndCorrectPropNames.put("java.persistence.sharedCache.mode", "javax.persistence.sharedCache.mode"); + incorrectAndCorrectPropNames.put("java.persistence.validation.mode", "javax.persistence.validation.mode"); + incorrectAndCorrectPropNames.put("java.persistence.transactionType", "javax.persistence.transactionType"); + + incorrectAndCorrectPropNames.put("javax.naming.applet", "java.naming.applet"); + incorrectAndCorrectPropNames.put("javax.naming.authoritative", "java.naming.authoritative"); + incorrectAndCorrectPropNames.put("javax.naming.batchsize", "java.naming.batchsize"); + incorrectAndCorrectPropNames.put("javax.naming.dns.url", "java.naming.dns.url"); + incorrectAndCorrectPropNames.put("javax.naming.factory.initial", "java.naming.factory.initial"); + incorrectAndCorrectPropNames.put("javax.naming.factory.object", "java.naming.factory.object"); + incorrectAndCorrectPropNames.put("javax.naming.factory.state", "java.naming.factory.state"); + incorrectAndCorrectPropNames.put("javax.naming.factory.url.pkgs", "java.naming.factory.url.pkgs"); + incorrectAndCorrectPropNames.put("javax.naming.language", "java.naming.language"); + incorrectAndCorrectPropNames.put("javax.naming.provider.url", "java.naming.provider.url"); + incorrectAndCorrectPropNames.put("javax.naming.referral", "java.naming.referral"); + incorrectAndCorrectPropNames.put("javax.naming.security.authentication", "java.naming.security.authentication"); + incorrectAndCorrectPropNames.put("javax.naming.security.credentials", "java.naming.security.credentials"); + incorrectAndCorrectPropNames.put("javax.naming.security.principal", "java.naming.security.principal"); + incorrectAndCorrectPropNames.put("javax.naming.security.protocol", "java.naming.security.protocol"); + + } + + @Override + public void validate(final AppModule appModule) { + this.module = appModule; + final Properties systemProperties = SystemInstance.get().getProperties(); + + final Iterator iterator = incorrectAndCorrectPropNames.entrySet().iterator(); + while (iterator.hasNext()) { + final Map.Entry<String, String> entry = (Map.Entry<String, String>) iterator.next(); + if (systemProperties.containsKey(entry.getKey())) { + warn(appModule.toString(), "incorrect.property.name", entry.getKey(), entry.getValue()); + } + } + + } +} http://git-wip-us.apache.org/repos/asf/tomee/blob/52567075/container/openejb-core/src/main/java/org/apache/openejb/injection/FallbackPropertyInjector.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/main/java/org/apache/openejb/injection/FallbackPropertyInjector.java b/container/openejb-core/src/main/java/org/apache/openejb/injection/FallbackPropertyInjector.java index c886a92..8a176fd 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/injection/FallbackPropertyInjector.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/injection/FallbackPropertyInjector.java @@ -1,24 +1,24 @@ -/* - * 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.openejb.injection; - -import org.apache.openejb.Injection; - -public interface FallbackPropertyInjector { - Object getValue(final Injection prefix); -} +/* + * 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.openejb.injection; + +import org.apache.openejb.Injection; + +public interface FallbackPropertyInjector { + Object getValue(final Injection prefix); +} http://git-wip-us.apache.org/repos/asf/tomee/blob/52567075/container/openejb-core/src/main/java/org/apache/openejb/persistence/QueryOperation.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/main/java/org/apache/openejb/persistence/QueryOperation.java b/container/openejb-core/src/main/java/org/apache/openejb/persistence/QueryOperation.java index 949764e..01eba63 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/persistence/QueryOperation.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/persistence/QueryOperation.java @@ -1,24 +1,24 @@ -/* - * 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.openejb.persistence; - -import javax.persistence.Query; - -public interface QueryOperation { - Query apply(final Query query); -} +/* + * 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.openejb.persistence; + +import javax.persistence.Query; + +public interface QueryOperation { + Query apply(final Query query); +}
