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 {