You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by hb...@apache.org on 2016/05/07 13:24:28 UTC

[03/36] maven-aether git commit: Renamed package o.e.a.demo.* to o.e.a.examples.* to better comply with Eclipse naming conventions

http://git-wip-us.apache.org/repos/asf/maven-aether/blob/e86cfec6/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/ResolveTransitiveDependencies.java
----------------------------------------------------------------------
diff --git a/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/ResolveTransitiveDependencies.java b/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/ResolveTransitiveDependencies.java
new file mode 100644
index 0000000..a178221
--- /dev/null
+++ b/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/ResolveTransitiveDependencies.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2010, 2011 Sonatype, Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Sonatype, Inc. - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.aether.examples;
+
+import java.util.List;
+
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.collection.CollectRequest;
+import org.eclipse.aether.examples.util.Booter;
+import org.eclipse.aether.graph.Dependency;
+import org.eclipse.aether.graph.DependencyFilter;
+import org.eclipse.aether.repository.RemoteRepository;
+import org.eclipse.aether.resolution.ArtifactResult;
+import org.eclipse.aether.resolution.DependencyRequest;
+import org.eclipse.aether.util.artifact.DefaultArtifact;
+import org.eclipse.aether.util.artifact.JavaScopes;
+import org.eclipse.aether.util.filter.DependencyFilterUtils;
+
+
+/**
+ * Resolves the transitive (compile) dependencies of an artifact.
+ */
+public class ResolveTransitiveDependencies
+{
+
+    public static void main( String[] args )
+        throws Exception
+    {
+        System.out.println( "------------------------------------------------------------" );
+        System.out.println( ResolveTransitiveDependencies.class.getSimpleName() );
+
+        RepositorySystem system = Booter.newRepositorySystem();
+
+        RepositorySystemSession session = Booter.newRepositorySystemSession( system );
+
+        Artifact artifact = new DefaultArtifact( "org.sonatype.aether:aether-impl:1.13" );
+
+        RemoteRepository repo = Booter.newCentralRepository();
+
+        DependencyFilter classpathFlter = DependencyFilterUtils.classpathFilter( JavaScopes.COMPILE );
+
+        CollectRequest collectRequest = new CollectRequest();
+        collectRequest.setRoot( new Dependency( artifact, JavaScopes.COMPILE ) );
+        collectRequest.addRepository( repo );
+
+        DependencyRequest dependencyRequest = new DependencyRequest( collectRequest, classpathFlter );
+
+        List<ArtifactResult> artifactResults =
+            system.resolveDependencies( session, dependencyRequest ).getArtifactResults();
+
+        for ( ArtifactResult artifactResult : artifactResults )
+        {
+            System.out.println( artifactResult.getArtifact() + " resolved to " + artifactResult.getArtifact().getFile() );
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/maven-aether/blob/e86cfec6/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/aether/Aether.java
----------------------------------------------------------------------
diff --git a/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/aether/Aether.java b/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/aether/Aether.java
new file mode 100644
index 0000000..9262699
--- /dev/null
+++ b/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/aether/Aether.java
@@ -0,0 +1,120 @@
+/*******************************************************************************
+ * Copyright (c) 2010, 2011 Sonatype, Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Sonatype, Inc. - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.aether.examples.aether;
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.collection.CollectRequest;
+import org.eclipse.aether.deployment.DeployRequest;
+import org.eclipse.aether.deployment.DeploymentException;
+import org.eclipse.aether.examples.util.Booter;
+import org.eclipse.aether.examples.util.ConsoleDependencyGraphDumper;
+import org.eclipse.aether.graph.Dependency;
+import org.eclipse.aether.graph.DependencyNode;
+import org.eclipse.aether.installation.InstallRequest;
+import org.eclipse.aether.installation.InstallationException;
+import org.eclipse.aether.repository.Authentication;
+import org.eclipse.aether.repository.LocalRepository;
+import org.eclipse.aether.repository.RemoteRepository;
+import org.eclipse.aether.resolution.DependencyRequest;
+import org.eclipse.aether.resolution.DependencyResolutionException;
+import org.eclipse.aether.util.DefaultRepositorySystemSession;
+import org.eclipse.aether.util.artifact.DefaultArtifact;
+import org.eclipse.aether.util.graph.PreorderNodeListGenerator;
+
+
+public class Aether
+{
+    private String remoteRepository;
+
+    private RepositorySystem repositorySystem;
+
+    private LocalRepository localRepository;
+
+    public Aether( String remoteRepository, String localRepository )
+    {
+        this.remoteRepository = remoteRepository;
+        this.repositorySystem = Booter.newRepositorySystem();
+        this.localRepository = new LocalRepository( localRepository );
+    }
+
+    private RepositorySystemSession newSession()
+    {
+        DefaultRepositorySystemSession session = Booter.newRepositorySystemSession( repositorySystem );
+        session.setLocalRepositoryManager( repositorySystem.newLocalRepositoryManager( localRepository ) );
+        return session;
+    }
+
+    public AetherResult resolve( String groupId, String artifactId, String version )
+        throws DependencyResolutionException
+    {
+        RepositorySystemSession session = newSession();
+        Dependency dependency =
+            new Dependency( new DefaultArtifact( groupId, artifactId, "", "jar", version ), "runtime" );
+        RemoteRepository central = new RemoteRepository( "central", "default", remoteRepository );
+
+        CollectRequest collectRequest = new CollectRequest();
+        collectRequest.setRoot( dependency );
+        collectRequest.addRepository( central );
+
+        DependencyRequest dependencyRequest = new DependencyRequest();
+        dependencyRequest.setCollectRequest( collectRequest );
+
+        DependencyNode rootNode = repositorySystem.resolveDependencies( session, dependencyRequest ).getRoot();
+
+        StringBuilder dump = new StringBuilder();
+        displayTree( rootNode, dump );
+
+        PreorderNodeListGenerator nlg = new PreorderNodeListGenerator();
+        rootNode.accept( nlg );
+
+        return new AetherResult( rootNode, nlg.getFiles(), nlg.getClassPath() );
+    }
+
+    public void install( Artifact artifact, Artifact pom )
+        throws InstallationException
+    {
+        RepositorySystemSession session = newSession();
+
+        InstallRequest installRequest = new InstallRequest();
+        installRequest.addArtifact( artifact ).addArtifact( pom );
+
+        repositorySystem.install( session, installRequest );
+    }
+
+    public void deploy( Artifact artifact, Artifact pom, String remoteRepository )
+        throws DeploymentException
+    {
+        RepositorySystemSession session = newSession();
+
+        RemoteRepository nexus = new RemoteRepository( "nexus", "default", remoteRepository );
+        Authentication authentication = new Authentication( "admin", "admin123" );
+        nexus.setAuthentication( authentication );
+
+        DeployRequest deployRequest = new DeployRequest();
+        deployRequest.addArtifact( artifact ).addArtifact( pom );
+        deployRequest.setRepository( nexus );
+
+        repositorySystem.deploy( session, deployRequest );
+    }
+
+    private void displayTree( DependencyNode node, StringBuilder sb )
+    {
+        ByteArrayOutputStream os = new ByteArrayOutputStream( 1024 );
+        node.accept( new ConsoleDependencyGraphDumper( new PrintStream( os ) ) );
+        sb.append( os.toString() );
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/maven-aether/blob/e86cfec6/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/aether/AetherDemo.java
----------------------------------------------------------------------
diff --git a/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/aether/AetherDemo.java b/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/aether/AetherDemo.java
new file mode 100644
index 0000000..c5d39bc
--- /dev/null
+++ b/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/aether/AetherDemo.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2010, 2011 Sonatype, Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Sonatype, Inc. - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.aether.examples.aether;
+
+import java.io.File;
+import java.util.List;
+
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.deployment.DeploymentException;
+import org.eclipse.aether.graph.DependencyNode;
+import org.eclipse.aether.installation.InstallationException;
+import org.eclipse.aether.resolution.DependencyResolutionException;
+import org.eclipse.aether.util.artifact.DefaultArtifact;
+import org.eclipse.aether.util.artifact.SubArtifact;
+
+@SuppressWarnings( "unused" )
+public class AetherDemo
+{
+
+    public void resolve() 
+        throws DependencyResolutionException
+    {
+        Aether aether = new Aether( "http://localhost:8081/nexus/content/groups/public", "/Users/jvanzyl/aether-repo" );
+                
+        AetherResult result = aether.resolve( "com.mycompany.app", "super-app", "1.0" );
+
+        // Get the root of the resolved tree of artifacts
+        //
+        DependencyNode root = result.getRoot();
+
+        // Get the list of files for the artifacts resolved
+        //
+        List<File> artifacts = result.getResolvedFiles();
+        
+        // Get the classpath of the artifacts resolved
+        //
+        String classpath = result.getResolvedClassPath();        
+    }
+    
+    public void installAndDeploy() 
+        throws InstallationException, DeploymentException
+    {
+        Aether aether = new Aether( "http://localhost:8081/nexus/content/groups/public", "/Users/jvanzyl/aether-repo" );
+        
+        Artifact artifact = new DefaultArtifact( "com.mycompany.super", "super-core", "jar", "0.1-SNAPSHOT" );
+        artifact = artifact.setFile( new File( "jar-from-whatever-process.jar" ) );
+        Artifact pom = new SubArtifact( artifact, null, "pom" );
+        pom = pom.setFile( new File( "pom-from-whatever-process.xml" ) );
+          
+        // Install into the local repository specified
+        //
+        aether.install( artifact, pom );
+        
+        // Deploy to a remote reposistory
+        //
+        aether.deploy( artifact, pom, "http://localhost:8081/nexus/content/repositories/snapshots/" );
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/maven-aether/blob/e86cfec6/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/aether/AetherResult.java
----------------------------------------------------------------------
diff --git a/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/aether/AetherResult.java b/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/aether/AetherResult.java
new file mode 100644
index 0000000..ade17ed
--- /dev/null
+++ b/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/aether/AetherResult.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2010, 2011 Sonatype, Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Sonatype, Inc. - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.aether.examples.aether;
+
+import java.io.File;
+import java.util.List;
+
+import org.eclipse.aether.graph.DependencyNode;
+
+public class AetherResult
+{
+    private DependencyNode root;
+    private List<File> resolvedFiles;
+    private String resolvedClassPath;
+    
+    public AetherResult( DependencyNode root, List<File> resolvedFiles, String resolvedClassPath )
+    {
+        this.root = root;
+        this.resolvedFiles = resolvedFiles;
+        this.resolvedClassPath = resolvedClassPath;
+    }
+
+    public DependencyNode getRoot()
+    {
+        return root;
+    }
+
+    public List<File> getResolvedFiles()
+    {
+        return resolvedFiles;
+    }
+
+    public String getResolvedClassPath()
+    {
+        return resolvedClassPath;
+    }
+}

http://git-wip-us.apache.org/repos/asf/maven-aether/blob/e86cfec6/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/manual/ManualRepositorySystemFactory.java
----------------------------------------------------------------------
diff --git a/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/manual/ManualRepositorySystemFactory.java b/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/manual/ManualRepositorySystemFactory.java
new file mode 100644
index 0000000..6dfa2cd
--- /dev/null
+++ b/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/manual/ManualRepositorySystemFactory.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2010, 2011 Sonatype, Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Sonatype, Inc. - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.aether.examples.manual;
+
+import org.apache.maven.repository.internal.DefaultServiceLocator;
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.connector.file.FileRepositoryConnectorFactory;
+import org.eclipse.aether.connector.wagon.WagonProvider;
+import org.eclipse.aether.connector.wagon.WagonRepositoryConnectorFactory;
+import org.eclipse.aether.spi.connector.RepositoryConnectorFactory;
+
+/**
+ * A factory for repository system instances that employs Aether's built-in service locator infrastructure to wire up
+ * the system's components.
+ */
+public class ManualRepositorySystemFactory
+{
+
+    public static RepositorySystem newRepositorySystem()
+    {
+        /*
+         * Aether's components implement org.eclipse.aether.spi.locator.Service to ease manual wiring and using the
+         * prepopulated DefaultServiceLocator, we only need to register the repository connector factories.
+         */
+        DefaultServiceLocator locator = new DefaultServiceLocator();
+        locator.addService( RepositoryConnectorFactory.class, FileRepositoryConnectorFactory.class );
+        locator.addService( RepositoryConnectorFactory.class, WagonRepositoryConnectorFactory.class );
+        locator.setServices( WagonProvider.class, new ManualWagonProvider() );
+
+        return locator.getService( RepositorySystem.class );
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/maven-aether/blob/e86cfec6/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/manual/ManualWagonProvider.java
----------------------------------------------------------------------
diff --git a/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/manual/ManualWagonProvider.java b/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/manual/ManualWagonProvider.java
new file mode 100644
index 0000000..3533e88
--- /dev/null
+++ b/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/manual/ManualWagonProvider.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2010, 2011 Sonatype, Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Sonatype, Inc. - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.aether.examples.manual;
+
+import org.apache.maven.wagon.Wagon;
+import org.eclipse.aether.connector.wagon.WagonProvider;
+import org.sonatype.maven.wagon.AhcWagon;
+
+/**
+ * A simplistic provider for wagon instances when no Plexus-compatible IoC container is used.
+ */
+public class ManualWagonProvider
+    implements WagonProvider
+{
+
+    public Wagon lookup( String roleHint )
+        throws Exception
+    {
+        if ( "http".equals( roleHint ) )
+        {
+            return new AhcWagon();
+        }
+        return null;
+    }
+
+    public void release( Wagon wagon )
+    {
+
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/maven-aether/blob/e86cfec6/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/plexus/PlexusRepositorySystemFactory.java
----------------------------------------------------------------------
diff --git a/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/plexus/PlexusRepositorySystemFactory.java b/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/plexus/PlexusRepositorySystemFactory.java
new file mode 100644
index 0000000..fbed875
--- /dev/null
+++ b/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/plexus/PlexusRepositorySystemFactory.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2010, 2011 Sonatype, Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Sonatype, Inc. - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.aether.examples.plexus;
+
+import org.codehaus.plexus.DefaultPlexusContainer;
+import org.eclipse.aether.RepositorySystem;
+
+/**
+ * A factory for repository system instances that employs Plexus to wire up the system's components.
+ */
+public class PlexusRepositorySystemFactory
+{
+
+    public static RepositorySystem newRepositorySystem()
+    {
+        /*
+         * Aether's components are equipped with plexus-specific metadata to enable discovery and wiring of components
+         * by a Plexus container so this is as easy as looking up the implementation.
+         */
+        try
+        {
+            return new DefaultPlexusContainer().lookup( RepositorySystem.class );
+        }
+        catch ( Exception e )
+        {
+            throw new IllegalStateException( "dependency injection failed", e );
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/maven-aether/blob/e86cfec6/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/util/Booter.java
----------------------------------------------------------------------
diff --git a/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/util/Booter.java b/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/util/Booter.java
new file mode 100644
index 0000000..d362a9b
--- /dev/null
+++ b/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/util/Booter.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2010, 2011 Sonatype, Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Sonatype, Inc. - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.aether.examples.util;
+
+import org.apache.maven.repository.internal.MavenRepositorySystemSession;
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.examples.manual.ManualRepositorySystemFactory;
+import org.eclipse.aether.repository.LocalRepository;
+import org.eclipse.aether.repository.RemoteRepository;
+import org.eclipse.aether.util.DefaultRepositorySystemSession;
+
+
+/**
+ * A helper to boot the repository system and a repository system session.
+ */
+public class Booter
+{
+
+    public static RepositorySystem newRepositorySystem()
+    {
+        return ManualRepositorySystemFactory.newRepositorySystem();
+    }
+
+    public static DefaultRepositorySystemSession newRepositorySystemSession( RepositorySystem system )
+    {
+        MavenRepositorySystemSession session = new MavenRepositorySystemSession();
+
+        LocalRepository localRepo = new LocalRepository( "target/local-repo" );
+        session.setLocalRepositoryManager( system.newLocalRepositoryManager( localRepo ) );
+
+        session.setTransferListener( new ConsoleTransferListener() );
+        session.setRepositoryListener( new ConsoleRepositoryListener() );
+
+        // uncomment to generate dirty trees
+        // session.setDependencyGraphTransformer( null );
+
+        return session;
+    }
+
+    public static RemoteRepository newCentralRepository()
+    {
+        return new RemoteRepository( "central", "default", "http://repo1.maven.org/maven2/" );
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/maven-aether/blob/e86cfec6/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/util/ConsoleDependencyGraphDumper.java
----------------------------------------------------------------------
diff --git a/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/util/ConsoleDependencyGraphDumper.java b/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/util/ConsoleDependencyGraphDumper.java
new file mode 100644
index 0000000..59867a3
--- /dev/null
+++ b/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/util/ConsoleDependencyGraphDumper.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2010, 2011 Sonatype, Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Sonatype, Inc. - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.aether.examples.util;
+
+import java.io.PrintStream;
+
+import org.eclipse.aether.graph.DependencyNode;
+import org.eclipse.aether.graph.DependencyVisitor;
+
+/**
+ * A dependency visitor that dumps the graph to the console.
+ */
+public class ConsoleDependencyGraphDumper
+    implements DependencyVisitor
+{
+
+    private PrintStream out;
+
+    private String currentIndent = "";
+
+    public ConsoleDependencyGraphDumper()
+    {
+        this( null );
+    }
+
+    public ConsoleDependencyGraphDumper( PrintStream out )
+    {
+        this.out = ( out != null ) ? out : System.out;
+    }
+
+    public boolean visitEnter( DependencyNode node )
+    {
+        out.println( currentIndent + node );
+        if ( currentIndent.length() <= 0 )
+        {
+            currentIndent = "+- ";
+        }
+        else
+        {
+            currentIndent = "|  " + currentIndent;
+        }
+        return true;
+    }
+
+    public boolean visitLeave( DependencyNode node )
+    {
+        currentIndent = currentIndent.substring( 3, currentIndent.length() );
+        return true;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/maven-aether/blob/e86cfec6/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/util/ConsoleRepositoryListener.java
----------------------------------------------------------------------
diff --git a/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/util/ConsoleRepositoryListener.java b/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/util/ConsoleRepositoryListener.java
new file mode 100644
index 0000000..b79091e
--- /dev/null
+++ b/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/util/ConsoleRepositoryListener.java
@@ -0,0 +1,123 @@
+/*******************************************************************************
+ * Copyright (c) 2010, 2011 Sonatype, Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Sonatype, Inc. - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.aether.examples.util;
+
+import java.io.PrintStream;
+
+import org.eclipse.aether.AbstractRepositoryListener;
+import org.eclipse.aether.RepositoryEvent;
+
+/**
+ * A simplistic repository listener that logs events to the console.
+ */
+public class ConsoleRepositoryListener
+    extends AbstractRepositoryListener
+{
+
+    private PrintStream out;
+
+    public ConsoleRepositoryListener()
+    {
+        this( null );
+    }
+
+    public ConsoleRepositoryListener( PrintStream out )
+    {
+        this.out = ( out != null ) ? out : System.out;
+    }
+
+    public void artifactDeployed( RepositoryEvent event )
+    {
+        out.println( "Deployed " + event.getArtifact() + " to " + event.getRepository() );
+    }
+
+    public void artifactDeploying( RepositoryEvent event )
+    {
+        out.println( "Deploying " + event.getArtifact() + " to " + event.getRepository() );
+    }
+
+    public void artifactDescriptorInvalid( RepositoryEvent event )
+    {
+        out.println( "Invalid artifact descriptor for " + event.getArtifact() + ": "
+            + event.getException().getMessage() );
+    }
+
+    public void artifactDescriptorMissing( RepositoryEvent event )
+    {
+        out.println( "Missing artifact descriptor for " + event.getArtifact() );
+    }
+
+    public void artifactInstalled( RepositoryEvent event )
+    {
+        out.println( "Installed " + event.getArtifact() + " to " + event.getFile() );
+    }
+
+    public void artifactInstalling( RepositoryEvent event )
+    {
+        out.println( "Installing " + event.getArtifact() + " to " + event.getFile() );
+    }
+
+    public void artifactResolved( RepositoryEvent event )
+    {
+        out.println( "Resolved artifact " + event.getArtifact() + " from " + event.getRepository() );
+    }
+
+    public void artifactDownloading( RepositoryEvent event )
+    {
+        out.println( "Downloading artifact " + event.getArtifact() + " from " + event.getRepository() );
+    }
+
+    public void artifactDownloaded( RepositoryEvent event )
+    {
+        out.println( "Downloaded artifact " + event.getArtifact() + " from " + event.getRepository() );
+    }
+
+    public void artifactResolving( RepositoryEvent event )
+    {
+        out.println( "Resolving artifact " + event.getArtifact() );
+    }
+
+    public void metadataDeployed( RepositoryEvent event )
+    {
+        out.println( "Deployed " + event.getMetadata() + " to " + event.getRepository() );
+    }
+
+    public void metadataDeploying( RepositoryEvent event )
+    {
+        out.println( "Deploying " + event.getMetadata() + " to " + event.getRepository() );
+    }
+
+    public void metadataInstalled( RepositoryEvent event )
+    {
+        out.println( "Installed " + event.getMetadata() + " to " + event.getFile() );
+    }
+
+    public void metadataInstalling( RepositoryEvent event )
+    {
+        out.println( "Installing " + event.getMetadata() + " to " + event.getFile() );
+    }
+
+    public void metadataInvalid( RepositoryEvent event )
+    {
+        out.println( "Invalid metadata " + event.getMetadata() );
+    }
+
+    public void metadataResolved( RepositoryEvent event )
+    {
+        out.println( "Resolved metadata " + event.getMetadata() + " from " + event.getRepository() );
+    }
+
+    public void metadataResolving( RepositoryEvent event )
+    {
+        out.println( "Resolving metadata " + event.getMetadata() + " from " + event.getRepository() );
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/maven-aether/blob/e86cfec6/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/util/ConsoleTransferListener.java
----------------------------------------------------------------------
diff --git a/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/util/ConsoleTransferListener.java b/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/util/ConsoleTransferListener.java
new file mode 100644
index 0000000..f162975
--- /dev/null
+++ b/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/util/ConsoleTransferListener.java
@@ -0,0 +1,164 @@
+/*******************************************************************************
+ * Copyright (c) 2010, 2011 Sonatype, Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Sonatype, Inc. - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.aether.examples.util;
+
+import java.io.PrintStream;
+import java.text.DecimalFormat;
+import java.text.DecimalFormatSymbols;
+import java.util.Locale;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.eclipse.aether.transfer.AbstractTransferListener;
+import org.eclipse.aether.transfer.TransferEvent;
+import org.eclipse.aether.transfer.TransferResource;
+
+/**
+ * A simplistic transfer listener that logs uploads/downloads to the console.
+ */
+public class ConsoleTransferListener
+    extends AbstractTransferListener
+{
+
+    private PrintStream out;
+
+    private Map<TransferResource, Long> downloads = new ConcurrentHashMap<TransferResource, Long>();
+
+    private int lastLength;
+
+    public ConsoleTransferListener()
+    {
+        this( null );
+    }
+
+    public ConsoleTransferListener( PrintStream out )
+    {
+        this.out = ( out != null ) ? out : System.out;
+    }
+
+    @Override
+    public void transferInitiated( TransferEvent event )
+    {
+        String message = event.getRequestType() == TransferEvent.RequestType.PUT ? "Uploading" : "Downloading";
+
+        out.println( message + ": " + event.getResource().getRepositoryUrl() + event.getResource().getResourceName() );
+    }
+
+    @Override
+    public void transferProgressed( TransferEvent event )
+    {
+        TransferResource resource = event.getResource();
+        downloads.put( resource, Long.valueOf( event.getTransferredBytes() ) );
+
+        StringBuilder buffer = new StringBuilder( 64 );
+
+        for ( Map.Entry<TransferResource, Long> entry : downloads.entrySet() )
+        {
+            long total = entry.getKey().getContentLength();
+            long complete = entry.getValue().longValue();
+
+            buffer.append( getStatus( complete, total ) ).append( "  " );
+        }
+
+        int pad = lastLength - buffer.length();
+        lastLength = buffer.length();
+        pad( buffer, pad );
+        buffer.append( '\r' );
+
+        out.print( buffer );
+    }
+
+    private String getStatus( long complete, long total )
+    {
+        if ( total >= 1024 )
+        {
+            return toKB( complete ) + "/" + toKB( total ) + " KB ";
+        }
+        else if ( total >= 0 )
+        {
+            return complete + "/" + total + " B ";
+        }
+        else if ( complete >= 1024 )
+        {
+            return toKB( complete ) + " KB ";
+        }
+        else
+        {
+            return complete + " B ";
+        }
+    }
+
+    private void pad( StringBuilder buffer, int spaces )
+    {
+        String block = "                                        ";
+        while ( spaces > 0 )
+        {
+            int n = Math.min( spaces, block.length() );
+            buffer.append( block, 0, n );
+            spaces -= n;
+        }
+    }
+
+    @Override
+    public void transferSucceeded( TransferEvent event )
+    {
+        transferCompleted( event );
+
+        TransferResource resource = event.getResource();
+        long contentLength = event.getTransferredBytes();
+        if ( contentLength >= 0 )
+        {
+            String type = ( event.getRequestType() == TransferEvent.RequestType.PUT ? "Uploaded" : "Downloaded" );
+            String len = contentLength >= 1024 ? toKB( contentLength ) + " KB" : contentLength + " B";
+
+            String throughput = "";
+            long duration = System.currentTimeMillis() - resource.getTransferStartTime();
+            if ( duration > 0 )
+            {
+                DecimalFormat format = new DecimalFormat( "0.0", new DecimalFormatSymbols( Locale.ENGLISH ) );
+                double kbPerSec = ( contentLength / 1024.0 ) / ( duration / 1000.0 );
+                throughput = " at " + format.format( kbPerSec ) + " KB/sec";
+            }
+
+            out.println( type + ": " + resource.getRepositoryUrl() + resource.getResourceName() + " (" + len
+                + throughput + ")" );
+        }
+    }
+
+    @Override
+    public void transferFailed( TransferEvent event )
+    {
+        transferCompleted( event );
+
+        event.getException().printStackTrace( out );
+    }
+
+    private void transferCompleted( TransferEvent event )
+    {
+        downloads.remove( event.getResource() );
+
+        StringBuilder buffer = new StringBuilder( 64 );
+        pad( buffer, lastLength );
+        buffer.append( '\r' );
+        out.print( buffer );
+    }
+
+    public void transferCorrupted( TransferEvent event )
+    {
+        event.getException().printStackTrace( out );
+    }
+
+    protected long toKB( long bytes )
+    {
+        return ( bytes + 1023 ) / 1024;
+    }
+
+}