/* * 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(); } }