Index: src/main/java/org/apache/maven/archiva/consumers/database/DatabaseCleanupRemoveProjectConsumer.java
===================================================================
--- src/main/java/org/apache/maven/archiva/consumers/database/DatabaseCleanupRemoveProjectConsumer.java (revision 603896)
+++ src/main/java/org/apache/maven/archiva/consumers/database/DatabaseCleanupRemoveProjectConsumer.java (working copy)
@@ -19,32 +19,32 @@
* under the License.
*/
+import java.io.File;
+import java.util.List;
+
import org.apache.commons.lang.StringUtils;
import org.apache.maven.archiva.consumers.AbstractMonitoredConsumer;
import org.apache.maven.archiva.consumers.ConsumerException;
import org.apache.maven.archiva.consumers.DatabaseCleanupConsumer;
+import org.apache.maven.archiva.database.ArchivaDatabaseException;
+import org.apache.maven.archiva.database.ArtifactDAO;
+import org.apache.maven.archiva.database.ProjectModelDAO;
import org.apache.maven.archiva.model.ArchivaArtifact;
+import org.apache.maven.archiva.model.ArchivaArtifactModel;
import org.apache.maven.archiva.model.ArchivaProjectModel;
import org.apache.maven.archiva.repository.ManagedRepositoryContent;
import org.apache.maven.archiva.repository.RepositoryContentFactory;
import org.apache.maven.archiva.repository.RepositoryException;
-import org.apache.maven.archiva.database.ProjectModelDAO;
-import org.apache.maven.archiva.database.ArchivaDatabaseException;
+import org.codehaus.plexus.cache.Cache;
-import java.util.List;
-import java.io.File;
-
/**
- * Consumer for removing or deleting from the database the project models fo artifacts that have been
- * deleted/removed from the repository.
- *
- * @author Joakim Erdfelt
- * Maria Odea Ching
+ * Consumer for removing or deleting from the database the project models fo artifacts that have been deleted/removed
+ * from the repository.
+ *
+ * @author Joakim Erdfelt Maria Odea Ching
* @version $Id$
- *
* @plexus.component role="org.apache.maven.archiva.consumers.DatabaseCleanupConsumer"
- * role-hint="not-present-remove-db-project"
- * instantiation-strategy="per-lookup"
+ * role-hint="not-present-remove-db-project" instantiation-strategy="per-lookup"
*/
public class DatabaseCleanupRemoveProjectConsumer
extends AbstractMonitoredConsumer
@@ -64,12 +64,22 @@
* @plexus.requirement role-hint="jdo"
*/
private ProjectModelDAO projectModelDAO;
-
+
/**
+ * @plexus.requirement role-hint="jdo"
+ */
+ private ArtifactDAO artifactDAO;
+
+ /**
* @plexus.requirement
*/
private RepositoryContentFactory repositoryFactory;
+ /**
+ * @plexus.requirement role-hint="effective-project-cache"
+ */
+ private Cache effectiveProjectCache;
+
public void beginScan()
{
// TODO Auto-generated method stub
@@ -81,44 +91,75 @@
}
public List getIncludedTypes()
- {
- return null;
+ {
+ return null;
}
public void processArchivaArtifact( ArchivaArtifact artifact )
throws ConsumerException
- {
- if ( !StringUtils.equals( "pom", artifact.getType() ) )
+ {
+ if ( !StringUtils.equals( "pom", artifact.getType() ) )
{
- // Not a pom. Skip it.
+ // Not a pom. Skip it.
return;
}
-
- try
- {
- ManagedRepositoryContent repositoryContent =
- repositoryFactory.getManagedRepositoryContent( artifact.getModel().getRepositoryId() );
-
- File file = new File( repositoryContent.getRepoRoot(), repositoryContent.toPath( artifact ) );
-
- if( !file.exists() )
- {
- ArchivaProjectModel projectModel = projectModelDAO.getProjectModel(
- artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion() );
-
- projectModelDAO.deleteProjectModel( projectModel );
- }
- }
- catch ( RepositoryException re )
- {
- throw new ConsumerException( "Can't run database cleanup remove artifact consumer: " +
- re.getMessage() );
- }
- catch ( ArchivaDatabaseException e )
- {
+
+ try
+ {
+ ManagedRepositoryContent repositoryContent =
+ repositoryFactory.getManagedRepositoryContent( artifact.getModel().getRepositoryId() );
+
+ File file = new File( repositoryContent.getRepoRoot(), repositoryContent.toPath( artifact ) );
+
+ if ( !file.exists() )
+ {
+ ArchivaProjectModel projectModel =
+ projectModelDAO.getProjectModel( artifact.getGroupId(), artifact.getArtifactId(),
+ artifact.getVersion() );
+
+ projectModelDAO.deleteProjectModel( projectModel );
+ }
+ else
+ {
+ ArchivaArtifactModel artifactModel = artifact.getModel();
+
+ // Force artifact update if it has been modified since
+ // last time it was processed
+ if ( artifactModel.getWhenProcessed() != null &&
+ artifactModel.getWhenProcessed().before( artifactModel.getLastModified() ) )
+ {
+ // Set artifact to unprocessed and save it to database
+ artifactModel.setWhenProcessed( null );
+ artifactDAO.saveArtifact( artifact );
+
+ // Remove current project model so it can be re-created
+ // once artifact gets processed again
+ ArchivaProjectModel projectModel =
+ projectModelDAO.getProjectModel( artifact.getGroupId(), artifact.getArtifactId(),
+ artifact.getVersion() );
+ projectModelDAO.deleteProjectModel( projectModel );
+
+ // Force removal of project model from effective cache
+ String projectKey = toProjectKey( projectModel );
+ synchronized ( effectiveProjectCache )
+ {
+ if ( effectiveProjectCache.hasKey( projectKey ) )
+ {
+ effectiveProjectCache.remove( projectKey );
+ }
+ }
+ }
+ }
+ }
+ catch ( RepositoryException re )
+ {
+ throw new ConsumerException( "Can't run database cleanup remove artifact consumer: " + re.getMessage() );
+ }
+ catch ( ArchivaDatabaseException e )
+ {
throw new ConsumerException( e.getMessage() );
- }
-
+ }
+
}
public String getDescription()
@@ -134,16 +175,26 @@
public boolean isPermanent()
{
return false;
- }
-
+ }
+
public void setProjectModelDAO( ProjectModelDAO projectModelDAO )
{
this.projectModelDAO = projectModelDAO;
}
-
+
public void setRepositoryFactory( RepositoryContentFactory repositoryFactory )
{
this.repositoryFactory = repositoryFactory;
}
-
+
+ private String toProjectKey( ArchivaProjectModel project )
+ {
+ StringBuilder key = new StringBuilder();
+
+ key.append( project.getGroupId() ).append( ":" );
+ key.append( project.getArtifactId() ).append( ":" );
+ key.append( project.getVersion() );
+
+ return key.toString();
+ }
}