From b96970ef8cab5a0f574878b53dba6f1b90ee6c8a Mon Sep 17 00:00:00 2001 From: Svata Dedic Date: Wed, 25 May 2022 10:23:31 +0200 Subject: [PATCH] Initial implementation of Project Dependency API --- ide/project.dependency/Readme.md | 14 + .../project/dependency/ArtifactSpec.java | 193 +++++++ .../project/dependency/Bundle.properties | 1 + .../project/dependency/Dependency.java | 84 +++ .../project/dependency/DependencyResult.java | 68 +++ .../dependency/ProjectDependencies.java | 53 ++ .../dependency/ProjectOperationException.java | 78 +++ .../modules/project/dependency/Scope.java | 86 +++ .../modules/project/dependency/Scopes.java | 86 +++ .../project/dependency/SourceLocation.java | 105 ++++ .../ProjectDependenciesImplementation.java | 46 ++ java/java.lsp.server/vscode/package-lock.json | 139 +++-- java/java.lsp.server/vscode/package.json | 3 + java/maven.embedder/nbproject/project.xml | 3 + .../maven/embedder/DependencyTreeFactory.java | 47 +- java/maven.graph/nbproject/project.xml | 21 + java/maven/build.xml | 7 + java/maven/manifest.mf | 2 +- java/maven/nbproject/project.properties | 1 + java/maven/nbproject/project.xml | 24 + .../MavenDependenciesImplementation.java | 491 ++++++++++++++++++ .../golden/testCompileDependencies | 5 + .../golden/testRuntimeDependencies | 7 + .../grp/annotation/12.6/_remote.repositories | 4 + .../12.6/annotation-12.6.jar.lastUpdated | 4 + .../META-INF/MANIFEST.MF | 6 + .../nbtest.grp/annotation/pom.properties | 5 + .../maven/nbtest.grp/annotation/pom.xml | 33 ++ .../grp/annotation/12.6/annotation-12.6.pom | 33 ++ .../12.6/annotation-12.6.pom.lastUpdated | 4 + .../grp/annotation/maven-metadata-local.xml | 12 + .../grp/test-lib/12.6/_remote.repositories | 4 + .../test-lib-12.6.jardir/META-INF/MANIFEST.MF | 6 + .../maven/nbtest.grp/test-lib/pom.properties | 5 + .../maven/nbtest.grp/test-lib/pom.xml | 57 ++ .../repo/grp/test-lib/12.6/test-lib-12.6.pom | 57 ++ .../grp/test-lib/maven-metadata-local.xml | 12 + .../grp/test-lib3/12.6/_remote.repositories | 4 + .../META-INF/MANIFEST.MF | 6 + .../maven/nbtest.grp/test-lib3/pom.properties | 5 + .../maven/nbtest.grp/test-lib3/pom.xml | 32 ++ .../grp/test-lib3/12.6/test-lib3-12.6.pom | 32 ++ .../grp/test-lib3/maven-metadata-local.xml | 12 + .../grp/test-lib4/12.6/_remote.repositories | 4 + .../META-INF/MANIFEST.MF | 6 + .../maven/nbtest.grp/test-lib4/pom.properties | 5 + .../maven/nbtest.grp/test-lib4/pom.xml | 32 ++ .../grp/test-lib4/12.6/test-lib4-12.6.pom | 32 ++ .../grp/test-lib4/maven-metadata-local.xml | 12 + .../test-processor/12.6/_remote.repositories | 4 + .../META-INF/MANIFEST.MF | 6 + .../nbtest.grp/test-processor/pom.properties | 5 + .../maven/nbtest.grp/test-processor/pom.xml | 45 ++ .../12.6/test-processor-12.6.pom | 45 ++ .../test-processor/maven-metadata-local.xml | 12 + .../dependencies/src/annotation/pom.xml | 33 ++ .../src/annotation/src/main/java/README | 1 + .../pom-with-processor-broken.xml | 77 +++ .../src/simpleProject/pom-with-processor.xml | 77 +++ .../pom-with-separateProcessors.xml | 111 ++++ .../dependencies/src/simpleProject/pom.xml | 65 +++ .../src/simpleProject/src/main/java/README | 1 + .../src/simpleProject/src/test/java/README | 1 + .../dependencies/src/test-lib/pom.xml | 57 ++ .../src/test-lib/src/main/java/README | 1 + .../dependencies/src/test-lib3/pom.xml | 32 ++ .../src/test-lib3/src/main/java/README | 1 + .../dependencies/src/test-lib4/pom.xml | 32 ++ .../src/test-lib4/src/main/java/README | 1 + .../dependencies/src/test-processor/pom.xml | 45 ++ .../MavenDependenciesImplementationTest.java | 195 +++++++ nbbuild/cluster.properties | 1 + 72 files changed, 2752 insertions(+), 84 deletions(-) create mode 100644 ide/project.dependency/Readme.md create mode 100644 ide/project.dependency/src/org/netbeans/modules/project/dependency/ArtifactSpec.java create mode 100644 ide/project.dependency/src/org/netbeans/modules/project/dependency/Bundle.properties create mode 100644 ide/project.dependency/src/org/netbeans/modules/project/dependency/Dependency.java create mode 100644 ide/project.dependency/src/org/netbeans/modules/project/dependency/DependencyResult.java create mode 100644 ide/project.dependency/src/org/netbeans/modules/project/dependency/ProjectDependencies.java create mode 100644 ide/project.dependency/src/org/netbeans/modules/project/dependency/ProjectOperationException.java create mode 100644 ide/project.dependency/src/org/netbeans/modules/project/dependency/Scope.java create mode 100644 ide/project.dependency/src/org/netbeans/modules/project/dependency/Scopes.java create mode 100644 ide/project.dependency/src/org/netbeans/modules/project/dependency/SourceLocation.java create mode 100644 ide/project.dependency/src/org/netbeans/modules/project/dependency/spi/ProjectDependenciesImplementation.java create mode 100644 java/maven/src/org/netbeans/modules/maven/queries/MavenDependenciesImplementation.java create mode 100644 java/maven/test/unit/data/projects/dependencies/golden/testCompileDependencies create mode 100644 java/maven/test/unit/data/projects/dependencies/golden/testRuntimeDependencies create mode 100644 java/maven/test/unit/data/projects/dependencies/repo/grp/annotation/12.6/_remote.repositories create mode 100644 java/maven/test/unit/data/projects/dependencies/repo/grp/annotation/12.6/annotation-12.6.jar.lastUpdated create mode 100644 java/maven/test/unit/data/projects/dependencies/repo/grp/annotation/12.6/annotation-12.6.jardir/META-INF/MANIFEST.MF create mode 100644 java/maven/test/unit/data/projects/dependencies/repo/grp/annotation/12.6/annotation-12.6.jardir/META-INF/maven/nbtest.grp/annotation/pom.properties create mode 100644 java/maven/test/unit/data/projects/dependencies/repo/grp/annotation/12.6/annotation-12.6.jardir/META-INF/maven/nbtest.grp/annotation/pom.xml create mode 100644 java/maven/test/unit/data/projects/dependencies/repo/grp/annotation/12.6/annotation-12.6.pom create mode 100644 java/maven/test/unit/data/projects/dependencies/repo/grp/annotation/12.6/annotation-12.6.pom.lastUpdated create mode 100644 java/maven/test/unit/data/projects/dependencies/repo/grp/annotation/maven-metadata-local.xml create mode 100644 java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib/12.6/_remote.repositories create mode 100644 java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib/12.6/test-lib-12.6.jardir/META-INF/MANIFEST.MF create mode 100644 java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib/12.6/test-lib-12.6.jardir/META-INF/maven/nbtest.grp/test-lib/pom.properties create mode 100644 java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib/12.6/test-lib-12.6.jardir/META-INF/maven/nbtest.grp/test-lib/pom.xml create mode 100644 java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib/12.6/test-lib-12.6.pom create mode 100644 java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib/maven-metadata-local.xml create mode 100644 java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib3/12.6/_remote.repositories create mode 100644 java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib3/12.6/test-lib3-12.6.jardir/META-INF/MANIFEST.MF create mode 100644 java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib3/12.6/test-lib3-12.6.jardir/META-INF/maven/nbtest.grp/test-lib3/pom.properties create mode 100644 java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib3/12.6/test-lib3-12.6.jardir/META-INF/maven/nbtest.grp/test-lib3/pom.xml create mode 100644 java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib3/12.6/test-lib3-12.6.pom create mode 100644 java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib3/maven-metadata-local.xml create mode 100644 java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib4/12.6/_remote.repositories create mode 100644 java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib4/12.6/test-lib4-12.6.jardir/META-INF/MANIFEST.MF create mode 100644 java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib4/12.6/test-lib4-12.6.jardir/META-INF/maven/nbtest.grp/test-lib4/pom.properties create mode 100644 java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib4/12.6/test-lib4-12.6.jardir/META-INF/maven/nbtest.grp/test-lib4/pom.xml create mode 100644 java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib4/12.6/test-lib4-12.6.pom create mode 100644 java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib4/maven-metadata-local.xml create mode 100644 java/maven/test/unit/data/projects/dependencies/repo/grp/test-processor/12.6/_remote.repositories create mode 100644 java/maven/test/unit/data/projects/dependencies/repo/grp/test-processor/12.6/test-processor-12.6.jardir/META-INF/MANIFEST.MF create mode 100644 java/maven/test/unit/data/projects/dependencies/repo/grp/test-processor/12.6/test-processor-12.6.jardir/META-INF/maven/nbtest.grp/test-processor/pom.properties create mode 100644 java/maven/test/unit/data/projects/dependencies/repo/grp/test-processor/12.6/test-processor-12.6.jardir/META-INF/maven/nbtest.grp/test-processor/pom.xml create mode 100644 java/maven/test/unit/data/projects/dependencies/repo/grp/test-processor/12.6/test-processor-12.6.pom create mode 100644 java/maven/test/unit/data/projects/dependencies/repo/grp/test-processor/maven-metadata-local.xml create mode 100644 java/maven/test/unit/data/projects/dependencies/src/annotation/pom.xml create mode 100644 java/maven/test/unit/data/projects/dependencies/src/annotation/src/main/java/README create mode 100644 java/maven/test/unit/data/projects/dependencies/src/simpleProject/pom-with-processor-broken.xml create mode 100644 java/maven/test/unit/data/projects/dependencies/src/simpleProject/pom-with-processor.xml create mode 100644 java/maven/test/unit/data/projects/dependencies/src/simpleProject/pom-with-separateProcessors.xml create mode 100644 java/maven/test/unit/data/projects/dependencies/src/simpleProject/pom.xml create mode 100644 java/maven/test/unit/data/projects/dependencies/src/simpleProject/src/main/java/README create mode 100644 java/maven/test/unit/data/projects/dependencies/src/simpleProject/src/test/java/README create mode 100644 java/maven/test/unit/data/projects/dependencies/src/test-lib/pom.xml create mode 100644 java/maven/test/unit/data/projects/dependencies/src/test-lib/src/main/java/README create mode 100644 java/maven/test/unit/data/projects/dependencies/src/test-lib3/pom.xml create mode 100644 java/maven/test/unit/data/projects/dependencies/src/test-lib3/src/main/java/README create mode 100644 java/maven/test/unit/data/projects/dependencies/src/test-lib4/pom.xml create mode 100644 java/maven/test/unit/data/projects/dependencies/src/test-lib4/src/main/java/README create mode 100644 java/maven/test/unit/data/projects/dependencies/src/test-processor/pom.xml create mode 100644 java/maven/test/unit/src/org/netbeans/modules/maven/queries/MavenDependenciesImplementationTest.java diff --git a/ide/project.dependency/Readme.md b/ide/project.dependency/Readme.md new file mode 100644 index 000000000000..21254b5a05ba --- /dev/null +++ b/ide/project.dependency/Readme.md @@ -0,0 +1,14 @@ +# Project Dependencies + +This module is highly experimental; provides an abstract API to query project dependncies +that shall be implemented by +- gradle +- maven +- ant/nbm support +At this moment, just Maven implements it and I need to validate the API design by adding +the other implementations before the API is going to be published officially. In the +meantime, implementation dependencies are required to access / implement the API. + +The code will **eventually merge** into `project.api` module and this experimental one +will be deleted. + diff --git a/ide/project.dependency/src/org/netbeans/modules/project/dependency/ArtifactSpec.java b/ide/project.dependency/src/org/netbeans/modules/project/dependency/ArtifactSpec.java new file mode 100644 index 000000000000..5e362b1ab987 --- /dev/null +++ b/ide/project.dependency/src/org/netbeans/modules/project/dependency/ArtifactSpec.java @@ -0,0 +1,193 @@ +/* + * 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.project.dependency; + +import java.util.Objects; +import org.netbeans.api.annotations.common.NonNull; +import org.netbeans.api.annotations.common.NullAllowed; + +/** + * Represents an artifact. Each artifact is identified by + * + * The version specified is further classified by {@link VersionKind}, to + * distinguish versions possibly from repositories, development versions and + * floating versions. + * + * @author sdedic + */ +public final class ArtifactSpec { + /** + * Kind of the artifact version + */ + public enum VersionKind { + /** + * Regular publishable artifact + */ + REGULAR, + + /** + * Snapshot artifact + */ + SNAPSHOT, + + /** + * Regular artifact, floating version + */ + LATEST + }; + + private final VersionKind kind; + private final String type; + private final String groupId; + private final String artifactId; + private final String versionSpec; + private final String classifier; + private final boolean optional; + final T data; + + ArtifactSpec(VersionKind kind, String groupId, String artifactId, String versionSpec, String type, String classifier, boolean optional, T impl) { + this.kind = kind; + this.groupId = groupId; + this.artifactId = artifactId; + this.versionSpec = versionSpec; + this.classifier = classifier; + this.optional = optional; + this.data = impl; + this.type = type; + } + + public VersionKind getKind() { + return kind; + } + + public String getType() { + return type; + } + + public String getGroupId() { + return groupId; + } + + public String getArtifactId() { + return artifactId; + } + + public String getVersionSpec() { + return versionSpec; + } + + public String getClassifier() { + return classifier; + } + + public boolean isOptional() { + return optional; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 79 * hash + Objects.hashCode(this.kind); + hash = 79 * hash + Objects.hashCode(this.type); + hash = 79 * hash + Objects.hashCode(this.groupId); + hash = 79 * hash + Objects.hashCode(this.artifactId); + hash = 79 * hash + Objects.hashCode(this.versionSpec); + hash = 79 * hash + Objects.hashCode(this.classifier); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final ArtifactSpec other = (ArtifactSpec) obj; + if (!Objects.equals(this.type, other.type)) { + return false; + } + if (!Objects.equals(this.groupId, other.groupId)) { + return false; + } + if (!Objects.equals(this.artifactId, other.artifactId)) { + return false; + } + if (!Objects.equals(this.versionSpec, other.versionSpec)) { + return false; + } + if (!Objects.equals(this.classifier, other.classifier)) { + return false; + } + return this.kind == other.kind; + } + + public String toString() { + StringBuilder sb = new StringBuilder( + String.format("%s:%s:%s", getGroupId(), getArtifactId(), getVersionSpec() == null ? "" : getVersionSpec()) + ); + if (classifier != null) { + sb.append(":").append(classifier); + } + if (type != null) { + sb.append("[").append(type).append("]"); + } + if (optional) { + sb.append("?"); + } + return sb.toString(); + } + + /** + * Returns opaque project-specific data. If searching for + * a project-specific extension, use {@link ProjectDependencies#findAdapters} instead. + * + * @return unspecified underlying project data + */ + public T getProjectData() { + return data; + } + + public static ArtifactSpec createVersionSpec( + @NonNull String groupId, @NonNull String artifactId, + @NullAllowed String type, @NullAllowed String classifier, + @NonNull String versionSpec, boolean optional, @NonNull V data) { + return new ArtifactSpec(VersionKind.REGULAR, groupId, artifactId, versionSpec, type, classifier, optional, data); + } + + public static ArtifactSpec createSnapshotSpec( + @NonNull String groupId, @NonNull String artifactId, + @NullAllowed String type, @NullAllowed String classifier, + @NonNull String versionSpec, boolean optional, @NonNull V data) { + return new ArtifactSpec(VersionKind.SNAPSHOT, groupId, artifactId, versionSpec, type, classifier, false, data); + } + +} diff --git a/ide/project.dependency/src/org/netbeans/modules/project/dependency/Bundle.properties b/ide/project.dependency/src/org/netbeans/modules/project/dependency/Bundle.properties new file mode 100644 index 000000000000..9050a480903a --- /dev/null +++ b/ide/project.dependency/src/org/netbeans/modules/project/dependency/Bundle.properties @@ -0,0 +1 @@ +OpenIDE-Module-Name=Project Dependencies diff --git a/ide/project.dependency/src/org/netbeans/modules/project/dependency/Dependency.java b/ide/project.dependency/src/org/netbeans/modules/project/dependency/Dependency.java new file mode 100644 index 000000000000..7c726d6c77e4 --- /dev/null +++ b/ide/project.dependency/src/org/netbeans/modules/project/dependency/Dependency.java @@ -0,0 +1,84 @@ +/* + * 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.project.dependency; + +import java.util.List; + +/** + * Represents a dependency of an artifact. The {@link #getChildren()} artifacts are + * needed in a certain {@link #getScope()}; should be ignored in unrelated scopes. + * The artifact that is subject of this dependency is the {@link #getArtifact()}. + * Children are expressed using other {@link Dependency} instances. + *

+ * Dependency does not have well-defined {@link #equals} and {@link #hashCode}, use + * {@link #getArtifact()} as key in Maps. + * + * @author sdedic + */ +public final class Dependency { + private final ArtifactSpec artifact; + private final List children; + private final Scope scope; + final Object data; + + Dependency(ArtifactSpec artifact, List children, Scope scope, Object data) { + this.artifact = artifact; + this.children = children; + this.scope = scope; + this.data = data; + } + + public ArtifactSpec getArtifact() { + return artifact; + } + + public List getChildren() { + return children; + } + + public Scope getScope() { + return scope; + } + + public Object getProjectData() { + return data; + } + + public String toString() { + return getArtifact() + "[" + scope + "]"; + } + + public static Dependency create(ArtifactSpec artifact, Scope scope, List children, Object data) { + return new Dependency(artifact, children, scope, data); + } + + /** + * Allows to filter artifacts and their dependency subtrees. + */ + public interface Filter { + /** + * Decide if the artifact 'a' and its dependencies should be included in the report. + * @param s the scope which requires dependency on "a" + * @param a the artifact + * @return true, if "a" should be included in the result; false to exclude it and its + * dependencies. + */ + public boolean accept(Scope s, ArtifactSpec a); + } +} diff --git a/ide/project.dependency/src/org/netbeans/modules/project/dependency/DependencyResult.java b/ide/project.dependency/src/org/netbeans/modules/project/dependency/DependencyResult.java new file mode 100644 index 000000000000..9442f42ad9a6 --- /dev/null +++ b/ide/project.dependency/src/org/netbeans/modules/project/dependency/DependencyResult.java @@ -0,0 +1,68 @@ +/* + * 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.project.dependency; + +import java.io.IOException; +import javax.swing.event.ChangeListener; +import org.netbeans.api.project.Project; +import org.openide.util.Lookup; + +/** + * Results of a dependency inspection. Contains dependency graph from the {@link #getRoot}. + * The result may become invalid, as a result of project changes or dependency changes. + * The state change will be reported by {@link ChangeListener}. If the client is interested + * in an updated result, it must perform another dependency scan. Once invalid instance + * will never turn back to valid. + *

+ * The {@link #getLookup() lookup} can be used to search for project-specific services that + * can provide further info on the artifacts or dependencies. + * @author sdedic + */ +public interface DependencyResult extends Lookup.Provider { + /** + * @return the inspected project + */ + public Project getProject(); + /** + * The root of the dependency tree. Its artifact should represent the project itself. + * @return project dependency root. + */ + public Dependency getRoot(); + + public boolean isValid(); + + /** + * Registers a Listener to be notified when validity changes. + * @param l listener + */ + public void addChangeListener(ChangeListener l); + + /** + * Unregisters a previously registered Listener. + * @param l listener + */ + public void removeChangeListener(ChangeListener l); + + /** + * Attempts to find location where this dependency is declared. + * @param d + * @return + */ + public SourceLocation getDeclarationRange(Dependency d) throws IOException; +} diff --git a/ide/project.dependency/src/org/netbeans/modules/project/dependency/ProjectDependencies.java b/ide/project.dependency/src/org/netbeans/modules/project/dependency/ProjectDependencies.java new file mode 100644 index 000000000000..633c9aa8e06f --- /dev/null +++ b/ide/project.dependency/src/org/netbeans/modules/project/dependency/ProjectDependencies.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.project.dependency; + +import java.util.Arrays; +import java.util.Collections; +import org.netbeans.api.project.Project; +import org.openide.util.Lookup; +import org.openide.util.lookup.Lookups; +import org.netbeans.modules.project.dependency.spi.ProjectDependenciesImplementation; +import org.openide.filesystems.FileObject; + +/** + * Project Query that collects dependencies using project-specific services. + * @author sdedic + */ +public class ProjectDependencies { + + public static ArtifactSpec getProjectArtifact(Project target) { + ProjectDependenciesImplementation pds = target.getLookup().lookup(ProjectDependenciesImplementation.class); + if (pds == null) { + return null; + } + return pds.getProjectArtifact(); + } + + public static DependencyResult findDependencies(Project target, Dependency.Filter filterOrNull, Scope... scopes) throws ProjectOperationException { + ProjectDependenciesImplementation pds = target.getLookup().lookup(ProjectDependenciesImplementation.class); + if (pds == null) { + return null; + } else { + return pds.findDependencies( + scopes == null ? Collections.singletonList(Scopes.COMPILE) : Arrays.asList(scopes), + filterOrNull != null ? filterOrNull : (s, a) -> true); + } + } +} diff --git a/ide/project.dependency/src/org/netbeans/modules/project/dependency/ProjectOperationException.java b/ide/project.dependency/src/org/netbeans/modules/project/dependency/ProjectOperationException.java new file mode 100644 index 000000000000..fce436c49288 --- /dev/null +++ b/ide/project.dependency/src/org/netbeans/modules/project/dependency/ProjectOperationException.java @@ -0,0 +1,78 @@ +/* + * 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.project.dependency; + +import org.netbeans.api.project.Project; + +/** + * The exception is thrown when an error happens during project operation because + * of limited or refused access to the project metadata / structure. + *

+ * It may wrap underlying build system error, such as maven not able to parse the + * POM. + * @author sdedic + */ +public final class ProjectOperationException extends IllegalStateException { + public enum State { + /** + * The project has not been yet fully initialized. The query can not + * produce sane results. + */ + UNINITIALIZED, + + /** + * The project definition is broken so that the query cannot be evaluated. + */ + BROKEN, + + /** + * Online resources are required to evaluate the query, but the query was not + * allowed to inspect them. + */ + OFFLINE, + + /** + * The project is OK + */ + OK, + } + + private final Project project; + private final State state; + + public ProjectOperationException(Project project, State state, String s) { + super(s); + this.project = project; + this.state = state; + } + + public ProjectOperationException(Project project, State state, String message, Throwable cause) { + super(message, cause); + this.state = state; + this.project = project; + } + + public Project getProject() { + return project; + } + + public State getState() { + return state; + } +} diff --git a/ide/project.dependency/src/org/netbeans/modules/project/dependency/Scope.java b/ide/project.dependency/src/org/netbeans/modules/project/dependency/Scope.java new file mode 100644 index 000000000000..1e2a78c75a49 --- /dev/null +++ b/ide/project.dependency/src/org/netbeans/modules/project/dependency/Scope.java @@ -0,0 +1,86 @@ +/* + * 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.project.dependency; + +import java.util.Objects; + +/** + * Represents "scope" (maven term) or "configuration" (gradle term). Eeach project type + * may define multiple additional Scopes, but should support the abstract ones defined in + * {@link Scopes}. + *

+ * Scopes are identified by its {@link #name name}; two scopes with the same name are equal. + * Project implementations may provide their own scopes with standard names since they + * may use different include/imply hierarchy. + * + * @author sdedic + */ +public abstract class Scope { + private final String name; + + protected Scope(String name) { + this.name = name; + } + + /** + * Checks if this scope includes the other one. If yes, then queries that executed for this scope + * should return all results from the included scope. + * + * @param s scope to test + * @return true, if data for scope "s" are included by this scope; false otherwise (i.e. unrelated scopes) + */ + public abstract boolean includes(Scope s); + + /** + * Checks if this scope exports the other scope. A scope may {@link #includes include} other + * scope, but can choose not to propagate its contents further. + * @param s the scope to test + * @return true, if data for scope "s" are exported by this scope; false otherwise (i.e. unrelated scopes) + */ + public abstract boolean exports(Scope s); + + /** + * @return name / identifier for the scope. Not subject to L10N. + */ + public String name() { + return name; + } + + @Override + public final int hashCode() { + int hash = 5; + hash = 67 * hash + Objects.hashCode(this.name); + return hash; + } + + @Override + public final boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final Scope other = (Scope) obj; + return Objects.equals(this.name, other.name); + } +} diff --git a/ide/project.dependency/src/org/netbeans/modules/project/dependency/Scopes.java b/ide/project.dependency/src/org/netbeans/modules/project/dependency/Scopes.java new file mode 100644 index 000000000000..3672ba64d75d --- /dev/null +++ b/ide/project.dependency/src/org/netbeans/modules/project/dependency/Scopes.java @@ -0,0 +1,86 @@ +/* + * 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.project.dependency; + +import java.util.Collections; +import java.util.Set; + +/** + * + * @author sdedic + */ +public final class Scopes { + /** + * Build process dependencies. Annotation processors, buildtime tools, code generators. + */ + public static final Scope PROCESS = new DefaultScope("compileProcessing", Collections.emptySet(), Collections.emptySet()); + + /** + * External dependencies, not distributed with the application, but provided by the environment + */ + public static final Scope EXTERNAL = new DefaultScope("external", Collections.emptySet(), Collections.emptySet()); + + /** + * Test dependencies. + */ + public static final Scope TEST = new DefaultScope("test", Collections.emptySet(), Collections.emptySet()); + + /** + * Compile dependencies. Resources used by build tools to build the application. Includes + * {@link #PROCESS} but does not export it further. + */ + public static final Scope COMPILE = new DefaultScope("compilation", + Collections.singleton(PROCESS), Collections.singleton(PROCESS)); + + /** + * Runtime dependencies. Includes compile dependencies. + */ + public static final Scope RUNTIME = new DefaultScope("runtime", Collections.singleton(COMPILE), Collections.emptySet()); + + /** + * Included resources. + public static final Scope INCLUDED = new DefaultScope("included", Collections.emptySet(), Collections.emptySet()); + */ + + static final class DefaultScope extends Scope { + private final Set includes; + private final Set stops; + + public DefaultScope(String name, Set includes, Set stops) { + super(name); + this.includes = includes; + this.stops = stops; + } + + @Override + public boolean includes(Scope s) { + return s == this || includes.contains(s); + } + + @Override + public boolean exports(Scope s) { + return s == this || (!stops.contains(s) && includes(s)); + } + + @Override + public String toString() { + return name(); + } + } +} diff --git a/ide/project.dependency/src/org/netbeans/modules/project/dependency/SourceLocation.java b/ide/project.dependency/src/org/netbeans/modules/project/dependency/SourceLocation.java new file mode 100644 index 000000000000..00a457ff1888 --- /dev/null +++ b/ide/project.dependency/src/org/netbeans/modules/project/dependency/SourceLocation.java @@ -0,0 +1,105 @@ +/* + * 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.project.dependency; + +import org.openide.filesystems.FileObject; + +/** + * Represents a location range in a project file occupied by a project model object. + * In case the range cannot be determined, + * the start an end position are equal. In the case the position cannot be determined + * at all, the start (and end) positions are set to -1. + *

+ * In the case the object itself is not present in the project file, but is implied + * by another project construction, the {@link #getImpliedBy()} is not null, and provides + * the model for that construction. For example a dependency may be introduced by an intermediate + * libraries. In that case, when the API is queried for the dependency declaration source, + * it will return the direct dependence that introduced the dependency in question from {@link #getImpliedBy} + * and its location range. + * + * @author sdedic + */ +public final class SourceLocation { + private final FileObject file; + private final int startOffset; + private final int endOffset; + private final Object impliedBy; + + public SourceLocation(FileObject file, int startOffset, int endOffset, Object impliedBy) { + this.file = file; + this.startOffset = startOffset; + this.endOffset = endOffset; + this.impliedBy = impliedBy; + } + + /** + * @return Returns the file. + */ + public FileObject getFile() { + return file; + } + + /** + * Returns starting offset of the construct in the project file. May return -1, + * if the position can not be determined. + * @return startinf offset or -1 + */ + public int getStartOffset() { + return startOffset; + } + + /** + * Ending offset of the project construct in the project file, exclusive. May return + * the same value as {@link #getStartOffset} if the range can not be determined. Will return + * -1 if {@link #getStartOffset()} is -1. + * @return ending offset, inclusive, or -1. + */ + public int getEndOffset() { + return endOffset; + } + + /** + * Determines if the construct is directly in the project source, or implied by some + * other construction. If this method returns {@code null}, the queried project construct + * is specified in the project file, and {@link #getStartOffset()} / {@link #getEndOffset()} + * give its location or range. If the return value is non-{@code null}, it represents + * a project element / metadata that caused the queried project construct into existence. + * Start and end offset apply to that "owning" construct instead. + * + * @return null if the Location is occupied by the queried construct directly, or + * the project element that impled the queried construct. + */ + public Object getImpliedBy() { + return impliedBy; + } + + /** + * @return true, if the offset within the file is known + */ + public boolean hasPosition() { + return startOffset > -1; + } + + /** + * @return false, if the Location represents a non-empty range. + */ + public boolean isEmpty() { + return startOffset >= endOffset; + } +} diff --git a/ide/project.dependency/src/org/netbeans/modules/project/dependency/spi/ProjectDependenciesImplementation.java b/ide/project.dependency/src/org/netbeans/modules/project/dependency/spi/ProjectDependenciesImplementation.java new file mode 100644 index 000000000000..6adc3ddd672f --- /dev/null +++ b/ide/project.dependency/src/org/netbeans/modules/project/dependency/spi/ProjectDependenciesImplementation.java @@ -0,0 +1,46 @@ +/* + * 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.project.dependency.spi; + +import java.util.Collection; +import org.netbeans.api.annotations.common.NonNull; +import org.netbeans.api.annotations.common.NullAllowed; +import org.netbeans.modules.project.dependency.ArtifactSpec; +import org.netbeans.modules.project.dependency.Dependency; +import org.netbeans.modules.project.dependency.DependencyResult; +import org.netbeans.modules.project.dependency.ProjectOperationException; +import org.netbeans.modules.project.dependency.Scope; + +/** + * + * @author sdedic + */ +public interface ProjectDependenciesImplementation { + @NonNull + public ArtifactSpec getProjectArtifact(); + + @NonNull + public DependencyResult findDependencies( + @NullAllowed Collection scopes, @NullAllowed Dependency.Filter filter) + throws ProjectOperationException; + /* + @CheckForNull + public Dependency mergeDependencies(@NonNull Dependency one, @NonNull Dependency two); + */ +} diff --git a/java/java.lsp.server/vscode/package-lock.json b/java/java.lsp.server/vscode/package-lock.json index 437b976520ba..be46468fe2ec 100644 --- a/java/java.lsp.server/vscode/package-lock.json +++ b/java/java.lsp.server/vscode/package-lock.json @@ -10,23 +10,23 @@ "license": "Apache 2.0", "dependencies": { "jsonc-parser": "3.0.0", - "vscode-debugadapter": "1.51.0", - "vscode-languageclient": "8.0.1" + "vscode-debugadapter": "1.42.1", + "vscode-languageclient": "7.0.0" }, "devDependencies": { "@types/glob": "^7.1.1", "@types/mocha": "^9.0.0", "@types/node": "^13.11.0", "@types/ps-node": "^0.1.0", - "@types/vscode": "^1.67.0", + "@types/vscode": "^1.60.0", "glob": "^7.1.6", "mocha": "^9.1.2", "ps-node": "^0.1.6", - "typescript": "^4.6.4", + "typescript": "^3.8.3", "vscode-test": "^1.3.0" }, "engines": { - "vscode": "^1.67.0" + "vscode": "^1.60.0" } }, "node_modules/@types/glob": { @@ -59,10 +59,9 @@ "license": "MIT" }, "node_modules/@types/vscode": { - "version": "1.67.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.67.0.tgz", - "integrity": "sha512-GH8BDf8cw9AC9080uneJfulhSa7KHSMI2s/CyKePXoGNos9J486w2V4YKoeNUqIEkW4hKoEAWp6/cXTwyGj47g==", - "dev": true + "version": "1.60.0", + "dev": true, + "license": "MIT" }, "node_modules/@ungap/promise-all-settled": { "version": "1.1.2", @@ -639,15 +638,18 @@ "node": "*" } }, + "node_modules/minimist": { + "version": "1.2.6", + "license": "MIT" + }, "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "version": "0.5.5", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5" + }, "bin": { "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" } }, "node_modules/mocha": { @@ -939,10 +941,9 @@ } }, "node_modules/typescript": { - "version": "4.6.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz", - "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==", + "version": "3.9.7", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -952,55 +953,47 @@ } }, "node_modules/vscode-debugadapter": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/vscode-debugadapter/-/vscode-debugadapter-1.51.0.tgz", - "integrity": "sha512-mObaXD5/FH/z6aL2GDuyCLbnwLsYRCAJWgFid01vKW9Y5Si8OvINK+Tn+Yl/lRUbetjNuZW3j1euMEz6z8Yzqg==", - "deprecated": "This package has been renamed to @vscode/debugadapter, please update to the new name", + "version": "1.42.1", + "license": "MIT", "dependencies": { - "mkdirp": "^1.0.4", - "vscode-debugprotocol": "1.51.0" + "mkdirp": "^0.5.5", + "vscode-debugprotocol": "1.42.0" } }, "node_modules/vscode-debugprotocol": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/vscode-debugprotocol/-/vscode-debugprotocol-1.51.0.tgz", - "integrity": "sha512-dzKWTMMyebIMPF1VYMuuQj7gGFq7guR8AFya0mKacu+ayptJfaRuM0mdHCqiOth4FnRP8mPhEroFPx6Ift8wHA==", - "deprecated": "This package has been renamed to @vscode/debugprotocol, please update to the new name" + "version": "1.42.0", + "license": "MIT" }, "node_modules/vscode-jsonrpc": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.0.1.tgz", - "integrity": "sha512-N/WKvghIajmEvXpatSzvTvOIz61ZSmOSa4BRA4pTLi+1+jozquQKP/MkaylP9iB68k73Oua1feLQvH3xQuigiQ==", + "version": "6.0.0", + "license": "MIT", "engines": { - "node": ">=14.0.0" + "node": ">=8.0.0 || >=10.0.0" } }, "node_modules/vscode-languageclient": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-8.0.1.tgz", - "integrity": "sha512-9XoE+HJfaWvu7Y75H3VmLo5WLCtsbxEgEhrLPqwt7eyoR49lUIyyrjb98Yfa50JCMqF2cePJAEVI6oe2o1sIhw==", + "version": "7.0.0", + "license": "MIT", "dependencies": { "minimatch": "^3.0.4", - "semver": "^7.3.5", - "vscode-languageserver-protocol": "3.17.1" + "semver": "^7.3.4", + "vscode-languageserver-protocol": "3.16.0" }, "engines": { - "vscode": "^1.67.0" + "vscode": "^1.52.0" } }, "node_modules/vscode-languageserver-protocol": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.1.tgz", - "integrity": "sha512-BNlAYgQoYwlSgDLJhSG+DeA8G1JyECqRzM2YO6tMmMji3Ad9Mw6AW7vnZMti90qlAKb0LqAlJfSVGEdqMMNzKg==", + "version": "3.16.0", + "license": "MIT", "dependencies": { - "vscode-jsonrpc": "8.0.1", - "vscode-languageserver-types": "3.17.1" + "vscode-jsonrpc": "6.0.0", + "vscode-languageserver-types": "3.16.0" } }, "node_modules/vscode-languageserver-types": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.1.tgz", - "integrity": "sha512-K3HqVRPElLZVVPtMeKlsyL9aK0GxGQpvtAUTfX4k7+iJ4mc1M+JM+zQwkgGy2LzY0f0IAafe8MKqIkJrxfGGjQ==" + "version": "3.16.0", + "license": "MIT" }, "node_modules/vscode-test": { "version": "1.4.0", @@ -1144,9 +1137,7 @@ "dev": true }, "@types/vscode": { - "version": "1.67.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.67.0.tgz", - "integrity": "sha512-GH8BDf8cw9AC9080uneJfulhSa7KHSMI2s/CyKePXoGNos9J486w2V4YKoeNUqIEkW4hKoEAWp6/cXTwyGj47g==", + "version": "1.60.0", "dev": true }, "@ungap/promise-all-settled": { @@ -1500,10 +1491,14 @@ "brace-expansion": "^1.1.7" } }, + "minimist": { + "version": "1.2.6" + }, "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + "version": "0.5.5", + "requires": { + "minimist": "^1.2.5" + } }, "mocha": { "version": "9.2.0", @@ -1677,53 +1672,39 @@ } }, "typescript": { - "version": "4.6.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz", - "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==", + "version": "3.9.7", "dev": true }, "vscode-debugadapter": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/vscode-debugadapter/-/vscode-debugadapter-1.51.0.tgz", - "integrity": "sha512-mObaXD5/FH/z6aL2GDuyCLbnwLsYRCAJWgFid01vKW9Y5Si8OvINK+Tn+Yl/lRUbetjNuZW3j1euMEz6z8Yzqg==", + "version": "1.42.1", "requires": { - "mkdirp": "^1.0.4", - "vscode-debugprotocol": "1.51.0" + "mkdirp": "^0.5.5", + "vscode-debugprotocol": "1.42.0" } }, "vscode-debugprotocol": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/vscode-debugprotocol/-/vscode-debugprotocol-1.51.0.tgz", - "integrity": "sha512-dzKWTMMyebIMPF1VYMuuQj7gGFq7guR8AFya0mKacu+ayptJfaRuM0mdHCqiOth4FnRP8mPhEroFPx6Ift8wHA==" + "version": "1.42.0" }, "vscode-jsonrpc": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.0.1.tgz", - "integrity": "sha512-N/WKvghIajmEvXpatSzvTvOIz61ZSmOSa4BRA4pTLi+1+jozquQKP/MkaylP9iB68k73Oua1feLQvH3xQuigiQ==" + "version": "6.0.0" }, "vscode-languageclient": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-8.0.1.tgz", - "integrity": "sha512-9XoE+HJfaWvu7Y75H3VmLo5WLCtsbxEgEhrLPqwt7eyoR49lUIyyrjb98Yfa50JCMqF2cePJAEVI6oe2o1sIhw==", + "version": "7.0.0", "requires": { "minimatch": "^3.0.4", - "semver": "^7.3.5", - "vscode-languageserver-protocol": "3.17.1" + "semver": "^7.3.4", + "vscode-languageserver-protocol": "3.16.0" } }, "vscode-languageserver-protocol": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.1.tgz", - "integrity": "sha512-BNlAYgQoYwlSgDLJhSG+DeA8G1JyECqRzM2YO6tMmMji3Ad9Mw6AW7vnZMti90qlAKb0LqAlJfSVGEdqMMNzKg==", + "version": "3.16.0", "requires": { - "vscode-jsonrpc": "8.0.1", - "vscode-languageserver-types": "3.17.1" + "vscode-jsonrpc": "6.0.0", + "vscode-languageserver-types": "3.16.0" } }, "vscode-languageserver-types": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.1.tgz", - "integrity": "sha512-K3HqVRPElLZVVPtMeKlsyL9aK0GxGQpvtAUTfX4k7+iJ4mc1M+JM+zQwkgGy2LzY0f0IAafe8MKqIkJrxfGGjQ==" + "version": "3.16.0" }, "vscode-test": { "version": "1.4.0", diff --git a/java/java.lsp.server/vscode/package.json b/java/java.lsp.server/vscode/package.json index 36c2986ff2ff..37500005987e 100644 --- a/java/java.lsp.server/vscode/package.json +++ b/java/java.lsp.server/vscode/package.json @@ -832,5 +832,8 @@ "jsonc-parser": "3.0.0", "vscode-debugadapter": "1.51.0", "vscode-languageclient": "8.0.1" + "vsce": "^2.7.0", + "vscode-debugadapter": "1.42.1", + "vscode-languageclient": "7.0.0" } } diff --git a/java/maven.embedder/nbproject/project.xml b/java/maven.embedder/nbproject/project.xml index c3856b25b735..cb0f0d67c1c7 100644 --- a/java/maven.embedder/nbproject/project.xml +++ b/java/maven.embedder/nbproject/project.xml @@ -225,6 +225,9 @@ org.apache.maven.settings.io.xpp3 org.apache.maven.shared.dependency.tree org.apache.maven.shared.dependency.tree.traversal + org.apache.maven.shared.dependency.graph + org.apache.maven.shared.dependency.graph.filter + org.apache.maven.shared.dependency.graph.traversal org.apache.maven.wagon org.apache.maven.wagon.authentication org.apache.maven.wagon.authorization diff --git a/java/maven.embedder/src/org/netbeans/modules/maven/embedder/DependencyTreeFactory.java b/java/maven.embedder/src/org/netbeans/modules/maven/embedder/DependencyTreeFactory.java index 54b4e4dfae94..e8891456e69b 100644 --- a/java/maven.embedder/src/org/netbeans/modules/maven/embedder/DependencyTreeFactory.java +++ b/java/maven.embedder/src/org/netbeans/modules/maven/embedder/DependencyTreeFactory.java @@ -18,23 +18,36 @@ */ package org.netbeans.modules.maven.embedder; +import java.util.logging.Level; +import java.util.logging.Logger; +import org.apache.maven.DefaultMaven; +import org.apache.maven.Maven; import org.apache.maven.artifact.factory.ArtifactFactory; import org.apache.maven.artifact.metadata.ArtifactMetadataSource; import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.artifact.resolver.ArtifactCollector; import org.apache.maven.artifact.resolver.filter.ArtifactFilter; import org.apache.maven.artifact.resolver.filter.ScopeArtifactFilter; +import org.apache.maven.execution.MavenExecutionRequest; +import org.apache.maven.model.building.ModelBuildingRequest; import org.apache.maven.project.MavenProject; +import org.apache.maven.project.ProjectBuildingRequest; +import org.apache.maven.shared.dependency.graph.DependencyGraphBuilder; +import org.apache.maven.shared.dependency.graph.DependencyGraphBuilderException; +import org.apache.maven.shared.dependency.graph.internal.DefaultDependencyGraphBuilder; import org.apache.maven.shared.dependency.tree.DependencyNode; import org.apache.maven.shared.dependency.tree.DependencyTreeBuilder; import org.apache.maven.shared.dependency.tree.DependencyTreeBuilderException; +import org.codehaus.plexus.component.repository.exception.ComponentLookupException; +import org.openide.util.Exceptions; /** * * @author mkleint */ public class DependencyTreeFactory { - + private static final Logger LOG = Logger.getLogger(DependencyTreeFactory.class.getName()); + public static DependencyNode createDependencyTree(MavenProject project, MavenEmbedder embedder, String scope) { //TODO: check alternative for deprecated maven components @@ -51,10 +64,35 @@ public static DependencyNode createDependencyTree(MavenProject project, MavenEmb assert collector !=null : "ArtifactCollector component not found in maven"; embedder.setUpLegacySupport(); - + return createDependencyTree(project, builder, embedder.getLocalRepository(), factory, source, collector, scope); } + + public static org.apache.maven.shared.dependency.graph.DependencyNode createDependencyGraph(MavenProject project, MavenEmbedder embedder, String scope) { + ArtifactFilter artifactFilter = createResolvingArtifactFilter(scope); + MavenExecutionRequest req = embedder.createMavenExecutionRequest(); + req.setPom(project.getFile()); + req.setOffline(true); + + ProjectBuildingRequest configuration = req.getProjectBuildingRequest(); + configuration.setValidationLevel(ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL); + configuration.setResolveDependencies(true); + + DependencyGraphBuilder depBuilder = embedder.lookupComponent(DependencyGraphBuilder.class); + org.apache.maven.shared.dependency.graph.DependencyNode graphNode; + try { + DefaultMaven maven = (DefaultMaven)embedder.getPlexus().lookup(Maven.class); + configuration.setRepositorySession(maven.newRepositorySession(req)); + MavenProject copy = project.clone(); + copy.setProjectBuildingRequest(configuration); + graphNode = depBuilder.buildDependencyGraph(copy, artifactFilter); + return graphNode; + } catch (ComponentLookupException | DependencyGraphBuilderException ex) { + LOG.log(Level.INFO, "Dependency tree scan failed", ex); + return null; + } + } //copied from dependency:tree mojo @@ -64,15 +102,16 @@ private static DependencyNode createDependencyTree(MavenProject project, ArtifactCollector artifactCollector, String scope) { ArtifactFilter artifactFilter = createResolvingArtifactFilter(scope); - + try { // TODO: note that filter does not get applied due to MNG-3236 return dependencyTreeBuilder.buildDependencyTree(project, localRepository, artifactFactory, artifactMetadataSource, artifactFilter, artifactCollector); } catch (DependencyTreeBuilderException exception) { + LOG.log(Level.INFO, "Dependency tree scan failed", exception); + return null; } - return null; } //copied from dependency:tree mojo diff --git a/java/maven.graph/nbproject/project.xml b/java/maven.graph/nbproject/project.xml index 010dacdbcf32..5a1524c48f0c 100644 --- a/java/maven.graph/nbproject/project.xml +++ b/java/maven.graph/nbproject/project.xml @@ -51,6 +51,24 @@ 1.13 + + org.netbeans.libs.jackson + + + + 2 + 2.13 + + + + org.netbeans.libs.json_simple + + + + 1 + 0.28 + + org.netbeans.modules.java.graph @@ -65,8 +83,11 @@ + + diff --git a/java/maven/build.xml b/java/maven/build.xml index c05f9ce7bbc2..7053dba79afa 100644 --- a/java/maven/build.xml +++ b/java/maven/build.xml @@ -87,6 +87,13 @@ + + + + + + + diff --git a/java/maven/manifest.mf b/java/maven/manifest.mf index 0200e6720c1e..2ee0fa61622e 100644 --- a/java/maven/manifest.mf +++ b/java/maven/manifest.mf @@ -1,6 +1,6 @@ Manifest-Version: 1.0 OpenIDE-Module: org.netbeans.modules.maven/2 -OpenIDE-Module-Specification-Version: 2.154 +OpenIDE-Module-Implementation-Version: 1 OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/maven/Bundle.properties OpenIDE-Module-Layer: org/netbeans/modules/maven/layer.xml AutoUpdate-Show-In-Client: false diff --git a/java/maven/nbproject/project.properties b/java/maven/nbproject/project.properties index 5a0e4486713d..e89c0751c9e1 100644 --- a/java/maven/nbproject/project.properties +++ b/java/maven/nbproject/project.properties @@ -22,6 +22,7 @@ javadoc.apichanges=${basedir}/apichanges.xml javadoc.arch=${basedir}/arch.xml javahelp.hs=maven.hs extra.module.files=maven-nblib/ +spec.version.base: 2.154 # The CPExtender test fails in library processing (not randomly) since NetBeans 8.2; disabling. test.excludes=**/CPExtenderTest.class diff --git a/java/maven/nbproject/project.xml b/java/maven/nbproject/project.xml index ea54c347961f..e6060c784b10 100644 --- a/java/maven/nbproject/project.xml +++ b/java/maven/nbproject/project.xml @@ -116,6 +116,14 @@ 1.35 + + org.netbeans.modules.editor.document + + + + 1.26 + + org.netbeans.modules.editor.indent.project @@ -509,6 +517,14 @@ 6.64 + + org.netbeans.modules.project.dependency + + + + + + @@ -576,6 +592,14 @@ org.netbeans.libs.freemarker + + org.netbeans.modules.xml.text + + + + org.netbeans.modules.editor.mimelookup.impl + + diff --git a/java/maven/src/org/netbeans/modules/maven/queries/MavenDependenciesImplementation.java b/java/maven/src/org/netbeans/modules/maven/queries/MavenDependenciesImplementation.java new file mode 100644 index 000000000000..ac1bcfbad2c2 --- /dev/null +++ b/java/maven/src/org/netbeans/modules/maven/queries/MavenDependenciesImplementation.java @@ -0,0 +1,491 @@ +/* + * 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.queries; + +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.swing.text.BadLocationException; +import javax.swing.text.StyledDocument; +import org.apache.maven.DefaultMaven; +import org.apache.maven.Maven; +import org.apache.maven.artifact.Artifact; +import org.apache.maven.artifact.resolver.filter.ArtifactFilter; +import org.apache.maven.artifact.resolver.filter.CumulativeScopeArtifactFilter; +import org.apache.maven.execution.MavenExecutionRequest; +import org.apache.maven.model.InputLocation; +import org.apache.maven.model.InputSource; +import org.apache.maven.model.Model; +import org.apache.maven.model.building.ModelBuildingException; +import org.apache.maven.model.building.ModelBuildingRequest; +import org.apache.maven.model.building.ModelBuildingResult; +import org.apache.maven.project.DependencyResolutionException; +import org.apache.maven.project.MavenProject; +import org.apache.maven.project.ProjectBuildingRequest; +import org.apache.maven.shared.dependency.graph.DependencyGraphBuilder; +import org.apache.maven.shared.dependency.graph.DependencyGraphBuilderException; +import org.apache.maven.shared.dependency.graph.DependencyNode; +import org.codehaus.plexus.component.repository.exception.ComponentLookupException; +import org.netbeans.api.editor.document.LineDocument; +import org.netbeans.api.editor.document.LineDocumentUtils; +import org.netbeans.api.project.Project; +import org.netbeans.modules.maven.api.NbMavenProject; +import org.netbeans.modules.maven.embedder.EmbedderFactory; +import org.netbeans.modules.maven.embedder.MavenEmbedder; +import org.netbeans.modules.project.dependency.ArtifactSpec; +import org.netbeans.modules.project.dependency.Dependency; +import org.netbeans.modules.project.dependency.DependencyResult; +import org.netbeans.modules.project.dependency.ProjectOperationException; +import org.netbeans.modules.project.dependency.Scope; +import org.netbeans.modules.project.dependency.Scopes; +import org.netbeans.modules.project.dependency.SourceLocation; +import org.netbeans.modules.project.dependency.spi.ProjectDependenciesImplementation; +import org.netbeans.spi.project.ProjectServiceProvider; +import org.openide.cookies.EditorCookie; +import org.openide.filesystems.FileObject; +import org.openide.filesystems.FileUtil; +import org.openide.loaders.DataObject; +import org.openide.util.Exceptions; +import org.openide.util.Lookup; +import org.openide.util.NbBundle; +import org.openide.util.WeakListeners; + +/** + * + * @author sdedic + */ +@ProjectServiceProvider(service = ProjectDependenciesImplementation.class, projectType="org-netbeans-modules-maven") +public class MavenDependenciesImplementation implements ProjectDependenciesImplementation { + private final Project project; + private NbMavenProject nbMavenProject; + + private static final Set SCOPES = new HashSet<>(); + + static { + SCOPES.add(Scopes.COMPILE); + SCOPES.add(Scopes.RUNTIME); + SCOPES.add(Scopes.EXTERNAL); + SCOPES.add(Scopes.TEST); + } + + public MavenDependenciesImplementation(Project project) { + this.project = project; + } + + private void init() { + synchronized (this) { + if (nbMavenProject != null) { + return; + } + nbMavenProject = project.getLookup().lookup(NbMavenProject.class); + } + } + + static final Map mavenScopes; + + static { + mavenScopes = new HashMap<>(); + mavenScopes.put(Scopes.PROCESS, "compile"); + mavenScopes.put(Scopes.COMPILE, "compile"); + mavenScopes.put(Scopes.RUNTIME, "runtime"); + mavenScopes.put(Scopes.TEST, "test"); + mavenScopes.put(Scopes.EXTERNAL, "provided"); + } + + static String mavenScope(Scope s) { + return mavenScopes.getOrDefault(s, "runtime"); + } + + @Override + public ArtifactSpec getProjectArtifact() { + init(); + Artifact a = nbMavenProject.getMavenProject().getArtifact(); + if (a.isSnapshot()) { + return ArtifactSpec.createSnapshotSpec(a.getGroupId(), a.getArtifactId(), + a.getType(), a.getClassifier(), a.getVersion(), a.isOptional(), a); + } else { + return ArtifactSpec.createVersionSpec(a.getGroupId(), a.getArtifactId(), + a.getType(), a.getClassifier(), a.getVersion(), a.isOptional(), a); + } + } + + @NbBundle.Messages({ + "ERR_DependencyOnBrokenProject=Unable to collect dependencies from a broken project", + "ERR_DependencyNotPrimed=Unable to collect dependencies from a broken project", + "ERR_DependencyMissing=Cannot resolve project dependencies", + "ERR_DependencyGraphError=Cannot construct dependency graph" + }) + @Override + public DependencyResult findDependencies(Collection scopes, Dependency.Filter filter) { + init(); + MavenProject mp = nbMavenProject.getMavenProject(); + if (NbMavenProject.isErrorPlaceholder(mp)) { + if (nbMavenProject.isMavenProjectLoaded()) { + throw new ProjectOperationException(project, ProjectOperationException.State.BROKEN, Bundle.ERR_DependencyOnBrokenProject()); + } else { + throw new ProjectOperationException(project, ProjectOperationException.State.UNINITIALIZED, Bundle.ERR_DependencyNotPrimed()); + } + } + MavenEmbedder embedder = EmbedderFactory.getProjectEmbedder(); + MavenExecutionRequest req = embedder.createMavenExecutionRequest(); + req.setPom(mp.getFile()); + req.setOffline(true); + + ProjectBuildingRequest configuration = req.getProjectBuildingRequest(); + configuration.setValidationLevel(ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL); + configuration.setResolveDependencies(true); + + Collection mavenScopes = scopes.stream(). + map(MavenDependenciesImplementation::mavenScope). + collect(Collectors.toList()); + + ArtifactFilter artFilter = new CumulativeScopeArtifactFilter(mavenScopes); + + DependencyGraphBuilder depBuilder = embedder.lookupComponent(DependencyGraphBuilder.class); + DependencyNode n; + try { + DefaultMaven maven = (DefaultMaven)embedder.getPlexus().lookup(Maven.class); + configuration.setRepositorySession(maven.newRepositorySession(req)); + MavenProject copy = mp.clone(); + copy.setProjectBuildingRequest(configuration); + n = depBuilder.buildDependencyGraph(copy, artFilter); + } catch (DependencyGraphBuilderException ex) { + Throwable cause = ex.getCause(); + if (cause instanceof DependencyResolutionException) { + throw new ProjectOperationException(project, ProjectOperationException.State.BROKEN, + Bundle.ERR_DependencyMissing(), ex); + } else { + Exceptions.printStackTrace(ex); + return null; + } + } catch (ComponentLookupException ex) { + Exceptions.printStackTrace(ex); + // unavailable + return null; + } + + return new Result(nbMavenProject.getMavenProject(), + convert(n, filter), new ArrayList<>(scopes)); + } + + static Scope scope(Artifact a) { + String as = a.getScope(); + if (as == null) { + return Scopes.COMPILE; + } + switch (as) { + case Artifact.SCOPE_COMPILE: + return Scopes.COMPILE; + + case Artifact.SCOPE_RUNTIME: + case Artifact.SCOPE_COMPILE_PLUS_RUNTIME: + case Artifact.SCOPE_RUNTIME_PLUS_SYSTEM: + return Scopes.RUNTIME; + + case Artifact.SCOPE_IMPORT: + case Artifact.SCOPE_SYSTEM: + return Scopes.EXTERNAL; + + case Artifact.SCOPE_TEST: + return Scopes.TEST; + default: + return Scopes.COMPILE; + } + } + + private Dependency convert(DependencyNode n, Dependency.Filter filter) { + List ch = new ArrayList<>(); + for (DependencyNode c : n.getChildren()) { + Dependency cd = convert(c, filter); + if (cd != null) { + ch.add(cd); + } + } + Artifact a = n.getArtifact(); + ArtifactSpec aspec; + String cs = a.getClassifier(); + if ("".equals(cs)) { + cs = null; + } + if (a.isSnapshot()) { + aspec = ArtifactSpec.createSnapshotSpec(a.getGroupId(), a.getArtifactId(), a.getType(), + cs, a.getVersion(), a.isOptional(), a); + } else { + aspec = ArtifactSpec.createVersionSpec(a.getGroupId(), a.getArtifactId(), a.getType(), + cs, a.getVersion(), a.isOptional(), a); + } + Scope s = scope(a); + + if (!filter.accept(s, aspec)) { + return null; + } + + return Dependency.create(aspec, s, ch, n); + } + + class Result implements DependencyResult, PropertyChangeListener { + final MavenProject project; + final Dependency rootNode; + final Collection scopes; + PropertyChangeListener wL; + Model effectiveModel; + Map openedPoms = new HashMap<>(); + private List listeners; + + public Result(MavenProject proj, Dependency rootNode, Collection scopes) { + this.project = proj; + this.rootNode = rootNode; + this.scopes = scopes; + } + + @Override + public Project getProject() { + return MavenDependenciesImplementation.this.project; + } + + @Override + public Dependency getRoot() { + return rootNode; + } + + @Override + public boolean isValid() { + return true; + } + + @Override + public void addChangeListener(ChangeListener l) { + boolean attach = false; + synchronized (this) { + if (listeners == null) { + attach = true; + listeners = new ArrayList<>(); + } + listeners.add(l); + } + if (!attach) { + return; + } + wL = WeakListeners.propertyChange(this, nbMavenProject); + nbMavenProject.addPropertyChangeListener(wL); + } + + @Override + public void removeChangeListener(ChangeListener l) { + boolean detach = false; + synchronized (this) { + if (listeners == null) { + return; + } + listeners.remove(l); + if (listeners.isEmpty()) { + nbMavenProject.removePropertyChangeListener(wL); + } + } + } + + @Override + public void propertyChange(PropertyChangeEvent evt) { + if (!NbMavenProject.PROP_PROJECT.equals(evt.getPropertyName())) { + return; + } + + List ll; + synchronized (this) { + if (listeners == null || listeners.isEmpty()) { + return; + } + ll = new ArrayList<>(listeners); + } + ChangeEvent e = new ChangeEvent(this); + for (ChangeListener l : ll ) { + l.stateChanged(e); + } + } + + public String toString() { + return "Depdenencies for " + getRoot().getArtifact() + " " + + scopes.toString(); + } + + public Lookup getLookup() { + return Lookup.EMPTY; + } + + @NbBundle.Messages("ERR_ModelBuildFailed=Model building failed") + @Override + public SourceLocation getDeclarationRange(Dependency dep) throws IOException { + Model m; + if (effectiveModel == null) { + ModelBuildingResult res; + try { + res = EmbedderFactory.getProjectEmbedder().executeModelBuilder( + project.getFile()); + } catch (ModelBuildingException ex) { + throw new IOException(Bundle.ERR_ModelBuildFailed(), ex); + } + synchronized (this) { + if (effectiveModel == null) { + effectiveModel = res.getEffectiveModel(); + } + } + } + + Dependency topLevel = null; + Dependency search = dep; + org.apache.maven.model.Dependency selected = null; + if (dep.getProjectData() instanceof DependencyNode) { + DependencyNode pd = (DependencyNode)dep.getProjectData(); + if (!(pd == rootNode.getProjectData() || pd.getParent() == rootNode.getProjectData())) { + do { + pd = pd.getParent(); + } while (pd.getParent() != rootNode.getProjectData()); + + List rootDeps = rootNode.getChildren(); + for (Dependency cd : rootDeps) { + if (artifactEquals(cd.getArtifact(), pd.getArtifact())) { + search = cd; + topLevel = cd; + break; + } + } + } + } + + for (org.apache.maven.model.Dependency d : effectiveModel.getDependencies()) { + if (dependencyEquals(dep, d)) { + selected = d; + break; + } + } + if (selected == null) { + return null; + } + InputLocation l = selected.getLocation(""); + InputSource s = l.getSource(); + String path = s.getLocation(); + FileObject fo = FileUtil.toFileObject(new File(path)); + if (fo == null) { + return null; + } + StyledDocument d; + + synchronized (this) { + d = openedPoms.get(fo); + } + if (d == null) { + DataObject dobj = DataObject.find(fo); + EditorCookie cake = dobj.getLookup().lookup(EditorCookie.class); + if (cake == null) { + return null; + } + d = cake.openDocument(); + synchronized (this) { + openedPoms.put(fo, d); + } + } + LineDocument ld = LineDocumentUtils.as(d, LineDocument.class); + if (ld == null) { + return new SourceLocation(fo, -1, -1, topLevel); + } else { + int so = LineDocumentUtils.getLineStartFromIndex(ld, l.getLineNumber() - 1) + + l.getColumnNumber() - 1; + int[] depStart = new int[] { so }; + int[] depEnd = new int[] { so }; + d.render(() -> { + try { + int from = Math.max(0, so - 15); + String text = ld.getText(from, ld.getLength() - from); + int start = text.lastIndexOf(" -1) { + depStart[0] = start + from; + } + int end = text.indexOf("" + end += 10; + int end2 = text.indexOf(">", end); + if (end2 > 0) { + end = end2 + 1; + } + depEnd[0] = end + from; + } + } catch (BadLocationException ex) { + } + }); + + return new SourceLocation(fo, depStart[0], depEnd[0], topLevel); + } + } + } + + static boolean dependencyEquals(Dependency dspec, org.apache.maven.model.Dependency mavenD) { + ArtifactSpec spec = dspec.getArtifact(); + String mavenClass = mavenD.getClassifier(); + if ("".equals(mavenClass)) { + mavenClass = null; + } + if (!( + Objects.equals(spec.getGroupId(), mavenD.getGroupId()) && + Objects.equals(spec.getArtifactId(), mavenD.getArtifactId()) && + Objects.equals(spec.getClassifier(), mavenClass)) && + Objects.equals(spec.getVersionSpec(), mavenD.getVersion())) { + return false; + } + if (spec.getType() != null && !Objects.equals(spec.getType(), mavenD.getType())) { + return false; + } + if (dspec.getScope() != null) { + if (!Objects.equals(mavenScope(dspec.getScope()), mavenD.getScope())) { + return false; + } + } + return true; + } + + static boolean artifactEquals(ArtifactSpec spec, Artifact mavenA) { + String mavenClass = mavenA.getClassifier(); + if ("".equals(mavenClass)) { + mavenClass = null; + } + if (!( + Objects.equals(spec.getGroupId(), mavenA.getGroupId()) && + Objects.equals(spec.getArtifactId(), mavenA.getArtifactId()) && + Objects.equals(spec.getClassifier(), mavenClass)) && + Objects.equals(spec.getVersionSpec(), mavenA.getVersion())) { + return false; + } + if (spec.getType() != null && !Objects.equals(spec.getType(), mavenA.getType())) { + return false; + } + return true; + } +} diff --git a/java/maven/test/unit/data/projects/dependencies/golden/testCompileDependencies b/java/maven/test/unit/data/projects/dependencies/golden/testCompileDependencies new file mode 100644 index 000000000000..1a83d2ac540d --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/golden/testCompileDependencies @@ -0,0 +1,5 @@ +[ ] nbtest.grp:test-app:12.6[jar] / compilation + +-- [ ] nbtest.grp:annotation:12.6[jar] / compilation + +-- [ ] nbtest.grp:test-lib:12.6[jar] / compilation + | +-- [ ] javax.annotation:javax.annotation-api:1.3.2[jar] / compilation + | +-- [ ] org.slf4j:slf4j-api:1.7.36[jar] / compilation diff --git a/java/maven/test/unit/data/projects/dependencies/golden/testRuntimeDependencies b/java/maven/test/unit/data/projects/dependencies/golden/testRuntimeDependencies new file mode 100644 index 000000000000..58345c74c915 --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/golden/testRuntimeDependencies @@ -0,0 +1,7 @@ +[ ] nbtest.grp:test-app:12.6[jar] / compilation + +-- [ ] nbtest.grp:annotation:12.6[jar] / compilation + +-- [ ] nbtest.grp:test-lib:12.6[jar] / compilation + | +-- [ ] javax.annotation:javax.annotation-api:1.3.2[jar] / compilation + | +-- [ ] org.slf4j:slf4j-api:1.7.36[jar] / compilation + +-- [ ] nbtest.grp:test-lib4:12.6[jar] / runtime + +-- [ ] org.slf4j:slf4j-jdk14:1.7.36[jar] / runtime diff --git a/java/maven/test/unit/data/projects/dependencies/repo/grp/annotation/12.6/_remote.repositories b/java/maven/test/unit/data/projects/dependencies/repo/grp/annotation/12.6/_remote.repositories new file mode 100644 index 000000000000..e390a97c7648 --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/repo/grp/annotation/12.6/_remote.repositories @@ -0,0 +1,4 @@ +#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice. +#Tue May 24 16:10:10 CEST 2022 +annotation-12.6.jar>= +annotation-12.6.pom>= diff --git a/java/maven/test/unit/data/projects/dependencies/repo/grp/annotation/12.6/annotation-12.6.jar.lastUpdated b/java/maven/test/unit/data/projects/dependencies/repo/grp/annotation/12.6/annotation-12.6.jar.lastUpdated new file mode 100644 index 000000000000..11b5dbc900a4 --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/repo/grp/annotation/12.6/annotation-12.6.jar.lastUpdated @@ -0,0 +1,4 @@ +#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice. +#Tue May 24 16:09:57 CEST 2022 +https\://repo.maven.apache.org/maven2/.lastUpdated=1653401397770 +https\://repo.maven.apache.org/maven2/.error= diff --git a/java/maven/test/unit/data/projects/dependencies/repo/grp/annotation/12.6/annotation-12.6.jardir/META-INF/MANIFEST.MF b/java/maven/test/unit/data/projects/dependencies/repo/grp/annotation/12.6/annotation-12.6.jardir/META-INF/MANIFEST.MF new file mode 100644 index 000000000000..990fe1215374 --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/repo/grp/annotation/12.6/annotation-12.6.jardir/META-INF/MANIFEST.MF @@ -0,0 +1,6 @@ +Manifest-Version: 1.0 +Archiver-Version: Plexus Archiver +Created-By: Apache Maven 3.6.0 +Built-By: sdedic +Build-Jdk: 11.0.5 + diff --git a/java/maven/test/unit/data/projects/dependencies/repo/grp/annotation/12.6/annotation-12.6.jardir/META-INF/maven/nbtest.grp/annotation/pom.properties b/java/maven/test/unit/data/projects/dependencies/repo/grp/annotation/12.6/annotation-12.6.jardir/META-INF/maven/nbtest.grp/annotation/pom.properties new file mode 100644 index 000000000000..09a4e8c243d1 --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/repo/grp/annotation/12.6/annotation-12.6.jardir/META-INF/maven/nbtest.grp/annotation/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Mon May 23 17:39:16 CEST 2022 +groupId=nbtest.grp +artifactId=annotation +version=12.6 diff --git a/java/maven/test/unit/data/projects/dependencies/repo/grp/annotation/12.6/annotation-12.6.jardir/META-INF/maven/nbtest.grp/annotation/pom.xml b/java/maven/test/unit/data/projects/dependencies/repo/grp/annotation/12.6/annotation-12.6.jardir/META-INF/maven/nbtest.grp/annotation/pom.xml new file mode 100644 index 000000000000..2c028d76364d --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/repo/grp/annotation/12.6/annotation-12.6.jardir/META-INF/maven/nbtest.grp/annotation/pom.xml @@ -0,0 +1,33 @@ + + + + 4.0.0 + + nbtest.grp + annotation + 12.6 + + Test processor + Annotation library stub + + + diff --git a/java/maven/test/unit/data/projects/dependencies/repo/grp/annotation/12.6/annotation-12.6.pom b/java/maven/test/unit/data/projects/dependencies/repo/grp/annotation/12.6/annotation-12.6.pom new file mode 100644 index 000000000000..2c028d76364d --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/repo/grp/annotation/12.6/annotation-12.6.pom @@ -0,0 +1,33 @@ + + + + 4.0.0 + + nbtest.grp + annotation + 12.6 + + Test processor + Annotation library stub + + + diff --git a/java/maven/test/unit/data/projects/dependencies/repo/grp/annotation/12.6/annotation-12.6.pom.lastUpdated b/java/maven/test/unit/data/projects/dependencies/repo/grp/annotation/12.6/annotation-12.6.pom.lastUpdated new file mode 100644 index 000000000000..6352b7d62bc3 --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/repo/grp/annotation/12.6/annotation-12.6.pom.lastUpdated @@ -0,0 +1,4 @@ +#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice. +#Tue May 24 16:09:57 CEST 2022 +https\://repo.maven.apache.org/maven2/.lastUpdated=1653401397537 +https\://repo.maven.apache.org/maven2/.error= diff --git a/java/maven/test/unit/data/projects/dependencies/repo/grp/annotation/maven-metadata-local.xml b/java/maven/test/unit/data/projects/dependencies/repo/grp/annotation/maven-metadata-local.xml new file mode 100644 index 000000000000..7ce406639c62 --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/repo/grp/annotation/maven-metadata-local.xml @@ -0,0 +1,12 @@ + + + nbtest.grp + annotation + + 12.6 + + 12.6 + + 20220524141010 + + diff --git a/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib/12.6/_remote.repositories b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib/12.6/_remote.repositories new file mode 100644 index 000000000000..5c1575a64e45 --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib/12.6/_remote.repositories @@ -0,0 +1,4 @@ +#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice. +#Tue May 24 16:10:16 CEST 2022 +test-lib-12.6.jar>= +test-lib-12.6.pom>= diff --git a/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib/12.6/test-lib-12.6.jardir/META-INF/MANIFEST.MF b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib/12.6/test-lib-12.6.jardir/META-INF/MANIFEST.MF new file mode 100644 index 000000000000..990fe1215374 --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib/12.6/test-lib-12.6.jardir/META-INF/MANIFEST.MF @@ -0,0 +1,6 @@ +Manifest-Version: 1.0 +Archiver-Version: Plexus Archiver +Created-By: Apache Maven 3.6.0 +Built-By: sdedic +Build-Jdk: 11.0.5 + diff --git a/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib/12.6/test-lib-12.6.jardir/META-INF/maven/nbtest.grp/test-lib/pom.properties b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib/12.6/test-lib-12.6.jardir/META-INF/maven/nbtest.grp/test-lib/pom.properties new file mode 100644 index 000000000000..c42bdc242904 --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib/12.6/test-lib-12.6.jardir/META-INF/maven/nbtest.grp/test-lib/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Mon May 23 17:39:32 CEST 2022 +groupId=nbtest.grp +artifactId=test-lib +version=12.6 diff --git a/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib/12.6/test-lib-12.6.jardir/META-INF/maven/nbtest.grp/test-lib/pom.xml b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib/12.6/test-lib-12.6.jardir/META-INF/maven/nbtest.grp/test-lib/pom.xml new file mode 100644 index 000000000000..ccc6e0e497b9 --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib/12.6/test-lib-12.6.jardir/META-INF/maven/nbtest.grp/test-lib/pom.xml @@ -0,0 +1,57 @@ + + + + 4.0.0 + + nbtest.grp + test-lib + 12.6 + + Test Library + Application Library stub + + + + nbtest.grp + annotation + 12.6 + + + nbtest.grp + test-lib3 + 12.6 + runtime + + + javax.annotation + javax.annotation-api + 1.3.2 + compile + + + org.slf4j + slf4j-api + 1.7.36 + + + + diff --git a/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib/12.6/test-lib-12.6.pom b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib/12.6/test-lib-12.6.pom new file mode 100644 index 000000000000..ccc6e0e497b9 --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib/12.6/test-lib-12.6.pom @@ -0,0 +1,57 @@ + + + + 4.0.0 + + nbtest.grp + test-lib + 12.6 + + Test Library + Application Library stub + + + + nbtest.grp + annotation + 12.6 + + + nbtest.grp + test-lib3 + 12.6 + runtime + + + javax.annotation + javax.annotation-api + 1.3.2 + compile + + + org.slf4j + slf4j-api + 1.7.36 + + + + diff --git a/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib/maven-metadata-local.xml b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib/maven-metadata-local.xml new file mode 100644 index 000000000000..2d04039810e3 --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib/maven-metadata-local.xml @@ -0,0 +1,12 @@ + + + nbtest.grp + test-lib + + 12.6 + + 12.6 + + 20220524141016 + + diff --git a/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib3/12.6/_remote.repositories b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib3/12.6/_remote.repositories new file mode 100644 index 000000000000..0df21522b2b5 --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib3/12.6/_remote.repositories @@ -0,0 +1,4 @@ +#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice. +#Tue May 24 16:09:51 CEST 2022 +test-lib3-12.6.jar>= +test-lib3-12.6.pom>= diff --git a/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib3/12.6/test-lib3-12.6.jardir/META-INF/MANIFEST.MF b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib3/12.6/test-lib3-12.6.jardir/META-INF/MANIFEST.MF new file mode 100644 index 000000000000..990fe1215374 --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib3/12.6/test-lib3-12.6.jardir/META-INF/MANIFEST.MF @@ -0,0 +1,6 @@ +Manifest-Version: 1.0 +Archiver-Version: Plexus Archiver +Created-By: Apache Maven 3.6.0 +Built-By: sdedic +Build-Jdk: 11.0.5 + diff --git a/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib3/12.6/test-lib3-12.6.jardir/META-INF/maven/nbtest.grp/test-lib3/pom.properties b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib3/12.6/test-lib3-12.6.jardir/META-INF/maven/nbtest.grp/test-lib3/pom.properties new file mode 100644 index 000000000000..92cd362044da --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib3/12.6/test-lib3-12.6.jardir/META-INF/maven/nbtest.grp/test-lib3/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Mon May 23 17:38:40 CEST 2022 +groupId=nbtest.grp +artifactId=test-lib3 +version=12.6 diff --git a/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib3/12.6/test-lib3-12.6.jardir/META-INF/maven/nbtest.grp/test-lib3/pom.xml b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib3/12.6/test-lib3-12.6.jardir/META-INF/maven/nbtest.grp/test-lib3/pom.xml new file mode 100644 index 000000000000..aeac16ad9dd5 --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib3/12.6/test-lib3-12.6.jardir/META-INF/maven/nbtest.grp/test-lib3/pom.xml @@ -0,0 +1,32 @@ + + + + 4.0.0 + + nbtest.grp + test-lib3 + 12.6 + + Processor library + + + diff --git a/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib3/12.6/test-lib3-12.6.pom b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib3/12.6/test-lib3-12.6.pom new file mode 100644 index 000000000000..aeac16ad9dd5 --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib3/12.6/test-lib3-12.6.pom @@ -0,0 +1,32 @@ + + + + 4.0.0 + + nbtest.grp + test-lib3 + 12.6 + + Processor library + + + diff --git a/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib3/maven-metadata-local.xml b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib3/maven-metadata-local.xml new file mode 100644 index 000000000000..db0a10792ae0 --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib3/maven-metadata-local.xml @@ -0,0 +1,12 @@ + + + nbtest.grp + test-lib3 + + 12.6 + + 12.6 + + 20220524140951 + + diff --git a/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib4/12.6/_remote.repositories b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib4/12.6/_remote.repositories new file mode 100644 index 000000000000..7ff5d83e9698 --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib4/12.6/_remote.repositories @@ -0,0 +1,4 @@ +#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice. +#Tue May 24 16:09:41 CEST 2022 +test-lib4-12.6.jar>= +test-lib4-12.6.pom>= diff --git a/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib4/12.6/test-lib4-12.6.jardir/META-INF/MANIFEST.MF b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib4/12.6/test-lib4-12.6.jardir/META-INF/MANIFEST.MF new file mode 100644 index 000000000000..990fe1215374 --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib4/12.6/test-lib4-12.6.jardir/META-INF/MANIFEST.MF @@ -0,0 +1,6 @@ +Manifest-Version: 1.0 +Archiver-Version: Plexus Archiver +Created-By: Apache Maven 3.6.0 +Built-By: sdedic +Build-Jdk: 11.0.5 + diff --git a/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib4/12.6/test-lib4-12.6.jardir/META-INF/maven/nbtest.grp/test-lib4/pom.properties b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib4/12.6/test-lib4-12.6.jardir/META-INF/maven/nbtest.grp/test-lib4/pom.properties new file mode 100644 index 000000000000..93bf8f5ae5f5 --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib4/12.6/test-lib4-12.6.jardir/META-INF/maven/nbtest.grp/test-lib4/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Tue May 24 16:09:41 CEST 2022 +groupId=nbtest.grp +artifactId=test-lib4 +version=12.6 diff --git a/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib4/12.6/test-lib4-12.6.jardir/META-INF/maven/nbtest.grp/test-lib4/pom.xml b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib4/12.6/test-lib4-12.6.jardir/META-INF/maven/nbtest.grp/test-lib4/pom.xml new file mode 100644 index 000000000000..019bcd44e82e --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib4/12.6/test-lib4-12.6.jardir/META-INF/maven/nbtest.grp/test-lib4/pom.xml @@ -0,0 +1,32 @@ + + + + 4.0.0 + + nbtest.grp + test-lib4 + 12.6 + + Processor library for tests + + + diff --git a/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib4/12.6/test-lib4-12.6.pom b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib4/12.6/test-lib4-12.6.pom new file mode 100644 index 000000000000..019bcd44e82e --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib4/12.6/test-lib4-12.6.pom @@ -0,0 +1,32 @@ + + + + 4.0.0 + + nbtest.grp + test-lib4 + 12.6 + + Processor library for tests + + + diff --git a/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib4/maven-metadata-local.xml b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib4/maven-metadata-local.xml new file mode 100644 index 000000000000..7cc068073a26 --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-lib4/maven-metadata-local.xml @@ -0,0 +1,12 @@ + + + nbtest.grp + test-lib4 + + 12.6 + + 12.6 + + 20220524140941 + + diff --git a/java/maven/test/unit/data/projects/dependencies/repo/grp/test-processor/12.6/_remote.repositories b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-processor/12.6/_remote.repositories new file mode 100644 index 000000000000..2844607dad95 --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-processor/12.6/_remote.repositories @@ -0,0 +1,4 @@ +#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice. +#Tue May 24 16:10:23 CEST 2022 +test-processor-12.6.jar>= +test-processor-12.6.pom>= diff --git a/java/maven/test/unit/data/projects/dependencies/repo/grp/test-processor/12.6/test-processor-12.6.jardir/META-INF/MANIFEST.MF b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-processor/12.6/test-processor-12.6.jardir/META-INF/MANIFEST.MF new file mode 100644 index 000000000000..990fe1215374 --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-processor/12.6/test-processor-12.6.jardir/META-INF/MANIFEST.MF @@ -0,0 +1,6 @@ +Manifest-Version: 1.0 +Archiver-Version: Plexus Archiver +Created-By: Apache Maven 3.6.0 +Built-By: sdedic +Build-Jdk: 11.0.5 + diff --git a/java/maven/test/unit/data/projects/dependencies/repo/grp/test-processor/12.6/test-processor-12.6.jardir/META-INF/maven/nbtest.grp/test-processor/pom.properties b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-processor/12.6/test-processor-12.6.jardir/META-INF/maven/nbtest.grp/test-processor/pom.properties new file mode 100644 index 000000000000..1069c39778fd --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-processor/12.6/test-processor-12.6.jardir/META-INF/maven/nbtest.grp/test-processor/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Tue May 24 16:10:23 CEST 2022 +groupId=nbtest.grp +artifactId=test-processor +version=12.6 diff --git a/java/maven/test/unit/data/projects/dependencies/repo/grp/test-processor/12.6/test-processor-12.6.jardir/META-INF/maven/nbtest.grp/test-processor/pom.xml b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-processor/12.6/test-processor-12.6.jardir/META-INF/maven/nbtest.grp/test-processor/pom.xml new file mode 100644 index 000000000000..db7589448065 --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-processor/12.6/test-processor-12.6.jardir/META-INF/maven/nbtest.grp/test-processor/pom.xml @@ -0,0 +1,45 @@ + + + + 4.0.0 + + nbtest.grp + test-processor + 12.6 + + Test processor + Annotation processor library stub + + + + nbtest.grp + annotation + 12.6 + + + nbtest.grp + test-lib4 + 12.6 + + + + diff --git a/java/maven/test/unit/data/projects/dependencies/repo/grp/test-processor/12.6/test-processor-12.6.pom b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-processor/12.6/test-processor-12.6.pom new file mode 100644 index 000000000000..db7589448065 --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-processor/12.6/test-processor-12.6.pom @@ -0,0 +1,45 @@ + + + + 4.0.0 + + nbtest.grp + test-processor + 12.6 + + Test processor + Annotation processor library stub + + + + nbtest.grp + annotation + 12.6 + + + nbtest.grp + test-lib4 + 12.6 + + + + diff --git a/java/maven/test/unit/data/projects/dependencies/repo/grp/test-processor/maven-metadata-local.xml b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-processor/maven-metadata-local.xml new file mode 100644 index 000000000000..6c0a5cf90c24 --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/repo/grp/test-processor/maven-metadata-local.xml @@ -0,0 +1,12 @@ + + + nbtest.grp + test-processor + + 12.6 + + 12.6 + + 20220524141023 + + diff --git a/java/maven/test/unit/data/projects/dependencies/src/annotation/pom.xml b/java/maven/test/unit/data/projects/dependencies/src/annotation/pom.xml new file mode 100644 index 000000000000..2c028d76364d --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/src/annotation/pom.xml @@ -0,0 +1,33 @@ + + + + 4.0.0 + + nbtest.grp + annotation + 12.6 + + Test processor + Annotation library stub + + + diff --git a/java/maven/test/unit/data/projects/dependencies/src/annotation/src/main/java/README b/java/maven/test/unit/data/projects/dependencies/src/annotation/src/main/java/README new file mode 100644 index 000000000000..e4427aced799 --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/src/annotation/src/main/java/README @@ -0,0 +1 @@ +Placeholder file, to keep Git happy with otherwise empty dir. diff --git a/java/maven/test/unit/data/projects/dependencies/src/simpleProject/pom-with-processor-broken.xml b/java/maven/test/unit/data/projects/dependencies/src/simpleProject/pom-with-processor-broken.xml new file mode 100644 index 000000000000..6c8fd6816517 --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/src/simpleProject/pom-with-processor-broken.xml @@ -0,0 +1,77 @@ + + + + 4.0.0 + + nbtest.grp + test-app + 12.6 + + Test App + Test App + + + + nbtest.grp + annotation + 12.6 + + + nbtest.grp + test-lib + 12.6 + + + nbtest.grp + test-lib3 + test + 12.6 + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + + + nbtest.grp + test-processor + 12.6 + + + nbtest.grp + foobar + 12.6 + + + + + + + + + diff --git a/java/maven/test/unit/data/projects/dependencies/src/simpleProject/pom-with-processor.xml b/java/maven/test/unit/data/projects/dependencies/src/simpleProject/pom-with-processor.xml new file mode 100644 index 000000000000..4c0795964702 --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/src/simpleProject/pom-with-processor.xml @@ -0,0 +1,77 @@ + + + + 4.0.0 + + nbtest.grp + test-app + 12.6 + + Test App + Test App + + + + nbtest.grp + annotation + 12.6 + + + nbtest.grp + test-lib + 12.6 + + + nbtest.grp + test-lib3 + test + 12.6 + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + + + nbtest.grp + test-processor + 12.6 + + + nbtest.grp + test-lib2 + 12.6 + + + + + + + + + diff --git a/java/maven/test/unit/data/projects/dependencies/src/simpleProject/pom-with-separateProcessors.xml b/java/maven/test/unit/data/projects/dependencies/src/simpleProject/pom-with-separateProcessors.xml new file mode 100644 index 000000000000..14e3f0d02610 --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/src/simpleProject/pom-with-separateProcessors.xml @@ -0,0 +1,111 @@ + + + + 4.0.0 + + nbtest.grp + test-app + 12.6 + + Test App + Test App + + + + nbtest.grp + annotation + 12.6 + + + nbtest.grp + test-lib + 12.6 + + + nbtest.grp + test-lib3 + test + 12.6 + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + + default-compile + compile + + + + + nbtest.grp + test-processor + 12.6 + + + nbtest.grp + test-lib2 + 12.6 + + + + + + default-testCompile + test-compile + + + + + nbtest.grp + test-processor + 12.6 + + + nbtest.grp + test-lib4 + 12.6 + + + + + + + + + + + diff --git a/java/maven/test/unit/data/projects/dependencies/src/simpleProject/pom.xml b/java/maven/test/unit/data/projects/dependencies/src/simpleProject/pom.xml new file mode 100644 index 000000000000..85e433639935 --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/src/simpleProject/pom.xml @@ -0,0 +1,65 @@ + + + + 4.0.0 + + nbtest.grp + test-app + 12.6 + + Test App + Test App + + + + nbtest.grp + annotation + 12.6 + + + nbtest.grp + test-lib + 12.6 + + + nbtest.grp + test-lib4 + 12.6 + runtime + + + nbtest.grp + test-lib3 + test + 12.6 + + + + org.slf4j + slf4j-jdk14 + 1.7.36 + runtime + + + + + diff --git a/java/maven/test/unit/data/projects/dependencies/src/simpleProject/src/main/java/README b/java/maven/test/unit/data/projects/dependencies/src/simpleProject/src/main/java/README new file mode 100644 index 000000000000..e4427aced799 --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/src/simpleProject/src/main/java/README @@ -0,0 +1 @@ +Placeholder file, to keep Git happy with otherwise empty dir. diff --git a/java/maven/test/unit/data/projects/dependencies/src/simpleProject/src/test/java/README b/java/maven/test/unit/data/projects/dependencies/src/simpleProject/src/test/java/README new file mode 100644 index 000000000000..e4427aced799 --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/src/simpleProject/src/test/java/README @@ -0,0 +1 @@ +Placeholder file, to keep Git happy with otherwise empty dir. diff --git a/java/maven/test/unit/data/projects/dependencies/src/test-lib/pom.xml b/java/maven/test/unit/data/projects/dependencies/src/test-lib/pom.xml new file mode 100644 index 000000000000..ccc6e0e497b9 --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/src/test-lib/pom.xml @@ -0,0 +1,57 @@ + + + + 4.0.0 + + nbtest.grp + test-lib + 12.6 + + Test Library + Application Library stub + + + + nbtest.grp + annotation + 12.6 + + + nbtest.grp + test-lib3 + 12.6 + runtime + + + javax.annotation + javax.annotation-api + 1.3.2 + compile + + + org.slf4j + slf4j-api + 1.7.36 + + + + diff --git a/java/maven/test/unit/data/projects/dependencies/src/test-lib/src/main/java/README b/java/maven/test/unit/data/projects/dependencies/src/test-lib/src/main/java/README new file mode 100644 index 000000000000..e4427aced799 --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/src/test-lib/src/main/java/README @@ -0,0 +1 @@ +Placeholder file, to keep Git happy with otherwise empty dir. diff --git a/java/maven/test/unit/data/projects/dependencies/src/test-lib3/pom.xml b/java/maven/test/unit/data/projects/dependencies/src/test-lib3/pom.xml new file mode 100644 index 000000000000..aeac16ad9dd5 --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/src/test-lib3/pom.xml @@ -0,0 +1,32 @@ + + + + 4.0.0 + + nbtest.grp + test-lib3 + 12.6 + + Processor library + + + diff --git a/java/maven/test/unit/data/projects/dependencies/src/test-lib3/src/main/java/README b/java/maven/test/unit/data/projects/dependencies/src/test-lib3/src/main/java/README new file mode 100644 index 000000000000..e4427aced799 --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/src/test-lib3/src/main/java/README @@ -0,0 +1 @@ +Placeholder file, to keep Git happy with otherwise empty dir. diff --git a/java/maven/test/unit/data/projects/dependencies/src/test-lib4/pom.xml b/java/maven/test/unit/data/projects/dependencies/src/test-lib4/pom.xml new file mode 100644 index 000000000000..019bcd44e82e --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/src/test-lib4/pom.xml @@ -0,0 +1,32 @@ + + + + 4.0.0 + + nbtest.grp + test-lib4 + 12.6 + + Processor library for tests + + + diff --git a/java/maven/test/unit/data/projects/dependencies/src/test-lib4/src/main/java/README b/java/maven/test/unit/data/projects/dependencies/src/test-lib4/src/main/java/README new file mode 100644 index 000000000000..e4427aced799 --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/src/test-lib4/src/main/java/README @@ -0,0 +1 @@ +Placeholder file, to keep Git happy with otherwise empty dir. diff --git a/java/maven/test/unit/data/projects/dependencies/src/test-processor/pom.xml b/java/maven/test/unit/data/projects/dependencies/src/test-processor/pom.xml new file mode 100644 index 000000000000..db7589448065 --- /dev/null +++ b/java/maven/test/unit/data/projects/dependencies/src/test-processor/pom.xml @@ -0,0 +1,45 @@ + + + + 4.0.0 + + nbtest.grp + test-processor + 12.6 + + Test processor + Annotation processor library stub + + + + nbtest.grp + annotation + 12.6 + + + nbtest.grp + test-lib4 + 12.6 + + + + diff --git a/java/maven/test/unit/src/org/netbeans/modules/maven/queries/MavenDependenciesImplementationTest.java b/java/maven/test/unit/src/org/netbeans/modules/maven/queries/MavenDependenciesImplementationTest.java new file mode 100644 index 000000000000..156a05278b29 --- /dev/null +++ b/java/maven/test/unit/src/org/netbeans/modules/maven/queries/MavenDependenciesImplementationTest.java @@ -0,0 +1,195 @@ +/* + * 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.queries; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardOpenOption; +import java.util.Arrays; +import java.util.List; +import static junit.framework.TestCase.assertNotNull; +import org.netbeans.api.java.classpath.ClassPath; +import org.netbeans.api.java.classpath.JavaClassPathConstants; +import org.netbeans.api.project.Project; +import org.netbeans.api.project.ProjectManager; +import org.netbeans.junit.NbTestCase; +import org.netbeans.modules.maven.api.NbMavenProject; +import org.netbeans.modules.maven.embedder.EmbedderFactory; +import org.netbeans.modules.project.dependency.Dependency; +import org.netbeans.modules.project.dependency.DependencyResult; +import org.netbeans.modules.project.dependency.ProjectDependencies; +import org.netbeans.modules.project.dependency.Scopes; +import org.netbeans.modules.project.dependency.SourceLocation; +import org.openide.filesystems.FileObject; +import org.openide.filesystems.FileUtil; + +/** + * + * @author sdedic + */ +public class MavenDependenciesImplementationTest extends NbTestCase { + private FileObject d; + private File repo; + private FileObject repoFO; + private FileObject dataFO; + + public MavenDependenciesImplementationTest(String name) { + super(name); + } + + + + protected @Override void setUp() throws Exception { + clearWorkDir(); + d = FileUtil.toFileObject(getWorkDir()); + System.setProperty("test.reload.sync", "true"); + repo = EmbedderFactory.getProjectEmbedder().getLocalRepositoryFile(); + repoFO = FileUtil.toFileObject(repo); + dataFO = FileUtil.toFileObject(getDataDir()); + } + + private void installCompileResources() throws Exception { + FileUtil.copyFile(dataFO.getFileObject("projects/dependencies/repo"), repoFO, "nbtest"); + } + + @Override + protected void tearDown() throws Exception { + FileObject nbtest = repoFO.getFileObject("nbtest"); + if (nbtest != null && nbtest.isValid()) { + nbtest.delete(); + } + } + + public void testCompileDependencies() throws Exception { + FileUtil.toFileObject(getWorkDir()).refresh(); + installCompileResources(); + + FileObject testApp = dataFO.getFileObject("projects/dependencies/src/simpleProject"); + FileObject prjCopy = FileUtil.copyFile(testApp, FileUtil.toFileObject(getWorkDir()), "simpleProject"); + + Project p = ProjectManager.getDefault().findProject(prjCopy); + assertNotNull(p); + DependencyResult dr = ProjectDependencies.findDependencies(p, null, Scopes.COMPILE); + Dependency root = dr.getRoot(); + assertContents(printDependencyTree(root), getName()); + } + + public void testRuntimeDependencies() throws Exception { + FileUtil.toFileObject(getWorkDir()).refresh(); + installCompileResources(); + + FileObject testApp = dataFO.getFileObject("projects/dependencies/src/simpleProject"); + FileObject prjCopy = FileUtil.copyFile(testApp, FileUtil.toFileObject(getWorkDir()), "simpleProject"); + + Project p = ProjectManager.getDefault().findProject(prjCopy); + assertNotNull(p); + DependencyResult dr = ProjectDependencies.findDependencies(p, null, Scopes.RUNTIME); + Dependency root = dr.getRoot(); + assertContents(printDependencyTree(root), getName()); + } + + public void testDirectDependencySource() throws Exception { + FileUtil.toFileObject(getWorkDir()).refresh(); + installCompileResources(); + + FileObject testApp = dataFO.getFileObject("projects/dependencies/src/simpleProject"); + FileObject prjCopy = FileUtil.copyFile(testApp, FileUtil.toFileObject(getWorkDir()), "simpleProject"); + + Project p = ProjectManager.getDefault().findProject(prjCopy); + assertNotNull(p); + DependencyResult dr = ProjectDependencies.findDependencies(p, null, Scopes.RUNTIME); + + Dependency dep = dr.getRoot().getChildren().stream().filter(d -> d.getArtifact().getArtifactId().equals("test-lib")).findAny().get(); + SourceLocation srcLoc = dr.getDeclarationRange(dep); + assertNotNull(srcLoc); + assertFalse(srcLoc.isEmpty()); + assertTrue(srcLoc.hasPosition()); + + Path pomPath = p.getLookup().lookup(NbMavenProject.class).getMavenProject().getFile().toPath(); + assertEquals(pomPath.toFile(), FileUtil.toFile(srcLoc.getFile())); + + String s = Files.readString(pomPath); + assertEquals("", s.substring(srcLoc.getEndOffset() - 13, srcLoc.getEndOffset())); + } + + public void testNestedDependencySource() throws Exception { + FileUtil.toFileObject(getWorkDir()).refresh(); + installCompileResources(); + + FileObject testApp = dataFO.getFileObject("projects/dependencies/src/simpleProject"); + FileObject prjCopy = FileUtil.copyFile(testApp, FileUtil.toFileObject(getWorkDir()), "simpleProject"); + + Project p = ProjectManager.getDefault().findProject(prjCopy); + assertNotNull(p); + DependencyResult dr = ProjectDependencies.findDependencies(p, null, Scopes.RUNTIME); + + Dependency libDep = dr.getRoot().getChildren().stream().filter(d -> d.getArtifact().getArtifactId().equals("test-lib")).findAny().get(); + Dependency annoDep = libDep.getChildren().stream().filter(d -> d.getArtifact().getArtifactId().equals("javax.annotation-api")).findAny().get(); + + SourceLocation srcLoc = dr.getDeclarationRange(annoDep); + + Path pomPath = p.getLookup().lookup(NbMavenProject.class).getMavenProject().getFile().toPath(); + assertEquals(pomPath.toFile(), FileUtil.toFile(srcLoc.getFile())); + + String s = Files.readString(pomPath); + assertEquals("", s.substring(srcLoc.getEndOffset() - 13, srcLoc.getEndOffset())); + } + + void assertContents(String contents, String golden) throws IOException { + File f = new File(getDataDir(), "projects/dependencies/golden/" + golden); + Path res = Files.write(getWorkDir().toPath().resolve(getName() + ".output"), + Arrays.asList(contents.split("\n")), + StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING); + assertFile(res.toFile(), f, new File(getWorkDir(), getName() + ".diff")); + } + + static String printDependencyTree(Dependency root) { + StringBuilder sb = new StringBuilder(); + printDependencyTree(root, -1, sb); + return sb.toString(); + } + + static void printDependencyTree(Dependency from, int levels, StringBuilder sb) { + if (levels >= 0) { + sb.append(" "); + } + for (int i = 0; i < levels; i++) { + sb.append("| "); + } + if (levels < 0) { + sb.append("[ ] "); + } else { + sb.append("+-- [ ] "); + } + sb.append(from.getArtifact()); + if (from.getScope() != null) { + sb.append(" / "); sb.append(from.getScope()); + } + sb.append("\n"); + int index = 0; + for (Dependency c : (List)from.getChildren()) { + printDependencyTree(c, levels + 1, sb); + index++; + } + } +} diff --git a/nbbuild/cluster.properties b/nbbuild/cluster.properties index ec87c9719b99..b27cb2c03432 100644 --- a/nbbuild/cluster.properties +++ b/nbbuild/cluster.properties @@ -498,6 +498,7 @@ nb.cluster.ide=\ project.ant,\ project.ant.compat8,\ project.ant.ui,\ + project.dependency,\ project.indexingbridge,\ project.libraries,\ project.libraries.ui,\