package org.carlspring.strongbox.storage.indexing;
import org.carlspring.strongbox.configuration.Configuration;
import org.carlspring.strongbox.configuration.ConfigurationManager;
import org.carlspring.strongbox.repository.RepositoryInitializationException;
import org.carlspring.strongbox.services.ArtifactIndexesService;
import javax.inject.Inject;
import java.io.File;
import java.io.IOException;
import java.util.Map;
import org.apache.maven.index.ArtifactContextProducer;
import org.apache.maven.index.Indexer;
import org.apache.maven.index.Scanner;
import org.apache.maven.index.context.IndexCreator;
import org.apache.maven.index.context.IndexingContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
/**
* @author mtodorov
*/
@Component("repositoryIndexerFactory")
public class RepositoryIndexerFactory
{
private static final Logger logger = LoggerFactory.getLogger(RepositoryIndexerFactory.class);
private IndexerConfiguration indexerConfiguration;
@Inject
private ArtifactIndexesService artifactIndexesService;
@Inject
private ArtifactContextProducer artifactContextProducer;
private Configuration configuration;
@Inject
public RepositoryIndexerFactory(IndexerConfiguration indexerConfiguration,
ConfigurationManager configurationManager)
{
this.indexerConfiguration = indexerConfiguration;
this.configuration = configurationManager.getConfiguration();
}
public RepositoryIndexer createRepositoryIndexer(String storageId,
String repositoryId,
String indexType,
File repositoryBasedir,
File indexDir)
throws RepositoryInitializationException
{
IndexingContext indexingContext;
try
{
indexingContext = createIndexingContext(storageId, repositoryId, indexType, repositoryBasedir, indexDir);
}
catch (IOException e)
{
logger.error(e.getMessage(), e);
throw new RepositoryInitializationException(e.getMessage(), e);
}
RepositoryIndexer repositoryIndexer = new RepositoryIndexer(storageId + ":" + repositoryId + ":" + indexType);
repositoryIndexer.setStorageId(storageId);
repositoryIndexer.setRepositoryId(repositoryId);
repositoryIndexer.setRepositoryBasedir(repositoryBasedir);
repositoryIndexer.setIndexDir(indexDir);
repositoryIndexer.setIndexingContext(indexingContext);
repositoryIndexer.setIndexer(indexerConfiguration.getIndexer());
repositoryIndexer.setScanner(indexerConfiguration.getScanner());
repositoryIndexer.setConfiguration(configuration);
repositoryIndexer.setArtifactContextProducer(artifactContextProducer);
return repositoryIndexer;
}
private IndexingContext createIndexingContext(String storageId,
String repositoryId,
String indexType,
File repositoryBasedir,
File indexDir)
throws IOException
{
return getIndexer().createIndexingContext(storageId + ":" + repositoryId + ":" + indexType,
repositoryId,
repositoryBasedir,
indexDir,
null,
null,
true, // if context should be searched in non-targeted mode.
true, // if indexDirectory is known to contain (or should contain)
// valid Maven Indexer lucene index, and no checks needed to be
// performed, or, if we want to "stomp" over existing index
// (unsafe to do!).
indexerConfiguration.getIndexersAsList());
}
public IndexerConfiguration getIndexerConfiguration()
{
return indexerConfiguration;
}
public void setIndexerConfiguration(IndexerConfiguration indexerConfiguration)
{
this.indexerConfiguration = indexerConfiguration;
}
public Indexer getIndexer()
{
return indexerConfiguration.getIndexer();
}
public Scanner getScanner()
{
return indexerConfiguration.getScanner();
}
public Map<String, IndexCreator> getIndexers()
{
return indexerConfiguration.getIndexers();
}
public Configuration getConfiguration()
{
return configuration;
}
public void setConfiguration(Configuration configuration)
{
this.configuration = configuration;
}
}