Author: rfscholte Date: Sat Jul 4 16:00:38 2015 New Revision: 1689174 URL: http://svn.apache.org/r1689174 Log: Add DependencyCollector
Added: maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/ maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/CollectorResult.java maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/DependencyCollector.java maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/DependencyCollectorException.java maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/internal/ maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/internal/DefaultDependencyCollector.java maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/internal/Invoker.java maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/internal/Maven30ArtifactRepositoryAdapter.java maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/internal/Maven30CollectorResult.java maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/internal/Maven30DependencyCollector.java maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/internal/Maven31ArtifactRepositoryAdapter.java maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/internal/Maven31CollectorResult.java maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/internal/Maven31DependencyCollector.java Added: maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/CollectorResult.java URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/CollectorResult.java?rev=1689174&view=auto ============================================================================== --- maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/CollectorResult.java (added) +++ maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/CollectorResult.java Sat Jul 4 16:00:38 2015 @@ -0,0 +1,29 @@ +package org.apache.maven.shared.artifact.collect; + +/* + * 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.util.List; + +import org.apache.maven.artifact.repository.ArtifactRepository; + +public interface CollectorResult +{ + List<ArtifactRepository> getRemoteRepositories(); +} Added: maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/DependencyCollector.java URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/DependencyCollector.java?rev=1689174&view=auto ============================================================================== --- maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/DependencyCollector.java (added) +++ maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/DependencyCollector.java Sat Jul 4 16:00:38 2015 @@ -0,0 +1,41 @@ +package org.apache.maven.shared.artifact.collect; + +/* + * 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 org.apache.maven.artifact.Artifact; +import org.apache.maven.model.Dependency; +import org.apache.maven.project.ProjectBuildingRequest; + +/** + * Will only download the pom files when not available, never the artifact. + * + * @author Robert Scholte + * + */ +public interface DependencyCollector +{ + + CollectorResult collectDependencies( ProjectBuildingRequest buildingRequest, Dependency root ) + throws DependencyCollectorException; + + CollectorResult collectDependencies( ProjectBuildingRequest buildingRequest, Artifact root ) + throws DependencyCollectorException; + +} Added: maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/DependencyCollectorException.java URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/DependencyCollectorException.java?rev=1689174&view=auto ============================================================================== --- maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/DependencyCollectorException.java (added) +++ maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/DependencyCollectorException.java Sat Jul 4 16:00:38 2015 @@ -0,0 +1,30 @@ +package org.apache.maven.shared.artifact.collect; + +/* + * 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. + */ + +public class DependencyCollectorException extends Exception +{ + + public DependencyCollectorException( String message, Throwable cause ) + { + super( message, cause ); + } + +} Added: maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/internal/DefaultDependencyCollector.java URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/internal/DefaultDependencyCollector.java?rev=1689174&view=auto ============================================================================== --- maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/internal/DefaultDependencyCollector.java (added) +++ maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/internal/DefaultDependencyCollector.java Sat Jul 4 16:00:38 2015 @@ -0,0 +1,111 @@ +package org.apache.maven.shared.artifact.collect.internal; + +/* + * 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 org.apache.maven.artifact.Artifact; +import org.apache.maven.model.Dependency; +import org.apache.maven.project.ProjectBuildingRequest; +import org.apache.maven.shared.artifact.collect.CollectorResult; +import org.apache.maven.shared.artifact.collect.DependencyCollector; +import org.apache.maven.shared.artifact.collect.DependencyCollectorException; +import org.codehaus.plexus.PlexusConstants; +import org.codehaus.plexus.PlexusContainer; +import org.codehaus.plexus.component.annotations.Component; +import org.codehaus.plexus.component.repository.exception.ComponentLookupException; +import org.codehaus.plexus.context.Context; +import org.codehaus.plexus.context.ContextException; +import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable; + +@Component( role = DependencyCollector.class, hint = "default" ) +public class DefaultDependencyCollector implements DependencyCollector, Contextualizable +{ + private PlexusContainer container; + + @Override + public CollectorResult collectDependencies( ProjectBuildingRequest buildingRequest, Dependency root ) + throws DependencyCollectorException + { + try + { + String hint = isMaven31() ? "maven31" : "maven3"; + + DependencyCollector effectiveDependencyCollector = container.lookup( DependencyCollector.class, hint ); + + return effectiveDependencyCollector.collectDependencies( buildingRequest, root ); + } + catch ( ComponentLookupException e ) + { + throw new DependencyCollectorException( e.getMessage(), e ); + } + } + + @Override + public CollectorResult collectDependencies( ProjectBuildingRequest buildingRequest, Artifact root ) + throws DependencyCollectorException + { + try + { + String hint = isMaven31() ? "maven31" : "maven3"; + + DependencyCollector effectiveDependencyCollector = container.lookup( DependencyCollector.class, hint ); + + return effectiveDependencyCollector.collectDependencies( buildingRequest, root ); + } + catch ( ComponentLookupException e ) + { + throw new DependencyCollectorException( e.getMessage(), e ); + } + } + + /** + * @return true if the current Maven version is Maven 3.1. + */ + protected static boolean isMaven31() + { + return canFindCoreClass( "org.eclipse.aether.artifact.Artifact" ); // Maven 3.1 specific + } + + private static boolean canFindCoreClass( String className ) + { + try + { + Thread.currentThread().getContextClassLoader().loadClass( className ); + + return true; + } + catch ( ClassNotFoundException e ) + { + return false; + } + } + + /** + * Injects the Plexus content. + * + * @param context Plexus context to inject. + * @throws ContextException if the PlexusContainer could not be located. + */ + public void contextualize( Context context ) + throws ContextException + { + container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY ); + } + +} Added: maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/internal/Invoker.java URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/internal/Invoker.java?rev=1689174&view=auto ============================================================================== --- maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/internal/Invoker.java (added) +++ maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/internal/Invoker.java Sat Jul 4 16:00:38 2015 @@ -0,0 +1,165 @@ +package org.apache.maven.shared.artifact.collect.internal; + +/* + * 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.lang.reflect.InvocationTargetException; + +import org.apache.maven.shared.artifact.collect.DependencyCollectorException; + +/** + * Invokes method on objects using reflection. + */ +final class Invoker +{ + private Invoker() + { + // do not instantiate + } + + public static Object invoke( Object object, String method ) + throws DependencyCollectorException + { + return invoke( object.getClass(), object, method ); + } + + public static Object invoke( Class<?> objectClazz, Object object, String method ) + throws DependencyCollectorException + { + try + { + return objectClazz.getMethod( method ).invoke( object ); + } + catch ( IllegalAccessException e ) + { + throw new DependencyCollectorException( e.getMessage(), e ); + } + catch ( InvocationTargetException e ) + { + throw new DependencyCollectorException( e.getMessage(), e ); + } + catch ( NoSuchMethodException e ) + { + throw new DependencyCollectorException( e.getMessage(), e ); + } + } + + public static Object invoke( Object object, String method, Class<?> argClazz, Object arg ) + throws DependencyCollectorException + { + try + { + final Class<?> objectClazz = object.getClass(); + return objectClazz.getMethod( method, argClazz ).invoke( object, arg ); + } + catch ( IllegalAccessException e ) + { + throw new DependencyCollectorException( e.getMessage(), e ); + } + catch ( InvocationTargetException e ) + { + throw new DependencyCollectorException( e.getMessage(), e ); + } + catch ( NoSuchMethodException e ) + { + throw new DependencyCollectorException( e.getMessage(), e ); + } + } + + public static Object invoke( Class<?> objectClazz, String staticMethod, Class<?> argClazz, Object arg ) + throws DependencyCollectorException + { + try + { + return objectClazz.getMethod( staticMethod, argClazz ).invoke( null, arg ); + } + catch ( IllegalAccessException e ) + { + throw new DependencyCollectorException( e.getMessage(), e ); + } + catch ( InvocationTargetException e ) + { + throw new DependencyCollectorException( e.getMessage(), e ); + } + catch ( NoSuchMethodException e ) + { + throw new DependencyCollectorException( e.getMessage(), e ); + } + } + + /** + * <strong>Note:</strong> Ensure that argClasses and args have the same number of elements + * + * @param objectClazz the class of the static method + * @param staticMethod the static method to call + * @param argClasses the classes of the argument, used to select the right static method + * @param args the actual arguments to be passed + * @return the result of the method invocation + * @throws DependencyCollectorException if any checked exception occurs + */ + public static Object invoke( Class<?> objectClazz, String staticMethod, Class<?>[] argClasses, Object[] args ) + throws DependencyCollectorException + { + try + { + return objectClazz.getMethod( staticMethod, argClasses ).invoke( null, args ); + } + catch ( IllegalAccessException e ) + { + throw new DependencyCollectorException( e.getMessage(), e ); + } + catch ( InvocationTargetException e ) + { + throw new DependencyCollectorException( e.getMessage(), e ); + } + catch ( NoSuchMethodException e ) + { + throw new DependencyCollectorException( e.getMessage(), e ); + } + } + + public static Object newInstance( Class<?> objectClazz, Class<?> argClazz, Object arg ) + throws DependencyCollectorException + { + try + { + return objectClazz.getConstructor( argClazz ).newInstance( arg ); + } + catch ( InstantiationException e ) + { + throw new DependencyCollectorException( e.getMessage(), e ); + } + catch ( IllegalAccessException e ) + { + throw new DependencyCollectorException( e.getMessage(), e ); + } + catch ( IllegalArgumentException e ) + { + throw new DependencyCollectorException( e.getMessage(), e ); + } + catch ( InvocationTargetException e ) + { + throw new DependencyCollectorException( e.getMessage(), e ); + } + catch ( NoSuchMethodException e ) + { + throw new DependencyCollectorException( e.getMessage(), e ); + } + } +} Added: maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/internal/Maven30ArtifactRepositoryAdapter.java URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/internal/Maven30ArtifactRepositoryAdapter.java?rev=1689174&view=auto ============================================================================== --- maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/internal/Maven30ArtifactRepositoryAdapter.java (added) +++ maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/internal/Maven30ArtifactRepositoryAdapter.java Sat Jul 4 16:00:38 2015 @@ -0,0 +1,257 @@ +package org.apache.maven.shared.artifact.collect.internal; + +/* + * 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.util.List; + +import org.apache.maven.artifact.Artifact; +import org.apache.maven.artifact.metadata.ArtifactMetadata; +import org.apache.maven.artifact.repository.ArtifactRepository; +import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy; +import org.apache.maven.artifact.repository.Authentication; +import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout; +import org.apache.maven.repository.Proxy; +import org.sonatype.aether.repository.RemoteRepository; +import org.sonatype.aether.repository.RepositoryPolicy; + +public class Maven30ArtifactRepositoryAdapter implements ArtifactRepository +{ + + private RemoteRepository remoteRepository; + + public Maven30ArtifactRepositoryAdapter( RemoteRepository remoteRepository ) + { + this.remoteRepository = remoteRepository; + } + + @Override + public String pathOf( Artifact artifact ) + { + throw new UnsupportedOperationException(); + } + + @Override + public String pathOfRemoteRepositoryMetadata( ArtifactMetadata artifactMetadata ) + { + throw new UnsupportedOperationException(); + } + + @Override + public String pathOfLocalRepositoryMetadata( ArtifactMetadata metadata, ArtifactRepository repository ) + { + throw new UnsupportedOperationException(); + } + + @Override + public String getUrl() + { + return remoteRepository.getUrl(); + } + + @Override + public void setUrl( String url ) + { + throw new UnsupportedOperationException(); + } + + @Override + public String getBasedir() + { + throw new UnsupportedOperationException(); + } + + @Override + public String getProtocol() + { + throw new UnsupportedOperationException(); + } + + @Override + public String getId() + { + return remoteRepository.getId(); + } + + @Override + public void setId( String id ) + { + throw new UnsupportedOperationException(); + } + + @Override + public ArtifactRepositoryPolicy getSnapshots() + { + throw new UnsupportedOperationException(); + } + + @Override + public void setSnapshotUpdatePolicy( ArtifactRepositoryPolicy policy ) + { + throw new UnsupportedOperationException(); + } + + @Override + public ArtifactRepositoryPolicy getReleases() + { + throw new UnsupportedOperationException(); + } + + @Override + public void setReleaseUpdatePolicy( ArtifactRepositoryPolicy policy ) + { + throw new UnsupportedOperationException(); + } + + @Override + public ArtifactRepositoryLayout getLayout() + { + throw new UnsupportedOperationException(); + } + + @Override + public void setLayout( ArtifactRepositoryLayout layout ) + { + throw new UnsupportedOperationException(); + } + + @Override + public String getKey() + { + throw new UnsupportedOperationException(); + } + + @Override + public boolean isUniqueVersion() + { + throw new UnsupportedOperationException(); + } + + @Override + public boolean isBlacklisted() + { + throw new UnsupportedOperationException(); + } + + @Override + public void setBlacklisted( boolean blackListed ) + { + throw new UnsupportedOperationException(); + } + + @Override + public Artifact find( Artifact artifact ) + { + throw new UnsupportedOperationException(); + } + + @Override + public List<String> findVersions( Artifact artifact ) + { + throw new UnsupportedOperationException(); + } + + @Override + public boolean isProjectAware() + { + throw new UnsupportedOperationException(); + } + + @Override + public void setAuthentication( Authentication authentication ) + { + throw new UnsupportedOperationException(); + } + + @Override + public Authentication getAuthentication() + { + throw new UnsupportedOperationException(); + } + + @Override + public void setProxy( Proxy proxy ) + { + throw new UnsupportedOperationException(); + } + + @Override + public Proxy getProxy() + { + throw new UnsupportedOperationException(); + } + + @Override + public String toString() + { + StringBuilder sb = new StringBuilder(); + + sb.append( " id: " ).append( getId() ).append( "\n" ); + sb.append( " url: " ).append( getUrl() ).append( "\n" ); + sb.append( " layout: " ).append( "default" ).append( "\n" ); + + RepositoryPolicy snapshotPolicy = remoteRepository.getPolicy( true ); + sb.append( "snapshots: [enabled => " ).append( snapshotPolicy.isEnabled() ); + sb.append( ", update => " ).append( snapshotPolicy.getUpdatePolicy() ).append( "]\n" ); + + RepositoryPolicy releasePolicy = remoteRepository.getPolicy( false ); + sb.append( " releases: [enabled => " ).append( releasePolicy.isEnabled() ); + sb.append( ", update => " ).append( releasePolicy.getUpdatePolicy() ).append( "]\n" ); + + return sb.toString(); + } + + + @Override + public int hashCode() + { + return remoteRepository.hashCode(); + } + + @Override + public boolean equals( Object obj ) + { + if ( this == obj ) + { + return true; + } + if ( obj == null ) + { + return false; + } + if ( getClass() != obj.getClass() ) + { + return false; + } + + Maven30ArtifactRepositoryAdapter other = (Maven30ArtifactRepositoryAdapter) obj; + if ( remoteRepository == null ) + { + if ( other.remoteRepository != null ) + { + return false; + } + } + else if ( !remoteRepository.equals( other.remoteRepository ) ) + { + return false; + } + return true; + } +} Added: maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/internal/Maven30CollectorResult.java URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/internal/Maven30CollectorResult.java?rev=1689174&view=auto ============================================================================== --- maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/internal/Maven30CollectorResult.java (added) +++ maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/internal/Maven30CollectorResult.java Sat Jul 4 16:00:38 2015 @@ -0,0 +1,76 @@ +package org.apache.maven.shared.artifact.collect.internal; + +/* + * 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.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.apache.maven.artifact.repository.ArtifactRepository; +import org.apache.maven.shared.artifact.collect.CollectorResult; +import org.sonatype.aether.collection.CollectResult; +import org.sonatype.aether.graph.DependencyNode; +import org.sonatype.aether.graph.DependencyVisitor; +import org.sonatype.aether.repository.RemoteRepository; + +public class Maven30CollectorResult implements CollectorResult +{ + private final CollectResult collectResult; + + public Maven30CollectorResult( CollectResult collectResult ) + { + this.collectResult = collectResult; + } + + @Override + public List<ArtifactRepository> getRemoteRepositories() + { + final Set<RemoteRepository> aetherRepositories = new HashSet<RemoteRepository>(); + + DependencyVisitor visitor = new DependencyVisitor() + { + @Override + public boolean visitEnter( DependencyNode node ) + { + aetherRepositories.addAll( node.getRepositories() ); + return true; + } + + @Override + public boolean visitLeave( DependencyNode node ) + { + return true; + } + }; + + collectResult.getRoot().accept( visitor ); + + List<ArtifactRepository> mavenRepositories = new ArrayList<ArtifactRepository>( aetherRepositories.size() ); + + for ( RemoteRepository aetherRepository : aetherRepositories ) + { + mavenRepositories.add( new Maven30ArtifactRepositoryAdapter( aetherRepository ) ); + } + + return mavenRepositories; + } + +} Added: maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/internal/Maven30DependencyCollector.java URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/internal/Maven30DependencyCollector.java?rev=1689174&view=auto ============================================================================== --- maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/internal/Maven30DependencyCollector.java (added) +++ maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/internal/Maven30DependencyCollector.java Sat Jul 4 16:00:38 2015 @@ -0,0 +1,104 @@ +package org.apache.maven.shared.artifact.collect.internal; + +/* + * 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.util.Collection; +import java.util.List; + +import org.apache.maven.RepositoryUtils; +import org.apache.maven.artifact.Artifact; +import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager; +import org.apache.maven.project.ProjectBuildingRequest; +import org.apache.maven.shared.artifact.collect.CollectorResult; +import org.apache.maven.shared.artifact.collect.DependencyCollector; +import org.apache.maven.shared.artifact.collect.DependencyCollectorException; +import org.codehaus.plexus.component.annotations.Component; +import org.codehaus.plexus.component.annotations.Requirement; +import org.sonatype.aether.RepositorySystem; +import org.sonatype.aether.RepositorySystemSession; +import org.sonatype.aether.artifact.ArtifactTypeRegistry; +import org.sonatype.aether.collection.CollectRequest; +import org.sonatype.aether.collection.DependencyCollectionException; +import org.sonatype.aether.graph.Dependency; +import org.sonatype.aether.repository.RemoteRepository; + +@Component( role = DependencyCollector.class, hint = "maven3" ) +public class Maven30DependencyCollector + implements DependencyCollector +{ + @Requirement + private RepositorySystem repositorySystem; + + @Requirement + private ArtifactHandlerManager artifactHandlerManager; + + @Override + public CollectorResult collectDependencies( final ProjectBuildingRequest buildingRequest, Artifact root ) + throws DependencyCollectorException + { + Class<?>[] argClasses = new Class<?>[] { Artifact.class, Collection.class }; + Object[] args = new Object[] { root, null }; + Dependency aetherRoot = (Dependency) Invoker.invoke( RepositoryUtils.class, "toDependency", argClasses, args ); + + return collectDependencies( buildingRequest, aetherRoot ); + } + + @Override + public CollectorResult collectDependencies( final ProjectBuildingRequest buildingRequest, + org.apache.maven.model.Dependency root ) + throws DependencyCollectorException + { + ArtifactTypeRegistry typeRegistry = + (ArtifactTypeRegistry) Invoker.invoke( RepositoryUtils.class, "newArtifactTypeRegistry", + ArtifactHandlerManager.class, artifactHandlerManager ); + + Class<?>[] argClasses = new Class<?>[] { Dependency.class, ArtifactTypeRegistry.class }; + Object[] args = new Object[] { root, typeRegistry }; + Dependency aetherRoot = (Dependency) Invoker.invoke( RepositoryUtils.class, "toDependency", argClasses, args ); + + return collectDependencies( buildingRequest, aetherRoot ); + } + + private CollectorResult collectDependencies( final ProjectBuildingRequest buildingRequest, Dependency aetherRoot ) + throws DependencyCollectorException + { + RepositorySystemSession session = + (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" ); + + CollectRequest request = new CollectRequest(); + request.setRoot( aetherRoot ); + + @SuppressWarnings( "unchecked" ) + List<RemoteRepository> aetherRepositories = + (List<RemoteRepository>) Invoker.invoke( RepositoryUtils.class, "toRepos", List.class, + buildingRequest.getRemoteRepositories() ); + request.setRepositories( aetherRepositories ); + + try + { + return new Maven30CollectorResult( repositorySystem.collectDependencies( session, request ) ); + } + catch ( DependencyCollectionException e ) + { + throw new DependencyCollectorException( e.getMessage(), e ); + } + } + +} Added: maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/internal/Maven31ArtifactRepositoryAdapter.java URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/internal/Maven31ArtifactRepositoryAdapter.java?rev=1689174&view=auto ============================================================================== --- maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/internal/Maven31ArtifactRepositoryAdapter.java (added) +++ maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/internal/Maven31ArtifactRepositoryAdapter.java Sat Jul 4 16:00:38 2015 @@ -0,0 +1,257 @@ +package org.apache.maven.shared.artifact.collect.internal; + +/* + * 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.util.List; + +import org.apache.maven.artifact.Artifact; +import org.apache.maven.artifact.metadata.ArtifactMetadata; +import org.apache.maven.artifact.repository.ArtifactRepository; +import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy; +import org.apache.maven.artifact.repository.Authentication; +import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout; +import org.apache.maven.repository.Proxy; +import org.eclipse.aether.repository.RemoteRepository; +import org.eclipse.aether.repository.RepositoryPolicy; + +public class Maven31ArtifactRepositoryAdapter implements ArtifactRepository +{ + + private RemoteRepository remoteRepository; + + public Maven31ArtifactRepositoryAdapter( RemoteRepository remoteRepository ) + { + this.remoteRepository = remoteRepository; + } + + @Override + public String pathOf( Artifact artifact ) + { + throw new UnsupportedOperationException(); + } + + @Override + public String pathOfRemoteRepositoryMetadata( ArtifactMetadata artifactMetadata ) + { + throw new UnsupportedOperationException(); + } + + @Override + public String pathOfLocalRepositoryMetadata( ArtifactMetadata metadata, ArtifactRepository repository ) + { + throw new UnsupportedOperationException(); + } + + @Override + public String getUrl() + { + return remoteRepository.getUrl(); + } + + @Override + public void setUrl( String url ) + { + throw new UnsupportedOperationException(); + } + + @Override + public String getBasedir() + { + throw new UnsupportedOperationException(); + } + + @Override + public String getProtocol() + { + throw new UnsupportedOperationException(); + } + + @Override + public String getId() + { + return remoteRepository.getId(); + } + + @Override + public void setId( String id ) + { + throw new UnsupportedOperationException(); + } + + @Override + public ArtifactRepositoryPolicy getSnapshots() + { + throw new UnsupportedOperationException(); + } + + @Override + public void setSnapshotUpdatePolicy( ArtifactRepositoryPolicy policy ) + { + throw new UnsupportedOperationException(); + } + + @Override + public ArtifactRepositoryPolicy getReleases() + { + throw new UnsupportedOperationException(); + } + + @Override + public void setReleaseUpdatePolicy( ArtifactRepositoryPolicy policy ) + { + throw new UnsupportedOperationException(); + } + + @Override + public ArtifactRepositoryLayout getLayout() + { + throw new UnsupportedOperationException(); + } + + @Override + public void setLayout( ArtifactRepositoryLayout layout ) + { + throw new UnsupportedOperationException(); + } + + @Override + public String getKey() + { + throw new UnsupportedOperationException(); + } + + @Override + public boolean isUniqueVersion() + { + throw new UnsupportedOperationException(); + } + + @Override + public boolean isBlacklisted() + { + throw new UnsupportedOperationException(); + } + + @Override + public void setBlacklisted( boolean blackListed ) + { + throw new UnsupportedOperationException(); + } + + @Override + public Artifact find( Artifact artifact ) + { + throw new UnsupportedOperationException(); + } + + @Override + public List<String> findVersions( Artifact artifact ) + { + throw new UnsupportedOperationException(); + } + + @Override + public boolean isProjectAware() + { + throw new UnsupportedOperationException(); + } + + @Override + public void setAuthentication( Authentication authentication ) + { + throw new UnsupportedOperationException(); + } + + @Override + public Authentication getAuthentication() + { + throw new UnsupportedOperationException(); + } + + @Override + public void setProxy( Proxy proxy ) + { + throw new UnsupportedOperationException(); + } + + @Override + public Proxy getProxy() + { + throw new UnsupportedOperationException(); + } + + @Override + public String toString() + { + StringBuilder sb = new StringBuilder(); + + sb.append( " id: " ).append( getId() ).append( "\n" ); + sb.append( " url: " ).append( getUrl() ).append( "\n" ); + sb.append( " layout: " ).append( "default" ).append( "\n" ); + + RepositoryPolicy snapshotPolicy = remoteRepository.getPolicy( true ); + sb.append( "snapshots: [enabled => " ).append( snapshotPolicy.isEnabled() ); + sb.append( ", update => " ).append( snapshotPolicy.getUpdatePolicy() ).append( "]\n" ); + + RepositoryPolicy releasePolicy = remoteRepository.getPolicy( false ); + sb.append( " releases: [enabled => " ).append( releasePolicy.isEnabled() ); + sb.append( ", update => " ).append( releasePolicy.getUpdatePolicy() ).append( "]\n" ); + + return sb.toString(); + } + + + @Override + public int hashCode() + { + return remoteRepository.hashCode(); + } + + @Override + public boolean equals( Object obj ) + { + if ( this == obj ) + { + return true; + } + if ( obj == null ) + { + return false; + } + if ( getClass() != obj.getClass() ) + { + return false; + } + + Maven31ArtifactRepositoryAdapter other = (Maven31ArtifactRepositoryAdapter) obj; + if ( remoteRepository == null ) + { + if ( other.remoteRepository != null ) + { + return false; + } + } + else if ( !remoteRepository.equals( other.remoteRepository ) ) + { + return false; + } + return true; + } +} Added: maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/internal/Maven31CollectorResult.java URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/internal/Maven31CollectorResult.java?rev=1689174&view=auto ============================================================================== --- maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/internal/Maven31CollectorResult.java (added) +++ maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/internal/Maven31CollectorResult.java Sat Jul 4 16:00:38 2015 @@ -0,0 +1,77 @@ +package org.apache.maven.shared.artifact.collect.internal; + +/* + * 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.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.apache.maven.artifact.repository.ArtifactRepository; +import org.apache.maven.shared.artifact.collect.CollectorResult; +import org.eclipse.aether.collection.CollectResult; +import org.eclipse.aether.graph.DependencyNode; +import org.eclipse.aether.graph.DependencyVisitor; +import org.eclipse.aether.repository.RemoteRepository; + + +public class Maven31CollectorResult implements CollectorResult +{ + private final CollectResult collectResult; + + public Maven31CollectorResult( CollectResult collectResult ) + { + this.collectResult = collectResult; + } + + @Override + public List<ArtifactRepository> getRemoteRepositories() + { + final Set<RemoteRepository> aetherRepositories = new HashSet<RemoteRepository>(); + + DependencyVisitor visitor = new DependencyVisitor() + { + @Override + public boolean visitEnter( DependencyNode node ) + { + aetherRepositories.addAll( node.getRepositories() ); + return true; + } + + @Override + public boolean visitLeave( DependencyNode node ) + { + return true; + } + }; + + collectResult.getRoot().accept( visitor ); + + List<ArtifactRepository> mavenRepositories = new ArrayList<ArtifactRepository>( aetherRepositories.size() ); + + for ( RemoteRepository aetherRepository : aetherRepositories ) + { + mavenRepositories.add( new Maven31ArtifactRepositoryAdapter( aetherRepository ) ); + } + + return mavenRepositories; + } + +} Added: maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/internal/Maven31DependencyCollector.java URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/internal/Maven31DependencyCollector.java?rev=1689174&view=auto ============================================================================== --- maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/internal/Maven31DependencyCollector.java (added) +++ maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/collect/internal/Maven31DependencyCollector.java Sat Jul 4 16:00:38 2015 @@ -0,0 +1,104 @@ +package org.apache.maven.shared.artifact.collect.internal; + +/* + * 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.util.Collection; +import java.util.List; + +import org.apache.maven.RepositoryUtils; +import org.apache.maven.artifact.Artifact; +import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager; +import org.apache.maven.project.ProjectBuildingRequest; +import org.apache.maven.shared.artifact.collect.CollectorResult; +import org.apache.maven.shared.artifact.collect.DependencyCollector; +import org.apache.maven.shared.artifact.collect.DependencyCollectorException; +import org.codehaus.plexus.component.annotations.Component; +import org.codehaus.plexus.component.annotations.Requirement; +import org.eclipse.aether.RepositorySystem; +import org.eclipse.aether.RepositorySystemSession; +import org.eclipse.aether.artifact.ArtifactTypeRegistry; +import org.eclipse.aether.collection.CollectRequest; +import org.eclipse.aether.collection.DependencyCollectionException; +import org.eclipse.aether.graph.Dependency; +import org.eclipse.aether.repository.RemoteRepository; + +@Component( role = DependencyCollector.class, hint = "maven31" ) +public class Maven31DependencyCollector + implements DependencyCollector +{ + @Requirement + private RepositorySystem repositorySystem; + + @Requirement + private ArtifactHandlerManager artifactHandlerManager; + + @Override + public CollectorResult collectDependencies( final ProjectBuildingRequest buildingRequest, + org.apache.maven.model.Dependency root ) + throws DependencyCollectorException + { + ArtifactTypeRegistry typeRegistry = + (ArtifactTypeRegistry) Invoker.invoke( RepositoryUtils.class, "newArtifactTypeRegistry", + ArtifactHandlerManager.class, artifactHandlerManager ); + + Class<?>[] argClasses = new Class<?>[] { org.apache.maven.model.Dependency.class, ArtifactTypeRegistry.class }; + Object[] args = new Object[] { root, typeRegistry }; + Dependency aetherRoot = (Dependency) Invoker.invoke( RepositoryUtils.class, "toDependency", argClasses, args ); + + return collectDependencies( buildingRequest, aetherRoot ); + } + + @Override + public CollectorResult collectDependencies( ProjectBuildingRequest buildingRequest, Artifact root ) + throws DependencyCollectorException + { + Class<?>[] argClasses = new Class<?>[] { Artifact.class, Collection.class }; + Object[] args = new Object[] { root, null }; + Dependency aetherRoot = (Dependency) Invoker.invoke( RepositoryUtils.class, "toDependency", argClasses, args ); + + return collectDependencies( buildingRequest, aetherRoot ); + } + + private CollectorResult collectDependencies( ProjectBuildingRequest buildingRequest, Dependency aetherRoot ) + throws DependencyCollectorException + { + CollectRequest request = new CollectRequest(); + request.setRoot( aetherRoot ); + + RepositorySystemSession session = + (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" ); + + @SuppressWarnings( "unchecked" ) + List<RemoteRepository> aetherRepositories = + (List<RemoteRepository>) Invoker.invoke( RepositoryUtils.class, "toRepos", List.class, + buildingRequest.getRemoteRepositories() ); + request.setRepositories( aetherRepositories ); + + try + { + return new Maven31CollectorResult( repositorySystem.collectDependencies( session, request ) ); + } + catch ( DependencyCollectionException e ) + { + throw new DependencyCollectorException( e.getMessage(), e ); + } + } + +}