From 85f5a5467d5b5f1f44da7e7c4ae296ef8ffe2e5e Mon Sep 17 00:00:00 2001 From: rfeng Date: Tue, 8 Jul 2008 17:05:57 +0000 Subject: Refactor the CorbanameURL and fix the corbaname parsing issue on Linux git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@674882 13f79535-47bb-0310-9956-ffa450edef68 --- .../tuscany/sca/host/corba/CorbaHostUtils.java | 92 +--------- .../tuscany/sca/host/corba/CorbanameDetails.java | 66 -------- .../tuscany/sca/host/corba/CorbanameURL.java | 186 +++++++++++++++++++++ .../tuscany/sca/host/corba/UtilsTestCase.java | 26 ++- 4 files changed, 205 insertions(+), 165 deletions(-) delete mode 100644 java/sca/modules/host-corba/src/main/java/org/apache/tuscany/sca/host/corba/CorbanameDetails.java create mode 100644 java/sca/modules/host-corba/src/main/java/org/apache/tuscany/sca/host/corba/CorbanameURL.java (limited to 'java/sca/modules/host-corba/src') diff --git a/java/sca/modules/host-corba/src/main/java/org/apache/tuscany/sca/host/corba/CorbaHostUtils.java b/java/sca/modules/host-corba/src/main/java/org/apache/tuscany/sca/host/corba/CorbaHostUtils.java index 965ab2beec..c12980523b 100644 --- a/java/sca/modules/host-corba/src/main/java/org/apache/tuscany/sca/host/corba/CorbaHostUtils.java +++ b/java/sca/modules/host-corba/src/main/java/org/apache/tuscany/sca/host/corba/CorbaHostUtils.java @@ -19,48 +19,31 @@ package org.apache.tuscany.sca.host.corba; -import java.util.ArrayList; -import java.util.List; -import java.util.NoSuchElementException; -import java.util.StringTokenizer; /** * Various utilities for host-corba */ public class CorbaHostUtils { - public static String DEFAULT_NAME_SERVICE = "NameService"; - public static String DEFAULT_HOST = "localhost"; - public static int DEFAULT_PORT = 900; - /** * 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; + return uri != null && uri.startsWith("corbaname:") && uri.contains("#") && uri.indexOf('#') < uri.length() - 1; } /** * Creates corbaname URI basing on given parameters - * - * @param name * @param host * @param port + * @param name + * * @return */ - public static String createCorbanameURI(String name, String host, int port) { - String portStr = null; - if (port > 0) { - portStr = Integer.toString(port); - } else { - portStr = ""; - } - if (host == null) { - host = ""; - } - return "corbaname::" + host + ":" + portStr + "#" + name; + public static String createCorbanameURI(String host, int port, String name) { + return new CorbanameURL(host, port, name).toString(); } /** @@ -69,69 +52,8 @@ public class CorbaHostUtils { * @param uri * @return */ - public static CorbanameDetails getServiceDetails(String uri) { - CorbanameDetails details = new CorbanameDetails(); - StringTokenizer hashTokenizer = new StringTokenizer(uri, "#"); - if (hashTokenizer.countTokens() == 2) { - String serviceLocation = hashTokenizer.nextToken(); - String servicePath = hashTokenizer.nextToken(); - StringTokenizer pathDisc = new StringTokenizer(servicePath, "/"); - List namePath = new ArrayList(); - while (pathDisc.hasMoreTokens()) { - namePath.add(pathDisc.nextToken()); - } - details.setNamePath(namePath); - StringTokenizer slashTokenizer = new StringTokenizer(serviceLocation, "/"); - String serviceHost = slashTokenizer.nextToken(); - String nameService = null; - if (slashTokenizer.hasMoreTokens()) { - nameService = slashTokenizer.nextToken(); - } else { - nameService = DEFAULT_NAME_SERVICE; - } - details.setNameService(nameService); - StringTokenizer colonTokenizer = new StringTokenizer(serviceHost, ":", true); - if (colonTokenizer.countTokens() > 0 && colonTokenizer.nextToken().equals("corbaname")) { - String host = null; - int port = 0; - try { - colonTokenizer.nextToken(); - String methodPart = colonTokenizer.nextToken(); - if (!methodPart.equals(":")) { - colonTokenizer.nextToken(); - } - host = colonTokenizer.nextToken(); - if (host.equals(":")) { - // no host provided, no need to get another ":" - host = DEFAULT_HOST; - } else { - // host provided, so another ":" should be read - colonTokenizer.nextToken(); - } - try { - port = Integer.parseInt(colonTokenizer.nextToken()); - } catch (Exception e) { - port = DEFAULT_PORT; - } - } catch (NoSuchElementException e) { - } finally { - if (host == null) { - // parsing failed - user didn't provide host - host = DEFAULT_HOST; - } - if (port == 0) { - // parsing failed - user didn't provide port - port = DEFAULT_PORT; - } - } - details.setHost(host); - details.setPort(port); - } else { - throw new IllegalArgumentException("Given corbaname URI does not begin with 'corbaname'"); - } - } else { - throw new IllegalArgumentException("Given corbaname is missing hash separator"); - } + public static CorbanameURL getServiceDetails(String uri) { + CorbanameURL details = new CorbanameURL(uri); return details; } diff --git a/java/sca/modules/host-corba/src/main/java/org/apache/tuscany/sca/host/corba/CorbanameDetails.java b/java/sca/modules/host-corba/src/main/java/org/apache/tuscany/sca/host/corba/CorbanameDetails.java deleted file mode 100644 index ba95c31e5f..0000000000 --- a/java/sca/modules/host-corba/src/main/java/org/apache/tuscany/sca/host/corba/CorbanameDetails.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * 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; - -/** - * Holds corbaname URI details - */ -public class CorbanameDetails { - - private String host; - private int port; - private String nameService; - private List namePath; - - 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 getNamePath() { - return namePath; - } - - public void setNamePath(List namePath) { - this.namePath = namePath; - } - -} diff --git a/java/sca/modules/host-corba/src/main/java/org/apache/tuscany/sca/host/corba/CorbanameURL.java b/java/sca/modules/host-corba/src/main/java/org/apache/tuscany/sca/host/corba/CorbanameURL.java new file mode 100644 index 0000000000..ddfc51ca98 --- /dev/null +++ b/java/sca/modules/host-corba/src/main/java/org/apache/tuscany/sca/host/corba/CorbanameURL.java @@ -0,0 +1,186 @@ +/* + * 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; + +/** + * 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 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 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 getNamePath() { + return namePath; + } + + public void setNamePath(List namePath) { + this.namePath = namePath; + } + + 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/java/sca/modules/host-corba/src/test/java/org/apache/tuscany/sca/host/corba/UtilsTestCase.java b/java/sca/modules/host-corba/src/test/java/org/apache/tuscany/sca/host/corba/UtilsTestCase.java index b0accef61b..f57b0869a7 100644 --- a/java/sca/modules/host-corba/src/test/java/org/apache/tuscany/sca/host/corba/UtilsTestCase.java +++ b/java/sca/modules/host-corba/src/test/java/org/apache/tuscany/sca/host/corba/UtilsTestCase.java @@ -26,13 +26,11 @@ import static org.junit.Assert.fail; import java.util.ArrayList; import java.util.List; -import org.apache.tuscany.sca.host.corba.CorbanameDetails; -import org.apache.tuscany.sca.host.corba.CorbaHostUtils; import org.junit.Test; public class UtilsTestCase { - private void assertDetailsAreOk(CorbanameDetails details, String host, int port, String nameService, List namePath) { + private void assertDetailsAreOk(CorbanameURL details, String host, int port, String nameService, List namePath) { assertTrue(details.getHost().equals(host)); assertTrue(details.getNameService().equals(nameService)); assertTrue(details.getPort() == port); @@ -45,7 +43,7 @@ public class UtilsTestCase { @Test public void test_validCorbaname() { String testUri = null; - CorbanameDetails details = null; + CorbanameURL details = null; List namePath = null; testUri = "corbaname:ignore:host:1234/Service#Reference"; @@ -58,43 +56,43 @@ public class UtilsTestCase { details = CorbaHostUtils.getServiceDetails(testUri); namePath = new ArrayList(); namePath.add("Reference"); - assertDetailsAreOk(details, "host", CorbaHostUtils.DEFAULT_PORT, "Service", namePath); + assertDetailsAreOk(details, "host", CorbanameURL.DEFAULT_PORT, "Service", namePath); testUri = "corbaname:ignore:host/Service#Reference"; details = CorbaHostUtils.getServiceDetails(testUri); namePath = new ArrayList(); namePath.add("Reference"); - assertDetailsAreOk(details, "host", CorbaHostUtils.DEFAULT_PORT, "Service", namePath); + assertDetailsAreOk(details, "host", CorbanameURL.DEFAULT_PORT, "Service", namePath); testUri = "corbaname:ignore:/Service#Reference"; details = CorbaHostUtils.getServiceDetails(testUri); namePath = new ArrayList(); namePath.add("Reference"); - assertDetailsAreOk(details, CorbaHostUtils.DEFAULT_HOST, CorbaHostUtils.DEFAULT_PORT, "Service", namePath); + assertDetailsAreOk(details, CorbanameURL.DEFAULT_HOST, CorbanameURL.DEFAULT_PORT, "Service", namePath); testUri = "corbaname:ignore/Service#Reference"; details = CorbaHostUtils.getServiceDetails(testUri); namePath = new ArrayList(); namePath.add("Reference"); - assertDetailsAreOk(details, CorbaHostUtils.DEFAULT_HOST, CorbaHostUtils.DEFAULT_PORT, "Service", namePath); + assertDetailsAreOk(details, CorbanameURL.DEFAULT_HOST, CorbanameURL.DEFAULT_PORT, "Service", namePath); testUri = "corbaname:/Service#Reference"; details = CorbaHostUtils.getServiceDetails(testUri); namePath = new ArrayList(); namePath.add("Reference"); - assertDetailsAreOk(details, CorbaHostUtils.DEFAULT_HOST, CorbaHostUtils.DEFAULT_PORT, "Service", namePath); + assertDetailsAreOk(details, CorbanameURL.DEFAULT_HOST, CorbanameURL.DEFAULT_PORT, "Service", namePath); testUri = "corbaname/Service#Reference"; details = CorbaHostUtils.getServiceDetails(testUri); namePath = new ArrayList(); namePath.add("Reference"); - assertDetailsAreOk(details, CorbaHostUtils.DEFAULT_HOST, CorbaHostUtils.DEFAULT_PORT, "Service", namePath); + assertDetailsAreOk(details, CorbanameURL.DEFAULT_HOST, CorbanameURL.DEFAULT_PORT, "Service", namePath); testUri = "corbaname#Reference"; details = CorbaHostUtils.getServiceDetails(testUri); namePath = new ArrayList(); namePath.add("Reference"); - assertDetailsAreOk(details, CorbaHostUtils.DEFAULT_HOST, CorbaHostUtils.DEFAULT_PORT, CorbaHostUtils.DEFAULT_NAME_SERVICE, namePath); + assertDetailsAreOk(details, CorbanameURL.DEFAULT_HOST, CorbanameURL.DEFAULT_PORT, CorbanameURL.DEFAULT_NAME_SERVICE, namePath); testUri = "corbaname#Parent/Mid/Reference"; details = CorbaHostUtils.getServiceDetails(testUri); @@ -102,7 +100,7 @@ public class UtilsTestCase { namePath.add("Parent"); namePath.add("Mid"); namePath.add("Reference"); - assertDetailsAreOk(details, CorbaHostUtils.DEFAULT_HOST, CorbaHostUtils.DEFAULT_PORT, CorbaHostUtils.DEFAULT_NAME_SERVICE, namePath); + assertDetailsAreOk(details, CorbanameURL.DEFAULT_HOST, CorbanameURL.DEFAULT_PORT, CorbanameURL.DEFAULT_NAME_SERVICE, namePath); } @Test @@ -128,7 +126,7 @@ public class UtilsTestCase { @Test public void test_creatingCorbanameURI() { - String uri = CorbaHostUtils.createCorbanameURI("SomeName", "SomeHost", 1000); - assertEquals("corbaname::SomeHost:1000#SomeName", uri); + String uri = CorbaHostUtils.createCorbanameURI("SomeHost", 1000, "SomeName"); + assertEquals("corbaname::SomeHost:1000/NameService#SomeName", uri); } } -- cgit v1.2.3