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