Fixing Index context creation

This commit is contained in:
Martin Stockhammer 2021-06-04 17:44:30 +02:00
parent 0ce53483a8
commit a1b92c562f
13 changed files with 1131 additions and 650 deletions

View File

@ -23,9 +23,11 @@
import java.io.*;
import java.nio.charset.Charset;
import java.nio.file.CopyOption;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.nio.file.StandardOpenOption;
import java.util.Comparator;
import java.util.Optional;
@ -218,4 +220,22 @@ public static void unzip(Path zipFile, Path destinationPath) throws IOException
});
}
}
public static void copyContent(Path srcDir, Path destinationDir, boolean overwrite) throws IOException
{
CopyOption[] copyOption = overwrite ? new CopyOption[]{StandardCopyOption.REPLACE_EXISTING} : new CopyOption[]{};
Files.walk(srcDir).forEach(a -> {
Path b = destinationDir.resolve(srcDir.relativize( a ));
try {
Files.copy(a, b, copyOption);
} catch (IOException e) {
log.error( "Could not copy file {} to {}: {}", a, b, e.getMessage( ) );
}
});
}
public static void copyContent(Path srcDir, Path destinationDir) throws IOException {
copyContent( srcDir, destinationDir, true );
}
}

View File

@ -22,6 +22,8 @@
import org.apache.archiva.configuration.ManagedRepositoryConfiguration;
import org.apache.archiva.configuration.RemoteRepositoryConfiguration;
import org.apache.archiva.configuration.RepositoryGroupConfiguration;
import org.apache.archiva.event.EventHandler;
import org.apache.archiva.event.EventType;
import org.apache.archiva.repository.base.BasicManagedRepository;
import org.apache.archiva.repository.base.BasicRemoteRepository;
import org.apache.archiva.repository.EditableManagedRepository;
@ -37,6 +39,7 @@
import org.apache.archiva.repository.RepositoryProvider;
import org.apache.archiva.repository.RepositoryType;
import org.apache.archiva.event.Event;
import org.apache.archiva.repository.event.RepositoryEvent;
import org.apache.archiva.repository.features.ArtifactCleanupFeature;
import org.apache.archiva.repository.features.IndexCreationFeature;
import org.apache.archiva.repository.features.RemoteIndexFeature;
@ -280,5 +283,8 @@ public void updateRepositoryGroupInstance(EditableRepositoryGroup repositoryGrou
}
public void addRepositoryEventHandler( EventHandler<? super RepositoryEvent> eventHandler )
{
// do nothing
}
}

View File

@ -22,6 +22,7 @@
import org.apache.archiva.configuration.ManagedRepositoryConfiguration;
import org.apache.archiva.configuration.RemoteRepositoryConfiguration;
import org.apache.archiva.configuration.RepositoryGroupConfiguration;
import org.apache.archiva.event.EventHandler;
import org.apache.archiva.repository.base.BasicManagedRepository;
import org.apache.archiva.repository.base.BasicRemoteRepository;
import org.apache.archiva.repository.EditableManagedRepository;
@ -37,6 +38,7 @@
import org.apache.archiva.repository.RepositoryGroup;
import org.apache.archiva.repository.RepositoryProvider;
import org.apache.archiva.repository.RepositoryType;
import org.apache.archiva.repository.event.RepositoryEvent;
import org.apache.archiva.repository.features.ArtifactCleanupFeature;
import org.apache.archiva.repository.features.IndexCreationFeature;
import org.apache.archiva.repository.features.RemoteIndexFeature;
@ -253,6 +255,12 @@ public RepositoryGroupConfiguration getRepositoryGroupConfiguration( RepositoryG
return null;
}
@Override
public void addRepositoryEventHandler( EventHandler<? super RepositoryEvent> eventHandler )
{
// do nothing
}
@Override
public RemoteRepositoryConfiguration getRemoteConfiguration( RemoteRepository remoteRepository )

View File

@ -76,15 +76,9 @@ public class DefaultRepositoryGroupAdmin
@Inject
private ManagedRepositoryAdmin managedRepositoryAdmin;
@Inject
@Named("mergedRemoteIndexesScheduler#default")
private MergedRemoteIndexesScheduler mergedRemoteIndexesScheduler;
@Inject
private RepositoryRegistry repositoryRegistry;
private Path groupsDirectory;
@PostConstruct
public void baseInit() {
this.repositoryRegistry.registerEventHandler( EventType.ROOT, this );
@ -92,29 +86,6 @@ public void baseInit() {
public void initialize()
{
String appServerBase = getRegistry().getString( "appserver.base" );
groupsDirectory = Paths.get( appServerBase, "groups" );
if ( !Files.exists(groupsDirectory) )
{
Files.exists(groupsDirectory);
}
for ( org.apache.archiva.repository.RepositoryGroup repositoryGroup : repositoryRegistry.getRepositoryGroups() )
{
mergedRemoteIndexesScheduler.schedule( repositoryGroup,
getMergedIndexDirectory( repositoryGroup.getId() ));
// create the directory for each group if not exists
Path groupPath = groupsDirectory.resolve(repositoryGroup.getId() );
if ( !Files.exists(groupPath) )
{
try {
Files.createDirectories(groupPath);
} catch (IOException e) {
log.error("Could not create directory {}", groupPath);
}
}
}
}
@ -167,7 +138,6 @@ public Boolean addRepositoryGroup( RepositoryGroup repositoryGroup, AuditInforma
}
triggerAuditEvent( repositoryGroup.getId(), null, AuditEvent.ADD_REPO_GROUP, auditInformation );
mergedRemoteIndexesScheduler.schedule( repositoryRegistry.getRepositoryGroup( repositoryGroup.getId()), getMergedIndexDirectory( repositoryGroup.getId() ) );
return Boolean.TRUE;
}
@ -183,10 +153,7 @@ public Boolean deleteRepositoryGroup( String repositoryGroupId, AuditInformation
log.error("Removal of repository group {} failed: {}", repositoryGroup.getId(), e.getMessage(), e);
throw new RepositoryAdminException("Removal of repository failed: " + e.getMessage(), e);
}
mergedRemoteIndexesScheduler.unschedule(
repositoryGroup );
triggerAuditEvent( repositoryGroupId, null, AuditEvent.DELETE_REPO_GROUP, auditInformation );
return Boolean.TRUE;
}
@ -222,8 +189,6 @@ private Boolean updateRepositoryGroup( RepositoryGroup repositoryGroup, AuditInf
}
org.apache.archiva.repository.RepositoryGroup rg = repositoryRegistry.getRepositoryGroup( repositoryGroup.getId( ) );
mergedRemoteIndexesScheduler.unschedule( rg );
mergedRemoteIndexesScheduler.schedule( rg, getMergedIndexDirectory( repositoryGroup.getId() ) );
triggerAuditEvent( repositoryGroup.getId(), null, AuditEvent.MODIFY_REPO_GROUP, auditInformation );
return Boolean.TRUE;
}

View File

@ -23,6 +23,7 @@
import org.apache.archiva.configuration.RemoteRepositoryConfiguration;
import org.apache.archiva.configuration.RepositoryGroupConfiguration;
import org.apache.archiva.event.EventHandler;
import org.apache.archiva.repository.event.RepositoryEvent;
import java.io.IOException;
import java.util.Set;
@ -180,4 +181,12 @@ public interface RepositoryProvider extends EventHandler
* @throws RepositoryException if the data cannot be converted
*/
RepositoryGroupConfiguration getRepositoryGroupConfiguration(RepositoryGroup repositoryGroup) throws RepositoryException;
/**
* This event handler is registered to all newly created repositories immediately after creation. This may be needed by
* some components to get events right after creation of the instance.
*
* @param eventHandler the event handler instance
*/
void addRepositoryEventHandler( EventHandler<? super RepositoryEvent> eventHandler);
}

View File

@ -30,6 +30,8 @@
import org.apache.archiva.repository.RepositoryProvider;
import org.apache.archiva.repository.RepositoryType;
import org.apache.archiva.repository.event.RepositoryEvent;
import org.apache.archiva.repository.features.IndexCreationFeature;
import org.apache.archiva.repository.storage.StorageAsset;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -38,6 +40,9 @@
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.inject.Named;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
@ -65,6 +70,8 @@ public class RepositoryGroupHandler
private Map<String, RepositoryGroup> repositoryGroups = new HashMap<>();
private Path groupsDirectory;
/**
* Creates a new instance. All dependencies are injected on the constructor.
* @param repositoryRegistry the registry. To avoid circular dependencies via DI, this class registers itself on the registry.
@ -84,14 +91,67 @@ private void init() {
log.debug( "Initializing repository group handler " + repositoryRegistry.toString( ) );
// We are registering this class on the registry. This is necessary to avoid circular dependencies via injection.
this.repositoryRegistry.registerGroupHandler( this );
initializeStorage();
}
public void initializeFromConfig() {
this.repositoryGroups.clear();
this.repositoryGroups.putAll( getRepositorGroupsFromConfig( ) );
this.repositoryGroups.putAll( getRepositoryGroupsFromConfig( ) );
for (RepositoryGroup group : this.repositoryGroups.values()) {
initializeGroup( group );
}
}
public Map<String, RepositoryGroup> getRepositorGroupsFromConfig() {
private void initializeStorage() {
Path baseDir = this.configurationHandler.getArchivaConfiguration( ).getRepositoryGroupBaseDir( );
if (!Files.exists( baseDir) ) {
try
{
Files.createDirectories( baseDir );
}
catch ( IOException e )
{
log.error( "Could not create group base directory: {}", e.getMessage( ), e );
}
}
this.groupsDirectory = baseDir;
}
private void initializeGroup(RepositoryGroup repositoryGroup) {
StorageAsset indexDirectoy = getMergedIndexDirectory( repositoryGroup );
if (!indexDirectoy.exists()) {
try
{
indexDirectoy.create( );
}
catch ( IOException e )
{
log.error( "Could not create index directory {} for group {}: {}", indexDirectoy, repositoryGroup.getId( ), e.getMessage( ) );
}
}
Path groupPath = groupsDirectory.resolve(repositoryGroup.getId() );
if ( !Files.exists(groupPath) )
{
try {
Files.createDirectories(groupPath);
} catch (IOException e) {
log.error("Could not create repository group directory {}", groupPath);
}
}
mergedRemoteIndexesScheduler.schedule( repositoryGroup,
indexDirectoy);
}
public StorageAsset getMergedIndexDirectory( RepositoryGroup group )
{
if (group!=null) {
return group.getFeature( IndexCreationFeature.class).get().getLocalIndexPath();
} else {
return null;
}
}
public Map<String, RepositoryGroup> getRepositoryGroupsFromConfig() {
try {
List<RepositoryGroupConfiguration> repositoryGroupConfigurations =
this.configurationHandler.getBaseConfiguration().getRepositoryGroups();
@ -150,6 +210,7 @@ public RepositoryGroup putRepositoryGroup( RepositoryGroup repositoryGroup ) thr
RepositoryGroup originRepoGroup = repositoryGroups.put(id, repositoryGroup);
try {
if (originRepoGroup != null && originRepoGroup != repositoryGroup) {
this.mergedRemoteIndexesScheduler.unschedule( originRepoGroup );
originRepoGroup.close();
}
RepositoryProvider provider = repositoryRegistry.getProvider( repositoryGroup.getType());
@ -162,6 +223,7 @@ public RepositoryGroup putRepositoryGroup( RepositoryGroup repositoryGroup ) thr
}
configuration.addRepositoryGroup(newCfg);
repositoryRegistry.saveConfiguration(configuration);
initializeGroup( repositoryGroup );
return repositoryGroup;
} catch (Exception e) {
// Rollback
@ -187,19 +249,19 @@ public RepositoryGroup putRepositoryGroup( RepositoryGroupConfiguration reposito
final String id = repositoryGroupConfiguration.getId();
final RepositoryType repositoryType = RepositoryType.valueOf(repositoryGroupConfiguration.getType());
Configuration configuration = this.configurationHandler.getBaseConfiguration();
RepositoryGroup repo = repositoryGroups.get(id);
RepositoryGroupConfiguration oldCfg = repo != null ? repositoryRegistry.getProvider(repositoryType).getRepositoryGroupConfiguration(repo) : null;
repo = putRepositoryGroup(repositoryGroupConfiguration, configuration);
RepositoryGroup repositoryGroup = repositoryGroups.get(id);
RepositoryGroupConfiguration oldCfg = repositoryGroup != null ? repositoryRegistry.getProvider(repositoryType).getRepositoryGroupConfiguration(repositoryGroup) : null;
repositoryGroup = putRepositoryGroup(repositoryGroupConfiguration, configuration);
try {
repositoryRegistry.saveConfiguration(configuration);
} catch ( IndeterminateConfigurationException | RegistryException e) {
if (oldCfg != null) {
repositoryRegistry.getProvider(repositoryType).updateRepositoryGroupInstance((EditableRepositoryGroup) repo, oldCfg);
repositoryRegistry.getProvider(repositoryType).updateRepositoryGroupInstance((EditableRepositoryGroup) repositoryGroup, oldCfg);
}
log.error("Could not save the configuration for repository group {}: {}", id, e.getMessage(), e);
throw new RepositoryException("Could not save the configuration for repository group " + id + ": " + e.getMessage());
}
return repo;
return repositoryGroup;
}
public RepositoryGroup putRepositoryGroup( RepositoryGroupConfiguration repositoryGroupConfiguration, Configuration configuration ) throws RepositoryException {
@ -209,6 +271,7 @@ public RepositoryGroup putRepositoryGroup( RepositoryGroupConfiguration reposito
setRepositoryGroupDefaults(repositoryGroupConfiguration);
if (repositoryGroups.containsKey(id)) {
repo = repositoryGroups.get(id);
this.mergedRemoteIndexesScheduler.unschedule( repo );
if (repo instanceof EditableRepositoryGroup) {
repositoryRegistry.getProvider(repoType).updateRepositoryGroupInstance((EditableRepositoryGroup) repo, repositoryGroupConfiguration);
} else {
@ -220,6 +283,7 @@ public RepositoryGroup putRepositoryGroup( RepositoryGroupConfiguration reposito
}
updateRepositoryReferences(repositoryRegistry.getProvider(repoType), repo, repositoryGroupConfiguration);
replaceOrAddRepositoryConfig(repositoryGroupConfiguration, configuration);
initializeGroup( repo );
return repo;
}
@ -263,6 +327,7 @@ public void removeRepositoryGroup( final String id ) throws RepositoryException
try {
repo = repositoryGroups.remove(id);
if (repo != null) {
this.mergedRemoteIndexesScheduler.unschedule( repo );
repo.close();
Configuration configuration = this.configurationHandler.getBaseConfiguration();
RepositoryGroupConfiguration cfg = configuration.findRepositoryGroupById(id);
@ -286,6 +351,7 @@ public void removeRepositoryGroup( String id, Configuration configuration ) thro
if (repo != null) {
repo = repositoryGroups.remove(id);
if (repo != null) {
this.mergedRemoteIndexesScheduler.unschedule( repo );
repo.close();
RepositoryGroupConfiguration cfg = configuration.findRepositoryGroupById(id);
if (cfg != null) {
@ -317,6 +383,7 @@ public void close() {
for (RepositoryGroup group : repositoryGroups.values()) {
try
{
mergedRemoteIndexesScheduler.unschedule( group );
group.close( );
} catch (Throwable e) {
log.error( "Could not close repository group {}: {}", group.getId( ), e.getMessage( ) );

View File

@ -22,8 +22,10 @@
import org.apache.archiva.configuration.ManagedRepositoryConfiguration;
import org.apache.archiva.configuration.RemoteRepositoryConfiguration;
import org.apache.archiva.configuration.RepositoryGroupConfiguration;
import org.apache.archiva.event.EventHandler;
import org.apache.archiva.repository.*;
import org.apache.archiva.event.Event;
import org.apache.archiva.repository.event.RepositoryEvent;
import org.apache.archiva.repository.features.ArtifactCleanupFeature;
import org.apache.archiva.repository.features.IndexCreationFeature;
import org.apache.archiva.repository.features.RemoteIndexFeature;
@ -232,6 +234,12 @@ public RepositoryGroupConfiguration getRepositoryGroupConfiguration(RepositoryGr
return null;
}
@Override
public void addRepositoryEventHandler( EventHandler<? super RepositoryEvent> eventHandler )
{
// do nothing
}
@Override
public RemoteRepositoryConfiguration getRemoteConfiguration( RemoteRepository remoteRepository ) throws RepositoryException

View File

@ -19,6 +19,7 @@
* under the License.
*/
import org.apache.archiva.common.utils.FileUtils;
import org.apache.archiva.common.utils.PathUtil;
import org.apache.archiva.configuration.ArchivaConfiguration;
import org.apache.archiva.indexer.ArchivaIndexManager;
@ -38,6 +39,7 @@
import org.apache.archiva.repository.Repository;
import org.apache.archiva.repository.RepositoryType;
import org.apache.archiva.repository.UnsupportedRepositoryTypeException;
import org.apache.archiva.repository.storage.AssetType;
import org.apache.archiva.repository.storage.fs.FilesystemStorage;
import org.apache.archiva.repository.storage.RepositoryStorage;
import org.apache.archiva.repository.storage.StorageAsset;
@ -499,7 +501,8 @@ public ArchivaIndexingContext move(ArchivaIndexingContext context, Repository re
StorageAsset newPath = getIndexPath(repo);
IndexingContext ctx = context.getBaseContext(IndexingContext.class);
Path oldPath = ctx.getIndexDirectoryFile().toPath();
if (oldPath.equals(newPath)) {
Path newFilePath = newPath.getFilePath( );
if (oldPath.equals(newFilePath)) {
// Nothing to do, if path does not change
return context;
}
@ -510,7 +513,13 @@ public ArchivaIndexingContext move(ArchivaIndexingContext context, Repository re
return createContext(repo);
} else {
context.close(false);
Files.move(oldPath, newPath.getFilePath());
if (Files.exists( newFilePath )) {
FileUtils.copyContent( oldPath, newFilePath );
FileUtils.deleteDirectory( oldPath );
} else
{
Files.move( oldPath, newFilePath );
}
return createContext(repo);
}
} catch (IOException e) {
@ -629,7 +638,7 @@ private StorageAsset getIndexPath(URI indexDirUri, RepositoryStorage repoStorage
if ( !indexDir.exists() )
{
indexDir = storage.addAsset(indexDir.getPath(), true);
indexDir.create( AssetType.CONTAINER );
}
return indexDir;
}
@ -758,11 +767,23 @@ private String calculateIndexRemoteUrl( URI baseUri, RemoteIndexFeature rif )
{
if ( rif.getIndexUri( ) == null )
{
return baseUri.resolve( DEFAULT_INDEX_PATH ).toString( );
return baseUri.resolve( "/"+DEFAULT_INDEX_PATH ).toString( );
}
else
{
return baseUri.resolve( rif.getIndexUri( ) ).toString( );
URI rifUri = rif.getIndexUri( );
if (rifUri.isAbsolute()) {
return rifUri.toString( );
} else
{
if (baseUri.getScheme().toLowerCase().equals( "file" )) {
return Paths.get( baseUri ).resolve( rifUri.getPath() ).toUri( ).toString( );
} else
{
String pathString = rifUri.getPath( ).startsWith( "/" ) ? rifUri.getPath( ) : "/" + rifUri.getPath( );
return baseUri.resolve( pathString ).toString( );
}
}
}
}

View File

@ -22,6 +22,7 @@
import org.apache.archiva.configuration.ManagedRepositoryConfiguration;
import org.apache.archiva.configuration.RemoteRepositoryConfiguration;
import org.apache.archiva.configuration.RepositoryGroupConfiguration;
import org.apache.archiva.event.EventHandler;
import org.apache.archiva.repository.base.BasicManagedRepository;
import org.apache.archiva.repository.base.BasicRemoteRepository;
import org.apache.archiva.repository.EditableManagedRepository;
@ -37,6 +38,7 @@
import org.apache.archiva.repository.RepositoryGroup;
import org.apache.archiva.repository.RepositoryProvider;
import org.apache.archiva.repository.RepositoryType;
import org.apache.archiva.repository.event.RepositoryEvent;
import org.apache.archiva.repository.features.ArtifactCleanupFeature;
import org.apache.archiva.repository.features.IndexCreationFeature;
import org.apache.archiva.repository.features.RemoteIndexFeature;
@ -249,6 +251,12 @@ public RepositoryGroupConfiguration getRepositoryGroupConfiguration( RepositoryG
return null;
}
@Override
public void addRepositoryEventHandler( EventHandler<? super RepositoryEvent> eventHandler )
{
// do nothing
}
@Override
public RemoteRepositoryConfiguration getRemoteConfiguration( RemoteRepository remoteRepository ) throws RepositoryException

View File

@ -26,6 +26,9 @@
import org.apache.archiva.configuration.RemoteRepositoryConfiguration;
import org.apache.archiva.configuration.RepositoryGroupConfiguration;
import org.apache.archiva.event.Event;
import org.apache.archiva.event.EventHandler;
import org.apache.archiva.event.EventManager;
import org.apache.archiva.event.EventType;
import org.apache.archiva.repository.EditableManagedRepository;
import org.apache.archiva.repository.EditableRemoteRepository;
import org.apache.archiva.repository.EditableRepository;
@ -33,6 +36,7 @@
import org.apache.archiva.repository.ManagedRepository;
import org.apache.archiva.repository.ReleaseScheme;
import org.apache.archiva.repository.RemoteRepository;
import org.apache.archiva.repository.Repository;
import org.apache.archiva.repository.RepositoryCredentials;
import org.apache.archiva.repository.RepositoryException;
import org.apache.archiva.repository.RepositoryGroup;
@ -41,6 +45,7 @@
import org.apache.archiva.repository.UnsupportedURIException;
import org.apache.archiva.repository.base.BasicManagedRepository;
import org.apache.archiva.repository.base.PasswordCredentials;
import org.apache.archiva.repository.event.RepositoryEvent;
import org.apache.archiva.repository.features.ArtifactCleanupFeature;
import org.apache.archiva.repository.features.IndexCreationFeature;
import org.apache.archiva.repository.features.RemoteIndexFeature;
@ -61,7 +66,9 @@
import java.time.Duration;
import java.time.Period;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
@ -81,6 +88,29 @@ public class MavenRepositoryProvider implements RepositoryProvider {
@Inject
private FileLockManager fileLockManager;
private class EventHandlerInfo {
EventType<?> type;
EventHandler<?> handler;
public EventHandlerInfo( EventType<?> type, EventHandler<?> handler )
{
this.type = type;
this.handler = handler;
}
public EventType<?> getType( )
{
return type;
}
public EventHandler<?> getHandler( )
{
return handler;
}
}
private List<EventHandler<? super RepositoryEvent>> repositoryEventHandlers = new ArrayList<>( );
private static final Logger log = LoggerFactory.getLogger(MavenRepositoryProvider.class);
static final Set<RepositoryType> TYPES = new HashSet<>();
@ -100,14 +130,16 @@ public MavenManagedRepository createManagedInstance(String id, String name) {
}
public MavenManagedRepository createManagedInstance(String id, String name, Path baseDir) {
FilesystemStorage storage = null;
FilesystemStorage storage;
try {
storage = new FilesystemStorage(baseDir.resolve(id), fileLockManager);
} catch (IOException e) {
log.error("Could not initialize fileystem for repository {}", id);
throw new RuntimeException(e);
}
return new MavenManagedRepository(id, name, storage);
MavenManagedRepository repo = new MavenManagedRepository( id, name, storage );
registerEventHandler( repo );
return repo;
}
@Override
@ -116,14 +148,16 @@ public MavenRemoteRepository createRemoteInstance(String id, String name) {
}
public MavenRemoteRepository createRemoteInstance(String id, String name, Path baseDir) {
FilesystemStorage storage = null;
FilesystemStorage storage;
try {
storage = new FilesystemStorage(baseDir.resolve(id), fileLockManager);
} catch (IOException e) {
log.error("Could not initialize fileystem for repository {}", id);
throw new RuntimeException(e);
}
return new MavenRemoteRepository(id, name, storage);
MavenRemoteRepository repo = new MavenRemoteRepository( id, name, storage );
registerEventHandler( repo );
return repo;
}
@Override
@ -132,14 +166,22 @@ public EditableRepositoryGroup createRepositoryGroup(String id, String name) {
}
public MavenRepositoryGroup createRepositoryGroup(String id, String name, Path baseDir) {
FilesystemStorage storage = null;
FilesystemStorage storage;
try {
storage = new FilesystemStorage(baseDir.resolve(id), fileLockManager);
} catch (IOException e) {
log.error("Could not initialize fileystem for repository {}", id);
throw new RuntimeException(e);
}
return new MavenRepositoryGroup(id, name, storage);
MavenRepositoryGroup group = new MavenRepositoryGroup( id, name, storage );
registerEventHandler( group );
return group;
}
private void registerEventHandler( Repository repo ) {
for (EventHandler<? super RepositoryEvent> eventHandler : repositoryEventHandlers) {
repo.registerEventHandler( RepositoryEvent.ANY, eventHandler );
}
}
private URI getURIFromString(String uriStr) throws RepositoryException {
@ -166,7 +208,7 @@ private URI getURIFromString(String uriStr) throws RepositoryException {
try {
uri = new URI(newCfg);
} catch (URISyntaxException e1) {
log.error("Could not create URI from {} -> ", uriStr, newCfg);
log.error("Could not create URI from {} -> {}", uriStr, newCfg);
throw new RepositoryException("The config entry " + uriStr + " cannot be converted to URI.");
}
}
@ -421,16 +463,8 @@ public ManagedRepositoryConfiguration getManagedConfiguration(ManagedRepository
cfg.setRetentionPeriod(artifactCleanupFeature.getRetentionPeriod().getDays());
cfg.setDeleteReleasedSnapshots(artifactCleanupFeature.isDeleteReleasedSnapshots());
if (managedRepository.getActiveReleaseSchemes().contains(ReleaseScheme.RELEASE)) {
cfg.setReleases(true);
} else {
cfg.setReleases(false);
}
if (managedRepository.getActiveReleaseSchemes().contains(ReleaseScheme.SNAPSHOT)) {
cfg.setSnapshots(true);
} else {
cfg.setSnapshots(false);
}
cfg.setReleases( managedRepository.getActiveReleaseSchemes( ).contains( ReleaseScheme.RELEASE ) );
cfg.setSnapshots( managedRepository.getActiveReleaseSchemes( ).contains( ReleaseScheme.SNAPSHOT ) );
return cfg;
}
@ -450,11 +484,17 @@ public RepositoryGroupConfiguration getRepositoryGroupConfiguration(RepositoryGr
cfg.setMergedIndexPath( indexCreationFeature.getIndexPath().toString() );
}
cfg.setMergedIndexTtl(repositoryGroup.getMergedIndexTTL());
cfg.setRepositories(repositoryGroup.getRepositories().stream().map(r -> r.getId()).collect(Collectors.toList()));
cfg.setRepositories(repositoryGroup.getRepositories().stream().map( Repository::getId ).collect(Collectors.toList()));
cfg.setCronExpression(repositoryGroup.getSchedulingDefinition());
return cfg;
}
@Override
public void addRepositoryEventHandler( EventHandler<? super RepositoryEvent> eventHandler )
{
this.repositoryEventHandlers.add( eventHandler );
}
private ManagedRepositoryConfiguration getStageRepoConfig(ManagedRepositoryConfiguration repository) {
ManagedRepositoryConfiguration stagingRepository = new ManagedRepositoryConfiguration();
stagingRepository.setId(repository.getId() + StagingRepositoryFeature.STAGING_REPO_POSTFIX);
@ -470,7 +510,7 @@ private ManagedRepositoryConfiguration getStageRepoConfig(ManagedRepositoryConfi
stagingRepository.setLocation(path.substring(0, lastIndex) + "/" + stagingRepository.getId());
if (StringUtils.isNotBlank(repository.getIndexDir())) {
Path indexDir = null;
Path indexDir;
try {
indexDir = Paths.get(new URI(repository.getIndexDir().startsWith("file://") ? repository.getIndexDir() : "file://" + repository.getIndexDir()));
if (indexDir.isAbsolute()) {
@ -488,7 +528,7 @@ private ManagedRepositoryConfiguration getStageRepoConfig(ManagedRepositoryConfi
// in case of absolute dir do not use the same
}
if (StringUtils.isNotBlank(repository.getPackedIndexDir())) {
Path packedIndexDir = null;
Path packedIndexDir;
packedIndexDir = Paths.get(repository.getPackedIndexDir());
if (packedIndexDir.isAbsolute()) {
Path newDir = packedIndexDir.getParent().resolve(packedIndexDir.getFileName() + StagingRepositoryFeature.STAGING_REPO_POSTFIX);

View File

@ -109,7 +109,7 @@ public void initialize()
server = new Server( );
serverConnector = new ServerConnector( server, new HttpConnectionFactory());
server.addConnector( serverConnector );
createContext( server, Paths.get( "src/test/" ) );
createContext( server, Paths.get( "src/test" ) );
this.server.start();
this.port = serverConnector.getLocalPort();
log.info( "start server on port {}", this.port );
@ -185,13 +185,13 @@ protected RemoteRepository getRemoteRepository(Path repoDirectory) throws IOExce
Files.createDirectories( indexDirectory );
remoteRepository.setLocation( new URI( "http://localhost:" + port ) );
repoDirectory.toFile().deleteOnExit();
createIndexingContext( remoteRepository );
RemoteIndexFeature rif = remoteRepository.getFeature( RemoteIndexFeature.class ).get();
rif.setDownloadRemoteIndex( true );
rif.setIndexUri( new URI("http://localhost:" + port + "/index-updates/" ) );
IndexCreationFeature icf = remoteRepository.getFeature( IndexCreationFeature.class ).get( );
icf.setLocalIndexPath( remoteRepository.getAsset( "index" ) );
createIndexingContext( remoteRepository );
// IndexCreationFeature icf = remoteRepository.getFeature( IndexCreationFeature.class ).get( );
// icf.setLocalIndexPath( remoteRepository.getAsset( "index" ) );
return remoteRepository;
}

View File

@ -67,7 +67,7 @@ public void testBrowse()
// dumpResponse( response );
List<String> expectedLinks = Arrays.asList( ".indexer/", "commons-lang/", "net/", "org/" );
List<String> expectedLinks = Arrays.asList( ".index/", ".indexer/", "commons-lang/", "net/", "org/" );
Document document = Jsoup.parse( response.getContentAsString() );
Elements elements = document.getElementsByTag( "a" );