Author: rmannibucau
Date: Mon Aug 20 15:46:11 2012
New Revision: 1375074

URL: http://svn.apache.org/viewvc?rev=1375074&view=rev
Log:
TOMEE-390 ability to specify a port range for tomee adapters

Modified:
    
openejb/trunk/openejb/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEConfiguration.java
    
openejb/trunk/openejb/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java
    
openejb/trunk/openejb/arquillian/arquillian-tomee-embedded/src/main/java/org/apache/openejb/arquillian/embedded/EmbeddedTomEEConfiguration.java
    
openejb/trunk/openejb/arquillian/arquillian-tomee-remote/src/main/java/org/apache/tomee/arquillian/remote/RemoteTomEEConfiguration.java
    
openejb/trunk/openejb/arquillian/arquillian-tomee-tests/arquillian-tomee-webprofile-tests/src/test/resources/arquillian.xml
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/NetworkUtil.java

Modified: 
openejb/trunk/openejb/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEConfiguration.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEConfiguration.java?rev=1375074&r1=1375073&r2=1375074&view=diff
==============================================================================
--- 
openejb/trunk/openejb/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEConfiguration.java
 (original)
+++ 
openejb/trunk/openejb/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEConfiguration.java
 Mon Aug 20 15:46:11 2012
@@ -18,16 +18,13 @@ package org.apache.openejb.arquillian.co
 
 
 import org.apache.openejb.OpenEJBRuntimeException;
-import org.apache.openejb.loader.*;
 import org.jboss.arquillian.container.spi.ConfigurationException;
 import 
org.jboss.arquillian.container.spi.client.container.ContainerConfiguration;
 
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
-import java.io.InputStream;
-import java.io.Reader;
-import java.io.StringReader;
-import java.util.Map;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Properties;
 
 public class TomEEConfiguration implements ContainerConfiguration {
@@ -40,6 +37,7 @@ public class TomEEConfiguration implemen
     private String host = "localhost";
     private String serverXml = null;
     private String properties = "";
+    private String portRange = ""; // only used if port < 0, empty means 
whatever, can be "1024-65535"
 
     public int getHttpPort() {
         return httpPort;
@@ -128,4 +126,31 @@ public class TomEEConfiguration implemen
         }
         return properties;
     }
+
+    public String getPortRange() {
+        return portRange;
+    }
+
+    public void setPortRange(String portRange) {
+        this.portRange = portRange;
+    }
+
+    public int[] portsAlreadySet() {
+        final List<Integer> value = new ArrayList<Integer>();
+        if (stopPort > 0) {
+            value.add(stopPort);
+        }
+        if (httpPort > 0) {
+            value.add(httpPort);
+        }
+        return toInts(value);
+    }
+
+    protected int[] toInts(List<Integer> values) {
+        int[] array = new int[values.size()];
+        for (int i = 0; i < array.length; i++) {
+            array[i] = values.get(i);
+        }
+        return array;
+    }
 }

Modified: 
openejb/trunk/openejb/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java?rev=1375074&r1=1375073&r2=1375074&view=diff
==============================================================================
--- 
openejb/trunk/openejb/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java
 (original)
+++ 
openejb/trunk/openejb/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java
 Mon Aug 20 15:46:11 2012
@@ -16,18 +16,6 @@
  */
 package org.apache.openejb.arquillian.common;
 
-import java.io.File;
-import java.io.OutputStream;
-import java.net.Socket;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Properties;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import javax.naming.Context;
-import javax.naming.InitialContext;
-import javax.naming.NamingException;
-
 import org.apache.openejb.OpenEJBException;
 import org.apache.openejb.assembler.Deployer;
 import org.apache.openejb.assembler.classic.AppInfo;
@@ -48,6 +36,19 @@ import org.jboss.shrinkwrap.api.exporter
 import org.jboss.shrinkwrap.api.spec.WebArchive;
 import org.jboss.shrinkwrap.descriptor.api.Descriptor;
 
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+import java.io.File;
+import java.io.OutputStream;
+import java.net.Socket;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
 public abstract class TomEEContainer<Configuration extends TomEEConfiguration> 
implements DeployableContainer<Configuration> {
     protected static final Logger LOGGER = 
Logger.getLogger(TomEEContainer.class.getName());
 
@@ -106,7 +107,7 @@ public abstract class TomEEContainer<Con
                 Object value = entry.getValue();
                 int port = new Integer(value + "");
                 if (port <= 0) {
-                    port = NetworkUtil.getNextAvailablePort();
+                    port = nextPort(configuration.getPortRange(), 
configuration.portsAlreadySet());
                     entry.setValue(port);
                 }
             } catch (NumberFormatException mustNotBeAPortConfig) {
@@ -135,6 +136,38 @@ public abstract class TomEEContainer<Con
         }
     }
 
+    private int nextPort(final String portRange, int[] excluded) {
+        if (portRange == null || portRange.isEmpty()) {
+            int retry = 10;
+            while (retry > 0) {
+                boolean ok = true;
+                int port = NetworkUtil.getNextAvailablePort();
+                if (excluded != null) {
+                    for (int exclude : excluded) {
+                        if (exclude == port) {
+                            ok = false;
+                        }
+                    }
+                }
+                if (ok) {
+                    return port;
+                }
+                retry--;
+            }
+            throw new IllegalArgumentException("can't find a port available 
excluding " + Arrays.asList(excluded));
+        }
+
+        if (!portRange.contains("-")) {
+            int port = Integer.parseInt(portRange.trim());
+            return NetworkUtil.getNextAvailablePort(new int[]{port});
+        }
+
+        final String[] minMax = portRange.trim().split("-");
+        int min = Integer.parseInt(minMax[0]);
+        int max = Integer.parseInt(minMax[1]);
+        return NetworkUtil.getNextAvailablePort(min, max, excluded);
+    }
+
     public abstract void start() throws LifecycleException;
 
     public void stop() throws LifecycleException {

Modified: 
openejb/trunk/openejb/arquillian/arquillian-tomee-embedded/src/main/java/org/apache/openejb/arquillian/embedded/EmbeddedTomEEConfiguration.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/arquillian/arquillian-tomee-embedded/src/main/java/org/apache/openejb/arquillian/embedded/EmbeddedTomEEConfiguration.java?rev=1375074&r1=1375073&r2=1375074&view=diff
==============================================================================
--- 
openejb/trunk/openejb/arquillian/arquillian-tomee-embedded/src/main/java/org/apache/openejb/arquillian/embedded/EmbeddedTomEEConfiguration.java
 (original)
+++ 
openejb/trunk/openejb/arquillian/arquillian-tomee-embedded/src/main/java/org/apache/openejb/arquillian/embedded/EmbeddedTomEEConfiguration.java
 Mon Aug 20 15:46:11 2012
@@ -19,6 +19,9 @@ package org.apache.openejb.arquillian.em
 import org.apache.openejb.arquillian.common.Prefixes;
 import org.apache.openejb.arquillian.common.TomEEConfiguration;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * @version $Rev$ $Date$
  */
@@ -34,4 +37,19 @@ public class EmbeddedTomEEConfiguration 
     public void setAjpPort(int ajpPort) {
         this.ajpPort = ajpPort;
     }
+
+    @Override
+    public int[] portsAlreadySet() {
+        final List<Integer> value = new ArrayList<Integer>();
+        if (getStopPort() > 0) {
+            value.add(getStopPort());
+        }
+        if (getHttpPort() > 0) {
+            value.add(getHttpPort());
+        }
+        if (getAjpPort() > 0) {
+            value.add(getAjpPort());
+        }
+        return toInts(value);
+    }
 }

Modified: 
openejb/trunk/openejb/arquillian/arquillian-tomee-remote/src/main/java/org/apache/tomee/arquillian/remote/RemoteTomEEConfiguration.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/arquillian/arquillian-tomee-remote/src/main/java/org/apache/tomee/arquillian/remote/RemoteTomEEConfiguration.java?rev=1375074&r1=1375073&r2=1375074&view=diff
==============================================================================
--- 
openejb/trunk/openejb/arquillian/arquillian-tomee-remote/src/main/java/org/apache/tomee/arquillian/remote/RemoteTomEEConfiguration.java
 (original)
+++ 
openejb/trunk/openejb/arquillian/arquillian-tomee-remote/src/main/java/org/apache/tomee/arquillian/remote/RemoteTomEEConfiguration.java
 Mon Aug 20 15:46:11 2012
@@ -19,6 +19,9 @@ package org.apache.tomee.arquillian.remo
 import org.apache.openejb.arquillian.common.Prefixes;
 import org.apache.openejb.arquillian.common.TomEEConfiguration;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * @version $Rev$ $Date$
  */
@@ -105,4 +108,19 @@ public class RemoteTomEEConfiguration ex
     public void setConf(String conf) {
         this.conf = conf;
     }
+
+    @Override
+    public int[] portsAlreadySet() {
+        final List<Integer> value = new ArrayList<Integer>();
+        if (getStopPort() > 0) {
+            value.add(getStopPort());
+        }
+        if (getHttpPort() > 0) {
+            value.add(getHttpPort());
+        }
+        if (getAjpPort() > 0) {
+            value.add(getAjpPort());
+        }
+        return toInts(value);
+    }
 }

Modified: 
openejb/trunk/openejb/arquillian/arquillian-tomee-tests/arquillian-tomee-webprofile-tests/src/test/resources/arquillian.xml
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/arquillian/arquillian-tomee-tests/arquillian-tomee-webprofile-tests/src/test/resources/arquillian.xml?rev=1375074&r1=1375073&r2=1375074&view=diff
==============================================================================
--- 
openejb/trunk/openejb/arquillian/arquillian-tomee-tests/arquillian-tomee-webprofile-tests/src/test/resources/arquillian.xml
 (original)
+++ 
openejb/trunk/openejb/arquillian/arquillian-tomee-tests/arquillian-tomee-webprofile-tests/src/test/resources/arquillian.xml
 Mon Aug 20 15:46:11 2012
@@ -26,6 +26,7 @@
       <property name="stopPort">-1</property>
       <property name="dir">target/apache-tomee-remote</property>
       <property 
name="appWorkingDir">target/arquillian-test-working-dir</property>
+      <property name="portRange">2000-30000</property>
       <property name="properties">
         openejb.classloader.forced-load=org.apache.openejb.arquillian.tests
       </property>
@@ -38,6 +39,7 @@
       <property name="stopPort">-1</property>
       <property name="dir">target/apache-tomee-remote</property>
       <property 
name="appWorkingDir">target/arquillian-test-working-dir</property>
+      <property name="portRange">2000-30000</property>
       <property name="properties">
         openejb.classloader.forced-load=org.apache.openejb.arquillian.tests
       </property>
@@ -50,6 +52,7 @@
       <property name="stopPort">-1</property>
       <property name="dir">target/apache-tomee-remote</property>
       <property 
name="appWorkingDir">target/arquillian-test-working-dir</property>
+      <property name="portRange">2000-30000</property>
       <property name="properties">
         openejb.classloader.forced-load=org.apache.openejb.arquillian.tests.
       </property>

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/NetworkUtil.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/NetworkUtil.java?rev=1375074&r1=1375073&r2=1375074&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/NetworkUtil.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/NetworkUtil.java
 Mon Aug 20 15:46:11 2012
@@ -41,6 +41,35 @@ public final class NetworkUtil {
         return port;
     }
 
+    public static int getNextAvailablePort(int min, int max, int... excepted) {
+        int port = -1;
+        ServerSocket s = null;
+        for (int i = min; i <= max; i++) {
+            try {
+                s = create(new int[] { i });
+                port = s.getLocalPort();
+                s.close();
+
+                boolean forbidden = false;
+                if (excepted != null) {
+                    for (int j = 0; j < excepted.length; j++) {
+                        if (port == excepted[j]) {
+                            forbidden = true;
+                            break;
+                        }
+                    }
+                }
+
+                if (!forbidden) {
+                    break;
+                }
+            } catch (IOException ioe) {
+                port = -1;
+            }
+        }
+        return port;
+    }
+
     private static ServerSocket create(int[] ports) throws IOException {
         for (int port : ports) {
             try {


Reply via email to