use of org.apache.maven.index.FlatSearchRequest in project archiva by apache.
the class ArchivaIndexingTaskExecutor method executeTask.
/**
* depending on current {@link Task} you have.
* If {@link org.apache.archiva.scheduler.indexing.ArtifactIndexingTask.Action#FINISH} && isExecuteOnEntireRepo:
* repository will be scanned.
*
* @param task
* @throws TaskExecutionException
*/
@Override
public void executeTask(Task task) throws TaskExecutionException {
ArtifactIndexingTask indexingTask = (ArtifactIndexingTask) task;
ManagedRepository repository = indexingTask.getRepository();
ArchivaIndexingContext archivaContext = indexingTask.getContext();
IndexingContext context = null;
try {
context = archivaContext.getBaseContext(IndexingContext.class);
} catch (UnsupportedBaseContextException e) {
throw new TaskExecutionException("Bad repository type.", e);
}
if (ArtifactIndexingTask.Action.FINISH.equals(indexingTask.getAction()) && indexingTask.isExecuteOnEntireRepo()) {
long start = System.currentTimeMillis();
try {
context.updateTimestamp();
DefaultScannerListener listener = new DefaultScannerListener(context, indexerEngine, true, null);
ScanningRequest request = new ScanningRequest(context, listener);
ScanningResult result = scanner.scan(request);
if (result.hasExceptions()) {
log.error("Exceptions occured during index scan of " + context.getId());
result.getExceptions().stream().map(e -> e.getMessage()).distinct().limit(5).forEach(s -> log.error("Message: " + s));
}
} catch (IOException e) {
log.error("Error during context scan {}: {}", context.getId(), context.getIndexDirectory());
}
long end = System.currentTimeMillis();
log.info("indexed maven repository: {}, onlyUpdate: {}, time {} ms", repository.getId(), indexingTask.isOnlyUpdate(), (end - start));
log.debug("Finishing indexing task on repo: {}", repository.getId());
finishIndexingTask(indexingTask, repository, context);
} else {
// create context if not a repo scan request
if (!indexingTask.isExecuteOnEntireRepo()) {
try {
//
log.debug(//
"Creating indexing context on resource: {}", (indexingTask.getResourceFile() == null ? "none" : indexingTask.getResourceFile()));
archivaContext = repository.getIndexingContext();
context = archivaContext.getBaseContext(IndexingContext.class);
} catch (UnsupportedBaseContextException e) {
log.error("Error occurred while creating context: {}", e.getMessage());
throw new TaskExecutionException("Error occurred while creating context: " + e.getMessage(), e);
}
}
if (context == null || context.getIndexDirectory() == null) {
throw new TaskExecutionException("Trying to index an artifact but the context is already closed");
}
try {
Path artifactFile = indexingTask.getResourceFile();
if (artifactFile == null) {
log.debug("no artifact pass in indexing task so skip it");
} else {
ArtifactContext ac = artifactContextProducer.getArtifactContext(context, artifactFile.toFile());
if (ac != null) {
// TODO make that configurable?
if (artifactFile.getFileName().toString().endsWith(".pom")) {
ac.getArtifactInfo().setFileExtension("pom");
ac.getArtifactInfo().setPackaging("pom");
ac.getArtifactInfo().setClassifier("pom");
}
if (indexingTask.getAction().equals(ArtifactIndexingTask.Action.ADD)) {
// IndexSearcher s = context.getIndexSearcher();
// String uinfo = ac.getArtifactInfo().getUinfo();
// TopDocs d = s.search( new TermQuery( new Term( ArtifactInfo.UINFO, uinfo ) ), 1 );
BooleanQuery.Builder qb = new BooleanQuery.Builder();
qb.add(indexer.constructQuery(MAVEN.GROUP_ID, new SourcedSearchExpression(ac.getArtifactInfo().getGroupId())), BooleanClause.Occur.MUST);
qb.add(indexer.constructQuery(MAVEN.ARTIFACT_ID, new SourcedSearchExpression(ac.getArtifactInfo().getArtifactId())), BooleanClause.Occur.MUST);
qb.add(indexer.constructQuery(MAVEN.VERSION, new SourcedSearchExpression(ac.getArtifactInfo().getVersion())), BooleanClause.Occur.MUST);
if (ac.getArtifactInfo().getClassifier() != null) {
qb.add(indexer.constructQuery(MAVEN.CLASSIFIER, new SourcedSearchExpression(ac.getArtifactInfo().getClassifier())), BooleanClause.Occur.MUST);
}
if (ac.getArtifactInfo().getPackaging() != null) {
qb.add(indexer.constructQuery(MAVEN.PACKAGING, new SourcedSearchExpression(ac.getArtifactInfo().getPackaging())), BooleanClause.Occur.MUST);
}
FlatSearchRequest flatSearchRequest = new FlatSearchRequest(qb.build(), context);
FlatSearchResponse flatSearchResponse = indexer.searchFlat(flatSearchRequest);
if (flatSearchResponse.getResults().isEmpty()) {
log.debug("Adding artifact '{}' to index..", ac.getArtifactInfo());
indexerEngine.index(context, ac);
} else {
log.debug("Updating artifact '{}' in index..", ac.getArtifactInfo());
// TODO check if update exists !!
indexerEngine.update(context, ac);
}
context.updateTimestamp();
context.commit();
} else {
log.debug("Removing artifact '{}' from index..", ac.getArtifactInfo());
indexerEngine.remove(context, ac);
}
}
}
// close the context if not a repo scan request
if (!indexingTask.isExecuteOnEntireRepo()) {
log.debug("Finishing indexing task on resource file : {}", indexingTask.getResourceFile() != null ? indexingTask.getResourceFile() : " none ");
finishIndexingTask(indexingTask, repository, context);
}
} catch (IOException e) {
log.error("Error occurred while executing indexing task '{}': {}", indexingTask, e.getMessage(), e);
throw new TaskExecutionException("Error occurred while executing indexing task '" + indexingTask + "'", e);
}
}
}
use of org.apache.maven.index.FlatSearchRequest in project archiva by apache.
the class ArchivaIndexingTaskExecutorTest method testPackagedIndex.
@Test
public void testPackagedIndex() throws Exception {
Path basePath = repo.getLocalPath();
IndexCreationFeature icf = repo.getFeature(IndexCreationFeature.class).get();
Path packedIndexDirectory = icf.getLocalPackedIndexPath();
Path indexerDirectory = icf.getLocalIndexPath();
Files.list(packedIndexDirectory).filter(path -> path.getFileName().toString().startsWith("nexus-maven-repository-index")).forEach(path -> {
try {
System.err.println("Deleting " + path);
Files.delete(path);
} catch (IOException e) {
e.printStackTrace();
}
});
Path artifactFile = basePath.resolve("org/apache/archiva/archiva-index-methods-jar-test/1.0/archiva-index-methods-jar-test-1.0.jar");
ArtifactIndexingTask task = new ArtifactIndexingTask(repo, artifactFile, ArtifactIndexingTask.Action.ADD, repo.getIndexingContext());
task.setExecuteOnEntireRepo(false);
indexingExecutor.executeTask(task);
task = new ArtifactIndexingTask(repo, null, ArtifactIndexingTask.Action.FINISH, repo.getIndexingContext());
task.setExecuteOnEntireRepo(false);
indexingExecutor.executeTask(task);
assertTrue(Files.exists(packedIndexDirectory));
assertTrue(Files.exists(indexerDirectory));
// test packed index file creation
// no more zip
// Assertions.assertThat(new File( indexerDirectory, "nexus-maven-repository-index.zip" )).exists();
Assertions.assertThat(Files.exists(packedIndexDirectory.resolve("nexus-maven-repository-index.properties")));
Assertions.assertThat(Files.exists(packedIndexDirectory.resolve("nexus-maven-repository-index.gz")));
assertFalse(Files.exists(packedIndexDirectory.resolve("nexus-maven-repository-index.1.gz")));
// unpack .zip index
// unzipIndex( indexerDirectory.getPath(), destDir.getPath() );
DefaultIndexUpdater.FileFetcher fetcher = new DefaultIndexUpdater.FileFetcher(packedIndexDirectory.toFile());
IndexUpdateRequest updateRequest = new IndexUpdateRequest(getIndexingContext(), fetcher);
// updateRequest.setLocalIndexCacheDir( indexerDirectory );
indexUpdater.fetchAndUpdateIndex(updateRequest);
BooleanQuery.Builder qb = new BooleanQuery.Builder();
qb.add(indexer.constructQuery(MAVEN.GROUP_ID, new StringSearchExpression("org.apache.archiva")), BooleanClause.Occur.SHOULD);
qb.add(indexer.constructQuery(MAVEN.ARTIFACT_ID, new StringSearchExpression("archiva-index-methods-jar-test")), BooleanClause.Occur.SHOULD);
FlatSearchRequest request = new FlatSearchRequest(qb.build(), getIndexingContext());
FlatSearchResponse response = indexer.searchFlat(request);
assertEquals(1, response.getTotalHitsCount());
Set<ArtifactInfo> results = response.getResults();
ArtifactInfo artifactInfo = results.iterator().next();
assertEquals("org.apache.archiva", artifactInfo.getGroupId());
assertEquals("archiva-index-methods-jar-test", artifactInfo.getArtifactId());
assertEquals("test-repo", artifactInfo.getRepository());
}
use of org.apache.maven.index.FlatSearchRequest in project archiva by apache.
the class MavenRepositorySearch method search.
private SearchResults search(SearchResultLimits limits, BooleanQuery q, List<String> indexingContextIds, List<? extends ArtifactInfoFilter> filters, List<String> selectedRepos, boolean includePoms) throws RepositorySearchException {
try {
FlatSearchRequest request = new FlatSearchRequest(q);
request.setContexts(getIndexingContexts(indexingContextIds));
if (limits != null) {
// we apply limits only when first page asked
if (limits.getSelectedPage() == 0) {
request.setCount(limits.getPageSize() * (Math.max(1, limits.getSelectedPage())));
}
}
FlatSearchResponse response = indexer.searchFlat(request);
if (response == null || response.getTotalHitsCount() == 0) {
SearchResults results = new SearchResults();
results.setLimits(limits);
return results;
}
return convertToSearchResults(response, limits, filters, selectedRepos, includePoms);
} catch (IOException e) {
throw new RepositorySearchException(e.getMessage(), e);
} catch (RepositoryAdminException e) {
throw new RepositorySearchException(e.getMessage(), e);
}
}
use of org.apache.maven.index.FlatSearchRequest in project archiva by apache.
the class ArchivaIndexingTaskExecutorTest method testAddArtifactToIndex.
@Test
public void testAddArtifactToIndex() throws Exception {
Path basePath = repo.getLocalPath();
Path artifactFile = basePath.resolve("org/apache/archiva/archiva-index-methods-jar-test/1.0/archiva-index-methods-jar-test-1.0.jar");
ArtifactIndexingTask task = new ArtifactIndexingTask(repo, artifactFile, ArtifactIndexingTask.Action.ADD, repo.getIndexingContext());
indexingExecutor.executeTask(task);
task = new ArtifactIndexingTask(repo, null, ArtifactIndexingTask.Action.FINISH, repo.getIndexingContext());
indexingExecutor.executeTask(task);
BooleanQuery.Builder queryBuilder = new BooleanQuery.Builder();
queryBuilder.add(indexer.constructQuery(MAVEN.GROUP_ID, new StringSearchExpression("org.apache.archiva")), BooleanClause.Occur.SHOULD);
queryBuilder.add(indexer.constructQuery(MAVEN.ARTIFACT_ID, new StringSearchExpression("archiva-index-methods-jar-test")), BooleanClause.Occur.SHOULD);
BooleanQuery q = queryBuilder.build();
FlatSearchRequest request = new FlatSearchRequest(q, getIndexingContext());
FlatSearchResponse response = indexer.searchFlat(request);
assertTrue(Files.exists(basePath.resolve(".indexer")));
assertTrue(Files.exists(basePath.resolve(".index")));
assertEquals(1, response.getTotalHitsCount());
Set<ArtifactInfo> results = response.getResults();
ArtifactInfo artifactInfo = results.iterator().next();
assertEquals("org.apache.archiva", artifactInfo.getGroupId());
assertEquals("archiva-index-methods-jar-test", artifactInfo.getArtifactId());
assertEquals("test-repo", artifactInfo.getRepository());
}
use of org.apache.maven.index.FlatSearchRequest in project archiva by apache.
the class ArchivaIndexingTaskExecutorTest method testRemoveArtifactFromIndex.
@Test
public void testRemoveArtifactFromIndex() throws Exception {
Path basePath = repo.getLocalPath();
Path artifactFile = basePath.resolve("org/apache/archiva/archiva-index-methods-jar-test/1.0/archiva-index-methods-jar-test-1.0.jar");
ArtifactIndexingTask task = new ArtifactIndexingTask(repo, artifactFile, ArtifactIndexingTask.Action.ADD, repo.getIndexingContext());
// add artifact to index
indexingExecutor.executeTask(task);
BooleanQuery.Builder qb = new BooleanQuery.Builder();
qb.add(indexer.constructQuery(MAVEN.GROUP_ID, new SourcedSearchExpression("org.apache.archiva")), BooleanClause.Occur.SHOULD);
// q.add(
// indexer.constructQuery( MAVEN.ARTIFACT_ID, new SourcedSearchExpression( "archiva-index-methods-jar-test" ) ),
// Occur.SHOULD );
IndexingContext ctx = repo.getIndexingContext().getBaseContext(IndexingContext.class);
FlatSearchRequest flatSearchRequest = new FlatSearchRequest(qb.build(), ctx);
FlatSearchResponse response = indexer.searchFlat(flatSearchRequest);
assertTrue(Files.exists(basePath.resolve(".indexer")));
assertTrue(Files.exists(basePath.resolve(".index")));
// should return 1 hit
assertEquals(1, response.getTotalHitsCount());
// remove added artifact from index
task = new ArtifactIndexingTask(repo, artifactFile, ArtifactIndexingTask.Action.DELETE, repo.getIndexingContext());
indexingExecutor.executeTask(task);
task = new ArtifactIndexingTask(repo, artifactFile, ArtifactIndexingTask.Action.FINISH, repo.getIndexingContext());
indexingExecutor.executeTask(task);
qb = new BooleanQuery.Builder();
qb.add(indexer.constructQuery(MAVEN.GROUP_ID, new SourcedSearchExpression("org.apache.archiva")), BooleanClause.Occur.SHOULD);
qb.add(indexer.constructQuery(MAVEN.ARTIFACT_ID, new SourcedSearchExpression("archiva-index-methods-jar-test")), BooleanClause.Occur.SHOULD);
assertTrue(Files.exists(basePath.resolve(".indexer")));
assertTrue(Files.exists(basePath.resolve(".index")));
flatSearchRequest = new FlatSearchRequest(qb.build(), getIndexingContext());
response = indexer.searchFlat(flatSearchRequest);
// artifact should have been removed from the index!
// .totalHits );
assertEquals(0, response.getTotalHitsCount());
// TODO: test it was removed from the packaged index also
}
Aggregations