From 2953ecbca9ca0955d8ac786599be925407ef06a6 Mon Sep 17 00:00:00 2001 From: Mikhail Bautin 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 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 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 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