Using storageAsset for Index API

This commit is contained in:
Martin Stockhammer 2019-06-22 19:31:49 +02:00
parent 240292077e
commit 380c152114
28 changed files with 467 additions and 312 deletions

View File

@ -21,10 +21,12 @@
import org.apache.archiva.configuration.ManagedRepositoryConfiguration; import org.apache.archiva.configuration.ManagedRepositoryConfiguration;
import org.apache.archiva.configuration.RemoteRepositoryConfiguration; import org.apache.archiva.configuration.RemoteRepositoryConfiguration;
import org.apache.archiva.configuration.RepositoryGroupConfiguration;
import org.apache.archiva.repository.BasicManagedRepository; import org.apache.archiva.repository.BasicManagedRepository;
import org.apache.archiva.repository.BasicRemoteRepository; import org.apache.archiva.repository.BasicRemoteRepository;
import org.apache.archiva.repository.EditableManagedRepository; import org.apache.archiva.repository.EditableManagedRepository;
import org.apache.archiva.repository.EditableRemoteRepository; import org.apache.archiva.repository.EditableRemoteRepository;
import org.apache.archiva.repository.EditableRepositoryGroup;
import org.apache.archiva.repository.ManagedRepository; import org.apache.archiva.repository.ManagedRepository;
import org.apache.archiva.repository.PasswordCredentials; import org.apache.archiva.repository.PasswordCredentials;
import org.apache.archiva.repository.ReleaseScheme; import org.apache.archiva.repository.ReleaseScheme;
@ -32,6 +34,7 @@
import org.apache.archiva.repository.RepositoryCredentials; import org.apache.archiva.repository.RepositoryCredentials;
import org.apache.archiva.repository.RepositoryEvent; import org.apache.archiva.repository.RepositoryEvent;
import org.apache.archiva.repository.RepositoryException; import org.apache.archiva.repository.RepositoryException;
import org.apache.archiva.repository.RepositoryGroup;
import org.apache.archiva.repository.RepositoryProvider; import org.apache.archiva.repository.RepositoryProvider;
import org.apache.archiva.repository.RepositoryType; import org.apache.archiva.repository.RepositoryType;
import org.apache.archiva.repository.features.ArtifactCleanupFeature; import org.apache.archiva.repository.features.ArtifactCleanupFeature;
@ -80,6 +83,13 @@ public EditableRemoteRepository createRemoteInstance( String id, String name )
return new BasicRemoteRepository( id, name, Paths.get("target/remotes") ); return new BasicRemoteRepository( id, name, Paths.get("target/remotes") );
} }
@Override
public EditableRepositoryGroup createRepositoryGroup( String id, String name )
{
return null;
}
@Override @Override
public ManagedRepository createManagedInstance( ManagedRepositoryConfiguration configuration ) throws RepositoryException public ManagedRepository createManagedInstance( ManagedRepositoryConfiguration configuration ) throws RepositoryException
{ {
@ -175,6 +185,18 @@ public void updateRemoteInstance( EditableRemoteRepository remoteRepository, Rem
} }
@Override
public RepositoryGroup createRepositoryGroup( RepositoryGroupConfiguration configuration ) throws RepositoryException
{
return null;
}
@Override
public void updateRepositoryGroupInstance( EditableRepositoryGroup repositoryGroup, RepositoryGroupConfiguration configuration ) throws RepositoryException
{
}
@Override @Override
public ManagedRepositoryConfiguration getManagedConfiguration( ManagedRepository managedRepository ) public ManagedRepositoryConfiguration getManagedConfiguration( ManagedRepository managedRepository )
{ {
@ -201,6 +223,12 @@ public ManagedRepositoryConfiguration getManagedConfiguration( ManagedRepository
return configuration; return configuration;
} }
@Override
public RepositoryGroupConfiguration getRepositoryGroupConfiguration( RepositoryGroup repositoryGroup ) throws RepositoryException
{
return null;
}
@Override @Override
public RemoteRepositoryConfiguration getRemoteConfiguration( RemoteRepository remoteRepository ) public RemoteRepositoryConfiguration getRemoteConfiguration( RemoteRepository remoteRepository )

View File

@ -30,6 +30,7 @@
import org.apache.archiva.metadata.model.facets.AuditEvent; import org.apache.archiva.metadata.model.facets.AuditEvent;
import org.apache.archiva.indexer.merger.MergedRemoteIndexesScheduler; import org.apache.archiva.indexer.merger.MergedRemoteIndexesScheduler;
import org.apache.archiva.repository.RepositoryRegistry; import org.apache.archiva.repository.RepositoryRegistry;
import org.apache.archiva.repository.features.IndexCreationFeature;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -394,7 +395,11 @@ public void setManagedRepositoryAdmin( ManagedRepositoryAdmin managedRepositoryA
private RepositoryGroup convertRepositoryGroupObject( org.apache.archiva.repository.RepositoryGroup group ) { private RepositoryGroup convertRepositoryGroupObject( org.apache.archiva.repository.RepositoryGroup group ) {
RepositoryGroup rg = new RepositoryGroup( group.getId( ), group.getRepositories().stream().map(r -> r.getId()).collect( Collectors.toList()) ); RepositoryGroup rg = new RepositoryGroup( group.getId( ), group.getRepositories().stream().map(r -> r.getId()).collect( Collectors.toList()) );
rg.setMergedIndexPath( group.getMergedIndexPath().getPath() ); if (group.supportsFeature( IndexCreationFeature.class ))
{
IndexCreationFeature indexCreationFeature = group.getFeature( IndexCreationFeature.class ).get();
rg.setMergedIndexPath( indexCreationFeature.getIndexPath().getPath() );
}
rg.setCronExpression( group.getSchedulingDefinition() ); rg.setCronExpression( group.getSchedulingDefinition() );
rg.setMergedIndexTtl( group.getMergedIndexTTL() ); rg.setMergedIndexTtl( group.getMergedIndexTTL() );
return rg; return rg;

View File

@ -40,6 +40,8 @@
import org.apache.archiva.repository.Repository; import org.apache.archiva.repository.Repository;
import org.apache.archiva.repository.RepositoryType; import org.apache.archiva.repository.RepositoryType;
import org.apache.archiva.repository.UnsupportedRepositoryTypeException; import org.apache.archiva.repository.UnsupportedRepositoryTypeException;
import org.apache.archiva.repository.content.FilesystemAsset;
import org.apache.archiva.repository.content.StorageAsset;
import org.apache.archiva.repository.features.IndexCreationFeature; import org.apache.archiva.repository.features.IndexCreationFeature;
import org.apache.archiva.repository.features.RemoteIndexFeature; import org.apache.archiva.repository.features.RemoteIndexFeature;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
@ -477,7 +479,7 @@ public ArchivaIndexingContext move(ArchivaIndexingContext context, Repository re
} }
if (context.supports(IndexingContext.class)) { if (context.supports(IndexingContext.class)) {
try { try {
Path newPath = getIndexPath(repo); StorageAsset newPath = getIndexPath(repo);
IndexingContext ctx = context.getBaseContext(IndexingContext.class); IndexingContext ctx = context.getBaseContext(IndexingContext.class);
Path oldPath = ctx.getIndexDirectoryFile().toPath(); Path oldPath = ctx.getIndexDirectoryFile().toPath();
if (oldPath.equals(newPath)) { if (oldPath.equals(newPath)) {
@ -491,7 +493,7 @@ public ArchivaIndexingContext move(ArchivaIndexingContext context, Repository re
return createContext(repo); return createContext(repo);
} else { } else {
context.close(false); context.close(false);
Files.move(oldPath, newPath); Files.move(oldPath, newPath.getFilePath());
return createContext(repo); return createContext(repo);
} }
} catch (IOException e) { } catch (IOException e) {
@ -517,17 +519,22 @@ public void updateLocalIndexPath(Repository repo) {
} }
} }
private Path getIndexPath(Repository repo) throws IOException { private StorageAsset getIndexPath( Repository repo) throws IOException {
IndexCreationFeature icf = repo.getFeature(IndexCreationFeature.class).get(); IndexCreationFeature icf = repo.getFeature(IndexCreationFeature.class).get();
Path repoDir = repo.getLocalPath(); Path repoDir = repo.getLocalPath();
URI indexDir = icf.getIndexPath(); URI indexDir = icf.getIndexPath();
String indexPath = indexDir.getPath();
Path indexDirectory = null; Path indexDirectory = null;
if ( ! StringUtils.isEmpty(indexDir.toString( ) ) ) if ( ! StringUtils.isEmpty(indexDir.toString( ) ) )
{ {
indexDirectory = PathUtil.getPathFromUri( indexDir ); indexDirectory = PathUtil.getPathFromUri( indexDir );
// not absolute so create it in repository directory // not absolute so create it in repository directory
if ( !indexDirectory.isAbsolute( ) ) if ( indexDirectory.isAbsolute( ) )
{
indexPath = indexDirectory.getFileName().toString();
}
else
{ {
indexDirectory = repoDir.resolve( indexDirectory ); indexDirectory = repoDir.resolve( indexDirectory );
} }
@ -535,13 +542,14 @@ private Path getIndexPath(Repository repo) throws IOException {
else else
{ {
indexDirectory = repoDir.resolve( ".index" ); indexDirectory = repoDir.resolve( ".index" );
indexPath = ".index";
} }
if ( !Files.exists( indexDirectory ) ) if ( !Files.exists( indexDirectory ) )
{ {
Files.createDirectories( indexDirectory ); Files.createDirectories( indexDirectory );
} }
return indexDirectory; return new FilesystemAsset( indexPath, indexDirectory);
} }
private IndexingContext createRemoteContext(RemoteRepository remoteRepository ) throws IOException private IndexingContext createRemoteContext(RemoteRepository remoteRepository ) throws IOException
@ -558,7 +566,7 @@ private IndexingContext createRemoteContext(RemoteRepository remoteRepository )
Files.createDirectories( repoDir ); Files.createDirectories( repoDir );
} }
Path indexDirectory = null; StorageAsset indexDirectory = null;
// is there configured indexDirectory ? // is there configured indexDirectory ?
if ( remoteRepository.supportsFeature( RemoteIndexFeature.class ) ) if ( remoteRepository.supportsFeature( RemoteIndexFeature.class ) )
@ -577,7 +585,7 @@ private IndexingContext createRemoteContext(RemoteRepository remoteRepository )
// delete it first then recreate it. // delete it first then recreate it.
log.warn( "the index of repository {} is too old we have to delete and recreate it", // log.warn( "the index of repository {} is too old we have to delete and recreate it", //
remoteRepository.getId( ) ); remoteRepository.getId( ) );
org.apache.archiva.common.utils.FileUtils.deleteDirectory( indexDirectory ); org.apache.archiva.common.utils.FileUtils.deleteDirectory( indexDirectory.getFilePath() );
return getIndexingContext( remoteRepository, contextKey, repoDir, indexDirectory, remoteIndexUrl ); return getIndexingContext( remoteRepository, contextKey, repoDir, indexDirectory, remoteIndexUrl );
} }
@ -588,9 +596,9 @@ private IndexingContext createRemoteContext(RemoteRepository remoteRepository )
} }
} }
private IndexingContext getIndexingContext( Repository repository, String contextKey, Path repoDir, Path indexDirectory, String indexUrl ) throws IOException private IndexingContext getIndexingContext( Repository repository, String contextKey, Path repoDir, StorageAsset indexDirectory, String indexUrl ) throws IOException
{ {
return indexer.createIndexingContext( contextKey, repository.getId( ), repoDir.toFile( ), indexDirectory.toFile( ), return indexer.createIndexingContext( contextKey, repository.getId( ), repoDir.toFile( ), indexDirectory.getFilePath().toFile( ),
repository.getLocation( ) == null ? null : repository.getLocation( ).toString( ), repository.getLocation( ) == null ? null : repository.getLocation( ).toString( ),
indexUrl, indexUrl,
true, false, true, false,
@ -616,7 +624,7 @@ private IndexingContext createManagedContext( ManagedRepository repository ) thr
} }
} }
Path indexDirectory = null; StorageAsset indexDirectory = null;
if ( repository.supportsFeature( IndexCreationFeature.class ) ) if ( repository.supportsFeature( IndexCreationFeature.class ) )
{ {
@ -634,7 +642,7 @@ private IndexingContext createManagedContext( ManagedRepository repository ) thr
// delete it first then recreate it. // delete it first then recreate it.
log.warn( "the index of repository {} is too old we have to delete and recreate it", // log.warn( "the index of repository {} is too old we have to delete and recreate it", //
repository.getId( ) ); repository.getId( ) );
org.apache.archiva.common.utils.FileUtils.deleteDirectory( indexDirectory ); org.apache.archiva.common.utils.FileUtils.deleteDirectory( indexDirectory.getFilePath() );
context = getIndexingContext( repository, repository.getId( ), repositoryDirectory, indexDirectory, indexUrl ); context = getIndexingContext( repository, repository.getId( ), repositoryDirectory, indexDirectory, indexUrl );
context.setSearchable( repository.isScanned( ) ); context.setSearchable( repository.isScanned( ) );
} }

View File

@ -19,8 +19,8 @@
* under the License. * under the License.
*/ */
import org.apache.archiva.admin.model.beans.RepositoryGroup;
import org.apache.archiva.indexer.merger.MergedRemoteIndexesScheduler; import org.apache.archiva.indexer.merger.MergedRemoteIndexesScheduler;
import org.apache.archiva.repository.RepositoryGroup;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.nio.file.Path; import java.nio.file.Path;

View File

@ -1,128 +0,0 @@
package org.apache.archiva.indexer;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import org.apache.archiva.common.utils.PathUtil;
import org.apache.archiva.repository.Repository;
import org.apache.archiva.repository.RepositoryType;
import org.apache.archiva.repository.features.IndexCreationFeature;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.net.URI;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Collection;
@Service("indexManager#none")
public class GenericIndexManager implements ArchivaIndexManager {
private final Logger log = LoggerFactory.getLogger(GenericIndexManager.class);
public static final String DEFAULT_INDEXER_DIR = ".indexer";
@Override
public void pack(ArchivaIndexingContext context) {
}
@Override
public void scan(ArchivaIndexingContext context) {
}
@Override
public void update(ArchivaIndexingContext context, boolean fullUpdate) {
}
@Override
public void addArtifactsToIndex(ArchivaIndexingContext context, Collection<URI> artifactReference) {
}
@Override
public void removeArtifactsFromIndex(ArchivaIndexingContext context, Collection<URI> artifactReference) {
}
@Override
public boolean supportsRepository(RepositoryType type) {
return false;
}
@Override
public ArchivaIndexingContext createContext(Repository repository) {
return null;
}
@Override
public ArchivaIndexingContext reset(ArchivaIndexingContext context) throws IndexUpdateFailedException {
return null;
}
@Override
public ArchivaIndexingContext move(ArchivaIndexingContext context, Repository repo) throws IndexCreationFailedException {
return null;
}
@Override
public void updateLocalIndexPath(Repository repo) {
if (repo.supportsFeature(IndexCreationFeature.class)) {
IndexCreationFeature icf = repo.getFeature(IndexCreationFeature.class).get();
try {
icf.setLocalIndexPath(getIndexPath(repo));
} catch (IOException e) {
log.error("Could not set local index path for {}. New URI: {}", repo.getId(), icf.getIndexPath());
}
}
}
private Path getIndexPath(Repository repo) throws IOException {
IndexCreationFeature icf = repo.getFeature(IndexCreationFeature.class).get();
Path repoDir = repo.getLocalPath();
URI indexDir = icf.getIndexPath();
Path indexDirectory = null;
if ( ! StringUtils.isEmpty(indexDir.toString( ) ) )
{
indexDirectory = PathUtil.getPathFromUri( indexDir );
// not absolute so create it in repository directory
if ( !indexDirectory.isAbsolute( ) )
{
indexDirectory = repoDir.resolve( indexDirectory );
}
}
else
{
indexDirectory = repoDir.resolve( DEFAULT_INDEXER_DIR);
}
if ( !Files.exists( indexDirectory ) )
{
Files.createDirectories( indexDirectory );
}
return indexDirectory;
}
}

View File

@ -35,7 +35,5 @@ public interface EditableRepositoryGroup extends EditableRepository,RepositoryGr
ManagedRepository removeRepository(String repoId); ManagedRepository removeRepository(String repoId);
void setMergedIndexPath(String path);
void setMergedIndexTTL(int timeInSeconds); void setMergedIndexTTL(int timeInSeconds);
} }

View File

@ -1,4 +1,22 @@
package org.apache.archiva.repository; package org.apache.archiva.repository;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/** /**
* @author Martin Stockhammer <martin_s@apache.org> * @author Martin Stockhammer <martin_s@apache.org>

View File

@ -63,12 +63,6 @@ public interface RepositoryGroup extends Repository, RepositoryStorage {
*/ */
boolean contains(String id); boolean contains(String id);
/**
* Returns the path to the merged index
* @return
*/
StorageAsset getMergedIndexPath();
/** /**
* Returns the time to live in seconds for the merged index. * Returns the time to live in seconds for the merged index.
* *

View File

@ -1,4 +1,22 @@
package org.apache.archiva.repository; package org.apache.archiva.repository;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/** /**
* *

View File

@ -22,6 +22,7 @@
import org.apache.archiva.repository.Repository; import org.apache.archiva.repository.Repository;
import org.apache.archiva.repository.RepositoryEventListener; import org.apache.archiva.repository.RepositoryEventListener;
import org.apache.archiva.repository.content.StorageAsset;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import java.net.URI; import java.net.URI;
@ -44,9 +45,9 @@ public class IndexCreationFeature extends AbstractFeature implements RepositoryF
private URI packedIndexPath; private URI packedIndexPath;
private Path localIndexPath; private StorageAsset localIndexPath;
private Path localPackedIndexPath; private StorageAsset localPackedIndexPath;
private Repository repo; private Repository repo;
@ -126,7 +127,7 @@ public boolean hasIndex() {
* *
* @return * @return
*/ */
public Path getLocalIndexPath() { public StorageAsset getLocalIndexPath() {
return localIndexPath; return localIndexPath;
} }
@ -136,7 +137,7 @@ public Path getLocalIndexPath() {
* *
* @param localIndexPath * @param localIndexPath
*/ */
public void setLocalIndexPath(Path localIndexPath) { public void setLocalIndexPath(StorageAsset localIndexPath) {
this.localIndexPath = localIndexPath; this.localIndexPath = localIndexPath;
} }
@ -163,7 +164,7 @@ public void setPackedIndexPath(URI packedIndexPath) {
* Returns the directory where the packed index is stored. * Returns the directory where the packed index is stored.
* @return * @return
*/ */
public Path getLocalPackedIndexPath() { public StorageAsset getLocalPackedIndexPath() {
return localPackedIndexPath; return localPackedIndexPath;
} }
@ -173,7 +174,7 @@ public Path getLocalPackedIndexPath() {
* *
* @param localPackedIndexPath * @param localPackedIndexPath
*/ */
public void setLocalPackedIndexPath(Path localPackedIndexPath) { public void setLocalPackedIndexPath(StorageAsset localPackedIndexPath) {
this.localPackedIndexPath = localPackedIndexPath; this.localPackedIndexPath = localPackedIndexPath;
} }

View File

@ -0,0 +1,156 @@
package org.apache.archiva.indexer.merger;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import org.apache.archiva.common.utils.FileUtils;
import org.apache.archiva.indexer.ArchivaIndexingContext;
import org.apache.archiva.repository.RepositoryRegistry;
import org.apache.commons.lang.time.StopWatch;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Async;
import javax.inject.Inject;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.Collectors;
/**
* @author Martin Stockhammer <martin_s@apache.org>
*/
public class BasicIndexMerger implements IndexMerger
{
@Inject
RepositoryRegistry repositoryRegistry;
private Logger log = LoggerFactory.getLogger( getClass() );
private List<TemporaryGroupIndex> temporaryGroupIndexes = new CopyOnWriteArrayList<>();
private List<String> runningGroups = new CopyOnWriteArrayList<>();
@Inject
public BasicIndexMerger( )
{
}
@Override
public ArchivaIndexingContext buildMergedIndex( IndexMergerRequest indexMergerRequest )
throws IndexMergerException
{
String groupId = indexMergerRequest.getGroupId();
if ( runningGroups.contains( groupId ) )
{
log.info( "skip build merge remote indexes for id: '{}' as already running", groupId );
return null;
}
runningGroups.add( groupId );
StopWatch stopWatch = new StopWatch();
stopWatch.reset();
stopWatch.start();
Path mergedIndexDirectory = indexMergerRequest.getMergedIndexDirectory();
String tempRepoId = mergedIndexDirectory.getFileName().toString();
try
{
Path indexLocation = mergedIndexDirectory.resolve( indexMergerRequest.getMergedIndexPath() );
List<ArchivaIndexingContext> members = indexMergerRequest.getRepositoriesIds( ).stream( ).map( id ->
repositoryRegistry.getRepository( id ) )
.map( repo -> repo.getIndexingContext() ).filter( Objects::nonNull ).collect( Collectors.toList() );
members.get( 0 ).
if ( indexMergerRequest.isPackIndex() )
{
IndexPackingRequest request = new IndexPackingRequest( mergedCtx, //
mergedCtx.acquireIndexSearcher().getIndexReader(), //
indexLocation.toFile() );
indexPacker.packIndex( request );
}
if ( indexMergerRequest.isTemporary() )
{
temporaryGroupIndexes.add( new TemporaryGroupIndex( mergedIndexDirectory, tempRepoId, groupId,
indexMergerRequest.getMergedIndexTtl() ) );
}
stopWatch.stop();
log.info( "merged index for repos {} in {} s", indexMergerRequest.getRepositoriesIds(),
stopWatch.getTime() );
return new MavenIndexContext(repositoryRegistry.getRepositoryGroup(groupId), mergedCtx);
}
catch ( IOException e)
{
throw new IndexMergerException( e.getMessage(), e );
}
finally
{
runningGroups.remove( groupId );
}
}
@Async
@Override
public void cleanTemporaryGroupIndex( TemporaryGroupIndex temporaryGroupIndex )
{
if ( temporaryGroupIndex == null )
{
return;
}
try
{
Optional<IndexingContext> ctxOpt = temporaryContextes.stream( ).filter( ctx -> ctx.getId( ).equals( temporaryGroupIndex.getIndexId( ) ) ).findFirst( );
if (ctxOpt.isPresent()) {
IndexingContext ctx = ctxOpt.get();
indexer.closeIndexingContext( ctx, true );
temporaryGroupIndexes.remove( temporaryGroupIndex );
temporaryContextes.remove( ctx );
Path directory = temporaryGroupIndex.getDirectory();
if ( directory != null && Files.exists(directory) )
{
FileUtils.deleteDirectory( directory );
}
}
}
catch ( IOException e )
{
log.warn( "fail to delete temporary group index {}", temporaryGroupIndex.getIndexId(), e );
}
}
@Override
public Collection<TemporaryGroupIndex> getTemporaryGroupIndexes()
{
return this.temporaryGroupIndexes;
}
}

View File

@ -21,6 +21,7 @@
import org.apache.archiva.repository.ManagedRepository; import org.apache.archiva.repository.ManagedRepository;
import org.apache.archiva.repository.RepositoryGroup; import org.apache.archiva.repository.RepositoryGroup;
import org.apache.archiva.repository.features.IndexCreationFeature;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -68,9 +69,16 @@ public void schedule(RepositoryGroup repositoryGroup, Path directory )
List<ManagedRepository> repositories = repositoryGroup.getRepositories(); List<ManagedRepository> repositories = repositoryGroup.getRepositories();
if (repositoryGroup.supportsFeature( IndexCreationFeature.class ))
{
IndexCreationFeature indexCreationFeature = repositoryGroup.getFeature( IndexCreationFeature.class ).get();
Path indexPath = indexCreationFeature.getLocalIndexPath().getFilePath();
if (indexPath!=null)
{
IndexMergerRequest indexMergerRequest = IndexMergerRequest indexMergerRequest =
new IndexMergerRequest( repositories.stream( ).map( r -> r.getId( ) ).collect( Collectors.toList( ) ), true, repositoryGroup.getId( ), new IndexMergerRequest( repositories.stream( ).map( r -> r.getId( ) ).collect( Collectors.toList( ) ), true, repositoryGroup.getId( ),
repositoryGroup.getMergedIndexPath().getFilePath().toString(), indexPath.toString( ),
repositoryGroup.getMergedIndexTTL( ) ).mergedIndexDirectory( directory ); repositoryGroup.getMergedIndexTTL( ) ).mergedIndexDirectory( directory );
MergedRemoteIndexesTaskRequest taskRequest = MergedRemoteIndexesTaskRequest taskRequest =
@ -82,6 +90,12 @@ public void schedule(RepositoryGroup repositoryGroup, Path directory )
ScheduledFuture scheduledFuture = ScheduledFuture scheduledFuture =
taskScheduler.schedule( new MergedRemoteIndexesTask( taskRequest ), cronTrigger ); taskScheduler.schedule( new MergedRemoteIndexesTask( taskRequest ), cronTrigger );
scheduledFutureMap.put( repositoryGroup.getId( ), scheduledFuture ); scheduledFutureMap.put( repositoryGroup.getId( ), scheduledFuture );
} else {
logger.error("Requested index merger for repository group {} with non local index path {}", repositoryGroup.getId(), indexCreationFeature.getLocalIndexPath());
}
} else {
logger.error("Scheduling merged index for repository group {}, but it does not support IndexCreationFeature.", repositoryGroup.getId());
}
} }
@Override @Override

View File

@ -40,8 +40,6 @@ public class AbstractRepositoryGroup extends AbstractRepository implements Edita
private ListOrderedMap<String, ManagedRepository> repositories = new ListOrderedMap<>(); private ListOrderedMap<String, ManagedRepository> repositories = new ListOrderedMap<>();
private String mergedIndexPath;
private int mergedIndexTTL; private int mergedIndexTTL;
private final ReadWriteLock rwl = new ReentrantReadWriteLock(); private final ReadWriteLock rwl = new ReentrantReadWriteLock();
@ -132,11 +130,6 @@ public ManagedRepository removeRepository(String repoId) {
} }
} }
@Override
public void setMergedIndexPath(String path) {
this.mergedIndexPath = path;
}
@Override @Override
public void setMergedIndexTTL(int timeInSeconds) { public void setMergedIndexTTL(int timeInSeconds) {
this.mergedIndexTTL = timeInSeconds; this.mergedIndexTTL = timeInSeconds;
@ -172,11 +165,6 @@ public boolean contains(String id) {
} }
} }
@Override
public StorageAsset getMergedIndexPath() {
return storage.getAsset(mergedIndexPath);
}
@Override @Override
public int getMergedIndexTTL() { public int getMergedIndexTTL() {
return mergedIndexTTL; return mergedIndexTTL;

View File

@ -47,4 +47,11 @@
</bean> </bean>
<bean name="taskScheduler#mergeRemoteIndexes"
class="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler">
<property name="poolSize" value="4"/>
<property name="threadGroupName" value="mergeRemoteIndexes"/>
</bean>
</beans> </beans>

View File

@ -21,7 +21,6 @@
import org.apache.archiva.common.utils.FileUtils; import org.apache.archiva.common.utils.FileUtils;
import org.apache.archiva.indexer.ArchivaIndexingContext; import org.apache.archiva.indexer.ArchivaIndexingContext;
import org.apache.archiva.indexer.UnsupportedBaseContextException; import org.apache.archiva.indexer.UnsupportedBaseContextException;
import org.apache.archiva.indexer.maven.MavenIndexContext;
import org.apache.archiva.indexer.merger.IndexMerger; import org.apache.archiva.indexer.merger.IndexMerger;
import org.apache.archiva.indexer.merger.IndexMergerException; import org.apache.archiva.indexer.merger.IndexMergerException;
import org.apache.archiva.indexer.merger.IndexMergerRequest; import org.apache.archiva.indexer.merger.IndexMergerRequest;

View File

@ -40,6 +40,8 @@
import org.apache.archiva.repository.Repository; import org.apache.archiva.repository.Repository;
import org.apache.archiva.repository.RepositoryType; import org.apache.archiva.repository.RepositoryType;
import org.apache.archiva.repository.UnsupportedRepositoryTypeException; import org.apache.archiva.repository.UnsupportedRepositoryTypeException;
import org.apache.archiva.repository.content.FilesystemAsset;
import org.apache.archiva.repository.content.StorageAsset;
import org.apache.archiva.repository.features.IndexCreationFeature; import org.apache.archiva.repository.features.IndexCreationFeature;
import org.apache.archiva.repository.features.RemoteIndexFeature; import org.apache.archiva.repository.features.RemoteIndexFeature;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
@ -492,7 +494,7 @@ public ArchivaIndexingContext move(ArchivaIndexingContext context, Repository re
} }
if (context.supports(IndexingContext.class)) { if (context.supports(IndexingContext.class)) {
try { try {
Path newPath = getIndexPath(repo); StorageAsset newPath = getIndexPath(repo);
IndexingContext ctx = context.getBaseContext(IndexingContext.class); IndexingContext ctx = context.getBaseContext(IndexingContext.class);
Path oldPath = ctx.getIndexDirectoryFile().toPath(); Path oldPath = ctx.getIndexDirectoryFile().toPath();
if (oldPath.equals(newPath)) { if (oldPath.equals(newPath)) {
@ -506,7 +508,7 @@ public ArchivaIndexingContext move(ArchivaIndexingContext context, Repository re
return createContext(repo); return createContext(repo);
} else { } else {
context.close(false); context.close(false);
Files.move(oldPath, newPath); Files.move(oldPath, newPath.getFilePath());
return createContext(repo); return createContext(repo);
} }
} catch (IOException e) { } catch (IOException e) {
@ -533,58 +535,45 @@ public void updateLocalIndexPath(Repository repo) {
} }
} }
private Path getIndexPath(Repository repo) throws IOException { private StorageAsset getIndexPath(URI indexDir, Path repoDir, String defaultDir) throws IOException
IndexCreationFeature icf = repo.getFeature(IndexCreationFeature.class).get(); {
Path repoDir = repo.getLocalPath(); String indexPath = indexDir.getPath();
URI indexDir = icf.getIndexPath();
Path indexDirectory = null; Path indexDirectory = null;
if ( ! StringUtils.isEmpty(indexDir.toString( ) ) ) if ( ! StringUtils.isEmpty(indexDir.toString( ) ) )
{ {
indexDirectory = PathUtil.getPathFromUri( indexDir ); indexDirectory = PathUtil.getPathFromUri( indexDir );
// not absolute so create it in repository directory // not absolute so create it in repository directory
if ( !indexDirectory.isAbsolute( ) ) if ( indexDirectory.isAbsolute( ) )
{
indexPath = indexDirectory.getFileName().toString();
}
else
{ {
indexDirectory = repoDir.resolve( indexDirectory ); indexDirectory = repoDir.resolve( indexDirectory );
} }
} }
else else
{ {
indexDirectory = repoDir.resolve( DEFAULT_INDEXER_DIR ); indexDirectory = repoDir.resolve( defaultDir );
indexPath = defaultDir;
} }
if ( !Files.exists( indexDirectory ) ) if ( !Files.exists( indexDirectory ) )
{ {
Files.createDirectories( indexDirectory ); Files.createDirectories( indexDirectory );
} }
return indexDirectory; return new FilesystemAsset( indexPath, indexDirectory);
} }
private Path getPackedIndexPath(Repository repo) throws IOException { private StorageAsset getIndexPath( Repository repo) throws IOException {
IndexCreationFeature icf = repo.getFeature(IndexCreationFeature.class).get(); IndexCreationFeature icf = repo.getFeature(IndexCreationFeature.class).get();
Path repoDir = repo.getLocalPath(); return getIndexPath( icf.getIndexPath(), repo.getLocalPath(), DEFAULT_INDEXER_DIR );
URI indexDir = icf.getPackedIndexPath();
Path indexDirectory = null;
if ( ! StringUtils.isEmpty(indexDir.toString( ) ) )
{
indexDirectory = PathUtil.getPathFromUri( indexDir );
// not absolute so create it in repository directory
if ( !indexDirectory.isAbsolute( ) )
{
indexDirectory = repoDir.resolve( indexDirectory );
}
}
else
{
indexDirectory = repoDir.resolve( DEFAULT_PACKED_INDEX_DIR );
} }
if ( !Files.exists( indexDirectory ) ) private StorageAsset getPackedIndexPath(Repository repo) throws IOException {
{ IndexCreationFeature icf = repo.getFeature(IndexCreationFeature.class).get();
Files.createDirectories( indexDirectory ); return getIndexPath(icf.getPackedIndexPath(), repo.getLocalPath(), DEFAULT_PACKED_INDEX_DIR);
}
return indexDirectory;
} }
private IndexingContext createRemoteContext(RemoteRepository remoteRepository ) throws IOException private IndexingContext createRemoteContext(RemoteRepository remoteRepository ) throws IOException
@ -601,7 +590,7 @@ private IndexingContext createRemoteContext(RemoteRepository remoteRepository )
Files.createDirectories( repoDir ); Files.createDirectories( repoDir );
} }
Path indexDirectory = null; StorageAsset indexDirectory = null;
// is there configured indexDirectory ? // is there configured indexDirectory ?
if ( remoteRepository.supportsFeature( RemoteIndexFeature.class ) ) if ( remoteRepository.supportsFeature( RemoteIndexFeature.class ) )
@ -620,7 +609,7 @@ private IndexingContext createRemoteContext(RemoteRepository remoteRepository )
// delete it first then recreate it. // delete it first then recreate it.
log.warn( "the index of repository {} is too old we have to delete and recreate it", // log.warn( "the index of repository {} is too old we have to delete and recreate it", //
remoteRepository.getId( ) ); remoteRepository.getId( ) );
org.apache.archiva.common.utils.FileUtils.deleteDirectory( indexDirectory ); org.apache.archiva.common.utils.FileUtils.deleteDirectory( indexDirectory.getFilePath() );
return getIndexingContext( remoteRepository, contextKey, repoDir, indexDirectory, remoteIndexUrl ); return getIndexingContext( remoteRepository, contextKey, repoDir, indexDirectory, remoteIndexUrl );
} }
@ -631,9 +620,9 @@ private IndexingContext createRemoteContext(RemoteRepository remoteRepository )
} }
} }
private IndexingContext getIndexingContext( Repository repository, String contextKey, Path repoDir, Path indexDirectory, String indexUrl ) throws IOException private IndexingContext getIndexingContext( Repository repository, String contextKey, Path repoDir, StorageAsset indexDirectory, String indexUrl ) throws IOException
{ {
return indexer.createIndexingContext( contextKey, repository.getId( ), repoDir.toFile( ), indexDirectory.toFile( ), return indexer.createIndexingContext( contextKey, repository.getId( ), repoDir.toFile( ), indexDirectory.getFilePath().toFile( ),
repository.getLocation( ) == null ? null : repository.getLocation( ).toString( ), repository.getLocation( ) == null ? null : repository.getLocation( ).toString( ),
indexUrl, indexUrl,
true, false, true, false,
@ -659,7 +648,7 @@ private IndexingContext createManagedContext( ManagedRepository repository ) thr
} }
} }
Path indexDirectory = null; StorageAsset indexDirectory = null;
if ( repository.supportsFeature( IndexCreationFeature.class ) ) if ( repository.supportsFeature( IndexCreationFeature.class ) )
{ {
@ -677,7 +666,7 @@ private IndexingContext createManagedContext( ManagedRepository repository ) thr
// delete it first then recreate it. // delete it first then recreate it.
log.warn( "the index of repository {} is too old we have to delete and recreate it", // log.warn( "the index of repository {} is too old we have to delete and recreate it", //
repository.getId( ) ); repository.getId( ) );
org.apache.archiva.common.utils.FileUtils.deleteDirectory( indexDirectory ); org.apache.archiva.common.utils.FileUtils.deleteDirectory( indexDirectory.getFilePath() );
context = getIndexingContext( repository, repository.getId( ), repositoryDirectory, indexDirectory, indexUrl ); context = getIndexingContext( repository, repository.getId( ), repositoryDirectory, indexDirectory, indexUrl );
context.setSearchable( repository.isScanned( ) ); context.setSearchable( repository.isScanned( ) );
} }

View File

@ -22,6 +22,7 @@
import org.apache.archiva.common.filelock.FileLockManager; import org.apache.archiva.common.filelock.FileLockManager;
import org.apache.archiva.repository.*; import org.apache.archiva.repository.*;
import org.apache.archiva.repository.content.FilesystemStorage; import org.apache.archiva.repository.content.FilesystemStorage;
import org.apache.archiva.repository.features.IndexCreationFeature;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -36,7 +37,7 @@ public class MavenRepositoryGroup extends AbstractRepositoryGroup implements Edi
new ReleaseScheme[] { ReleaseScheme.RELEASE, ReleaseScheme.SNAPSHOT }, new ReleaseScheme[] { ReleaseScheme.RELEASE, ReleaseScheme.SNAPSHOT },
new String[] { MavenManagedRepository.DEFAULT_LAYOUT, MavenManagedRepository.LEGACY_LAYOUT}, new String[] { MavenManagedRepository.DEFAULT_LAYOUT, MavenManagedRepository.LEGACY_LAYOUT},
new String[] {}, new String[] {},
new String[] {}, new String[] {IndexCreationFeature.class.getName()},
false, false,
false, false,
false, false,
@ -48,6 +49,8 @@ public class MavenRepositoryGroup extends AbstractRepositoryGroup implements Edi
private FileLockManager lockManager; private FileLockManager lockManager;
private FilesystemStorage fsStorage; private FilesystemStorage fsStorage;
private IndexCreationFeature indexCreationFeature;
public MavenRepositoryGroup(String id, String name, Path repositoryBase, FileLockManager lockManager) { public MavenRepositoryGroup(String id, String name, Path repositoryBase, FileLockManager lockManager) {
super(RepositoryType.MAVEN, id, name, repositoryBase); super(RepositoryType.MAVEN, id, name, repositoryBase);
@ -78,5 +81,7 @@ private void init() {
throw new RuntimeException("Fatal error while accessing repository path "+ getRepositoryBase(), e); throw new RuntimeException("Fatal error while accessing repository path "+ getRepositoryBase(), e);
} }
setStorage(fsStorage); setStorage(fsStorage);
this.indexCreationFeature = new IndexCreationFeature(this, this);
addFeature( this.indexCreationFeature );
} }
} }

View File

@ -22,6 +22,7 @@
import org.apache.archiva.common.filelock.FileLockManager; import org.apache.archiva.common.filelock.FileLockManager;
import org.apache.archiva.configuration.*; import org.apache.archiva.configuration.*;
import org.apache.archiva.repository.*; import org.apache.archiva.repository.*;
import org.apache.archiva.repository.content.FilesystemAsset;
import org.apache.archiva.repository.features.ArtifactCleanupFeature; import org.apache.archiva.repository.features.ArtifactCleanupFeature;
import org.apache.archiva.repository.features.IndexCreationFeature; import org.apache.archiva.repository.features.IndexCreationFeature;
import org.apache.archiva.repository.features.RemoteIndexFeature; import org.apache.archiva.repository.features.RemoteIndexFeature;
@ -252,9 +253,26 @@ public RepositoryGroup createRepositoryGroup(RepositoryGroupConfiguration config
@Override @Override
public void updateRepositoryGroupInstance(EditableRepositoryGroup repositoryGroup, RepositoryGroupConfiguration configuration) throws RepositoryException { public void updateRepositoryGroupInstance(EditableRepositoryGroup repositoryGroup, RepositoryGroupConfiguration configuration) throws RepositoryException {
repositoryGroup.setName(repositoryGroup.getPrimaryLocale(), configuration.getName()); repositoryGroup.setName(repositoryGroup.getPrimaryLocale(), configuration.getName());
repositoryGroup.setMergedIndexPath(configuration.getMergedIndexPath());
repositoryGroup.setMergedIndexTTL(configuration.getMergedIndexTtl()); repositoryGroup.setMergedIndexTTL(configuration.getMergedIndexTtl());
repositoryGroup.setSchedulingDefinition(configuration.getCronExpression()); repositoryGroup.setSchedulingDefinition(configuration.getCronExpression());
if (repositoryGroup.supportsFeature( IndexCreationFeature.class )) {
IndexCreationFeature indexCreationFeature = repositoryGroup.getFeature( IndexCreationFeature.class ).get();
try
{
indexCreationFeature.setIndexPath( new URI(configuration.getMergedIndexPath()) );
Path localPath = Paths.get(indexCreationFeature.getIndexPath());
if (localPath.isAbsolute()) {
indexCreationFeature.setLocalIndexPath( new FilesystemAsset(localPath.getFileName().toString(), localPath) );
} else
{
indexCreationFeature.setLocalIndexPath( new FilesystemAsset(localPath.toString(), archivaConfiguration.getRepositoryGroupBaseDir( ).resolve( localPath )));
}
}
catch ( URISyntaxException e )
{
log.error("Could not set the index path for repository group {}", repositoryGroup.getId());
}
}
// References to other repositories are set filled by the registry // References to other repositories are set filled by the registry
} }
@ -351,7 +369,12 @@ public RepositoryGroupConfiguration getRepositoryGroupConfiguration(RepositoryGr
RepositoryGroupConfiguration cfg = new RepositoryGroupConfiguration(); RepositoryGroupConfiguration cfg = new RepositoryGroupConfiguration();
cfg.setId(repositoryGroup.getId()); cfg.setId(repositoryGroup.getId());
cfg.setName(repositoryGroup.getName()); cfg.setName(repositoryGroup.getName());
cfg.setMergedIndexPath(repositoryGroup.getMergedIndexPath().getPath()); if (repositoryGroup.supportsFeature( IndexCreationFeature.class ))
{
IndexCreationFeature indexCreationFeature = repositoryGroup.getFeature( IndexCreationFeature.class ).get();
cfg.setMergedIndexPath( indexCreationFeature.getIndexPath().toString() );
}
cfg.setMergedIndexTtl(repositoryGroup.getMergedIndexTTL()); cfg.setMergedIndexTtl(repositoryGroup.getMergedIndexTTL());
cfg.setRepositories(repositoryGroup.getRepositories().stream().map(r -> r.getId()).collect(Collectors.toList())); cfg.setRepositories(repositoryGroup.getRepositories().stream().map(r -> r.getId()).collect(Collectors.toList()));
cfg.setCronExpression(repositoryGroup.getSchedulingDefinition()); cfg.setCronExpression(repositoryGroup.getSchedulingDefinition());

View File

@ -40,6 +40,8 @@
import org.apache.archiva.repository.Repository; import org.apache.archiva.repository.Repository;
import org.apache.archiva.repository.RepositoryType; import org.apache.archiva.repository.RepositoryType;
import org.apache.archiva.repository.UnsupportedRepositoryTypeException; import org.apache.archiva.repository.UnsupportedRepositoryTypeException;
import org.apache.archiva.repository.content.FilesystemAsset;
import org.apache.archiva.repository.content.StorageAsset;
import org.apache.archiva.repository.features.IndexCreationFeature; import org.apache.archiva.repository.features.IndexCreationFeature;
import org.apache.archiva.repository.features.RemoteIndexFeature; import org.apache.archiva.repository.features.RemoteIndexFeature;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
@ -479,7 +481,7 @@ public ArchivaIndexingContext move(ArchivaIndexingContext context, Repository re
} }
if (context.supports(IndexingContext.class)) { if (context.supports(IndexingContext.class)) {
try { try {
Path newPath = getIndexPath(repo); StorageAsset newPath = getIndexPath(repo);
IndexingContext ctx = context.getBaseContext(IndexingContext.class); IndexingContext ctx = context.getBaseContext(IndexingContext.class);
Path oldPath = ctx.getIndexDirectoryFile().toPath(); Path oldPath = ctx.getIndexDirectoryFile().toPath();
if (oldPath.equals(newPath)) { if (oldPath.equals(newPath)) {
@ -493,7 +495,7 @@ public ArchivaIndexingContext move(ArchivaIndexingContext context, Repository re
return createContext(repo); return createContext(repo);
} else { } else {
context.close(false); context.close(false);
Files.move(oldPath, newPath); Files.move(oldPath, newPath.getFilePath());
return createContext(repo); return createContext(repo);
} }
} catch (IOException e) { } catch (IOException e) {
@ -520,17 +522,22 @@ public void updateLocalIndexPath(Repository repo) {
} }
private Path getIndexPath(Repository repo) throws IOException { private StorageAsset getIndexPath( Repository repo) throws IOException {
IndexCreationFeature icf = repo.getFeature(IndexCreationFeature.class).get(); IndexCreationFeature icf = repo.getFeature(IndexCreationFeature.class).get();
Path repoDir = repo.getLocalPath(); Path repoDir = repo.getLocalPath();
URI indexDir = icf.getIndexPath(); URI indexDir = icf.getIndexPath();
String indexPath = indexDir.getPath();
Path indexDirectory = null; Path indexDirectory = null;
if ( ! StringUtils.isEmpty(indexDir.toString( ) ) ) if ( ! StringUtils.isEmpty(indexDir.toString( ) ) )
{ {
indexDirectory = PathUtil.getPathFromUri( indexDir ); indexDirectory = PathUtil.getPathFromUri( indexDir );
// not absolute so create it in repository directory // not absolute so create it in repository directory
if ( !indexDirectory.isAbsolute( ) ) if ( indexDirectory.isAbsolute( ) )
{
indexPath = indexDirectory.getFileName().toString();
}
else
{ {
indexDirectory = repoDir.resolve( indexDirectory ); indexDirectory = repoDir.resolve( indexDirectory );
} }
@ -538,13 +545,14 @@ private Path getIndexPath(Repository repo) throws IOException {
else else
{ {
indexDirectory = repoDir.resolve( ".index" ); indexDirectory = repoDir.resolve( ".index" );
indexPath = ".index";
} }
if ( !Files.exists( indexDirectory ) ) if ( !Files.exists( indexDirectory ) )
{ {
Files.createDirectories( indexDirectory ); Files.createDirectories( indexDirectory );
} }
return indexDirectory; return new FilesystemAsset( indexPath, indexDirectory );
} }
private IndexingContext createRemoteContext(RemoteRepository remoteRepository ) throws IOException private IndexingContext createRemoteContext(RemoteRepository remoteRepository ) throws IOException
@ -561,7 +569,7 @@ private IndexingContext createRemoteContext(RemoteRepository remoteRepository )
Files.createDirectories( repoDir ); Files.createDirectories( repoDir );
} }
Path indexDirectory = null; StorageAsset indexDirectory = null;
// is there configured indexDirectory ? // is there configured indexDirectory ?
if ( remoteRepository.supportsFeature( RemoteIndexFeature.class ) ) if ( remoteRepository.supportsFeature( RemoteIndexFeature.class ) )
@ -580,7 +588,7 @@ private IndexingContext createRemoteContext(RemoteRepository remoteRepository )
// delete it first then recreate it. // delete it first then recreate it.
log.warn( "the index of repository {} is too old we have to delete and recreate it", // log.warn( "the index of repository {} is too old we have to delete and recreate it", //
remoteRepository.getId( ) ); remoteRepository.getId( ) );
org.apache.archiva.common.utils.FileUtils.deleteDirectory( indexDirectory ); org.apache.archiva.common.utils.FileUtils.deleteDirectory( indexDirectory.getFilePath() );
return getIndexingContext( remoteRepository, contextKey, repoDir, indexDirectory, remoteIndexUrl ); return getIndexingContext( remoteRepository, contextKey, repoDir, indexDirectory, remoteIndexUrl );
} }
@ -591,9 +599,9 @@ private IndexingContext createRemoteContext(RemoteRepository remoteRepository )
} }
} }
private IndexingContext getIndexingContext( Repository repository, String contextKey, Path repoDir, Path indexDirectory, String indexUrl ) throws IOException private IndexingContext getIndexingContext( Repository repository, String contextKey, Path repoDir, StorageAsset indexDirectory, String indexUrl ) throws IOException
{ {
return indexer.createIndexingContext( contextKey, repository.getId( ), repoDir.toFile( ), indexDirectory.toFile( ), return indexer.createIndexingContext( contextKey, repository.getId( ), repoDir.toFile( ), indexDirectory.getFilePath().toFile( ),
repository.getLocation( ) == null ? null : repository.getLocation( ).toString( ), repository.getLocation( ) == null ? null : repository.getLocation( ).toString( ),
indexUrl, indexUrl,
true, false, true, false,
@ -619,7 +627,7 @@ private IndexingContext createManagedContext( ManagedRepository repository ) thr
} }
} }
Path indexDirectory = null; StorageAsset indexDirectory = null;
if ( repository.supportsFeature( IndexCreationFeature.class ) ) if ( repository.supportsFeature( IndexCreationFeature.class ) )
{ {
@ -637,7 +645,7 @@ private IndexingContext createManagedContext( ManagedRepository repository ) thr
// delete it first then recreate it. // delete it first then recreate it.
log.warn( "the index of repository {} is too old we have to delete and recreate it", // log.warn( "the index of repository {} is too old we have to delete and recreate it", //
repository.getId( ) ); repository.getId( ) );
org.apache.archiva.common.utils.FileUtils.deleteDirectory( indexDirectory ); org.apache.archiva.common.utils.FileUtils.deleteDirectory( indexDirectory.getFilePath() );
context = getIndexingContext( repository, repository.getId( ), repositoryDirectory, indexDirectory, indexUrl ); context = getIndexingContext( repository, repository.getId( ), repositoryDirectory, indexDirectory, indexUrl );
context.setSearchable( repository.isScanned( ) ); context.setSearchable( repository.isScanned( ) );
} }

View File

@ -37,6 +37,7 @@
import org.junit.Test; import org.junit.Test;
import java.net.URI; import java.net.URI;
import java.net.URISyntaxException;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths; import java.nio.file.Paths;
@ -295,7 +296,8 @@ public void getRemoteConfiguration() throws Exception {
} }
@Test @Test
public void getRepositoryGroupConfiguration() throws RepositoryException { public void getRepositoryGroupConfiguration() throws RepositoryException, URISyntaxException
{
MavenRepositoryGroup repositoryGroup = new MavenRepositoryGroup("group1","group1",Paths.get("target/groups"), MavenRepositoryGroup repositoryGroup = new MavenRepositoryGroup("group1","group1",Paths.get("target/groups"),
new DefaultFileLockManager()); new DefaultFileLockManager());
MavenManagedRepository repo1 = new MavenManagedRepository( "test01", "My Test repo", Paths.get("target/repositories") ); MavenManagedRepository repo1 = new MavenManagedRepository( "test01", "My Test repo", Paths.get("target/repositories") );
@ -304,7 +306,8 @@ public void getRepositoryGroupConfiguration() throws RepositoryException {
repositoryGroup.setDescription(repositoryGroup.getPrimaryLocale(), "Repository group"); repositoryGroup.setDescription(repositoryGroup.getPrimaryLocale(), "Repository group");
repositoryGroup.setLayout("non-default"); repositoryGroup.setLayout("non-default");
repositoryGroup.setMergedIndexPath(".index2"); IndexCreationFeature indexCreationFeature = repositoryGroup.getFeature( IndexCreationFeature.class ).get();
indexCreationFeature.setIndexPath( new URI(".index2") );
repositoryGroup.setName(repositoryGroup.getPrimaryLocale(), "Repo Group 1"); repositoryGroup.setName(repositoryGroup.getPrimaryLocale(), "Repo Group 1");
repositoryGroup.setMergedIndexTTL(1005); repositoryGroup.setMergedIndexTTL(1005);
repositoryGroup.setSchedulingDefinition("0 0 04 ? * THU"); repositoryGroup.setSchedulingDefinition("0 0 04 ? * THU");
@ -351,7 +354,8 @@ public void createRepositoryGroupWithCfg() throws RepositoryException {
assertEquals("group2", grp.getId()); assertEquals("group2", grp.getId());
assertEquals("Group 2", grp.getName()); assertEquals("Group 2", grp.getName());
assertEquals("0 0 03 ? * MON", grp.getSchedulingDefinition()); assertEquals("0 0 03 ? * MON", grp.getSchedulingDefinition());
assertEquals(".index-abc", grp.getMergedIndexPath().getName()); IndexCreationFeature indexCreationFeature = grp.getFeature( IndexCreationFeature.class ).get();
assertEquals(".index-abc", indexCreationFeature.getIndexPath());
assertEquals(504, grp.getMergedIndexTTL()); assertEquals(504, grp.getMergedIndexTTL());
assertEquals(0, grp.getRepositories().size()); assertEquals(0, grp.getRepositories().size());
// assertTrue(grp.getRepositories().stream().anyMatch(r -> "test01".equals(r.getId()))); // assertTrue(grp.getRepositories().stream().anyMatch(r -> "test01".equals(r.getId())));

View File

@ -262,14 +262,14 @@ private void finishIndexingTask( ArtifactIndexingTask indexingTask, ManagedRepos
if ( repository.supportsFeature( IndexCreationFeature.class ) ) if ( repository.supportsFeature( IndexCreationFeature.class ) )
{ {
IndexCreationFeature icf = repository.getFeature( IndexCreationFeature.class ).get( ); IndexCreationFeature icf = repository.getFeature( IndexCreationFeature.class ).get( );
if ( !icf.isSkipPackedIndexCreation( ) && icf.getLocalPackedIndexPath( ) != null ) if ( !icf.isSkipPackedIndexCreation( ) && icf.getLocalPackedIndexPath( ) != null && icf.getLocalIndexPath().getFilePath()!=null )
{ {
log.debug( "Creating packed index from {} on {}", context.getIndexDirectoryFile( ), icf.getLocalPackedIndexPath( ) ); log.debug( "Creating packed index from {} on {}", context.getIndexDirectoryFile( ), icf.getLocalPackedIndexPath( ) );
IndexPackingRequest request = new IndexPackingRequest( context, // IndexPackingRequest request = new IndexPackingRequest( context, //
context.acquireIndexSearcher( ).getIndexReader( ), context.acquireIndexSearcher( ).getIndexReader( ),
// //
icf.getLocalPackedIndexPath( ).toFile( ) ); icf.getLocalPackedIndexPath( ).getFilePath().toFile( ) );
indexPacker.packIndex( request ); indexPacker.packIndex( request );
context.updateTimestamp( true ); context.updateTimestamp( true );

View File

@ -26,6 +26,7 @@
import org.apache.archiva.repository.ManagedRepository; import org.apache.archiva.repository.ManagedRepository;
import org.apache.archiva.repository.ReleaseScheme; import org.apache.archiva.repository.ReleaseScheme;
import org.apache.archiva.repository.RepositoryRegistry; import org.apache.archiva.repository.RepositoryRegistry;
import org.apache.archiva.repository.content.StorageAsset;
import org.apache.archiva.repository.features.IndexCreationFeature; import org.apache.archiva.repository.features.IndexCreationFeature;
import org.apache.archiva.scheduler.indexing.ArtifactIndexingTask; import org.apache.archiva.scheduler.indexing.ArtifactIndexingTask;
import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner; import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner;
@ -275,21 +276,28 @@ public void testPackagedIndex()
Path basePath = repo.getLocalPath(); Path basePath = repo.getLocalPath();
IndexCreationFeature icf = repo.getFeature( IndexCreationFeature.class ).get(); IndexCreationFeature icf = repo.getFeature( IndexCreationFeature.class ).get();
Path packedIndexDirectory = icf.getLocalPackedIndexPath(); StorageAsset packedIndexDirectory = icf.getLocalPackedIndexPath();
Path indexerDirectory = icf.getLocalIndexPath(); StorageAsset indexerDirectory = icf.getLocalIndexPath();
for (Path dir : new Path[] { packedIndexDirectory, indexerDirectory }) { for (StorageAsset dir : new StorageAsset[] { packedIndexDirectory, indexerDirectory }) {
Files.list(dir).filter(path -> path.getFileName().toString().startsWith("nexus-maven-repository-index")) if (dir.getFilePath()!=null)
{
Path localDirPath = dir.getFilePath();
Files.list( localDirPath ).filter( path -> path.getFileName( ).toString( ).startsWith( "nexus-maven-repository-index" ) )
.forEach( path -> .forEach( path ->
{ {
try { try
{
System.err.println( "Deleting " + path ); System.err.println( "Deleting " + path );
Files.delete( path ); Files.delete( path );
} catch (IOException e) { }
catch ( IOException e )
{
e.printStackTrace( ); e.printStackTrace( );
} }
} ); } );
} }
}
@ -310,20 +318,20 @@ public void testPackagedIndex()
indexingExecutor.executeTask( task ); indexingExecutor.executeTask( task );
assertTrue( Files.exists(packedIndexDirectory) ); assertTrue( Files.exists(packedIndexDirectory.getFilePath()) );
assertTrue( Files.exists(indexerDirectory) ); assertTrue( Files.exists(indexerDirectory.getFilePath()) );
// test packed index file creation // test packed index file creation
//no more zip //no more zip
//Assertions.assertThat(new File( indexerDirectory, "nexus-maven-repository-index.zip" )).exists(); //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.getFilePath().resolve("nexus-maven-repository-index.properties" ) ));
Assertions.assertThat( Files.exists(packedIndexDirectory.resolve("nexus-maven-repository-index.gz" ) )); Assertions.assertThat( Files.exists(packedIndexDirectory.getFilePath().resolve("nexus-maven-repository-index.gz" ) ));
assertFalse( Files.exists(packedIndexDirectory.resolve("nexus-maven-repository-index.1.gz" ) )); assertFalse( Files.exists(packedIndexDirectory.getFilePath().resolve("nexus-maven-repository-index.1.gz" ) ));
// unpack .zip index // unpack .zip index
//unzipIndex( indexerDirectory.getPath(), destDir.getPath() ); //unzipIndex( indexerDirectory.getPath(), destDir.getPath() );
DefaultIndexUpdater.FileFetcher fetcher = new DefaultIndexUpdater.FileFetcher( packedIndexDirectory.toFile() ); DefaultIndexUpdater.FileFetcher fetcher = new DefaultIndexUpdater.FileFetcher( packedIndexDirectory.getFilePath().toFile() );
IndexUpdateRequest updateRequest = new IndexUpdateRequest( getIndexingContext(), fetcher ); IndexUpdateRequest updateRequest = new IndexUpdateRequest( getIndexingContext(), fetcher );
//updateRequest.setLocalIndexCacheDir( indexerDirectory ); //updateRequest.setLocalIndexCacheDir( indexerDirectory );
indexUpdater.fetchAndUpdateIndex( updateRequest ); indexUpdater.fetchAndUpdateIndex( updateRequest );

View File

@ -223,7 +223,7 @@ public void spool( OutputContext outputContext )
} }
else if ( outputContext.hasStream() ) else if ( outputContext.hasStream() )
{ {
IndexWriter writer = new IndexWriter( getContent(), asset, logicalResource ); IndexWriter writer = new IndexWriter( asset, logicalResource );
writer.write( outputContext ); writer.write( outputContext );
} }
} }

View File

@ -176,12 +176,6 @@ public class ArchivaDavResourceFactory
*/ */
private final LockManager lockManager = new SimpleLockManager(); private final LockManager lockManager = new SimpleLockManager();
private ChecksummedFile checksum;
private Digester digestSha1;
private Digester digestMd5;
@Inject @Inject
@Named( value = "archivaTaskScheduler#repository" ) @Named( value = "archivaTaskScheduler#repository" )
private RepositoryArchivaTaskScheduler scheduler; private RepositoryArchivaTaskScheduler scheduler;
@ -193,8 +187,7 @@ public class ArchivaDavResourceFactory
private ApplicationContext applicationContext; private ApplicationContext applicationContext;
@Inject @Inject
public ArchivaDavResourceFactory( ApplicationContext applicationContext, PlexusSisuBridge plexusSisuBridge, public ArchivaDavResourceFactory( ApplicationContext applicationContext, ArchivaConfiguration archivaConfiguration )
ArchivaConfiguration archivaConfiguration )
throws PlexusSisuBridgeException throws PlexusSisuBridgeException
{ {
this.archivaConfiguration = archivaConfiguration; this.archivaConfiguration = archivaConfiguration;
@ -420,7 +413,12 @@ private DavResource processRepositoryGroup( final DavServletRequest request,
String rootPath = StringUtils.substringBeforeLast( pathInfo, "/" ); String rootPath = StringUtils.substringBeforeLast( pathInfo, "/" );
if ( StringUtils.endsWith( rootPath, repoGroup.getMergedIndexPath().getPath() ) ) String mergedIndexPath = "/";
if (repoGroup.supportsFeature( IndexCreationFeature.class )) {
mergedIndexPath = repoGroup.getFeature( IndexCreationFeature.class ).get().getIndexPath().getPath();
}
if ( StringUtils.endsWith( rootPath, mergedIndexPath ) )
{ {
// we are in the case of index file request // we are in the case of index file request
String requestedFileName = StringUtils.substringAfterLast( pathInfo, "/" ); String requestedFileName = StringUtils.substringAfterLast( pathInfo, "/" );
@ -1044,11 +1042,16 @@ private DavResource getResourceFromGroup( DavServletRequest request,
// remove last / // remove last /
String pathInfo = StringUtils.removeEnd( request.getPathInfo(), "/" ); String pathInfo = StringUtils.removeEnd( request.getPathInfo(), "/" );
String mergedIndexPath = "/";
if (repositoryGroup.supportsFeature( IndexCreationFeature.class )) {
IndexCreationFeature indexCreationFeature = repositoryGroup.getFeature( IndexCreationFeature.class ).get();
mergedIndexPath = indexCreationFeature.getIndexPath().getPath();
}
if ( allow ) if ( allow )
{ {
if ( StringUtils.endsWith( pathInfo, repositoryGroup.getMergedIndexPath().getPath() ) ) if ( StringUtils.endsWith( pathInfo, mergedIndexPath ) )
{ {
Path mergedRepoDirPath = Path mergedRepoDirPath =
buildMergedIndexDirectory( activePrincipal, request, repositoryGroup ); buildMergedIndexDirectory( activePrincipal, request, repositoryGroup );
@ -1061,7 +1064,7 @@ private DavResource getResourceFromGroup( DavServletRequest request,
{ {
Path tmpDirectory = Paths.get( SystemUtils.getJavaIoTmpDir().toString(), Path tmpDirectory = Paths.get( SystemUtils.getJavaIoTmpDir().toString(),
id, id,
repositoryGroup.getMergedIndexPath().getFilePath().toString() ); mergedIndexPath );
if ( !Files.exists(tmpDirectory) ) if ( !Files.exists(tmpDirectory) )
{ {
synchronized ( tmpDirectory.toAbsolutePath().toString() ) synchronized ( tmpDirectory.toAbsolutePath().toString() )
@ -1101,25 +1104,9 @@ private DavResource getResourceFromGroup( DavServletRequest request,
{ {
// in case of group displaying index directory doesn't have sense !! // in case of group displaying index directory doesn't have sense !!
IndexCreationFeature idf = managedRepository.getRepository().getFeature(IndexCreationFeature.class).get(); IndexCreationFeature idf = managedRepository.getRepository().getFeature(IndexCreationFeature.class).get();
String repoIndexDirectory = idf.getIndexPath().toString(); StorageAsset repoIndexDirectory = idf.getLocalIndexPath();
if ( StringUtils.isNotEmpty( repoIndexDirectory ) ) if ( !StringUtils.equals( FilenameUtils.normalize( repoIndexDirectory.getPath() ),
{ FilenameUtils.normalize( logicalResource.getPath() ) ) )
if ( !Paths.get( repoIndexDirectory ).isAbsolute() )
{
repoIndexDirectory = Paths.get( managedRepository.getRepository().getLocation() ).resolve(
StringUtils.isEmpty( repoIndexDirectory )
? ".indexer"
: repoIndexDirectory ).toAbsolutePath().toString();
}
}
if ( StringUtils.isEmpty( repoIndexDirectory ) )
{
repoIndexDirectory = Paths.get( managedRepository.getRepository().getLocation() ).resolve(
".indexer" ).toAbsolutePath().toString();
}
if ( !StringUtils.equals( FilenameUtils.normalize( repoIndexDirectory ),
FilenameUtils.normalize( resourceFile.toAbsolutePath().toString() ) ) )
{ {
// for prompted authentication // for prompted authentication
if ( httpAuth.getSecuritySession( request.getSession( true ) ) != null ) if ( httpAuth.getSecuritySession( request.getSession( true ) ) != null )
@ -1368,15 +1355,20 @@ protected Path buildMergedIndexDirectory( String activePrincipal,
} }
} }
log.info( "generate temporary merged index for repository group '{}' for repositories '{}'", log.info( "generate temporary merged index for repository group '{}' for repositories '{}'",
id, authzRepos ); id, authzRepos );
IndexCreationFeature indexCreationFeature = repositoryGroup.getFeature( IndexCreationFeature.class ).get();
Path indexPath = indexCreationFeature.getLocalIndexPath().getFilePath();
if (indexPath!=null)
{
Path tempRepoFile = Files.createTempDirectory( "temp" ); Path tempRepoFile = Files.createTempDirectory( "temp" );
tempRepoFile.toFile( ).deleteOnExit( ); tempRepoFile.toFile( ).deleteOnExit( );
IndexMergerRequest indexMergerRequest = IndexMergerRequest indexMergerRequest =
new IndexMergerRequest( authzRepos, true, id, new IndexMergerRequest( authzRepos, true, id,
repositoryGroup.getMergedIndexPath().getFilePath().toString(), indexPath.toString( ),
repositoryGroup.getMergedIndexTTL( ) ).mergedIndexDirectory( repositoryGroup.getMergedIndexTTL( ) ).mergedIndexDirectory(
tempRepoFile ).temporary( true ); tempRepoFile ).temporary( true );
@ -1396,6 +1388,10 @@ protected Path buildMergedIndexDirectory( String activePrincipal,
session.setAttribute( TemporaryGroupIndexSessionCleaner.TEMPORARY_INDEX_SESSION_KEY, session.setAttribute( TemporaryGroupIndexSessionCleaner.TEMPORARY_INDEX_SESSION_KEY,
temporaryGroupIndexMap ); temporaryGroupIndexMap );
return mergedRepoDir; return mergedRepoDir;
} else {
log.error("Local index path for repository group {} does not exist.", repositoryGroup.getId());
throw new DavException( HttpServletResponse.SC_INTERNAL_SERVER_ERROR );
}
} }
catch ( RepositorySearchException e ) catch ( RepositorySearchException e )
{ {

View File

@ -718,7 +718,7 @@ class OverridingArchivaDavResourceFactory
ArchivaConfiguration archivaConfiguration ) ArchivaConfiguration archivaConfiguration )
throws PlexusSisuBridgeException throws PlexusSisuBridgeException
{ {
super( applicationContext, plexusSisuBridge, archivaConfiguration ); super( applicationContext, archivaConfiguration );
} }
@Override @Override

View File

@ -22,6 +22,8 @@
import junit.framework.TestCase; import junit.framework.TestCase;
import org.apache.archiva.common.filelock.FileLockManager; import org.apache.archiva.common.filelock.FileLockManager;
import org.apache.archiva.common.utils.FileUtils; import org.apache.archiva.common.utils.FileUtils;
import org.apache.archiva.repository.LayoutException;
import org.apache.archiva.repository.content.FilesystemAsset;
import org.apache.archiva.repository.events.AuditListener; import org.apache.archiva.repository.events.AuditListener;
import org.apache.archiva.repository.maven2.MavenManagedRepository; import org.apache.archiva.repository.maven2.MavenManagedRepository;
import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner; import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner;
@ -47,6 +49,7 @@
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import javax.inject.Inject; import javax.inject.Inject;
import javax.servlet.http.HttpServletResponse;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths; import java.nio.file.Paths;
@ -116,10 +119,10 @@ public void tearDown()
} }
} }
private DavResource getDavResource( String logicalPath, Path file ) private DavResource getDavResource( String logicalPath, Path file ) throws LayoutException
{ {
return new ArchivaDavResource( file.toAbsolutePath().toString(), logicalPath, repository, session, resourceLocator, return new ArchivaDavResource( new FilesystemAsset( logicalPath, file.toAbsolutePath()) , logicalPath, repository, session, resourceLocator,
resourceFactory, mimeTypes, Collections.<AuditListener> emptyList(), null, fileLockManager ); resourceFactory, mimeTypes, Collections.<AuditListener> emptyList(), null);
} }
@Test @Test
@ -338,9 +341,16 @@ public DavResource createResource( DavResourceLocator locator, DavServletRequest
public DavResource createResource( DavResourceLocator locator, DavSession session ) public DavResource createResource( DavResourceLocator locator, DavSession session )
throws DavException throws DavException
{ {
return new ArchivaDavResource( baseDir.toAbsolutePath().toString(), "/", repository, session, resourceLocator, try
{
return new ArchivaDavResource( new FilesystemAsset( "/" , baseDir.toAbsolutePath()), "/", repository, session, resourceLocator,
resourceFactory, mimeTypes, Collections.<AuditListener> emptyList(), resourceFactory, mimeTypes, Collections.<AuditListener> emptyList(),
null, fileLockManager ); null );
}
catch ( LayoutException e )
{
throw new DavException( HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e );
}
} }
} }
} }

View File

@ -43,7 +43,7 @@ public UnauthenticatedDavResourceFactory( ApplicationContext applicationContext,
ArchivaConfiguration archivaConfiguration ) ArchivaConfiguration archivaConfiguration )
throws PlexusSisuBridgeException throws PlexusSisuBridgeException
{ {
super( applicationContext, plexusSisuBridge, archivaConfiguration ); super( applicationContext, archivaConfiguration );
} }
@Override @Override

View File

@ -115,6 +115,12 @@ public Path getRemoteRepositoryBaseDir() {
return getDataDirectory().resolve("remotes"); return getDataDirectory().resolve("remotes");
} }
@Override
public Path getRepositoryGroupBaseDir( )
{
return getDataDirectory().resolve("group");
}
@Override @Override
public Path getDataDirectory() { public Path getDataDirectory() {
if (configuration!=null && StringUtils.isNotEmpty(configuration.getArchivaRuntimeConfiguration().getDataDirectory())) { if (configuration!=null && StringUtils.isNotEmpty(configuration.getArchivaRuntimeConfiguration().getDataDirectory())) {