You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by dj...@apache.org on 2011/04/08 01:01:44 UTC

svn commit: r1090056 - in /karaf/trunk: main/src/main/java/org/apache/karaf/main/ tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/features/ tooling/karaf-maven-plugin/src/test/java/org/apache/karaf/tooling/features/

Author: djencks
Date: Thu Apr  7 23:01:43 2011
New Revision: 1090056

URL: http://svn.apache.org/viewvc?rev=1090056&view=rev
Log:
KARAF-424 Better pax mvn url to aether artifact uri conversion in a utility class

Added:
    karaf/trunk/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/features/MvnUrlUtil.java   (with props)
    karaf/trunk/tooling/karaf-maven-plugin/src/test/java/org/apache/karaf/tooling/features/MvnUrlUtilTest.java   (with props)
Modified:
    karaf/trunk/main/src/main/java/org/apache/karaf/main/Main.java
    karaf/trunk/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/features/GenerateFeaturesXmlMojo2.java
    karaf/trunk/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/features/InstallKarsMojo.java

Modified: karaf/trunk/main/src/main/java/org/apache/karaf/main/Main.java
URL: http://svn.apache.org/viewvc/karaf/trunk/main/src/main/java/org/apache/karaf/main/Main.java?rev=1090056&r1=1090055&r2=1090056&view=diff
==============================================================================
--- karaf/trunk/main/src/main/java/org/apache/karaf/main/Main.java (original)
+++ karaf/trunk/main/src/main/java/org/apache/karaf/main/Main.java Thu Apr  7 23:01:43 2011
@@ -1073,46 +1073,55 @@ public class Main {
         return null;
     }
 
+    private static final Pattern mvnPattern = Pattern.compile("mvn:([^/ ]+)/([^/ ]+)/([^/ ]*)(/([^/ ]+)(/([^/ ]+))?)?");
+
     /**
      * Returns a path for an srtifact.
      * Input: path (no ':') returns path
      * Input: mvn:<groupId>/<artifactId>/<version>/<type>/<classifier> converts to default repo location path
-     * Input:  <groupId>:<artifactId>:<version>:<type>:<classifier> converts to default repo location path
+//     * Input:  <groupId>:<artifactId>:<version>:<type>:<classifier> converts to default repo location path
      * type and classifier are optional.
      *
      *
      * @param name input artifact info
      * @return path as supplied or a default maven repo path
      */
-    private static String fromMaven(String name) {
-        if (name.indexOf(':') == -1) {
+    static String fromMaven(String name) {
+        Matcher m = mvnPattern.matcher(name);
+        if (!m.matches()) {
             return name;
         }
-        int firstBit = 0;
-        if (name.startsWith("mvn:")) {
-            firstBit = 1;
-        }
-        String[] bits = name.split("[:/]");
-        StringBuilder b = new StringBuilder(bits[firstBit]);
+        StringBuilder b = new StringBuilder();
+        b.append(m.group(1));
         for (int i = 0; i < b.length(); i++) {
             if (b.charAt(i) == '.') {
                 b.setCharAt(i, '/');
             }
         }
-        b.append('/').append(bits[firstBit + 1]); //artifactId
-        b.append('/').append(bits[firstBit + 2]); //version
-        b.append('/').append(bits[firstBit + 1]).append('-').append(bits[firstBit + 2]);
-        if (bits.length == firstBit + 5 && !bits[firstBit + 4].isEmpty()) {
-            b.append('-').append(bits[firstBit + 4]); //classifier
-        }
-        if (bits.length >= firstBit + 4 && !bits[firstBit + 3].isEmpty()) {
-            b.append('.').append(bits[firstBit + 3]);
+        b.append("/");//groupId
+        String artifactId = m.group(2);
+        String version = m.group(3);
+        String extension = m.group(5);
+        String classifier = m.group(7);
+        b.append(artifactId).append("/");//artifactId
+        b.append(version).append("/");//version
+        b.append(artifactId).append("-").append(version);
+        if (present(classifier)) {
+            b.append("-").append(classifier);
         } else {
-            b.append(".jar");
+            if (present(extension)) {
+                b.append(".").append(extension);
+            } else {
+                b.append(".jar");
+            }
         }
         return b.toString();
     }
 
+    private static boolean present(String part) {
+        return part != null && !part.isEmpty();
+    }
+
     private static void findJars(File dir, ArrayList<File> jars) {
         for (File file : dir.listFiles()) {
             if (file.isDirectory()) {

Modified: karaf/trunk/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/features/GenerateFeaturesXmlMojo2.java
URL: http://svn.apache.org/viewvc/karaf/trunk/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/features/GenerateFeaturesXmlMojo2.java?rev=1090056&r1=1090055&r2=1090056&view=diff
==============================================================================
--- karaf/trunk/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/features/GenerateFeaturesXmlMojo2.java (original)
+++ karaf/trunk/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/features/GenerateFeaturesXmlMojo2.java Thu Apr  7 23:01:43 2011
@@ -282,12 +282,7 @@ public class GenerateFeaturesXmlMojo2 ex
                     feature.getFeature().add(dependency);
                 }
             } else {
-                String bundleName;
-                if (artifact.getExtension().equals("jar")) {
-                    bundleName = String.format("mvn:%s/%s/%s", artifact.getGroupId(), artifact.getArtifactId(), artifact.getBaseVersion());
-                } else {
-                    bundleName = String.format("mvn:%s/%s/%s/%s", artifact.getGroupId(), artifact.getArtifactId(), artifact.getBaseVersion(), artifact.getExtension());
-                }
+                String bundleName = MvnUrlUtil.artifactToMvn(artifact);
                 Bundle bundle = objectFactory.createBundle();
                 bundle.setLocation(bundleName);
                 if ("runtime".equals(entry.getValue())) {

Modified: karaf/trunk/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/features/InstallKarsMojo.java
URL: http://svn.apache.org/viewvc/karaf/trunk/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/features/InstallKarsMojo.java?rev=1090056&r1=1090055&r2=1090056&view=diff
==============================================================================
--- karaf/trunk/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/features/InstallKarsMojo.java (original)
+++ karaf/trunk/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/features/InstallKarsMojo.java Thu Apr  7 23:01:43 2011
@@ -46,6 +46,7 @@ import org.apache.karaf.features.interna
 import org.apache.karaf.features.internal.model.Features;
 import org.apache.karaf.features.internal.model.Feature;
 import org.apache.karaf.features.internal.model.JaxbUtil;
+import org.apache.maven.RepositoryUtils;
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
 import org.apache.maven.plugin.MojoExecutionException;
@@ -192,16 +193,12 @@ public class InstallKarsMojo extends Moj
                 }
             }
             if ("features".equals(artifact.getClassifier()) && acceptScope(artifact)) {
-                String uri = String.format("mvn:%s/%s/%s/%s/%s", artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion(), artifact.getType(), artifact.getClassifier());
+                String uri = MvnUrlUtil.artifactToMvn(artifact);
 
-                try {
-                    featuresService.addRepository(URI.create(uri));
-                } catch (Exception e) {
-                    buf.append("Could not install feature: ").append(artifact.toString()).append("\n");
-                    buf.append(e.getMessage()).append("\n\n");
-                }
                 File source = artifact.getFile();
-                File target = new File(systemDirectory + "/" + fromMaven(artifact.getGroupId() + ":" + artifact.getArtifactId() + ":" + artifact.getVersion() + ":" + artifact.getType() + ":" + artifact.getClassifier()));
+                DefaultRepositoryLayout layout = new DefaultRepositoryLayout();
+
+                File target = new File(systemDirectory + "/" + layout.pathOf(artifact));
                 if (!target.exists()) {
                     target.getParentFile().mkdirs();
                     try {
@@ -218,12 +215,18 @@ public class InstallKarsMojo extends Moj
                     }
 
                 }
+                try {
+                    featuresService.addRepository(URI.create(uri));
+                } catch (Exception e) {
+                    buf.append("Could not install feature: ").append(artifact.toString()).append("\n");
+                    buf.append(e.getMessage()).append("\n\n");
+                }
             }
         }
 
         //install bundles listed in startup properties that weren't in kars into the system dir
         for (String key: startupProperties.keySet()) {
-            String path = fromMaven(key);
+            String path = MvnUrlUtil.pathFromMaven(key);
             File target = new File(systemDirectory + "/" + path);
             if (!target.exists()) {
                 File source = resolve(key);
@@ -263,54 +266,11 @@ public class InstallKarsMojo extends Moj
         return "compile".equals(artifact.getScope()) || "runtime".equals(artifact.getScope());
     }
 
-    /**
-     * Copied from Main class
-     * Returns a path for an srtifact.
-     * Input: path (no ':') returns path
-     * Input: mvn:<groupId>/<artifactId>/<version>/<type>/<classifier> converts to default repo location path
-     * Input:  <groupId>:<artifactId>:<version>:<type>:<classifier> converts to default repo location path
-     * type and classifier are optional.
-     *
-     *
-     * @param name input artifact info
-     * @return path as supplied or a default maven repo path
-     */
-    private static String fromMaven(String name) {
-        if (name.indexOf(':') == -1) {
-            return name;
-        }
-        int firstBit = 0;
-        if (name.startsWith("mvn:")) {
-            firstBit = 1;
-        }
-        String[] bits = name.split("[:/]");
-        StringBuilder b = new StringBuilder(bits[firstBit]);
-        for (int i = 0; i < b.length(); i++) {
-            if (b.charAt(i) == '.') {
-                b.setCharAt(i, '/');
-            }
-        }
-        b.append('/').append(bits[firstBit + 1]); //artifactId
-        b.append('/').append(bits[firstBit + 2]); //version
-        b.append('/').append(bits[firstBit + 1]).append('-').append(bits[firstBit + 2]);
-        if (bits.length == firstBit + 5 && !bits[firstBit + 4].isEmpty()) {
-            b.append('-').append(bits[firstBit + 4]); //classifier
-        }
-        if (bits.length >= firstBit + 4 && !bits[firstBit + 3].isEmpty()) {
-            b.append('.').append(bits[firstBit + 3]);
-        } else {
-            b.append(".jar");
-        }
-        return b.toString();
-    }
 
     public File resolve(String id) {
-        if (id.startsWith("mvn:")) {
-            id = id.substring("mvn:".length()).replaceAll("/", ":");
-        }
+        id = MvnUrlUtil.mvnToAether(id);
         ArtifactRequest request = new ArtifactRequest();
-        request.setArtifact(
-                new DefaultArtifact(id));
+        request.setArtifact(new DefaultArtifact(id));
         request.setRepositories(remoteRepos);
 
         getLog().debug("Resolving artifact " + id +
@@ -361,10 +321,7 @@ public class InstallKarsMojo extends Moj
                 getLog().info("Installing feature to system and startup.properties");
                 File repoFile;
                 if (uri.toString().startsWith("mvn:")) {
-                    DefaultRepositoryLayout layout = new DefaultRepositoryLayout();
-                    String[] bits = uri.toString().split("[:/]");
-                    Artifact artifact = factory.createArtifactWithClassifier(bits[1], bits[2], bits[3], bits[4], bits[5]);
-                    String featuresPath = repoPath + "/" + layout.pathOf(artifact);
+                    String featuresPath = repoPath + "/" + MvnUrlUtil.pathFromMaven(uri.toString());
                     repoFile = new File(featuresPath);
                 } else {
                     repoFile = new File(uri);

Added: karaf/trunk/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/features/MvnUrlUtil.java
URL: http://svn.apache.org/viewvc/karaf/trunk/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/features/MvnUrlUtil.java?rev=1090056&view=auto
==============================================================================
--- karaf/trunk/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/features/MvnUrlUtil.java (added)
+++ karaf/trunk/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/features/MvnUrlUtil.java Thu Apr  7 23:01:43 2011
@@ -0,0 +1,151 @@
+/*
+ * 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.karaf.tooling.features;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.maven.RepositoryUtils;
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
+import org.sonatype.aether.util.artifact.DefaultArtifact;
+
+/**
+ * Methods to convert between
+ * pax mvn format: mvn-uri := 'mvn:' [ repository-url '!' ] group-id '/' artifact-id [ '/' [version] [ '/' [type] [ '/' classifier ] ] ] ]
+ * aether coordinate format: <groupId>:<artifactId>[:<extension>[:<classifier>]]:<version>
+ * and repository paths
+ *
+ * N.B. we do not handle repository-url in mvn urls.
+ * N.B. version is required in mvn urls.
+ *
+ * @version $Rev:$ $Date:$
+ */
+public class MvnUrlUtil {
+
+    private static final DefaultRepositoryLayout layout = new DefaultRepositoryLayout();
+    private static final Pattern aetherPatterh = Pattern.compile( "([^: ]+):([^: ]+)(:([^: ]*)(:([^: ]+))?)?:([^: ]+)" );
+    private static final Pattern mvnPattern = Pattern.compile( "mvn:([^/ ]+)/([^/ ]+)/([^/ ]*)(/([^/ ]+)(/([^/ ]+))?)?" );
+
+    static String mvnToAether(String name) {
+        Matcher m = mvnPattern.matcher(name);
+        if (!m.matches()) {
+            return name;
+        }
+        StringBuilder b = new StringBuilder();
+        b.append(m.group(1)).append(":");//groupId
+        b.append(m.group(2)).append(":");//artifactId
+        String extension = m.group(5);
+        String classifier = m.group(7);
+        if (present(classifier)) {
+            if (present(extension)) {
+                b.append(extension).append(":");
+            } else {
+                b.append("jar:");
+            }
+            b.append(classifier).append(":");
+        } else {
+            if (present(extension) && !"jar".equals(extension)) {
+                b.append(extension).append(":");
+            }
+        }
+        b.append(m.group(3));
+        return b.toString();
+    }
+
+    private static boolean present(String part) {
+        return part != null && !part.isEmpty();
+    }
+
+    static String aetherToMvn(String name) {
+        Matcher m = aetherPatterh.matcher(name);
+        if (!m.matches()) {
+            return name;
+        }
+        StringBuilder b = new StringBuilder("mvn:");
+        b.append(m.group(1)).append("/");//groupId
+        b.append(m.group(2)).append("/");//artifactId
+        b.append(m.group(7));//version
+        String extension = m.group(4);
+        String classifier = m.group(6);
+        if (present(classifier)) {
+            if (present(extension)) {
+                b.append("/").append(extension);
+            } else {
+                b.append("/jar");
+            }
+            b.append("/").append(classifier);
+        } else if (present(extension)) {
+            b.append("/").append(extension);
+        }
+
+        return b.toString();
+    }
+
+    /**
+     * similar to a Main class method
+     * Returns a path for an srtifact.
+     * Input: path (no ':') returns path
+     * Input: mvn:<groupId>/<artifactId>/<version>/<type>/<classifier> converts to default repo location path
+     * Input:  <groupId>:<artifactId>:<type>:<classifier>:<version>:<type>:<classifier> converts to default repo location path
+     * type and classifier are optional.
+     *
+     *
+     * @param name input artifact info
+     * @return path as supplied or a default maven repo path
+     */
+    static String pathFromMaven(String name) {
+        if (name.indexOf(':') == -1) {
+            return name;
+        }
+        name = mvnToAether(name);
+        return pathFromAether(name);
+    }
+
+    static String pathFromAether(String name) {
+        DefaultArtifact artifact = new DefaultArtifact(name);
+        Artifact mavenArtifact = RepositoryUtils.toArtifact(artifact);
+        return layout.pathOf(mavenArtifact);
+    }
+
+    static String artifactToMvn(Artifact artifact) {
+        return  artifactToMvn(RepositoryUtils.toArtifact(artifact));
+    }
+
+    static String artifactToMvn(org.sonatype.aether.artifact.Artifact artifact) {
+        String bundleName;
+        if (artifact.getExtension().equals("jar") && isEmpty(artifact.getClassifier())) {
+            bundleName = String.format("mvn:%s/%s/%s", artifact.getGroupId(), artifact.getArtifactId(), artifact.getBaseVersion());
+        } else {
+            if (isEmpty(artifact.getClassifier())) {
+                bundleName = String.format("mvn:%s/%s/%s/%s", artifact.getGroupId(), artifact.getArtifactId(), artifact.getBaseVersion(), artifact.getExtension());
+            } else {
+                bundleName = String.format("mvn:%s/%s/%s/%s/%s", artifact.getGroupId(), artifact.getArtifactId(), artifact.getBaseVersion(), artifact.getExtension(), artifact.getClassifier());
+            }
+        }
+        return bundleName;
+    }
+
+    private static boolean isEmpty(String classifier) {
+        return classifier == null || classifier.length() == 0;
+    }
+
+}

Propchange: karaf/trunk/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/features/MvnUrlUtil.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: karaf/trunk/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/features/MvnUrlUtil.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: karaf/trunk/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/features/MvnUrlUtil.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: karaf/trunk/tooling/karaf-maven-plugin/src/test/java/org/apache/karaf/tooling/features/MvnUrlUtilTest.java
URL: http://svn.apache.org/viewvc/karaf/trunk/tooling/karaf-maven-plugin/src/test/java/org/apache/karaf/tooling/features/MvnUrlUtilTest.java?rev=1090056&view=auto
==============================================================================
--- karaf/trunk/tooling/karaf-maven-plugin/src/test/java/org/apache/karaf/tooling/features/MvnUrlUtilTest.java (added)
+++ karaf/trunk/tooling/karaf-maven-plugin/src/test/java/org/apache/karaf/tooling/features/MvnUrlUtilTest.java Thu Apr  7 23:01:43 2011
@@ -0,0 +1,74 @@
+/*
+ * 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.karaf.tooling.features;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.sonatype.aether.util.artifact.DefaultArtifact;
+
+import static org.apache.karaf.tooling.features.MvnUrlUtil.aetherToMvn;
+import static org.apache.karaf.tooling.features.MvnUrlUtil.artifactToMvn;
+import static org.apache.karaf.tooling.features.MvnUrlUtil.mvnToAether;
+import static org.apache.karaf.tooling.features.MvnUrlUtil.pathFromAether;
+import static org.apache.karaf.tooling.features.MvnUrlUtil.pathFromMaven;
+import static org.junit.Assert.assertEquals;
+
+/**
+ * @version $Rev:$ $Date:$
+ */
+public class MvnUrlUtilTest {
+
+    @Test
+    public void testMvnToAether() throws Exception {
+        assertEquals("org.foo:org.foo.bar:1.0-SNAPSHOT", mvnToAether("mvn:org.foo/org.foo.bar/1.0-SNAPSHOT"));
+        assertEquals("org.foo:org.foo.bar:kar:1.0-SNAPSHOT", mvnToAether("mvn:org.foo/org.foo.bar/1.0-SNAPSHOT/kar"));
+        assertEquals("org.foo:org.foo.bar:xml:features:1.0-SNAPSHOT", mvnToAether("mvn:org.foo/org.foo.bar/1.0-SNAPSHOT/xml/features"));
+    }
+
+    @Test
+    public void testAetherToMvn() throws Exception {
+        assertEquals("mvn:org.foo/org.foo.bar/1.0-SNAPSHOT", aetherToMvn("org.foo:org.foo.bar:1.0-SNAPSHOT"));
+        assertEquals("mvn:org.foo/org.foo.bar/1.0-SNAPSHOT/kar", aetherToMvn("org.foo:org.foo.bar:kar:1.0-SNAPSHOT"));
+        assertEquals("mvn:org.foo/org.foo.bar/1.0-SNAPSHOT/xml/features", aetherToMvn("org.foo:org.foo.bar:xml:features:1.0-SNAPSHOT"));
+    }
+
+    @Test
+    public void testPathFromMvn() throws Exception {
+        assertEquals("org/foo/org.foo.bar/1.0-SNAPSHOT/org.foo.bar-1.0-SNAPSHOT.jar", pathFromMaven("mvn:org.foo/org.foo.bar/1.0-SNAPSHOT"));
+        assertEquals("org/foo/org.foo.bar/1.0-SNAPSHOT/org.foo.bar-1.0-SNAPSHOT.kar", pathFromMaven("mvn:org.foo/org.foo.bar/1.0-SNAPSHOT/kar"));
+        assertEquals("org/foo/org.foo.bar/1.0-SNAPSHOT/org.foo.bar-1.0-SNAPSHOT-features.xml", pathFromMaven("mvn:org.foo/org.foo.bar/1.0-SNAPSHOT/xml/features"));
+    }
+
+    @Test
+    public void testPathFromAether() throws Exception {
+        assertEquals("org/foo/org.foo.bar/1.0-SNAPSHOT/org.foo.bar-1.0-SNAPSHOT.jar", pathFromAether("org.foo:org.foo.bar:1.0-SNAPSHOT"));
+        assertEquals("org/foo/org.foo.bar/1.0-SNAPSHOT/org.foo.bar-1.0-SNAPSHOT.kar", pathFromAether("org.foo:org.foo.bar:kar:1.0-SNAPSHOT"));
+        assertEquals("org/foo/org.foo.bar/1.0-SNAPSHOT/org.foo.bar-1.0-SNAPSHOT-features.xml", pathFromAether("org.foo:org.foo.bar:xml:features:1.0-SNAPSHOT"));
+    }
+
+    @Test
+    public void testArtifactToMvn() throws Exception {
+        assertEquals("mvn:org.foo/org.foo.bar/1.0-SNAPSHOT", artifactToMvn(new DefaultArtifact("org.foo:org.foo.bar:1.0-SNAPSHOT")));
+        assertEquals("mvn:org.foo/org.foo.bar/1.0-SNAPSHOT/kar", artifactToMvn(new DefaultArtifact("org.foo:org.foo.bar:kar:1.0-SNAPSHOT")));
+        assertEquals("mvn:org.foo/org.foo.bar/1.0-SNAPSHOT/xml/features", artifactToMvn(new DefaultArtifact("org.foo:org.foo.bar:xml:features:1.0-SNAPSHOT")));
+    }
+
+}

Propchange: karaf/trunk/tooling/karaf-maven-plugin/src/test/java/org/apache/karaf/tooling/features/MvnUrlUtilTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: karaf/trunk/tooling/karaf-maven-plugin/src/test/java/org/apache/karaf/tooling/features/MvnUrlUtilTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: karaf/trunk/tooling/karaf-maven-plugin/src/test/java/org/apache/karaf/tooling/features/MvnUrlUtilTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain