Merge pull request #28 from amichair/illegalstate

Add explicit IllegalStateException in exportService
diff --git a/itests/felix/src/test/java/org/apache/aries/rsa/itests/felix/RsaTestBase.java b/itests/felix/src/test/java/org/apache/aries/rsa/itests/felix/RsaTestBase.java
index 346960d..c08bfce 100644
--- a/itests/felix/src/test/java/org/apache/aries/rsa/itests/felix/RsaTestBase.java
+++ b/itests/felix/src/test/java/org/apache/aries/rsa/itests/felix/RsaTestBase.java
@@ -70,7 +70,7 @@
         }
     }
 
-    protected int getFreePort() throws IOException {
+    protected static int getFreePort() throws IOException {
         try (ServerSocket socket = new ServerSocket()) {
             socket.setReuseAddress(true); // enables quickly reopening socket on same port
             socket.bind(new InetSocketAddress(0)); // zero finds a free port
@@ -178,10 +178,14 @@
             .asOption();
     }
 
-    protected static Option configFastBinPort(String port) {
+    protected static Option configFastBinPort(int port) {
         return newConfiguration("org.apache.aries.rsa.provider.fastbin") //
             .put("uri", "tcp://0.0.0.0:" + port) //
             .asOption();
     }
 
+    protected static Option configFastBinFreePort() throws IOException {
+        return configFastBinPort(getFreePort());
+    }
+
 }
diff --git a/itests/felix/src/test/java/org/apache/aries/rsa/itests/felix/fastbin/TestFastbinRoundTrip.java b/itests/felix/src/test/java/org/apache/aries/rsa/itests/felix/fastbin/TestFastbinRoundTrip.java
index 36d86ca..14d4ffd 100644
--- a/itests/felix/src/test/java/org/apache/aries/rsa/itests/felix/fastbin/TestFastbinRoundTrip.java
+++ b/itests/felix/src/test/java/org/apache/aries/rsa/itests/felix/fastbin/TestFastbinRoundTrip.java
@@ -37,17 +37,10 @@
 
 @RunWith(TwoContainerPaxExam.class)
 public class TestFastbinRoundTrip extends RsaTestBase {
-    private static String FASTBIN_PORT_SERVER = "2544";
-    private static String FASTBIN_PORT_CLIENT = "2545";
     
     @Inject
     EchoService echoService;
-    
-    public TestFastbinRoundTrip() throws IOException {
-        FASTBIN_PORT_CLIENT = "" + getFreePort();
-        FASTBIN_PORT_SERVER = "" + getFreePort();
-    }
-    
+
     @ServerConfiguration
     public static Option[] remoteConfig() throws IOException {
         return new Option[] //
@@ -58,7 +51,7 @@
          echoTcpService(), //
          configZKServer(), //
          configZKDiscovery(), //
-         configFastBinPort(FASTBIN_PORT_SERVER),
+         configFastBinFreePort()
         };
     }
 
@@ -71,7 +64,7 @@
          rsaProviderFastBin(), //
          echoTcpConsumer(), //
          configZKDiscovery(), //
-         configFastBinPort(FASTBIN_PORT_CLIENT)
+         configFastBinFreePort()
         };
     }
 
diff --git a/itests/felix/src/test/java/org/apache/aries/rsa/itests/felix/rsa/TestRSAListener.java b/itests/felix/src/test/java/org/apache/aries/rsa/itests/felix/rsa/TestRSAListener.java
index 0371787..3cf0267 100644
--- a/itests/felix/src/test/java/org/apache/aries/rsa/itests/felix/rsa/TestRSAListener.java
+++ b/itests/felix/src/test/java/org/apache/aries/rsa/itests/felix/rsa/TestRSAListener.java
@@ -57,7 +57,7 @@
          rsaCore(), //
          rsaProviderFastBin(), //
          echoTcpService(), //
-         configFastBinPort("2545"),
+         configFastBinFreePort()
         };
     }
 
diff --git a/parent/pom.xml b/parent/pom.xml
index 37887e8..d329371 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -35,13 +35,13 @@
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <baseline>1.9.0</baseline>
         <baseline.skip>true</baseline.skip>
-        <zookeeper.version>3.4.13</zookeeper.version>
+        <zookeeper.version>3.4.14</zookeeper.version>
         <rsa.version>1.0.0</rsa.version>
         <slf4j.version>1.7.14</slf4j.version>
         <log4j.version>1.2.6</log4j.version>
         <hawtdispatch.version>1.21</hawtdispatch.version>
         <hawtbuf.version>1.11</hawtbuf.version>
-        <exam.version>4.12.0</exam.version>
+        <exam.version>4.13.0</exam.version>
         <cxf.resources.base.path />
         <cxf.checkstyle.extension />
     </properties>
diff --git a/rsa/src/main/java/org/apache/aries/rsa/core/RemoteServiceAdminFactory.java b/rsa/src/main/java/org/apache/aries/rsa/core/RemoteServiceAdminFactory.java
index 92c189b..ef64adf 100644
--- a/rsa/src/main/java/org/apache/aries/rsa/core/RemoteServiceAdminFactory.java
+++ b/rsa/src/main/java/org/apache/aries/rsa/core/RemoteServiceAdminFactory.java
@@ -46,6 +46,6 @@
                                           RemoteServiceAdmin serviceObject) {
         LOG.debug("RemoteServiceAdmin ServiceInstance removed for Bundle {}", b.getSymbolicName());
         instances--;
-        ((RemoteServiceAdminInstance)serviceObject).close(instances == 0);
+        ((RemoteServiceAdminInstance)serviceObject).close(b, instances == 0);
     }
 }
diff --git a/rsa/src/main/java/org/apache/aries/rsa/core/RemoteServiceAdminInstance.java b/rsa/src/main/java/org/apache/aries/rsa/core/RemoteServiceAdminInstance.java
index 7158f52..a5e8135 100644
--- a/rsa/src/main/java/org/apache/aries/rsa/core/RemoteServiceAdminInstance.java
+++ b/rsa/src/main/java/org/apache/aries/rsa/core/RemoteServiceAdminInstance.java
@@ -25,6 +25,7 @@
 import java.util.List;
 import java.util.Map;
 
+import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceReference;
@@ -78,9 +79,9 @@
         });
     }
 
-    public void close(boolean closeAll) {
+    public void close(Bundle bundle, boolean closeAll) {
         closed = true;
-        rsaCore.removeExportRegistrations(bctx.getBundle());
+        rsaCore.removeExportRegistrations(bundle);
         if (closeAll) {
             rsaCore.close();
         }
diff --git a/rsa/src/main/java/org/apache/aries/rsa/core/event/EventAdminSender.java b/rsa/src/main/java/org/apache/aries/rsa/core/event/EventAdminSender.java
index d36ae45..22974ba 100644
--- a/rsa/src/main/java/org/apache/aries/rsa/core/event/EventAdminSender.java
+++ b/rsa/src/main/java/org/apache/aries/rsa/core/event/EventAdminSender.java
@@ -23,11 +23,13 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.event.Event;
 import org.osgi.service.event.EventAdmin;
 import org.osgi.service.remoteserviceadmin.EndpointDescription;
+import org.osgi.service.remoteserviceadmin.ImportReference;
 import org.osgi.service.remoteserviceadmin.RemoteServiceAdminEvent;
 
 public class EventAdminSender {
@@ -67,15 +69,17 @@
     private Event toEvent(RemoteServiceAdminEvent rsaEvent) {
         String topic = getTopic(rsaEvent);
         Map<String, Object> props = new HashMap<>();
-        props.put("bundle", rsaEvent.getSource());
-        props.put("bundle.id", rsaEvent.getSource().getBundleId());
-        props.put("bundle.symbolicname", rsaEvent.getSource().getSymbolicName());
-        props.put("bundle.version", rsaEvent.getSource().getVersion());
+        Bundle bundle = rsaEvent.getSource();
+        props.put("bundle", bundle);
+        props.put("bundle.id", bundle.getBundleId());
+        props.put("bundle.symbolicname", bundle.getSymbolicName());
+        props.put("bundle.version", bundle.getVersion());
         props.put("bundle.signer", ""); // TODO What to put here
-        if (rsaEvent.getException() != null) {
-            props.put("exception", rsaEvent.getException());
-            props.put("exception.class", rsaEvent.getException().getClass());
-            props.put("exception.class", rsaEvent.getException().getMessage());
+        Throwable exception = rsaEvent.getException();
+        if (exception != null) {
+            props.put("exception", exception);
+            props.put("exception.class", exception.getClass().getName());
+            props.put("exception.message", exception.getMessage());
         }
         if (rsaEvent.getExportReference() != null) {
             EndpointDescription endpoint = rsaEvent.getExportReference().getExportedEndpoint();
@@ -83,8 +87,9 @@
             props.put("endpoint.id", endpoint.getId());
             props.put("objectClass", endpoint.getInterfaces());
         }
-        if (rsaEvent.getImportReference() != null && rsaEvent.getImportReference().getImportedEndpoint() != null) {
-            props.put("service.imported.configs", rsaEvent.getImportReference().getImportedEndpoint().getConfigurationTypes());
+        ImportReference importReference = rsaEvent.getImportReference();
+        if (importReference != null && importReference.getImportedEndpoint() != null) {
+            props.put("service.imported.configs", importReference.getImportedEndpoint().getConfigurationTypes());
         }
         props.put("timestamp", System.currentTimeMillis());
         props.put("event", rsaEvent);