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 <mblaes...@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-unsubscr...@netbeans.apache.org For additional commands, e-mail: commits-h...@netbeans.apache.org For further information about the NetBeans mailing lists, visit: https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists