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/09 10:08:37 UTC

svn commit: r441757 - in /maven/archiva/trunk: archiva-core/src/main/java/org/apache/maven/archiva/scheduler/task/ archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/ archiva-webapp/src/main/java/org/apache/maven/archiva/web/acti...

Author: brett
Date: Sat Sep  9 01:08:37 2006
New Revision: 441757

URL: http://svn.apache.org/viewvc?view=rev&rev=441757
Log:
[MRM-77] run report in the background

Modified:
    maven/archiva/trunk/archiva-core/src/main/java/org/apache/maven/archiva/scheduler/task/IndexerTask.java
    maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/DefaultReportExecutor.java
    maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/DefaultReportingStore.java
    maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/ReportExecutor.java
    maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/ReportingDatabase.java
    maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/ReportingStore.java
    maven/archiva/trunk/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ReportsAction.java
    maven/archiva/trunk/archiva-webapp/src/main/resources/xwork.xml
    maven/archiva/trunk/archiva-webapp/src/main/webapp/WEB-INF/jsp/reports/reports.jsp

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=441757&r1=441756&r2=441757
==============================================================================
--- 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 Sat Sep  9 01:08:37 2006
@@ -182,6 +182,8 @@
                             List currentArtifacts =
                                 artifacts.subList( j, end > artifacts.size() ? artifacts.size() : end );
 
+                            // TODO: proper queueing of this in case it was triggered externally (not harmful to do so at present, but not optimal)
+
                             // run the reports. Done intermittently to avoid losing track of what is indexed since
                             // that is what the filter is based on.
                             reportExecutor.runArtifactReports( currentArtifacts, repository );

Modified: maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/DefaultReportExecutor.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/DefaultReportExecutor.java?view=diff&rev=441757&r1=441756&r2=441757
==============================================================================
--- maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/DefaultReportExecutor.java (original)
+++ maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/DefaultReportExecutor.java Sat Sep  9 01:08:37 2006
@@ -85,6 +85,8 @@
      */
     private Map metadataDiscoverers;
 
+    private static final int ARTIFACT_BUFFER_SIZE = 1000;
+
     public void runMetadataReports( List metadata, ArtifactRepository repository )
         throws ReportingStoreException
     {
@@ -160,7 +162,8 @@
         throws DiscovererException, ReportingStoreException
     {
         // Flush (as in toilet, not store) the report database
-        reportingStore.removeReportDatabase( repository );
+        ReportingDatabase database = getReportDatabase( repository );
+        database.clear();
 
         // Discovery process
         String layoutProperty = getRepositoryLayout( repository.getLayout() );
@@ -176,8 +179,21 @@
         {
             getLogger().info( "Discovered " + artifacts.size() + " artifacts" );
 
-            // run the reports
-            runArtifactReports( artifacts, repository );
+            // 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 );
+
+                // TODO: proper queueing of this in case it was triggered externally (not harmful to do so at present, but not optimal)
+
+                // run the reports.
+                runArtifactReports( currentArtifacts, repository );
+            }
+
+            // 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();
         }
 
         MetadataDiscoverer metadataDiscoverer = (MetadataDiscoverer) metadataDiscoverers.get( layoutProperty );
@@ -218,6 +234,33 @@
             ArtifactReportProcessor report = (ArtifactReportProcessor) i.next();
 
             report.processArtifact( artifact, model, reporter );
+        }
+    }
+
+    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-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=diff&rev=441757&r1=441756&r2=441757
==============================================================================
--- maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/DefaultReportingStore.java (original)
+++ maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/DefaultReportingStore.java Sat Sep  9 01:08:37 2006
@@ -121,8 +121,4 @@
         }
     }
 
-    public void removeReportDatabase( ArtifactRepository repository )
-    {
-        reports.remove( repository );
-    }
 }

Modified: maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/ReportExecutor.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/ReportExecutor.java?view=diff&rev=441757&r1=441756&r2=441757
==============================================================================
--- maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/ReportExecutor.java (original)
+++ maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/ReportExecutor.java Sat Sep  9 01:08:37 2006
@@ -68,6 +68,9 @@
      * @param repository          the repository to run from
      * @param blacklistedPatterns the patterns to exclude during discovery
      * @param filter              the filter to use during discovery to get a consistent list of artifacts
+     * @throws ReportingStoreException if there is a problem reading/writing the report database
+     * @throws org.apache.maven.archiva.discoverer.DiscovererException
+     *                                 if there is a problem finding the artifacts and metadata to report on
      */
     public void runReports( ArtifactRepository repository, List blacklistedPatterns, ArtifactFilter filter )
         throws DiscovererException, ReportingStoreException;

Modified: maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/ReportingDatabase.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/ReportingDatabase.java?view=diff&rev=441757&r1=441756&r2=441757
==============================================================================
--- maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/ReportingDatabase.java (original)
+++ maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/ReportingDatabase.java Sat Sep  9 01:08:37 2006
@@ -45,6 +45,8 @@
 
     private ArtifactRepository repository;
 
+    private boolean inProgress;
+
     public ReportingDatabase()
     {
         this( new Reporting(), null );
@@ -279,4 +281,26 @@
         return repository;
     }
 
+    public boolean isInProgress()
+    {
+        return inProgress;
+    }
+
+    public void setInProgress( boolean inProgress )
+    {
+        this.inProgress = inProgress;
+    }
+
+    public void clear()
+    {
+        // clear the values rather than destroy the instance so that the "inProgress" indicator is in tact.
+        numWarnings = 0;
+        numFailures = 0;
+
+        artifactMap.clear();
+        metadataMap.clear();
+
+        reporting.getArtifacts().clear();
+        reporting.getMetadata().clear();
+    }
 }

Modified: maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/ReportingStore.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/ReportingStore.java?view=diff&rev=441757&r1=441756&r2=441757
==============================================================================
--- maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/ReportingStore.java (original)
+++ maven/archiva/trunk/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/ReportingStore.java Sat Sep  9 01:08:37 2006
@@ -51,10 +51,4 @@
     void storeReports( ReportingDatabase database, ArtifactRepository repository )
         throws ReportingStoreException;
 
-    /**
-     * Remove the report database from the memory cache.
-     *
-     * @param repository the repository of the database to remove
-     */
-    void removeReportDatabase( ArtifactRepository repository );
 }

Modified: maven/archiva/trunk/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ReportsAction.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ReportsAction.java?view=diff&rev=441757&r1=441756&r2=441757
==============================================================================
--- maven/archiva/trunk/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ReportsAction.java (original)
+++ maven/archiva/trunk/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ReportsAction.java Sat Sep  9 01:08:37 2006
@@ -95,6 +95,14 @@
         RepositoryConfiguration repositoryConfiguration = configuration.getRepositoryById( repositoryId );
         ArtifactRepository repository = factory.createRepository( repositoryConfiguration );
 
+        ReportingDatabase database = executor.getReportDatabase( repository );
+        if ( database.isInProgress() )
+        {
+            return SUCCESS;
+        }
+
+        database.setInProgress( true );
+
         List blacklistedPatterns = new ArrayList();
         if ( repositoryConfiguration.getBlackListPatterns() != null )
         {
@@ -115,9 +123,16 @@
             filter = new SnapshotArtifactFilter();
         }
 
-        executor.runReports( repository, blacklistedPatterns, filter );
+        try
+        {
+            executor.runReports( repository, blacklistedPatterns, filter );
+        }
+        finally
+        {
+            database.setInProgress( false );
+        }
 
-        return execute();
+        return SUCCESS;
     }
 
     public String getRepositoryId()

Modified: maven/archiva/trunk/archiva-webapp/src/main/resources/xwork.xml
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-webapp/src/main/resources/xwork.xml?view=diff&rev=441757&r1=441756&r2=441757
==============================================================================
--- maven/archiva/trunk/archiva-webapp/src/main/resources/xwork.xml (original)
+++ maven/archiva/trunk/archiva-webapp/src/main/resources/xwork.xml Sat Sep  9 01:08:37 2006
@@ -111,6 +111,13 @@
       <result>/WEB-INF/jsp/reports/reports.jsp</result>
     </action>
 
+    <action name="runReport" class="reportsAction" method="runReport">
+      <interceptor-ref name="configuredStack"/>
+      <interceptor-ref name="execAndWait"/>
+      <result name="wait" type="redirect-action">reports</result>
+      <result name="success" type="redirect-action">reports</result>
+    </action>
+
     <action name="showArtifactDependencies" class="showArtifactAction" method="dependencies">
       <result>/WEB-INF/jsp/showArtifact.jsp</result>
     </action>

Modified: maven/archiva/trunk/archiva-webapp/src/main/webapp/WEB-INF/jsp/reports/reports.jsp
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-webapp/src/main/webapp/WEB-INF/jsp/reports/reports.jsp?view=diff&rev=441757&r1=441756&r2=441757
==============================================================================
--- maven/archiva/trunk/archiva-webapp/src/main/webapp/WEB-INF/jsp/reports/reports.jsp (original)
+++ maven/archiva/trunk/archiva-webapp/src/main/webapp/WEB-INF/jsp/reports/reports.jsp Sat Sep  9 01:08:37 2006
@@ -30,6 +30,8 @@
 
 <div id="contentArea">
 
+<ww:actionerror/>
+
 <ww:set name="databases" value="databases"/>
 <c:forEach items="${databases}" var="database">
 <div>
@@ -38,12 +40,21 @@
   <a href="#">Repair all</a>
   |
     --%>
-  <c:set var="url">
-    <ww:url action="reports" namespace="/" method="runReport">
-      <ww:param name="repositoryId" value="%{'${database.repository.id}'}"/>
-    </ww:url>
-  </c:set>
-  <a href="${url}">Regenerate Report</a>
+  <c:choose>
+    <c:when test="${!database.inProgress}">
+      <c:set var="url">
+        <ww:url action="runReport" namespace="/">
+          <ww:param name="repositoryId" value="%{'${database.repository.id}'}"/>
+        </ww:url>
+      </c:set>
+      <a href="${url}">Regenerate Report</a>
+    </c:when>
+    <c:otherwise>
+      <!-- TODO: would be good to have a generic task/job mechanism that tracked progress and ability to run
+      concurrently -->
+      <span style="color: gray;">Report in progress</span>
+    </c:otherwise>
+  </c:choose>
 </div>
 <h2>Repository: ${database.repository.name}</h2>
 
@@ -55,8 +66,9 @@
     ${database.numWarnings}
 </p>
 
+  <%-- TODO need to protect iterations against concurrent modification exceptions by cloning the lists synchronously --%>
   <%-- TODO! factor out common parts, especially artifact rendering tag --%>
-  <%-- TODO! paginate --%>
+  <%-- TODO! paginate (displaytag?) --%>
 <c:if test="${!empty(database.reporting.artifacts)}">
   <h3>Artifacts</h3>
   <c:forEach items="${database.reporting.artifacts}" var="artifact" begin="0" end="2">