From 2bf6abaee42cd687a15095274961c6c265ee9326 Mon Sep 17 00:00:00 2001 From: wjaniszewski Date: Sun, 3 Aug 2008 20:03:45 +0000 Subject: In added configuration option to allow creating name server by Tuscany, new test scenario in itest/corba. git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@682203 13f79535-47bb-0310-9956-ffa450edef68 --- .../sca/test/corba/ScenarioFiveTestCase.java | 51 +++++ .../sca/test/corba/ScenarioFourTestCase.java | 15 +- .../tuscany/sca/test/corba/types/ScenarioFive.java | 32 +++ .../test/corba/types/ScenarioFiveComponent.java | 40 ++++ .../sca/test/corba/types/ScenarioFiveImpl.java | 31 +++ .../src/test/resources/ScenarioFive.composite | 41 ++++ .../corba/impl/CorbaServiceBindingProvider.java | 17 ++ .../sca/binding/corba/impl/util/SocketUtil.java | 225 +++++++++++++++++++++ .../tuscany/sca/binding/corba/CorbaBinding.java | 4 + .../sca/binding/corba/impl/CorbaBindingImpl.java | 11 +- .../binding/corba/impl/CorbaBindingProcessor.java | 10 +- .../corba/impl/CorbaSCAServiceBindingProvider.java | 1 + .../sca/binding/sca/corba/impl/SocketUtil.java | 225 --------------------- 13 files changed, 469 insertions(+), 234 deletions(-) create mode 100644 java/sca/itest/corba/src/test/java/org/apache/tuscany/sca/test/corba/ScenarioFiveTestCase.java create mode 100644 java/sca/itest/corba/src/test/java/org/apache/tuscany/sca/test/corba/types/ScenarioFive.java create mode 100644 java/sca/itest/corba/src/test/java/org/apache/tuscany/sca/test/corba/types/ScenarioFiveComponent.java create mode 100644 java/sca/itest/corba/src/test/java/org/apache/tuscany/sca/test/corba/types/ScenarioFiveImpl.java create mode 100644 java/sca/itest/corba/src/test/resources/ScenarioFive.composite create mode 100755 java/sca/modules/binding-corba-runtime/src/main/java/org/apache/tuscany/sca/binding/corba/impl/util/SocketUtil.java delete mode 100755 java/sca/modules/binding-sca-corba/src/main/java/org/apache/tuscany/sca/binding/sca/corba/impl/SocketUtil.java (limited to 'java') diff --git a/java/sca/itest/corba/src/test/java/org/apache/tuscany/sca/test/corba/ScenarioFiveTestCase.java b/java/sca/itest/corba/src/test/java/org/apache/tuscany/sca/test/corba/ScenarioFiveTestCase.java new file mode 100644 index 0000000000..2704186386 --- /dev/null +++ b/java/sca/itest/corba/src/test/java/org/apache/tuscany/sca/test/corba/ScenarioFiveTestCase.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.test.corba; + +import static org.junit.Assert.fail; + +import org.apache.tuscany.sca.host.embedded.SCADomain; +import org.apache.tuscany.sca.test.corba.types.ScenarioFive; +import org.apache.tuscany.sca.test.corba.types.ScenarioFiveComponent; +import org.junit.Test; + +/** + * Tests usage of "provideNameServer" attribute in + */ +public class ScenarioFiveTestCase { + + /** + * Tests binding with provided name server + */ + @Test + public void test_providedNameServer() { + try { + // just make sure we can obtain and use the reference with success + SCADomain domain = SCADomain.newInstance("ScenarioFive.composite"); + ScenarioFive scenarioFive = + domain.getService(ScenarioFiveComponent.class, "ScenarioFive").getScenarioFive(); + scenarioFive.doNothing(); + } catch (Exception e) { + e.printStackTrace(); + fail(); + } + } + +} diff --git a/java/sca/itest/corba/src/test/java/org/apache/tuscany/sca/test/corba/ScenarioFourTestCase.java b/java/sca/itest/corba/src/test/java/org/apache/tuscany/sca/test/corba/ScenarioFourTestCase.java index 2f3e421392..63bb05ca4c 100644 --- a/java/sca/itest/corba/src/test/java/org/apache/tuscany/sca/test/corba/ScenarioFourTestCase.java +++ b/java/sca/itest/corba/src/test/java/org/apache/tuscany/sca/test/corba/ScenarioFourTestCase.java @@ -34,7 +34,6 @@ import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; - /** * Tests SCA default binding over CORBA binding */ @@ -85,7 +84,7 @@ public class ScenarioFourTestCase { Assert.fail(e.getMessage()); } } - + /** * Test for JAXB exceptions */ @@ -101,7 +100,7 @@ public class ScenarioFourTestCase { fail(); } } - + /** * General test for passing SDO objects */ @@ -112,20 +111,22 @@ public class ScenarioFourTestCase { scenarioFourSdo.setMessage("Test1"); scenarioFourSdo.setSymbol("Test2"); ScenarioFourSdo result = scenarioFour.passScenarioFourStruct(scenarioFourSdo); - assertTrue(scenarioFourSdo.getMessage().equals(result.getMessage()) && scenarioFourSdo.getSymbol().equals(result.getSymbol())); + assertTrue(scenarioFourSdo.getMessage().equals(result.getMessage()) && scenarioFourSdo.getSymbol() + .equals(result.getSymbol())); } catch (Exception e) { e.printStackTrace(); fail(); } } - + /** - * Tests reusing local name server with multiple bindings + * Tests reusing local name server with multiple bindings */ @Test public void test_nameServerReuse() { try { - ScenarioFour scenarioFour = domain.getService(ScenarioFourComponent.class, "ScenarioFourReuse").getScenarioFour(); + ScenarioFour scenarioFour = + domain.getService(ScenarioFourComponent.class, "ScenarioFourReuse").getScenarioFour(); ScenarioFourStruct struct = new ScenarioFourStruct(); scenarioFour.setStruct(struct); } catch (Exception e) { diff --git a/java/sca/itest/corba/src/test/java/org/apache/tuscany/sca/test/corba/types/ScenarioFive.java b/java/sca/itest/corba/src/test/java/org/apache/tuscany/sca/test/corba/types/ScenarioFive.java new file mode 100644 index 0000000000..a254da205a --- /dev/null +++ b/java/sca/itest/corba/src/test/java/org/apache/tuscany/sca/test/corba/types/ScenarioFive.java @@ -0,0 +1,32 @@ +/* + * 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.test.corba.types; + +import org.osoa.sca.annotations.Remotable; + +/** + * Operations for scenario five + */ +@Remotable +public interface ScenarioFive { + + void doNothing(); + +} diff --git a/java/sca/itest/corba/src/test/java/org/apache/tuscany/sca/test/corba/types/ScenarioFiveComponent.java b/java/sca/itest/corba/src/test/java/org/apache/tuscany/sca/test/corba/types/ScenarioFiveComponent.java new file mode 100644 index 0000000000..577c40d963 --- /dev/null +++ b/java/sca/itest/corba/src/test/java/org/apache/tuscany/sca/test/corba/types/ScenarioFiveComponent.java @@ -0,0 +1,40 @@ +/* + * 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.test.corba.types; + +import org.osoa.sca.annotations.Reference; + +/** + * Component for obtaining ScenarioFive reference + */ +public class ScenarioFiveComponent { + + private ScenarioFive scenarioFive; + + @Reference + public void setScenarioFive(ScenarioFive scenarioFive) { + this.scenarioFive = scenarioFive; + } + + public ScenarioFive getScenarioFive() { + return scenarioFive; + } + +} diff --git a/java/sca/itest/corba/src/test/java/org/apache/tuscany/sca/test/corba/types/ScenarioFiveImpl.java b/java/sca/itest/corba/src/test/java/org/apache/tuscany/sca/test/corba/types/ScenarioFiveImpl.java new file mode 100644 index 0000000000..faacdd564f --- /dev/null +++ b/java/sca/itest/corba/src/test/java/org/apache/tuscany/sca/test/corba/types/ScenarioFiveImpl.java @@ -0,0 +1,31 @@ +/* + * 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.test.corba.types; + +/** + * Implementation of ScenarioFive service + */ +public class ScenarioFiveImpl implements ScenarioFive { + + public void doNothing() { + // does nothing + } + +} diff --git a/java/sca/itest/corba/src/test/resources/ScenarioFive.composite b/java/sca/itest/corba/src/test/resources/ScenarioFive.composite new file mode 100644 index 0000000000..3c73e238a5 --- /dev/null +++ b/java/sca/itest/corba/src/test/resources/ScenarioFive.composite @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/java/sca/modules/binding-corba-runtime/src/main/java/org/apache/tuscany/sca/binding/corba/impl/CorbaServiceBindingProvider.java b/java/sca/modules/binding-corba-runtime/src/main/java/org/apache/tuscany/sca/binding/corba/impl/CorbaServiceBindingProvider.java index fe4fabc293..516605ec8f 100644 --- a/java/sca/modules/binding-corba-runtime/src/main/java/org/apache/tuscany/sca/binding/corba/impl/CorbaServiceBindingProvider.java +++ b/java/sca/modules/binding-corba-runtime/src/main/java/org/apache/tuscany/sca/binding/corba/impl/CorbaServiceBindingProvider.java @@ -24,7 +24,9 @@ import org.apache.tuscany.sca.binding.corba.impl.service.ComponentInvocationProx import org.apache.tuscany.sca.binding.corba.impl.service.DynaCorbaServant; import org.apache.tuscany.sca.binding.corba.impl.service.InvocationProxy; import org.apache.tuscany.sca.binding.corba.impl.types.util.Utils; +import org.apache.tuscany.sca.binding.corba.impl.util.SocketUtil; import org.apache.tuscany.sca.host.corba.CorbaHost; +import org.apache.tuscany.sca.host.corba.CorbanameURL; import org.apache.tuscany.sca.interfacedef.InterfaceContract; import org.apache.tuscany.sca.interfacedef.java.JavaInterface; import org.apache.tuscany.sca.provider.ServiceBindingProvider; @@ -40,11 +42,20 @@ public class CorbaServiceBindingProvider implements ServiceBindingProvider { private CorbaHost host; private RuntimeComponentService service; private DynaCorbaServant servant; + private boolean isLocalhost; + private int port; public CorbaServiceBindingProvider(CorbaBinding binding, CorbaHost host, RuntimeComponentService service) { this.binding = binding; this.host = host; this.service = service; + if (binding.isProvideNameServer()) { + CorbanameURL details = new CorbanameURL(binding.getCorbaname()); + isLocalhost = SocketUtil.isLocalhost(details.getHost()); + if (isLocalhost) { + port = details.getPort(); + } + } } /** @@ -63,6 +74,9 @@ public class CorbaServiceBindingProvider implements ServiceBindingProvider { InvocationProxy proxy = new ComponentInvocationProxy(service, service.getRuntimeWire(binding), javaClass); servant = new DynaCorbaServant(proxy, Utils.getTypeId(javaClass)); servant.setIds(new String[] {binding.getId()}); + if (binding.isProvideNameServer() && isLocalhost) { + host.createLocalNameServer(port); + } host.registerServant(binding.getCorbaname(), servant); } catch (Exception e) { throw new ServiceRuntimeException(e); @@ -75,6 +89,9 @@ public class CorbaServiceBindingProvider implements ServiceBindingProvider { */ public void stop() { try { + if (binding.isProvideNameServer() && isLocalhost) { + host.releaseLocalNameServer(port); + } host.unregisterServant(binding.getCorbaname()); } catch (Exception e) { throw new ServiceRuntimeException(e); diff --git a/java/sca/modules/binding-corba-runtime/src/main/java/org/apache/tuscany/sca/binding/corba/impl/util/SocketUtil.java b/java/sca/modules/binding-corba-runtime/src/main/java/org/apache/tuscany/sca/binding/corba/impl/util/SocketUtil.java new file mode 100755 index 0000000000..3541fd92cf --- /dev/null +++ b/java/sca/modules/binding-corba-runtime/src/main/java/org/apache/tuscany/sca/binding/corba/impl/util/SocketUtil.java @@ -0,0 +1,225 @@ +/* + * 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.binding.corba.impl.util; + +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; + +/** + * 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 localHostCache; + private static Set notLocalHostCache = new HashSet(); + private static Map threadMap = new HashMap(); + + private static Set addressCache; + + static class CacheThread extends Thread { + private Set currentAddresses; + private Set addressList; + private String host; + private Set nonAddressList; + private Map threadMap2; + + public CacheThread(String host, + Set currentAddresses, + Set addressList, + Set nonAddressList, + Map 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 iter2 = currentAddresses.iterator(); + while (iter2.hasNext()) { + InetAddress addr = (InetAddress)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 currentAddresses = new HashSet(); + currentAddresses.add(InetAddress.getLocalHost()); + Enumeration nis = NetworkInterface.getNetworkInterfaces(); + while (nis.hasMoreElements()) { + NetworkInterface inter = (NetworkInterface)nis.nextElement(); + Enumeration 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(); + localHostCache = new HashSet(currentAddresses.size() * 3); + + Iterator iter = currentAddresses.iterator(); + while (iter.hasNext()) { + InetAddress addr = (InetAddress)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; + } + +} diff --git a/java/sca/modules/binding-corba/src/main/java/org/apache/tuscany/sca/binding/corba/CorbaBinding.java b/java/sca/modules/binding-corba/src/main/java/org/apache/tuscany/sca/binding/corba/CorbaBinding.java index 0b79065cc3..bf3bc09461 100644 --- a/java/sca/modules/binding-corba/src/main/java/org/apache/tuscany/sca/binding/corba/CorbaBinding.java +++ b/java/sca/modules/binding-corba/src/main/java/org/apache/tuscany/sca/binding/corba/CorbaBinding.java @@ -43,4 +43,8 @@ public interface CorbaBinding extends Binding { void setId(String id); String getCorbaname(); + + boolean isProvideNameServer(); + + void setProvideNameServer(boolean provideNameServer); } diff --git a/java/sca/modules/binding-corba/src/main/java/org/apache/tuscany/sca/binding/corba/impl/CorbaBindingImpl.java b/java/sca/modules/binding-corba/src/main/java/org/apache/tuscany/sca/binding/corba/impl/CorbaBindingImpl.java index 6afe49717f..167fe50d7b 100644 --- a/java/sca/modules/binding-corba/src/main/java/org/apache/tuscany/sca/binding/corba/impl/CorbaBindingImpl.java +++ b/java/sca/modules/binding-corba/src/main/java/org/apache/tuscany/sca/binding/corba/impl/CorbaBindingImpl.java @@ -38,7 +38,8 @@ public class CorbaBindingImpl implements CorbaBinding, PolicySetAttachPoint { private String host; private int port; private String id; - + private boolean provideNameServer; + private List requiredIntents = new ArrayList(); private List policySets = new ArrayList(); private IntentAttachPointType intentAttachPointType; @@ -129,4 +130,12 @@ public class CorbaBindingImpl implements CorbaBinding, PolicySetAttachPoint { return CorbaHostUtils.isValidCorbanameURI(getURI()) ? getURI(): CorbaHostUtils.createCorbanameURI(getHost(), getPort(), getName()); } + public boolean isProvideNameServer() { + return provideNameServer; + } + + public void setProvideNameServer(boolean provideNameServer) { + this.provideNameServer = provideNameServer; + } + } diff --git a/java/sca/modules/binding-corba/src/main/java/org/apache/tuscany/sca/binding/corba/impl/CorbaBindingProcessor.java b/java/sca/modules/binding-corba/src/main/java/org/apache/tuscany/sca/binding/corba/impl/CorbaBindingProcessor.java index 53333bd7aa..a7be836437 100644 --- a/java/sca/modules/binding-corba/src/main/java/org/apache/tuscany/sca/binding/corba/impl/CorbaBindingProcessor.java +++ b/java/sca/modules/binding-corba/src/main/java/org/apache/tuscany/sca/binding/corba/impl/CorbaBindingProcessor.java @@ -80,11 +80,16 @@ public class CorbaBindingProcessor implements StAXArtifactProcessor localHostCache; - private static Set notLocalHostCache = new HashSet(); - private static Map threadMap = new HashMap(); - - private static Set addressCache; - - static class CacheThread extends Thread { - private Set currentAddresses; - private Set addressList; - private String host; - private Set nonAddressList; - private Map threadMap2; - - public CacheThread(String host, - Set currentAddresses, - Set addressList, - Set nonAddressList, - Map 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 iter2 = currentAddresses.iterator(); - while (iter2.hasNext()) { - InetAddress addr = (InetAddress)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 currentAddresses = new HashSet(); - currentAddresses.add(InetAddress.getLocalHost()); - Enumeration nis = NetworkInterface.getNetworkInterfaces(); - while (nis.hasMoreElements()) { - NetworkInterface inter = (NetworkInterface)nis.nextElement(); - Enumeration 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(); - localHostCache = new HashSet(currentAddresses.size() * 3); - - Iterator iter = currentAddresses.iterator(); - while (iter.hasNext()) { - InetAddress addr = (InetAddress)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; - } - -} -- cgit v1.2.3