You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@netbeans.apache.org by ma...@apache.org on 2021/11/07 08:50:11 UTC
[netbeans] branch master updated: m2 URL components need to be URL
decoded before being used to create the artifact
This is an automated email from the ASF dual-hosted git repository.
matthiasblaesing pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans.git
The following commit(s) were added to refs/heads/master by this push:
new 1950640 m2 URL components need to be URL decoded before being used to create the artifact
new 9dc09a1 Merge pull request #3305 from matthiasblaesing/mavenprotocolhandler_urlescapes
1950640 is described below
commit 1950640659375c9de8b96afd5c1dc6a1a4885c27
Author: Matthias Bläsing <mb...@doppel-helix.eu>
AuthorDate: Fri Nov 5 22:51:09 2021 +0100
m2 URL components need to be URL decoded before being used to create the artifact
Consider this URL: m2:/com.dukescript.nbjavac:nb-javac:jdk-17%2B35:jar
it refers to the artifact with the components:
groupId: com.dukescript.nbjavac
artifactId: nb-javac
version: jdk-17+35
type: jar
In the version string jdk-17%2B35, the + character is URL encoded and
needs to be decoded before used in the maven resolver to create the
artifact.
---
.travis.yml | 2 +-
java/maven.embedder/nbproject/project.xml | 14 ++++--
.../maven/embedder/impl/MavenProtocolHandler.java | 47 ++++++++++++++-----
.../embedder/impl/MavenProtocolHandlerTest.java | 53 ++++++++++++++++++++++
.../maven/embedder/impl/NbRepositoryCacheTest.java | 4 +-
5 files changed, 101 insertions(+), 19 deletions(-)
diff --git a/.travis.yml b/.travis.yml
index 904f8c6..e673cfa 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -390,7 +390,7 @@ matrix:
- ant $OPTS -f java/junit.ant.ui test
- ant $OPTS -f java/lib.nbjavac test
- ant $OPTS -f java/maven test
- #- ant $OPTS -f java/maven.embedder test
+ - ant $OPTS -f java/maven.embedder test
- ant $OPTS -f java/maven.grammar test
#- ant $OPTS -f java/maven.hints test
#- ant $OPTS -f java/maven.htmlui test
diff --git a/java/maven.embedder/nbproject/project.xml b/java/maven.embedder/nbproject/project.xml
index 65554c9..ff4513c 100644
--- a/java/maven.embedder/nbproject/project.xml
+++ b/java/maven.embedder/nbproject/project.xml
@@ -110,6 +110,10 @@
<test-type>
<name>unit</name>
<test-dependency>
+ <code-name-base>org.netbeans.bootstrap</code-name-base>
+ <compile-dependency/>
+ </test-dependency>
+ <test-dependency>
<code-name-base>org.netbeans.libs.junit4</code-name-base>
<compile-dependency/>
</test-dependency>
@@ -125,12 +129,12 @@
<code-name-base>org.netbeans.modules.projectapi.nb</code-name-base>
</test-dependency>
<test-dependency>
- <code-name-base>org.openide.util.ui</code-name-base>
+ <code-name-base>org.openide.util.lookup</code-name-base>
<compile-dependency/>
<test/>
</test-dependency>
<test-dependency>
- <code-name-base>org.openide.util.lookup</code-name-base>
+ <code-name-base>org.openide.util.ui</code-name-base>
<compile-dependency/>
<test/>
</test-dependency>
@@ -180,7 +184,7 @@
<!-- XXX <subpackages> not permitted by schema -->
<package>javax.inject</package>
<package>com.google.inject</package>
- <package>com.google.common.base</package>
+ <package>com.google.common.base</package>
<package>org.apache.maven</package>
<package>org.apache.maven.artifact</package>
<package>org.apache.maven.artifact.factory</package>
@@ -264,7 +268,7 @@
<package>org.sonatype.plexus.components.cipher</package>
<package>org.sonatype.plexus.components.sec.dispatcher</package>
<package>org.slf4j</package>
- <package>org.slf4j.impl</package>
+ <package>org.slf4j.impl</package>
<package>org.apache.maven.wagon.shared.http4</package>
<package>org.apache.maven.wagon.providers.http.wagon.shared</package>
</friend-packages>
@@ -277,7 +281,7 @@
<binary-origin>external/jdom-1.0.jar</binary-origin>
</class-path-extension>
<!-- zipinfo -1 .../apache-maven-*-bin.zip | sort | perl -n -e 'if (m!^apache-maven-.+/((lib|boot)/.+.jar)$!) {print " <class-path-extension>\n <runtime-relative-path>../maven/$1</runtime-relative-path>\n </class-path-extension>\n"}' -->
- <class-path-extension>
+ <class-path-extension>
<runtime-relative-path>../maven/boot/plexus-classworlds-2.6.0.jar</runtime-relative-path>
</class-path-extension>
<class-path-extension>
diff --git a/java/maven.embedder/src/org/netbeans/modules/maven/embedder/impl/MavenProtocolHandler.java b/java/maven.embedder/src/org/netbeans/modules/maven/embedder/impl/MavenProtocolHandler.java
index d03e114..d9a7332 100644
--- a/java/maven.embedder/src/org/netbeans/modules/maven/embedder/impl/MavenProtocolHandler.java
+++ b/java/maven.embedder/src/org/netbeans/modules/maven/embedder/impl/MavenProtocolHandler.java
@@ -21,14 +21,20 @@ package org.netbeans.modules.maven.embedder.impl;
import java.io.File;
import java.io.IOException;
+import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLConnection;
+import java.net.URLDecoder;
import java.net.URLStreamHandler;
+import java.util.Arrays;
import java.util.Collections;
import java.util.logging.Level;
import java.util.logging.Logger;
+import java.util.stream.Collectors;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
+import org.apache.maven.artifact.resolver.ArtifactResolutionException;
import org.apache.maven.repository.RepositorySystem;
import org.netbeans.modules.maven.embedder.EmbedderFactory;
import org.netbeans.modules.maven.embedder.MavenEmbedder;
@@ -50,14 +56,33 @@ import org.openide.util.BaseUtilities;
public class MavenProtocolHandler extends URLStreamHandler {
protected @Override URLConnection openConnection(URL u) throws IOException {
+ MavenEmbedder online = EmbedderFactory.getOnlineEmbedder();
+ Artifact a = resolveM2Url(u, online);
+ try {
+ online.resolve(a, Collections.<ArtifactRepository>singletonList(online.createRemoteRepository(RepositorySystem.DEFAULT_REMOTE_REPO_URL, RepositorySystem.DEFAULT_REMOTE_REPO_ID)), online.getLocalRepository());
+ } catch (ArtifactNotFoundException | ArtifactResolutionException | RuntimeException x) {
+ throw new IOException(u + ": " + x, x);
+ }
+ File f = a.getFile();
+ if (!f.isFile()) {
+ throw new IOException("failed to download " + u);
+ }
+ Logger.getLogger(MavenProtocolHandler.class.getName()).log(Level.FINE, "resolved {0} -> {1}", new Object[] {u, f});
+ return BaseUtilities.toURI(f).toURL().openConnection();
+ }
+
+ static Artifact resolveM2Url(URL u, MavenEmbedder online) throws IOException {
String path = u.getPath();
if (!path.startsWith("/")) {
throw new IOException(path);
}
String stuff = path.substring(1);
- MavenEmbedder online = EmbedderFactory.getOnlineEmbedder();
+ String[] pieces = Arrays.stream(stuff.split(":"))
+ .map(MavenProtocolHandler::urlDecode)
+ .collect(Collectors.toList())
+ .toArray(new String[0])
+ ;
Artifact a;
- String[] pieces = stuff.split(":");
if (pieces.length == 4) {
a = online.createArtifact(pieces[0], pieces[1], pieces[2], pieces[3]);
} else if (pieces.length == 5) {
@@ -65,17 +90,15 @@ public class MavenProtocolHandler extends URLStreamHandler {
} else {
throw new IOException(stuff);
}
+ return a;
+ }
+
+ private static String urlDecode(String input) {
try {
- online.resolve(a, Collections.<ArtifactRepository>singletonList(online.createRemoteRepository(RepositorySystem.DEFAULT_REMOTE_REPO_URL, RepositorySystem.DEFAULT_REMOTE_REPO_ID)), online.getLocalRepository());
- } catch (Exception x) {
- throw new IOException(stuff + ": " + x, x);
+ return URLDecoder.decode(input, "UTF-8");
+ } catch (UnsupportedEncodingException ex) {
+ // This can be cleaned up, once JDK 9+ becomes baseline
+ throw new RuntimeException(ex);
}
- File f = a.getFile();
- if (!f.isFile()) {
- throw new IOException("failed to download " + stuff);
- }
- Logger.getLogger(MavenProtocolHandler.class.getName()).log(Level.FINE, "resolved {0} -> {1}", new Object[] {stuff, f});
- return BaseUtilities.toURI(f).toURL().openConnection();
}
-
}
diff --git a/java/maven.embedder/test/unit/src/org/netbeans/modules/maven/embedder/impl/MavenProtocolHandlerTest.java b/java/maven.embedder/test/unit/src/org/netbeans/modules/maven/embedder/impl/MavenProtocolHandlerTest.java
new file mode 100644
index 0000000..9b0fdaa
--- /dev/null
+++ b/java/maven.embedder/test/unit/src/org/netbeans/modules/maven/embedder/impl/MavenProtocolHandlerTest.java
@@ -0,0 +1,53 @@
+/*
+ * 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.netbeans.modules.maven.embedder.impl;
+
+import java.io.IOException;
+import java.net.URL;
+import org.apache.maven.artifact.Artifact;
+import org.junit.Test;
+import org.netbeans.junit.NbTestCase;
+import org.netbeans.modules.maven.embedder.EmbedderFactory;
+import org.netbeans.modules.maven.embedder.MavenEmbedder;
+
+
+public class MavenProtocolHandlerTest extends NbTestCase {
+
+ public MavenProtocolHandlerTest(String name) {
+ super(name);
+ }
+
+ @Test
+ public void testResolveM2Url() throws IOException {
+ org.netbeans.ProxyURLStreamHandlerFactory.register();
+ MavenEmbedder online = EmbedderFactory.getOnlineEmbedder();
+ Artifact a = MavenProtocolHandler.resolveM2Url(new URL("m2:/org.openjfx:javafx-base:17:jar:linux"), online);
+ assertEquals("org.openjfx", a.getGroupId());
+ assertEquals("javafx-base", a.getArtifactId());
+ assertEquals("17", a.getVersion());
+ assertEquals("jar", a.getType());
+ assertEquals("linux", a.getClassifier());
+ Artifact b = MavenProtocolHandler.resolveM2Url(new URL("m2:/com.dukescript.nbjavac:nb-javac:jdk-17%2B35:jar"), online);
+ assertEquals("com.dukescript.nbjavac", b.getGroupId());
+ assertEquals("nb-javac", b.getArtifactId());
+ assertEquals("jdk-17+35", b.getVersion());
+ assertEquals("jar", b.getType());
+ }
+
+}
diff --git a/java/maven.embedder/test/unit/src/org/netbeans/modules/maven/embedder/impl/NbRepositoryCacheTest.java b/java/maven.embedder/test/unit/src/org/netbeans/modules/maven/embedder/impl/NbRepositoryCacheTest.java
index 050097b..a887ba6 100644
--- a/java/maven.embedder/test/unit/src/org/netbeans/modules/maven/embedder/impl/NbRepositoryCacheTest.java
+++ b/java/maven.embedder/test/unit/src/org/netbeans/modules/maven/embedder/impl/NbRepositoryCacheTest.java
@@ -20,19 +20,21 @@ package org.netbeans.modules.maven.embedder.impl;
import org.junit.Test;
import static org.junit.Assert.*;
+import org.junit.Ignore;
/**
*
* @author mkleint
*/
public class NbRepositoryCacheTest {
-
+
public NbRepositoryCacheTest() {
}
/**
*/
@Test
+ @Ignore("Classpath is not setup correctly for test - needs investigation")
public void testConstants() throws Exception {
Class cl = Class.forName("org.eclipse.aether.internal.impl.DataPool");
assertNotNull("The constant value has changed most likely", cl);
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@netbeans.apache.org
For additional commands, e-mail: commits-help@netbeans.apache.org
For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists