Created
May 30, 2014 02:38
-
-
Save mbautin/d89057e63d48576372ac to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From 2953ecbca9ca0955d8ac786599be925407ef06a6 Mon Sep 17 00:00:00 2001 | |
From: Mikhail Bautin <mbautin@gmail.com> | |
Date: Thu, 29 May 2014 18:54:00 -0700 | |
Subject: [PATCH 1/4] Allow selecting ports randomly | |
--- | |
.../mojo/buildhelper/ReserveListenerPortMojo.java | 43 ++++++++++++++++++---- | |
1 file changed, 36 insertions(+), 7 deletions(-) | |
diff --git a/src/main/java/org/codehaus/mojo/buildhelper/ReserveListenerPortMojo.java b/src/main/java/org/codehaus/mojo/buildhelper/ReserveListenerPortMojo.java | |
index 2d6a587..5cd544e 100644 | |
--- a/src/main/java/org/codehaus/mojo/buildhelper/ReserveListenerPortMojo.java | |
+++ b/src/main/java/org/codehaus/mojo/buildhelper/ReserveListenerPortMojo.java | |
@@ -32,6 +32,7 @@ | |
import java.util.ArrayList; | |
import java.util.List; | |
import java.util.Properties; | |
+import java.util.Random; | |
import org.apache.maven.plugin.AbstractMojo; | |
import org.apache.maven.plugin.MojoExecutionException; | |
@@ -97,6 +98,14 @@ | |
private Integer maxPortNumber; | |
/** | |
+ * Specify to select port numbers randomly instead of sequentially. | |
+ * | |
+ * @since 1.9 | |
+ */ | |
+ @Parameter | |
+ private Boolean randomPortSelection; | |
+ | |
+ /** | |
* @since 1.2 | |
*/ | |
@Component | |
@@ -194,6 +203,19 @@ private ServerSocket getServerSocket() | |
// threading issues (essentially possible while put/getting the plugin ctx to get the reserved ports). | |
synchronized ( lock ) | |
{ | |
+ if (randomPortSelection) { | |
+ Random rand = new Random(); | |
+ for ( int attempt = 0; attempt < 100; ++attempt ) { | |
+ int port = minPortNumber + rand.nextInt( maxPortNumber - minPortNumber + 1 ); | |
+ if ( getReservedPorts().contains( port ) ) { | |
+ continue; | |
+ } | |
+ ServerSocket serverSocket = tryPortNumber( port ); | |
+ if ( serverSocket != null ) { | |
+ return serverSocket; | |
+ } | |
+ } | |
+ } | |
int min = getNextPortNumber(); | |
for ( int port = min;; ++port ) | |
{ | |
@@ -202,20 +224,27 @@ private ServerSocket getServerSocket() | |
throw new MojoExecutionException( "Unable to find an available port between " + minPortNumber | |
+ " and " + maxPortNumber ); | |
} | |
- try | |
- { | |
- ServerSocket serverSocket = new ServerSocket( port ); | |
+ ServerSocket serverSocket = tryPortNumber( port ); | |
+ if ( serverSocket != null ) { | |
return serverSocket; | |
} | |
- catch ( IOException ioe ) | |
- { | |
- getLog().debug( "Tried binding to port " + port + " without success. Trying next port.", ioe ); | |
- } | |
} | |
} | |
} | |
} | |
+ private ServerSocket tryPortNumber( int port ) { | |
+ try | |
+ { | |
+ return new ServerSocket( port ); | |
+ } | |
+ catch ( IOException ioe ) | |
+ { | |
+ getLog().debug( "Tried binding to port " + port + " without success. Trying next port.", ioe ); | |
+ return null; | |
+ } | |
+ } | |
+ | |
private int getNextPortNumber() | |
{ | |
assert minPortNumber != null; | |
-- | |
1.9.3 | |
From b12d3d57f702658989514f85eaf512d394c2e5f8 Mon Sep 17 00:00:00 2001 | |
From: Mikhail Bautin <mbautin@gmail.com> | |
Date: Thu, 29 May 2014 18:55:40 -0700 | |
Subject: [PATCH 2/4] Fix NullPointerException | |
--- | |
.../java/org/codehaus/mojo/buildhelper/ReserveListenerPortMojo.java | 2 +- | |
1 file changed, 1 insertion(+), 1 deletion(-) | |
diff --git a/src/main/java/org/codehaus/mojo/buildhelper/ReserveListenerPortMojo.java b/src/main/java/org/codehaus/mojo/buildhelper/ReserveListenerPortMojo.java | |
index 5cd544e..4d82f49 100644 | |
--- a/src/main/java/org/codehaus/mojo/buildhelper/ReserveListenerPortMojo.java | |
+++ b/src/main/java/org/codehaus/mojo/buildhelper/ReserveListenerPortMojo.java | |
@@ -203,7 +203,7 @@ private ServerSocket getServerSocket() | |
// threading issues (essentially possible while put/getting the plugin ctx to get the reserved ports). | |
synchronized ( lock ) | |
{ | |
- if (randomPortSelection) { | |
+ if (randomPortSelection != null && randomPortSelection) { | |
Random rand = new Random(); | |
for ( int attempt = 0; attempt < 100; ++attempt ) { | |
int port = minPortNumber + rand.nextInt( maxPortNumber - minPortNumber + 1 ); | |
-- | |
1.9.3 | |
From ee9f5574d97dfed4d72fa732a8fdeca9a3fb4634 Mon Sep 17 00:00:00 2001 | |
From: Mikhail Bautin <mbautin@gmail.com> | |
Date: Thu, 29 May 2014 19:11:56 -0700 | |
Subject: [PATCH 3/4] Fix boolean plugin parameter for random port selection | |
--- | |
.../java/org/codehaus/mojo/buildhelper/ReserveListenerPortMojo.java | 6 +++--- | |
1 file changed, 3 insertions(+), 3 deletions(-) | |
diff --git a/src/main/java/org/codehaus/mojo/buildhelper/ReserveListenerPortMojo.java b/src/main/java/org/codehaus/mojo/buildhelper/ReserveListenerPortMojo.java | |
index 4d82f49..bef36fb 100644 | |
--- a/src/main/java/org/codehaus/mojo/buildhelper/ReserveListenerPortMojo.java | |
+++ b/src/main/java/org/codehaus/mojo/buildhelper/ReserveListenerPortMojo.java | |
@@ -102,8 +102,8 @@ | |
* | |
* @since 1.9 | |
*/ | |
- @Parameter | |
- private Boolean randomPortSelection; | |
+ @Parameter( defaultValue = "false") | |
+ private boolean randomPortSelection; | |
/** | |
* @since 1.2 | |
@@ -203,7 +203,7 @@ private ServerSocket getServerSocket() | |
// threading issues (essentially possible while put/getting the plugin ctx to get the reserved ports). | |
synchronized ( lock ) | |
{ | |
- if (randomPortSelection != null && randomPortSelection) { | |
+ if (randomPortSelection) { | |
Random rand = new Random(); | |
for ( int attempt = 0; attempt < 100; ++attempt ) { | |
int port = minPortNumber + rand.nextInt( maxPortNumber - minPortNumber + 1 ); | |
-- | |
1.9.3 | |
From 93eeccb879b1fc7638d3746bedb7b8523f04d201 Mon Sep 17 00:00:00 2001 | |
From: Mikhail Bautin <mbautin@gmail.com> | |
Date: Thu, 29 May 2014 19:36:35 -0700 | |
Subject: [PATCH 4/4] Allow random port selection even if min/max ports are not | |
set | |
--- | |
.../org/codehaus/mojo/buildhelper/ReserveListenerPortMojo.java | 8 ++++---- | |
1 file changed, 4 insertions(+), 4 deletions(-) | |
diff --git a/src/main/java/org/codehaus/mojo/buildhelper/ReserveListenerPortMojo.java b/src/main/java/org/codehaus/mojo/buildhelper/ReserveListenerPortMojo.java | |
index bef36fb..bb0f742 100644 | |
--- a/src/main/java/org/codehaus/mojo/buildhelper/ReserveListenerPortMojo.java | |
+++ b/src/main/java/org/codehaus/mojo/buildhelper/ReserveListenerPortMojo.java | |
@@ -102,7 +102,7 @@ | |
* | |
* @since 1.9 | |
*/ | |
- @Parameter( defaultValue = "false") | |
+ @Parameter( defaultValue = "false" ) | |
private boolean randomPortSelection; | |
/** | |
@@ -183,17 +183,17 @@ public void execute() | |
private ServerSocket getServerSocket() | |
throws IOException, MojoExecutionException | |
{ | |
- if ( minPortNumber == null && maxPortNumber != null ) | |
+ if ( minPortNumber == null && maxPortNumber != null || randomPortSelection ) | |
{ | |
getLog().debug( "minPortNumber unspecified: using default value " + FIRST_NON_ROOT_PORT_NUMBER ); | |
minPortNumber = FIRST_NON_ROOT_PORT_NUMBER; | |
} | |
- if ( minPortNumber != null && maxPortNumber == null ) | |
+ if ( minPortNumber != null && maxPortNumber == null || randomPortSelection ) | |
{ | |
getLog().debug( "maxPortNumber unspecified: using default value " + MAX_PORT_NUMBER ); | |
maxPortNumber = MAX_PORT_NUMBER; | |
} | |
- if ( minPortNumber == null && maxPortNumber == null ) | |
+ if ( minPortNumber == null && maxPortNumber == null && !randomPortSelection ) | |
{ | |
return new ServerSocket( 0 ); | |
} | |
-- | |
1.9.3 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment