git-svn-id: https://svn.apache.org/repos/asf/archiva/trunk@825163 13f79535-47bb-0310-9956-ffa450edef68tags/archiva-1.3
@@ -20,6 +20,7 @@ package org.apache.archiva.consumers.lucene; | |||
*/ | |||
import java.io.File; | |||
import java.io.IOException; | |||
import java.util.List; | |||
import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration; | |||
@@ -36,11 +37,12 @@ import org.apache.maven.archiva.scheduled.tasks.TaskCreator; | |||
import org.codehaus.plexus.taskqueue.TaskQueueException; | |||
import org.slf4j.Logger; | |||
import org.slf4j.LoggerFactory; | |||
import org.sonatype.nexus.index.context.IndexingContext; | |||
import org.sonatype.nexus.index.context.UnsupportedExistingLuceneIndexException; | |||
/** | |||
* LuceneCleanupRemoveIndexedConsumer | |||
* | |||
* Clean up the index of artifacts that are no longer existing in the file system (managed repositories). | |||
* LuceneCleanupRemoveIndexedConsumer Clean up the index of artifacts that are no longer existing in the file system | |||
* (managed repositories). | |||
* | |||
* @version $Id$ | |||
*/ | |||
@@ -51,15 +53,15 @@ public class LuceneCleanupRemoveIndexedConsumer | |||
private static final Logger log = LoggerFactory.getLogger( LuceneCleanupRemoveIndexedConsumer.class ); | |||
private RepositoryContentFactory repoFactory; | |||
private ArchivaTaskScheduler scheduler; | |||
public LuceneCleanupRemoveIndexedConsumer( RepositoryContentFactory repoFactory, ArchivaTaskScheduler scheduler ) | |||
{ | |||
this.repoFactory = repoFactory; | |||
this.scheduler = scheduler; | |||
this.scheduler = scheduler; | |||
} | |||
public void beginScan() | |||
{ | |||
} | |||
@@ -69,7 +71,7 @@ public class LuceneCleanupRemoveIndexedConsumer | |||
} | |||
public List<String> getIncludedTypes() | |||
{ | |||
{ | |||
return null; | |||
} | |||
@@ -77,11 +79,10 @@ public class LuceneCleanupRemoveIndexedConsumer | |||
throws ConsumerException | |||
{ | |||
ManagedRepositoryContent repoContent = null; | |||
try | |||
{ | |||
repoContent = | |||
repoFactory.getManagedRepositoryContent( artifact.getModel().getRepositoryId() ); | |||
repoContent = repoFactory.getManagedRepositoryContent( artifact.getModel().getRepositoryId() ); | |||
} | |||
catch ( RepositoryException e ) | |||
{ | |||
@@ -89,32 +90,59 @@ public class LuceneCleanupRemoveIndexedConsumer | |||
} | |||
ManagedRepositoryConfiguration repository = repoContent.getRepository(); | |||
IndexingContext context = null; | |||
try | |||
{ | |||
File artifactFile = new File( repoContent.getRepoRoot(), repoContent.toPath( artifact ) ); | |||
if ( !artifactFile.exists() ) | |||
{ | |||
ArtifactIndexingTask task = | |||
TaskCreator.createIndexingTask( repository.getId(), artifactFile, ArtifactIndexingTask.Action.DELETE ); | |||
context = TaskCreator.createContext( repository ); | |||
ArtifactIndexingTask task = | |||
TaskCreator.createIndexingTask( repository, artifactFile, ArtifactIndexingTask.Action.DELETE, | |||
context ); | |||
log.debug( "Queueing indexing task '" + task + "' to remove the artifact from the index." ); | |||
scheduler.queueIndexingTask( task ); | |||
// note we finish immediately here since it isn't done repo-by-repo. It might be nice to ensure that is | |||
// the case for optimisation though | |||
task = | |||
TaskCreator.createIndexingTask( repository.getId(), artifactFile, ArtifactIndexingTask.Action.FINISH ); | |||
TaskCreator.createIndexingTask( repository, artifactFile, ArtifactIndexingTask.Action.FINISH, | |||
context ); | |||
log.debug( "Queueing indexing task + '" + task + "' to finish indexing." ); | |||
scheduler.queueIndexingTask( task ); | |||
} | |||
} | |||
} | |||
catch ( TaskQueueException e ) | |||
{ | |||
throw new ConsumerException( e.getMessage() ); | |||
} | |||
catch ( IOException e ) | |||
{ | |||
throw new ConsumerException( e.getMessage(), e ); | |||
} | |||
catch ( UnsupportedExistingLuceneIndexException e ) | |||
{ | |||
throw new ConsumerException( e.getMessage(), e ); | |||
} | |||
finally | |||
{ | |||
if ( context != null ) | |||
{ | |||
try | |||
{ | |||
context.close( false ); | |||
} | |||
catch ( IOException e ) | |||
{ | |||
log.error( e.getMessage() ); | |||
} | |||
} | |||
} | |||
} | |||
public String getDescription() |
@@ -20,6 +20,7 @@ package org.apache.archiva.consumers.lucene; | |||
*/ | |||
import java.io.File; | |||
import java.io.IOException; | |||
import java.util.ArrayList; | |||
import java.util.Arrays; | |||
import java.util.Date; | |||
@@ -33,10 +34,11 @@ import org.apache.maven.archiva.repository.content.ManagedDefaultRepositoryConte | |||
import org.apache.maven.archiva.scheduled.ArchivaTaskScheduler; | |||
import org.apache.maven.archiva.scheduled.tasks.ArtifactIndexingTask; | |||
import org.apache.maven.archiva.scheduled.tasks.TaskCreator; | |||
import org.apache.maven.archiva.scheduled.tasks.ArtifactIndexingTask.Action; | |||
import org.codehaus.plexus.taskqueue.TaskQueueException; | |||
import org.slf4j.Logger; | |||
import org.slf4j.LoggerFactory; | |||
import org.sonatype.nexus.index.context.IndexingContext; | |||
import org.sonatype.nexus.index.context.UnsupportedExistingLuceneIndexException; | |||
/** | |||
* Consumer for indexing the repository to provide search and IDE integration features. | |||
@@ -50,14 +52,16 @@ public class NexusIndexerConsumer | |||
private ManagedDefaultRepositoryContent repositoryContent; | |||
private File managedRepository; | |||
private ArchivaTaskScheduler scheduler; | |||
private IndexingContext context; | |||
public NexusIndexerConsumer( ArchivaTaskScheduler scheduler ) | |||
{ | |||
this.scheduler = scheduler; | |||
} | |||
public String getDescription() | |||
{ | |||
return "Indexes the repository to provide search and IDE integration features"; | |||
@@ -75,23 +79,34 @@ public class NexusIndexerConsumer | |||
public void beginScan( ManagedRepositoryConfiguration repository, Date whenGathered ) | |||
throws ConsumerException | |||
{ | |||
{ | |||
managedRepository = new File( repository.getLocation() ); | |||
repositoryContent = new ManagedDefaultRepositoryContent(); | |||
repositoryContent.setRepository( repository ); | |||
// TODO: investigate whether it is reasonable to create the indexing context here rather than file-by-file | |||
// we may want to be able to "flush" it after every file without closing it though, if necessary | |||
try | |||
{ | |||
context = TaskCreator.createContext( repository ); | |||
} | |||
catch ( IOException e ) | |||
{ | |||
throw new ConsumerException( e.getMessage(), e ); | |||
} | |||
catch ( UnsupportedExistingLuceneIndexException e ) | |||
{ | |||
throw new ConsumerException( e.getMessage(), e ); | |||
} | |||
} | |||
public void processFile( String path ) | |||
throws ConsumerException | |||
{ | |||
File artifactFile = new File( managedRepository, path ); | |||
ArtifactIndexingTask task = | |||
TaskCreator.createIndexingTask( repositoryContent.getId(), artifactFile, ArtifactIndexingTask.Action.ADD ); | |||
TaskCreator.createIndexingTask( repositoryContent.getRepository(), artifactFile, | |||
ArtifactIndexingTask.Action.ADD, context ); | |||
try | |||
{ | |||
log.debug( "Queueing indexing task + '" + task + "' to add or update the artifact in the index." ); | |||
@@ -100,13 +115,14 @@ public class NexusIndexerConsumer | |||
catch ( TaskQueueException e ) | |||
{ | |||
throw new ConsumerException( e.getMessage(), e ); | |||
} | |||
} | |||
} | |||
public void completeScan() | |||
{ | |||
ArtifactIndexingTask task = | |||
TaskCreator.createIndexingTask( repositoryContent.getId(), null, ArtifactIndexingTask.Action.FINISH ); | |||
TaskCreator.createIndexingTask( repositoryContent.getRepository(), null, | |||
ArtifactIndexingTask.Action.FINISH, context ); | |||
try | |||
{ | |||
log.debug( "Queueing indexing task + '" + task + "' to finish indexing." ); | |||
@@ -115,7 +131,7 @@ public class NexusIndexerConsumer | |||
catch ( TaskQueueException e ) | |||
{ | |||
log.error( "Error queueing task: " + task + ": " + e.getMessage(), e ); | |||
} | |||
} | |||
} | |||
public List<String> getExcludes() |
@@ -49,7 +49,7 @@ public class LuceneCleanupRemoveIndexedConsumerTest | |||
private MockControl repoFactoryControl; | |||
private ManagedRepositoryConfiguration repositoryConfig; | |||
private TaskQueue indexingQueue; | |||
public void setUp() | |||
@@ -60,10 +60,10 @@ public class LuceneCleanupRemoveIndexedConsumerTest | |||
repoFactoryControl = MockClassControl.createControl( RepositoryContentFactory.class ); | |||
repoFactory = (RepositoryContentFactory) repoFactoryControl.getMock(); | |||
ArchivaTaskScheduler scheduler = ( ArchivaTaskScheduler ) lookup( ArchivaTaskScheduler.class ); | |||
ArchivaTaskScheduler scheduler = (ArchivaTaskScheduler) lookup( ArchivaTaskScheduler.class ); | |||
indexingQueue = (TaskQueue) lookup( TaskQueue.ROLE, "indexing" ); | |||
consumer = new LuceneCleanupRemoveIndexedConsumer( repoFactory, scheduler ); | |||
repositoryConfig = new ManagedRepositoryConfiguration(); | |||
@@ -93,28 +93,28 @@ public class LuceneCleanupRemoveIndexedConsumerTest | |||
ArchivaArtifact artifact = | |||
new ArchivaArtifact( "org.apache.archiva", "archiva-lucene-consumers", "1.2", null, "jar", "test-repo" ); | |||
ManagedRepositoryContent repoContent = new ManagedDefaultRepositoryContent(); | |||
repoContent.setRepository( repositoryConfig ); | |||
File artifactFile = new File( repoContent.getRepoRoot(), repoContent.toPath( artifact ) ); | |||
repoFactoryControl.expectAndReturn( repoFactory.getManagedRepositoryContent( repositoryConfig.getId() ), | |||
repoContent ); | |||
repoFactoryControl.replay(); | |||
repoFactoryControl.replay(); | |||
consumer.processArchivaArtifact( artifact ); | |||
repoFactoryControl.verify(); | |||
repoFactoryControl.verify(); | |||
List<ArtifactIndexingTask> queue = indexingQueue.getQueueSnapshot(); | |||
assertEquals( 2, queue.size() ); | |||
ArtifactIndexingTask task = | |||
TaskCreator.createIndexingTask( repositoryConfig.getId(), artifactFile, ArtifactIndexingTask.Action.DELETE ); | |||
TaskCreator.createIndexingTask( repositoryConfig, artifactFile, ArtifactIndexingTask.Action.DELETE, null ); | |||
assertEquals( task, queue.get( 0 ) ); | |||
task = | |||
TaskCreator.createIndexingTask( repositoryConfig.getId(), artifactFile, ArtifactIndexingTask.Action.FINISH ); | |||
TaskCreator.createIndexingTask( repositoryConfig, artifactFile, ArtifactIndexingTask.Action.FINISH, null ); | |||
assertEquals( task, queue.get( 1 ) ); | |||
} | |||
@@ -136,10 +136,10 @@ public class LuceneCleanupRemoveIndexedConsumerTest | |||
consumer.processArchivaArtifact( artifact ); | |||
repoFactoryControl.verify(); | |||
assertTrue( indexingQueue.getQueueSnapshot().isEmpty() ); | |||
} | |||
@Override | |||
protected String getPlexusConfigLocation() | |||
{ |
@@ -20,19 +20,23 @@ package org.apache.archiva.consumers.lucene; | |||
*/ | |||
import java.io.File; | |||
import java.io.IOException; | |||
import java.util.Calendar; | |||
import java.util.Date; | |||
import java.util.List; | |||
import java.util.HashSet; | |||
import java.util.Set; | |||
import org.apache.commons.io.FileUtils; | |||
import org.apache.maven.archiva.common.ArchivaException; | |||
import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration; | |||
import org.apache.maven.archiva.consumers.KnownRepositoryContentConsumer; | |||
import org.apache.maven.archiva.scheduled.ArchivaTaskScheduler; | |||
import org.apache.maven.archiva.scheduled.tasks.ArtifactIndexingTask; | |||
import org.apache.maven.archiva.scheduled.tasks.TaskCreator; | |||
import org.apache.maven.archiva.scheduled.tasks.DatabaseTask; | |||
import org.apache.maven.archiva.scheduled.tasks.RepositoryTask; | |||
import org.codehaus.plexus.spring.PlexusInSpringTestCase; | |||
import org.codehaus.plexus.taskqueue.TaskQueue; | |||
import org.codehaus.plexus.taskqueue.TaskQueueException; | |||
import org.codehaus.plexus.taskqueue.execution.TaskExecutionException; | |||
/** | |||
* NexusIndexerConsumerTest | |||
@@ -40,11 +44,71 @@ import org.codehaus.plexus.taskqueue.TaskQueueException; | |||
public class NexusIndexerConsumerTest | |||
extends PlexusInSpringTestCase | |||
{ | |||
private final class ArchivaTaskSchedulerStub | |||
implements ArchivaTaskScheduler | |||
{ | |||
Set<File> indexed = new HashSet<File>(); | |||
public void startup() | |||
throws ArchivaException | |||
{ | |||
} | |||
public void scheduleDatabaseTasks() | |||
throws TaskExecutionException | |||
{ | |||
} | |||
public void queueRepositoryTask( RepositoryTask task ) | |||
throws TaskQueueException | |||
{ | |||
} | |||
public void queueIndexingTask( ArtifactIndexingTask task ) | |||
throws TaskQueueException | |||
{ | |||
switch ( task.getAction() ) | |||
{ | |||
case ADD: | |||
indexed.add( task.getResourceFile() ); | |||
break; | |||
case DELETE: | |||
indexed.remove( task.getResourceFile() ); | |||
break; | |||
case FINISH: | |||
try | |||
{ | |||
task.getContext().close( false ); | |||
} | |||
catch ( IOException e ) | |||
{ | |||
throw new TaskQueueException( e.getMessage() ); | |||
} | |||
break; | |||
} | |||
} | |||
public void queueDatabaseTask( DatabaseTask task ) | |||
throws TaskQueueException | |||
{ | |||
} | |||
public boolean isProcessingRepositoryTask( String repositoryId ) | |||
{ | |||
return false; | |||
} | |||
public boolean isProcessingDatabaseTask() | |||
{ | |||
return false; | |||
} | |||
} | |||
private KnownRepositoryContentConsumer nexusIndexerConsumer; | |||
private ManagedRepositoryConfiguration repositoryConfig; | |||
private TaskQueue indexingQueue; | |||
private ArchivaTaskSchedulerStub scheduler; | |||
@Override | |||
protected void setUp() | |||
@@ -52,9 +116,7 @@ public class NexusIndexerConsumerTest | |||
{ | |||
super.setUp(); | |||
ArchivaTaskScheduler scheduler = (ArchivaTaskScheduler) lookup( ArchivaTaskScheduler.class ); | |||
indexingQueue = (TaskQueue) lookup( TaskQueue.ROLE, "indexing" ); | |||
scheduler = new ArchivaTaskSchedulerStub(); | |||
nexusIndexerConsumer = new NexusIndexerConsumer( scheduler ); | |||
@@ -97,21 +159,7 @@ public class NexusIndexerConsumerTest | |||
nexusIndexerConsumer.processFile( "org/apache/archiva/archiva-index-methods-jar-test/1.0/archiva-index-methods-jar-test-1.0.jar" ); | |||
nexusIndexerConsumer.completeScan(); | |||
assertTaskQueued( artifactFile ); | |||
} | |||
@SuppressWarnings( "unchecked" ) | |||
private void assertTaskQueued( File artifactFile ) | |||
throws TaskQueueException | |||
{ | |||
List<ArtifactIndexingTask> queue = indexingQueue.getQueueSnapshot(); | |||
assertEquals( 2, queue.size() ); | |||
ArtifactIndexingTask task = | |||
TaskCreator.createIndexingTask( repositoryConfig.getId(), artifactFile, ArtifactIndexingTask.Action.ADD ); | |||
assertEquals( task, queue.get( 0 ) ); | |||
task = TaskCreator.createIndexingTask( repositoryConfig.getId(), null, ArtifactIndexingTask.Action.FINISH ); | |||
assertEquals( task, queue.get( 1 ) ); | |||
assertTrue( scheduler.indexed.contains( artifactFile ) ); | |||
} | |||
public void testIndexerArtifactAlreadyIndexed() | |||
@@ -127,9 +175,7 @@ public class NexusIndexerConsumerTest | |||
nexusIndexerConsumer.processFile( "org/apache/archiva/archiva-index-methods-jar-test/1.0/archiva-index-methods-jar-test-1.0.jar" ); | |||
nexusIndexerConsumer.completeScan(); | |||
assertTaskQueued( artifactFile ); | |||
indexingQueue.take(); | |||
indexingQueue.take(); | |||
assertTrue( scheduler.indexed.contains( artifactFile ) ); | |||
// scan and index again | |||
now = Calendar.getInstance().getTime(); | |||
@@ -137,7 +183,7 @@ public class NexusIndexerConsumerTest | |||
nexusIndexerConsumer.processFile( "org/apache/archiva/archiva-index-methods-jar-test/1.0/archiva-index-methods-jar-test-1.0.jar" ); | |||
nexusIndexerConsumer.completeScan(); | |||
assertTaskQueued( artifactFile ); | |||
assertTrue( scheduler.indexed.contains( artifactFile ) ); | |||
} | |||
public void testIndexerIndexArtifactThenPom() | |||
@@ -153,9 +199,7 @@ public class NexusIndexerConsumerTest | |||
nexusIndexerConsumer.processFile( "org/apache/archiva/archiva-index-methods-jar-test/1.0/archiva-index-methods-jar-test-1.0.jar" ); | |||
nexusIndexerConsumer.completeScan(); | |||
assertTaskQueued( artifactFile ); | |||
indexingQueue.take(); | |||
indexingQueue.take(); | |||
assertTrue( scheduler.indexed.contains( artifactFile ) ); | |||
artifactFile = | |||
new File( repositoryConfig.getLocation(), "org/apache/archiva/archiva-index-methods-jar-test/1.0/pom.xml" ); | |||
@@ -166,7 +210,7 @@ public class NexusIndexerConsumerTest | |||
nexusIndexerConsumer.processFile( "org/apache/archiva/archiva-index-methods-jar-test/1.0/pom.xml" ); | |||
nexusIndexerConsumer.completeScan(); | |||
assertTaskQueued( artifactFile ); | |||
assertTrue( scheduler.indexed.contains( artifactFile ) ); | |||
} | |||
@Override |
@@ -24,7 +24,6 @@ import java.io.IOException; | |||
import org.apache.lucene.document.Document; | |||
import org.apache.lucene.index.IndexReader; | |||
import org.apache.maven.archiva.configuration.ArchivaConfiguration; | |||
import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration; | |||
import org.apache.maven.archiva.scheduled.tasks.ArtifactIndexingTask; | |||
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; | |||
@@ -39,10 +38,7 @@ import org.sonatype.nexus.index.ArtifactContextProducer; | |||
import org.sonatype.nexus.index.ArtifactInfo; | |||
import org.sonatype.nexus.index.DefaultArtifactContextProducer; | |||
import org.sonatype.nexus.index.IndexerEngine; | |||
import org.sonatype.nexus.index.NexusIndexer; | |||
import org.sonatype.nexus.index.context.DefaultIndexingContext; | |||
import org.sonatype.nexus.index.context.IndexingContext; | |||
import org.sonatype.nexus.index.context.UnsupportedExistingLuceneIndexException; | |||
import org.sonatype.nexus.index.packer.IndexPacker; | |||
import org.sonatype.nexus.index.packer.IndexPackingRequest; | |||
@@ -51,6 +47,7 @@ import org.sonatype.nexus.index.packer.IndexPackingRequest; | |||
* all performed by this executor. Add and update artifact in index tasks are added in the indexing task queue by the | |||
* NexusIndexerConsumer while remove artifact from index tasks are added by the LuceneCleanupRemoveIndexedConsumer. | |||
* | |||
* @todo Nexus specifics shouldn't be in the archiva-scheduled module | |||
* @plexus.component role="org.codehaus.plexus.taskqueue.execution.TaskExecutor" role-hint="indexing" | |||
* instantiation-strategy="singleton" | |||
*/ | |||
@@ -64,11 +61,6 @@ public class ArchivaIndexingTaskExecutor | |||
*/ | |||
private IndexerEngine indexerEngine; | |||
/** | |||
* @plexus.requirement | |||
*/ | |||
private ArchivaConfiguration archivaConfiguration; | |||
/** | |||
* @plexus.requirement | |||
*/ | |||
@@ -83,39 +75,47 @@ public class ArchivaIndexingTaskExecutor | |||
{ | |||
ArtifactIndexingTask indexingTask = (ArtifactIndexingTask) task; | |||
ManagedRepositoryConfiguration repository = | |||
archivaConfiguration.getConfiguration().findManagedRepositoryById( indexingTask.getRepositoryId() ); | |||
String indexDir = repository.getIndexDir(); | |||
File managedRepository = new File( repository.getLocation() ); | |||
File indexDirectory = null; | |||
if ( indexDir != null && !"".equals( indexDir ) ) | |||
{ | |||
indexDirectory = new File( repository.getIndexDir() ); | |||
} | |||
else | |||
{ | |||
indexDirectory = new File( managedRepository, ".indexer" ); | |||
} | |||
ManagedRepositoryConfiguration repository = indexingTask.getRepository(); | |||
IndexingContext context = indexingTask.getContext(); | |||
IndexingContext context = null; | |||
try | |||
if ( ArtifactIndexingTask.Action.FINISH.equals( indexingTask.getAction() ) ) | |||
{ | |||
context = | |||
new DefaultIndexingContext( repository.getId(), repository.getId(), managedRepository, | |||
indexDirectory, null, null, NexusIndexer.FULL_INDEX, false ); | |||
context.setSearchable( repository.isScanned() ); | |||
if ( ArtifactIndexingTask.Action.FINISH.equals( indexingTask.getAction() ) ) | |||
try | |||
{ | |||
context.optimize(); | |||
File managedRepository = new File( repository.getLocation() ); | |||
final File indexLocation = new File( managedRepository, ".index" ); | |||
IndexPackingRequest request = new IndexPackingRequest( context, indexLocation ); | |||
indexPacker.packIndex( request ); | |||
log.debug( "Index file packaged at '" + indexLocation.getPath() + "'." ); | |||
} | |||
else | |||
catch ( IOException e ) | |||
{ | |||
log.error( "Error occurred while executing indexing task '" + indexingTask + "'" ); | |||
throw new TaskExecutionException( "Error occurred while executing indexing task '" + indexingTask | |||
+ "'" ); | |||
} | |||
finally | |||
{ | |||
if ( context != null ) | |||
{ | |||
try | |||
{ | |||
context.close( false ); | |||
} | |||
catch ( IOException e ) | |||
{ | |||
log.error( "Error occurred while closing context: " + e.getMessage() ); | |||
throw new TaskExecutionException( "Error occurred while closing context: " + e.getMessage() ); | |||
} | |||
} | |||
} | |||
} | |||
else | |||
{ | |||
try | |||
{ | |||
File artifactFile = indexingTask.getResourceFile(); | |||
ArtifactContext ac = artifactContextProducer.getArtifactContext( context, artifactFile ); | |||
@@ -144,47 +144,28 @@ public class ArchivaIndexingTaskExecutor | |||
{ | |||
log.debug( "Adding artifact '" + ac.getArtifactInfo() + "' to index.." ); | |||
indexerEngine.index( context, ac ); | |||
context.optimize(); | |||
context.getIndexWriter().commit(); | |||
} | |||
else | |||
{ | |||
log.debug( "Updating artifact '" + ac.getArtifactInfo() + "' in index.." ); | |||
indexerEngine.update( context, ac ); | |||
context.optimize(); | |||
context.getIndexWriter().commit(); | |||
} | |||
} | |||
else | |||
{ | |||
log.debug( "Removing artifact '" + ac.getArtifactInfo() + "' from index.." ); | |||
indexerEngine.remove( context, ac ); | |||
context.optimize(); | |||
context.getIndexWriter().commit(); | |||
} | |||
} | |||
} | |||
} | |||
catch ( IOException e ) | |||
{ | |||
log.error( "Error occurred while executing indexing task '" + indexingTask + "'" ); | |||
throw new TaskExecutionException( "Error occurred while executing indexing task '" + indexingTask + "'" ); | |||
} | |||
catch ( UnsupportedExistingLuceneIndexException e ) | |||
{ | |||
log.error( "Unsupported Lucene index format: " + e.getMessage() ); | |||
throw new TaskExecutionException( "Unsupported Lucene index format: " + e.getMessage() ); | |||
} | |||
finally | |||
{ | |||
if ( context != null ) | |||
catch ( IOException e ) | |||
{ | |||
try | |||
{ | |||
context.close( false ); | |||
} | |||
catch ( IOException e ) | |||
{ | |||
log.error( "Error occurred while closing context: " + e.getMessage() ); | |||
throw new TaskExecutionException( "Error occurred while closing context: " + e.getMessage() ); | |||
} | |||
log.error( "Error occurred while executing indexing task '" + indexingTask + "'" ); | |||
throw new TaskExecutionException( "Error occurred while executing indexing task '" + indexingTask | |||
+ "'" ); | |||
} | |||
} | |||
} | |||
@@ -207,10 +188,4 @@ public class ArchivaIndexingTaskExecutor | |||
{ | |||
this.indexPacker = indexPacker; | |||
} | |||
public void setArchivaConfiguration( ArchivaConfiguration archivaConfiguration ) | |||
{ | |||
this.archivaConfiguration = archivaConfiguration; | |||
} | |||
} |
@@ -21,27 +21,33 @@ package org.apache.maven.archiva.scheduled.tasks; | |||
import java.io.File; | |||
import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration; | |||
import org.codehaus.plexus.taskqueue.Task; | |||
import org.sonatype.nexus.index.context.IndexingContext; | |||
public class ArtifactIndexingTask | |||
implements Task | |||
{ | |||
public enum Action { ADD, DELETE, FINISH } | |||
private String repositoryId; | |||
private File resourceFile; | |||
private Action action; | |||
public String getRepositoryId() | |||
public enum Action | |||
{ | |||
return repositoryId; | |||
ADD, DELETE, FINISH | |||
} | |||
public void setRepositoryId( String repositoryId ) | |||
private final ManagedRepositoryConfiguration repository; | |||
private final File resourceFile; | |||
private final Action action; | |||
private final IndexingContext context; | |||
public ArtifactIndexingTask( ManagedRepositoryConfiguration repository, File resourceFile, Action action, | |||
IndexingContext context ) | |||
{ | |||
this.repositoryId = repositoryId; | |||
this.repository = repository; | |||
this.resourceFile = resourceFile; | |||
this.action = action; | |||
this.context = context; | |||
} | |||
public long getMaxExecutionTime() | |||
@@ -54,26 +60,26 @@ public class ArtifactIndexingTask | |||
return resourceFile; | |||
} | |||
public void setResourceFile( File resourceFile ) | |||
public Action getAction() | |||
{ | |||
this.resourceFile = resourceFile; | |||
return action; | |||
} | |||
public Action getAction() | |||
@Override | |||
public String toString() | |||
{ | |||
return action; | |||
return "ArtifactIndexingTask [action=" + action + ", repositoryId=" + repository.getId() + ", resourceFile=" | |||
+ resourceFile + "]"; | |||
} | |||
public void setAction( Action action ) | |||
public ManagedRepositoryConfiguration getRepository() | |||
{ | |||
this.action = action; | |||
return repository; | |||
} | |||
@Override | |||
public String toString() | |||
public IndexingContext getContext() | |||
{ | |||
return "ArtifactIndexingTask [action=" + action + ", repositoryId=" + repositoryId + ", resourceFile=" | |||
+ resourceFile + "]"; | |||
return context; | |||
} | |||
@Override | |||
@@ -81,8 +87,8 @@ public class ArtifactIndexingTask | |||
{ | |||
final int prime = 31; | |||
int result = 1; | |||
result = prime * result + ( ( action == null ) ? 0 : action.hashCode() ); | |||
result = prime * result + ( ( repositoryId == null ) ? 0 : repositoryId.hashCode() ); | |||
result = prime * result + action.hashCode(); | |||
result = prime * result + repository.getId().hashCode(); | |||
result = prime * result + ( ( resourceFile == null ) ? 0 : resourceFile.hashCode() ); | |||
return result; | |||
} | |||
@@ -97,19 +103,9 @@ public class ArtifactIndexingTask | |||
if ( getClass() != obj.getClass() ) | |||
return false; | |||
ArtifactIndexingTask other = (ArtifactIndexingTask) obj; | |||
if ( action == null ) | |||
{ | |||
if ( other.action != null ) | |||
return false; | |||
} | |||
else if ( !action.equals( other.action ) ) | |||
if ( !action.equals( other.action ) ) | |||
return false; | |||
if ( repositoryId == null ) | |||
{ | |||
if ( other.repositoryId != null ) | |||
return false; | |||
} | |||
else if ( !repositoryId.equals( other.repositoryId ) ) | |||
if ( !repository.getId().equals( other.repository.getId() ) ) | |||
return false; | |||
if ( resourceFile == null ) | |||
{ |
@@ -20,9 +20,17 @@ package org.apache.maven.archiva.scheduled.tasks; | |||
*/ | |||
import java.io.File; | |||
import java.io.IOException; | |||
import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration; | |||
import org.sonatype.nexus.index.NexusIndexer; | |||
import org.sonatype.nexus.index.context.DefaultIndexingContext; | |||
import org.sonatype.nexus.index.context.IndexingContext; | |||
import org.sonatype.nexus.index.context.UnsupportedExistingLuceneIndexException; | |||
/** | |||
* TaskCreator Convenience class for creating Archiva tasks. | |||
* @todo Nexus specifics shouldn't be in the archiva-scheduled module | |||
*/ | |||
public class TaskCreator | |||
{ | |||
@@ -60,15 +68,33 @@ public class TaskCreator | |||
return task; | |||
} | |||
public static ArtifactIndexingTask createIndexingTask( String repositoryId, File resource, | |||
ArtifactIndexingTask.Action action ) | |||
public static ArtifactIndexingTask createIndexingTask( ManagedRepositoryConfiguration repository, File resource, | |||
ArtifactIndexingTask.Action action, IndexingContext context ) | |||
{ | |||
ArtifactIndexingTask task = new ArtifactIndexingTask(); | |||
task.setRepositoryId( repositoryId ); | |||
task.setAction( action ); | |||
task.setResourceFile( resource ); | |||
return new ArtifactIndexingTask( repository, resource, action, context ); | |||
} | |||
return task; | |||
public static IndexingContext createContext( ManagedRepositoryConfiguration repository ) | |||
throws IOException, UnsupportedExistingLuceneIndexException | |||
{ | |||
String indexDir = repository.getIndexDir(); | |||
File managedRepository = new File( repository.getLocation() ); | |||
File indexDirectory = null; | |||
if ( indexDir != null && !"".equals( indexDir ) ) | |||
{ | |||
indexDirectory = new File( repository.getIndexDir() ); | |||
} | |||
else | |||
{ | |||
indexDirectory = new File( managedRepository, ".indexer" ); | |||
} | |||
IndexingContext context = | |||
new DefaultIndexingContext( repository.getId(), repository.getId(), managedRepository, indexDirectory, | |||
null, null, NexusIndexer.FULL_INDEX, false ); | |||
context.setSearchable( repository.isScanned() ); | |||
return context; | |||
} | |||
} |
@@ -35,13 +35,11 @@ import org.apache.lucene.search.BooleanQuery; | |||
import org.apache.lucene.search.IndexSearcher; | |||
import org.apache.lucene.search.TopDocs; | |||
import org.apache.lucene.search.BooleanClause.Occur; | |||
import org.apache.maven.archiva.configuration.ArchivaConfiguration; | |||
import org.apache.maven.archiva.configuration.Configuration; | |||
import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration; | |||
import org.apache.maven.archiva.scheduled.tasks.ArtifactIndexingTask; | |||
import org.apache.maven.archiva.scheduled.tasks.TaskCreator; | |||
import org.codehaus.plexus.spring.PlexusInSpringTestCase; | |||
import org.easymock.MockControl; | |||
import org.sonatype.nexus.index.ArtifactInfo; | |||
import org.sonatype.nexus.index.FlatSearchRequest; | |||
import org.sonatype.nexus.index.FlatSearchResponse; | |||
@@ -62,16 +60,14 @@ public class ArchivaIndexingTaskExecutorTest | |||
private IndexPacker indexPacker; | |||
private MockControl archivaConfigControl; | |||
private ArchivaConfiguration archivaConfiguration; | |||
private ManagedRepositoryConfiguration repositoryConfig; | |||
private Configuration configuration; | |||
private NexusIndexer indexer; | |||
private IndexingContext context; | |||
protected void setUp() | |||
throws Exception | |||
{ | |||
@@ -92,21 +88,21 @@ public class ArchivaIndexingTaskExecutorTest | |||
configuration = new Configuration(); | |||
configuration.addManagedRepository( repositoryConfig ); | |||
archivaConfigControl = MockControl.createControl( ArchivaConfiguration.class ); | |||
archivaConfiguration = (ArchivaConfiguration) archivaConfigControl.getMock(); | |||
indexer = (NexusIndexer) lookup( NexusIndexer.class ); | |||
indexerEngine = (IndexerEngine) lookup( IndexerEngine.class ); | |||
indexPacker = (IndexPacker) lookup( IndexPacker.class ); | |||
indexingExecutor.setIndexerEngine( indexerEngine ); | |||
indexingExecutor.setIndexPacker( indexPacker ); | |||
indexingExecutor.setArchivaConfiguration( archivaConfiguration ); | |||
context = TaskCreator.createContext( repositoryConfig ); | |||
} | |||
protected void tearDown() | |||
throws Exception | |||
{ | |||
context.close( false ); | |||
// delete created index in the repository | |||
File indexDir = new File( repositoryConfig.getLocation(), ".indexer" ); | |||
FileUtils.deleteDirectory( indexDir ); | |||
@@ -127,16 +123,10 @@ public class ArchivaIndexingTaskExecutorTest | |||
"org/apache/archiva/archiva-index-methods-jar-test/1.0/archiva-index-methods-jar-test-1.0.jar" ); | |||
ArtifactIndexingTask task = | |||
TaskCreator.createIndexingTask( repositoryConfig.getId(), artifactFile, ArtifactIndexingTask.Action.ADD ); | |||
archivaConfigControl.expectAndReturn( archivaConfiguration.getConfiguration(), configuration ); | |||
archivaConfigControl.replay(); | |||
TaskCreator.createIndexingTask( repositoryConfig, artifactFile, ArtifactIndexingTask.Action.ADD, context ); | |||
indexingExecutor.executeTask( task ); | |||
archivaConfigControl.verify(); | |||
BooleanQuery q = new BooleanQuery(); | |||
q.add( indexer.constructQuery( ArtifactInfo.GROUP_ID, "org.apache.archiva" ), Occur.SHOULD ); | |||
q.add( indexer.constructQuery( ArtifactInfo.ARTIFACT_ID, "archiva-index-methods-jar-test" ), Occur.SHOULD ); | |||
@@ -171,17 +161,11 @@ public class ArchivaIndexingTaskExecutorTest | |||
"org/apache/archiva/archiva-index-methods-jar-test/1.0/archiva-index-methods-jar-test-1.0.jar" ); | |||
ArtifactIndexingTask task = | |||
TaskCreator.createIndexingTask( repositoryConfig.getId(), artifactFile, ArtifactIndexingTask.Action.ADD ); | |||
archivaConfigControl.expectAndReturn( archivaConfiguration.getConfiguration(), configuration, 2 ); | |||
archivaConfigControl.replay(); | |||
TaskCreator.createIndexingTask( repositoryConfig, artifactFile, ArtifactIndexingTask.Action.ADD, context ); | |||
indexingExecutor.executeTask( task ); | |||
indexingExecutor.executeTask( task ); | |||
archivaConfigControl.verify(); | |||
BooleanQuery q = new BooleanQuery(); | |||
q.add( indexer.constructQuery( ArtifactInfo.GROUP_ID, "org.apache.archiva" ), Occur.SHOULD ); | |||
q.add( indexer.constructQuery( ArtifactInfo.ARTIFACT_ID, "archiva-index-methods-jar-test" ), Occur.SHOULD ); | |||
@@ -204,18 +188,9 @@ public class ArchivaIndexingTaskExecutorTest | |||
"org/apache/archiva/archiva-index-methods-jar-test/1.0/archiva-index-methods-jar-test-1.0.jar" ); | |||
ArtifactIndexingTask task = | |||
TaskCreator.createIndexingTask( repositoryConfig.getId(), artifactFile, ArtifactIndexingTask.Action.ADD ); | |||
archivaConfigControl.expectAndReturn( archivaConfiguration.getConfiguration(), configuration, 3 ); | |||
archivaConfigControl.replay(); | |||
TaskCreator.createIndexingTask( repositoryConfig, artifactFile, ArtifactIndexingTask.Action.ADD, context ); | |||
// add artifact to index | |||
indexingExecutor.executeTask( task ); | |||
task = TaskCreator.createIndexingTask( repositoryConfig.getId(), artifactFile, ArtifactIndexingTask.Action.FINISH ); | |||
// add artifact to index | |||
// remove artifact from index | |||
indexingExecutor.executeTask( task ); | |||
BooleanQuery q = new BooleanQuery(); | |||
@@ -226,16 +201,21 @@ public class ArchivaIndexingTaskExecutorTest | |||
TopDocs topDocs = searcher.search( q, null, 10 ); | |||
assertTrue( new File( repositoryConfig.getLocation(), ".indexer" ).exists() ); | |||
assertTrue( new File( repositoryConfig.getLocation(), ".index" ).exists() ); | |||
assertFalse( new File( repositoryConfig.getLocation(), ".index" ).exists() ); | |||
// should return 1 hit | |||
assertEquals( 1, topDocs.totalHits ); | |||
context = TaskCreator.createContext( repositoryConfig ); | |||
// remove added artifact from index | |||
task = TaskCreator.createIndexingTask( repositoryConfig.getId(), artifactFile, ArtifactIndexingTask.Action.DELETE ); | |||
task = | |||
TaskCreator.createIndexingTask( repositoryConfig, artifactFile, ArtifactIndexingTask.Action.DELETE, context ); | |||
indexingExecutor.executeTask( task ); | |||
archivaConfigControl.verify(); | |||
task = | |||
TaskCreator.createIndexingTask( repositoryConfig, artifactFile, ArtifactIndexingTask.Action.FINISH, context ); | |||
indexingExecutor.executeTask( task ); | |||
q = new BooleanQuery(); | |||
q.add( indexer.constructQuery( ArtifactInfo.GROUP_ID, "org.apache.archiva" ), Occur.SHOULD ); | |||
@@ -249,7 +229,7 @@ public class ArchivaIndexingTaskExecutorTest | |||
// artifact should have been removed from the index! | |||
assertEquals( 0, topDocs.totalHits ); | |||
// TODO: test it was removed from the packaged index also | |||
} | |||
@@ -261,28 +241,15 @@ public class ArchivaIndexingTaskExecutorTest | |||
"org/apache/archiva/archiva-index-methods-jar-test/1.0/archiva-index-methods-jar-test-1.0.jar" ); | |||
ArtifactIndexingTask task = | |||
TaskCreator.createIndexingTask( repositoryConfig.getId(), artifactFile, ArtifactIndexingTask.Action.ADD ); | |||
archivaConfigControl.expectAndReturn( archivaConfiguration.getConfiguration(), configuration ); | |||
archivaConfigControl.replay(); | |||
TaskCreator.createIndexingTask( repositoryConfig, artifactFile, ArtifactIndexingTask.Action.ADD, context ); | |||
indexingExecutor.executeTask( task ); | |||
archivaConfigControl.verify(); | |||
archivaConfigControl.reset(); | |||
task = TaskCreator.createIndexingTask( repositoryConfig.getId(), artifactFile, ArtifactIndexingTask.Action.FINISH ); | |||
archivaConfigControl.expectAndReturn( archivaConfiguration.getConfiguration(), configuration ); | |||
archivaConfigControl.replay(); | |||
task = | |||
TaskCreator.createIndexingTask( repositoryConfig, artifactFile, ArtifactIndexingTask.Action.FINISH, context ); | |||
indexingExecutor.executeTask( task ); | |||
archivaConfigControl.verify(); | |||
assertTrue( new File( repositoryConfig.getLocation(), ".indexer" ).exists() ); | |||
assertTrue( new File( repositoryConfig.getLocation(), ".index" ).exists() ); | |||
@@ -84,17 +84,6 @@ public class TaskCreatorTest | |||
assertFalse( task.isUpdateRelatedArtifacts() ); | |||
} | |||
public void testCreateIndexingTask() | |||
throws Exception | |||
{ | |||
File resource = new File( getBasedir(), "target/test-classes/test.jar" ); | |||
ArtifactIndexingTask task = TaskCreator.createIndexingTask( REPO_ID, resource, ArtifactIndexingTask.Action.ADD ); | |||
assertEquals( "Incorrect repository id set.", REPO_ID, task.getRepositoryId() ); | |||
assertEquals( "Incorrect action set.", ArtifactIndexingTask.Action.ADD, task.getAction() ); | |||
assertEquals( "Incorrect resource file set.", resource, task.getResourceFile() ); | |||
} | |||
private void assertBasicTaskDetails( RepositoryTask task ) | |||
{ | |||
assertEquals( "Incorrect repository id set.", REPO_ID, task.getRepositoryId() ); |