Author: brett
Date: Wed Dec 2 02:21:05 2009
New Revision: 886035
URL: http://svn.apache.org/viewvc?rev=886035&view=rev
Log:
[MRM-1025] change duplicate artifact reporting to be a repository scanned
consumer to facilitate removing the database unprocessed consumers
Removed:
archiva/branches/MRM-1025/archiva-modules/archiva-reporting/archiva-project-reports/src/main/java/org/apache/maven/archiva/reporting/project/ProjectDependenciesConsumer.java
Modified:
archiva/branches/MRM-1025/archiva-modules/archiva-base/archiva-consumers/archiva-database-consumers/src/main/java/org/apache/maven/archiva/consumers/database/ProjectModelToDatabaseConsumer.java
archiva/branches/MRM-1025/archiva-modules/archiva-reporting/archiva-artifact-reports/pom.xml
archiva/branches/MRM-1025/archiva-modules/archiva-reporting/archiva-artifact-reports/src/main/java/org/apache/maven/archiva/reporting/artifact/DuplicateArtifactsConsumer.java
archiva/branches/MRM-1025/archiva-modules/archiva-reporting/archiva-artifact-reports/src/test/java/org/apache/maven/archiva/reporting/artifact/DuplicateArtifactReportTest.java
Modified:
archiva/branches/MRM-1025/archiva-modules/archiva-base/archiva-consumers/archiva-database-consumers/src/main/java/org/apache/maven/archiva/consumers/database/ProjectModelToDatabaseConsumer.java
URL:
http://svn.apache.org/viewvc/archiva/branches/MRM-1025/archiva-modules/archiva-base/archiva-consumers/archiva-database-consumers/src/main/java/org/apache/maven/archiva/consumers/database/ProjectModelToDatabaseConsumer.java?rev=886035&r1=886034&r2=886035&view=diff
==============================================================================
---
archiva/branches/MRM-1025/archiva-modules/archiva-base/archiva-consumers/archiva-database-consumers/src/main/java/org/apache/maven/archiva/consumers/database/ProjectModelToDatabaseConsumer.java
(original)
+++
archiva/branches/MRM-1025/archiva-modules/archiva-base/archiva-consumers/archiva-database-consumers/src/main/java/org/apache/maven/archiva/consumers/database/ProjectModelToDatabaseConsumer.java
Wed Dec 2 02:21:05 2009
@@ -9,7 +9,7 @@
* "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
+ * 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
@@ -34,10 +34,7 @@
import org.apache.maven.archiva.model.ArchivaArtifact;
import org.apache.maven.archiva.model.ArchivaModelCloner;
import org.apache.maven.archiva.model.ArchivaProjectModel;
-import org.apache.maven.archiva.model.CiManagement;
-import org.apache.maven.archiva.model.IssueManagement;
import org.apache.maven.archiva.model.Keys;
-import org.apache.maven.archiva.model.Organization;
import org.apache.maven.archiva.model.RepositoryProblem;
import org.apache.maven.archiva.reporting.artifact.CorruptArtifactReport;
import org.apache.maven.archiva.repository.ManagedRepositoryContent;
Modified:
archiva/branches/MRM-1025/archiva-modules/archiva-reporting/archiva-artifact-reports/pom.xml
URL:
http://svn.apache.org/viewvc/archiva/branches/MRM-1025/archiva-modules/archiva-reporting/archiva-artifact-reports/pom.xml?rev=886035&r1=886034&r2=886035&view=diff
==============================================================================
---
archiva/branches/MRM-1025/archiva-modules/archiva-reporting/archiva-artifact-reports/pom.xml
(original)
+++
archiva/branches/MRM-1025/archiva-modules/archiva-reporting/archiva-artifact-reports/pom.xml
Wed Dec 2 02:21:05 2009
@@ -42,6 +42,10 @@
</dependency>
<dependency>
<groupId>org.codehaus.plexus</groupId>
+ <artifactId>plexus-digest</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-utils</artifactId>
</dependency>
<dependency>
Modified:
archiva/branches/MRM-1025/archiva-modules/archiva-reporting/archiva-artifact-reports/src/main/java/org/apache/maven/archiva/reporting/artifact/DuplicateArtifactsConsumer.java
URL:
http://svn.apache.org/viewvc/archiva/branches/MRM-1025/archiva-modules/archiva-reporting/archiva-artifact-reports/src/main/java/org/apache/maven/archiva/reporting/artifact/DuplicateArtifactsConsumer.java?rev=886035&r1=886034&r2=886035&view=diff
==============================================================================
---
archiva/branches/MRM-1025/archiva-modules/archiva-reporting/archiva-artifact-reports/src/main/java/org/apache/maven/archiva/reporting/artifact/DuplicateArtifactsConsumer.java
(original)
+++
archiva/branches/MRM-1025/archiva-modules/archiva-reporting/archiva-artifact-reports/src/main/java/org/apache/maven/archiva/reporting/artifact/DuplicateArtifactsConsumer.java
Wed Dec 2 02:21:05 2009
@@ -19,25 +19,32 @@
* under the License.
*/
+import java.io.File;
import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
import java.util.List;
import org.apache.commons.collections.CollectionUtils;
import org.apache.maven.archiva.configuration.ArchivaConfiguration;
import org.apache.maven.archiva.configuration.ConfigurationNames;
import org.apache.maven.archiva.configuration.FileTypes;
+import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration;
import org.apache.maven.archiva.consumers.AbstractMonitoredConsumer;
import org.apache.maven.archiva.consumers.ConsumerException;
+import org.apache.maven.archiva.consumers.KnownRepositoryContentConsumer;
import org.apache.maven.archiva.database.ArchivaDAO;
import org.apache.maven.archiva.database.ArchivaDatabaseException;
import org.apache.maven.archiva.database.ObjectNotFoundException;
import
org.apache.maven.archiva.database.constraints.ArtifactsByChecksumConstraint;
-import org.apache.maven.archiva.database.updater.ArchivaArtifactConsumer;
import org.apache.maven.archiva.model.ArchivaArtifact;
import org.apache.maven.archiva.model.RepositoryProblem;
import org.apache.maven.archiva.repository.ManagedRepositoryContent;
import org.apache.maven.archiva.repository.RepositoryContentFactory;
import org.apache.maven.archiva.repository.RepositoryException;
+import org.apache.maven.archiva.repository.layout.LayoutException;
+import org.codehaus.plexus.digest.Digester;
+import org.codehaus.plexus.digest.DigesterException;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
import
org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
import org.codehaus.plexus.registry.Registry;
@@ -48,17 +55,19 @@
/**
* Search the database of known SHA1 Checksums for potential duplicate
artifacts.
*
+ * TODO: no need for this to be a scanner - we can just query the database /
content repository to get a full list
+ *
* @version $Id$
- *
- * @plexus.component
role="org.apache.maven.archiva.database.updater.ArchivaArtifactConsumer"
- * role-hint="duplicate-artifacts"
+ * @plexus.component
role="org.apache.maven.archiva.consumers.KnownRepositoryContentConsumer"
+ * role-hint="duplicate-artifacts"
+ * instantiation-strategy="per-lookup"
*/
public class DuplicateArtifactsConsumer
extends AbstractMonitoredConsumer
- implements ArchivaArtifactConsumer, RegistryListener, Initializable
+ implements KnownRepositoryContentConsumer, RegistryListener, Initializable
{
private Logger log = LoggerFactory.getLogger(
DuplicateArtifactsConsumer.class );
-
+
/**
* @plexus.configuration default-value="duplicate-artifacts"
*/
@@ -89,9 +98,19 @@
*/
private RepositoryContentFactory repositoryFactory;
- // TODO: why is this not used? If it should be, what about excludes?
private List<String> includes = new ArrayList<String>();
+ private File repositoryDir;
+
+ /**
+ * @plexus.requirement role-hint="sha1"
+ */
+ private Digester digestSha1;
+
+ private String repoId;
+
+ private ManagedRepositoryContent repository;
+
public String getId()
{
return id;
@@ -107,40 +126,62 @@
return false;
}
- public void beginScan()
+ public List<String> getIncludes()
{
- /* do nothing */
+ return includes;
}
- public void completeScan()
+ public List<String> getExcludes()
{
- /* do nothing */
+ return Collections.emptyList();
}
- public List<String> getIncludedTypes()
+ public void beginScan( ManagedRepositoryConfiguration repo, Date
whenGathered )
+ throws ConsumerException
{
- return null;
+ try
+ {
+ repoId = repo.getId();
+ repository = repositoryFactory.getManagedRepositoryContent( repoId
);
+ this.repositoryDir = new File( repository.getRepoRoot() );
+ }
+ catch ( RepositoryException e )
+ {
+ throw new ConsumerException( e.getMessage(), e );
+ }
}
- public void processArchivaArtifact( ArchivaArtifact artifact )
+ public void processFile( String path )
throws ConsumerException
{
- String checksumSha1 = artifact.getModel().getChecksumSHA1();
+ File artifactFile = new File( this.repositoryDir, path );
- List<ArchivaArtifact> results = null;
+ // TODO: would be quicker to somehow make sure it ran after the update
database consumer, or as a part of that
+ // perhaps could use an artifact context that is retained for all
consumers? First in can set the SHA-1
+ String checksumSha1;
try
{
- results = dao.getArtifactDAO().queryArtifacts( new
ArtifactsByChecksumConstraint(
- checksumSha1, ArtifactsByChecksumConstraint.SHA1 ) );
+ checksumSha1 = digestSha1.calc( artifactFile );
+ }
+ catch ( DigesterException e )
+ {
+ throw new ConsumerException( e.getMessage(), e );
+ }
+
+ List<ArchivaArtifact> results;
+ try
+ {
+ results = dao.getArtifactDAO().queryArtifacts(
+ new ArtifactsByChecksumConstraint( checksumSha1,
ArtifactsByChecksumConstraint.SHA1 ) );
}
catch ( ObjectNotFoundException e )
{
- log.debug( "No duplicates for artifact: " + artifact );
+ log.debug( "No duplicates for artifact: " + path + " (repository "
+ repoId + ")" );
return;
}
catch ( ArchivaDatabaseException e )
{
- log.warn( "Unable to query DB for potential duplicates with : " +
artifact );
+ log.warn( "Unable to query DB for potential duplicates with: " +
path + " (repository " + repoId + "): " + e.getMessage(), e );
return;
}
@@ -149,10 +190,20 @@
if ( results.size() <= 1 )
{
// No duplicates detected.
- log.debug( "Found no duplicate artifact results on: " +
artifact );
+ log.debug( "Found no duplicate artifact results on: " + path +
" (repository " + repoId + ")" );
return;
}
+ ArchivaArtifact artifact;
+ try
+ {
+ artifact = new ArchivaArtifact(
repository.toArtifactReference( path ), repoId );
+ }
+ catch ( LayoutException e )
+ {
+ log.warn( "Unable to report problem for path: " + path );
+ return;
+ }
for ( ArchivaArtifact dupArtifact : results )
{
if ( dupArtifact.equals( artifact ) )
@@ -163,7 +214,7 @@
RepositoryProblem problem = new RepositoryProblem();
problem.setRepositoryId(
dupArtifact.getModel().getRepositoryId() );
- problem.setPath( toPath( dupArtifact ) );
+ problem.setPath( path );
problem.setGroupId( artifact.getGroupId() );
problem.setArtifactId( artifact.getArtifactId() );
problem.setVersion( artifact.getVersion() );
@@ -186,19 +237,9 @@
}
}
- private String toPath( ArchivaArtifact artifact )
+ public void completeScan()
{
- try
- {
- String repoId = artifact.getModel().getRepositoryId();
- ManagedRepositoryContent repo =
repositoryFactory.getManagedRepositoryContent( repoId );
- return repo.toPath( artifact );
- }
- catch ( RepositoryException e )
- {
- log.warn( "Unable to calculate path for artifact: " + artifact );
- return "";
- }
+ // nothing to do
}
public void afterConfigurationChange( Registry registry, String
propertyName, Object propertyValue )
Modified:
archiva/branches/MRM-1025/archiva-modules/archiva-reporting/archiva-artifact-reports/src/test/java/org/apache/maven/archiva/reporting/artifact/DuplicateArtifactReportTest.java
URL:
http://svn.apache.org/viewvc/archiva/branches/MRM-1025/archiva-modules/archiva-reporting/archiva-artifact-reports/src/test/java/org/apache/maven/archiva/reporting/artifact/DuplicateArtifactReportTest.java?rev=886035&r1=886034&r2=886035&view=diff
==============================================================================
---
archiva/branches/MRM-1025/archiva-modules/archiva-reporting/archiva-artifact-reports/src/test/java/org/apache/maven/archiva/reporting/artifact/DuplicateArtifactReportTest.java
(original)
+++
archiva/branches/MRM-1025/archiva-modules/archiva-reporting/archiva-artifact-reports/src/test/java/org/apache/maven/archiva/reporting/artifact/DuplicateArtifactReportTest.java
Wed Dec 2 02:21:05 2009
@@ -20,17 +20,20 @@
*/
import java.io.File;
+import java.io.IOException;
import java.util.Date;
import java.util.List;
import org.apache.commons.io.FileUtils;
import org.apache.maven.archiva.configuration.ArchivaConfiguration;
import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration;
+import org.apache.maven.archiva.consumers.KnownRepositoryContentConsumer;
import org.apache.maven.archiva.database.ArtifactDAO;
-import org.apache.maven.archiva.database.updater.ArchivaArtifactConsumer;
import org.apache.maven.archiva.model.ArchivaArtifact;
import org.apache.maven.archiva.model.RepositoryProblem;
import org.apache.maven.archiva.reporting.DynamicReportSource;
+import org.apache.maven.archiva.repository.ManagedRepositoryContent;
+import org.apache.maven.archiva.repository.RepositoryContentFactory;
/**
* DuplicateArtifactReportTest
@@ -42,14 +45,18 @@
{
private static final String TESTABLE_REPO = "testable";
- private static final String HASH3 =
"f3f653289f3217c65324830ab3415bc92feddefa";
+ private static final String HASH3 =
"94ca33031e37aa3f3b67e5b921c729f08a6bba75";
- private static final String HASH2 =
"a49810ad3eba8651677ab57cd40a0f76fdef9538";
+ private static final String HASH2 =
"43f7aa390f1a0265fc2de7010133951c0718a67e";
- private static final String HASH1 =
"232f01b24b1617c46a3d4b0ab3415bc9237dcdec";
+ private static final String HASH1 =
"8107759ababcbfa34bcb02bc4309caf6354982ab";
private ArtifactDAO artifactDao;
+ private ManagedRepositoryConfiguration repoConfig;
+
+ private ManagedRepositoryContent content;
+
@Override
protected void setUp()
throws Exception
@@ -60,19 +67,41 @@
ArchivaConfiguration config = (ArchivaConfiguration) lookup(
ArchivaConfiguration.class.getName(), "default" );
- ManagedRepositoryConfiguration repoConfig = new
ManagedRepositoryConfiguration();
+ repoConfig = new ManagedRepositoryConfiguration();
repoConfig.setId( TESTABLE_REPO );
repoConfig.setLayout( "default" );
File testRepoDir = new File( getBasedir(), "target/test-repository" );
FileUtils.forceMkdir( testRepoDir );
repoConfig.setLocation( testRepoDir.getAbsolutePath() );
config.getConfiguration().addManagedRepository( repoConfig );
+
+ RepositoryContentFactory factory = (RepositoryContentFactory) lookup(
RepositoryContentFactory.class );
+ content = factory.getManagedRepositoryContent( TESTABLE_REPO );
+
+ createArtifactFile( testRepoDir, "test-one", "1.0", "value1" );
+ createArtifactFile( testRepoDir, "test-one", "1.1", "value1" );
+ createArtifactFile( testRepoDir, "test-one", "1.2", "value1" );
+ createArtifactFile( testRepoDir, "test-two", "1.0", "value1" );
+ createArtifactFile( testRepoDir, "test-two", "2.0", "value3" );
+ createArtifactFile( testRepoDir, "test-two", "2.1", "value2" );
+ createArtifactFile( testRepoDir, "test-two", "3.0", "value2" );
+ }
+
+ private void createArtifactFile( File testRepoDir, String artifactId,
String version, String value )
+ throws IOException
+ {
+ File file = new File( testRepoDir,
+ "org/apache/maven/archiva/test/" + artifactId +
"/" + version + "/" + artifactId + "-" +
+ version + ".jar" );
+ file.getParentFile().mkdirs();
+ FileUtils.writeStringToFile( file, value );
}
public ArchivaArtifact createArtifact( String artifactId, String version )
{
ArchivaArtifact artifact =
- artifactDao.createArtifact( "org.apache.maven.archiva.test",
artifactId, version, "", "jar", TESTABLE_REPO );
+ artifactDao.createArtifact( "org.apache.maven.archiva.test",
artifactId, version, "", "jar",
+ TESTABLE_REPO );
artifact.getModel().setLastModified( new Date() );
return artifact;
}
@@ -142,14 +171,15 @@
throws Exception
{
List<ArchivaArtifact> artifacts = dao.getArtifactDAO().queryArtifacts(
null );
- ArchivaArtifactConsumer consumer =
- (ArchivaArtifactConsumer) lookup(
ArchivaArtifactConsumer.class.getName(), "duplicate-artifacts" );
- consumer.beginScan();
+ KnownRepositoryContentConsumer consumer =
+ (KnownRepositoryContentConsumer) lookup(
KnownRepositoryContentConsumer.class.getName(),
+ "duplicate-artifacts" );
+ consumer.beginScan( repoConfig, new Date() );
try
{
for ( ArchivaArtifact artifact : artifacts )
{
- consumer.processArchivaArtifact( artifact );
+ consumer.processFile( content.toPath( artifact ) );
}
}
finally