Added: maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/main/java/org/apache/maven/repository/internal/ConfigurableArtifactDescriptorReader.java URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/main/java/org/apache/maven/repository/internal/ConfigurableArtifactDescriptorReader.java?rev=1138204&view=auto ============================================================================== --- maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/main/java/org/apache/maven/repository/internal/ConfigurableArtifactDescriptorReader.java (added) +++ maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/main/java/org/apache/maven/repository/internal/ConfigurableArtifactDescriptorReader.java Tue Jun 21 21:48:35 2011 @@ -0,0 +1,456 @@ +/* + * Copyright 2011 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.maven.repository.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.mae.project.session.ProjectToolsSession; +import org.apache.maven.model.DependencyManagement; +import org.apache.maven.model.DistributionManagement; +import org.apache.maven.model.License; +import org.apache.maven.model.Model; +import org.apache.maven.model.Prerequisites; +import org.apache.maven.model.Relocation; +import org.apache.maven.model.Repository; +import org.apache.maven.model.building.DefaultModelBuilderFactory; +import org.apache.maven.model.building.DefaultModelBuildingRequest; +import org.apache.maven.model.building.FileModelSource; +import org.apache.maven.model.building.ModelBuilder; +import org.apache.maven.model.building.ModelBuildingException; +import org.apache.maven.model.building.ModelBuildingRequest; +import org.apache.maven.model.building.ModelProblem; +import org.apache.maven.model.resolution.UnresolvableModelException; +import org.codehaus.plexus.component.annotations.Component; +import org.codehaus.plexus.component.annotations.Requirement; +import org.sonatype.aether.RepositoryEvent.EventType; +import org.sonatype.aether.RepositoryException; +import org.sonatype.aether.RepositoryListener; +import org.sonatype.aether.RepositorySystemSession; +import org.sonatype.aether.RequestTrace; +import org.sonatype.aether.artifact.Artifact; +import org.sonatype.aether.artifact.ArtifactType; +import org.sonatype.aether.artifact.ArtifactTypeRegistry; +import org.sonatype.aether.graph.Dependency; +import org.sonatype.aether.graph.Exclusion; +import org.sonatype.aether.impl.ArtifactDescriptorReader; +import org.sonatype.aether.impl.ArtifactResolver; +import org.sonatype.aether.impl.RemoteRepositoryManager; +import org.sonatype.aether.impl.VersionResolver; +import org.sonatype.aether.repository.WorkspaceRepository; +import org.sonatype.aether.resolution.ArtifactDescriptorException; +import org.sonatype.aether.resolution.ArtifactDescriptorRequest; +import org.sonatype.aether.resolution.ArtifactDescriptorResult; +import org.sonatype.aether.resolution.ArtifactRequest; +import org.sonatype.aether.resolution.ArtifactResolutionException; +import org.sonatype.aether.resolution.ArtifactResult; +import org.sonatype.aether.resolution.VersionRequest; +import org.sonatype.aether.resolution.VersionResolutionException; +import org.sonatype.aether.resolution.VersionResult; +import org.sonatype.aether.spi.locator.Service; +import org.sonatype.aether.spi.locator.ServiceLocator; +import org.sonatype.aether.spi.log.Logger; +import org.sonatype.aether.spi.log.NullLogger; +import org.sonatype.aether.transfer.ArtifactNotFoundException; +import org.sonatype.aether.util.DefaultRequestTrace; +import org.sonatype.aether.util.artifact.ArtifactProperties; +import org.sonatype.aether.util.artifact.DefaultArtifact; +import org.sonatype.aether.util.artifact.DefaultArtifactType; +import org.sonatype.aether.util.listener.DefaultRepositoryEvent; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.Set; + +/** + * @author Benjamin Bentmann + */ +@Component( role = ArtifactDescriptorReader.class ) +public class ConfigurableArtifactDescriptorReader + implements ArtifactDescriptorReader, Service +{ + + @SuppressWarnings( "unused" ) + @Requirement + private Logger logger = NullLogger.INSTANCE; + + @Requirement + private RemoteRepositoryManager remoteRepositoryManager; + + @Requirement + private VersionResolver versionResolver; + + @Requirement + private ArtifactResolver artifactResolver; + + @Requirement + private ModelBuilder modelBuilder; + + @Override + public void initService( final ServiceLocator locator ) + { + setLogger( locator.getService( Logger.class ) ); + setRemoteRepositoryManager( locator.getService( RemoteRepositoryManager.class ) ); + setVersionResolver( locator.getService( VersionResolver.class ) ); + setArtifactResolver( locator.getService( ArtifactResolver.class ) ); + modelBuilder = locator.getService( ModelBuilder.class ); + if ( modelBuilder == null ) + { + setModelBuilder( new DefaultModelBuilderFactory().newInstance() ); + } + } + + public ConfigurableArtifactDescriptorReader setLogger( final Logger logger ) + { + this.logger = ( logger != null ) ? logger : NullLogger.INSTANCE; + return this; + } + + public ConfigurableArtifactDescriptorReader setRemoteRepositoryManager( final RemoteRepositoryManager remoteRepositoryManager ) + { + if ( remoteRepositoryManager == null ) + { + throw new IllegalArgumentException( "remote repository manager has not been specified" ); + } + this.remoteRepositoryManager = remoteRepositoryManager; + return this; + } + + public ConfigurableArtifactDescriptorReader setVersionResolver( final VersionResolver versionResolver ) + { + if ( versionResolver == null ) + { + throw new IllegalArgumentException( "version resolver has not been specified" ); + } + this.versionResolver = versionResolver; + return this; + } + + public ConfigurableArtifactDescriptorReader setArtifactResolver( final ArtifactResolver artifactResolver ) + { + if ( artifactResolver == null ) + { + throw new IllegalArgumentException( "artifact resolver has not been specified" ); + } + this.artifactResolver = artifactResolver; + return this; + } + + public ConfigurableArtifactDescriptorReader setModelBuilder( final ModelBuilder modelBuilder ) + { + if ( modelBuilder == null ) + { + throw new IllegalArgumentException( "model builder has not been specified" ); + } + this.modelBuilder = modelBuilder; + return this; + } + + @Override + public ArtifactDescriptorResult readArtifactDescriptor( final RepositorySystemSession session, + final ArtifactDescriptorRequest request ) + throws ArtifactDescriptorException + { + final ArtifactDescriptorResult result = new ArtifactDescriptorResult( request ); + + final Model model = loadPom( session, request, result ); + + if ( model != null ) + { + final ArtifactTypeRegistry stereotypes = session.getArtifactTypeRegistry(); + + for ( final Repository r : model.getRepositories() ) + { + result.addRepository( ArtifactDescriptorUtils.toRemoteRepository( r ) ); + } + + for ( final org.apache.maven.model.Dependency dependency : model.getDependencies() ) + { + result.addDependency( convert( dependency, stereotypes ) ); + } + + final DependencyManagement mngt = model.getDependencyManagement(); + if ( mngt != null ) + { + for ( final org.apache.maven.model.Dependency dependency : mngt.getDependencies() ) + { + result.addManagedDependency( convert( dependency, stereotypes ) ); + } + } + + final Map<String, Object> properties = new LinkedHashMap<String, Object>(); + + final Prerequisites prerequisites = model.getPrerequisites(); + if ( prerequisites != null ) + { + properties.put( "prerequisites.maven", prerequisites.getMaven() ); + } + + final List<License> licenses = model.getLicenses(); + properties.put( "license.count", Integer.valueOf( licenses.size() ) ); + for ( int i = 0; i < licenses.size(); i++ ) + { + final License license = licenses.get( i ); + properties.put( "license." + i + ".name", license.getName() ); + properties.put( "license." + i + ".url", license.getUrl() ); + properties.put( "license." + i + ".comments", license.getComments() ); + properties.put( "license." + i + ".distribution", license.getDistribution() ); + } + + result.setProperties( properties ); + } + + return result; + } + + private Model loadPom( final RepositorySystemSession session, final ArtifactDescriptorRequest request, + final ArtifactDescriptorResult result ) + throws ArtifactDescriptorException + { + ProjectToolsSession pts = (ProjectToolsSession) session.getData().get( ProjectToolsSession.SESSION_KEY ); + final RequestTrace trace = DefaultRequestTrace.newChild( request.getTrace(), request ); + + final Set<String> visited = new LinkedHashSet<String>(); + for ( Artifact artifact = request.getArtifact();; ) + { + try + { + final VersionRequest versionRequest = + new VersionRequest( artifact, request.getRepositories(), request.getRequestContext() ); + versionRequest.setTrace( trace ); + final VersionResult versionResult = versionResolver.resolveVersion( session, versionRequest ); + + artifact = artifact.setVersion( versionResult.getVersion() ); + } + catch ( final VersionResolutionException e ) + { + result.addException( e ); + throw new ArtifactDescriptorException( result ); + } + + if ( !visited.add( artifact.getGroupId() + ':' + artifact.getArtifactId() + ':' + artifact.getBaseVersion() ) ) + { + final RepositoryException exception = + new RepositoryException( "Artifact relocations form a cycle: " + visited ); + invalidDescriptor( session, trace, artifact, exception ); + if ( session.isIgnoreInvalidArtifactDescriptor() ) + { + return null; + } + result.addException( exception ); + throw new ArtifactDescriptorException( result ); + } + + Artifact pomArtifact = ArtifactDescriptorUtils.toPomArtifact( artifact ); + + ArtifactResult resolveResult; + try + { + final ArtifactRequest resolveRequest = + new ArtifactRequest( pomArtifact, request.getRepositories(), request.getRequestContext() ); + resolveRequest.setTrace( trace ); + resolveResult = artifactResolver.resolveArtifact( session, resolveRequest ); + pomArtifact = resolveResult.getArtifact(); + result.setRepository( resolveResult.getRepository() ); + } + catch ( final ArtifactResolutionException e ) + { + if ( e.getCause() instanceof ArtifactNotFoundException ) + { + missingDescriptor( session, trace, artifact, (Exception) e.getCause() ); + if ( session.isIgnoreMissingArtifactDescriptor() ) + { + return null; + } + } + result.addException( e ); + throw new ArtifactDescriptorException( result ); + } + + Model model; + try + { + final ModelBuildingRequest modelRequest = new DefaultModelBuildingRequest(); + modelRequest.setValidationLevel( ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL ); + modelRequest.setProcessPlugins( pts == null ? false : pts.isProcessPomPlugins() ); + modelRequest.setTwoPhaseBuilding( false ); + modelRequest.setSystemProperties( toProperties( session.getUserProperties(), + session.getSystemProperties() ) ); + modelRequest.setModelCache( DefaultModelCache.newInstance( session ) ); + modelRequest.setModelResolver( new DefaultModelResolver( session, trace.newChild( modelRequest ), + request.getRequestContext(), artifactResolver, + remoteRepositoryManager, + request.getRepositories() ) ); + if ( resolveResult.getRepository() instanceof WorkspaceRepository ) + { + modelRequest.setPomFile( pomArtifact.getFile() ); + } + else + { + modelRequest.setModelSource( new FileModelSource( pomArtifact.getFile() ) ); + } + + model = modelBuilder.build( modelRequest ).getEffectiveModel(); + } + catch ( final ModelBuildingException e ) + { + for ( final ModelProblem problem : e.getProblems() ) + { + if ( problem.getException() instanceof UnresolvableModelException ) + { + result.addException( problem.getException() ); + throw new ArtifactDescriptorException( result ); + } + } + invalidDescriptor( session, trace, artifact, e ); + if ( session.isIgnoreInvalidArtifactDescriptor() ) + { + return null; + } + result.addException( e ); + throw new ArtifactDescriptorException( result ); + } + + final Relocation relocation = getRelocation( model ); + + if ( relocation != null ) + { + result.addRelocation( artifact ); + artifact = + new RelocatedArtifact( artifact, relocation.getGroupId(), relocation.getArtifactId(), + relocation.getVersion() ); + result.setArtifact( artifact ); + } + else + { + return model; + } + } + } + + private Properties toProperties( final Map<String, String> dominant, final Map<String, String> recessive ) + { + final Properties props = new Properties(); + if ( recessive != null ) + { + props.putAll( recessive ); + } + if ( dominant != null ) + { + props.putAll( dominant ); + } + return props; + } + + private Relocation getRelocation( final Model model ) + { + Relocation relocation = null; + final DistributionManagement distMngt = model.getDistributionManagement(); + if ( distMngt != null ) + { + relocation = distMngt.getRelocation(); + } + return relocation; + } + + private Dependency convert( final org.apache.maven.model.Dependency dependency, + final ArtifactTypeRegistry stereotypes ) + { + ArtifactType stereotype = stereotypes.get( dependency.getType() ); + if ( stereotype == null ) + { + stereotype = new DefaultArtifactType( dependency.getType() ); + } + + final boolean system = dependency.getSystemPath() != null && dependency.getSystemPath().length() > 0; + + Map<String, String> props = null; + if ( system ) + { + props = Collections.singletonMap( ArtifactProperties.LOCAL_PATH, dependency.getSystemPath() ); + } + + final Artifact artifact = + new DefaultArtifact( dependency.getGroupId(), dependency.getArtifactId(), dependency.getClassifier(), null, + dependency.getVersion(), props, stereotype ); + + final List<Exclusion> exclusions = new ArrayList<Exclusion>( dependency.getExclusions().size() ); + for ( final org.apache.maven.model.Exclusion exclusion : dependency.getExclusions() ) + { + exclusions.add( convert( exclusion ) ); + } + + final Dependency result = new Dependency( artifact, dependency.getScope(), dependency.isOptional(), exclusions ); + + return result; + } + + private Exclusion convert( final org.apache.maven.model.Exclusion exclusion ) + { + return new Exclusion( exclusion.getGroupId(), exclusion.getArtifactId(), "*", "*" ); + } + + private void missingDescriptor( final RepositorySystemSession session, final RequestTrace trace, + final Artifact artifact, final Exception exception ) + { + final RepositoryListener listener = session.getRepositoryListener(); + if ( listener != null ) + { + final DefaultRepositoryEvent event = + new DefaultRepositoryEvent( EventType.ARTIFACT_DESCRIPTOR_MISSING, session, trace ); + event.setArtifact( artifact ); + event.setException( exception ); + listener.artifactDescriptorMissing( event ); + } + } + + private void invalidDescriptor( final RepositorySystemSession session, final RequestTrace trace, + final Artifact artifact, final Exception exception ) + { + final RepositoryListener listener = session.getRepositoryListener(); + if ( listener != null ) + { + final DefaultRepositoryEvent event = + new DefaultRepositoryEvent( EventType.ARTIFACT_DESCRIPTOR_INVALID, session, trace ); + event.setArtifact( artifact ); + event.setException( exception ); + listener.artifactDescriptorInvalid( event ); + } + } + +}
Propchange: maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/main/java/org/apache/maven/repository/internal/ConfigurableArtifactDescriptorReader.java ------------------------------------------------------------------------------ svn:eol-style = native Added: maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/test/java/org/apache/maven/mae/project/ProjectLoaderTest.java URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/test/java/org/apache/maven/mae/project/ProjectLoaderTest.java?rev=1138204&view=auto ============================================================================== --- maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/test/java/org/apache/maven/mae/project/ProjectLoaderTest.java (added) +++ maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/test/java/org/apache/maven/mae/project/ProjectLoaderTest.java Tue Jun 21 21:48:35 2011 @@ -0,0 +1,99 @@ +/* + * Copyright 2011 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.maven.mae.project; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import org.apache.maven.mae.project.ProjectLoader; +import org.apache.maven.mae.project.testutil.TestFixture; +import org.apache.maven.project.MavenProject; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.io.File; +import java.io.IOException; +import java.util.Set; + +public class ProjectLoaderTest +{ + + private static TestFixture fixture; + + @Test + public void retrieveReactorProjects() + throws Exception + { + final ProjectLoader projectManager = fixture.projectManager(); + + final File dir = fixture.getTestFile( "projects", "multi-module" ); + final MavenProject project = + projectManager.buildProjectInstance( new File( dir, "pom.xml" ), fixture.newSession() ); + + final Set<String> projectIds = projectManager.retrieveReactorProjectIds( project.getFile() ); + + System.out.println( projectIds ); + + assertTrue( "parent project missing", projectIds.contains( "test:parent:1" ) ); + assertTrue( "child1 project missing", projectIds.contains( "test:child1:1" ) ); + assertTrue( "child2 project missing", projectIds.contains( "test:child2:1" ) ); + } + + @Test + public void buildInstanceFromFile() + throws Exception + { + final File pom = fixture.getTestFile( "projects", "simple.pom.xml" ); + final MavenProject project = fixture.projectManager().buildProjectInstance( pom, fixture.newSession() ); + + assertEquals( pom, project.getFile() ); + assertEquals( "test", project.getGroupId() ); + assertEquals( "project", project.getArtifactId() ); + assertEquals( "1", project.getVersion() ); + } + + @Test + public void buildInstanceFromCoords() + throws Exception + { + final MavenProject project = + fixture.projectManager().buildProjectInstance( "test", "found-dep", "1", fixture.newSession() ); + + assertEquals( "test", project.getGroupId() ); + assertEquals( "found-dep", project.getArtifactId() ); + assertEquals( "1", project.getVersion() ); + } + + @BeforeClass + public static void setup() + throws Exception + { + fixture = TestFixture.getInstance(); + } + + @AfterClass + public static void shutdown() + throws IOException + { + if ( fixture != null ) + { + fixture.shutdown(); + } + } + +} Propchange: maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/test/java/org/apache/maven/mae/project/ProjectLoaderTest.java ------------------------------------------------------------------------------ svn:eol-style = native Added: maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/test/java/org/apache/maven/mae/project/testutil/TestFixture.java URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/test/java/org/apache/maven/mae/project/testutil/TestFixture.java?rev=1138204&view=auto ============================================================================== --- maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/test/java/org/apache/maven/mae/project/testutil/TestFixture.java (added) +++ maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/test/java/org/apache/maven/mae/project/testutil/TestFixture.java Tue Jun 21 21:48:35 2011 @@ -0,0 +1,393 @@ +/* + * Copyright 2011 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.maven.mae.project.testutil; + +import org.apache.commons.io.FileUtils; +import org.apache.log4j.ConsoleAppender; +import org.apache.log4j.Level; +import org.apache.log4j.LogManager; +import org.apache.log4j.Logger; +import org.apache.log4j.SimpleLayout; +import org.apache.log4j.spi.Configurator; +import org.apache.log4j.spi.LoggerRepository; +import org.apache.maven.artifact.InvalidRepositoryException; +import org.apache.maven.artifact.repository.ArtifactRepository; +import org.apache.maven.mae.MAEException; +import org.apache.maven.mae.app.AbstractMAEApplication; +import org.apache.maven.mae.boot.embed.MAEEmbedder; +import org.apache.maven.mae.boot.embed.MAEEmbedderBuilder; +import org.apache.maven.mae.boot.embed.MAEEmbeddingException; +import org.apache.maven.mae.conf.MavenPomVersionProvider; +import org.apache.maven.mae.conf.VersionProvider; +import org.apache.maven.mae.project.ProjectLoader; +import org.apache.maven.mae.project.session.ProjectToolsSession; +import org.apache.maven.mae.project.session.SimpleProjectToolsSession; +import org.apache.maven.model.Repository; +import org.apache.maven.model.building.ModelBuildingRequest; +import org.apache.maven.project.DefaultProjectBuildingRequest; +import org.apache.maven.project.MavenProject; +import org.apache.maven.project.ProjectBuilder; +import org.apache.maven.project.ProjectBuildingException; +import org.apache.maven.project.ProjectBuildingResult; +import org.codehaus.plexus.component.annotations.Component; +import org.codehaus.plexus.component.annotations.Requirement; +import org.junit.Assert; + +import java.io.File; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Enumeration; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; + +@Component( role = TestFixture.class ) +public final class TestFixture + extends AbstractMAEApplication +{ + + @Requirement + private MAEEmbedder embedder; + + @Requirement + private ProjectBuilder projectBuilder; + + @Requirement + private ProjectLoader projectManager; + + private File localRepoDir; + + private File tempProjectDir; + + private ArtifactRepository localRepository; + + private static Repository rawRemoteRepo; + + private ArtifactRepository remoteRepository; + + private final Set<File> tempFiles = new LinkedHashSet<File>(); + + private boolean debug = false; + + private static TestFixture fixture; + + private static int instances = 0; + + private TestFixture() + throws MAEException, IOException + { + setupDebugLogging(); + + initFiles(); + // withVirtualComponent( ProjectToolsSession.class ); + // setVirtualInstance( ProjectToolsSession.class, ) + } + + public static void setupDebugLogging() + { + final Configurator log4jConfigurator = new Configurator() + { + @Override + @SuppressWarnings( "unchecked" ) + public void doConfigure( final URL notUsed, final LoggerRepository repo ) + { + final ConsoleAppender appender = new ConsoleAppender( new SimpleLayout() ); + appender.setImmediateFlush( true ); + appender.setThreshold( Level.ALL ); + + repo.getRootLogger().addAppender( appender ); + + final Enumeration<Logger> loggers = repo.getCurrentLoggers(); + while ( loggers.hasMoreElements() ) + { + final Logger logger = loggers.nextElement(); + logger.addAppender( appender ); + logger.setLevel( Level.INFO ); + } + } + }; + + log4jConfigurator.doConfigure( null, LogManager.getLoggerRepository() ); + } + + public static TestFixture getInstance() + throws MAEException, IOException + { + if ( fixture == null ) + { + fixture = new TestFixture(); + fixture.load(); + fixture.initObjects(); + } + + instances++; + return fixture; + } + + public void setDebug( final boolean debug ) + { + this.debug = debug; + } + + public MavenProject getTestProject( final String path ) + throws ProjectBuildingException, IOException + { + final File pom = getTestFile( "projects", path ); + + final DefaultProjectBuildingRequest req = new DefaultProjectBuildingRequest(); + req.setLocalRepository( localRepository ); + + final List<ArtifactRepository> repos = new ArrayList<ArtifactRepository>(); + repos.add( remoteRepository ); + + req.setRemoteRepositories( repos ); + + req.setSystemProperties( System.getProperties() ); + req.setValidationLevel( ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL ); + req.setProcessPlugins( false ); + + final ProjectBuildingResult result = projectBuilder.build( pom, req ); + return result.getProject(); + } + + public File getTestFile( final String basedir, final String subpath ) + throws IOException + { + return getTestFile( basedir, subpath, false ); + } + + public File getTestFile( final String basedir, final String subpath, final boolean copy ) + throws IOException + { + String path; + if ( basedir == null ) + { + path = subpath; + } + else if ( subpath == null ) + { + path = basedir; + } + else + { + path = new File( basedir, subpath ).getPath(); + } + + final URL resource = Thread.currentThread().getContextClassLoader().getResource( path ); + if ( resource == null ) + { + Assert.fail( "Cannot find test file: " + path ); + } + + File pom = new File( resource.getPath() ); + if ( copy ) + { + final File pomCopy = new File( tempProjectDir, path ); + pomCopy.getParentFile().mkdirs(); + + FileUtils.copyFile( pom, pomCopy ); + pom = pomCopy; + } + + return pom; + } + + public MAEEmbedder embedder() + { + return embedder; + } + + public void shutdown() + throws IOException + { + instances--; + if ( instances < 1 ) + { + if ( !debug ) + { + for ( final File f : tempFiles ) + { + if ( f != null && f.exists() ) + { + FileUtils.forceDelete( f ); + } + } + + tempFiles.clear(); + } + } + } + + public Repository externalRepository() + { + return rawRemoteRepo; + } + + public ProjectToolsSession newSession( final MavenProject... projects ) + throws IOException + { + final File workdir = File.createTempFile( "test-meadin.", ".work" ); + workdir.delete(); + workdir.mkdirs(); + + final ProjectToolsSession session = new SimpleProjectToolsSession( workdir, localRepoDir, rawRemoteRepo ); + + session.setRemoteArtifactRepositories( Collections.singletonList( remoteRepository ) ); + + if ( projects != null && projects.length > 0 ) + { + for ( final MavenProject project : projects ) + { + session.addReactorProject( project ); + } + } + + return session; + } + + @Override + protected void afterLoading( final MAEEmbedder embedder ) + throws MAEException + { + super.afterLoading( embedder ); + try + { + initFiles(); + } + catch ( final IOException e ) + { + throw new MAEException( "Failed to initialize: %s", e, e.getMessage() ); + } + } + + private void initFiles() + throws MAEException, IOException + { + if ( localRepoDir == null || !localRepoDir.isDirectory() ) + { + try + { + localRepoDir = createTempDir( "local-repository.", ".dir" ); + } + catch ( final IOException e ) + { + throw new MAEEmbeddingException( "Failed to create test local-repository directory.\nReason: %s", e, + e.getMessage() ); + } + } + + if ( tempProjectDir == null || !tempProjectDir.isDirectory() ) + { + try + { + tempProjectDir = createTempDir( "test-projects.", ".dir" ); + } + catch ( final IOException e ) + { + throw new MAEEmbeddingException( "Failed to create temporary projects directory.\nReason: %s", e, + e.getMessage() ); + } + } + + rawRemoteRepo = new Repository(); + rawRemoteRepo.setId( "test" ); + rawRemoteRepo.setName( "Test Remote Repository" ); + + try + { + rawRemoteRepo.setUrl( getTestFile( "test-repo", null, false ).toURI().toURL().toExternalForm() ); + } + catch ( final MalformedURLException e ) + { + throw new MAEEmbeddingException( "Failed to create test remote-repository instance.\nReason: %s", e, + e.getMessage() ); + } + } + + private void initObjects() + throws MAEException + { + try + { + remoteRepository = + embedder.serviceManager().mavenRepositorySystem().buildArtifactRepository( rawRemoteRepo ); + localRepository = embedder.serviceManager().mavenRepositorySystem().createLocalRepository( localRepoDir ); + } + catch ( final InvalidRepositoryException e ) + { + throw new MAEEmbeddingException( "Failed to create repository instances. Reason: %s", e, e.getMessage() ); + } + } + + public File createTempDir( final String prefix, final String suffix ) + throws IOException + { + final File dir = createTempFile( prefix, suffix ); + + dir.delete(); + dir.mkdirs(); + + return dir; + } + + public File createTempFile( final String prefix, final String suffix ) + throws IOException + { + final File f = File.createTempFile( prefix, suffix ); + tempFiles.add( f ); + + return f; + } + + @Override + protected void configureBuilder( final MAEEmbedderBuilder builder ) + throws MAEException + { + super.configureBuilder( builder ); + + // show the versions of things loaded + // enable classpath scanning to avoid the need to generate plexus component descriptors before testing. + builder.withVersion( true ).withClassScanningEnabled( true ); + } + + public ProjectLoader projectManager() + { + return projectManager; + } + + @Override + public String getId() + { + return "depsolv"; + } + + @Override + public String getName() + { + return "Dependency-Resolver"; + } + + @Override + protected VersionProvider getVersionProvider() + { + return new MavenPomVersionProvider( "org.commonjava.emb.components", "emb-dependency-resolver" ); + } + +} Propchange: maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/test/java/org/apache/maven/mae/project/testutil/TestFixture.java ------------------------------------------------------------------------------ svn:eol-style = native Added: maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/test/resources/projects/multi-module/child1/pom.xml URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/test/resources/projects/multi-module/child1/pom.xml?rev=1138204&view=auto ============================================================================== --- maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/test/resources/projects/multi-module/child1/pom.xml (added) +++ maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/test/resources/projects/multi-module/child1/pom.xml Tue Jun 21 21:48:35 2011 @@ -0,0 +1,32 @@ +<!-- + Copyright 2010 Red Hat, Inc. + + Licensed 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. +--> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <groupId>test</groupId> + <artifactId>child1</artifactId> + <version>1</version> + + <scm> + <connection>http://svn.apache.org/repos/asf/maven/maven-3/trunk</connection> + <developerConnection>https://svn.apache.org/repos/asf/maven/maven-3/trunk</developerConnection> + <url>http://svn.apache.org/repos/asf/maven/maven-3/trunk</url> + </scm> + <modules> + </modules> + +</project> Propchange: maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/test/resources/projects/multi-module/child1/pom.xml ------------------------------------------------------------------------------ svn:eol-style = native Added: maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/test/resources/projects/multi-module/child2/pom.xml URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/test/resources/projects/multi-module/child2/pom.xml?rev=1138204&view=auto ============================================================================== --- maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/test/resources/projects/multi-module/child2/pom.xml (added) +++ maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/test/resources/projects/multi-module/child2/pom.xml Tue Jun 21 21:48:35 2011 @@ -0,0 +1,32 @@ +<!-- + Copyright 2010 Red Hat, Inc. + + Licensed 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. +--> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <groupId>test</groupId> + <artifactId>child2</artifactId> + <version>1</version> + + <scm> + <connection>http://svn.apache.org/repos/asf/maven/maven-3/trunk</connection> + <developerConnection>https://svn.apache.org/repos/asf/maven/maven-3/trunk</developerConnection> + <url>http://svn.apache.org/repos/asf/maven/maven-3/trunk</url> + </scm> + <modules> + </modules> + +</project> Propchange: maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/test/resources/projects/multi-module/child2/pom.xml ------------------------------------------------------------------------------ svn:eol-style = native Added: maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/test/resources/projects/multi-module/pom.xml URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/test/resources/projects/multi-module/pom.xml?rev=1138204&view=auto ============================================================================== --- maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/test/resources/projects/multi-module/pom.xml (added) +++ maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/test/resources/projects/multi-module/pom.xml Tue Jun 21 21:48:35 2011 @@ -0,0 +1,35 @@ +<!-- + Copyright 2010 Red Hat, Inc. + + Licensed 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. +--> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <groupId>test</groupId> + <artifactId>parent</artifactId> + <packaging>pom</packaging> + <version>1</version> + + <scm> + <connection>http://svn.apache.org/repos/asf/maven/maven-3/trunk</connection> + <developerConnection>https://svn.apache.org/repos/asf/maven/maven-3/trunk</developerConnection> + <url>http://svn.apache.org/repos/asf/maven/maven-3/trunk</url> + </scm> + <modules> + <module>child1</module> + <module>child2</module> + </modules> + +</project> Propchange: maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/test/resources/projects/multi-module/pom.xml ------------------------------------------------------------------------------ svn:eol-style = native Added: maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/test/resources/projects/simple.pom.xml URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/test/resources/projects/simple.pom.xml?rev=1138204&view=auto ============================================================================== --- maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/test/resources/projects/simple.pom.xml (added) +++ maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/test/resources/projects/simple.pom.xml Tue Jun 21 21:48:35 2011 @@ -0,0 +1,30 @@ +<!-- + Copyright 2010 Red Hat, Inc. + + Licensed 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. +--> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <groupId>test</groupId> + <artifactId>project</artifactId> + <version>1</version> + + <scm> + <connection>http://svn.apache.org/repos/asf/maven/maven-3/trunk</connection> + <developerConnection>https://svn.apache.org/repos/asf/maven/maven-3/trunk</developerConnection> + <url>http://svn.apache.org/repos/asf/maven/maven-3/trunk</url> + </scm> + +</project> Propchange: maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/test/resources/projects/simple.pom.xml ------------------------------------------------------------------------------ svn:eol-style = native Added: maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/test/resources/test-repo/test/found-dep/1/found-dep-1.pom URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/test/resources/test-repo/test/found-dep/1/found-dep-1.pom?rev=1138204&view=auto ============================================================================== --- maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/test/resources/test-repo/test/found-dep/1/found-dep-1.pom (added) +++ maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/test/resources/test-repo/test/found-dep/1/found-dep-1.pom Tue Jun 21 21:48:35 2011 @@ -0,0 +1,30 @@ +<!-- + Copyright 2010 Red Hat, Inc. + + Licensed 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. +--> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <groupId>test</groupId> + <artifactId>found-dep</artifactId> + <version>1</version> + + <scm> + <connection>http://svn.apache.org/repos/asf/maven/maven-3/trunk</connection> + <developerConnection>https://svn.apache.org/repos/asf/maven/maven-3/trunk</developerConnection> + <url>http://svn.apache.org/repos/asf/maven/maven-3/trunk</url> + </scm> + +</project> Propchange: maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/test/resources/test-repo/test/found-dep/1/found-dep-1.pom ------------------------------------------------------------------------------ svn:eol-style = native Added: maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/test/resources/test-repo/test/found-dep/maven-metadata.xml URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/test/resources/test-repo/test/found-dep/maven-metadata.xml?rev=1138204&view=auto ============================================================================== --- maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/test/resources/test-repo/test/found-dep/maven-metadata.xml (added) +++ maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/test/resources/test-repo/test/found-dep/maven-metadata.xml Tue Jun 21 21:48:35 2011 @@ -0,0 +1,29 @@ +<!-- + Copyright 2010 Red Hat, Inc. + + Licensed 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. +--> +<metadata> + <groupId>test</groupId> + <artifactId>found-dep</artifactId> + <versioning> + <latest>2</latest> + <release>2</release> + <versions> + <version>2</version> + <version>2-beta-2</version> + <version>2-beta-1</version> + <version>1</version> + </versions> + </versioning> +</metadata> Propchange: maven/sandbox/trunk/mae/mae-components/mae-project-tools/src/test/resources/test-repo/test/found-dep/maven-metadata.xml ------------------------------------------------------------------------------ svn:eol-style = native Added: maven/sandbox/trunk/mae/mae-components/pom.xml URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mae/mae-components/pom.xml?rev=1138204&view=auto ============================================================================== --- maven/sandbox/trunk/mae/mae-components/pom.xml (added) +++ maven/sandbox/trunk/mae/mae-components/pom.xml Tue Jun 21 21:48:35 2011 @@ -0,0 +1,77 @@ +<?xml version='1.0'?> +<!-- + 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. +--> +<project xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation='http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd' xmlns='http://maven.apache.org/POM/4.0.0'> + <modelVersion>4.0.0</modelVersion> + <parent> + <artifactId>mae</artifactId> + <groupId>org.apache.maven.mae</groupId> + <version>1.0-alpha-1-SNAPSHOT</version> + </parent> + + <groupId>org.apache.maven.mae.components</groupId> + <artifactId>mae-components</artifactId> + <name>Maven App Engine: Components Parent POM</name> + <packaging>pom</packaging> + + <dependencyManagement> + <dependencies> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven</artifactId> + <version>${mavenVersion}</version> + <type>pom</type> + <scope>import</scope> + </dependency> + <dependency> + <groupId>org.apache.maven.mae</groupId> + <artifactId>mae-library-bom</artifactId> + <version>${project.version}</version> + <type>pom</type> + <scope>import</scope> + </dependency> + </dependencies> + </dependencyManagement> + + <dependencies> + <dependency> + <groupId>org.apache.maven.mae</groupId> + <artifactId>mae-api</artifactId> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>log4j</groupId> + <artifactId>log4j</artifactId> + <scope>provided</scope> + </dependency> + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.codehaus.plexus</groupId> + <artifactId>plexus-component-metadata</artifactId> + </plugin> + </plugins> + </build> + + <modules> + <module>mae-project-tools</module> + </modules> +</project> Propchange: maven/sandbox/trunk/mae/mae-components/pom.xml ------------------------------------------------------------------------------ svn:eol-style = native Modified: maven/sandbox/trunk/mae/pom.xml URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mae/pom.xml?rev=1138204&r1=1138203&r2=1138204&view=diff ============================================================================== --- maven/sandbox/trunk/mae/pom.xml (original) +++ maven/sandbox/trunk/mae/pom.xml Tue Jun 21 21:48:35 2011 @@ -66,6 +66,7 @@ </dependencies> <properties> + <maeVersion>${project.version}</maeVersion> <mavenVersion>3.0.3</mavenVersion> <plexusVersion>1.5.5</plexusVersion> </properties> @@ -77,6 +78,7 @@ <module>mae-booter</module> <module>mae-app</module> <module>mae-prompter-cli</module> + <module>mae-components</module> </modules> <scm>