You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by jg...@apache.org on 2015/07/14 02:25:29 UTC

[2/6] tomee git commit: Re-use the connection for the datasource and transaction rather than fetch another one only to throw it away later. Slightly experimental change to prevent the db pool locking up.

http://git-wip-us.apache.org/repos/asf/tomee/blob/bd7dbd0f/server/openejb-multicast/src/test/java/org/apache/openejb/server/discovery/MulticastPulseAgentTest.java
----------------------------------------------------------------------
diff --git a/server/openejb-multicast/src/test/java/org/apache/openejb/server/discovery/MulticastPulseAgentTest.java b/server/openejb-multicast/src/test/java/org/apache/openejb/server/discovery/MulticastPulseAgentTest.java
index 223a768..92147ed 100644
--- a/server/openejb-multicast/src/test/java/org/apache/openejb/server/discovery/MulticastPulseAgentTest.java
+++ b/server/openejb-multicast/src/test/java/org/apache/openejb/server/discovery/MulticastPulseAgentTest.java
@@ -1,513 +1,513 @@
-/**
- * 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.server.discovery;
-
-import org.apache.openejb.server.DiscoveryListener;
-import org.apache.openejb.util.NetworkUtil;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import sun.net.util.IPAddressUtil;
-
-import java.net.DatagramPacket;
-import java.net.Inet6Address;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.net.MulticastSocket;
-import java.net.SocketAddress;
-import java.net.URI;
-import java.net.UnknownHostException;
-import java.nio.charset.Charset;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.HashSet;
-import java.util.Properties;
-import java.util.Set;
-import java.util.Timer;
-import java.util.TimerTask;
-import java.util.TreeSet;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.locks.ReentrantLock;
-import java.util.logging.Logger;
-
-@SuppressWarnings("UseOfSystemOutOrSystemErr")
-public class MulticastPulseAgentTest {
-
-    private static final Set<String> schemes = new HashSet<String>(Arrays.asList("ejbd", "ejbds", "http"));
-    private static ExecutorService executor;
-    private static final Charset utf8 = Charset.forName("UTF-8");
-    private static final String forGroup = "*";
-    private static final String host = "239.255.3.2";
-    private static final int port = NetworkUtil.getNextAvailablePort();
-    private static MulticastPulseAgent agent;
-
-    @BeforeClass
-    public static void beforeClass() throws Exception {
-
-        executor = Executors.newFixedThreadPool(10);
-
-        final Properties p = new Properties();
-        p.setProperty("bind", host);
-        p.setProperty("port", "" + port);
-
-        agent = new MulticastPulseAgent();
-        agent.init(p);
-        agent.setDiscoveryListener(new MyDiscoveryListener("MulticastPulseAgentTest"));
-        agent.registerService(new URI("ejb:ejbd://[::]:4201"));
-        agent.registerService(new URI("ejb:ejbd://0.0.0.0:4201"));
-        agent.registerService(new URI("ejb:http://127.0.0.1:4201"));
-        agent.registerService(new URI("ejb:https://0.0.0.1:4201"));
-        agent.start();
-
-        System.out.println();
-    }
-
-    @AfterClass
-    public static void afterClass() throws Exception {
-        agent.stop();
-        executor.shutdownNow();
-    }
-
-    /**
-     * Most of this code is identical to org.apache.openejb.client.MulticastPulseClient#discoverURIs
-     * <p/>
-     * The MulticastPulseClient class is not shared or available here so the test has to emulate it.
-     *
-     * @throws Exception On error
-     */
-    @Test
-    public void test() throws Exception {
-        if ("true".equals(System.getProperty("skipMulticastTests"))) {
-            Logger.getLogger(this.getClass().getName()).warning("Skipping MulticastTest " + this.getClass().getName());
-            return;
-        }
-
-        final InetAddress ia;
-
-        try {
-            ia = InetAddress.getByName(host);
-        } catch (final UnknownHostException e) {
-            throw new Exception(host + " is not a valid address", e);
-        }
-
-        if (null == ia || !ia.isMulticastAddress()) {
-            throw new Exception(host + " is not a valid multicast address");
-        }
-
-        //Returns at least one socket per valid network interface
-        final MulticastSocket[] clientSockets = MulticastPulseAgent.getSockets(host, port);
-
-        //No point going on if we don't have sockets...
-        if (clientSockets.length < 1) {
-            System.out.println("Cannnot perform multipulse test without a valid interface");
-            return;
-        }
-
-        final byte[] bytes = (MulticastPulseAgent.CLIENT + forGroup).getBytes(utf8);
-        final DatagramPacket request = new DatagramPacket(bytes, bytes.length, new InetSocketAddress(ia, port));
-        final AtomicBoolean running = new AtomicBoolean(true);
-        final Timer timer = new Timer(true);
-
-        final Set<URI> set = new TreeSet<URI>(new Comparator<URI>() {
-            @Override
-            public int compare(final URI uri1, final URI uri2) {
-
-                //Ignore server hostname
-                URI u1 = URI.create(uri1.getSchemeSpecificPart());
-                URI u2 = URI.create(uri2.getSchemeSpecificPart());
-
-                //Ignore scheme (ejb,ejbs,etc.)
-                u1 = URI.create(u1.getSchemeSpecificPart());
-                u2 = URI.create(u2.getSchemeSpecificPart());
-
-                //Compare URI hosts
-                int i = compare(u1.getHost(), u2.getHost());
-                if (i != 0) {
-                    i = uri1.compareTo(uri2);
-                }
-
-                return i;
-            }
-
-            private int compare(final String h1, final String h2) {
-
-                //Sort by hostname, IPv4, IPv6
-
-                try {
-                    if (IPAddressUtil.isIPv4LiteralAddress(h1)) {
-                        if (IPAddressUtil.isIPv6LiteralAddress(h2.replace("[", "").replace("]", ""))) {
-                            return -1;
-                        }
-                    } else if (IPAddressUtil.isIPv6LiteralAddress(h1.replace("[", "").replace("]", ""))) {
-                        if (IPAddressUtil.isIPv4LiteralAddress(h2)) {
-                            return 1;
-                        }
-                    } else if (0 != h1.compareTo(h2)) {
-                        return -1;
-                    }
-                } catch (final Throwable e) {
-                    //Ignore
-                }
-
-                return h1.compareTo(h2);
-            }
-        });
-
-        final ReentrantLock setLock = new ReentrantLock();
-
-        //Start threads that listen for multicast packets on our channel.
-        //These need to start 'before' we pulse a request.
-        final ArrayList<Future> futures = new ArrayList<Future>();
-        final CountDownLatch latch = new CountDownLatch(clientSockets.length);
-
-        for (final MulticastSocket socket : clientSockets) {
-
-            futures.add(executor.submit(new Runnable() {
-                @Override
-                public void run() {
-
-                    String name = "Unknown interface";
-                    try {
-                        name = socket.getNetworkInterface().getDisplayName();
-                    } catch (final Throwable e) {
-                        //Ignore
-                    }
-                    System.out.println("Entered MulticastPulse client thread on: " + name);
-
-                    final DatagramPacket response = new DatagramPacket(new byte[2048], 2048);
-
-                    latch.countDown();
-
-                    while (running.get()) {
-                        try {
-
-                            socket.receive(response);
-
-                            final SocketAddress sa = response.getSocketAddress();
-
-                            if ((sa instanceof InetSocketAddress)) {
-
-                                int len = response.getLength();
-                                if (len > 2048) {
-                                    len = 2048;
-                                }
-
-                                String s = new String(response.getData(), 0, len);
-
-                                if (s.startsWith(MulticastPulseAgent.SERVER)) {
-
-                                    s = (s.replace(MulticastPulseAgent.SERVER, ""));
-                                    final String group = s.substring(0, s.indexOf(':'));
-                                    s = s.substring(group.length() + 1);
-
-                                    if (!"*".equals(forGroup) && !forGroup.equals(group)) {
-                                        continue;
-                                    }
-
-                                    final String services = s.substring(0, s.lastIndexOf('|'));
-                                    s = s.substring(services.length() + 1);
-
-                                    final String[] serviceList = services.split("\\|");
-                                    final String[] hosts = s.split(",");
-
-                                    System.out.println(String.format("\n" + name + " received Server pulse:\n\tGroup: %1$s\n\tServices: %2$s\n\tServer: %3$s\n",
-                                            group,
-                                            services,
-                                            s));
-
-                                    for (final String svc : serviceList) {
-
-                                        if (MulticastPulseAgent.EMPTY.equals(svc)) {
-                                            continue;
-                                        }
-
-                                        final URI serviceUri;
-                                        try {
-                                            serviceUri = URI.create(svc);
-                                        } catch (final Throwable e) {
-                                            continue;
-                                        }
-
-                                        if (schemes.contains(serviceUri.getScheme())) {
-
-                                            //Just because multicast was received on this host is does not mean the service is on the same
-                                            //We can however use this to identify an individual machine and group
-                                            final String serverHost = ((InetSocketAddress) response.getSocketAddress()).getAddress().getHostAddress();
-
-                                            final String serviceHost = serviceUri.getHost();
-                                            if (MulticastPulseAgent.isLocalAddress(serviceHost, false)) {
-                                                if (!MulticastPulseAgent.isLocalAddress(serverHost, false)) {
-                                                    //A local service is only available to a local client
-                                                    continue;
-                                                }
-                                            }
-
-                                            final String fullsvc = ("mp-" + serverHost + ":" + group + ":" + svc);
-
-                                            setLock.lock();
-
-                                            try {
-                                                if (fullsvc.contains("0.0.0.0")) {
-                                                    for (final String h : hosts) {
-                                                        if (!h.replace("[", "").startsWith("2001:0:")) { //Filter Teredo
-                                                            set.add(URI.create(fullsvc.replace("0.0.0.0", ipFormat(h))));
-                                                        }
-                                                    }
-                                                } else if (fullsvc.contains("[::]")) {
-                                                    for (final String h : hosts) {
-                                                        if (!h.replace("[", "").startsWith("2001:0:")) { //Filter Teredo
-                                                            set.add(URI.create(fullsvc.replace("[::]", ipFormat(h))));
-                                                        }
-                                                    }
-                                                } else {
-                                                    //Just add as is
-                                                    set.add(URI.create(fullsvc));
-                                                }
-                                            } catch (final Throwable e) {
-                                                //Ignore
-                                            } finally {
-                                                setLock.unlock();
-                                            }
-                                        } else {
-                                            System.out.println("Reject service: " + serviceUri.toASCIIString() + " - Not looking for scheme: " + serviceUri.getScheme());
-                                        }
-                                    }
-                                }
-                            }
-
-                        } catch (final Throwable e) {
-                            //Ignore
-                        }
-                    }
-
-                    System.out.println("Exit MulticastPulse client thread on: " + name);
-                    System.out.flush();
-                }
-            }));
-        }
-
-        //Allow slow thread starts
-        System.out.println("Wait for threads to start");
-        int timeout = 5000;
-        try {
-
-            //Give threads a generous amount of time to start
-            if (latch.await(15, TimeUnit.SECONDS)) {
-                System.out.println("Threads have started");
-
-                //Pulse the server - It is thread safe to use same sockets as send/receive synchronization is only on the packet
-                for (final MulticastSocket socket : clientSockets) {
-                    try {
-                        socket.send(request);
-                    } catch (final Throwable e) {
-                        //Ignore
-                    }
-                }
-            } else {
-                timeout = 1;
-                System.out.println("Giving up on threads");
-            }
-
-        } catch (final InterruptedException e) {
-            timeout = 1;
-        }
-
-        //Kill the threads after timeout
-        timer.schedule(new TimerTask() {
-            @Override
-            public void run() {
-
-                running.set(false);
-
-                for (final Future future : futures) {
-                    try {
-                        future.cancel(true);
-                    } catch (final Throwable e) {
-                        //Ignore
-                    }
-                }
-
-                for (final MulticastSocket socket : clientSockets) {
-
-                    try {
-                        socket.leaveGroup(ia);
-                    } catch (final Throwable e) {
-                        //Ignore
-                    }
-                    try {
-                        socket.close();
-                    } catch (final Throwable e) {
-                        //Ignore
-                    }
-                }
-            }
-        }, timeout);
-
-        //Wait for threads to complete
-        for (final Future future : futures) {
-            try {
-                future.get();
-            } catch (final Throwable e) {
-                //Ignore
-            }
-        }
-
-        System.out.println();
-        System.out.flush();
-
-        final ArrayList<String> list = new ArrayList<String>();
-
-        final TreeSet<URI> uris = new TreeSet<URI>(set);
-        for (final URI uri : uris) {
-            final String astr = uri.toASCIIString();
-            System.out.println("MultiPulse discovered: " + astr);
-
-            if (list.contains(astr)) {
-                System.out.println("Duplicate uri: " + uri);
-            }
-
-            org.junit.Assert.assertTrue(!list.contains(astr));
-            list.add(astr);
-        }
-
-        System.out.println("Multipulse complete");
-
-        //If timeout == 1 assume either a cancel or the test took too long (Will not fail)
-        org.junit.Assert.assertTrue(timeout == 1 || set.size() > 0);
-    }
-
-    @Test
-    public void testBroadcastBadUri() throws Exception {
-        if ("true".equals(System.getProperty("skipMulticastTests"))) {
-            Logger.getLogger(this.getClass().getName()).warning("Skipping MulticastTest " + this.getClass().getName());
-            return;
-        }
-
-        final DiscoveryListener original = agent.getDiscoveryListener();
-
-        final CountDownLatch latch = new CountDownLatch(1);
-
-        final DiscoveryListener listener = new DiscoveryListener() {
-            @Override
-            public void serviceAdded(final URI service) {
-                latch.countDown();
-                System.out.println("added = " + service);
-            }
-
-            @Override
-            public void serviceRemoved(final URI service) {
-                latch.countDown();
-                System.out.println("removed = " + service);
-            }
-        };
-
-        agent.setDiscoveryListener(listener);
-
-        final String[] hosts = agent.getHosts().split(",");
-        final String host = hosts[hosts.length - 1];
-
-        boolean removed = agent.removeFromIgnore(host);
-        org.junit.Assert.assertTrue("Host is already ignored", !removed);
-
-        final Future<?> future = executor.submit(new Runnable() {
-            @Override
-            public void run() {
-                try {
-                    final InetAddress ia = getAddress(MulticastPulseAgentTest.host);
-
-                    final byte[] bytes = (MulticastPulseAgent.CLIENT + forGroup + MulticastPulseAgent.BADURI + host).getBytes(Charset.forName("UTF-8"));
-                    final DatagramPacket request = new DatagramPacket(bytes, bytes.length, new InetSocketAddress(ia, port));
-
-                    final MulticastSocket[] multicastSockets = MulticastPulseAgent.getSockets(MulticastPulseAgentTest.host, port);
-
-                    for (int i = 0; i < 5; i++) {
-                        for (final MulticastSocket socket : multicastSockets) {
-
-                            try {
-                                socket.send(request);
-                                Thread.sleep(100);
-                            } catch (final Exception e) {
-                                System.out.println("Failed to broadcast bad URI on: " + socket.getInterface().getHostAddress());
-                                e.printStackTrace();
-                            }
-                        }
-                    }
-                } catch (final Exception e) {
-                    System.out.println("Failed to broadcast bad URI");
-                    e.printStackTrace();
-                }
-            }
-        });
-
-        final boolean await = latch.await(20, TimeUnit.SECONDS);
-        removed = agent.removeFromIgnore(host);
-
-        agent.setDiscoveryListener(original);
-
-        org.junit.Assert.assertTrue("Failed to remove host", removed);
-        org.junit.Assert.assertTrue("Failed to unlatch", await);
-    }
-
-    private String ipFormat(final String h) throws UnknownHostException {
-
-        final InetAddress ia = InetAddress.getByName(h);
-        if (ia instanceof Inet6Address) {
-            return "[" + ia.getHostAddress() + "]";
-        } else {
-            return h;
-        }
-    }
-
-    private static InetAddress getAddress(final String host) throws Exception {
-        final InetAddress ia;
-        try {
-            ia = InetAddress.getByName(host);
-        } catch (final UnknownHostException e) {
-            throw new Exception(host + " is not a valid address", e);
-        }
-
-        if (null == ia || !ia.isMulticastAddress()) {
-            throw new Exception(host + " is not a valid multicast address");
-        }
-        return ia;
-    }
-
-    private static class MyDiscoveryListener implements DiscoveryListener {
-
-        private final String id;
-
-        public MyDiscoveryListener(final String id) {
-            this.id = id;
-        }
-
-        @Override
-        public void serviceAdded(final URI service) {
-            System.out.println(id + ": add : " + service.toString());
-        }
-
-        @Override
-        public void serviceRemoved(final URI service) {
-            System.out.println(id + ": remove : " + service.toString());
-        }
-    }
-}
+/**
+ * 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.server.discovery;
+
+import org.apache.openejb.server.DiscoveryListener;
+import org.apache.openejb.util.NetworkUtil;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import sun.net.util.IPAddressUtil;
+
+import java.net.DatagramPacket;
+import java.net.Inet6Address;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.MulticastSocket;
+import java.net.SocketAddress;
+import java.net.URI;
+import java.net.UnknownHostException;
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.Properties;
+import java.util.Set;
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.TreeSet;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.locks.ReentrantLock;
+import java.util.logging.Logger;
+
+@SuppressWarnings("UseOfSystemOutOrSystemErr")
+public class MulticastPulseAgentTest {
+
+    private static final Set<String> schemes = new HashSet<String>(Arrays.asList("ejbd", "ejbds", "http"));
+    private static ExecutorService executor;
+    private static final Charset utf8 = Charset.forName("UTF-8");
+    private static final String forGroup = "*";
+    private static final String host = "239.255.3.2";
+    private static final int port = NetworkUtil.getNextAvailablePort();
+    private static MulticastPulseAgent agent;
+
+    @BeforeClass
+    public static void beforeClass() throws Exception {
+
+        executor = Executors.newFixedThreadPool(10);
+
+        final Properties p = new Properties();
+        p.setProperty("bind", host);
+        p.setProperty("port", "" + port);
+
+        agent = new MulticastPulseAgent();
+        agent.init(p);
+        agent.setDiscoveryListener(new MyDiscoveryListener("MulticastPulseAgentTest"));
+        agent.registerService(new URI("ejb:ejbd://[::]:4201"));
+        agent.registerService(new URI("ejb:ejbd://0.0.0.0:4201"));
+        agent.registerService(new URI("ejb:http://127.0.0.1:4201"));
+        agent.registerService(new URI("ejb:https://0.0.0.1:4201"));
+        agent.start();
+
+        System.out.println();
+    }
+
+    @AfterClass
+    public static void afterClass() throws Exception {
+        agent.stop();
+        executor.shutdownNow();
+    }
+
+    /**
+     * Most of this code is identical to org.apache.openejb.client.MulticastPulseClient#discoverURIs
+     * <p/>
+     * The MulticastPulseClient class is not shared or available here so the test has to emulate it.
+     *
+     * @throws Exception On error
+     */
+    @Test
+    public void test() throws Exception {
+        if ("true".equals(System.getProperty("skipMulticastTests"))) {
+            Logger.getLogger(this.getClass().getName()).warning("Skipping MulticastTest " + this.getClass().getName());
+            return;
+        }
+
+        final InetAddress ia;
+
+        try {
+            ia = InetAddress.getByName(host);
+        } catch (final UnknownHostException e) {
+            throw new Exception(host + " is not a valid address", e);
+        }
+
+        if (null == ia || !ia.isMulticastAddress()) {
+            throw new Exception(host + " is not a valid multicast address");
+        }
+
+        //Returns at least one socket per valid network interface
+        final MulticastSocket[] clientSockets = MulticastPulseAgent.getSockets(host, port);
+
+        //No point going on if we don't have sockets...
+        if (clientSockets.length < 1) {
+            System.out.println("Cannnot perform multipulse test without a valid interface");
+            return;
+        }
+
+        final byte[] bytes = (MulticastPulseAgent.CLIENT + forGroup).getBytes(utf8);
+        final DatagramPacket request = new DatagramPacket(bytes, bytes.length, new InetSocketAddress(ia, port));
+        final AtomicBoolean running = new AtomicBoolean(true);
+        final Timer timer = new Timer(true);
+
+        final Set<URI> set = new TreeSet<URI>(new Comparator<URI>() {
+            @Override
+            public int compare(final URI uri1, final URI uri2) {
+
+                //Ignore server hostname
+                URI u1 = URI.create(uri1.getSchemeSpecificPart());
+                URI u2 = URI.create(uri2.getSchemeSpecificPart());
+
+                //Ignore scheme (ejb,ejbs,etc.)
+                u1 = URI.create(u1.getSchemeSpecificPart());
+                u2 = URI.create(u2.getSchemeSpecificPart());
+
+                //Compare URI hosts
+                int i = compare(u1.getHost(), u2.getHost());
+                if (i != 0) {
+                    i = uri1.compareTo(uri2);
+                }
+
+                return i;
+            }
+
+            private int compare(final String h1, final String h2) {
+
+                //Sort by hostname, IPv4, IPv6
+
+                try {
+                    if (IPAddressUtil.isIPv4LiteralAddress(h1)) {
+                        if (IPAddressUtil.isIPv6LiteralAddress(h2.replace("[", "").replace("]", ""))) {
+                            return -1;
+                        }
+                    } else if (IPAddressUtil.isIPv6LiteralAddress(h1.replace("[", "").replace("]", ""))) {
+                        if (IPAddressUtil.isIPv4LiteralAddress(h2)) {
+                            return 1;
+                        }
+                    } else if (0 != h1.compareTo(h2)) {
+                        return -1;
+                    }
+                } catch (final Throwable e) {
+                    //Ignore
+                }
+
+                return h1.compareTo(h2);
+            }
+        });
+
+        final ReentrantLock setLock = new ReentrantLock();
+
+        //Start threads that listen for multicast packets on our channel.
+        //These need to start 'before' we pulse a request.
+        final ArrayList<Future> futures = new ArrayList<Future>();
+        final CountDownLatch latch = new CountDownLatch(clientSockets.length);
+
+        for (final MulticastSocket socket : clientSockets) {
+
+            futures.add(executor.submit(new Runnable() {
+                @Override
+                public void run() {
+
+                    String name = "Unknown interface";
+                    try {
+                        name = socket.getNetworkInterface().getDisplayName();
+                    } catch (final Throwable e) {
+                        //Ignore
+                    }
+                    System.out.println("Entered MulticastPulse client thread on: " + name);
+
+                    final DatagramPacket response = new DatagramPacket(new byte[2048], 2048);
+
+                    latch.countDown();
+
+                    while (running.get()) {
+                        try {
+
+                            socket.receive(response);
+
+                            final SocketAddress sa = response.getSocketAddress();
+
+                            if ((sa instanceof InetSocketAddress)) {
+
+                                int len = response.getLength();
+                                if (len > 2048) {
+                                    len = 2048;
+                                }
+
+                                String s = new String(response.getData(), 0, len);
+
+                                if (s.startsWith(MulticastPulseAgent.SERVER)) {
+
+                                    s = (s.replace(MulticastPulseAgent.SERVER, ""));
+                                    final String group = s.substring(0, s.indexOf(':'));
+                                    s = s.substring(group.length() + 1);
+
+                                    if (!"*".equals(forGroup) && !forGroup.equals(group)) {
+                                        continue;
+                                    }
+
+                                    final String services = s.substring(0, s.lastIndexOf('|'));
+                                    s = s.substring(services.length() + 1);
+
+                                    final String[] serviceList = services.split("\\|");
+                                    final String[] hosts = s.split(",");
+
+                                    System.out.println(String.format("\n" + name + " received Server pulse:\n\tGroup: %1$s\n\tServices: %2$s\n\tServer: %3$s\n",
+                                            group,
+                                            services,
+                                            s));
+
+                                    for (final String svc : serviceList) {
+
+                                        if (MulticastPulseAgent.EMPTY.equals(svc)) {
+                                            continue;
+                                        }
+
+                                        final URI serviceUri;
+                                        try {
+                                            serviceUri = URI.create(svc);
+                                        } catch (final Throwable e) {
+                                            continue;
+                                        }
+
+                                        if (schemes.contains(serviceUri.getScheme())) {
+
+                                            //Just because multicast was received on this host is does not mean the service is on the same
+                                            //We can however use this to identify an individual machine and group
+                                            final String serverHost = ((InetSocketAddress) response.getSocketAddress()).getAddress().getHostAddress();
+
+                                            final String serviceHost = serviceUri.getHost();
+                                            if (MulticastPulseAgent.isLocalAddress(serviceHost, false)) {
+                                                if (!MulticastPulseAgent.isLocalAddress(serverHost, false)) {
+                                                    //A local service is only available to a local client
+                                                    continue;
+                                                }
+                                            }
+
+                                            final String fullsvc = ("mp-" + serverHost + ":" + group + ":" + svc);
+
+                                            setLock.lock();
+
+                                            try {
+                                                if (fullsvc.contains("0.0.0.0")) {
+                                                    for (final String h : hosts) {
+                                                        if (!h.replace("[", "").startsWith("2001:0:")) { //Filter Teredo
+                                                            set.add(URI.create(fullsvc.replace("0.0.0.0", ipFormat(h))));
+                                                        }
+                                                    }
+                                                } else if (fullsvc.contains("[::]")) {
+                                                    for (final String h : hosts) {
+                                                        if (!h.replace("[", "").startsWith("2001:0:")) { //Filter Teredo
+                                                            set.add(URI.create(fullsvc.replace("[::]", ipFormat(h))));
+                                                        }
+                                                    }
+                                                } else {
+                                                    //Just add as is
+                                                    set.add(URI.create(fullsvc));
+                                                }
+                                            } catch (final Throwable e) {
+                                                //Ignore
+                                            } finally {
+                                                setLock.unlock();
+                                            }
+                                        } else {
+                                            System.out.println("Reject service: " + serviceUri.toASCIIString() + " - Not looking for scheme: " + serviceUri.getScheme());
+                                        }
+                                    }
+                                }
+                            }
+
+                        } catch (final Throwable e) {
+                            //Ignore
+                        }
+                    }
+
+                    System.out.println("Exit MulticastPulse client thread on: " + name);
+                    System.out.flush();
+                }
+            }));
+        }
+
+        //Allow slow thread starts
+        System.out.println("Wait for threads to start");
+        int timeout = 5000;
+        try {
+
+            //Give threads a generous amount of time to start
+            if (latch.await(15, TimeUnit.SECONDS)) {
+                System.out.println("Threads have started");
+
+                //Pulse the server - It is thread safe to use same sockets as send/receive synchronization is only on the packet
+                for (final MulticastSocket socket : clientSockets) {
+                    try {
+                        socket.send(request);
+                    } catch (final Throwable e) {
+                        //Ignore
+                    }
+                }
+            } else {
+                timeout = 1;
+                System.out.println("Giving up on threads");
+            }
+
+        } catch (final InterruptedException e) {
+            timeout = 1;
+        }
+
+        //Kill the threads after timeout
+        timer.schedule(new TimerTask() {
+            @Override
+            public void run() {
+
+                running.set(false);
+
+                for (final Future future : futures) {
+                    try {
+                        future.cancel(true);
+                    } catch (final Throwable e) {
+                        //Ignore
+                    }
+                }
+
+                for (final MulticastSocket socket : clientSockets) {
+
+                    try {
+                        socket.leaveGroup(ia);
+                    } catch (final Throwable e) {
+                        //Ignore
+                    }
+                    try {
+                        socket.close();
+                    } catch (final Throwable e) {
+                        //Ignore
+                    }
+                }
+            }
+        }, timeout);
+
+        //Wait for threads to complete
+        for (final Future future : futures) {
+            try {
+                future.get();
+            } catch (final Throwable e) {
+                //Ignore
+            }
+        }
+
+        System.out.println();
+        System.out.flush();
+
+        final ArrayList<String> list = new ArrayList<String>();
+
+        final TreeSet<URI> uris = new TreeSet<URI>(set);
+        for (final URI uri : uris) {
+            final String astr = uri.toASCIIString();
+            System.out.println("MultiPulse discovered: " + astr);
+
+            if (list.contains(astr)) {
+                System.out.println("Duplicate uri: " + uri);
+            }
+
+            org.junit.Assert.assertTrue(!list.contains(astr));
+            list.add(astr);
+        }
+
+        System.out.println("Multipulse complete");
+
+        //If timeout == 1 assume either a cancel or the test took too long (Will not fail)
+        org.junit.Assert.assertTrue(timeout == 1 || set.size() > 0);
+    }
+
+    @Test
+    public void testBroadcastBadUri() throws Exception {
+        if ("true".equals(System.getProperty("skipMulticastTests"))) {
+            Logger.getLogger(this.getClass().getName()).warning("Skipping MulticastTest " + this.getClass().getName());
+            return;
+        }
+
+        final DiscoveryListener original = agent.getDiscoveryListener();
+
+        final CountDownLatch latch = new CountDownLatch(1);
+
+        final DiscoveryListener listener = new DiscoveryListener() {
+            @Override
+            public void serviceAdded(final URI service) {
+                latch.countDown();
+                System.out.println("added = " + service);
+            }
+
+            @Override
+            public void serviceRemoved(final URI service) {
+                latch.countDown();
+                System.out.println("removed = " + service);
+            }
+        };
+
+        agent.setDiscoveryListener(listener);
+
+        final String[] hosts = agent.getHosts().split(",");
+        final String host = hosts[hosts.length - 1];
+
+        boolean removed = agent.removeFromIgnore(host);
+        org.junit.Assert.assertTrue("Host is already ignored", !removed);
+
+        final Future<?> future = executor.submit(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    final InetAddress ia = getAddress(MulticastPulseAgentTest.host);
+
+                    final byte[] bytes = (MulticastPulseAgent.CLIENT + forGroup + MulticastPulseAgent.BADURI + host).getBytes(Charset.forName("UTF-8"));
+                    final DatagramPacket request = new DatagramPacket(bytes, bytes.length, new InetSocketAddress(ia, port));
+
+                    final MulticastSocket[] multicastSockets = MulticastPulseAgent.getSockets(MulticastPulseAgentTest.host, port);
+
+                    for (int i = 0; i < 5; i++) {
+                        for (final MulticastSocket socket : multicastSockets) {
+
+                            try {
+                                socket.send(request);
+                                Thread.sleep(100);
+                            } catch (final Exception e) {
+                                System.out.println("Failed to broadcast bad URI on: " + socket.getInterface().getHostAddress());
+                                e.printStackTrace();
+                            }
+                        }
+                    }
+                } catch (final Exception e) {
+                    System.out.println("Failed to broadcast bad URI");
+                    e.printStackTrace();
+                }
+            }
+        });
+
+        final boolean await = latch.await(20, TimeUnit.SECONDS);
+        removed = agent.removeFromIgnore(host);
+
+        agent.setDiscoveryListener(original);
+
+        org.junit.Assert.assertTrue("Failed to remove host", removed);
+        org.junit.Assert.assertTrue("Failed to unlatch", await);
+    }
+
+    private String ipFormat(final String h) throws UnknownHostException {
+
+        final InetAddress ia = InetAddress.getByName(h);
+        if (ia instanceof Inet6Address) {
+            return "[" + ia.getHostAddress() + "]";
+        } else {
+            return h;
+        }
+    }
+
+    private static InetAddress getAddress(final String host) throws Exception {
+        final InetAddress ia;
+        try {
+            ia = InetAddress.getByName(host);
+        } catch (final UnknownHostException e) {
+            throw new Exception(host + " is not a valid address", e);
+        }
+
+        if (null == ia || !ia.isMulticastAddress()) {
+            throw new Exception(host + " is not a valid multicast address");
+        }
+        return ia;
+    }
+
+    private static class MyDiscoveryListener implements DiscoveryListener {
+
+        private final String id;
+
+        public MyDiscoveryListener(final String id) {
+            this.id = id;
+        }
+
+        @Override
+        public void serviceAdded(final URI service) {
+            System.out.println(id + ": add : " + service.toString());
+        }
+
+        @Override
+        public void serviceRemoved(final URI service) {
+            System.out.println(id + ": remove : " + service.toString());
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/tomee/blob/bd7dbd0f/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/EJBRestServiceInfo.java
----------------------------------------------------------------------
diff --git a/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/EJBRestServiceInfo.java b/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/EJBRestServiceInfo.java
index b8cc1d3..1d68961 100644
--- a/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/EJBRestServiceInfo.java
+++ b/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/EJBRestServiceInfo.java
@@ -1,33 +1,33 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- *     contributor license agreements.  See the NOTICE file distributed with
- *     this work for additional information regarding copyright ownership.
- *     The ASF licenses this file to You under the Apache License, Version 2.0
- *     (the "License"); you may not use this file except in compliance with
- *     the License.  You may obtain a copy of the License at
- *
- *        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.server.rest;
-
-import org.apache.openejb.BeanContext;
-
-public class EJBRestServiceInfo {
-    public String path;
-    public BeanContext context;
-
-    public EJBRestServiceInfo(final String path, final BeanContext context) {
-        if (context == null) {
-            throw new OpenEJBRestRuntimeException("can't find context");
-        }
-
-        this.path = path;
-        this.context = context;
-    }
-}
+/*
+ * 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.server.rest;
+
+import org.apache.openejb.BeanContext;
+
+public class EJBRestServiceInfo {
+    public String path;
+    public BeanContext context;
+
+    public EJBRestServiceInfo(final String path, final BeanContext context) {
+        if (context == null) {
+            throw new OpenEJBRestRuntimeException("can't find context");
+        }
+
+        this.path = path;
+        this.context = context;
+    }
+}

http://git-wip-us.apache.org/repos/asf/tomee/blob/bd7dbd0f/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/InternalApplication.java
----------------------------------------------------------------------
diff --git a/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/InternalApplication.java b/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/InternalApplication.java
index 2035805..cb36fda 100644
--- a/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/InternalApplication.java
+++ b/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/InternalApplication.java
@@ -1,45 +1,45 @@
-/*
- * 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.server.rest;
-
-import javax.ws.rs.core.Application;
-import java.util.HashSet;
-import java.util.Set;
-
-public class InternalApplication extends Application {
-    private final Set<Class<?>> classes = new HashSet<Class<?>>();
-    private final Set<Object> singletons = new HashSet<Object>();
-    private final Application original;
-
-    public InternalApplication(final Application original) {
-        this.original = original;
-    }
-
-    @Override
-    public Set<Class<?>> getClasses() {
-        return classes;
-    }
-
-    @Override
-    public Set<Object> getSingletons() {
-        return singletons;
-    }
-
-    public Application getOriginal() {
-        return original;
-    }
-}
+/*
+ * 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.server.rest;
+
+import javax.ws.rs.core.Application;
+import java.util.HashSet;
+import java.util.Set;
+
+public class InternalApplication extends Application {
+    private final Set<Class<?>> classes = new HashSet<Class<?>>();
+    private final Set<Object> singletons = new HashSet<Object>();
+    private final Application original;
+
+    public InternalApplication(final Application original) {
+        this.original = original;
+    }
+
+    @Override
+    public Set<Class<?>> getClasses() {
+        return classes;
+    }
+
+    @Override
+    public Set<Object> getSingletons() {
+        return singletons;
+    }
+
+    public Application getOriginal() {
+        return original;
+    }
+}

http://git-wip-us.apache.org/repos/asf/tomee/blob/bd7dbd0f/server/openejb-server/src/main/resources/META-INF/openejb-server.xml
----------------------------------------------------------------------
diff --git a/server/openejb-server/src/main/resources/META-INF/openejb-server.xml b/server/openejb-server/src/main/resources/META-INF/openejb-server.xml
index 42cd306..05473d9 100644
--- a/server/openejb-server/src/main/resources/META-INF/openejb-server.xml
+++ b/server/openejb-server/src/main/resources/META-INF/openejb-server.xml
@@ -1,36 +1,36 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-    
-        http://www.apache.org/licenses/LICENSE-2.0
-    
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-    
--->
-
-<!-- $Rev$ $Date$ -->
-
-<beans xmlns:s="http://tomee.apache.org/schemas/server" xmlns:c="http://tomee.apache.org/schemas/core"
-    xmlns:l="http://tomee.apache.org/schemas/loader">
-    <s:server id="server" init-method="init">
-        <property name="serviceManager" ref="serviceManager" />
-        <property name="propertiesService" ref="propertiesService" />
-    </s:server>
-    <c:propertiesService id="propertiesService" />
-    <bean id="serviceManager" class="org.apache.openejb.server.ServiceManager" factory-method="getManager" />
-    <!--
-       - FIXME: The only singleton class with lots of static code - really hard to get it XBean-ized properly
-       - 
-    <l:system factory-method="get" init-method="init" />
-    -->
-</beans>
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+    
+        http://www.apache.org/licenses/LICENSE-2.0
+    
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+    
+-->
+
+<!-- $Rev$ $Date$ -->
+
+<beans xmlns:s="http://tomee.apache.org/schemas/server" xmlns:c="http://tomee.apache.org/schemas/core"
+    xmlns:l="http://tomee.apache.org/schemas/loader">
+    <s:server id="server" init-method="init">
+        <property name="serviceManager" ref="serviceManager" />
+        <property name="propertiesService" ref="propertiesService" />
+    </s:server>
+    <c:propertiesService id="propertiesService" />
+    <bean id="serviceManager" class="org.apache.openejb.server.ServiceManager" factory-method="getManager" />
+    <!--
+       - FIXME: The only singleton class with lots of static code - really hard to get it XBean-ized properly
+       - 
+    <l:system factory-method="get" init-method="init" />
+    -->
+</beans>

http://git-wip-us.apache.org/repos/asf/tomee/blob/bd7dbd0f/server/openejb-server/src/main/resources/META-INF/org.apache.openejb.cli/stop.help
----------------------------------------------------------------------
diff --git a/server/openejb-server/src/main/resources/META-INF/org.apache.openejb.cli/stop.help b/server/openejb-server/src/main/resources/META-INF/org.apache.openejb.cli/stop.help
index 9632aa8..ce00fe0 100644
--- a/server/openejb-server/src/main/resources/META-INF/org.apache.openejb.cli/stop.help
+++ b/server/openejb-server/src/main/resources/META-INF/org.apache.openejb.cli/stop.help
@@ -1,15 +1,15 @@
-Usage: openejb stop [options]
-
-Stops the OpenEJB Server running on host 127.0.0.1 and port 4201
-
-OPTIONS
- -h host    Stops the server at the specified host address
-            Default host is 127.0.0.1
- -p port    Stops the server running on the specified port. 
-            Default port is 4201.
-
-OpenEJB -- EJB Container System and EJB Server.
-For OpenEJB updates and additional information, visit
-http://tomee.apache.org
-
+Usage: openejb stop [options]
+
+Stops the OpenEJB Server running on host 127.0.0.1 and port 4201
+
+OPTIONS
+ -h host    Stops the server at the specified host address
+            Default host is 127.0.0.1
+ -p port    Stops the server running on the specified port. 
+            Default port is 4201.
+
+OpenEJB -- EJB Container System and EJB Server.
+For OpenEJB updates and additional information, visit
+http://tomee.apache.org
+
 Bug Reports to <us...@tomee.apache.org>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tomee/blob/bd7dbd0f/src/main/style/checkstyle.xml
----------------------------------------------------------------------
diff --git a/src/main/style/checkstyle.xml b/src/main/style/checkstyle.xml
index 4cc9921..a1524f1 100644
--- a/src/main/style/checkstyle.xml
+++ b/src/main/style/checkstyle.xml
@@ -1,165 +1,165 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<!DOCTYPE module PUBLIC
-    "-//Puppy Crawl//DTD Check Configuration 1.2//EN"
-    "http://www.puppycrawl.com/dtds/configuration_1_2.dtd">
-<module name="Checker">
-  <!--
-      If you set the basedir property below, then all reported file
-      names will be relative to the specified directory. See
-      http://checkstyle.sourceforge.net/5.x/config.html#Checker
-
-      <property name="basedir" value="${basedir}"/>
-  -->
-
-  <!-- Checks that property files contain the same keys.         -->
-  <!-- See http://checkstyle.sf.net/config_misc.html#Translation -->
-  <!--<module name="Translation"/>-->
-
-  <!--<module name="FileLength"/>-->
-
-  <!-- Following interprets the header file as regular expressions. -->
-  <!-- <module name="RegexpHeader"/>                                -->
-
-  <module name="SuppressWarningsFilter" />
-
-  <module name="FileTabCharacter">
-    <property name="eachLine" value="true"/>
-  </module>
-
-  <!--<module name="RegexpSingleline">-->
-    <!--&lt;!&ndash; \s matches whitespace character, $ matches end of line. &ndash;&gt;-->
-    <!--<property name="format" value="\s+$"/>-->
-    <!--<property name="message" value="Line has trailing spaces."/>-->
-  <!--</module>-->
-
-    <!-- Checks for Headers                                -->
-    <!-- See http://checkstyle.sf.net/config_header.html   -->
-     <!--<module name="Header">-->
-        <!--<property name="headerFile" value="${checkstyle.header.file}"/>-->
-         <!--<property name="fileExtensions" value="java"/>-->
-     <!--</module>-->
-
-  <module name="TreeWalker">
-    <module name="SuppressWarningsHolder" />
-
-    <property name="cacheFile" value="${checkstyle.cache.file}"/>
-
-    <!-- Checks for Javadoc comments.                     -->
-    <!-- See http://checkstyle.sf.net/config_javadoc.html -->
-    <!--<module name="JavadocMethod"/>-->
-    <!--<module name="JavadocType"/>-->
-    <!--<module name="JavadocVariable"/>-->
-    <!--<module name="JavadocStyle"/>-->
-
-
-    <!-- Checks for Naming Conventions.                  -->
-    <!-- See http://checkstyle.sf.net/config_naming.html -->
-    <!--<module name="ConstantName"/>-->
-    <module name="LocalFinalVariableName"/>
-    <module name="LocalVariableName"/>
-    <module name="MemberName"/>
-    <!--<module name="MethodName"/>-->
-    <module name="PackageName"/>
-    <module name="ParameterName"/>
-    <!--<module name="StaticVariableName"/>-->
-    <!--<module name="TypeName"/>-->
-
-
-    <!-- Checks for imports                              -->
-    <!-- See http://checkstyle.sf.net/config_import.html -->
-    <module name="IllegalImport"/>
-    <!-- defaults to sun.* packages -->
-    <module name="RedundantImport"/>
-    <module name="UnusedImports">
-      <property name="processJavadoc" value="true" />
-    </module>
-
-
-    <!-- Checks for Size Violations.                    -->
-    <!-- See http://checkstyle.sf.net/config_sizes.html -->
-    <!--<module name="LineLength">-->
-      <!--<property name="max" value="120"/>-->
-    <!--</module>-->
-    <!--<module name="MethodLength"/>-->
-    <!--<module name="ParameterNumber"/>-->
-
-
-    <!-- Checks for whitespace                               -->
-    <!-- See http://checkstyle.sf.net/config_whitespace.html -->
-    <!--<module name="EmptyForIteratorPad"/>-->
-    <!--<module name="MethodParamPad"/>-->
-    <!--<module name="NoWhitespaceAfter"/>-->
-    <!--<module name="NoWhitespaceBefore"/>-->
-    <!--<module name="OperatorWrap"/>-->
-    <!--<module name="ParenPad"/>-->
-    <!--<module name="TypecastParenPad"/>-->
-    <!--<module name="WhitespaceAfter"/>-->
-
-    <!-- Modifier Checks                                    -->
-    <!-- See http://checkstyle.sf.net/config_modifiers.html -->
-    <module name="ModifierOrder"/>
-    <module name="RedundantModifier"/>
-
-
-    <!-- Checks for blocks. You know, those {}'s         -->
-    <!-- See http://checkstyle.sf.net/config_blocks.html -->
-    <!--<module name="AvoidNestedBlocks"/>-->
-    <!--<module name="LeftCurly"/>-->
-    <module name="NeedBraces"/>
-    <!--<module name="RightCurly"/>-->
-
-
-    <!-- Checks for common coding problems               -->
-    <!-- See http://checkstyle.sf.net/config_coding.html -->
-    <!--<module name="EmptyStatement"/>-->
-    <!--<module name="EqualsHashCode"/>-->
-    <!--<module name="HiddenField">-->
-      <!--<property name="ignoreSetter" value="true"/>-->
-    <!--</module>-->
-    <module name="IllegalInstantiation"/>
-    <!--<module name="InnerAssignment"/>-->
-    <!--<module name="MagicNumber">-->
-      <!--<property name="ignoreHashCodeMethod" value="true"/>-->
-    <!--</module>-->
-    <!--<module name="MissingSwitchDefault"/>-->
-    <!--<module name="RedundantThrows"/>-->
-    <module name="SimplifyBooleanExpression"/>
-    <module name="SimplifyBooleanReturn"/>
-
-    <!-- Checks for class design                         -->
-    <!-- See http://checkstyle.sf.net/config_design.html -->
-    <module name="FinalClass"/>
-    <!--<module name="HideUtilityClassConstructor"/>-->
-    <!--<module name="InterfaceIsType"/>-->
-    <!--<module name="VisibilityModifier">-->
-      <!--<property name="packageAllowed" value="true"/>-->
-      <!--<property name="protectedAllowed" value="true"/>-->
-    <!--</module>-->
-
-    <!-- Miscellaneous other checks.                   -->
-    <!-- See http://checkstyle.sf.net/config_misc.html -->
-    <module name="ArrayTypeStyle"/>
-    <!--<module name="TodoComment"/>-->
-    <!--<module name="UpperEll"/>-->
-
-  </module>
-
-</module>
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<!DOCTYPE module PUBLIC
+    "-//Puppy Crawl//DTD Check Configuration 1.2//EN"
+    "http://www.puppycrawl.com/dtds/configuration_1_2.dtd">
+<module name="Checker">
+  <!--
+      If you set the basedir property below, then all reported file
+      names will be relative to the specified directory. See
+      http://checkstyle.sourceforge.net/5.x/config.html#Checker
+
+      <property name="basedir" value="${basedir}"/>
+  -->
+
+  <!-- Checks that property files contain the same keys.         -->
+  <!-- See http://checkstyle.sf.net/config_misc.html#Translation -->
+  <!--<module name="Translation"/>-->
+
+  <!--<module name="FileLength"/>-->
+
+  <!-- Following interprets the header file as regular expressions. -->
+  <!-- <module name="RegexpHeader"/>                                -->
+
+  <module name="SuppressWarningsFilter" />
+
+  <module name="FileTabCharacter">
+    <property name="eachLine" value="true"/>
+  </module>
+
+  <!--<module name="RegexpSingleline">-->
+    <!--&lt;!&ndash; \s matches whitespace character, $ matches end of line. &ndash;&gt;-->
+    <!--<property name="format" value="\s+$"/>-->
+    <!--<property name="message" value="Line has trailing spaces."/>-->
+  <!--</module>-->
+
+    <!-- Checks for Headers                                -->
+    <!-- See http://checkstyle.sf.net/config_header.html   -->
+     <!--<module name="Header">-->
+        <!--<property name="headerFile" value="${checkstyle.header.file}"/>-->
+         <!--<property name="fileExtensions" value="java"/>-->
+     <!--</module>-->
+
+  <module name="TreeWalker">
+    <module name="SuppressWarningsHolder" />
+
+    <property name="cacheFile" value="${checkstyle.cache.file}"/>
+
+    <!-- Checks for Javadoc comments.                     -->
+    <!-- See http://checkstyle.sf.net/config_javadoc.html -->
+    <!--<module name="JavadocMethod"/>-->
+    <!--<module name="JavadocType"/>-->
+    <!--<module name="JavadocVariable"/>-->
+    <!--<module name="JavadocStyle"/>-->
+
+
+    <!-- Checks for Naming Conventions.                  -->
+    <!-- See http://checkstyle.sf.net/config_naming.html -->
+    <!--<module name="ConstantName"/>-->
+    <module name="LocalFinalVariableName"/>
+    <module name="LocalVariableName"/>
+    <module name="MemberName"/>
+    <!--<module name="MethodName"/>-->
+    <module name="PackageName"/>
+    <module name="ParameterName"/>
+    <!--<module name="StaticVariableName"/>-->
+    <!--<module name="TypeName"/>-->
+
+
+    <!-- Checks for imports                              -->
+    <!-- See http://checkstyle.sf.net/config_import.html -->
+    <module name="IllegalImport"/>
+    <!-- defaults to sun.* packages -->
+    <module name="RedundantImport"/>
+    <module name="UnusedImports">
+      <property name="processJavadoc" value="true" />
+    </module>
+
+
+    <!-- Checks for Size Violations.                    -->
+    <!-- See http://checkstyle.sf.net/config_sizes.html -->
+    <!--<module name="LineLength">-->
+      <!--<property name="max" value="120"/>-->
+    <!--</module>-->
+    <!--<module name="MethodLength"/>-->
+    <!--<module name="ParameterNumber"/>-->
+
+
+    <!-- Checks for whitespace                               -->
+    <!-- See http://checkstyle.sf.net/config_whitespace.html -->
+    <!--<module name="EmptyForIteratorPad"/>-->
+    <!--<module name="MethodParamPad"/>-->
+    <!--<module name="NoWhitespaceAfter"/>-->
+    <!--<module name="NoWhitespaceBefore"/>-->
+    <!--<module name="OperatorWrap"/>-->
+    <!--<module name="ParenPad"/>-->
+    <!--<module name="TypecastParenPad"/>-->
+    <!--<module name="WhitespaceAfter"/>-->
+
+    <!-- Modifier Checks                                    -->
+    <!-- See http://checkstyle.sf.net/config_modifiers.html -->
+    <module name="ModifierOrder"/>
+    <module name="RedundantModifier"/>
+
+
+    <!-- Checks for blocks. You know, those {}'s         -->
+    <!-- See http://checkstyle.sf.net/config_blocks.html -->
+    <!--<module name="AvoidNestedBlocks"/>-->
+    <!--<module name="LeftCurly"/>-->
+    <module name="NeedBraces"/>
+    <!--<module name="RightCurly"/>-->
+
+
+    <!-- Checks for common coding problems               -->
+    <!-- See http://checkstyle.sf.net/config_coding.html -->
+    <!--<module name="EmptyStatement"/>-->
+    <!--<module name="EqualsHashCode"/>-->
+    <!--<module name="HiddenField">-->
+      <!--<property name="ignoreSetter" value="true"/>-->
+    <!--</module>-->
+    <module name="IllegalInstantiation"/>
+    <!--<module name="InnerAssignment"/>-->
+    <!--<module name="MagicNumber">-->
+      <!--<property name="ignoreHashCodeMethod" value="true"/>-->
+    <!--</module>-->
+    <!--<module name="MissingSwitchDefault"/>-->
+    <!--<module name="RedundantThrows"/>-->
+    <module name="SimplifyBooleanExpression"/>
+    <module name="SimplifyBooleanReturn"/>
+
+    <!-- Checks for class design                         -->
+    <!-- See http://checkstyle.sf.net/config_design.html -->
+    <module name="FinalClass"/>
+    <!--<module name="HideUtilityClassConstructor"/>-->
+    <!--<module name="InterfaceIsType"/>-->
+    <!--<module name="VisibilityModifier">-->
+      <!--<property name="packageAllowed" value="true"/>-->
+      <!--<property name="protectedAllowed" value="true"/>-->
+    <!--</module>-->
+
+    <!-- Miscellaneous other checks.                   -->
+    <!-- See http://checkstyle.sf.net/config_misc.html -->
+    <module name="ArrayTypeStyle"/>
+    <!--<module name="TodoComment"/>-->
+    <!--<module name="UpperEll"/>-->
+
+  </module>
+
+</module>

http://git-wip-us.apache.org/repos/asf/tomee/blob/bd7dbd0f/tck/tck-common/src/main/java/org/apache/openejb/tck/util/ServerLocal.java
----------------------------------------------------------------------
diff --git a/tck/tck-common/src/main/java/org/apache/openejb/tck/util/ServerLocal.java b/tck/tck-common/src/main/java/org/apache/openejb/tck/util/ServerLocal.java
index 856c429..422b12b 100644
--- a/tck/tck-common/src/main/java/org/apache/openejb/tck/util/ServerLocal.java
+++ b/tck/tck-common/src/main/java/org/apache/openejb/tck/util/ServerLocal.java
@@ -1,50 +1,50 @@
-/*
- * 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.tck.util;
-
-import org.apache.tomee.util.QuickServerXmlParser;
-
-import java.io.File;
-
-public class ServerLocal {
-
-    private ServerLocal() {
-    }
-
-    /**
-     * If the TCK is running against a local server extracted to the target dir
-     * then the server.xml will have the port defined already.
-     *
-     * @param def Default port to use if none is found
-     * @return The determined port, the value of 'server.http.port' or the provided default
-     */
-    public static int getPort(final int def) {
-        final String home = System.getProperty("openejb.home", "empty");
-
-        if (!"empty".equals(home)) {
-            final File serverXml = new File(home, "conf/server.xml");
-
-            if (serverXml.exists() && serverXml.isFile()) {
-                final QuickServerXmlParser parser = QuickServerXmlParser.parse(serverXml);
-
-                return Integer.parseInt(parser.http());
-            }
-        }
-
-        return Integer.getInteger("server.http.port", def);
-    }
-}
+/*
+ * 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.tck.util;
+
+import org.apache.tomee.util.QuickServerXmlParser;
+
+import java.io.File;
+
+public class ServerLocal {
+
+    private ServerLocal() {
+    }
+
+    /**
+     * If the TCK is running against a local server extracted to the target dir
+     * then the server.xml will have the port defined already.
+     *
+     * @param def Default port to use if none is found
+     * @return The determined port, the value of 'server.http.port' or the provided default
+     */
+    public static int getPort(final int def) {
+        final String home = System.getProperty("openejb.home", "empty");
+
+        if (!"empty".equals(home)) {
+            final File serverXml = new File(home, "conf/server.xml");
+
+            if (serverXml.exists() && serverXml.isFile()) {
+                final QuickServerXmlParser parser = QuickServerXmlParser.parse(serverXml);
+
+                return Integer.parseInt(parser.http());
+            }
+        }
+
+        return Integer.getInteger("server.http.port", def);
+    }
+}

http://git-wip-us.apache.org/repos/asf/tomee/blob/bd7dbd0f/tomee/apache-tomee/src/main/resources/service.bat
----------------------------------------------------------------------
diff --git a/tomee/apache-tomee/src/main/resources/service.bat b/tomee/apache-tomee/src/main/resources/service.bat
index b061f3f..457b4c0 100644
--- a/tomee/apache-tomee/src/main/resources/service.bat
+++ b/tomee/apache-tomee/src/main/resources/service.bat
@@ -1,226 +1,226 @@
-@echo off
-rem Licensed to the Apache Software Foundation (ASF) under one or more
-rem contributor license agreements.  See the NOTICE file distributed with
-rem this work for additional information regarding copyright ownership.
-rem The ASF licenses this file to You under the Apache License, Version 2.0
-rem (the "License"); you may not use this file except in compliance with
-rem the License.  You may obtain a copy of the License at
-rem
-rem     http://www.apache.org/licenses/LICENSE-2.0
-rem
-rem Unless required by applicable law or agreed to in writing, software
-rem distributed under the License is distributed on an "AS IS" BASIS,
-rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-rem See the License for the specific language governing permissions and
-rem limitations under the License.
-
-rem The following line can be used to define a specific jre or jdk path
-rem set "JAVA_HOME=C:/JDK"
-
-REM Prefer a local JRE if we find one in the current bin directory
-IF EXIST "%~dp0jre" (
-  SET "JRE_HOME=%~dp0jre"
-) 
-
-REM Prefer a local JDK if we find one in the current bin directory
-IF EXIST "%~dp0jdk" (
-  SET "JAVA_HOME=%~dp0jdk"
-)
-
-@IF NOT "%ECHO%" == ""  ECHO %ECHO%
-@IF "%OS%" == "Windows_NT" setlocal
-
-IF "%OS%" == "Windows_NT" (
-  SET "DIRNAME=%~dp0%"
-) ELSE (
-  SET DIRNAME=.\
-)
-
-pushd %DIRNAME%
-
-rem ---------------------------------------------------------------------------
-rem NT Service Install/Uninstall script
-rem
-rem Options
-rem install                Install the service using TomEE as service name.
-rem                        Service is installed using default settings.
-rem remove                 Remove the service from the System.
-rem
-rem name        (optional) If the second argument is present it is considered
-rem                        to be new service name
-rem
-rem $Id: service.bat 1000718 2010-09-24 06:00:00Z mturk $
-rem ---------------------------------------------------------------------------
-
-SET proc=undefined
-
-IF /i %PROCESSOR_ARCHITECTURE% EQU X86 SET "proc=%~dp0TomEE.x86.exe"
-IF /i %PROCESSOR_ARCHITECTURE% EQU AMD64 SET "proc=%~dp0TomEE.amd64.exe"
-IF /i %PROCESSOR_ARCHITECTURE% EQU IA64 SET "proc=%~dp0TomEE.ia64.exe"
-
-IF /i "%proc%" EQU undefined (
-	ECHO Failed to determine OS architecture
-	GOTO end
-)
-
-set "SELF=%~dp0%service.bat"
-rem Guess CATALINA_HOME if not defined
-set "CURRENT_DIR=%cd%"
-if not "%CATALINA_HOME%" == "" goto gotHome
-set "CATALINA_HOME=%cd%"
-if exist "%CATALINA_HOME%\bin\service.bat" goto okHome
-rem CD to the upper dir
-cd ..
-set "CATALINA_HOME=%cd%"
-:gotHome
-if exist "%CATALINA_HOME%\bin\service.bat" goto okHome
-echo The service exe was not found...
-echo The CATALINA_HOME environment variable is not defined correctly.
-echo This environment variable is needed to run this program
-goto end
-:okHome
-rem Make sure prerequisite environment variables are set
-if not "%JAVA_HOME%" == "" goto gotJdkHome
-if not "%JRE_HOME%" == "" goto gotJreHome
-echo Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
-echo Service will try to guess them from the registry.
-goto okJavaHome
-:gotJreHome
-if not exist "%JRE_HOME%\bin\java.exe" goto noJavaHome
-if not exist "%JRE_HOME%\bin\javaw.exe" goto noJavaHome
-goto okJavaHome
-:gotJdkHome
-if not exist "%JAVA_HOME%\jre\bin\java.exe" goto noJavaHome
-if not exist "%JAVA_HOME%\jre\bin\javaw.exe" goto noJavaHome
-if not exist "%JAVA_HOME%\bin\javac.exe" goto noJavaHome
-if not "%JRE_HOME%" == "" goto okJavaHome
-set "JRE_HOME=%JAVA_HOME%\jre"
-goto okJavaHome
-:noJavaHome
-echo The JAVA_HOME environment variable is not defined correctly
-echo This environment variable is needed to run this program
-echo NB: JAVA_HOME should point to a JDK not a JRE
-goto end
-:okJavaHome
-if not "%CATALINA_BASE%" == "" goto gotBase
-set "CATALINA_BASE=%CATALINA_HOME%"
-:gotBase
-
-set "EXECUTABLE=%proc%"
-
-rem Set default Service name (If you change this then rename also TomEE.exe to the same name)
-set SERVICE_NAME=TomEE
-set PR_DISPLAYNAME=Apache TomEE
-
-if "x%1x" == "xx" goto displayUsage
-set SERVICE_CMD=%1
-shift
-if "x%1x" == "xx" goto checkServiceCmd
-:checkUser
-if "x%1x" == "x/userx" goto runAsUser
-if "x%1x" == "x--userx" goto runAsUser
-set SERVICE_NAME=%1
-set PR_DISPLAYNAME=Apache TomEE (%1)
-shift
-if "x%1x" == "xx" goto checkServiceCmd
-goto checkUser
-:runAsUser
-shift
-if "x%1x" == "xx" goto displayUsage
-set SERVICE_USER=%1
-shift
-runas /env /savecred /user:%SERVICE_USER% "%COMSPEC% /K \"%SELF%\" %SERVICE_CMD% %SERVICE_NAME%"
-goto end
-:checkServiceCmd
-if /i %SERVICE_CMD% == install goto doInstall
-if /i %SERVICE_CMD% == remove goto doRemove
-if /i %SERVICE_CMD% == uninstall goto doRemove
-echo Unknown parameter "%1"
-:displayUsage
-echo.
-echo Usage: service.bat install/remove [service_name] [/user username]
-goto end
-
-:doRemove
-rem Remove the service
-"%EXECUTABLE%" //DS//%SERVICE_NAME%
-if not errorlevel 1 goto removed
-echo Failed removing '%SERVICE_NAME%' service
-goto end
-:removed
-echo The service '%SERVICE_NAME%' has been removed
-goto end
-
-:doInstall
-rem Install the service
-echo Installing the service '%SERVICE_NAME%' ...
-echo Using CATALINA_HOME:    "%CATALINA_HOME%"
-echo Using CATALINA_BASE:    "%CATALINA_BASE%"
-echo Using JAVA_HOME:        "%JAVA_HOME%"
-echo Using JRE_HOME:         "%JRE_HOME%"
-
-rem Use the environment variables as an example
-rem Each command line option is prefixed with PR_
-
-set "PR_DESCRIPTION=Apache TomEE - http://tomee.apache.org/"
-set "PR_INSTALL=%EXECUTABLE%"
-set "PR_LOGPATH=%CATALINA_BASE%\logs"
-set "PR_CLASSPATH=%CATALINA_HOME%\bin\bootstrap.jar;%CATALINA_BASE%\bin\tomcat-juli.jar;%CATALINA_HOME%\bin\tomcat-juli.jar"
-rem Set the server jvm from JAVA_HOME
-set "PR_JVM=%JRE_HOME%\bin\server\jvm.dll"
-if exist "%PR_JVM%" goto foundJvm
-rem Set the client jvm from JAVA_HOME
-set "PR_JVM=%JRE_HOME%\bin\client\jvm.dll"
-if exist "%PR_JVM%" goto foundJvm
-set PR_JVM=auto
-:foundJvm
-echo Using JVM:              "%PR_JVM%"
-
-"%EXECUTABLE%" //IS//%SERVICE_NAME% ^
-    --DisplayName=%SERVICE_NAME% ^
-    --StartClass org.apache.catalina.startup.Bootstrap ^
-    --StopClass org.apache.catalina.startup.Bootstrap ^
-    --StartParams start ^
-    --StopParams stop ^
-    --Startup auto ^
-    --JvmMs=512 ^
-    --JvmMx=1024 ^
-    --JvmSs=2048 ^
-    --StartMode jvm ^
-    --StopMode jvm ^
-    --LogLevel Info ^
-    --LogPrefix TomEE
-    
-echo Installed, will now configure TomEE
-    
-if not errorlevel 1 goto installed
-echo Failed installing '%SERVICE_NAME%' service
-goto end
-
-:installed
-rem Clear the environment variables. They are not needed any more.
-set PR_DISPLAYNAME=
-set PR_DESCRIPTION=
-set PR_INSTALL=
-set PR_LOGPATH=
-set PR_CLASSPATH=
-set PR_JVM=
-
-rem Set extra parameters
-"%EXECUTABLE%" //US//%SERVICE_NAME% ^
-	++JvmOptions "-javaagent:%CATALINA_HOME%\lib\openejb-javaagent.jar;-Dcatalina.base=%CATALINA_BASE%;-Dcatalina.home=%CATALINA_HOME%;-Djava.endorsed.dirs=%CATALINA_HOME%\endorsed"
-
-rem More extra parameters
-set "PR_LOGPATH=%CATALINA_BASE%\logs"
-set PR_STDOUTPUT=auto
-set PR_STDERROR=auto
-
-rem before this option was added: "++JvmOptions=-Djava.library.path="%CATALINA_BASE%\bin" ^"
-rem the drawback was it was preventing custom native lib to be loaded even if added to Path
-"%EXECUTABLE%" //US//%SERVICE_NAME% ^
-	++JvmOptions "-Djava.io.tmpdir=%CATALINA_BASE%\temp;-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager;-Djava.util.logging.config.file=%CATALINA_BASE%\conf\logging.properties;-Djava.awt.headless=true;-XX:+UseParallelGC;-XX:MaxPermSize=256M"
-
-echo The service '%SERVICE_NAME%' has been installed.
-
-:end
-cd "%CURRENT_DIR%"
+@echo off
+rem Licensed to the Apache Software Foundation (ASF) under one or more
+rem contributor license agreements.  See the NOTICE file distributed with
+rem this work for additional information regarding copyright ownership.
+rem The ASF licenses this file to You under the Apache License, Version 2.0
+rem (the "License"); you may not use this file except in compliance with
+rem the License.  You may obtain a copy of the License at
+rem
+rem     http://www.apache.org/licenses/LICENSE-2.0
+rem
+rem Unless required by applicable law or agreed to in writing, software
+rem distributed under the License is distributed on an "AS IS" BASIS,
+rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+rem See the License for the specific language governing permissions and
+rem limitations under the License.
+
+rem The following line can be used to define a specific jre or jdk path
+rem set "JAVA_HOME=C:/JDK"
+
+REM Prefer a local JRE if we find one in the current bin directory
+IF EXIST "%~dp0jre" (
+  SET "JRE_HOME=%~dp0jre"
+) 
+
+REM Prefer a local JDK if we find one in the current bin directory
+IF EXIST "%~dp0jdk" (
+  SET "JAVA_HOME=%~dp0jdk"
+)
+
+@IF NOT "%ECHO%" == ""  ECHO %ECHO%
+@IF "%OS%" == "Windows_NT" setlocal
+
+IF "%OS%" == "Windows_NT" (
+  SET "DIRNAME=%~dp0%"
+) ELSE (
+  SET DIRNAME=.\
+)
+
+pushd %DIRNAME%
+
+rem ---------------------------------------------------------------------------
+rem NT Service Install/Uninstall script
+rem
+rem Options
+rem install                Install the service using TomEE as service name.
+rem                        Service is installed using default settings.
+rem remove                 Remove the service from the System.
+rem
+rem name        (optional) If the second argument is present it is considered
+rem                        to be new service name
+rem
+rem $Id: service.bat 1000718 2010-09-24 06:00:00Z mturk $
+rem ---------------------------------------------------------------------------
+
+SET proc=undefined
+
+IF /i %PROCESSOR_ARCHITECTURE% EQU X86 SET "proc=%~dp0TomEE.x86.exe"
+IF /i %PROCESSOR_ARCHITECTURE% EQU AMD64 SET "proc=%~dp0TomEE.amd64.exe"
+IF /i %PROCESSOR_ARCHITECTURE% EQU IA64 SET "proc=%~dp0TomEE.ia64.exe"
+
+IF /i "%proc%" EQU undefined (
+	ECHO Failed to determine OS architecture
+	GOTO end
+)
+
+set "SELF=%~dp0%service.bat"
+rem Guess CATALINA_HOME if not defined
+set "CURRENT_DIR=%cd%"
+if not "%CATALINA_HOME%" == "" goto gotHome
+set "CATALINA_HOME=%cd%"
+if exist "%CATALINA_HOME%\bin\service.bat" goto okHome
+rem CD to the upper dir
+cd ..
+set "CATALINA_HOME=%cd%"
+:gotHome
+if exist "%CATALINA_HOME%\bin\service.bat" goto okHome
+echo The service exe was not found...
+echo The CATALINA_HOME environment variable is not defined correctly.
+echo This environment variable is needed to run this program
+goto end
+:okHome
+rem Make sure prerequisite environment variables are set
+if not "%JAVA_HOME%" == "" goto gotJdkHome
+if not "%JRE_HOME%" == "" goto gotJreHome
+echo Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
+echo Service will try to guess them from the registry.
+goto okJavaHome
+:gotJreHome
+if not exist "%JRE_HOME%\bin\java.exe" goto noJavaHome
+if not exist "%JRE_HOME%\bin\javaw.exe" goto noJavaHome
+goto okJavaHome
+:gotJdkHome
+if not exist "%JAVA_HOME%\jre\bin\java.exe" goto noJavaHome
+if not exist "%JAVA_HOME%\jre\bin\javaw.exe" goto noJavaHome
+if not exist "%JAVA_HOME%\bin\javac.exe" goto noJavaHome
+if not "%JRE_HOME%" == "" goto okJavaHome
+set "JRE_HOME=%JAVA_HOME%\jre"
+goto okJavaHome
+:noJavaHome
+echo The JAVA_HOME environment variable is not defined correctly
+echo This environment variable is needed to run this program
+echo NB: JAVA_HOME should point to a JDK not a JRE
+goto end
+:okJavaHome
+if not "%CATALINA_BASE%" == "" goto gotBase
+set "CATALINA_BASE=%CATALINA_HOME%"
+:gotBase
+
+set "EXECUTABLE=%proc%"
+
+rem Set default Service name (If you change this then rename also TomEE.exe to the same name)
+set SERVICE_NAME=TomEE
+set PR_DISPLAYNAME=Apache TomEE
+
+if "x%1x" == "xx" goto displayUsage
+set SERVICE_CMD=%1
+shift
+if "x%1x" == "xx" goto checkServiceCmd
+:checkUser
+if "x%1x" == "x/userx" goto runAsUser
+if "x%1x" == "x--userx" goto runAsUser
+set SERVICE_NAME=%1
+set PR_DISPLAYNAME=Apache TomEE (%1)
+shift
+if "x%1x" == "xx" goto checkServiceCmd
+goto checkUser
+:runAsUser
+shift
+if "x%1x" == "xx" goto displayUsage
+set SERVICE_USER=%1
+shift
+runas /env /savecred /user:%SERVICE_USER% "%COMSPEC% /K \"%SELF%\" %SERVICE_CMD% %SERVICE_NAME%"
+goto end
+:checkServiceCmd
+if /i %SERVICE_CMD% == install goto doInstall
+if /i %SERVICE_CMD% == remove goto doRemove
+if /i %SERVICE_CMD% == uninstall goto doRemove
+echo Unknown parameter "%1"
+:displayUsage
+echo.
+echo Usage: service.bat install/remove [service_name] [/user username]
+goto end
+
+:doRemove
+rem Remove the service
+"%EXECUTABLE%" //DS//%SERVICE_NAME%
+if not errorlevel 1 goto removed
+echo Failed removing '%SERVICE_NAME%' service
+goto end
+:removed
+echo The service '%SERVICE_NAME%' has been removed
+goto end
+
+:doInstall
+rem Install the service
+echo Installing the service '%SERVICE_NAME%' ...
+echo Using CATALINA_HOME:    "%CATALINA_HOME%"
+echo Using CATALINA_BASE:    "%CATALINA_BASE%"
+echo Using JAVA_HOME:        "%JAVA_HOME%"
+echo Using JRE_HOME:         "%JRE_HOME%"
+
+rem Use the environment variables as an example
+rem Each command line option is prefixed with PR_
+
+set "PR_DESCRIPTION=Apache TomEE - http://tomee.apache.org/"
+set "PR_INSTALL=%EXECUTABLE%"
+set "PR_LOGPATH=%CATALINA_BASE%\logs"
+set "PR_CLASSPATH=%CATALINA_HOME%\bin\bootstrap.jar;%CATALINA_BASE%\bin\tomcat-juli.jar;%CATALINA_HOME%\bin\tomcat-juli.jar"
+rem Set the server jvm from JAVA_HOME
+set "PR_JVM=%JRE_HOME%\bin\server\jvm.dll"
+if exist "%PR_JVM%" goto foundJvm
+rem Set the client jvm from JAVA_HOME
+set "PR_JVM=%JRE_HOME%\bin\client\jvm.dll"
+if exist "%PR_JVM%" goto foundJvm
+set PR_JVM=auto
+:foundJvm
+echo Using JVM:              "%PR_JVM%"
+
+"%EXECUTABLE%" //IS//%SERVICE_NAME% ^
+    --DisplayName=%SERVICE_NAME% ^
+    --StartClass org.apache.catalina.startup.Bootstrap ^
+    --StopClass org.apache.catalina.startup.Bootstrap ^
+    --StartParams start ^
+    --StopParams stop ^
+    --Startup auto ^
+    --JvmMs=512 ^
+    --JvmMx=1024 ^
+    --JvmSs=2048 ^
+    --StartMode jvm ^
+    --StopMode jvm ^
+    --LogLevel Info ^
+    --LogPrefix TomEE
+    
+echo Installed, will now configure TomEE
+    
+if not errorlevel 1 goto installed
+echo Failed installing '%SERVICE_NAME%' service
+goto end
+
+:installed
+rem Clear the environment variables. They are not needed any more.
+set PR_DISPLAYNAME=
+set PR_DESCRIPTION=
+set PR_INSTALL=
+set PR_LOGPATH=
+set PR_CLASSPATH=
+set PR_JVM=
+
+rem Set extra parameters
+"%EXECUTABLE%" //US//%SERVICE_NAME% ^
+	++JvmOptions "-javaagent:%CATALINA_HOME%\lib\openejb-javaagent.jar;-Dcatalina.base=%CATALINA_BASE%;-Dcatalina.home=%CATALINA_HOME%;-Djava.endorsed.dirs=%CATALINA_HOME%\endorsed"
+
+rem More extra parameters
+set "PR_LOGPATH=%CATALINA_BASE%\logs"
+set PR_STDOUTPUT=auto
+set PR_STDERROR=auto
+
+rem before this option was added: "++JvmOptions=-Djava.library.path="%CATALINA_BASE%\bin" ^"
+rem the drawback was it was preventing custom native lib to be loaded even if added to Path
+"%EXECUTABLE%" //US//%SERVICE_NAME% ^
+	++JvmOptions "-Djava.io.tmpdir=%CATALINA_BASE%\temp;-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager;-Djava.util.logging.config.file=%CATALINA_BASE%\conf\logging.properties;-Djava.awt.headless=true;-XX:+UseParallelGC;-XX:MaxPermSize=256M"
+
+echo The service '%SERVICE_NAME%' has been installed.
+
+:end
+cd "%CURRENT_DIR%"