diff options
author | Joakim Erdfelt <joakime@apache.org> | 2007-05-25 18:33:59 +0000 |
---|---|---|
committer | Joakim Erdfelt <joakime@apache.org> | 2007-05-25 18:33:59 +0000 |
commit | bf565c3f3a5d59112794a9db994d00c9dc800f49 (patch) | |
tree | 09a208237243dc0c98cf0502528aca2bd3651336 /archiva-base | |
parent | 5a681a15c90ba8948f5f60fe994e0d6b22077c91 (diff) | |
download | archiva-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.java | 141 |
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; + } } |