You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by an...@apache.org on 2015/12/09 17:37:24 UTC

[15/18] tomee git commit: EOL

http://git-wip-us.apache.org/repos/asf/tomee/blob/48c99a5a/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/48c99a5a/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/48c99a5a/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/48c99a5a/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/48c99a5a/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);
+}