You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@archiva.apache.org by br...@apache.org on 2006/09/08 07:16:54 UTC

svn commit: r441377 [1/3] - in /maven/archiva/trunk: archiva-converter/src/main/java/org/apache/maven/archiva/converter/ archiva-converter/src/test/java/org/apache/maven/archiva/converter/ archiva-core/src/main/java/org/apache/maven/archiva/ archiva-co...

Author: brett
Date: Thu Sep  7 22:16:51 2006
New Revision: 441377

URL: http://svn.apache.org/viewvc?view=rev&rev=441377
Log:
[MRM-161] introduce a model for storing reports in the repository, and wire them up on the back of the indexer.

Added:
    maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/DefaultReportingStore.java   (with props)
    maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/ReportingDatabase.java   (contents, props changed)
      - copied, changed from r441308, maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/ArtifactReporter.java
    maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/ReportingStore.java   (with props)
    maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/ReportingStoreException.java   (with props)
    maven/archiva/trunk/archiva-reports-standard/src/main/mdo/
    maven/archiva/trunk/archiva-reports-standard/src/main/mdo/reporting.mdo
Removed:
    maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/ArtifactReporter.java
    maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/ArtifactResult.java
    maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/ChecksumMetadataReporter.java
    maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/DefaultArtifactReporter.java
    maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/ReportProcessorException.java
    maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/RepositoryMetadataResult.java
    maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/Result.java
Modified:
    maven/archiva/trunk/archiva-converter/src/main/java/org/apache/maven/archiva/converter/DefaultRepositoryConverter.java
    maven/archiva/trunk/archiva-converter/src/main/java/org/apache/maven/archiva/converter/RepositoryConverter.java
    maven/archiva/trunk/archiva-converter/src/test/java/org/apache/maven/archiva/converter/RepositoryConverterTest.java
    maven/archiva/trunk/archiva-core/src/main/java/org/apache/maven/archiva/DefaultRepositoryManager.java
    maven/archiva/trunk/archiva-core/src/main/java/org/apache/maven/archiva/scheduler/task/IndexerTask.java
    maven/archiva/trunk/archiva-discoverer/src/main/java/org/apache/maven/archiva/discoverer/AbstractArtifactDiscoverer.java
    maven/archiva/trunk/archiva-discoverer/src/main/java/org/apache/maven/archiva/discoverer/AbstractDiscoverer.java
    maven/archiva/trunk/archiva-discoverer/src/main/java/org/apache/maven/archiva/discoverer/DefaultMetadataDiscoverer.java
    maven/archiva/trunk/archiva-discoverer/src/main/java/org/apache/maven/archiva/discoverer/MetadataDiscoverer.java
    maven/archiva/trunk/archiva-discoverer/src/test/java/org/apache/maven/archiva/discoverer/DefaultMetadataDiscovererTest.java
    maven/archiva/trunk/archiva-indexer/src/main/java/org/apache/maven/archiva/indexer/lucene/LuceneRepositoryArtifactIndex.java
    maven/archiva/trunk/archiva-indexer/src/main/java/org/apache/maven/archiva/indexer/lucene/LuceneRepositoryArtifactIndexFactory.java
    maven/archiva/trunk/archiva-reports-standard/pom.xml
    maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/ArtifactReportProcessor.java
    maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/BadMetadataReportProcessor.java
    maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/ChecksumArtifactReportProcessor.java
    maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/ChecksumMetadataReportProcessor.java
    maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/DependencyArtifactReportProcessor.java
    maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/DuplicateArtifactFileReportProcessor.java
    maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/InvalidPomArtifactReportProcessor.java
    maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/LocationArtifactReportProcessor.java
    maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/MetadataReportProcessor.java
    maven/archiva/trunk/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/AbstractRepositoryReportsTestCase.java
    maven/archiva/trunk/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/ArtifactReporterTest.java
    maven/archiva/trunk/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/BadMetadataReportProcessorTest.java
    maven/archiva/trunk/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/ChecksumArtifactReporterTest.java
    maven/archiva/trunk/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/DefaultArtifactReporterTest.java
    maven/archiva/trunk/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/DependencyArtifactReportProcessorTest.java
    maven/archiva/trunk/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/DuplicateArtifactFileReportProcessorTest.java
    maven/archiva/trunk/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/InvalidPomArtifactReportProcessorTest.java
    maven/archiva/trunk/archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/LocationArtifactReportProcessorTest.java
    maven/archiva/trunk/archiva-reports-standard/src/test/repository/org/apache/maven/maven-archiver/2.0/maven-archiver-2.0.pom
    maven/archiva/trunk/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/configure.jsp
    maven/archiva/trunk/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/index.jsp

Modified: maven/archiva/trunk/archiva-converter/src/main/java/org/apache/maven/archiva/converter/DefaultRepositoryConverter.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-converter/src/main/java/org/apache/maven/archiva/converter/DefaultRepositoryConverter.java?view=diff&rev=441377&r1=441376&r2=441377
==============================================================================
--- maven/archiva/trunk/archiva-converter/src/main/java/org/apache/maven/archiva/converter/DefaultRepositoryConverter.java (original)
+++ maven/archiva/trunk/archiva-converter/src/main/java/org/apache/maven/archiva/converter/DefaultRepositoryConverter.java Thu Sep  7 22:16:51 2006
@@ -19,7 +19,7 @@
 import org.apache.maven.archiva.converter.transaction.FileTransaction;
 import org.apache.maven.archiva.digest.Digester;
 import org.apache.maven.archiva.digest.DigesterException;
-import org.apache.maven.archiva.reporting.ArtifactReporter;
+import org.apache.maven.archiva.reporting.ReportingDatabase;
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.factory.ArtifactFactory;
 import org.apache.maven.artifact.repository.ArtifactRepository;
@@ -105,7 +105,7 @@
      */
     private I18N i18n;
 
-    public void convert( Artifact artifact, ArtifactRepository targetRepository, ArtifactReporter reporter )
+    public void convert( Artifact artifact, ArtifactRepository targetRepository, ReportingDatabase reporter )
         throws RepositoryConversionException
     {
         if ( artifact.getRepository().getUrl().equals( targetRepository.getUrl() ) )
@@ -150,7 +150,6 @@
                     {
                         transaction.commit();
                     }
-                    reporter.addSuccess( artifact );
                 }
             }
         }
@@ -239,7 +238,7 @@
         return metadata;
     }
 
-    private boolean validateMetadata( Artifact artifact, ArtifactReporter reporter )
+    private boolean validateMetadata( Artifact artifact, ReportingDatabase reporter )
         throws RepositoryConversionException
     {
         ArtifactRepository repository = artifact.getRepository();
@@ -267,7 +266,7 @@
     }
 
     private boolean validateMetadata( Metadata metadata, RepositoryMetadata repositoryMetadata, Artifact artifact,
-                                      ArtifactReporter reporter )
+                                      ReportingDatabase reporter )
     {
         String groupIdKey;
         String artifactIdKey = null;
@@ -368,7 +367,7 @@
         return result;
     }
 
-    private boolean copyPom( Artifact artifact, ArtifactRepository targetRepository, ArtifactReporter reporter,
+    private boolean copyPom( Artifact artifact, ArtifactRepository targetRepository, ReportingDatabase reporter,
                              FileTransaction transaction )
         throws RepositoryConversionException
     {
@@ -572,7 +571,7 @@
         return i18n.getString( getClass().getName(), Locale.getDefault(), key );
     }
 
-    private boolean testChecksums( Artifact artifact, File file, ArtifactReporter reporter )
+    private boolean testChecksums( Artifact artifact, File file, ReportingDatabase reporter )
         throws IOException
     {
 
@@ -583,7 +582,7 @@
         return result;
     }
 
-    private boolean verifyChecksum( File file, String fileName, Digester digester, ArtifactReporter reporter,
+    private boolean verifyChecksum( File file, String fileName, Digester digester, ReportingDatabase reporter,
                                     Artifact artifact, String key )
         throws IOException
     {
@@ -606,7 +605,7 @@
         return result;
     }
 
-    private boolean copyArtifact( Artifact artifact, ArtifactRepository targetRepository, ArtifactReporter reporter,
+    private boolean copyArtifact( Artifact artifact, ArtifactRepository targetRepository, ReportingDatabase reporter,
                                   FileTransaction transaction )
         throws RepositoryConversionException
     {
@@ -649,7 +648,7 @@
         return result;
     }
 
-    public void convert( List artifacts, ArtifactRepository targetRepository, ArtifactReporter reporter )
+    public void convert( List artifacts, ArtifactRepository targetRepository, ReportingDatabase reporter )
         throws RepositoryConversionException
     {
         for ( Iterator i = artifacts.iterator(); i.hasNext(); )

Modified: maven/archiva/trunk/archiva-converter/src/main/java/org/apache/maven/archiva/converter/RepositoryConverter.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-converter/src/main/java/org/apache/maven/archiva/converter/RepositoryConverter.java?view=diff&rev=441377&r1=441376&r2=441377
==============================================================================
--- maven/archiva/trunk/archiva-converter/src/main/java/org/apache/maven/archiva/converter/RepositoryConverter.java (original)
+++ maven/archiva/trunk/archiva-converter/src/main/java/org/apache/maven/archiva/converter/RepositoryConverter.java Thu Sep  7 22:16:51 2006
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-import org.apache.maven.archiva.reporting.ArtifactReporter;
+import org.apache.maven.archiva.reporting.ReportingDatabase;
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.repository.ArtifactRepository;
 
@@ -38,7 +38,7 @@
      * @param targetRepository the target repository
      * @param reporter         reporter to track the results of the conversion
      */
-    void convert( Artifact artifact, ArtifactRepository targetRepository, ArtifactReporter reporter )
+    void convert( Artifact artifact, ArtifactRepository targetRepository, ReportingDatabase reporter )
         throws RepositoryConversionException;
 
     /**
@@ -48,6 +48,6 @@
      * @param targetRepository the target repository
      * @param reporter         reporter to track the results of the conversions
      */
-    void convert( List artifacts, ArtifactRepository targetRepository, ArtifactReporter reporter )
+    void convert( List artifacts, ArtifactRepository targetRepository, ReportingDatabase reporter )
         throws RepositoryConversionException;
 }

Modified: maven/archiva/trunk/archiva-converter/src/test/java/org/apache/maven/archiva/converter/RepositoryConverterTest.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-converter/src/test/java/org/apache/maven/archiva/converter/RepositoryConverterTest.java?view=diff&rev=441377&r1=441376&r2=441377
==============================================================================
--- maven/archiva/trunk/archiva-converter/src/test/java/org/apache/maven/archiva/converter/RepositoryConverterTest.java (original)
+++ maven/archiva/trunk/archiva-converter/src/test/java/org/apache/maven/archiva/converter/RepositoryConverterTest.java Thu Sep  7 22:16:51 2006
@@ -16,9 +16,9 @@
  * limitations under the License.
  */
 
-import org.apache.maven.archiva.reporting.ArtifactReporter;
-import org.apache.maven.archiva.reporting.ArtifactResult;
-import org.apache.maven.archiva.reporting.DefaultArtifactReporter;
+import org.apache.maven.archiva.reporting.ReportingDatabase;
+import org.apache.maven.archiva.reporting.model.ArtifactResults;
+import org.apache.maven.archiva.reporting.model.Result;
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.factory.ArtifactFactory;
 import org.apache.maven.artifact.metadata.ArtifactMetadata;
@@ -61,7 +61,7 @@
 
     private ArtifactFactory artifactFactory;
 
-    private ArtifactReporter reporter;
+    private ReportingDatabase reporter;
 
     private static final int SLEEP_MILLIS = 100;
 
@@ -94,7 +94,7 @@
 
         i18n = (I18N) lookup( I18N.ROLE );
 
-        reporter = new DefaultArtifactReporter();
+        reporter = new ReportingDatabase();
     }
 
     private void copyDirectoryStructure( File sourceDirectory, File destinationDirectory )
@@ -284,7 +284,6 @@
         repositoryConverter.convert( artifact, targetRepository, reporter );
         assertEquals( "check no errors", 0, reporter.getNumFailures() );
         assertEquals( "check number of warnings", 2, reporter.getNumWarnings() );
-        assertEquals( "check success", 1, reporter.getNumSuccesses() );
 
         File artifactFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( artifact ) );
         assertTrue( "Check artifact created", artifactFile.exists() );
@@ -455,7 +454,6 @@
         repositoryConverter.convert( artifact, targetRepository, reporter );
         assertEquals( "check no errors", 0, reporter.getNumFailures() );
         assertEquals( "check no warnings", 1, reporter.getNumWarnings() );
-        assertEquals( "check success", 1, reporter.getNumSuccesses() );
         assertEquals( "check warning message", getI18nString( "warning.missing.pom" ), getWarning().getReason() );
 
         File artifactFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( artifact ) );
@@ -735,7 +733,6 @@
         repositoryConverter.convert( artifacts, targetRepository, reporter );
         assertEquals( "check no errors", 0, reporter.getNumFailures() );
         assertEquals( "check no warnings", 0, reporter.getNumWarnings() );
-        assertEquals( "check successes", 3, reporter.getNumSuccesses() );
 
         for ( Iterator i = artifacts.iterator(); i.hasNext(); )
         {
@@ -908,14 +905,12 @@
     {
         assertEquals( "check no errors", 0, reporter.getNumFailures() );
         assertEquals( "check no warnings", 0, reporter.getNumWarnings() );
-        assertEquals( "check success", 1, reporter.getNumSuccesses() );
     }
 
     private void checkFailure()
     {
         assertEquals( "check num errors", 1, reporter.getNumFailures() );
         assertEquals( "check no warnings", 0, reporter.getNumWarnings() );
-        assertEquals( "check no success", 0, reporter.getNumSuccesses() );
     }
 
     private String getI18nString( String key )
@@ -923,14 +918,16 @@
         return i18n.getString( repositoryConverter.getClass().getName(), Locale.getDefault(), key );
     }
 
-    private ArtifactResult getFailure()
+    private Result getFailure()
     {
-        return (ArtifactResult) reporter.getArtifactFailureIterator().next();
+        ArtifactResults artifact = (ArtifactResults) reporter.getArtifactIterator().next();
+        return (Result) artifact.getFailures().get( 0 );
     }
 
-    private ArtifactResult getWarning()
+    private Result getWarning()
     {
-        return (ArtifactResult) reporter.getArtifactWarningIterator().next();
+        ArtifactResults artifact = (ArtifactResults) reporter.getArtifactIterator().next();
+        return (Result) artifact.getWarnings().get( 0 );
     }
 
     private void createModernSourceRepository()

Modified: maven/archiva/trunk/archiva-core/src/main/java/org/apache/maven/archiva/DefaultRepositoryManager.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-core/src/main/java/org/apache/maven/archiva/DefaultRepositoryManager.java?view=diff&rev=441377&r1=441376&r2=441377
==============================================================================
--- maven/archiva/trunk/archiva-core/src/main/java/org/apache/maven/archiva/DefaultRepositoryManager.java (original)
+++ maven/archiva/trunk/archiva-core/src/main/java/org/apache/maven/archiva/DefaultRepositoryManager.java Thu Sep  7 22:16:51 2006
@@ -6,7 +6,9 @@
 import org.apache.maven.archiva.discoverer.DiscovererException;
 import org.apache.maven.archiva.discoverer.filter.AcceptAllArtifactFilter;
 import org.apache.maven.archiva.discoverer.filter.SnapshotArtifactFilter;
-import org.apache.maven.archiva.reporting.ArtifactReporter;
+import org.apache.maven.archiva.reporting.ReportingDatabase;
+import org.apache.maven.archiva.reporting.ReportingStore;
+import org.apache.maven.archiva.reporting.ReportingStoreException;
 import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.artifact.repository.ArtifactRepositoryFactory;
 import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
@@ -51,7 +53,7 @@
     /**
      * @plexus.requirement
      */
-    private ArtifactReporter reporter;
+    private ReportingStore reportingStore;
 
     public void convertLegacyRepository( File legacyRepositoryDirectory, File repositoryDirectory,
                                          boolean includeSnapshots )
@@ -80,6 +82,18 @@
             includeSnapshots ? new AcceptAllArtifactFilter() : (ArtifactFilter) new SnapshotArtifactFilter();
         List legacyArtifacts = artifactDiscoverer.discoverArtifacts( legacyRepository, null, filter );
 
-        repositoryConverter.convert( legacyArtifacts, repository, reporter );
+        ReportingDatabase reporter;
+        try
+        {
+            reporter = reportingStore.getReportsFromStore( repository );
+
+            repositoryConverter.convert( legacyArtifacts, repository, reporter );
+
+            reportingStore.storeReports( reporter, repository );
+        }
+        catch ( ReportingStoreException e )
+        {
+            throw new RepositoryConversionException( "Error convering legacy repository.", e );
+        }
     }
 }

Modified: maven/archiva/trunk/archiva-core/src/main/java/org/apache/maven/archiva/scheduler/task/IndexerTask.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-core/src/main/java/org/apache/maven/archiva/scheduler/task/IndexerTask.java?view=diff&rev=441377&r1=441376&r2=441377
==============================================================================
--- maven/archiva/trunk/archiva-core/src/main/java/org/apache/maven/archiva/scheduler/task/IndexerTask.java (original)
+++ maven/archiva/trunk/archiva-core/src/main/java/org/apache/maven/archiva/scheduler/task/IndexerTask.java Thu Sep  7 22:16:51 2006
@@ -23,15 +23,26 @@
 import org.apache.maven.archiva.configuration.RepositoryConfiguration;
 import org.apache.maven.archiva.discoverer.ArtifactDiscoverer;
 import org.apache.maven.archiva.discoverer.DiscovererException;
+import org.apache.maven.archiva.discoverer.MetadataDiscoverer;
 import org.apache.maven.archiva.discoverer.filter.SnapshotArtifactFilter;
 import org.apache.maven.archiva.indexer.RepositoryArtifactIndex;
 import org.apache.maven.archiva.indexer.RepositoryArtifactIndexFactory;
 import org.apache.maven.archiva.indexer.RepositoryIndexException;
 import org.apache.maven.archiva.indexer.record.IndexRecordExistsArtifactFilter;
 import org.apache.maven.archiva.indexer.record.RepositoryIndexRecordFactory;
+import org.apache.maven.archiva.reporting.ArtifactReportProcessor;
+import org.apache.maven.archiva.reporting.ReportingDatabase;
+import org.apache.maven.archiva.reporting.ReportingStore;
+import org.apache.maven.archiva.reporting.ReportingStoreException;
 import org.apache.maven.archiva.scheduler.TaskExecutionException;
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.factory.ArtifactFactory;
 import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.artifact.resolver.filter.AndArtifactFilter;
+import org.apache.maven.model.Model;
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.project.MavenProjectBuilder;
+import org.apache.maven.project.ProjectBuildingException;
 import org.codehaus.plexus.logging.AbstractLogEnabled;
 
 import java.io.File;
@@ -75,10 +86,37 @@
     private Map artifactDiscoverers;
 
     /**
+     * @plexus.requirement role="org.apache.maven.archiva.reporting.ArtifactReportProcessor"
+     */
+    private List artifactReports;
+
+    /**
+     * @plexus.requirement role="org.apache.maven.archiva.discoverer.MetadataDiscoverer"
+     */
+    private Map metadataDiscoverers;
+
+    /**
+     * @plexus.requirement role="org.apache.maven.archiva.reporting.MetadataReportProcessor"
+     */
+    private List metadataReports;
+
+    /**
      * @plexus.requirement role-hint="standard"
      */
     private RepositoryIndexRecordFactory recordFactory;
 
+    /**
+     * @plexus.requirement
+     */
+    private ArtifactFactory artifactFactory;
+
+    private static final int ARTIFACT_BUFFER_SIZE = 1000;
+
+    /**
+     * @plexus.requirement
+     */
+    private ReportingStore reportingStore;
+
     public void execute()
         throws TaskExecutionException
     {
@@ -136,6 +174,11 @@
 
                     ArtifactRepository repository = repoFactory.createRepository( repositoryConfiguration );
 
+                    getLogger().debug(
+                        "Reading previous report database from repository " + repositoryConfiguration.getName() );
+                    ReportingDatabase reporter = reportingStore.getReportsFromStore( repository );
+
+                    // Discovery process
                     String layoutProperty = repositoryConfiguration.getLayout();
                     ArtifactDiscoverer discoverer = (ArtifactDiscoverer) artifactDiscoverers.get( layoutProperty );
                     AndArtifactFilter filter = new AndArtifactFilter();
@@ -151,13 +194,37 @@
 
                     getLogger().info( "Searching repository " + repositoryConfiguration.getName() );
                     List artifacts = discoverer.discoverArtifacts( repository, blacklistedPatterns, filter );
+
                     if ( !artifacts.isEmpty() )
                     {
-                        // TODO! reporting
+                        getLogger().info( "Discovered " + artifacts.size() + " unindexed artifacts" );
 
-                        getLogger().info( "Indexing " + artifacts.size() + " new artifacts" );
-                        index.indexArtifacts( artifacts, recordFactory );
+                        // Work through these in batches, then flush the project cache.
+                        for ( int j = 0; j < artifacts.size(); j += ARTIFACT_BUFFER_SIZE )
+                        {
+                            int end = j + ARTIFACT_BUFFER_SIZE;
+                            List currentArtifacts =
+                                artifacts.subList( j, end > artifacts.size() ? artifacts.size() : end );
+
+                            // run the reports
+                            runArtifactReports( currentArtifacts, reporter );
+
+                            index.indexArtifacts( currentArtifacts, recordFactory );
+                        }
+
+                        // MNG-142 - the project builder retains a lot of objects in its inflexible cache. This is a hack
+                        // around that. TODO: remove when it is configurable
+                        flushProjectBuilderCacheHack();
                     }
+
+                    // TODO! use reporting manager as a filter
+                    MetadataDiscoverer metadataDiscoverer =
+                        (MetadataDiscoverer) metadataDiscoverers.get( layoutProperty );
+                    metadataDiscoverer.discoverMetadata( repository, blacklistedPatterns );
+
+                    //TODO! metadata reporting
+
+                    reportingStore.storeReports( reporter, repository );
                 }
             }
         }
@@ -169,11 +236,53 @@
         {
             throw new TaskExecutionException( e.getMessage(), e );
         }
+        catch ( ReportingStoreException e )
+        {
+            throw new TaskExecutionException( e.getMessage(), e );
+        }
 
         time = System.currentTimeMillis() - time;
         getLogger().info( "Finished repository indexing process in " + time + "ms" );
     }
 
+    private void runArtifactReports( List artifacts, ReportingDatabase reporter )
+    {
+        for ( Iterator i = artifacts.iterator(); i.hasNext(); )
+        {
+            Artifact artifact = (Artifact) i.next();
+
+            ArtifactRepository repository = artifact.getRepository();
+
+            Model model = null;
+            try
+            {
+                Artifact pomArtifact = artifactFactory.createProjectArtifact( artifact.getGroupId(),
+                                                                              artifact.getArtifactId(),
+                                                                              artifact.getVersion() );
+                MavenProject project =
+                    projectBuilder.buildFromRepository( pomArtifact, Collections.EMPTY_LIST, repository );
+
+                model = project.getModel();
+            }
+            catch ( ProjectBuildingException e )
+            {
+                reporter.addWarning( artifact, "Error reading project model: " + e );
+            }
+            runArtifactReports( artifact, model, reporter );
+        }
+    }
+
+    private void runArtifactReports( Artifact artifact, Model model, ReportingDatabase reporter )
+    {
+        // TODO: should the report set be limitable by configuration?
+        for ( Iterator i = artifactReports.iterator(); i.hasNext(); )
+        {
+            ArtifactReportProcessor report = (ArtifactReportProcessor) i.next();
+
+            report.processArtifact( artifact, model, reporter );
+        }
+    }
+
     public void executeNowIfNeeded()
         throws TaskExecutionException
     {
@@ -202,4 +311,38 @@
             throw new TaskExecutionException( e.getMessage(), e );
         }
     }
+
+    /**
+     * @todo remove when no longer needed (MNG-142)
+     * @plexus.requirement
+     */
+    private MavenProjectBuilder projectBuilder;
+
+    private void flushProjectBuilderCacheHack()
+    {
+        try
+        {
+            if ( projectBuilder != null )
+            {
+                java.lang.reflect.Field f = projectBuilder.getClass().getDeclaredField( "rawProjectCache" );
+                f.setAccessible( true );
+                Map cache = (Map) f.get( projectBuilder );
+                cache.clear();
+
+                f = projectBuilder.getClass().getDeclaredField( "processedProjectCache" );
+                f.setAccessible( true );
+                cache = (Map) f.get( projectBuilder );
+                cache.clear();
+            }
+        }
+        catch ( NoSuchFieldException e )
+        {
+            throw new RuntimeException( e );
+        }
+        catch ( IllegalAccessException e )
+        {
+            throw new RuntimeException( e );
+        }
+    }
+
 }

Modified: maven/archiva/trunk/archiva-discoverer/src/main/java/org/apache/maven/archiva/discoverer/AbstractArtifactDiscoverer.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-discoverer/src/main/java/org/apache/maven/archiva/discoverer/AbstractArtifactDiscoverer.java?view=diff&rev=441377&r1=441376&r2=441377
==============================================================================
--- maven/archiva/trunk/archiva-discoverer/src/main/java/org/apache/maven/archiva/discoverer/AbstractArtifactDiscoverer.java (original)
+++ maven/archiva/trunk/archiva-discoverer/src/main/java/org/apache/maven/archiva/discoverer/AbstractArtifactDiscoverer.java Thu Sep  7 22:16:51 2006
@@ -73,7 +73,10 @@
                 {
                     artifacts.add( artifact );
                 }
-                // TODO: else add to excluded? [!]
+                else
+                {
+                    addExcludedPath( path, "Omitted by filter" );
+                }
             }
             catch ( DiscovererException e )
             {

Modified: maven/archiva/trunk/archiva-discoverer/src/main/java/org/apache/maven/archiva/discoverer/AbstractDiscoverer.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-discoverer/src/main/java/org/apache/maven/archiva/discoverer/AbstractDiscoverer.java?view=diff&rev=441377&r1=441376&r2=441377
==============================================================================
--- maven/archiva/trunk/archiva-discoverer/src/main/java/org/apache/maven/archiva/discoverer/AbstractDiscoverer.java (original)
+++ maven/archiva/trunk/archiva-discoverer/src/main/java/org/apache/maven/archiva/discoverer/AbstractDiscoverer.java Thu Sep  7 22:16:51 2006
@@ -67,6 +67,17 @@
     }
 
     /**
+     * Add a path to the list of files that were excluded.
+     *
+     * @param path   the path to add
+     * @param reason the reason why the path is excluded
+     */
+    protected void addExcludedPath( String path, String reason )
+    {
+        excludedPaths.add( new DiscovererPath( path, reason ) );
+    }
+
+    /**
      * Returns an iterator for the list if DiscovererPaths that were found to not represent a searched object
      *
      * @return Iterator for the DiscovererPath List

Modified: maven/archiva/trunk/archiva-discoverer/src/main/java/org/apache/maven/archiva/discoverer/DefaultMetadataDiscoverer.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-discoverer/src/main/java/org/apache/maven/archiva/discoverer/DefaultMetadataDiscoverer.java?view=diff&rev=441377&r1=441376&r2=441377
==============================================================================
--- maven/archiva/trunk/archiva-discoverer/src/main/java/org/apache/maven/archiva/discoverer/DefaultMetadataDiscoverer.java (original)
+++ maven/archiva/trunk/archiva-discoverer/src/main/java/org/apache/maven/archiva/discoverer/DefaultMetadataDiscoverer.java Thu Sep  7 22:16:51 2006
@@ -58,7 +58,7 @@
      */
     private static final String[] STANDARD_DISCOVERY_INCLUDES = {"**/maven-metadata.xml"};
 
-    public List discoverMetadata( ArtifactRepository repository, String operation, List blacklistedPatterns )
+    public List discoverMetadata( ArtifactRepository repository, List blacklistedPatterns )
         throws DiscovererException
     {
         if ( !"file".equals( repository.getProtocol() ) )

Modified: maven/archiva/trunk/archiva-discoverer/src/main/java/org/apache/maven/archiva/discoverer/MetadataDiscoverer.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-discoverer/src/main/java/org/apache/maven/archiva/discoverer/MetadataDiscoverer.java?view=diff&rev=441377&r1=441376&r2=441377
==============================================================================
--- maven/archiva/trunk/archiva-discoverer/src/main/java/org/apache/maven/archiva/discoverer/MetadataDiscoverer.java (original)
+++ maven/archiva/trunk/archiva-discoverer/src/main/java/org/apache/maven/archiva/discoverer/MetadataDiscoverer.java Thu Sep  7 22:16:51 2006
@@ -32,11 +32,10 @@
      * Search for metadata files in the repository.
      *
      * @param repository          The repository.
-     * @param operation           the operation being performed (used for timestamp comparison)
      * @param blacklistedPatterns Patterns that are to be excluded from the discovery process.
      * @return the list of artifacts found
      * @throws DiscovererException if there is a problem during the discovery process
      */
-    List discoverMetadata( ArtifactRepository repository, String operation, List blacklistedPatterns )
+    List discoverMetadata( ArtifactRepository repository, List blacklistedPatterns )
         throws DiscovererException;
 }

Modified: maven/archiva/trunk/archiva-discoverer/src/test/java/org/apache/maven/archiva/discoverer/DefaultMetadataDiscovererTest.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-discoverer/src/test/java/org/apache/maven/archiva/discoverer/DefaultMetadataDiscovererTest.java?view=diff&rev=441377&r1=441376&r2=441377
==============================================================================
--- maven/archiva/trunk/archiva-discoverer/src/test/java/org/apache/maven/archiva/discoverer/DefaultMetadataDiscovererTest.java (original)
+++ maven/archiva/trunk/archiva-discoverer/src/test/java/org/apache/maven/archiva/discoverer/DefaultMetadataDiscovererTest.java Thu Sep  7 22:16:51 2006
@@ -91,7 +91,7 @@
     public void testKickoutWrongDirectory()
         throws DiscovererException
     {
-        discoverer.discoverMetadata( repository, TEST_OPERATION, null );
+        discoverer.discoverMetadata( repository, null );
         Iterator iter = discoverer.getKickedOutPathsIterator();
         boolean found = false;
         while ( iter.hasNext() && !found )
@@ -116,7 +116,7 @@
     public void testKickoutBlankMetadata()
         throws DiscovererException
     {
-        discoverer.discoverMetadata( repository, TEST_OPERATION, null );
+        discoverer.discoverMetadata( repository, null );
         Iterator iter = discoverer.getKickedOutPathsIterator();
         boolean found = false;
         while ( iter.hasNext() && !found )
@@ -148,7 +148,7 @@
     public void testDiscoverMetadata()
         throws DiscovererException
     {
-        List metadataPaths = discoverer.discoverMetadata( repository, TEST_OPERATION, null );
+        List metadataPaths = discoverer.discoverMetadata( repository, null );
         assertNotNull( "Check metadata not null", metadataPaths );
 
         RepositoryMetadata metadata =

Modified: maven/archiva/trunk/archiva-indexer/src/main/java/org/apache/maven/archiva/indexer/lucene/LuceneRepositoryArtifactIndex.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-indexer/src/main/java/org/apache/maven/archiva/indexer/lucene/LuceneRepositoryArtifactIndex.java?view=diff&rev=441377&r1=441376&r2=441377
==============================================================================
--- maven/archiva/trunk/archiva-indexer/src/main/java/org/apache/maven/archiva/indexer/lucene/LuceneRepositoryArtifactIndex.java (original)
+++ maven/archiva/trunk/archiva-indexer/src/main/java/org/apache/maven/archiva/indexer/lucene/LuceneRepositoryArtifactIndex.java Thu Sep  7 22:16:51 2006
@@ -42,7 +42,6 @@
 import org.apache.maven.archiva.indexer.record.RepositoryIndexRecordFactory;
 import org.apache.maven.archiva.indexer.record.StandardIndexRecordFields;
 import org.apache.maven.artifact.Artifact;
-import org.apache.maven.project.MavenProjectBuilder;
 
 import java.io.File;
 import java.io.IOException;
@@ -53,7 +52,6 @@
 import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.List;
-import java.util.Map;
 import java.util.Set;
 
 /**
@@ -78,8 +76,6 @@
 
     private static Analyzer luceneAnalyzer = new LuceneAnalyzer();
 
-    private MavenProjectBuilder projectBuilder;
-
     private static long lastUpdatedTime = 0;
 
     public LuceneRepositoryArtifactIndex( File indexPath, LuceneIndexRecordConverter converter )
@@ -88,14 +84,6 @@
         this.converter = converter;
     }
 
-    public LuceneRepositoryArtifactIndex( File indexLocation, LuceneIndexRecordConverter converter,
-                                          MavenProjectBuilder projectBuilder )
-    {
-        this.indexLocation = indexLocation;
-        this.converter = converter;
-        this.projectBuilder = projectBuilder;
-    }
-
     public void indexRecords( Collection records )
         throws RepositoryIndexException
     {
@@ -330,8 +318,7 @@
         {
             indexModifier = new IndexModifier( indexLocation, getAnalyzer(), !exists() );
 
-            int count = 0;
-            for ( Iterator i = artifacts.iterator(); i.hasNext(); count++ )
+            for ( Iterator i = artifacts.iterator(); i.hasNext(); )
             {
                 Artifact artifact = (Artifact) i.next();
                 RepositoryIndexRecord record = factory.createRecord( artifact );
@@ -348,13 +335,6 @@
 
                     indexModifier.addDocument( document );
                 }
-
-                if ( count % 100 == 0 )
-                {
-                    // MNG-142 - the project builder retains a lot of objects in its inflexible cache. This is a hack
-                    // around that. TODO: remove when it is configurable
-                    flushProjectBuilderCacheHack();
-                }
             }
             indexModifier.optimize();
         }
@@ -433,33 +413,6 @@
             closeQuietly( searcher );
         }
         return new ArrayList( results );
-    }
-
-    private void flushProjectBuilderCacheHack()
-    {
-        try
-        {
-            if ( projectBuilder != null )
-            {
-                java.lang.reflect.Field f = projectBuilder.getClass().getDeclaredField( "rawProjectCache" );
-                f.setAccessible( true );
-                Map cache = (Map) f.get( projectBuilder );
-                cache.clear();
-
-                f = projectBuilder.getClass().getDeclaredField( "processedProjectCache" );
-                f.setAccessible( true );
-                cache = (Map) f.get( projectBuilder );
-                cache.clear();
-            }
-        }
-        catch ( NoSuchFieldException e )
-        {
-            throw new RuntimeException( e );
-        }
-        catch ( IllegalAccessException e )
-        {
-            throw new RuntimeException( e );
-        }
     }
 
     public boolean exists()

Modified: maven/archiva/trunk/archiva-indexer/src/main/java/org/apache/maven/archiva/indexer/lucene/LuceneRepositoryArtifactIndexFactory.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-indexer/src/main/java/org/apache/maven/archiva/indexer/lucene/LuceneRepositoryArtifactIndexFactory.java?view=diff&rev=441377&r1=441376&r2=441377
==============================================================================
--- maven/archiva/trunk/archiva-indexer/src/main/java/org/apache/maven/archiva/indexer/lucene/LuceneRepositoryArtifactIndexFactory.java (original)
+++ maven/archiva/trunk/archiva-indexer/src/main/java/org/apache/maven/archiva/indexer/lucene/LuceneRepositoryArtifactIndexFactory.java Thu Sep  7 22:16:51 2006
@@ -18,7 +18,6 @@
 
 import org.apache.maven.archiva.indexer.RepositoryArtifactIndex;
 import org.apache.maven.archiva.indexer.RepositoryArtifactIndexFactory;
-import org.apache.maven.project.MavenProjectBuilder;
 
 import java.io.File;
 
@@ -31,19 +30,13 @@
 public class LuceneRepositoryArtifactIndexFactory
     implements RepositoryArtifactIndexFactory
 {
-    /**
-     * @plexus.requirement
-     * @todo remove when MNG-142 is fixed
-     */
-    private MavenProjectBuilder projectBuilder;
-
     public RepositoryArtifactIndex createStandardIndex( File indexPath )
     {
-        return new LuceneRepositoryArtifactIndex( indexPath, new LuceneStandardIndexRecordConverter(), projectBuilder );
+        return new LuceneRepositoryArtifactIndex( indexPath, new LuceneStandardIndexRecordConverter() );
     }
 
     public RepositoryArtifactIndex createMinimalIndex( File indexPath )
     {
-        return new LuceneRepositoryArtifactIndex( indexPath, new LuceneMinimalIndexRecordConverter(), projectBuilder );
+        return new LuceneRepositoryArtifactIndex( indexPath, new LuceneMinimalIndexRecordConverter() );
     }
 }

Modified: maven/archiva/trunk/archiva-reports-standard/pom.xml
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-reports-standard/pom.xml?view=diff&rev=441377&r1=441376&r2=441377
==============================================================================
--- maven/archiva/trunk/archiva-reports-standard/pom.xml (original)
+++ maven/archiva/trunk/archiva-reports-standard/pom.xml Thu Sep  7 22:16:51 2006
@@ -66,4 +66,38 @@
       <artifactId>archiva-indexer</artifactId>
     </dependency>
   </dependencies>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.codehaus.modello</groupId>
+        <artifactId>modello-maven-plugin</artifactId>
+        <version>1.0-alpha-10</version>
+        <executions>
+          <execution>
+            <goals>
+              <goal>xpp3-writer</goal>
+              <goal>java</goal>
+              <goal>xpp3-reader</goal>
+            </goals>
+          </execution>
+        </executions>
+        <configuration>
+          <version>1.0.0</version>
+          <model>src/main/mdo/reporting.mdo</model>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>cobertura-maven-plugin</artifactId>
+        <configuration>
+          <instrumentation>
+            <!-- exclude generated -->
+            <excludes>
+              <exclude>org/apache/maven/archiva/reporting/model/**</exclude>
+            </excludes>
+          </instrumentation>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
 </project>

Modified: maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/ArtifactReportProcessor.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/ArtifactReportProcessor.java?view=diff&rev=441377&r1=441376&r2=441377
==============================================================================
--- maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/ArtifactReportProcessor.java (original)
+++ maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/ArtifactReportProcessor.java Thu Sep  7 22:16:51 2006
@@ -17,7 +17,6 @@
  */
 
 import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.model.Model;
 
 /**
@@ -28,7 +27,5 @@
 {
     String ROLE = ArtifactReportProcessor.class.getName();
 
-    void processArtifact( Model model, Artifact artifact, ArtifactReporter reporter, ArtifactRepository repository )
-        throws ReportProcessorException;
-
+    void processArtifact( Artifact artifact, Model model, ReportingDatabase reporter );
 }

Modified: maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/BadMetadataReportProcessor.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/BadMetadataReportProcessor.java?view=diff&rev=441377&r1=441376&r2=441377
==============================================================================
--- maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/BadMetadataReportProcessor.java (original)
+++ maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/BadMetadataReportProcessor.java Thu Sep  7 22:16:51 2006
@@ -61,23 +61,20 @@
      *
      * @param metadata   the metadata to be processed.
      * @param repository the repository where the metadata was encountered
-     * @param reporter   the ArtifactReporter to receive processing results
-     * @throws ReportProcessorException if an error was occurred while processing the metadata
+     * @param reporter   the ReportingDatabase to receive processing results
      */
-    public void processMetadata( RepositoryMetadata metadata, ArtifactRepository repository, ArtifactReporter reporter )
-        throws ReportProcessorException
+    public void processMetadata( RepositoryMetadata metadata, ArtifactRepository repository,
+                                 ReportingDatabase reporter )
     {
-        boolean hasFailures = false;
-
         if ( metadata.storedInGroupDirectory() )
         {
             try
             {
-                hasFailures = checkPluginMetadata( metadata, repository, reporter );
+                checkPluginMetadata( metadata, repository, reporter );
             }
             catch ( IOException e )
             {
-                throw new ReportProcessorException( "Error getting plugin artifact directories versions", e );
+                reporter.addWarning( metadata, "Error getting plugin artifact directories versions: " + e );
             }
         }
         else
@@ -86,38 +83,26 @@
             if ( lastUpdated == null || lastUpdated.length() == 0 )
             {
                 reporter.addFailure( metadata, "Missing lastUpdated element inside the metadata." );
-                hasFailures = true;
             }
 
             if ( metadata.storedInArtifactVersionDirectory() )
             {
-                hasFailures |= checkSnapshotMetadata( metadata, repository, reporter );
+                checkSnapshotMetadata( metadata, repository, reporter );
             }
             else
             {
-                if ( !checkMetadataVersions( metadata, repository, reporter ) )
-                {
-                    hasFailures = true;
-                }
+                checkMetadataVersions( metadata, repository, reporter );
 
                 try
                 {
-                    if ( checkRepositoryVersions( metadata, repository, reporter ) )
-                    {
-                        hasFailures = true;
-                    }
+                    checkRepositoryVersions( metadata, repository, reporter );
                 }
                 catch ( IOException e )
                 {
-                    throw new ReportProcessorException( "Error getting versions", e );
+                    reporter.addWarning( metadata, "Error getting plugin artifact directories versions: " + e );
                 }
             }
         }
-
-        if ( !hasFailures )
-        {
-            reporter.addSuccess( metadata );
-        }
     }
 
     /**
@@ -125,14 +110,12 @@
      *
      * @param metadata   the metadata to be processed.
      * @param repository the repository where the metadata was encountered
-     * @param reporter   the ArtifactReporter to receive processing results
+     * @param reporter   the ReportingDatabase to receive processing results
      */
-    private boolean checkPluginMetadata( RepositoryMetadata metadata, ArtifactRepository repository,
-                                         ArtifactReporter reporter )
+    private void checkPluginMetadata( RepositoryMetadata metadata, ArtifactRepository repository,
+                                      ReportingDatabase reporter )
         throws IOException
     {
-        boolean hasFailures = false;
-
         File metadataDir =
             new File( repository.getBasedir(), repository.pathOfRemoteRepositoryMetadata( metadata ) ).getParentFile();
         List pluginDirs = getArtifactIdFiles( metadataDir );
@@ -145,22 +128,20 @@
             String artifactId = plugin.getArtifactId();
             if ( artifactId == null || artifactId.length() == 0 )
             {
-                reporter.addFailure( metadata, "Missing or empty artifactId in group metadata." );
-                hasFailures = true;
+                reporter.addFailure( metadata,
+                                     "Missing or empty artifactId in group metadata for plugin " + plugin.getPrefix() );
             }
 
             String prefix = plugin.getPrefix();
             if ( prefix == null || prefix.length() == 0 )
             {
                 reporter.addFailure( metadata, "Missing or empty plugin prefix for artifactId " + artifactId + "." );
-                hasFailures = true;
             }
             else
             {
                 if ( prefixes.containsKey( prefix ) )
                 {
                     reporter.addFailure( metadata, "Duplicate plugin prefix found: " + prefix + "." );
-                    hasFailures = true;
                 }
                 else
                 {
@@ -174,7 +155,6 @@
                 if ( !pluginDirs.contains( pluginDir ) )
                 {
                     reporter.addFailure( metadata, "Metadata plugin " + artifactId + " not found in the repository" );
-                    hasFailures = true;
                 }
                 else
                 {
@@ -191,10 +171,7 @@
                 reporter.addFailure( metadata, "Plugin " + plugin.getName() + " is present in the repository but " +
                     "missing in the metadata." );
             }
-            hasFailures = true;
         }
-
-        return hasFailures;
     }
 
     /**
@@ -202,16 +179,14 @@
      *
      * @param metadata   the metadata to be processed.
      * @param repository the repository where the metadata was encountered
-     * @param reporter   the ArtifactReporter to receive processing results
+     * @param reporter   the ReportingDatabase to receive processing results
      */
-    private boolean checkSnapshotMetadata( RepositoryMetadata metadata, ArtifactRepository repository,
-                                           ArtifactReporter reporter )
+    private void checkSnapshotMetadata( RepositoryMetadata metadata, ArtifactRepository repository,
+                                        ReportingDatabase reporter )
     {
         RepositoryQueryLayer repositoryQueryLayer =
             repositoryQueryLayerFactory.createRepositoryQueryLayer( repository );
 
-        boolean hasFailures = false;
-
         Snapshot snapshot = metadata.getMetadata().getVersioning().getSnapshot();
 
         String version = StringUtils.replace( metadata.getBaseVersion(), Artifact.SNAPSHOT_VERSION,
@@ -223,10 +198,7 @@
         if ( !repositoryQueryLayer.containsArtifact( artifact ) )
         {
             reporter.addFailure( metadata, "Snapshot artifact " + version + " does not exist." );
-            hasFailures = true;
         }
-
-        return hasFailures;
     }
 
     /**
@@ -234,15 +206,14 @@
      *
      * @param metadata   the metadata to be processed.
      * @param repository the repository where the metadata was encountered
-     * @param reporter   the ArtifactReporter to receive processing results
+     * @param reporter   the ReportingDatabase to receive processing results
      */
-    private boolean checkMetadataVersions( RepositoryMetadata metadata, ArtifactRepository repository,
-                                           ArtifactReporter reporter )
+    private void checkMetadataVersions( RepositoryMetadata metadata, ArtifactRepository repository,
+                                        ReportingDatabase reporter )
     {
         RepositoryQueryLayer repositoryQueryLayer =
             repositoryQueryLayerFactory.createRepositoryQueryLayer( repository );
 
-        boolean hasFailures = false;
         Versioning versioning = metadata.getMetadata().getVersioning();
         for ( Iterator versions = versioning.getVersions().iterator(); versions.hasNext(); )
         {
@@ -255,10 +226,8 @@
             {
                 reporter.addFailure( metadata, "Artifact version " + version + " is present in metadata but " +
                     "missing in the repository." );
-                hasFailures = true;
             }
         }
-        return hasFailures;
     }
 
     /**
@@ -267,13 +236,12 @@
      *
      * @param metadata   the metadata to be processed.
      * @param repository the repository where the metadata was encountered
-     * @param reporter   the ArtifactReporter to receive processing results
+     * @param reporter   the ReportingDatabase to receive processing results
      */
-    private boolean checkRepositoryVersions( RepositoryMetadata metadata, ArtifactRepository repository,
-                                             ArtifactReporter reporter )
+    private void checkRepositoryVersions( RepositoryMetadata metadata, ArtifactRepository repository,
+                                          ReportingDatabase reporter )
         throws IOException
     {
-        boolean hasFailures = false;
         Versioning versioning = metadata.getMetadata().getVersioning();
         File versionsDir =
             new File( repository.getBasedir(), repository.pathOfRemoteRepositoryMetadata( metadata ) ).getParentFile();
@@ -286,10 +254,8 @@
             {
                 reporter.addFailure( metadata, "Artifact version " + version + " found in the repository but " +
                     "missing in the metadata." );
-                hasFailures = true;
             }
         }
-        return hasFailures;
     }
 
     /**
@@ -304,17 +270,20 @@
     {
         List artifactIdFiles = new ArrayList();
 
-        List fileArray = new ArrayList( Arrays.asList( groupIdDir.listFiles() ) );
-        for ( Iterator files = fileArray.iterator(); files.hasNext(); )
+        File[] files = groupIdDir.listFiles();
+        if ( files != null )
         {
-            File artifactDir = (File) files.next();
-
-            if ( artifactDir.isDirectory() )
+            for ( Iterator i = Arrays.asList( files ).iterator(); i.hasNext(); )
             {
-                List versions = FileUtils.getFileNames( artifactDir, "*/*.pom", null, false );
-                if ( versions.size() > 0 )
+                File artifactDir = (File) i.next();
+
+                if ( artifactDir.isDirectory() )
                 {
-                    artifactIdFiles.add( artifactDir );
+                    List versions = FileUtils.getFileNames( artifactDir, "*/*.pom", null, false );
+                    if ( versions.size() > 0 )
+                    {
+                        artifactIdFiles.add( artifactDir );
+                    }
                 }
             }
         }

Modified: maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/ChecksumArtifactReportProcessor.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/ChecksumArtifactReportProcessor.java?view=diff&rev=441377&r1=441376&r2=441377
==============================================================================
--- maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/ChecksumArtifactReportProcessor.java (original)
+++ maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/ChecksumArtifactReportProcessor.java Thu Sep  7 22:16:51 2006
@@ -45,9 +45,10 @@
      */
     private Digester md5Digester;
 
-    public void processArtifact( Model model, Artifact artifact, ArtifactReporter reporter,
-                                 ArtifactRepository repository )
+    public void processArtifact( Artifact artifact, Model model, ReportingDatabase reporter )
     {
+        ArtifactRepository repository = artifact.getRepository();
+
         if ( !"file".equals( repository.getProtocol() ) )
         {
             // We can't check other types of URLs yet. Need to use Wagon, with an exists() method.
@@ -59,12 +60,13 @@
         String path = repository.pathOf( artifact );
         File file = new File( repository.getBasedir(), path );
 
-        verifyChecksum( repository, path + ".md5", file, md5Digester, reporter, artifact );
+        // TODO: make md5 configurable
+//        verifyChecksum( repository, path + ".md5", file, md5Digester, reporter, artifact );
         verifyChecksum( repository, path + ".sha1", file, sha1Digester, reporter, artifact );
     }
 
     private void verifyChecksum( ArtifactRepository repository, String path, File file, Digester digester,
-                                 ArtifactReporter reporter, Artifact artifact )
+                                 ReportingDatabase reporter, Artifact artifact )
     {
         File checksumFile = new File( repository.getBasedir(), path );
         if ( checksumFile.exists() )
@@ -72,8 +74,6 @@
             try
             {
                 digester.verify( file, FileUtils.fileRead( checksumFile ) );
-
-                reporter.addSuccess( artifact );
             }
             catch ( DigesterException e )
             {

Modified: maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/ChecksumMetadataReportProcessor.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/ChecksumMetadataReportProcessor.java?view=diff&rev=441377&r1=441376&r2=441377
==============================================================================
--- maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/ChecksumMetadataReportProcessor.java (original)
+++ maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/ChecksumMetadataReportProcessor.java Thu Sep  7 22:16:51 2006
@@ -48,7 +48,8 @@
      * Validate the checksums of the metadata. Get the metadata file from the
      * repository then validate the checksum.
      */
-    public void processMetadata( RepositoryMetadata metadata, ArtifactRepository repository, ArtifactReporter reporter )
+    public void processMetadata( RepositoryMetadata metadata, ArtifactRepository repository,
+                                 ReportingDatabase reporter )
     {
         if ( !"file".equals( repository.getProtocol() ) )
         {
@@ -66,7 +67,7 @@
     }
 
     private void verifyChecksum( ArtifactRepository repository, String path, File file, Digester digester,
-                                 ArtifactReporter reporter, RepositoryMetadata metadata )
+                                 ReportingDatabase reporter, RepositoryMetadata metadata )
     {
         File checksumFile = new File( repository.getBasedir(), path );
         if ( checksumFile.exists() )
@@ -74,8 +75,6 @@
             try
             {
                 digester.verify( file, FileUtils.fileRead( checksumFile ) );
-
-                reporter.addSuccess( metadata );
             }
             catch ( DigesterException e )
             {

Added: maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/DefaultReportingStore.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/DefaultReportingStore.java?view=auto&rev=441377
==============================================================================
--- maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/DefaultReportingStore.java (added)
+++ maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/DefaultReportingStore.java Thu Sep  7 22:16:51 2006
@@ -0,0 +1,123 @@
+package org.apache.maven.archiva.reporting;
+
+/*
+ * 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.
+ */
+
+import org.apache.maven.archiva.reporting.model.io.xpp3.ReportingXpp3Reader;
+import org.apache.maven.archiva.reporting.model.io.xpp3.ReportingXpp3Writer;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.codehaus.plexus.logging.AbstractLogEnabled;
+import org.codehaus.plexus.util.IOUtil;
+import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Load and store the reports. No synchronization is used, but it is unnecessary as the old object
+ * can continue to be used.
+ *
+ * @author <a href="mailto:brett@apache.org">Brett Porter</a>
+ * @todo would be great for plexus to do this for us - so the configuration would be a component itself rather than this store
+ * @todo support other implementations than XML file
+ * @plexus.component
+ */
+public class DefaultReportingStore
+    extends AbstractLogEnabled
+    implements ReportingStore
+{
+    /**
+     * The cached reports for given repositories.
+     */
+    private Map/*<ArtifactRepository,ReportingDatabase>*/ reports = new HashMap();
+
+    public ReportingDatabase getReportsFromStore( ArtifactRepository repository )
+        throws ReportingStoreException
+    {
+        ReportingDatabase database = (ReportingDatabase) reports.get( repository );
+
+        if ( database == null )
+        {
+            ReportingXpp3Reader reader = new ReportingXpp3Reader();
+
+            File file = new File( repository.getBasedir(), "report-database.xml" );
+
+            FileReader fileReader = null;
+            try
+            {
+                fileReader = new FileReader( file );
+            }
+            catch ( FileNotFoundException e )
+            {
+                database = new ReportingDatabase();
+            }
+
+            if ( database == null )
+            {
+                getLogger().info( "Reading report database from " + file );
+                try
+                {
+                    database = new ReportingDatabase( reader.read( fileReader, false ) );
+                }
+                catch ( IOException e )
+                {
+                    throw new ReportingStoreException( e.getMessage(), e );
+                }
+                catch ( XmlPullParserException e )
+                {
+                    throw new ReportingStoreException( e.getMessage(), e );
+                }
+                finally
+                {
+                    IOUtil.close( fileReader );
+                }
+            }
+
+            reports.put( repository, database );
+        }
+        return database;
+    }
+
+    public void storeReports( ReportingDatabase database, ArtifactRepository repository )
+        throws ReportingStoreException
+    {
+        ReportingXpp3Writer writer = new ReportingXpp3Writer();
+
+        File file = new File( repository.getBasedir(), "report-database.xml" );
+        getLogger().info( "Writing reports to " + file );
+        FileWriter fileWriter = null;
+        try
+        {
+            file.getParentFile().mkdirs();
+
+            fileWriter = new FileWriter( file );
+            writer.write( fileWriter, database.getReporting() );
+        }
+        catch ( IOException e )
+        {
+            throw new ReportingStoreException( e.getMessage(), e );
+        }
+        finally
+        {
+            IOUtil.close( fileWriter );
+        }
+    }
+}

Propchange: maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/DefaultReportingStore.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/DependencyArtifactReportProcessor.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/DependencyArtifactReportProcessor.java?view=diff&rev=441377&r1=441376&r2=441377
==============================================================================
--- maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/DependencyArtifactReportProcessor.java (original)
+++ maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/DependencyArtifactReportProcessor.java Thu Sep  7 22:16:51 2006
@@ -20,12 +20,12 @@
 import org.apache.maven.archiva.layer.RepositoryQueryLayerFactory;
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.factory.ArtifactFactory;
-import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
 import org.apache.maven.artifact.versioning.VersionRange;
 import org.apache.maven.model.Dependency;
 import org.apache.maven.model.Model;
 
+import java.text.MessageFormat;
 import java.util.Iterator;
 import java.util.List;
 
@@ -45,31 +45,29 @@
      */
     private RepositoryQueryLayerFactory layerFactory;
 
-    public void processArtifact( Model model, Artifact artifact, ArtifactReporter reporter,
-                                 ArtifactRepository repository )
+    public void processArtifact( Artifact artifact, Model model, ReportingDatabase reporter )
     {
-        RepositoryQueryLayer queryLayer = layerFactory.createRepositoryQueryLayer( repository );
+        RepositoryQueryLayer queryLayer = layerFactory.createRepositoryQueryLayer( artifact.getRepository() );
         processArtifact( artifact, reporter, queryLayer );
 
-        List dependencies = model.getDependencies();
-        processDependencies( dependencies, reporter, queryLayer );
+        if ( model != null )
+        {
+            List dependencies = model.getDependencies();
+            processDependencies( dependencies, reporter, queryLayer, artifact );
+        }
     }
 
-    private void processArtifact( Artifact artifact, ArtifactReporter reporter,
+    private void processArtifact( Artifact artifact, ReportingDatabase reporter,
                                   RepositoryQueryLayer repositoryQueryLayer )
     {
-        if ( repositoryQueryLayer.containsArtifact( artifact ) )
-        {
-            reporter.addSuccess( artifact );
-        }
-        else
+        if ( !repositoryQueryLayer.containsArtifact( artifact ) )
         {
-            reporter.addFailure( artifact, ArtifactReporter.ARTIFACT_NOT_FOUND );
+            reporter.addFailure( artifact, "Artifact does not exist in the repository" );
         }
     }
 
-    private void processDependencies( List dependencies, ArtifactReporter reporter,
-                                      RepositoryQueryLayer repositoryQueryLayer )
+    private void processDependencies( List dependencies, ReportingDatabase reporter,
+                                      RepositoryQueryLayer repositoryQueryLayer, Artifact sourceArtifact )
     {
         if ( dependencies.size() > 0 )
         {
@@ -78,23 +76,24 @@
             {
                 Dependency dependency = (Dependency) iterator.next();
 
-                Artifact artifact = null;
                 try
                 {
-                    artifact = createArtifact( dependency );
+                    Artifact artifact = createArtifact( dependency );
 
-                    if ( repositoryQueryLayer.containsArtifact( artifact ) )
-                    {
-                        reporter.addSuccess( artifact );
-                    }
-                    else
+                    if ( !repositoryQueryLayer.containsArtifact( artifact ) )
                     {
-                        reporter.addFailure( artifact, ArtifactReporter.DEPENDENCY_NOT_FOUND );
+                        String reason = MessageFormat.format(
+                            "Artifact''s dependency {0} does not exist in the repository",
+                            new String[]{dependency.toString()} );
+                        reporter.addFailure( sourceArtifact, reason );
                     }
                 }
                 catch ( InvalidVersionSpecificationException e )
                 {
-                    reporter.addFailure( artifact, ArtifactReporter.DEPENDENCY_INVALID_VERSION );
+                    String reason = MessageFormat.format( "Artifact''s dependency {0} contains an invalid version {1}",
+                                                          new String[]{dependency.toString(),
+                                                              dependency.getVersion()} );
+                    reporter.addFailure( sourceArtifact, reason );
                 }
             }
         }

Modified: maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/DuplicateArtifactFileReportProcessor.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/DuplicateArtifactFileReportProcessor.java?view=diff&rev=441377&r1=441376&r2=441377
==============================================================================
--- maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/DuplicateArtifactFileReportProcessor.java (original)
+++ maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/DuplicateArtifactFileReportProcessor.java Thu Sep  7 22:16:51 2006
@@ -58,62 +58,54 @@
      */
     private String indexDirectory;
 
-    public void processArtifact( Model model, Artifact artifact, ArtifactReporter reporter,
-                                 ArtifactRepository repository )
-        throws ReportProcessorException
+    public void processArtifact( Artifact artifact, Model model, ReportingDatabase reporter )
     {
-        if ( artifact.getFile() != null )
+        ArtifactRepository repository = artifact.getRepository();
+        // TODO! always null currently, need to configure this properly
+        if ( artifact.getFile() != null && indexDirectory != null )
         {
             RepositoryArtifactIndex index = indexFactory.createStandardIndex( new File( indexDirectory ) );
 
-            String checksum;
+            String checksum = null;
             try
             {
                 checksum = digester.calc( artifact.getFile() );
             }
             catch ( DigesterException e )
             {
-                throw new ReportProcessorException( "Failed to generate checksum", e );
+                reporter.addWarning( artifact, "Unable to generate checksum for " + artifact.getFile() + ": " + e );
             }
 
-            try
+            if ( checksum != null )
             {
-                List results = index.search( new LuceneQuery(
-                    new TermQuery( new Term( StandardIndexRecordFields.MD5, checksum.toLowerCase() ) ) ) );
-
-                if ( results.isEmpty() )
-                {
-                    reporter.addSuccess( artifact );
-                }
-                else
+                try
                 {
-                    boolean hasDuplicates = false;
-                    for ( Iterator i = results.iterator(); i.hasNext(); )
-                    {
-                        StandardArtifactIndexRecord result = (StandardArtifactIndexRecord) i.next();
+                    List results = index.search( new LuceneQuery(
+                        new TermQuery( new Term( StandardIndexRecordFields.MD5, checksum.toLowerCase() ) ) ) );
 
-                        //make sure it is not the same artifact
-                        if ( !result.getFilename().equals( repository.pathOf( artifact ) ) )
+                    if ( !results.isEmpty() )
+                    {
+                        for ( Iterator i = results.iterator(); i.hasNext(); )
                         {
-                            //report only duplicates from the same groupId
-                            String groupId = artifact.getGroupId();
-                            if ( groupId.equals( result.getGroupId() ) )
+                            StandardArtifactIndexRecord result = (StandardArtifactIndexRecord) i.next();
+
+                            //make sure it is not the same artifact
+                            if ( !result.getFilename().equals( repository.pathOf( artifact ) ) )
                             {
-                                hasDuplicates = true;
-                                reporter.addFailure( artifact, "Found duplicate for " + artifact.getId() );
+                                //report only duplicates from the same groupId
+                                String groupId = artifact.getGroupId();
+                                if ( groupId.equals( result.getGroupId() ) )
+                                {
+                                    reporter.addFailure( artifact, "Found duplicate for " + artifact.getId() );
+                                }
                             }
                         }
                     }
-
-                    if ( !hasDuplicates )
-                    {
-                        reporter.addSuccess( artifact );
-                    }
                 }
-            }
-            catch ( RepositoryIndexSearchException e )
-            {
-                throw new ReportProcessorException( "Failed to search in index", e );
+                catch ( RepositoryIndexSearchException e )
+                {
+                    reporter.addWarning( artifact, "Failed to search in index" + e );
+                }
             }
         }
         else

Modified: maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/InvalidPomArtifactReportProcessor.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/InvalidPomArtifactReportProcessor.java?view=diff&rev=441377&r1=441376&r2=441377
==============================================================================
--- maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/InvalidPomArtifactReportProcessor.java (original)
+++ maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/InvalidPomArtifactReportProcessor.java Thu Sep  7 22:16:51 2006
@@ -38,14 +38,13 @@
     implements ArtifactReportProcessor
 {
     /**
-     * @param model
-     * @param artifact   The pom xml file to be validated, passed as an artifact object.
-     * @param reporter   The artifact reporter object.
-     * @param repository the repository where the artifact is located.
+     * @param artifact The pom xml file to be validated, passed as an artifact object.
+     * @param reporter The artifact reporter object.
      */
-    public void processArtifact( Model model, Artifact artifact, ArtifactReporter reporter,
-                                 ArtifactRepository repository )
+    public void processArtifact( Artifact artifact, Model model, ReportingDatabase reporter )
     {
+        ArtifactRepository repository = artifact.getRepository();
+
         if ( !"file".equals( repository.getProtocol() ) )
         {
             // We can't check other types of URLs yet. Need to use Wagon, with an exists() method.
@@ -71,7 +70,6 @@
                 {
                     reader = new FileReader( f );
                     pomReader.read( reader );
-                    reporter.addSuccess( artifact );
                 }
                 catch ( XmlPullParserException e )
                 {
@@ -97,5 +95,4 @@
             reporter.addWarning( artifact, "The artifact is not a pom xml file." );
         }
     }
-
 }

Modified: maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/LocationArtifactReportProcessor.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/LocationArtifactReportProcessor.java?view=diff&rev=441377&r1=441376&r2=441377
==============================================================================
--- maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/LocationArtifactReportProcessor.java (original)
+++ maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/LocationArtifactReportProcessor.java Thu Sep  7 22:16:51 2006
@@ -21,6 +21,7 @@
 import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.model.Model;
 import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
+import org.apache.maven.project.MavenProjectBuilder;
 import org.codehaus.plexus.util.IOUtil;
 import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
 
@@ -29,6 +30,9 @@
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.Reader;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
 import java.util.jar.JarEntry;
 import java.util.jar.JarFile;
 
@@ -47,6 +51,15 @@
      */
     private ArtifactFactory artifactFactory;
 
+    // TODO: share with other code with the same
+    private static final Set JAR_FILE_TYPES =
+        new HashSet( Arrays.asList( new String[]{"jar", "war", "par", "ejb", "ear", "rar", "sar"} ) );
+
+    /**
+     * @plexus.requirement
+     */
+    private MavenProjectBuilder projectBuilder;
+
     /**
      * Check whether the artifact is in its proper location. The location of the artifact
      * is validated first against the groupId, artifactId and versionId in the specified model
@@ -54,16 +67,11 @@
      * included in the package. If a model exists inside the package, then check if the artifact's
      * location is valid based on the location specified in the pom. Check if the both the location
      * specified in the file system pom and in the pom included in the package is the same.
-     *
-     * @param model      Represents the pom in the file system.
-     * @param artifact
-     * @param reporter
-     * @param repository
      */
-    public void processArtifact( Model model, Artifact artifact, ArtifactReporter reporter,
-                                 ArtifactRepository repository )
-        throws ReportProcessorException
+    public void processArtifact( Artifact artifact, Model model, ReportingDatabase reporter )
     {
+        ArtifactRepository repository = artifact.getRepository();
+
         if ( !"file".equals( repository.getProtocol() ) )
         {
             // We can't check other types of URLs yet. Need to use Wagon, with an exists() method.
@@ -71,24 +79,33 @@
                 "Can't process repository '" + repository.getUrl() + "'. Only file based repositories are supported" );
         }
 
-        //check if the artifact is located in its proper location based on the info
-        //specified in the model object/pom
-        Artifact modelArtifact = artifactFactory.createBuildArtifact( model.getGroupId(), model.getArtifactId(),
-                                                                      model.getVersion(), model.getPackaging() );
-
-        boolean failed = false;
-        String modelPath = repository.pathOf( modelArtifact );
         String artifactPath = repository.pathOf( artifact );
-        if ( modelPath.equals( artifactPath ) )
+
+        if ( model != null )
         {
-            //get the location of the artifact itself
-            File file = new File( repository.getBasedir(), artifactPath );
+            //check if the artifact is located in its proper location based on the info
+            //specified in the model object/pom
+            Artifact modelArtifact = artifactFactory.createBuildArtifact( model.getGroupId(), model.getArtifactId(),
+                                                                          model.getVersion(), model.getPackaging() );
+
+            String modelPath = repository.pathOf( modelArtifact );
+            if ( !modelPath.equals( artifactPath ) )
+            {
+                reporter.addFailure( artifact,
+                                     "The artifact is out of place. It does not match the specified location in the repository pom." );
+            }
+        }
+
+        //get the location of the artifact itself
+        File file = new File( repository.getBasedir(), artifactPath );
 
-            if ( file.exists() )
+        if ( file.exists() )
+        {
+            if ( JAR_FILE_TYPES.contains( artifact.getType() ) )
             {
                 //unpack the artifact (using the groupId, artifactId & version specified in the artifact object itself
                 //check if the pom is included in the package
-                Model extractedModel = readArtifactModel( file, artifact.getGroupId(), artifact.getArtifactId() );
+                Model extractedModel = readArtifactModel( file, artifact, reporter );
 
                 if ( extractedModel != null )
                 {
@@ -100,39 +117,18 @@
                     {
                         reporter.addFailure( artifact,
                                              "The artifact is out of place. It does not match the specified location in the packaged pom." );
-                        failed = true;
                     }
                 }
             }
-            else
-            {
-                reporter.addFailure( artifact,
-                                     "The artifact is out of place. It does not exist at the specified location in the repository pom." );
-                failed = true;
-            }
         }
         else
         {
             reporter.addFailure( artifact,
-                                 "The artifact is out of place. It does not match the specified location in the repository pom." );
-            failed = true;
-        }
-
-        if ( !failed )
-        {
-            reporter.addSuccess( artifact );
+                                 "The artifact is out of place. It does not exist at the specified location in the repository pom." );
         }
     }
 
-    /**
-     * Extract the contents of the artifact/jar file.
-     *
-     * @param file
-     * @param groupId
-     * @param artifactId
-     */
-    private Model readArtifactModel( File file, String groupId, String artifactId )
-        throws ReportProcessorException
+    private Model readArtifactModel( File file, Artifact artifact, ReportingDatabase reporter )
     {
         Model model = null;
 
@@ -142,23 +138,31 @@
             jar = new JarFile( file );
 
             //Get the entry and its input stream.
-            JarEntry entry = jar.getJarEntry( "META-INF/maven/" + groupId + "/" + artifactId + "/pom.xml" );
+            JarEntry entry = jar.getJarEntry(
+                "META-INF/maven/" + artifact.getGroupId() + "/" + artifact.getArtifactId() + "/pom.xml" );
 
             // If the entry is not null, extract it.
             if ( entry != null )
             {
                 model = readModel( jar.getInputStream( entry ) );
+
+                if ( model.getGroupId() == null )
+                {
+                    model.setGroupId( model.getParent().getGroupId() );
+                }
+                if ( model.getVersion() == null )
+                {
+                    model.setVersion( model.getParent().getVersion() );
+                }
             }
         }
         catch ( IOException e )
         {
-            // TODO: should just warn and continue!
-            throw new ReportProcessorException( "Unable to read artifact to extract model", e );
+            reporter.addWarning( artifact, "Unable to read artifact to extract model: " + e );
         }
         catch ( XmlPullParserException e )
         {
-            // TODO: should just warn and continue!
-            throw new ReportProcessorException( "Unable to read artifact to extract model", e );
+            reporter.addWarning( artifact, "Unable to parse extracted model: " + e );
         }
         finally
         {

Modified: maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/MetadataReportProcessor.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/MetadataReportProcessor.java?view=diff&rev=441377&r1=441376&r2=441377
==============================================================================
--- maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/MetadataReportProcessor.java (original)
+++ maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/MetadataReportProcessor.java Thu Sep  7 22:16:51 2006
@@ -26,6 +26,5 @@
 {
     String ROLE = MetadataReportProcessor.class.getName();
 
-    void processMetadata( RepositoryMetadata metadata, ArtifactRepository repository, ArtifactReporter reporter )
-        throws ReportProcessorException;
+    void processMetadata( RepositoryMetadata metadata, ArtifactRepository repository, ReportingDatabase reporter );
 }