mirror of https://github.com/apache/archiva.git
[MRM-127] read project using project builder to correctly handle inheritence and interpolation
git-svn-id: https://svn.apache.org/repos/asf/maven/repository-manager/trunk@425953 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
1c20fd9fd8
commit
8da406db53
|
@ -33,6 +33,10 @@
|
||||||
<groupId>org.apache.maven</groupId>
|
<groupId>org.apache.maven</groupId>
|
||||||
<artifactId>maven-artifact-manager</artifactId>
|
<artifactId>maven-artifact-manager</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.maven</groupId>
|
||||||
|
<artifactId>maven-project</artifactId>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.maven</groupId>
|
<groupId>org.apache.maven</groupId>
|
||||||
<artifactId>maven-model</artifactId>
|
<artifactId>maven-model</artifactId>
|
||||||
|
|
|
@ -18,21 +18,22 @@ package org.apache.maven.repository.indexing.record;
|
||||||
|
|
||||||
import org.apache.maven.artifact.Artifact;
|
import org.apache.maven.artifact.Artifact;
|
||||||
import org.apache.maven.artifact.factory.ArtifactFactory;
|
import org.apache.maven.artifact.factory.ArtifactFactory;
|
||||||
|
import org.apache.maven.artifact.repository.ArtifactRepository;
|
||||||
import org.apache.maven.model.Model;
|
import org.apache.maven.model.Model;
|
||||||
import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
|
import org.apache.maven.project.MavenProject;
|
||||||
|
import org.apache.maven.project.MavenProjectBuilder;
|
||||||
|
import org.apache.maven.project.ProjectBuildingException;
|
||||||
import org.apache.maven.repository.digest.Digester;
|
import org.apache.maven.repository.digest.Digester;
|
||||||
import org.apache.maven.repository.indexing.RepositoryIndexException;
|
import org.apache.maven.repository.indexing.RepositoryIndexException;
|
||||||
import org.codehaus.plexus.util.IOUtil;
|
|
||||||
import org.codehaus.plexus.util.xml.Xpp3Dom;
|
import org.codehaus.plexus.util.xml.Xpp3Dom;
|
||||||
import org.codehaus.plexus.util.xml.Xpp3DomBuilder;
|
import org.codehaus.plexus.util.xml.Xpp3DomBuilder;
|
||||||
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
|
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileNotFoundException;
|
|
||||||
import java.io.FileReader;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -64,6 +65,11 @@ public class StandardArtifactIndexRecordFactory
|
||||||
*/
|
*/
|
||||||
private ArtifactFactory artifactFactory;
|
private ArtifactFactory artifactFactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @plexus.requirement
|
||||||
|
*/
|
||||||
|
private MavenProjectBuilder projectBuilder;
|
||||||
|
|
||||||
private static final String PLUGIN_METADATA_NAME = "META-INF/maven/plugin.xml";
|
private static final String PLUGIN_METADATA_NAME = "META-INF/maven/plugin.xml";
|
||||||
|
|
||||||
private static final String ARCHETYPE_METADATA_NAME = "META-INF/maven/archetype.xml";
|
private static final String ARCHETYPE_METADATA_NAME = "META-INF/maven/archetype.xml";
|
||||||
|
@ -120,12 +126,12 @@ public class StandardArtifactIndexRecordFactory
|
||||||
artifact.getRepository().pathOf( pomArtifact ) );
|
artifact.getRepository().pathOf( pomArtifact ) );
|
||||||
if ( pomFile.exists() )
|
if ( pomFile.exists() )
|
||||||
{
|
{
|
||||||
populatePomEntries( readPom( pomFile ), record );
|
populatePomEntries( readPom( pomArtifact, artifact.getRepository() ), record );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Model model = readPom( file );
|
Model model = readPom( artifact, artifact.getRepository() );
|
||||||
|
|
||||||
if ( !"pom".equals( model.getPackaging() ) )
|
if ( !"pom".equals( model.getPackaging() ) )
|
||||||
{
|
{
|
||||||
|
@ -158,33 +164,21 @@ public class StandardArtifactIndexRecordFactory
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
private Model readPom( File file )
|
private Model readPom( Artifact artifact, ArtifactRepository repository )
|
||||||
throws RepositoryIndexException
|
throws RepositoryIndexException
|
||||||
{
|
{
|
||||||
MavenXpp3Reader r = new MavenXpp3Reader();
|
// TODO: will this pollute with local repo metadata?
|
||||||
|
Model model;
|
||||||
FileReader reader = null;
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
reader = new FileReader( file );
|
MavenProject project = projectBuilder.buildFromRepository( artifact, Collections.EMPTY_LIST, repository );
|
||||||
return r.read( reader );
|
model = project.getModel();
|
||||||
}
|
}
|
||||||
catch ( FileNotFoundException e )
|
catch ( ProjectBuildingException e )
|
||||||
{
|
{
|
||||||
throw new RepositoryIndexException( "Unable to find requested POM: " + e.getMessage(), e );
|
throw new RepositoryIndexException( "Unable to read project: " + e.getMessage(), e );
|
||||||
}
|
|
||||||
catch ( IOException e )
|
|
||||||
{
|
|
||||||
throw new RepositoryIndexException( "Unable to read POM: " + e.getMessage(), e );
|
|
||||||
}
|
|
||||||
catch ( XmlPullParserException xe )
|
|
||||||
{
|
|
||||||
throw new RepositoryIndexException( "Unable to parse POM: " + xe.getMessage(), xe );
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
IOUtil.close( reader );
|
|
||||||
}
|
}
|
||||||
|
return model;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void populateArchiveEntries( List files, StandardArtifactIndexRecord record, File artifactFile )
|
private void populateArchiveEntries( List files, StandardArtifactIndexRecord record, File artifactFile )
|
||||||
|
|
|
@ -67,7 +67,7 @@ Indexer Design
|
||||||
dependency conflict ID, Lucene cannot delete by a combination of terms, so would require storing an additional
|
dependency conflict ID, Lucene cannot delete by a combination of terms, so would require storing an additional
|
||||||
field in the index where the file already exists.
|
field in the index where the file already exists.
|
||||||
|
|
||||||
The plugin prefix can be found either from inside the plugin JAR (<<<META-INF/maven/plugin.xml>>>), or from the
|
The plugin prefix could be found either from inside the plugin JAR (<<<META-INF/maven/plugin.xml>>>), or from the
|
||||||
repository metadata for the plugin's group. For simplicity, the first approach will be used. This means at present
|
repository metadata for the plugin's group. For simplicity, the first approach will be used. This means at present
|
||||||
there is no need to index the repository metadata, however that may be considered in future.
|
there is no need to index the repository metadata, however that may be considered in future.
|
||||||
|
|
||||||
|
@ -76,9 +76,10 @@ Indexer Design
|
||||||
if found set its packaging to <<<maven-archetype>>>. In the future, this handling will be deprecated as the POMs
|
if found set its packaging to <<<maven-archetype>>>. In the future, this handling will be deprecated as the POMs
|
||||||
can start using the appropriate packaging.
|
can start using the appropriate packaging.
|
||||||
|
|
||||||
The index is shared among multiple repositories. The source repository is recorded in the index record. The indexer
|
The index is shared among multiple repositories. The source repository is recorded in the index record. The
|
||||||
should complain if an artifact is attempted to be updated from a different repository at a later date to avoid
|
discovery/conversion/reporting mechanisms are expected to deal with duplicates before reaching the indexer, so if the
|
||||||
duplicates. Ideally, the discovery/conversion mechanisms would deal with this before reaching the indexer.
|
indexer encounters an artifact from a different repository than it was already added, it will simply replace the
|
||||||
|
record.
|
||||||
|
|
||||||
When indexing metadata from a POM, the POM should be loaded using the Maven project builder so that inheritance and
|
When indexing metadata from a POM, the POM should be loaded using the Maven project builder so that inheritance and
|
||||||
interpolation are performed. This ensures that the record is as complete as possible, and that searching by
|
interpolation are performed. This ensures that the record is as complete as possible, and that searching by
|
||||||
|
|
|
@ -113,6 +113,34 @@ public class StandardArtifactIndexRecordFactoryTest
|
||||||
assertEquals( "check record", expectedRecord, record );
|
assertEquals( "check record", expectedRecord, record );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testIndexedJarWithParentPom()
|
||||||
|
throws RepositoryIndexException
|
||||||
|
{
|
||||||
|
Artifact artifact = createArtifact( "test-child-pom" );
|
||||||
|
|
||||||
|
RepositoryIndexRecord record = factory.createRecord( artifact );
|
||||||
|
|
||||||
|
StandardArtifactIndexRecord expectedRecord = new StandardArtifactIndexRecord();
|
||||||
|
expectedRecord.setMd5Checksum( "3a0adc365f849366cd8b633cad155cb7" );
|
||||||
|
expectedRecord.setFilename( repository.pathOf( artifact ) );
|
||||||
|
expectedRecord.setLastModified( artifact.getFile().lastModified() );
|
||||||
|
expectedRecord.setSize( artifact.getFile().length() );
|
||||||
|
expectedRecord.setClasses( "A\nb.B\nb.c.C\n" );
|
||||||
|
expectedRecord.setArtifactId( "test-child-pom" );
|
||||||
|
expectedRecord.setGroupId( TEST_GROUP_ID );
|
||||||
|
expectedRecord.setVersion( "1.0" );
|
||||||
|
expectedRecord.setFiles( "META-INF/MANIFEST.MF\nA.class\nb/B.class\nb/c/C.class\n" );
|
||||||
|
expectedRecord.setSha1Checksum( "c66f18bf192cb613fc2febb4da541a34133eedc2" );
|
||||||
|
expectedRecord.setType( "jar" );
|
||||||
|
expectedRecord.setRepository( "test" );
|
||||||
|
expectedRecord.setPackaging( "jar" );
|
||||||
|
expectedRecord.setProjectName( "Child Project" );
|
||||||
|
expectedRecord.setProjectDescription( "Description" );
|
||||||
|
expectedRecord.setInceptionYear( "2005" );
|
||||||
|
|
||||||
|
assertEquals( "check record", expectedRecord, record );
|
||||||
|
}
|
||||||
|
|
||||||
public void testIndexedPom()
|
public void testIndexedPom()
|
||||||
throws RepositoryIndexException
|
throws RepositoryIndexException
|
||||||
{
|
{
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
<!--
|
||||||
|
~ Copyright 2005-2006 The Apache Software Foundation.
|
||||||
|
~
|
||||||
|
~ 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>org.apache.maven.repository.record</groupId>
|
||||||
|
<artifactId>parent-pom</artifactId>
|
||||||
|
<version>1</version>
|
||||||
|
<packaging>pom</packaging>
|
||||||
|
<name>Test Parent POM</name>
|
||||||
|
<description>Description</description>
|
||||||
|
<inceptionYear>2005</inceptionYear>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>junit</groupId>
|
||||||
|
<artifactId>junit</artifactId>
|
||||||
|
<version>3.8.1</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
<modules>
|
||||||
|
<module>test-child-pom</module>
|
||||||
|
</modules>
|
||||||
|
</project>
|
||||||
|
|
Binary file not shown.
|
@ -0,0 +1,28 @@
|
||||||
|
<!--
|
||||||
|
~ Copyright 2005-2006 The Apache Software Foundation.
|
||||||
|
~
|
||||||
|
~ 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>
|
||||||
|
<parent>
|
||||||
|
<groupId>org.apache.maven.repository.record</groupId>
|
||||||
|
<artifactId>parent-pom</artifactId>
|
||||||
|
<version>1</version>
|
||||||
|
</parent>
|
||||||
|
<artifactId>test-child-pom</artifactId>
|
||||||
|
<version>1.0</version>
|
||||||
|
<name>Child Project</name>
|
||||||
|
</project>
|
Loading…
Reference in New Issue