[KARAF-3934] Update Apache Directory and make use of random port generator. Patch supplied by Colm O hEigeartaigh.
diff --git a/jaas/modules/src/test/java/org/apache/karaf/jaas/modules/ldap/LdapCaseInsensitiveDNTest.java b/jaas/modules/src/test/java/org/apache/karaf/jaas/modules/ldap/LdapCaseInsensitiveDNTest.java
index 25579b4..cf560c5 100644
--- a/jaas/modules/src/test/java/org/apache/karaf/jaas/modules/ldap/LdapCaseInsensitiveDNTest.java
+++ b/jaas/modules/src/test/java/org/apache/karaf/jaas/modules/ldap/LdapCaseInsensitiveDNTest.java
@@ -19,6 +19,8 @@
 import static org.junit.Assert.assertTrue;
 
 import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
 import java.io.IOException;
 import java.security.Principal;
 
@@ -29,6 +31,7 @@
 import javax.security.auth.callback.PasswordCallback;
 import javax.security.auth.callback.UnsupportedCallbackException;
 
+import org.apache.commons.io.IOUtils;
 import org.apache.directory.api.ldap.model.constants.SchemaConstants;
 import org.apache.directory.api.ldap.model.message.ModifyRequest;
 import org.apache.directory.api.ldap.model.message.ModifyRequestImpl;
@@ -50,7 +53,7 @@
 import org.junit.runner.RunWith;
 
 @RunWith ( FrameworkRunner.class )
-@CreateLdapServer(transports = {@CreateTransport(protocol = "LDAP", port=9999)})
+@CreateLdapServer(transports = {@CreateTransport(protocol = "LDAP")})
 @CreateDS(name = "LdapCaseInsensitiveDNTest-class",
  partitions = { @CreatePartition(name = "example", suffix = "dc=example,dc=com") })
 @ApplyLdifFiles(
@@ -58,6 +61,33 @@
 )
 public class LdapCaseInsensitiveDNTest extends LdapLoginModuleTest {
     
+    private static boolean portUpdated;
+    
+    @Before
+    @Override
+    public void updatePort() throws Exception {
+        if (!portUpdated) {
+            String basedir = System.getProperty("basedir");
+            if (basedir == null) {
+                basedir = new File(".").getCanonicalPath();
+            }
+
+            // Read in ldap.properties and substitute in the correct port
+            File f = new File(basedir + "/src/test/resources/org/apache/karaf/jaas/modules/ldap/ldapCaseInsensitiveDN.properties");
+
+            FileInputStream inputStream = new FileInputStream(f);
+            String content = IOUtils.toString(inputStream, "UTF-8");
+            inputStream.close();
+            content = content.replaceAll("portno", "" + super.getLdapServer().getPort());
+
+            File f2 = new File(basedir + "/target/test-classes/org/apache/karaf/jaas/modules/ldap/ldapCaseInsensitiveDN.properties");
+            FileOutputStream outputStream = new FileOutputStream(f2);
+            IOUtils.write(content, outputStream, "UTF-8");
+            outputStream.close();
+            portUpdated = true;
+        }
+    }
+    
     @Test
     public void testCaseInsensitiveDN() throws Exception {
         Properties options = ldapLoginModuleOptions();
@@ -101,7 +131,12 @@
     }
 
     protected Properties ldapLoginModuleOptions() throws IOException {
-        return new Properties(new File("src/test/resources/org/apache/karaf/jaas/modules/ldap/ldapCaseInsensitiveDN.properties"));
+        String basedir = System.getProperty("basedir");
+        if (basedir == null) {
+            basedir = new File(".").getCanonicalPath();
+        }
+        File file = new File(basedir + "/target/test-classes/org/apache/karaf/jaas/modules/ldap/ldapCaseInsensitiveDN.properties");
+        return new Properties(file);
     }
 }
             
\ No newline at end of file
diff --git a/jaas/modules/src/test/java/org/apache/karaf/jaas/modules/ldap/LdapLoginModuleTest.java b/jaas/modules/src/test/java/org/apache/karaf/jaas/modules/ldap/LdapLoginModuleTest.java
index b686f10..b913f65 100644
--- a/jaas/modules/src/test/java/org/apache/karaf/jaas/modules/ldap/LdapLoginModuleTest.java
+++ b/jaas/modules/src/test/java/org/apache/karaf/jaas/modules/ldap/LdapLoginModuleTest.java
@@ -17,6 +17,7 @@
 
 import org.apache.directory.server.core.integ.AbstractLdapTestUnit;
 import org.apache.directory.server.core.integ.FrameworkRunner;
+import org.apache.commons.io.IOUtils;
 import org.apache.directory.server.annotations.CreateLdapServer;
 import org.apache.directory.server.annotations.CreateTransport;
 import org.apache.directory.server.core.annotations.ApplyLdifFiles;
@@ -26,6 +27,7 @@
 import org.apache.karaf.jaas.boot.principal.RolePrincipal;
 import org.apache.karaf.jaas.boot.principal.UserPrincipal;
 import org.junit.After;
+import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
@@ -34,6 +36,8 @@
 import javax.security.auth.login.LoginException;
 
 import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
 import java.io.IOException;
 import java.security.Principal;
 import java.util.ArrayList;
@@ -46,14 +50,40 @@
 import static org.junit.Assert.fail;
 
 @RunWith(FrameworkRunner.class)
-@CreateLdapServer(transports = {@CreateTransport(protocol = "LDAP", port = 9999)})
+@CreateLdapServer(transports = {@CreateTransport(protocol = "LDAP")})
 @CreateDS(name = "LdapLoginModuleTest-class",
         partitions = {@CreatePartition(name = "example", suffix = "dc=example,dc=com")})
 @ApplyLdifFiles(
         "org/apache/karaf/jaas/modules/ldap/example.com.ldif"
 )
 public class LdapLoginModuleTest extends AbstractLdapTestUnit {
+    
+    private static boolean portUpdated;
 
+    @Before
+    public void updatePort() throws Exception {
+        if (!portUpdated) {
+            String basedir = System.getProperty("basedir");
+            if (basedir == null) {
+                basedir = new File(".").getCanonicalPath();
+            }
+
+            // Read in ldap.properties and substitute in the correct port
+            File f = new File(basedir + "/src/test/resources/org/apache/karaf/jaas/modules/ldap/ldap.properties");
+
+            FileInputStream inputStream = new FileInputStream(f);
+            String content = IOUtils.toString(inputStream, "UTF-8");
+            inputStream.close();
+            content = content.replaceAll("portno", "" + super.getLdapServer().getPort());
+
+            File f2 = new File(basedir + "/target/test-classes/org/apache/karaf/jaas/modules/ldap/ldap.properties");
+            FileOutputStream outputStream = new FileOutputStream(f2);
+            IOUtils.write(content, outputStream, "UTF-8");
+            outputStream.close();
+            portUpdated = true;
+        }
+    }
+            
     @After
     public void tearDown() {
         LDAPCache.clear();
@@ -102,7 +132,12 @@
     }
 
     protected Properties ldapLoginModuleOptions() throws IOException {
-        return new Properties(new File("src/test/resources/org/apache/karaf/jaas/modules/ldap/ldap.properties"));
+        String basedir = System.getProperty("basedir");
+        if (basedir == null) {
+            basedir = new File(".").getCanonicalPath();
+        }
+        File file = new File(basedir + "/target/test-classes/org/apache/karaf/jaas/modules/ldap/ldap.properties");
+        return new Properties(file);
     }
 
     @Test
diff --git a/jaas/modules/src/test/java/org/apache/karaf/jaas/modules/ldap/LdapLoginModuleWithEscapesTest.java b/jaas/modules/src/test/java/org/apache/karaf/jaas/modules/ldap/LdapLoginModuleWithEscapesTest.java
index bb80280..017eb27 100644
--- a/jaas/modules/src/test/java/org/apache/karaf/jaas/modules/ldap/LdapLoginModuleWithEscapesTest.java
+++ b/jaas/modules/src/test/java/org/apache/karaf/jaas/modules/ldap/LdapLoginModuleWithEscapesTest.java
@@ -16,20 +16,54 @@
 package org.apache.karaf.jaas.modules.ldap;
 
 import org.apache.directory.server.core.integ.FrameworkRunner;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+
+import org.apache.commons.io.IOUtils;
 import org.apache.directory.server.annotations.CreateLdapServer;
 import org.apache.directory.server.annotations.CreateTransport;
 import org.apache.directory.server.core.annotations.ApplyLdifFiles;
 import org.apache.directory.server.core.annotations.CreateDS;
 import org.apache.directory.server.core.annotations.CreatePartition;
+import org.junit.Before;
 import org.junit.runner.RunWith;
 
 @RunWith ( FrameworkRunner.class )
-@CreateLdapServer(transports = {@CreateTransport(protocol = "LDAP", port=9999)})
+@CreateLdapServer(transports = {@CreateTransport(protocol = "LDAP")})
 @CreateDS(name = "LdapLoginModuleWithEscapesTest-class",
  partitions = { @CreatePartition(name = "example", suffix = "dc=example,dc=com") })
 @ApplyLdifFiles(
    "org/apache/karaf/jaas/modules/ldap/example.com_with_escapes.ldif"
 )
 public class LdapLoginModuleWithEscapesTest extends LdapLoginModuleTest {
+    
+    private static boolean portUpdated;
+
+    @Before
+    @Override
+    public void updatePort() throws Exception {
+        if (!portUpdated) {
+            String basedir = System.getProperty("basedir");
+            if (basedir == null) {
+                basedir = new File(".").getCanonicalPath();
+            }
+
+            // Read in ldap.properties and substitute in the correct port
+            File f = new File(basedir + "/src/test/resources/org/apache/karaf/jaas/modules/ldap/ldap.properties");
+
+            FileInputStream inputStream = new FileInputStream(f);
+            String content = IOUtils.toString(inputStream, "UTF-8");
+            inputStream.close();
+            content = content.replaceAll("portno", "" + super.getLdapServer().getPort());
+
+            File f2 = new File(basedir + "/target/test-classes/org/apache/karaf/jaas/modules/ldap/ldap.properties");
+            FileOutputStream outputStream = new FileOutputStream(f2);
+            IOUtils.write(content, outputStream, "UTF-8");
+            outputStream.close();
+            portUpdated = true;
+        }
+    }
 }
             
\ No newline at end of file
diff --git a/jaas/modules/src/test/java/org/apache/karaf/jaas/modules/ldap/LdapSpecialCharsInPasswordTest.java b/jaas/modules/src/test/java/org/apache/karaf/jaas/modules/ldap/LdapSpecialCharsInPasswordTest.java
index d286ea1..f02bc53 100644
--- a/jaas/modules/src/test/java/org/apache/karaf/jaas/modules/ldap/LdapSpecialCharsInPasswordTest.java
+++ b/jaas/modules/src/test/java/org/apache/karaf/jaas/modules/ldap/LdapSpecialCharsInPasswordTest.java
@@ -16,7 +16,11 @@
 package org.apache.karaf.jaas.modules.ldap;
 
 import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
 import java.io.IOException;
+
+import org.apache.commons.io.IOUtils;
 import org.apache.directory.api.ldap.model.constants.SchemaConstants;
 import org.apache.directory.api.ldap.model.message.ModifyRequest;
 import org.apache.directory.api.ldap.model.message.ModifyRequestImpl;
@@ -35,7 +39,7 @@
 import org.junit.runner.RunWith;
 
 @RunWith ( FrameworkRunner.class )
-@CreateLdapServer(transports = {@CreateTransport(protocol = "LDAP", port=9999)})
+@CreateLdapServer(transports = {@CreateTransport(protocol = "LDAP")})
 @CreateDS(name = "LdapSpecialCharsInPasswordTest-class",
  partitions = { @CreatePartition(name = "example", suffix = "dc=example,dc=com") })
 @ApplyLdifFiles(
@@ -43,15 +47,46 @@
 )
 public class LdapSpecialCharsInPasswordTest extends LdapLoginModuleTest {
     
+    private static boolean portUpdated;
     private static final String NEW_CONNECTION_PASSWORD = "#a&b{>c=<12~d%";
+    
+    @Before
+    @Override
+    public void updatePort() throws Exception {
+        if (!portUpdated) {
+            String basedir = System.getProperty("basedir");
+            if (basedir == null) {
+                basedir = new File(".").getCanonicalPath();
+            }
+
+            // Read in ldap.properties and substitute in the correct port
+            File f = new File(basedir + "/src/test/resources/org/apache/karaf/jaas/modules/ldap/ldap_special_char_in_password.properties");
+
+            FileInputStream inputStream = new FileInputStream(f);
+            String content = IOUtils.toString(inputStream, "UTF-8");
+            inputStream.close();
+            content = content.replaceAll("portno", "" + super.getLdapServer().getPort());
+
+            File f2 = new File(basedir + "/target/test-classes/org/apache/karaf/jaas/modules/ldap/ldap_special_char_in_password.properties");
+            FileOutputStream outputStream = new FileOutputStream(f2);
+            IOUtils.write(content, outputStream, "UTF-8");
+            outputStream.close();
+            portUpdated = true;
+        }
+    }
 
     protected Properties ldapLoginModuleOptions() throws IOException {
-        return new Properties(new File("src/test/resources/org/apache/karaf/jaas/modules/ldap/ldap_special_char_in_password.properties"));
+        String basedir = System.getProperty("basedir");
+        if (basedir == null) {
+            basedir = new File(".").getCanonicalPath();
+        }
+        File file = new File(basedir + "/target/test-classes/org/apache/karaf/jaas/modules/ldap/ldap_special_char_in_password.properties");
+        return new Properties(file);
     }
     
     @Before
     public void changeAdminPassword() throws Exception {
-        LdapConnection connection = new LdapNetworkConnection( "localhost", 9999 );
+        LdapConnection connection = new LdapNetworkConnection( "localhost", super.getLdapServer().getPort() );
         connection.bind( "uid=admin,ou=system", "secret");
         Dn adminDn = new Dn( "uid=admin,ou=system" );
         ModifyRequest modReq = new ModifyRequestImpl();
@@ -61,7 +96,7 @@
         connection.close();
         
         // check that we actually changed the admin connection password
-        connection = new LdapNetworkConnection( "localhost", 9999 );
+        connection = new LdapNetworkConnection( "localhost", super.getLdapServer().getPort() );
         connection.bind( "uid=admin,ou=system", NEW_CONNECTION_PASSWORD);
         connection.close();
     }
diff --git a/jaas/modules/src/test/resources/org/apache/karaf/jaas/modules/ldap/ldap.properties b/jaas/modules/src/test/resources/org/apache/karaf/jaas/modules/ldap/ldap.properties
index 5cb6848..7916b1e 100644
--- a/jaas/modules/src/test/resources/org/apache/karaf/jaas/modules/ldap/ldap.properties
+++ b/jaas/modules/src/test/resources/org/apache/karaf/jaas/modules/ldap/ldap.properties
@@ -18,7 +18,7 @@
 ################################################################################
 
 debug=true
-connection.url=ldap://127.0.0.1:9999
+connection.url=ldap://127.0.0.1:portno
 connection.username=uid=admin,ou=system
 connection.password=secret
 connection.protocol=
diff --git a/jaas/modules/src/test/resources/org/apache/karaf/jaas/modules/ldap/ldapCaseInsensitiveDN.properties b/jaas/modules/src/test/resources/org/apache/karaf/jaas/modules/ldap/ldapCaseInsensitiveDN.properties
index 931e7b6..fe5dde9 100644
--- a/jaas/modules/src/test/resources/org/apache/karaf/jaas/modules/ldap/ldapCaseInsensitiveDN.properties
+++ b/jaas/modules/src/test/resources/org/apache/karaf/jaas/modules/ldap/ldapCaseInsensitiveDN.properties
@@ -18,7 +18,7 @@
 ################################################################################
 
 debug=true
-connection.url=ldap://127.0.0.1:9999
+connection.url=ldap://127.0.0.1:portno
 connection.username=uid=admin,ou=system
 connection.password=secret
 connection.protocol=
diff --git a/jaas/modules/src/test/resources/org/apache/karaf/jaas/modules/ldap/ldap_special_char_in_password.properties b/jaas/modules/src/test/resources/org/apache/karaf/jaas/modules/ldap/ldap_special_char_in_password.properties
index 858bba0..5141515 100644
--- a/jaas/modules/src/test/resources/org/apache/karaf/jaas/modules/ldap/ldap_special_char_in_password.properties
+++ b/jaas/modules/src/test/resources/org/apache/karaf/jaas/modules/ldap/ldap_special_char_in_password.properties
@@ -18,7 +18,7 @@
 ################################################################################
 
 debug=true
-connection.url=ldap://127.0.0.1:9999
+connection.url=ldap://127.0.0.1:portno
 connection.username=uid=admin,ou=system
 connection.password=#a&b{>c=<12~d%
 connection.protocol=
diff --git a/pom.xml b/pom.xml
index 9ebb367..37b9e43 100644
--- a/pom.xml
+++ b/pom.xml
@@ -254,7 +254,7 @@
 
         <sshd.version>0.14.0</sshd.version>
         <derby-version>10.10.1.1</derby-version>
-        <directory-version>2.0.0-M16</directory-version>
+        <directory-version>2.0.0-M20</directory-version>
         <struts.bundle.version>1.3.10_1</struts.bundle.version>
         <xbean.version>3.18</xbean.version>
         <xerces.version>2.11.0</xerces.version>