Author: dain Date: Mon Mar 20 11:01:08 2006 New Revision: 387278 URL: http://svn.apache.org/viewcvs?rev=387278&view=rev Log: Added toURI and a constructor that takes an URI to AbstractName. Added: geronimo/branches/1.1/modules/kernel/src/test/org/apache/geronimo/gbean/AbstractNameTest.java Modified: geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/gbean/AbstractName.java geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/kernel/repository/Artifact.java Modified: geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/gbean/AbstractName.java URL: http://svn.apache.org/viewcvs/geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/gbean/AbstractName.java?rev=387278&r1=387277&r2=387278&view=diff ============================================================================== --- geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/gbean/AbstractName.java (original) +++ geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/gbean/AbstractName.java Mon Mar 20 11:01:08 2006 @@ -17,14 +17,20 @@ package org.apache.geronimo.gbean; -import org.apache.geronimo.kernel.repository.Artifact; - -import javax.management.ObjectName; import java.io.Serializable; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.ArrayList; import java.util.Collections; +import java.util.Hashtable; import java.util.Iterator; +import java.util.List; import java.util.Map; -import java.util.Set; +import java.util.TreeMap; +import javax.management.MalformedObjectNameException; +import javax.management.ObjectName; + +import org.apache.geronimo.kernel.repository.Artifact; /** * @version $Rev:$ $Date:$ @@ -35,14 +41,120 @@ private final Artifact artifact; private final Map name; private final ObjectName objectName; + private final URI uri; public AbstractName(Artifact artifact, Map name, ObjectName objectName) { - assert artifact != null; - assert name != null; - assert objectName != null; + if (artifact == null) throw new NullPointerException("artifact is null"); + if (name == null) throw new NullPointerException("name is null"); + if (name.isEmpty()) throw new IllegalArgumentException("name is empty"); + if (objectName == null) throw new NullPointerException("objectName is null"); + this.artifact = artifact; this.name = name; this.objectName = objectName; + + this.uri = createURI(artifact, name); + } + + public AbstractName(URI uri) { + if (uri == null) new NullPointerException("uri is null"); + + // + // Artifact + // + String artifactString = uri.getPath(); + if (artifactString == null) throw new IllegalArgumentException("uri does not contain a path part used for the artifact"); + + List artifactParts = split(artifactString, '/'); + if (artifactParts.size() != 4) { + throw new IllegalArgumentException("uri path must be in the form [?key=value[,key=value]*] : " + artifactString); + } + + String groupId = (String) artifactParts.get(0); + if (groupId.length() == 0) groupId = null; + + String artifactId = (String) artifactParts.get(1); + if (artifactId.length() == 0) artifactId = null; + + String version = (String) artifactParts.get(2); + if (version.length() == 0) version = null; + + String type = (String) artifactParts.get(3); + if (type.length() == 0) type = null; + + artifact = new Artifact(groupId, artifactId, version, type); + + // + // name map + // + name = new TreeMap(); + String nameString = uri.getQuery(); + if (nameString == null) throw new IllegalArgumentException("uri does not contain a query part used for the name map"); + List nameParts = split(nameString, ','); + for (Iterator iterator = nameParts.iterator(); iterator.hasNext();) { + String namePart = (String) iterator.next(); + List keyValue = split(namePart, '='); + if (keyValue.size() != 2) { + throw new IllegalArgumentException("uri query string must be in the form [vendorId]/artifactId/[version]/[type] : " + nameString); + } + String key = (String) keyValue.get(0); + String value = (String) keyValue.get(1); + if (name.containsKey(key)) { + throw new IllegalArgumentException("uri query string contains the key '"+ key + "' twice : " + nameString); + } + name.put(key, value); + } + if (name.isEmpty()) { + throw new IllegalArgumentException("name is empty: " + nameString); + } + + // + // uri + // + this.uri = createURI(artifact, name); + + // + // object name + // + try { + objectName = new ObjectName("geronimo", new Hashtable(name)); + } catch (MalformedObjectNameException e) { + IllegalArgumentException illegalArgumentException = new IllegalArgumentException(); + illegalArgumentException.initCause(e); + throw illegalArgumentException; + } + } + + private static URI createURI(Artifact artifact, Map name) { + StringBuffer queryString = new StringBuffer(); + TreeMap treeMap = new TreeMap(name); + for (Iterator iterator = treeMap.entrySet().iterator(); iterator.hasNext();) { + Map.Entry entry = (Map.Entry) iterator.next(); + String key = (String) entry.getKey(); + String value = (String) entry.getValue(); + queryString.append(key).append('=').append(value); + if (iterator.hasNext()) { + queryString.append(','); + } + } + try { + return new URI(null, null, artifact.toString(), queryString.toString(), null); + } catch (URISyntaxException e) { + IllegalArgumentException illegalArgumentException = new IllegalArgumentException(); + illegalArgumentException.initCause(e); + throw illegalArgumentException; + } + } + + private static List split(String source, char delim) { + List parts = new ArrayList(); + for (int index = source.indexOf(delim); index >= 0; index = source.indexOf(delim)) { + String part = source.substring(0, index); + source = source.substring(index + 1); + parts.add(part); + } + parts.add(source); + return parts; } public Artifact getArtifact() { @@ -55,6 +167,10 @@ public ObjectName getObjectName() { return objectName; + } + + public URI toURI() { + return uri; } public String toString() { Modified: geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/kernel/repository/Artifact.java URL: http://svn.apache.org/viewcvs/geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/kernel/repository/Artifact.java?rev=387278&r1=387277&r2=387278&view=diff ============================================================================== --- geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/kernel/repository/Artifact.java (original) +++ geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/kernel/repository/Artifact.java Mon Mar 20 11:01:08 2006 @@ -143,7 +143,25 @@ } public String toString() { - return groupId + "/" + artifactId + "/" + version + "/" + type; + StringBuffer buffer = new StringBuffer(); + + if (groupId != null) { + buffer.append(groupId); + } + buffer.append("/"); + + buffer.append(artifactId); + buffer.append("/"); + + if (version != null) { + buffer.append(version); + } + buffer.append("/"); + + if (type != null) { + buffer.append(type); + } + return buffer.toString(); } /** Added: geronimo/branches/1.1/modules/kernel/src/test/org/apache/geronimo/gbean/AbstractNameTest.java URL: http://svn.apache.org/viewcvs/geronimo/branches/1.1/modules/kernel/src/test/org/apache/geronimo/gbean/AbstractNameTest.java?rev=387278&view=auto ============================================================================== --- geronimo/branches/1.1/modules/kernel/src/test/org/apache/geronimo/gbean/AbstractNameTest.java (added) +++ geronimo/branches/1.1/modules/kernel/src/test/org/apache/geronimo/gbean/AbstractNameTest.java Mon Mar 20 11:01:08 2006 @@ -0,0 +1,149 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.geronimo.gbean; + +import java.util.Map; +import java.util.LinkedHashMap; +import java.util.Collections; +import java.net.URI; + +import javax.management.ObjectName; + +import junit.framework.TestCase; +import org.apache.geronimo.kernel.repository.Artifact; +import org.apache.geronimo.kernel.repository.Version; + +/** + * @version $Rev$ $Date$ + */ +public class AbstractNameTest extends TestCase { + public void testSimple() throws Exception { + Artifact artifact = new Artifact("groupId", "artifactId", "version", "type"); + + Map nameMap = new LinkedHashMap(); + nameMap.put("a", "aaa"); + nameMap.put("b", "bbb"); + nameMap.put("c", "ccc"); + + AbstractName abstractName = new AbstractName(artifact, nameMap, new ObjectName("test:nothing=true")); + URI uri = abstractName.toURI(); + assertEquals(abstractName, new AbstractName(uri)); + } + + public void testMinimalArtifact() throws Exception { + Artifact artifact = new Artifact(null, "artifactId", (Version)null, null); + + Map nameMap = new LinkedHashMap(); + nameMap.put("a", "aaa"); + nameMap.put("b", "bbb"); + nameMap.put("c", "ccc"); + + AbstractName abstractName = new AbstractName(artifact, nameMap, new ObjectName("test:nothing=true")); + URI uri = abstractName.toURI(); + assertEquals(abstractName, new AbstractName(uri)); + } + + public void testCreateURI() throws Exception { + Artifact artifact = new Artifact("groupId", "artifactId", "version", "type"); + + URI uri = new URI(null, null, artifact.toString(), "a=aaa", null); + + AbstractName abstractName = new AbstractName(artifact, + Collections.singletonMap("a", "aaa"), + new ObjectName("test:nothing=true")); + assertEquals(abstractName, new AbstractName(uri)); + } + + public void testEmptyName() throws Exception { + Artifact artifact = new Artifact("groupId", "artifactId", "version", "type"); + + URI uri = new URI(null, null, artifact.toString(), "", null); + try { + new AbstractName(uri); + fail("expected IllegalArgumentException"); + } catch (IllegalArgumentException e) { + // expected + } + } + + public void testNoName() throws Exception { + Artifact artifact = new Artifact("groupId", "artifactId", "version", "type"); + + URI uri = new URI(null, null, artifact.toString(), null, null); + try { + new AbstractName(uri); + fail("expected IllegalArgumentException"); + } catch (IllegalArgumentException e) { + // expected + } + } + + public void testEmptyArtifact() throws Exception { + URI uri = new URI(null, null, "", "a=aaa", null); + try { + new AbstractName(uri); + fail("expected IllegalArgumentException"); + } catch (IllegalArgumentException e) { + // expected + } + } + + public void testInvalidArtifact() throws Exception { + URI uri = new URI(null, null, "foo", "a=aaa", null); + try { + new AbstractName(uri); + fail("expected IllegalArgumentException"); + } catch (IllegalArgumentException e) { + // expected + } + + uri = new URI(null, null, "foo/", "a=aaa", null); + try { + new AbstractName(uri); + fail("expected IllegalArgumentException"); + } catch (IllegalArgumentException e) { + // expected + } + + uri = new URI(null, null, "/foo/", "a=aaa", null); + try { + new AbstractName(uri); + fail("expected IllegalArgumentException"); + } catch (IllegalArgumentException e) { + // expected + } + + uri = new URI(null, null, "foo////", "a=aaa", null); + try { + new AbstractName(uri); + fail("expected IllegalArgumentException"); + } catch (IllegalArgumentException e) { + // expected + } + } + + public void testNoArtifact() throws Exception { + URI uri = new URI(null, null, null, "a=aaa", null); + try { + new AbstractName(uri); + fail("expected IllegalArgumentException"); + } catch (IllegalArgumentException e) { + // expected + } + } +} +