You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@maven.apache.org by "ASF GitHub Bot (Jira)" <ji...@apache.org> on 2022/05/28 20:16:00 UTC

[jira] [Commented] (MRESOLVER-262) Provide contextual data in trace data for collector invoked requests

    [ https://issues.apache.org/jira/browse/MRESOLVER-262?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17543530#comment-17543530 ] 

ASF GitHub Bot commented on MRESOLVER-262:
------------------------------------------

michael-o commented on code in PR #182:
URL: https://github.com/apache/maven-resolver/pull/182#discussion_r884173911


##########
maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/ReverseTreeRepositoryListener.java:
##########
@@ -0,0 +1,113 @@
+package org.apache.maven.resolver.examples.util;
+
+/*
+ * 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.
+ */
+
+import java.io.IOException;
+import java.io.UncheckedIOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ListIterator;
+import java.util.Objects;
+
+import org.eclipse.aether.AbstractRepositoryListener;
+import org.eclipse.aether.RepositoryEvent;
+import org.eclipse.aether.RequestTrace;
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.collection.CollectStepData;
+import org.eclipse.aether.graph.Dependency;
+import org.eclipse.aether.graph.DependencyNode;
+
+import static java.util.Objects.requireNonNull;
+
+/**
+ * A demo class building reverse tree using {@link CollectStepData} trace data provided in {@link RepositoryEvent}
+ * events fired during collection.
+ */
+public class ReverseTreeRepositoryListener
+        extends AbstractRepositoryListener
+{
+    @Override
+    public void artifactResolved( RepositoryEvent event )
+    {
+        requireNonNull( event, "event cannot be null" );
+
+        RequestTrace trace = event.getTrace();
+        CollectStepData collectStepTrace = null;
+        while ( trace != null )
+        {
+            if ( trace.getData() instanceof CollectStepData )
+            {
+                collectStepTrace = (CollectStepData) trace.getData();
+                break;
+            }
+            trace = trace.getParent();
+        }
+
+        if ( collectStepTrace == null )
+        {
+            return;
+        }
+
+        Artifact resolvedArtifact = event.getArtifact();
+        Artifact nodeArtifact = collectStepTrace.getNode().getArtifact();
+
+        if ( isInScope( resolvedArtifact, nodeArtifact ) )
+        {
+            Dependency node = collectStepTrace.getNode();
+            String trackingData = node.toString() + " (" + collectStepTrace.getContext() + ")\n";

Review Comment:
   `toString()` is redudant



##########
maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/ReverseTreeRepositoryListener.java:
##########
@@ -0,0 +1,113 @@
+package org.apache.maven.resolver.examples.util;
+
+/*
+ * 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.
+ */
+
+import java.io.IOException;
+import java.io.UncheckedIOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ListIterator;
+import java.util.Objects;
+
+import org.eclipse.aether.AbstractRepositoryListener;
+import org.eclipse.aether.RepositoryEvent;
+import org.eclipse.aether.RequestTrace;
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.collection.CollectStepData;
+import org.eclipse.aether.graph.Dependency;
+import org.eclipse.aether.graph.DependencyNode;
+
+import static java.util.Objects.requireNonNull;
+
+/**
+ * A demo class building reverse tree using {@link CollectStepData} trace data provided in {@link RepositoryEvent}
+ * events fired during collection.
+ */
+public class ReverseTreeRepositoryListener
+        extends AbstractRepositoryListener
+{
+    @Override
+    public void artifactResolved( RepositoryEvent event )
+    {
+        requireNonNull( event, "event cannot be null" );
+
+        RequestTrace trace = event.getTrace();
+        CollectStepData collectStepTrace = null;
+        while ( trace != null )
+        {
+            if ( trace.getData() instanceof CollectStepData )
+            {
+                collectStepTrace = (CollectStepData) trace.getData();
+                break;
+            }
+            trace = trace.getParent();
+        }
+
+        if ( collectStepTrace == null )
+        {
+            return;
+        }
+
+        Artifact resolvedArtifact = event.getArtifact();
+        Artifact nodeArtifact = collectStepTrace.getNode().getArtifact();
+
+        if ( isInScope( resolvedArtifact, nodeArtifact ) )
+        {
+            Dependency node = collectStepTrace.getNode();
+            String trackingData = node.toString() + " (" + collectStepTrace.getContext() + ")\n";
+            String indent = "";
+            ListIterator<DependencyNode> iter = collectStepTrace.getPath()
+                    .listIterator( collectStepTrace.getPath().size() );
+            while ( iter.hasPrevious() )
+            {
+                DependencyNode curr = iter.previous();
+                indent += "  ";
+                trackingData += indent + curr + " (" + collectStepTrace.getContext() + ")\n";

Review Comment:
   `System.lineSeparator()`



##########
maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/ReverseTreeRepositoryListener.java:
##########
@@ -0,0 +1,113 @@
+package org.apache.maven.resolver.examples.util;
+
+/*
+ * 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.
+ */
+
+import java.io.IOException;
+import java.io.UncheckedIOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ListIterator;
+import java.util.Objects;
+
+import org.eclipse.aether.AbstractRepositoryListener;
+import org.eclipse.aether.RepositoryEvent;
+import org.eclipse.aether.RequestTrace;
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.collection.CollectStepData;
+import org.eclipse.aether.graph.Dependency;
+import org.eclipse.aether.graph.DependencyNode;
+
+import static java.util.Objects.requireNonNull;
+
+/**
+ * A demo class building reverse tree using {@link CollectStepData} trace data provided in {@link RepositoryEvent}
+ * events fired during collection.
+ */
+public class ReverseTreeRepositoryListener
+        extends AbstractRepositoryListener
+{
+    @Override
+    public void artifactResolved( RepositoryEvent event )
+    {
+        requireNonNull( event, "event cannot be null" );
+
+        RequestTrace trace = event.getTrace();
+        CollectStepData collectStepTrace = null;
+        while ( trace != null )
+        {
+            if ( trace.getData() instanceof CollectStepData )
+            {
+                collectStepTrace = (CollectStepData) trace.getData();
+                break;
+            }
+            trace = trace.getParent();
+        }
+
+        if ( collectStepTrace == null )
+        {
+            return;
+        }
+
+        Artifact resolvedArtifact = event.getArtifact();
+        Artifact nodeArtifact = collectStepTrace.getNode().getArtifact();
+
+        if ( isInScope( resolvedArtifact, nodeArtifact ) )
+        {
+            Dependency node = collectStepTrace.getNode();
+            String trackingData = node.toString() + " (" + collectStepTrace.getContext() + ")\n";

Review Comment:
   `System.lineSeparator()`



##########
maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/ReverseTreeRepositoryListener.java:
##########
@@ -0,0 +1,113 @@
+package org.apache.maven.resolver.examples.util;
+
+/*
+ * 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.
+ */
+
+import java.io.IOException;
+import java.io.UncheckedIOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ListIterator;
+import java.util.Objects;
+
+import org.eclipse.aether.AbstractRepositoryListener;
+import org.eclipse.aether.RepositoryEvent;
+import org.eclipse.aether.RequestTrace;
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.collection.CollectStepData;
+import org.eclipse.aether.graph.Dependency;
+import org.eclipse.aether.graph.DependencyNode;
+
+import static java.util.Objects.requireNonNull;
+
+/**
+ * A demo class building reverse tree using {@link CollectStepData} trace data provided in {@link RepositoryEvent}
+ * events fired during collection.
+ */
+public class ReverseTreeRepositoryListener
+        extends AbstractRepositoryListener
+{
+    @Override
+    public void artifactResolved( RepositoryEvent event )
+    {
+        requireNonNull( event, "event cannot be null" );
+
+        RequestTrace trace = event.getTrace();
+        CollectStepData collectStepTrace = null;
+        while ( trace != null )
+        {
+            if ( trace.getData() instanceof CollectStepData )
+            {
+                collectStepTrace = (CollectStepData) trace.getData();
+                break;
+            }
+            trace = trace.getParent();
+        }
+
+        if ( collectStepTrace == null )
+        {
+            return;
+        }
+
+        Artifact resolvedArtifact = event.getArtifact();
+        Artifact nodeArtifact = collectStepTrace.getNode().getArtifact();
+
+        if ( isInScope( resolvedArtifact, nodeArtifact ) )
+        {
+            Dependency node = collectStepTrace.getNode();
+            String trackingData = node.toString() + " (" + collectStepTrace.getContext() + ")\n";
+            String indent = "";
+            ListIterator<DependencyNode> iter = collectStepTrace.getPath()
+                    .listIterator( collectStepTrace.getPath().size() );
+            while ( iter.hasPrevious() )
+            {
+                DependencyNode curr = iter.previous();
+                indent += "  ";
+                trackingData += indent + curr + " (" + collectStepTrace.getContext() + ")\n";
+            }
+            try
+            {
+                Path trackingDir = resolvedArtifact.getFile().getParentFile().toPath().resolve( ".tracking" );
+                Files.createDirectories( trackingDir );
+                Path trackingFile = trackingDir.resolve( collectStepTrace.getPath().get( 0 )
+                        .getArtifact().toString().replace( ":", "_" ) );
+                Files.write( trackingFile, trackingData.getBytes( StandardCharsets.UTF_8 ) );
+                System.out.println( trackingData );
+            }
+            catch ( IOException e )
+            {
+                throw new UncheckedIOException( e );
+            }
+        }
+    }
+
+    /**
+     * The event "artifact resolved" if fired WHENEVER an artifact is resolved, BUT, it happens also when an artifact
+     * descriptor (model, the POM) is being built, and parent (and parent of parent...) is being asked for. Hence, this
+     * method "filters" out in WHICH artifact are we interested in, but it intentionally neglects extension, as
+     * ArtifactDescriptorReader modifies extension to "pom" during collect. So all we have to rely on is GAV only.
+     */
+    private boolean isInScope( Artifact artifact, Artifact nodeArtifact )
+    {
+        return Objects.equals( artifact.getGroupId(), nodeArtifact.getGroupId() )
+                && Objects.equals( artifact.getArtifactId(), nodeArtifact.getArtifactId() )
+                && Objects.equals( artifact.getVersion(), nodeArtifact.getVersion() );
+    }

Review Comment:
   Classifier and type don't matter?



##########
maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/ReverseTreeRepositoryListener.java:
##########
@@ -0,0 +1,113 @@
+package org.apache.maven.resolver.examples.util;
+
+/*
+ * 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.
+ */
+
+import java.io.IOException;
+import java.io.UncheckedIOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ListIterator;
+import java.util.Objects;
+
+import org.eclipse.aether.AbstractRepositoryListener;
+import org.eclipse.aether.RepositoryEvent;
+import org.eclipse.aether.RequestTrace;
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.collection.CollectStepData;
+import org.eclipse.aether.graph.Dependency;
+import org.eclipse.aether.graph.DependencyNode;
+
+import static java.util.Objects.requireNonNull;
+
+/**
+ * A demo class building reverse tree using {@link CollectStepData} trace data provided in {@link RepositoryEvent}
+ * events fired during collection.
+ */
+public class ReverseTreeRepositoryListener
+        extends AbstractRepositoryListener
+{
+    @Override
+    public void artifactResolved( RepositoryEvent event )
+    {
+        requireNonNull( event, "event cannot be null" );
+
+        RequestTrace trace = event.getTrace();
+        CollectStepData collectStepTrace = null;
+        while ( trace != null )
+        {
+            if ( trace.getData() instanceof CollectStepData )
+            {
+                collectStepTrace = (CollectStepData) trace.getData();
+                break;
+            }
+            trace = trace.getParent();
+        }
+
+        if ( collectStepTrace == null )
+        {
+            return;
+        }
+
+        Artifact resolvedArtifact = event.getArtifact();
+        Artifact nodeArtifact = collectStepTrace.getNode().getArtifact();
+
+        if ( isInScope( resolvedArtifact, nodeArtifact ) )
+        {
+            Dependency node = collectStepTrace.getNode();
+            String trackingData = node.toString() + " (" + collectStepTrace.getContext() + ")\n";
+            String indent = "";
+            ListIterator<DependencyNode> iter = collectStepTrace.getPath()
+                    .listIterator( collectStepTrace.getPath().size() );
+            while ( iter.hasPrevious() )
+            {
+                DependencyNode curr = iter.previous();
+                indent += "  ";
+                trackingData += indent + curr + " (" + collectStepTrace.getContext() + ")\n";
+            }
+            try
+            {
+                Path trackingDir = resolvedArtifact.getFile().getParentFile().toPath().resolve( ".tracking" );
+                Files.createDirectories( trackingDir );
+                Path trackingFile = trackingDir.resolve( collectStepTrace.getPath().get( 0 )
+                        .getArtifact().toString().replace( ":", "_" ) );
+                Files.write( trackingFile, trackingData.getBytes( StandardCharsets.UTF_8 ) );
+                System.out.println( trackingData );
+            }
+            catch ( IOException e )
+            {
+                throw new UncheckedIOException( e );
+            }
+        }
+    }
+
+    /**
+     * The event "artifact resolved" if fired WHENEVER an artifact is resolved, BUT, it happens also when an artifact
+     * descriptor (model, the POM) is being built, and parent (and parent of parent...) is being asked for. Hence, this
+     * method "filters" out in WHICH artifact are we interested in, but it intentionally neglects extension, as

Review Comment:
   extension as



##########
maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/ReverseTreeRepositoryListener.java:
##########
@@ -0,0 +1,113 @@
+package org.apache.maven.resolver.examples.util;
+
+/*
+ * 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.
+ */
+
+import java.io.IOException;
+import java.io.UncheckedIOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ListIterator;
+import java.util.Objects;
+
+import org.eclipse.aether.AbstractRepositoryListener;
+import org.eclipse.aether.RepositoryEvent;
+import org.eclipse.aether.RequestTrace;
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.collection.CollectStepData;
+import org.eclipse.aether.graph.Dependency;
+import org.eclipse.aether.graph.DependencyNode;
+
+import static java.util.Objects.requireNonNull;
+
+/**
+ * A demo class building reverse tree using {@link CollectStepData} trace data provided in {@link RepositoryEvent}
+ * events fired during collection.
+ */
+public class ReverseTreeRepositoryListener
+        extends AbstractRepositoryListener
+{
+    @Override
+    public void artifactResolved( RepositoryEvent event )
+    {
+        requireNonNull( event, "event cannot be null" );
+
+        RequestTrace trace = event.getTrace();
+        CollectStepData collectStepTrace = null;
+        while ( trace != null )
+        {
+            if ( trace.getData() instanceof CollectStepData )
+            {
+                collectStepTrace = (CollectStepData) trace.getData();
+                break;
+            }
+            trace = trace.getParent();
+        }
+
+        if ( collectStepTrace == null )
+        {
+            return;
+        }
+
+        Artifact resolvedArtifact = event.getArtifact();
+        Artifact nodeArtifact = collectStepTrace.getNode().getArtifact();
+
+        if ( isInScope( resolvedArtifact, nodeArtifact ) )
+        {
+            Dependency node = collectStepTrace.getNode();
+            String trackingData = node.toString() + " (" + collectStepTrace.getContext() + ")\n";
+            String indent = "";
+            ListIterator<DependencyNode> iter = collectStepTrace.getPath()
+                    .listIterator( collectStepTrace.getPath().size() );
+            while ( iter.hasPrevious() )
+            {
+                DependencyNode curr = iter.previous();
+                indent += "  ";
+                trackingData += indent + curr + " (" + collectStepTrace.getContext() + ")\n";
+            }
+            try
+            {
+                Path trackingDir = resolvedArtifact.getFile().getParentFile().toPath().resolve( ".tracking" );
+                Files.createDirectories( trackingDir );
+                Path trackingFile = trackingDir.resolve( collectStepTrace.getPath().get( 0 )
+                        .getArtifact().toString().replace( ":", "_" ) );
+                Files.write( trackingFile, trackingData.getBytes( StandardCharsets.UTF_8 ) );
+                System.out.println( trackingData );
+            }
+            catch ( IOException e )
+            {
+                throw new UncheckedIOException( e );
+            }
+        }
+    }
+
+    /**
+     * The event "artifact resolved" if fired WHENEVER an artifact is resolved, BUT, it happens also when an artifact

Review Comment:
   BUT it...





> Provide contextual data in trace data for collector invoked requests
> --------------------------------------------------------------------
>
>                 Key: MRESOLVER-262
>                 URL: https://issues.apache.org/jira/browse/MRESOLVER-262
>             Project: Maven Resolver
>          Issue Type: Task
>          Components: Resolver
>            Reporter: Tamás Cservenák
>            Priority: Major
>             Fix For: 1.8.1
>
>
> During collection several RepositoryEvents are fired, but they does not carry any context related data regarding artifact collection.
> Simplest solution would be to extend RequestTrace to provide:
>  * request context
>  * the artifact path (from root to leaf)
>  * leaf artifact being collected



--
This message was sent by Atlassian Jira
(v8.20.7#820007)