You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by db...@apache.org on 2013/05/10 06:44:20 UTC

svn commit: r1480878 - in /tomee/tomee/trunk/utils/openejb-provisionning/src: main/java/org/apache/openejb/resolver/maven/Parser.java test/java/org/apache/openejb/resolver/maven/ParserTest.java

Author: dblevins
Date: Fri May 10 04:44:20 2013
New Revision: 1480878

URL: http://svn.apache.org/r1480878
Log:
TOMEE-927 - Support Maven Coordinates in Provisioning

Modified:
    tomee/tomee/trunk/utils/openejb-provisionning/src/main/java/org/apache/openejb/resolver/maven/Parser.java
    tomee/tomee/trunk/utils/openejb-provisionning/src/test/java/org/apache/openejb/resolver/maven/ParserTest.java

Modified: tomee/tomee/trunk/utils/openejb-provisionning/src/main/java/org/apache/openejb/resolver/maven/Parser.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/utils/openejb-provisionning/src/main/java/org/apache/openejb/resolver/maven/Parser.java?rev=1480878&r1=1480877&r2=1480878&view=diff
==============================================================================
--- tomee/tomee/trunk/utils/openejb-provisionning/src/main/java/org/apache/openejb/resolver/maven/Parser.java (original)
+++ tomee/tomee/trunk/utils/openejb-provisionning/src/main/java/org/apache/openejb/resolver/maven/Parser.java Fri May 10 04:44:20 2013
@@ -19,30 +19,27 @@ package org.apache.openejb.resolver.mave
 import org.ops4j.pax.url.maven.commons.MavenRepositoryURL;
 
 import java.net.MalformedURLException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 
 /**
- * This class doesn't seem compliant with the documented Maven Coordinates of
+ * This class respects both Maven Coordinates
  *
  *  - groupId:artifactId:packaging:classifier:version
+ *  - http://maven.apache.org/pom.html#Maven_Coordinates
  *
- * http://maven.apache.org/pom.html#Maven_Coordinates
+ * And OPS4j coordinates
  *
- * For example, per the output of `mvn dependency:tree` TomEE is:
- *
- *  - org.apache.openejb:apache-tomee:zip:webprofile:1.6.0-SNAPSHOT
- *
- * It instead seems to use its own non-maven coordinates of
- *
- *  - groupId:artifactId:version:packaging:classifier
+ *  - groupId/artifactId/version/packaging/classifier
+ *  - https://ops4j1.jira.com/wiki/display/paxurl/Mvn+Protocol
  *
  */
 public class Parser {
-    public static final String VERSION_LATEST = "LATEST";
     private static final String SYNTAX = "mvn:[repository_url!]groupId/artifactId[/[version]/[type]]";
     private static final String REPOSITORY_SEPARATOR = "!";
     private static final String ARTIFACT_SEPARATOR = "/";
     private static final String VERSION_SNAPSHOT = "SNAPSHOT";
-    private static final String TYPE_JAR = "jar";
     private static final String FILE_SEPARATOR = "/";
     private static final String GROUP_SEPARATOR = "\\.";
     private static final String VERSION_SEPARATOR = "-";
@@ -64,6 +61,8 @@ public class Parser {
 
         if (rawPath == null) throw new MalformedURLException("Path cannot be null. Syntax " + SYNTAX);
 
+        final boolean possibleMavenCoordinates = rawPath.contains(":");
+
         final String path = rawPath.replace(":", "/"); // mvn:G:A:V = mvn:G/A/V
 
         if (path.startsWith(REPOSITORY_SEPARATOR) || path.endsWith(REPOSITORY_SEPARATOR)) {
@@ -80,55 +79,42 @@ public class Parser {
             part = path;
         }
 
-        String[] segments = part.split(ARTIFACT_SEPARATOR);
+        final List<String> segments = new ArrayList<String>(Arrays.asList(part.split(ARTIFACT_SEPARATOR)));
 
-        if (segments.length < 2) {
+        if (segments.size() < 2 || segments.size() > 5) {
             throw new MalformedURLException("Invalid path. Syntax " + SYNTAX);
         }
 
-        // we must have a valid group
-        group = segments[0];
+        // If Maven Coordinates were used, rearrange the segments to the OPS4j format
+        if (possibleMavenCoordinates && segments.get(segments.size() - 1).matches("[0-9].*")) {
+            // position the version after the artifactId
+            final String version = segments.remove(segments.size() - 1);
+            segments.add(2, version);
+        }
+
+        final String[] coordinates = {null, null, "LATEST", "jar", null};
+
+        for (int i = 0; i < segments.size(); i++) {
+            final String value = segments.get(i).trim();
+            if (value.length() != 0) {
+                coordinates[i] = value;
+            }
+        }
+
+        this.group = coordinates[0];
+        this.artifact = coordinates[1];
+        this.version = coordinates[2];
+        this.type = coordinates[3];
+        this.classifier = coordinates[4];
+        this.fullClassifier = (this.classifier != null) ? CLASSIFIER_SEPARATOR + classifier : null;
 
-        if (group.trim().length() == 0) {
+        if (group == null) {
             throw new MalformedURLException("Invalid groupId. Syntax " + SYNTAX);
         }
 
-        // valid artifact
-        artifact = segments[1];
-
-        if (artifact.trim().length() == 0) {
+        if (artifact == null) {
             throw new MalformedURLException("Invalid artifactId. Syntax " + SYNTAX);
         }
-
-        // version is optional but we have a default value
-        String version = VERSION_LATEST;
-
-        if (segments.length >= 3 && segments[2].trim().length() > 0) {
-            version = segments[2];
-        }
-
-        // type is optional but we have a default value
-        String type = TYPE_JAR;
-
-        if (segments.length >= 4 && segments[3].trim().length() > 0) {
-            type = segments[3];
-        }
-
-        // classifier is optional (if not pressent or empty we will have a null classsifier
-
-        String fullClassifier = "";
-
-        if (segments.length >= 5 && segments[4].trim().length() > 0) {
-            classifier = segments[4];
-            fullClassifier = CLASSIFIER_SEPARATOR + classifier;
-        } else {
-            classifier = null;
-        }
-
-        this.version = version;
-        this.type = type;
-        this.fullClassifier = fullClassifier;
-
     }
 
     public String getGroup() {

Modified: tomee/tomee/trunk/utils/openejb-provisionning/src/test/java/org/apache/openejb/resolver/maven/ParserTest.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/utils/openejb-provisionning/src/test/java/org/apache/openejb/resolver/maven/ParserTest.java?rev=1480878&r1=1480877&r2=1480878&view=diff
==============================================================================
--- tomee/tomee/trunk/utils/openejb-provisionning/src/test/java/org/apache/openejb/resolver/maven/ParserTest.java (original)
+++ tomee/tomee/trunk/utils/openejb-provisionning/src/test/java/org/apache/openejb/resolver/maven/ParserTest.java Fri May 10 04:44:20 2013
@@ -149,6 +149,93 @@ public class ParserTest {
             Assert.fail("Expected MalformedURLException");
         } catch (MalformedURLException pass) {
         }
+
+        try { //  too long
+            final Parser parser = new Parser(String.format("%s/%s/%s/%s/%s/%s", groupId, artifactId, version, type, classifier, classifier));
+
+            Assert.fail("Expected MalformedURLException");
+        } catch (MalformedURLException pass) {
+        }
+    }
+
+
+
+    @Test
+    public void testMavenCoordinates() throws Exception {
+
+        final String groupId = "orange";
+        final String artifactId = "yellow";
+        final String version = "1.0-SNAPSHOT";
+        final String classifier = "square";
+        final String type = "zip";
+
+        {
+            final Parser parser = new Parser(String.format("%s:%s", groupId, artifactId));
+
+            assertEquals(groupId, parser.getGroup());
+            assertEquals(artifactId, parser.getArtifact());
+            assertEquals("LATEST", parser.getVersion());
+            assertEquals("jar", parser.getType());
+            assertEquals(null, parser.getClassifier());
+        }
+
+        {
+            final Parser parser = new Parser(String.format("%s:%s:%s", groupId, artifactId, version));
+
+            assertEquals(groupId, parser.getGroup());
+            assertEquals(artifactId, parser.getArtifact());
+            assertEquals(version, parser.getVersion());
+            assertEquals("jar", parser.getType());
+            assertEquals(null, parser.getClassifier());
+        }
+
+        {
+            final Parser parser = new Parser(String.format("%s:%s:%s:%s", groupId, artifactId, type, version));
+
+            assertEquals(groupId, parser.getGroup());
+            assertEquals(artifactId, parser.getArtifact());
+            assertEquals(version, parser.getVersion());
+            assertEquals(type, parser.getType());
+            assertEquals(null, parser.getClassifier());
+        }
+
+        {
+            final Parser parser = new Parser(String.format("%s:%s:%s:%s:%s", groupId, artifactId, type, classifier, version));
+
+            assertEquals(groupId, parser.getGroup());
+            assertEquals(artifactId, parser.getArtifact());
+            assertEquals(version, parser.getVersion());
+            assertEquals(type, parser.getType());
+            assertEquals(classifier, parser.getClassifier());
+        }
+
+        try { //  no group
+            new Parser(String.format(":%s:::", artifactId));
+
+            Assert.fail("Expected MalformedURLException");
+        } catch (MalformedURLException pass) {
+        }
+
+        try { //  no artifact
+            new Parser(String.format("%s::::", groupId));
+
+            Assert.fail("Expected MalformedURLException");
+        } catch (MalformedURLException pass) {
+        }
+
+        try { //  no artifact
+            new Parser(String.format("%s::%s", groupId, version));
+
+            Assert.fail("Expected MalformedURLException");
+        } catch (MalformedURLException pass) {
+        }
+
+        try { //  too long
+            final Parser parser = new Parser(String.format("%s:%s:%s:%s:%s:%s", groupId, artifactId, version, type, classifier, classifier));
+
+            Assert.fail("Expected MalformedURLException");
+        } catch (MalformedURLException pass) {
+        }
     }
 
 }