aboutsummaryrefslogtreecommitdiffstats
path: root/archiva-base
diff options
context:
space:
mode:
authorJoakim Erdfelt <joakime@apache.org>2007-05-25 18:33:59 +0000
committerJoakim Erdfelt <joakime@apache.org>2007-05-25 18:33:59 +0000
commitbf565c3f3a5d59112794a9db994d00c9dc800f49 (patch)
tree09a208237243dc0c98cf0502528aca2bd3651336 /archiva-base
parent5a681a15c90ba8948f5f60fe994e0d6b22077c91 (diff)
downloadarchiva-bf565c3f3a5d59112794a9db994d00c9dc800f49.tar.gz
archiva-bf565c3f3a5d59112794a9db994d00c9dc800f49.zip
[MRM-331]: Finding an Artifact gives an HTTP 500
git-svn-id: https://svn.apache.org/repos/asf/maven/archiva/trunk@541744 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'archiva-base')
-rw-r--r--archiva-base/archiva-consumers/archiva-lucene-consumers/src/main/java/org/apache/maven/archiva/consumers/lucene/IndexArtifactConsumer.java141
1 files changed, 131 insertions, 10 deletions
diff --git a/archiva-base/archiva-consumers/archiva-lucene-consumers/src/main/java/org/apache/maven/archiva/consumers/lucene/IndexArtifactConsumer.java b/archiva-base/archiva-consumers/archiva-lucene-consumers/src/main/java/org/apache/maven/archiva/consumers/lucene/IndexArtifactConsumer.java
index 1038cb372..6f9ecff45 100644
--- a/archiva-base/archiva-consumers/archiva-lucene-consumers/src/main/java/org/apache/maven/archiva/consumers/lucene/IndexArtifactConsumer.java
+++ b/archiva-base/archiva-consumers/archiva-lucene-consumers/src/main/java/org/apache/maven/archiva/consumers/lucene/IndexArtifactConsumer.java
@@ -19,12 +19,30 @@ package org.apache.maven.archiva.consumers.lucene;
* under the License.
*/
+import org.apache.commons.lang.StringUtils;
+import org.apache.maven.archiva.configuration.ArchivaConfiguration;
+import org.apache.maven.archiva.configuration.ConfigurationNames;
+import org.apache.maven.archiva.configuration.RepositoryConfiguration;
import org.apache.maven.archiva.consumers.AbstractMonitoredConsumer;
import org.apache.maven.archiva.consumers.ConsumerException;
import org.apache.maven.archiva.consumers.DatabaseUnprocessedArtifactConsumer;
+import org.apache.maven.archiva.indexer.RepositoryContentIndex;
+import org.apache.maven.archiva.indexer.RepositoryContentIndexFactory;
+import org.apache.maven.archiva.indexer.RepositoryIndexException;
+import org.apache.maven.archiva.indexer.hashcodes.HashcodesRecord;
import org.apache.maven.archiva.model.ArchivaArtifact;
-
+import org.apache.maven.archiva.model.ArchivaRepository;
+import org.apache.maven.archiva.repository.ArchivaConfigurationAdaptor;
+import org.apache.maven.archiva.repository.layout.BidirectionalRepositoryLayout;
+import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
+import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
+import org.codehaus.plexus.registry.Registry;
+import org.codehaus.plexus.registry.RegistryListener;
+
+import java.util.HashMap;
+import java.util.Iterator;
import java.util.List;
+import java.util.Map;
/**
* IndexArtifactConsumer
@@ -38,41 +56,88 @@ import java.util.List;
*/
public class IndexArtifactConsumer
extends AbstractMonitoredConsumer
- implements DatabaseUnprocessedArtifactConsumer
+ implements DatabaseUnprocessedArtifactConsumer, RegistryListener, Initializable
{
+ private static final String INDEX_ERROR = "indexing_error";
+
/**
* @plexus.configuration default-value="index-artifact"
*/
private String id;
/**
- * @plexus.configuration default-value="Index the artifact details for Full Text Search."
+ * @plexus.configuration default-value="Index the artifact checksums for Find functionality."
*/
private String description;
+
+ /**
+ * @plexus.requirement
+ */
+ private ArchivaConfiguration configuration;
+
+ /**
+ * @plexus.requirement role="org.apache.maven.archiva.repository.layout.BidirectionalRepositoryLayout"
+ */
+ private Map bidirectionalLayoutMap;
+
+ /**
+ * @plexus.requirement role-hint="lucene"
+ */
+ private RepositoryContentIndexFactory indexFactory;
+
+ private Map repositoryMap = new HashMap();
public void beginScan()
{
- // TODO Auto-generated method stub
-
+ /* nothing to do here */
}
public void completeScan()
{
- // TODO Auto-generated method stub
-
+ /* nothing to do here */
}
public List getIncludedTypes()
{
- // TODO Auto-generated method stub
- return null;
+ return null; // TODO: define these as a list of artifacts.
}
public void processArchivaArtifact( ArchivaArtifact artifact )
throws ConsumerException
{
- // TODO Auto-generated method stub
+ HashcodesRecord record = new HashcodesRecord();
+ record.setRepositoryId( artifact.getModel().getRepositoryId() );
+ record.setArtifact( artifact );
+
+ IndexedRepositoryDetails pnl = getIndexedRepositoryDetails( artifact );
+ String artifactPath = pnl.layout.toPath( artifact );
+ record.setFilename( artifactPath );
+
+ try
+ {
+ pnl.index.modifyRecord( record );
+ }
+ catch ( RepositoryIndexException e )
+ {
+ triggerConsumerError( INDEX_ERROR, "Unable to index hashcodes: " + e.getMessage() );
+ }
+ }
+ private IndexedRepositoryDetails getIndexedRepositoryDetails( ArchivaArtifact artifact )
+ {
+ String repoId = artifact.getModel().getRepositoryId();
+ if ( StringUtils.isBlank( repoId ) )
+ {
+ throw new IllegalStateException( "Unable to process artifact [" + artifact
+ + "] as it has no repository id associated with it." );
+ }
+
+ return getIndexedRepositoryDetails( repoId );
+ }
+
+ private IndexedRepositoryDetails getIndexedRepositoryDetails( String id )
+ {
+ return (IndexedRepositoryDetails) this.repositoryMap.get( id );
}
public String getDescription()
@@ -90,4 +155,60 @@ public class IndexArtifactConsumer
return false;
}
+ public void afterConfigurationChange( Registry registry, String propertyName, Object propertyValue )
+ {
+ if ( ConfigurationNames.isRepositories( propertyName ) )
+ {
+ initRepositoryMap();
+ }
+ }
+
+ public void beforeConfigurationChange( Registry registry, String propertyName, Object propertyValue )
+ {
+ /* do nothing */
+ }
+
+ public void initialize()
+ throws InitializationException
+ {
+ initRepositoryMap();
+ configuration.addChangeListener( this );
+ }
+
+ private void initRepositoryMap()
+ {
+ synchronized ( this.repositoryMap )
+ {
+ this.repositoryMap.clear();
+
+ Iterator it = configuration.getConfiguration().getRepositories().iterator();
+ while ( it.hasNext() )
+ {
+ RepositoryConfiguration repoconfig = (RepositoryConfiguration) it.next();
+ if ( !repoconfig.isManaged() )
+ {
+ continue;
+ }
+
+ ArchivaRepository repository = ArchivaConfigurationAdaptor.toArchivaRepository( repoconfig );
+ IndexedRepositoryDetails pnl = new IndexedRepositoryDetails();
+
+ pnl.path = repository.getUrl().getPath();
+ pnl.layout = (BidirectionalRepositoryLayout) this.bidirectionalLayoutMap.get( repoconfig.getLayout() );
+
+ pnl.index = indexFactory.createHashcodeIndex( repository );
+
+ this.repositoryMap.put( repoconfig.getId(), pnl );
+ }
+ }
+ }
+
+ class IndexedRepositoryDetails
+ {
+ public String path;
+
+ public BidirectionalRepositoryLayout layout;
+
+ public RepositoryContentIndex index;
+ }
}