summaryrefslogtreecommitdiffstats
path: root/sca-java-2.x/tags/2.0.1-RC1/modules/host-corba/src/main/java/org/apache/tuscany/sca
diff options
context:
space:
mode:
Diffstat (limited to 'sca-java-2.x/tags/2.0.1-RC1/modules/host-corba/src/main/java/org/apache/tuscany/sca')
-rw-r--r--sca-java-2.x/tags/2.0.1-RC1/modules/host-corba/src/main/java/org/apache/tuscany/sca/host/corba/CorbaHost.java56
-rw-r--r--sca-java-2.x/tags/2.0.1-RC1/modules/host-corba/src/main/java/org/apache/tuscany/sca/host/corba/CorbaHostException.java47
-rw-r--r--sca-java-2.x/tags/2.0.1-RC1/modules/host-corba/src/main/java/org/apache/tuscany/sca/host/corba/CorbaHostExtensionPoint.java51
-rw-r--r--sca-java-2.x/tags/2.0.1-RC1/modules/host-corba/src/main/java/org/apache/tuscany/sca/host/corba/CorbaHostUtils.java61
-rw-r--r--sca-java-2.x/tags/2.0.1-RC1/modules/host-corba/src/main/java/org/apache/tuscany/sca/host/corba/CorbanameURL.java202
-rw-r--r--sca-java-2.x/tags/2.0.1-RC1/modules/host-corba/src/main/java/org/apache/tuscany/sca/host/corba/DefaultCorbaHostExtensionPoint.java80
-rw-r--r--sca-java-2.x/tags/2.0.1-RC1/modules/host-corba/src/main/java/org/apache/tuscany/sca/host/corba/ExtensibleCorbaHost.java62
-rwxr-xr-xsca-java-2.x/tags/2.0.1-RC1/modules/host-corba/src/main/java/org/apache/tuscany/sca/host/corba/SocketUtil.java226
8 files changed, 785 insertions, 0 deletions
diff --git a/sca-java-2.x/tags/2.0.1-RC1/modules/host-corba/src/main/java/org/apache/tuscany/sca/host/corba/CorbaHost.java b/sca-java-2.x/tags/2.0.1-RC1/modules/host-corba/src/main/java/org/apache/tuscany/sca/host/corba/CorbaHost.java
new file mode 100644
index 0000000000..eb49f3f841
--- /dev/null
+++ b/sca-java-2.x/tags/2.0.1-RC1/modules/host-corba/src/main/java/org/apache/tuscany/sca/host/corba/CorbaHost.java
@@ -0,0 +1,56 @@
+/*
+ * 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.corba;
+
+import org.omg.CORBA.Object;
+
+/**
+ * @version $Rev$ $Date$
+ * CORBA Service hosting interface
+ */
+public interface CorbaHost {
+
+ /**
+ * Registers servant in name server.
+ *
+ * @param uri corbaname URI
+ * @param serviceObject
+ * @throws CorbaHostException
+ */
+ void registerServant(String uri, Object serviceObject) throws CorbaHostException;
+
+ /**
+ * Removes servant from name server
+ *
+ * @param orb The ORB instance
+ * @param name binding name
+ * @throws CorbaHostException
+ */
+ void unregisterServant(String uri) throws CorbaHostException;
+
+ /**
+ * Gets reference to object
+ *
+ * @param name binding name
+ * @return objects reference
+ * @throws CorbaHostException
+ */
+ Object lookup(String uri) throws CorbaHostException;
+}
diff --git a/sca-java-2.x/tags/2.0.1-RC1/modules/host-corba/src/main/java/org/apache/tuscany/sca/host/corba/CorbaHostException.java b/sca-java-2.x/tags/2.0.1-RC1/modules/host-corba/src/main/java/org/apache/tuscany/sca/host/corba/CorbaHostException.java
new file mode 100644
index 0000000000..049bfdb6cd
--- /dev/null
+++ b/sca-java-2.x/tags/2.0.1-RC1/modules/host-corba/src/main/java/org/apache/tuscany/sca/host/corba/CorbaHostException.java
@@ -0,0 +1,47 @@
+/*
+ * 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.corba;
+
+/**
+ * @version $Rev$ $Date$
+ * General exception for corba hosts operations
+ */
+public class CorbaHostException extends Exception {
+
+ private static final long serialVersionUID = 1L;
+
+ public static final String BINDING_IN_USE = "Binding name is already in use";
+ public static final String NO_SUCH_OBJECT = "There is no object under given location";
+ public static final String NO_SUCH_HOST = "Couldn't find specified host";
+ public static final String NO_SUCH_PORT = "Couldn't connect to specified port";
+ public static final String WRONG_NAME = "Characters used in binding name are illegal";
+
+ public CorbaHostException(String message) {
+ super(message);
+ }
+
+ public CorbaHostException(Exception cause) {
+ super(cause);
+ }
+
+ public CorbaHostException(String message, Exception cause) {
+ super(message, cause);
+ }
+}
diff --git a/sca-java-2.x/tags/2.0.1-RC1/modules/host-corba/src/main/java/org/apache/tuscany/sca/host/corba/CorbaHostExtensionPoint.java b/sca-java-2.x/tags/2.0.1-RC1/modules/host-corba/src/main/java/org/apache/tuscany/sca/host/corba/CorbaHostExtensionPoint.java
new file mode 100644
index 0000000000..067b9193c5
--- /dev/null
+++ b/sca-java-2.x/tags/2.0.1-RC1/modules/host-corba/src/main/java/org/apache/tuscany/sca/host/corba/CorbaHostExtensionPoint.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.corba;
+
+import java.util.List;
+
+/**
+ * @version $Rev$ $Date$
+ * An extension point for CORBA hostst
+ */
+public interface CorbaHostExtensionPoint {
+
+ /**
+ * Removes CORBA host extension
+ *
+ * @param corbaHost
+ */
+ void addCorbaHost(CorbaHost corbaHost);
+
+ /**
+ * Removes CORBA host extension
+ *
+ * @param corbaHost
+ */
+ void removeCorbaHost(CorbaHost corbaHost);
+
+ /**
+ * Gets all CORBA host extensions
+ *
+ * @return
+ */
+ List<CorbaHost> getCorbaHosts();
+
+}
diff --git a/sca-java-2.x/tags/2.0.1-RC1/modules/host-corba/src/main/java/org/apache/tuscany/sca/host/corba/CorbaHostUtils.java b/sca-java-2.x/tags/2.0.1-RC1/modules/host-corba/src/main/java/org/apache/tuscany/sca/host/corba/CorbaHostUtils.java
new file mode 100644
index 0000000000..b90fe9c78b
--- /dev/null
+++ b/sca-java-2.x/tags/2.0.1-RC1/modules/host-corba/src/main/java/org/apache/tuscany/sca/host/corba/CorbaHostUtils.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.corba;
+
+
+/**
+ * @version $Rev$ $Date$
+ * Various utilities for host-corba
+ */
+public class CorbaHostUtils {
+
+ /**
+ * Tests if given URI is valid corbaname string
+ * @param uri
+ * @return
+ */
+ public static boolean isValidCorbanameURI(String uri) {
+ return uri != null && uri.startsWith("corbaname:") && uri.contains("#") && uri.indexOf('#') < uri.length() - 1;
+ }
+
+ /**
+ * Creates corbaname URI basing on given parameters
+ * @param host
+ * @param port
+ * @param name
+ *
+ * @return
+ */
+ public static String createCorbanameURI(String host, int port, String name) {
+ return new CorbanameURL(host, port, name).toString();
+ }
+
+ /**
+ * Translates corbaname URI to CorbanameDetails instances
+ *
+ * @param uri
+ * @return
+ */
+ public static CorbanameURL getServiceDetails(String uri) {
+ CorbanameURL details = new CorbanameURL(uri);
+ return details;
+ }
+
+}
diff --git a/sca-java-2.x/tags/2.0.1-RC1/modules/host-corba/src/main/java/org/apache/tuscany/sca/host/corba/CorbanameURL.java b/sca-java-2.x/tags/2.0.1-RC1/modules/host-corba/src/main/java/org/apache/tuscany/sca/host/corba/CorbanameURL.java
new file mode 100644
index 0000000000..a380fd6d79
--- /dev/null
+++ b/sca-java-2.x/tags/2.0.1-RC1/modules/host-corba/src/main/java/org/apache/tuscany/sca/host/corba/CorbanameURL.java
@@ -0,0 +1,202 @@
+/*
+ * 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.corba;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * @version $Rev$ $Date$
+ * Holds corbaname URI details
+ */
+public class CorbanameURL {
+ public static String DEFAULT_PROTOCOL = "iiop";
+ public static String DEFAULT_VERSION = "";
+ public static String DEFAULT_NAME_SERVICE = "NameService";
+ public static String DEFAULT_HOST = "localhost";
+ public static int DEFAULT_PORT = 2809;
+
+ private String protocol = "";
+ private String version = "";
+ private String host;
+ private int port;
+ private String nameService;
+ private List<String> namePath;
+
+ public CorbanameURL(String host, int port, String namePath, String nameService) {
+ super();
+ this.host = host == null ? DEFAULT_HOST : host;
+ this.port = port <= 0 ? DEFAULT_PORT : port;
+ this.namePath = parseName(namePath);
+ this.nameService = nameService == null ? DEFAULT_NAME_SERVICE : nameService;
+ }
+
+ public CorbanameURL(String host, int port, String namePath) {
+ this(host, port, namePath, DEFAULT_NAME_SERVICE);
+ }
+
+ public CorbanameURL(String url) {
+ if (url == null || (!url.startsWith("corbaname"))) {
+ throw new IllegalArgumentException("Malformed corbaname URL: " + url);
+ }
+ try {
+ url = URLDecoder.decode(url, "UTF-8");
+ } catch (UnsupportedEncodingException e) {
+ throw new IllegalArgumentException(e);
+ }
+ String[] parts = url.split("#");
+ if (parts.length == 2) {
+ String serviceLocation = parts[0];
+ String servicePath = parts[1];
+ namePath = parseName(servicePath);
+
+ parts = serviceLocation.split("/");
+ if (parts.length == 2) {
+ nameService = parts[1];
+ } else {
+ nameService = DEFAULT_NAME_SERVICE;
+ }
+
+ parts = parts[0].split(":");
+
+ if (parts.length >= 2) {
+ protocol = parts[1];
+ }
+ if (parts.length >= 3) {
+ version = parts[2];
+ String[] strs = version.split("@");
+ if (strs.length == 2) {
+ version = strs[0];
+ host = strs[1];
+ } else {
+ version = "";
+ host = strs[0];
+ }
+ }
+ if (host == null || "".equals(host)) {
+ host = DEFAULT_HOST;
+ }
+ if (parts.length >= 4 && !"".equals(parts[3])) {
+ port = Integer.parseInt(parts[3]);
+ } else {
+ port = DEFAULT_PORT;
+ }
+ } else {
+ throw new IllegalArgumentException("Malformed corbaname URL: " + url);
+ }
+ }
+
+ private static List<String> parseName(String name) {
+ try {
+ name = URLDecoder.decode(name, "UTF-8");
+ } catch (UnsupportedEncodingException e) {
+ throw new IllegalArgumentException(e);
+ }
+ String[] names = name.split("/");
+ return Arrays.asList(names);
+ }
+
+ public String getProtocol() {
+ return protocol;
+ }
+
+ public void setProtocol(String protocol) {
+ this.protocol = protocol;
+ }
+
+ public String getVersion() {
+ return version;
+ }
+
+ public void setVersion(String version) {
+ this.version = version;
+ }
+
+ public String getHost() {
+ return host;
+ }
+
+ public void setHost(String host) {
+ this.host = host;
+ }
+
+ public int getPort() {
+ return port;
+ }
+
+ public void setPort(int port) {
+ this.port = port;
+ }
+
+ public String getNameService() {
+ return nameService;
+ }
+
+ public void setNameService(String nameService) {
+ this.nameService = nameService;
+ }
+
+ public List<String> getNamePath() {
+ return namePath;
+ }
+
+ public String getName() {
+ if (namePath != null) {
+ StringBuffer buf = new StringBuffer();
+ for (int i = 0; i < namePath.size(); i++) {
+ buf.append(namePath.get(i));
+ if (i < namePath.size() - 1) {
+ buf.append("/");
+ }
+ }
+ return buf.toString();
+ }
+ return null;
+ }
+
+ public void setNamePath(List<String> namePath) {
+ this.namePath = namePath;
+ }
+
+ @Override
+ public String toString() {
+ StringBuffer buf = new StringBuffer();
+ buf.append("corbaname:");
+ buf.append(protocol).append(":");
+ if (version != null && !"".equals(version)) {
+ buf.append(version).append("@");
+ }
+ buf.append(host).append(":").append(port);
+ buf.append("/").append(nameService);
+ buf.append("#");
+ if (namePath != null) {
+ for (int i = 0; i < namePath.size(); i++) {
+ buf.append(namePath.get(i));
+ if (i < namePath.size() - 1) {
+ buf.append("/");
+ }
+ }
+ }
+ return buf.toString();
+ }
+
+}
diff --git a/sca-java-2.x/tags/2.0.1-RC1/modules/host-corba/src/main/java/org/apache/tuscany/sca/host/corba/DefaultCorbaHostExtensionPoint.java b/sca-java-2.x/tags/2.0.1-RC1/modules/host-corba/src/main/java/org/apache/tuscany/sca/host/corba/DefaultCorbaHostExtensionPoint.java
new file mode 100644
index 0000000000..6ed7f3ea83
--- /dev/null
+++ b/sca-java-2.x/tags/2.0.1-RC1/modules/host-corba/src/main/java/org/apache/tuscany/sca/host/corba/DefaultCorbaHostExtensionPoint.java
@@ -0,0 +1,80 @@
+/*
+ * 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.corba;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.tuscany.sca.core.ExtensionPointRegistry;
+import org.apache.tuscany.sca.core.LifeCycleListener;
+import org.apache.tuscany.sca.extensibility.ServiceDeclaration;
+import org.apache.tuscany.sca.extensibility.ServiceHelper;
+import org.oasisopen.sca.ServiceRuntimeException;
+
+/**
+ * @version $Rev$ $Date$
+ * Default implementation of CorbaHostExtensionPoint
+ */
+public class DefaultCorbaHostExtensionPoint implements CorbaHostExtensionPoint, LifeCycleListener {
+ private ExtensionPointRegistry registry;
+ private boolean loaded;
+ private List<CorbaHost> corbaHosts = new ArrayList<CorbaHost>();
+
+ public DefaultCorbaHostExtensionPoint(ExtensionPointRegistry registry) {
+ this.registry = registry;
+ }
+
+ private synchronized void loadHosts() {
+ if (loaded) {
+ return;
+ }
+ try {
+ ServiceDeclaration sd = registry.getServiceDiscovery().getServiceDeclaration(CorbaHost.class);
+ CorbaHost host = ServiceHelper.newInstance(registry, sd);
+ ServiceHelper.start(host);
+ corbaHosts.add(host);
+ } catch (Throwable e) {
+ throw new ServiceRuntimeException(e);
+ }
+ }
+
+ public void addCorbaHost(CorbaHost host) {
+ corbaHosts.add(host);
+ }
+
+ public void removeCorbaHost(CorbaHost host) {
+ corbaHosts.remove(host);
+ }
+
+ public List<CorbaHost> getCorbaHosts() {
+ loadHosts();
+ return corbaHosts;
+ }
+
+ public void start() {
+ }
+
+ public void stop() {
+ ServiceHelper.stop(corbaHosts);
+ corbaHosts.clear();
+ loaded = false;
+ }
+
+}
diff --git a/sca-java-2.x/tags/2.0.1-RC1/modules/host-corba/src/main/java/org/apache/tuscany/sca/host/corba/ExtensibleCorbaHost.java b/sca-java-2.x/tags/2.0.1-RC1/modules/host-corba/src/main/java/org/apache/tuscany/sca/host/corba/ExtensibleCorbaHost.java
new file mode 100644
index 0000000000..644682e106
--- /dev/null
+++ b/sca-java-2.x/tags/2.0.1-RC1/modules/host-corba/src/main/java/org/apache/tuscany/sca/host/corba/ExtensibleCorbaHost.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.corba;
+
+import org.apache.tuscany.sca.core.ExtensionPointRegistry;
+import org.apache.tuscany.sca.core.UtilityExtensionPoint;
+import org.omg.CORBA.Object;
+
+/**
+ * @version $Rev$ $Date$
+ * Default implementation of extensible CORBA host
+ */
+public class ExtensibleCorbaHost implements CorbaHost {
+
+ private CorbaHostExtensionPoint hosts;
+
+ public ExtensibleCorbaHost(ExtensionPointRegistry registry) {
+ this.hosts = registry.getExtensionPoint(CorbaHostExtensionPoint.class);
+ }
+
+ public static ExtensibleCorbaHost getInstance(ExtensionPointRegistry registry) {
+ UtilityExtensionPoint utilityExtensionPoint = registry.getExtensionPoint(UtilityExtensionPoint.class);
+ return utilityExtensionPoint.getUtility(ExtensibleCorbaHost.class);
+ }
+
+ public Object lookup(String uri) throws CorbaHostException {
+ return getCorbaHost().lookup(uri);
+ }
+
+ public void registerServant(String uri, Object serviceObject) throws CorbaHostException {
+ getCorbaHost().registerServant(uri, serviceObject);
+ }
+
+ public void unregisterServant(String uri) throws CorbaHostException {
+ getCorbaHost().unregisterServant(uri);
+ }
+
+ protected CorbaHost getCorbaHost() throws CorbaHostException {
+ if (hosts.getCorbaHosts().isEmpty()) {
+ throw new CorbaHostException("No registered CORBA hosts");
+ }
+ return hosts.getCorbaHosts().get(0);
+ }
+
+}
diff --git a/sca-java-2.x/tags/2.0.1-RC1/modules/host-corba/src/main/java/org/apache/tuscany/sca/host/corba/SocketUtil.java b/sca-java-2.x/tags/2.0.1-RC1/modules/host-corba/src/main/java/org/apache/tuscany/sca/host/corba/SocketUtil.java
new file mode 100755
index 0000000000..6989b3ad06
--- /dev/null
+++ b/sca-java-2.x/tags/2.0.1-RC1/modules/host-corba/src/main/java/org/apache/tuscany/sca/host/corba/SocketUtil.java
@@ -0,0 +1,226 @@
+/*
+ * 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.corba;
+
+import java.net.InetAddress;
+import java.net.NetworkInterface;
+import java.net.UnknownHostException;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @version $Rev$ $Date$
+ * Class partially copied from eclipse wst project
+ * (http://repo1.maven.org/maven2/org/eclipse/wst/server/core/1.0.205-v20070829b/).
+ * Finally we should use jar from maven dependency. Problem described in
+ * http://www.fornax-platform.org/cp/display/fornax/2.+Hello+World+Tutorial+(CSC)?replyToComment=2098#comment-2098
+ * needs to be fixed.
+ */
+public class SocketUtil {
+
+ protected static final Object lock = new Object();
+
+ private static Set<String> localHostCache;
+ private static Set<String> notLocalHostCache = new HashSet<String>();
+ private static Map<String, CacheThread> threadMap = new HashMap<String, CacheThread>();
+
+ private static Set<InetAddress> addressCache;
+
+ static class CacheThread extends Thread {
+ private Set<InetAddress> currentAddresses;
+ private Set<String> addressList;
+ private String host;
+ private Set<String> nonAddressList;
+ private Map<String, CacheThread> threadMap2;
+
+ public CacheThread(String host,
+ Set<InetAddress> currentAddresses,
+ Set<String> addressList,
+ Set<String> nonAddressList,
+ Map<String, CacheThread> threadMap2) {
+ super("Caching localhost information");
+ this.host = host;
+ this.currentAddresses = currentAddresses;
+ this.addressList = addressList;
+ this.nonAddressList = nonAddressList;
+ this.threadMap2 = threadMap2;
+ }
+
+ public void run() {
+ if (currentAddresses != null) {
+ Iterator<InetAddress> iter2 = currentAddresses.iterator();
+ while (iter2.hasNext()) {
+ InetAddress addr = iter2.next();
+ String hostname = addr.getHostName();
+ String hostname2 = addr.getCanonicalHostName();
+ synchronized (lock) {
+ if (hostname != null && !addressList.contains(hostname))
+ addressList.add(hostname);
+ if (hostname2 != null && !addressList.contains(hostname2))
+ addressList.add(hostname2);
+ }
+ }
+ }
+
+ try {
+ InetAddress[] addrs = InetAddress.getAllByName(host);
+ int length = addrs.length;
+ for (int j = 0; j < length; j++) {
+ InetAddress addr = addrs[0];
+ String hostname = addr.getHostName();
+ String hostname2 = addr.getCanonicalHostName();
+ synchronized (lock) {
+ if (addr.isLoopbackAddress()) {
+ if (hostname != null && !addressList.contains(hostname))
+ addressList.add(hostname);
+ if (hostname2 != null && !addressList.contains(hostname2))
+ addressList.add(hostname2);
+ } else {
+ if (hostname != null && !nonAddressList.contains(hostname))
+ nonAddressList.add(hostname);
+ if (hostname2 != null && !nonAddressList.contains(hostname2))
+ nonAddressList.add(hostname2);
+ }
+ }
+ }
+ } catch (UnknownHostException e) {
+ synchronized (lock) {
+ if (host != null && !nonAddressList.contains(host))
+ nonAddressList.add(host);
+ }
+ }
+ synchronized (lock) {
+ threadMap2.remove(host);
+ }
+ }
+ }
+
+ public static boolean isLocalhost(final String host) {
+ if (host == null || host.equals(""))
+ return false;
+
+ if ("localhost".equals(host) || "127.0.0.1".equals(host))
+ return true;
+
+ // check simple cases
+ try {
+ InetAddress localHostaddr = InetAddress.getLocalHost();
+ if (localHostaddr.getHostName().equals(host) || host.equals(localHostaddr.getCanonicalHostName())
+ || localHostaddr.getHostAddress().equals(host))
+ return true;
+ } catch (Exception e) {
+
+ }
+
+ // check for current thread and wait if necessary
+ boolean currentThread = false;
+ try {
+ Thread t = null;
+ synchronized (lock) {
+ t = threadMap.get(host);
+ }
+ if (t != null && t.isAlive()) {
+ currentThread = true;
+ t.join(30);
+ }
+ } catch (Exception e) {
+
+ }
+
+ // check if cache is still ok
+ boolean refreshedCache = false;
+ try {
+ // get network interfaces
+ final Set<InetAddress> currentAddresses = new HashSet<InetAddress>();
+ currentAddresses.add(InetAddress.getLocalHost());
+ Enumeration<?> nis = NetworkInterface.getNetworkInterfaces();
+ while (nis.hasMoreElements()) {
+ NetworkInterface inter = (NetworkInterface)nis.nextElement();
+ Enumeration<InetAddress> ias = inter.getInetAddresses();
+ while (ias.hasMoreElements())
+ currentAddresses.add(ias.nextElement());
+ }
+
+ // check if cache is empty or old and refill it if necessary
+ if (addressCache == null || !addressCache.containsAll(currentAddresses)
+ || !currentAddresses.containsAll(addressCache)) {
+ CacheThread cacheThread = null;
+ refreshedCache = true;
+
+ synchronized (lock) {
+ addressCache = currentAddresses;
+ notLocalHostCache = new HashSet<String>();
+ localHostCache = new HashSet<String>(currentAddresses.size() * 3);
+
+ Iterator<InetAddress> iter = currentAddresses.iterator();
+ while (iter.hasNext()) {
+ InetAddress addr = iter.next();
+ String a = addr.getHostAddress();
+ if (a != null && !localHostCache.contains(a))
+ localHostCache.add(a);
+ }
+
+ cacheThread = new CacheThread(host, currentAddresses, localHostCache, notLocalHostCache, threadMap);
+ threadMap.put(host, cacheThread);
+ cacheThread.setDaemon(true);
+ cacheThread.setPriority(Thread.NORM_PRIORITY - 1);
+ cacheThread.start();
+ }
+ cacheThread.join(200);
+ }
+ } catch (Exception e) {
+ }
+
+ synchronized (lock) {
+ if (localHostCache.contains(host))
+ return true;
+ if (notLocalHostCache.contains(host))
+ return false;
+ }
+
+ // if the cache hasn't been cleared, maybe we still need to lookup the
+ // host
+ if (!refreshedCache && !currentThread) {
+ try {
+ CacheThread cacheThread = null;
+ synchronized (lock) {
+ cacheThread = new CacheThread(host, null, localHostCache, notLocalHostCache, threadMap);
+ threadMap.put(host, cacheThread);
+ cacheThread.setDaemon(true);
+ cacheThread.setPriority(Thread.NORM_PRIORITY - 1);
+ cacheThread.start();
+ }
+ cacheThread.join(75);
+
+ synchronized (lock) {
+ if (localHostCache.contains(host))
+ return true;
+ }
+ } catch (Exception e) {
+ }
+ }
+ return false;
+ }
+
+}