summaryrefslogtreecommitdiffstats
path: root/sandbox/sebastien/java/embed/modules/host-rmi/src
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--sandbox/sebastien/java/embed/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi/DefaultRMIHost.java177
-rw-r--r--sandbox/sebastien/java/embed/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi/DefaultRMIHostExtensionPoint.java67
-rw-r--r--sandbox/sebastien/java/embed/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi/ExtensibleRMIHost.java62
-rw-r--r--sandbox/sebastien/java/embed/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi/RMIHost.java61
-rw-r--r--sandbox/sebastien/java/embed/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi/RMIHostException.java45
-rw-r--r--sandbox/sebastien/java/embed/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi/RMIHostExtensionPoint.java51
-rw-r--r--sandbox/sebastien/java/embed/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi/RMIHostRuntimeException.java46
-rw-r--r--sandbox/sebastien/java/embed/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi/RMISocketFactoryImpl.java57
-rw-r--r--sandbox/sebastien/java/embed/modules/host-rmi/src/main/resources/META-INF/services/org.apache.tuscany.sca.host.rmi.RMIHostExtensionPoint19
-rw-r--r--sandbox/sebastien/java/embed/modules/host-rmi/src/test/java/org/apache/tuscany/sca/host/rmi/RMIHostImplTestCase.java90
10 files changed, 675 insertions, 0 deletions
diff --git a/sandbox/sebastien/java/embed/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi/DefaultRMIHost.java b/sandbox/sebastien/java/embed/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi/DefaultRMIHost.java
new file mode 100644
index 0000000000..dade6ef7f3
--- /dev/null
+++ b/sandbox/sebastien/java/embed/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi/DefaultRMIHost.java
@@ -0,0 +1,177 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tuscany.sca.host.rmi;
+
+import java.net.InetAddress;
+import java.net.URI;
+import java.net.UnknownHostException;
+import java.rmi.AlreadyBoundException;
+import java.rmi.NoSuchObjectException;
+import java.rmi.NotBoundException;
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import java.rmi.registry.LocateRegistry;
+import java.rmi.registry.Registry;
+import java.rmi.server.RMISocketFactory;
+import java.rmi.server.UnicastRemoteObject;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.logging.Logger;
+
+
+/**
+ * Default implementation of a RMI host.
+ *
+ * @version $Rev$ $Date$
+ */
+public class DefaultRMIHost implements RMIHost {
+ private final static Logger logger = Logger.getLogger(DefaultRMIHost.class.getName());
+ private static final int CONNECTION_TIMEOUT = 3000; // 3 seconds
+
+ // Map of RMI registries started and running
+ private Map<String, Registry> rmiRegistries;
+
+ private RMISocketFactory socketFactory;
+
+ public DefaultRMIHost() {
+ rmiRegistries = new ConcurrentHashMap<String, Registry>();
+ this.socketFactory = new RMISocketFactoryImpl(CONNECTION_TIMEOUT);
+ }
+
+ public String registerService(String uri, Remote serviceObject) throws RMIHostException, RMIHostRuntimeException {
+ RMIURI rmiURI = new RMIURI(uri);
+
+ Registry registry;
+ try {
+ registry = rmiRegistries.get(Integer.toString(rmiURI.port));
+ if (registry == null) {
+ try {
+ registry = LocateRegistry.createRegistry(rmiURI.port, socketFactory, socketFactory);
+ } catch (RemoteException e) {
+ registry = LocateRegistry.getRegistry(null, rmiURI.port, socketFactory);
+ }
+ rmiRegistries.put(Integer.toString(rmiURI.port), registry);
+ }
+ registry.bind(rmiURI.serviceName, serviceObject);
+ logger.info("RMI service registered: " + rmiURI);
+ return rmiURI.toString();
+ } catch (AlreadyBoundException e) {
+ throw new RMIHostException(e);
+ } catch (RemoteException e) {
+ RMIHostRuntimeException rmiExec = new RMIHostRuntimeException(e.getMessage());
+ rmiExec.setStackTrace(e.getStackTrace());
+ throw rmiExec;
+ }
+
+ }
+
+ public void unregisterService(String uri) throws RMIHostException, RMIHostRuntimeException {
+ RMIURI rmiURI = new RMIURI(uri);
+
+ try {
+ Registry registry = rmiRegistries.get(Integer.toString(rmiURI.port));
+ if (registry == null) {
+ registry = LocateRegistry.getRegistry(null, rmiURI.port, socketFactory);
+ rmiRegistries.put(Integer.toString(rmiURI.port), registry);
+ }
+ registry.unbind(rmiURI.serviceName);
+ logger.info("RMI service unregistered: " + rmiURI);
+ } catch (RemoteException e) {
+ RMIHostRuntimeException rmiExec = new RMIHostRuntimeException(e.getMessage());
+ rmiExec.setStackTrace(e.getStackTrace());
+ throw rmiExec;
+ } catch (NotBoundException e) {
+ throw new RMIHostException(e.getMessage());
+ }
+ }
+
+ public Remote findService(String uri) throws RMIHostException, RMIHostRuntimeException {
+ RMIURI rmiURI = new RMIURI(uri);
+
+ Remote remoteService = null;
+ try {
+ // Requires permission java.net.SocketPermission "host:port", "connect,accept,resolve"
+ // in security policy.
+ Registry registry = LocateRegistry.getRegistry(rmiURI.host, rmiURI.port, socketFactory);
+
+ if (registry != null) {
+ remoteService = registry.lookup(rmiURI.serviceName);
+ }
+ } catch (RemoteException e) {
+ RMIHostRuntimeException rmiExec = new RMIHostRuntimeException(e.getMessage());
+ rmiExec.setStackTrace(e.getStackTrace());
+ throw rmiExec;
+ } catch (NotBoundException e) {
+ throw new RMIHostException(e.getMessage());
+ }
+ return remoteService;
+ }
+
+ /**
+ * A representation of an RMI URI.
+ *
+ * rmi://[host][:port][/[object]]
+ * rmi:[/][object]
+ */
+ private static class RMIURI {
+ private String uriStr;
+ private String host;
+ private int port;
+ private String serviceName;
+
+ private RMIURI(String uriStr) {
+ URI uri = URI.create(uriStr);
+ host = uri.getHost();
+ if (host == null) {
+ try {
+ host = InetAddress.getLocalHost().getHostName();
+ } catch (UnknownHostException e) {
+ host = "localhost";
+ }
+ }
+ port = uri.getPort();
+ if (port <= 0) {
+ port = RMI_DEFAULT_PORT;
+ }
+ String path = uri.getPath();
+ if (path != null && path.charAt(0) == '/') {
+ path = path.substring(1);
+ }
+ serviceName = path;
+ this.uriStr = "rmi://" + host + ":" + port + "/" + serviceName;
+ }
+
+ public String toString() {
+ return uriStr;
+ }
+ }
+
+ public void stop() {
+ for (Registry registry : rmiRegistries.values()) {
+ try {
+ UnicastRemoteObject.unexportObject(registry, false);
+ } catch (NoSuchObjectException e) {
+ e.printStackTrace();
+ }
+ }
+ rmiRegistries.clear();
+ }
+
+}
diff --git a/sandbox/sebastien/java/embed/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi/DefaultRMIHostExtensionPoint.java b/sandbox/sebastien/java/embed/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi/DefaultRMIHostExtensionPoint.java
new file mode 100644
index 0000000000..541ee8ba06
--- /dev/null
+++ b/sandbox/sebastien/java/embed/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi/DefaultRMIHostExtensionPoint.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tuscany.sca.host.rmi;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.tuscany.sca.core.LifeCycleListener;
+
+/**
+ * Default implementation of an RMI host extension point.
+ *
+ * @version $Rev$ $Date$
+ */
+public class DefaultRMIHostExtensionPoint implements RMIHostExtensionPoint, LifeCycleListener {
+
+ private List<RMIHost> rmiHosts = new ArrayList<RMIHost>();
+
+ public DefaultRMIHostExtensionPoint() {
+ }
+
+ public void addRMIHost(RMIHost rmiHost) {
+ rmiHosts.add(rmiHost);
+ if(rmiHost instanceof LifeCycleListener) {
+ ((LifeCycleListener) rmiHost).start();
+ }
+ }
+
+ public void removeRMIHost(RMIHost rmiHost) {
+ rmiHosts.remove(rmiHost);
+ }
+
+ public synchronized List<RMIHost> getRMIHosts() {
+ if(rmiHosts.isEmpty()) {
+ addRMIHost(new DefaultRMIHost());
+ }
+ return rmiHosts;
+ }
+
+ public void start() {
+ }
+
+ public void stop() {
+ for (RMIHost host : rmiHosts) {
+ if(host instanceof LifeCycleListener) {
+ ((LifeCycleListener) host).stop();
+ }
+ }
+ }
+}
diff --git a/sandbox/sebastien/java/embed/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi/ExtensibleRMIHost.java b/sandbox/sebastien/java/embed/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi/ExtensibleRMIHost.java
new file mode 100644
index 0000000000..d1936518ca
--- /dev/null
+++ b/sandbox/sebastien/java/embed/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi/ExtensibleRMIHost.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tuscany.sca.host.rmi;
+
+import java.rmi.Remote;
+
+
+/**
+ * Default implementation of an extensible RMI host.
+ *
+ * @version $Rev$ $Date$
+ */
+public class ExtensibleRMIHost implements RMIHost {
+
+ private RMIHostExtensionPoint rmiHosts;
+
+ public ExtensibleRMIHost(RMIHostExtensionPoint rmiHosts) {
+ this.rmiHosts = rmiHosts;
+ }
+
+ public String registerService(String uri, Remote serviceObject) throws RMIHostException, RMIHostRuntimeException {
+ if (rmiHosts.getRMIHosts().isEmpty()) {
+ throw new RMIHostException("No RMI host is available");
+ }
+ return getDefaultHost().registerService(uri, serviceObject);
+ }
+
+ public void unregisterService(String uri) throws RMIHostException, RMIHostRuntimeException {
+ if (rmiHosts.getRMIHosts().isEmpty()) {
+ throw new RMIHostException("No RMI host is available");
+ }
+ getDefaultHost().unregisterService(uri);
+ }
+
+ public Remote findService(String uri) throws RMIHostException, RMIHostRuntimeException {
+ if (rmiHosts.getRMIHosts().isEmpty()) {
+ throw new RMIHostException("No RMI host available");
+ }
+ return getDefaultHost().findService(uri);
+ }
+
+ protected RMIHost getDefaultHost() {
+ return rmiHosts.getRMIHosts().get(0);
+ }
+}
diff --git a/sandbox/sebastien/java/embed/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi/RMIHost.java b/sandbox/sebastien/java/embed/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi/RMIHost.java
new file mode 100644
index 0000000000..df3f074168
--- /dev/null
+++ b/sandbox/sebastien/java/embed/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi/RMIHost.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tuscany.sca.host.rmi;
+
+import java.rmi.Remote;
+
+/**
+ * RMI Service hosting interface to be implemented by host environments that allows SCA Components
+ * to register RMI Services to handle inbound service requests over RMI to SCA Components
+ *
+ * @version $Rev$ $Date$
+ */
+public interface RMIHost {
+ int RMI_DEFAULT_PORT = 1099;
+
+ /**
+ * Register an RMI service with the given name and port
+ *
+ * @param uri the URI against which the server is to be registered
+ * @param serviceObject the server object to be registered
+ * @return TODO
+ * @throws RMIHostException
+ * @throws RMIHostRuntimeException
+ */
+ String registerService(String uri, Remote serviceObject) throws RMIHostException, RMIHostRuntimeException;
+
+ /**
+ * Unregister a service registered under the given service name and port number
+ *
+ * @param uri the URI of the server
+ * @throws RMIHostException
+ * @throws RMIHostRuntimeException
+ */
+ void unregisterService(String uri) throws RMIHostException, RMIHostRuntimeException;
+
+ /**
+ * find a remote service hosted on the given host, port and service name
+ *
+ * @param uri the URI of the service
+ * @return the RMI server object
+ * @throws RMIHostException
+ * @throws RMIHostRuntimeException
+ */
+ Remote findService(String uri) throws RMIHostException, RMIHostRuntimeException;
+}
diff --git a/sandbox/sebastien/java/embed/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi/RMIHostException.java b/sandbox/sebastien/java/embed/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi/RMIHostException.java
new file mode 100644
index 0000000000..5ea46b9e0b
--- /dev/null
+++ b/sandbox/sebastien/java/embed/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi/RMIHostException.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tuscany.sca.host.rmi;
+
+
+/**
+ * This exception will relate to situations where the end applicaition's input is the cause of the exception
+ *
+ * @version $Rev$ $Date$
+ */
+public class RMIHostException extends RuntimeException {
+
+ private static final long serialVersionUID = 3378300080918544410L;
+
+ public RMIHostException() {
+ }
+
+ public RMIHostException(String message) {
+ super(message);
+ }
+
+ public RMIHostException(Throwable e) {
+ super(e);
+ }
+
+ public RMIHostException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
diff --git a/sandbox/sebastien/java/embed/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi/RMIHostExtensionPoint.java b/sandbox/sebastien/java/embed/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi/RMIHostExtensionPoint.java
new file mode 100644
index 0000000000..40d6013940
--- /dev/null
+++ b/sandbox/sebastien/java/embed/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi/RMIHostExtensionPoint.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tuscany.sca.host.rmi;
+
+import java.util.List;
+
+/**
+ * An extension point for RMI hosts.
+ *
+ * @version $Rev$ $Date$
+ */
+public interface RMIHostExtensionPoint {
+
+ /**
+ * Adds a Servlet host extension.
+ *
+ * @param rmiHost
+ */
+ void addRMIHost(RMIHost rmiHost);
+
+ /**
+ * Removes a Servlet host extension.
+ *
+ * @param rmiHost
+ */
+ void removeRMIHost(RMIHost rmiHost);
+
+ /**
+ * Returns a list of Servlet host extensions.
+ *
+ * @return
+ */
+ List<RMIHost> getRMIHosts();
+
+}
diff --git a/sandbox/sebastien/java/embed/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi/RMIHostRuntimeException.java b/sandbox/sebastien/java/embed/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi/RMIHostRuntimeException.java
new file mode 100644
index 0000000000..dfbcc62939
--- /dev/null
+++ b/sandbox/sebastien/java/embed/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi/RMIHostRuntimeException.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tuscany.sca.host.rmi;
+
+
+/**
+ * This exception relates to cases where there is a problem with the
+ * Host runtime
+ *
+ * @version $Rev$ $Date$
+ */
+public class RMIHostRuntimeException extends RuntimeException {
+
+ private static final long serialVersionUID = -2639598547028423686L;
+
+ public RMIHostRuntimeException() {
+ }
+
+ public RMIHostRuntimeException(String message) {
+ super(message);
+ }
+
+ public RMIHostRuntimeException(Throwable e) {
+ super(e);
+ }
+
+ public RMIHostRuntimeException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
diff --git a/sandbox/sebastien/java/embed/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi/RMISocketFactoryImpl.java b/sandbox/sebastien/java/embed/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi/RMISocketFactoryImpl.java
new file mode 100644
index 0000000000..763e5c1315
--- /dev/null
+++ b/sandbox/sebastien/java/embed/modules/host-rmi/src/main/java/org/apache/tuscany/sca/host/rmi/RMISocketFactoryImpl.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tuscany.sca.host.rmi;
+
+import java.io.IOException;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.rmi.server.RMISocketFactory;
+
+import javax.net.ServerSocketFactory;
+import javax.net.SocketFactory;
+
+class RMISocketFactoryImpl extends RMISocketFactory {
+ private int clientTimeout;
+ private SocketFactory factory;
+ private ServerSocketFactory serverSocketFactory;
+
+ /**
+ * @param timeout
+ */
+ public RMISocketFactoryImpl(int clientTimeout) {
+ super();
+ this.clientTimeout = clientTimeout;
+ this.factory = SocketFactory.getDefault();
+ this.serverSocketFactory = ServerSocketFactory.getDefault();
+ }
+
+ public Socket createSocket(String host, int port) throws IOException {
+ Socket socket = factory.createSocket(host, port);
+ socket.setSoTimeout(clientTimeout);
+ return socket;
+ }
+
+ @Override
+ public ServerSocket createServerSocket(int port) throws IOException {
+ ServerSocket socket = serverSocketFactory.createServerSocket(port);
+ return socket;
+ }
+
+}
diff --git a/sandbox/sebastien/java/embed/modules/host-rmi/src/main/resources/META-INF/services/org.apache.tuscany.sca.host.rmi.RMIHostExtensionPoint b/sandbox/sebastien/java/embed/modules/host-rmi/src/main/resources/META-INF/services/org.apache.tuscany.sca.host.rmi.RMIHostExtensionPoint
new file mode 100644
index 0000000000..e7f8d54489
--- /dev/null
+++ b/sandbox/sebastien/java/embed/modules/host-rmi/src/main/resources/META-INF/services/org.apache.tuscany.sca.host.rmi.RMIHostExtensionPoint
@@ -0,0 +1,19 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+org.apache.tuscany.sca.host.rmi.DefaultRMIHostExtensionPoint
+
diff --git a/sandbox/sebastien/java/embed/modules/host-rmi/src/test/java/org/apache/tuscany/sca/host/rmi/RMIHostImplTestCase.java b/sandbox/sebastien/java/embed/modules/host-rmi/src/test/java/org/apache/tuscany/sca/host/rmi/RMIHostImplTestCase.java
new file mode 100644
index 0000000000..1164c33a16
--- /dev/null
+++ b/sandbox/sebastien/java/embed/modules/host-rmi/src/test/java/org/apache/tuscany/sca/host/rmi/RMIHostImplTestCase.java
@@ -0,0 +1,90 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tuscany.sca.host.rmi;
+
+import java.io.Serializable;
+import java.rmi.Remote;
+
+import junit.framework.TestCase;
+
+/**
+ * Test cases for the RMI Host.
+ *
+ * @version $Rev$ $Date$
+ */
+public class RMIHostImplTestCase extends TestCase {
+
+ public void testInit() {
+ new DefaultRMIHost();
+ }
+
+ public void testFindServiceBadHost() throws RMIHostRuntimeException, RMIHostException {
+ try {
+ new DefaultRMIHost().findService("rmi://locahost:9994/$BAD$");
+ fail();
+ } catch (RMIHostRuntimeException e) {
+ // expected
+ }
+ }
+
+ public void testRegisterService1() throws RMIHostRuntimeException, RMIHostException {
+ DefaultRMIHost host = new DefaultRMIHost();
+ host.registerService("rmi://localhost:9996/foo1", new MockRemote());
+ host.unregisterService("rmi://localhost:9996/foo1");
+ }
+
+ public void testExistingRegistry() throws RMIHostRuntimeException, RMIHostException {
+ DefaultRMIHost host1 = new DefaultRMIHost();
+ host1.registerService("rmi://localhost:9995/foo1", new MockRemote());
+ DefaultRMIHost host2 = new DefaultRMIHost();
+ host2.registerService("rmi://localhost:9995/foo2", new MockRemote());
+ host2.unregisterService("rmi://localhost:9995/foo1");
+ host2.unregisterService("rmi://localhost:9995/foo2");
+ }
+
+ public void testRegisterService2() throws RMIHostRuntimeException, RMIHostException {
+ DefaultRMIHost host = new DefaultRMIHost();
+ host.registerService("rmi://localhost:9999/bar1", new MockRemote());
+ host.unregisterService("rmi://localhost:9999/bar1");
+ }
+
+ public void testRegisterServiceAlreadyBound() throws RMIHostRuntimeException, RMIHostException {
+ DefaultRMIHost host = new DefaultRMIHost();
+ host.registerService("rmi://localhost:9997/bar2", new MockRemote());
+ try {
+ host.registerService("rmi://localhost:9997/bar2", new MockRemote());
+ } catch (RMIHostException e) {
+ // expected
+ host.unregisterService("rmi://localhost:9997/bar2");
+ }
+ }
+
+ public void testUnRegisterService() throws RMIHostRuntimeException, RMIHostException {
+ DefaultRMIHost host = new DefaultRMIHost();
+ try {
+ host.unregisterService("rmi://localhost:9998/bar3");
+ fail();
+ } catch (RMIHostRuntimeException e) {
+ // expected
+ }
+ }
+
+ private static class MockRemote implements Remote, Serializable {
+ }
+}