Skip to content

Instantly share code, notes, and snippets.

@mbautin
Created May 30, 2014 02:38
Show Gist options
  • Save mbautin/d89057e63d48576372ac to your computer and use it in GitHub Desktop.
Save mbautin/d89057e63d48576372ac to your computer and use it in GitHub Desktop.
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