123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653 |
- package org.apache.archiva.repository.base;
-
- /*
- * 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.components.registry.RegistryException;
- import org.apache.archiva.configuration.ArchivaConfiguration;
- import org.apache.archiva.configuration.Configuration;
- import org.apache.archiva.configuration.ConfigurationEvent;
- import org.apache.archiva.configuration.ConfigurationListener;
- import org.apache.archiva.configuration.IndeterminateConfigurationException;
- import org.apache.archiva.configuration.ManagedRepositoryConfiguration;
- import org.apache.archiva.configuration.ProxyConnectorConfiguration;
- 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.indexer.ArchivaIndexManager;
- import org.apache.archiva.indexer.ArchivaIndexingContext;
- import org.apache.archiva.indexer.IndexCreationFailedException;
- import org.apache.archiva.indexer.IndexManagerFactory;
- import org.apache.archiva.indexer.IndexUpdateFailedException;
- import org.apache.archiva.repository.base.group.RepositoryGroupHandler;
- import org.apache.archiva.repository.validation.CheckedResult;
- import org.apache.archiva.repository.EditableManagedRepository;
- import org.apache.archiva.repository.EditableRemoteRepository;
- import org.apache.archiva.repository.EditableRepository;
- import org.apache.archiva.repository.ManagedRepository;
- import org.apache.archiva.repository.RemoteRepository;
- import org.apache.archiva.repository.Repository;
- import org.apache.archiva.repository.RepositoryContentFactory;
- import org.apache.archiva.repository.RepositoryException;
- import org.apache.archiva.repository.RepositoryGroup;
- import org.apache.archiva.repository.RepositoryProvider;
- import org.apache.archiva.repository.RepositoryRegistry;
- import org.apache.archiva.repository.RepositoryType;
- import org.apache.archiva.repository.UnsupportedRepositoryTypeException;
- import org.apache.archiva.repository.event.LifecycleEvent;
- import org.apache.archiva.repository.event.RepositoryEvent;
- import org.apache.archiva.repository.event.RepositoryIndexEvent;
- import org.apache.archiva.repository.event.RepositoryRegistryEvent;
- import org.apache.archiva.repository.features.IndexCreationFeature;
- import org.apache.archiva.repository.features.StagingRepositoryFeature;
- import org.apache.archiva.repository.metadata.MetadataReader;
- import org.apache.archiva.repository.storage.StorageAsset;
- import org.apache.archiva.repository.validation.RepositoryValidator;
- import org.apache.archiva.repository.validation.ValidationError;
- import org.apache.archiva.repository.validation.ValidationResponse;
- import org.apache.commons.collections4.ListUtils;
- import org.apache.commons.lang3.StringUtils;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.stereotype.Service;
-
- import javax.annotation.PostConstruct;
- import javax.annotation.PreDestroy;
- import javax.inject.Inject;
- import javax.inject.Named;
- import java.util.ArrayList;
- import java.util.Collection;
- import java.util.Collections;
- import java.util.HashMap;
- import java.util.HashSet;
- import java.util.List;
- import java.util.Map;
- import java.util.Set;
- import java.util.TreeSet;
- import java.util.concurrent.atomic.AtomicBoolean;
- import java.util.concurrent.locks.ReentrantReadWriteLock;
- import java.util.stream.Collectors;
- import java.util.stream.Stream;
-
- /**
- * Registry for repositories. This is the central entry point for repositories. It provides methods for
- * retrieving, adding and removing repositories.
- * <p>
- * The modification methods addXX and removeXX persist the changes immediately to the configuration. If the
- * configuration save fails the changes are rolled back.
- * <p>
- * TODO: Audit events
- *
- * @since 3.0
- */
- @Service( "repositoryRegistry" )
- public class ArchivaRepositoryRegistry implements ConfigurationListener, EventHandler<Event>,
- RepositoryRegistry
- {
-
- private static final Logger log = LoggerFactory.getLogger( RepositoryRegistry.class );
-
- /**
- * We inject all repository providers
- */
- @Inject
- List<RepositoryProvider> repositoryProviders;
-
- @Inject
- IndexManagerFactory indexManagerFactory;
-
- @Inject
- List<MetadataReader> metadataReaderList;
-
- @Inject
- @Named( "repositoryContentFactory#default" )
- RepositoryContentFactory repositoryContentFactory;
-
-
- private final EventManager eventManager;
-
-
- private Map<String, ManagedRepository> managedRepositories = new HashMap<>( );
- private Map<String, ManagedRepository> uManagedRepository = Collections.unmodifiableMap( managedRepositories );
-
- private Map<String, RemoteRepository> remoteRepositories = new HashMap<>( );
- private Map<String, RemoteRepository> uRemoteRepositories = Collections.unmodifiableMap( remoteRepositories );
-
- private ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock( );
-
- private RepositoryGroupHandler groupHandler;
- private final Set<RepositoryValidator<? extends Repository>> validators;
- private final ConfigurationHandler configurationHandler;
-
-
- private AtomicBoolean groups_initalized = new AtomicBoolean( false );
- private AtomicBoolean managed_initialized = new AtomicBoolean( false );
- private AtomicBoolean remote_initialized = new AtomicBoolean( false );
-
-
- public ArchivaRepositoryRegistry( ConfigurationHandler configurationHandler, List<RepositoryValidator<? extends Repository>> validatorList )
- {
- this.eventManager = new EventManager( this );
- this.configurationHandler = configurationHandler;
- this.validators = initValidatorList( validatorList );
- }
-
-
- private Set<RepositoryValidator<? extends Repository>> initValidatorList( List<RepositoryValidator<? extends Repository>> validators )
- {
- TreeSet<RepositoryValidator<? extends Repository>> val = new TreeSet<>( );
- for (RepositoryValidator<? extends Repository> validator : validators) {
- val.add( validator );
- }
- return val;
- }
-
- @Override
- public void setArchivaConfiguration( ArchivaConfiguration archivaConfiguration )
- {
- this.configurationHandler.setArchivaConfiguration( archivaConfiguration );
- }
-
- @PostConstruct
- private void initialize( )
- {
- rwLock.writeLock( ).lock( );
- try
- {
- log.debug( "Initializing repository registry" );
- updateManagedRepositoriesFromConfig( );
- pushEvent( new RepositoryRegistryEvent( RepositoryRegistryEvent.MANAGED_REPOS_INITIALIZED, this ) );
- managed_initialized.set( true );
- updateRemoteRepositoriesFromConfig( );
- pushEvent( new RepositoryRegistryEvent( RepositoryRegistryEvent.REMOTE_REPOS_INITIALIZED, this ) );
- remote_initialized.set( true );
-
- initializeRepositoryGroups( );
-
- for ( RepositoryProvider provider : repositoryProviders )
- {
- provider.addRepositoryEventHandler( this );
- }
- this.configurationHandler.addListener( this );
- }
- finally
- {
- rwLock.writeLock( ).unlock( );
- }
- pushEvent( new RepositoryRegistryEvent( RepositoryRegistryEvent.RELOADED, this ) );
- if ( managed_initialized.get( ) && remote_initialized.get( ) && groups_initalized.get( ) )
- {
- pushEvent( new RepositoryRegistryEvent( RepositoryRegistryEvent.INITIALIZED, this ) );
- }
- }
-
- private void initializeRepositoryGroups( )
- {
- if ( this.groupHandler != null )
- {
- this.groupHandler.initializeFromConfig( );
- this.groups_initalized.set( true );
- pushEvent( new RepositoryRegistryEvent( RepositoryRegistryEvent.GROUPS_INITIALIZED, this ) );
- }
- }
-
- public void registerGroupHandler( RepositoryGroupHandler groupHandler )
- {
- this.groupHandler = groupHandler;
- initializeRepositoryGroups( );
- if ( managed_initialized.get( ) && remote_initialized.get( ) && groups_initalized.get( ) )
- {
- pushEvent( new RepositoryRegistryEvent( RepositoryRegistryEvent.INITIALIZED, this ) );
- }
- }
-
-
- @PreDestroy
- public void destroy( )
- {
- for ( ManagedRepository rep : managedRepositories.values( ) )
- {
- rep.close( );
- }
- managedRepositories.clear( );
- for ( RemoteRepository repo : remoteRepositories.values( ) )
- {
- repo.close( );
- }
- remoteRepositories.clear( );
- groupHandler.close( );
- pushEvent( new RepositoryRegistryEvent( RepositoryRegistryEvent.DESTROYED, this ) );
- }
-
-
- public Map<RepositoryType, RepositoryProvider> getRepositoryProviderMap( )
- {
- Map<RepositoryType, RepositoryProvider> map = new HashMap<>( );
- if ( repositoryProviders != null )
- {
- for ( RepositoryProvider provider : repositoryProviders )
- {
- for ( RepositoryType type : provider.provides( ) )
- {
- map.put( type, provider );
- }
- }
- }
- return map;
- }
-
- public RepositoryProvider getProvider( RepositoryType type ) throws RepositoryException
- {
- return repositoryProviders.stream( ).filter( repositoryProvider -> repositoryProvider.provides( ).contains( type ) ).findFirst( ).orElseThrow( ( ) -> new RepositoryException( "Repository type cannot be handled: " + type ) );
- }
-
- /*
- * Updates the repositories
- */
- private void updateManagedRepositoriesFromConfig( )
- {
- try
- {
-
- Set<String> configRepoIds = new HashSet<>( );
- List<ManagedRepositoryConfiguration> managedRepoConfigs =
- configurationHandler.getBaseConfiguration( ).getManagedRepositories( );
-
- if ( managedRepoConfigs == null )
- {
- return;
- }
-
- for ( ManagedRepositoryConfiguration repoConfig : managedRepoConfigs )
- {
- ManagedRepository repo = putRepository( repoConfig, null );
- configRepoIds.add( repoConfig.getId( ) );
- if ( repo.supportsFeature( StagingRepositoryFeature.class ) )
- {
- StagingRepositoryFeature stagF = repo.getFeature( StagingRepositoryFeature.class ).get( );
- if ( stagF.getStagingRepository( ) != null )
- {
- configRepoIds.add( stagF.getStagingRepository( ).getId( ) );
- }
- }
- }
- List<String> toRemove = managedRepositories.keySet( ).stream( ).filter( id -> !configRepoIds.contains( id ) ).collect( Collectors.toList( ) );
- for ( String id : toRemove )
- {
- ManagedRepository removed = managedRepositories.remove( id );
- removed.close( );
- }
- }
- catch ( Throwable e )
- {
- log.error( "Could not initialize repositories from config: {}", e.getMessage( ), e );
- return;
- }
- }
-
- private ManagedRepository createNewManagedRepository( RepositoryProvider provider, ManagedRepositoryConfiguration cfg ) throws RepositoryException
- {
- log.debug( "Creating repo {}", cfg.getId( ) );
- ManagedRepository repo = provider.createManagedInstance( cfg );
- repo.registerEventHandler( RepositoryEvent.ANY, this );
- updateRepositoryReferences( provider, repo, cfg, null );
- return repo;
-
- }
-
- private String getStagingId( String repoId )
- {
- return repoId + StagingRepositoryFeature.STAGING_REPO_POSTFIX;
- }
-
- @SuppressWarnings( "unchecked" )
- private void updateRepositoryReferences( RepositoryProvider provider, ManagedRepository repo, ManagedRepositoryConfiguration cfg, Configuration configuration ) throws RepositoryException
- {
- log.debug( "Updating references of repo {}", repo.getId( ) );
- if ( repo.supportsFeature( StagingRepositoryFeature.class ) )
- {
- StagingRepositoryFeature feature = repo.getFeature( StagingRepositoryFeature.class ).get( );
- if ( feature.isStageRepoNeeded( ) && feature.getStagingRepository( ) == null )
- {
- ManagedRepository stageRepo = getManagedRepository( getStagingId( repo.getId( ) ) );
- if ( stageRepo == null )
- {
- stageRepo = getStagingRepository( provider, cfg, configuration );
- managedRepositories.put( stageRepo.getId( ), stageRepo );
- if ( configuration != null )
- {
- replaceOrAddRepositoryConfig( provider.getManagedConfiguration( stageRepo ), configuration );
- }
- pushEvent( new LifecycleEvent( LifecycleEvent.REGISTERED, this, stageRepo ) );
- }
- feature.setStagingRepository( stageRepo );
- }
- }
- if ( repo instanceof EditableManagedRepository )
- {
- EditableManagedRepository editableRepo = (EditableManagedRepository) repo;
- if ( repo.getContent( ) == null )
- {
- editableRepo.setContent( repositoryContentFactory.getManagedRepositoryContent( repo ) );
- editableRepo.getContent( ).setRepository( editableRepo );
- }
- log.debug( "Index repo: " + repo.hasIndex( ) );
- if ( repo.hasIndex( ) && ( repo.getIndexingContext( ) == null || !repo.getIndexingContext( ).isOpen( ) ) )
- {
- log.debug( "Creating indexing context for {}", repo.getId( ) );
- createIndexingContext( editableRepo );
- }
- }
- repo.registerEventHandler( RepositoryEvent.ANY, this );
- }
-
- @Override
- public ArchivaIndexManager getIndexManager( RepositoryType type )
- {
- return indexManagerFactory.getIndexManager( type );
- }
-
- @Override
- public MetadataReader getMetadataReader( final RepositoryType type ) throws UnsupportedRepositoryTypeException
- {
- if ( metadataReaderList != null )
- {
- return metadataReaderList.stream( ).filter( mr -> mr.isValidForType( type ) ).findFirst( ).orElseThrow( ( ) -> new UnsupportedRepositoryTypeException( type ) );
- }
- else
- {
- throw new UnsupportedRepositoryTypeException( type );
- }
- }
-
- private void createIndexingContext( EditableRepository editableRepo ) throws RepositoryException
- {
- if ( editableRepo.supportsFeature( IndexCreationFeature.class ) )
- {
- ArchivaIndexManager idxManager = getIndexManager( editableRepo.getType( ) );
- try
- {
- editableRepo.setIndexingContext( idxManager.createContext( editableRepo ) );
- idxManager.updateLocalIndexPath( editableRepo );
- }
- catch ( IndexCreationFailedException e )
- {
- throw new RepositoryException( "Could not create index for repository " + editableRepo.getId( ) + ": " + e.getMessage( ), e );
- }
- }
- }
-
- private ManagedRepository getStagingRepository( RepositoryProvider provider, ManagedRepositoryConfiguration baseRepoCfg, Configuration configuration ) throws RepositoryException
- {
- ManagedRepository stageRepo = getManagedRepository( getStagingId( baseRepoCfg.getId( ) ) );
- if ( stageRepo == null )
- {
- stageRepo = provider.createStagingInstance( baseRepoCfg );
- if ( stageRepo.supportsFeature( StagingRepositoryFeature.class ) )
- {
- stageRepo.getFeature( StagingRepositoryFeature.class ).get( ).setStageRepoNeeded( false );
- }
- ManagedRepositoryConfiguration stageCfg = provider.getManagedConfiguration( stageRepo );
- updateRepositoryReferences( provider, stageRepo, stageCfg, configuration );
- }
- return stageRepo;
- }
-
-
- private void updateRemoteRepositoriesFromConfig( )
- {
- try
- {
- List<RemoteRepositoryConfiguration> remoteRepoConfigs =
- configurationHandler.getBaseConfiguration( ).getRemoteRepositories( );
-
- if ( remoteRepoConfigs == null )
- {
- return;
- }
- Set<String> repoIds = new HashSet<>( );
- for ( RemoteRepositoryConfiguration repoConfig : remoteRepoConfigs )
- {
- putRepository( repoConfig, null );
- repoIds.add( repoConfig.getId( ) );
- }
-
- List<String> toRemove = remoteRepositories.keySet( ).stream( ).filter( id -> !repoIds.contains( id ) ).collect( Collectors.toList( ) );
- for ( String id : toRemove )
- {
- RemoteRepository removed = remoteRepositories.remove( id );
- removed.close( );
- }
-
- }
- catch ( Throwable e )
- {
- log.error( "Could not initialize remote repositories from config: {}", e.getMessage( ), e );
- return;
- }
- }
-
- private RemoteRepository createNewRemoteRepository( RepositoryProvider provider, RemoteRepositoryConfiguration cfg ) throws RepositoryException
- {
- log.debug( "Creating remote repo {}", cfg.getId( ) );
- RemoteRepository repo = provider.createRemoteInstance( cfg );
- updateRepositoryReferences( provider, repo, cfg, null );
- return repo;
-
- }
-
- private void updateRepositoryReferences( RepositoryProvider provider, RemoteRepository repo, RemoteRepositoryConfiguration cfg, Configuration configuration ) throws RepositoryException
- {
- if ( repo instanceof EditableRemoteRepository && repo.getContent( ) == null )
- {
- EditableRemoteRepository editableRepo = (EditableRemoteRepository) repo;
- editableRepo.setContent( repositoryContentFactory.getRemoteRepositoryContent( repo ) );
- if ( repo.supportsFeature( IndexCreationFeature.class ) && repo.getIndexingContext( ) == null )
- {
- createIndexingContext( editableRepo );
- }
- }
- repo.registerEventHandler( RepositoryEvent.ANY, this );
- }
-
-
- /**
- * Returns all repositories that are registered. There is no defined order of the returned repositories.
- *
- * @return a list of managed and remote repositories
- */
- @Override
- public Collection<Repository> getRepositories( )
- {
- rwLock.readLock( ).lock( );
- try
- {
- return Stream.concat( managedRepositories.values( ).stream( ), remoteRepositories.values( ).stream( ) ).collect( Collectors.toList( ) );
- }
- finally
- {
- rwLock.readLock( ).unlock( );
- }
- }
-
- /**
- * Returns only the managed repositories. There is no defined order of the returned repositories.
- *
- * @return a list of managed repositories
- */
- @Override
- public Collection<ManagedRepository> getManagedRepositories( )
- {
- rwLock.readLock( ).lock( );
- try
- {
- return uManagedRepository.values( );
- }
- finally
- {
- rwLock.readLock( ).unlock( );
- }
- }
-
- /**
- * Returns only the remote repositories. There is no defined order of the returned repositories.
- *
- * @return a list of remote repositories
- */
- @Override
- public Collection<RemoteRepository> getRemoteRepositories( )
- {
- rwLock.readLock( ).lock( );
- try
- {
- return uRemoteRepositories.values( );
- }
- finally
- {
- rwLock.readLock( ).unlock( );
- }
- }
-
- @Override
- public Collection<RepositoryGroup> getRepositoryGroups( )
- {
- rwLock.readLock( ).lock( );
- try
- {
- return groupHandler.getAll( );
- }
- finally
- {
- rwLock.readLock( ).unlock( );
- }
- }
-
- /**
- * Returns the repository with the given id. The returned repository may be a managed or remote repository.
- * It returns null, if no repository is registered with the given id.
- *
- * @param repoId the repository id
- * @return the repository if found, otherwise null
- */
- @Override
- public Repository getRepository( String repoId )
- {
- rwLock.readLock( ).lock( );
- try
- {
- log.debug( "getRepository {}", repoId );
- if ( managedRepositories.containsKey( repoId ) )
- {
- log.debug( "Managed repo" );
- return managedRepositories.get( repoId );
- }
- else if ( remoteRepositories.containsKey( repoId ) )
- {
- log.debug( "Remote repo" );
- return remoteRepositories.get( repoId );
- }
- else if ( groupHandler.has( repoId ) )
- {
- return groupHandler.get( repoId );
- }
- else
- {
- return null;
- }
- }
- finally
- {
- rwLock.readLock( ).unlock( );
- }
- }
-
- /**
- * Convenience method, that returns the managed repository with the given id.
- * It returns null, if no managed repository is registered with this id.
- *
- * @param repoId the repository id
- * @return the managed repository if found, otherwise null
- */
- @Override
- public ManagedRepository getManagedRepository( String repoId )
- {
- rwLock.readLock( ).lock( );
- try
- {
- return managedRepositories.get( repoId );
- }
- finally
- {
- rwLock.readLock( ).unlock( );
- }
- }
-
- /**
- * Convenience method, that returns the remote repository with the given id.
- * It returns null, if no remote repository is registered with this id.
- *
- * @param repoId the repository id
- * @return the remote repository if found, otherwise null
- */
- @Override
- public RemoteRepository getRemoteRepository( String repoId )
- {
- rwLock.readLock( ).lock( );
- try
- {
- return remoteRepositories.get( repoId );
- }
- finally
- {
- rwLock.readLock( ).unlock( );
- }
- }
-
- @Override
- public RepositoryGroup getRepositoryGroup( String groupId )
- {
- rwLock.readLock( ).lock( );
- try
- {
- return groupHandler.get( groupId );
- }
- finally
- {
- rwLock.readLock( ).unlock( );
- }
- }
-
- @Override
- public boolean hasRepository( String repoId )
- {
- return this.managedRepositories.containsKey( repoId ) || this.remoteRepositories.containsKey( repoId ) || groupHandler.has( repoId );
- }
-
- @Override
- public boolean hasManagedRepository( String repoId )
- {
- return this.managedRepositories.containsKey( repoId );
- }
-
- @Override
- public boolean hasRemoteRepository( String repoId )
- {
- return this.remoteRepositories.containsKey( repoId );
- }
-
- @Override
- public boolean hasRepositoryGroup( String groupId )
- {
- return groupHandler.has( groupId );
- }
-
- protected void saveConfiguration( Configuration configuration ) throws IndeterminateConfigurationException, RegistryException
- {
- configurationHandler.save( configuration, ConfigurationHandler.REGISTRY_EVENT_TAG );
- }
-
- /**
- * Adds a new repository to the current list, or replaces the repository definition with
- * the same id, if it exists already.
- * The change is saved to the configuration immediately.
- *
- * @param managedRepository the new repository.
- * @throws RepositoryException if the new repository could not be saved to the configuration.
- */
- @Override
- public ManagedRepository putRepository( ManagedRepository managedRepository ) throws RepositoryException
- {
- rwLock.writeLock( ).lock( );
- try
- {
- final String id = managedRepository.getId( );
- if ( remoteRepositories.containsKey( id ) )
- {
- throw new RepositoryException( "There exists a remote repository with id " + id + ". Could not update with managed repository." );
- }
- ManagedRepository originRepo = managedRepositories.put( id, managedRepository );
- try
- {
- if ( originRepo != null && originRepo != managedRepository )
- {
- originRepo.close( );
- }
- RepositoryProvider provider = getProvider( managedRepository.getType( ) );
- ManagedRepositoryConfiguration newCfg = provider.getManagedConfiguration( managedRepository );
- Configuration configuration = configurationHandler.getBaseConfiguration( );
- updateRepositoryReferences( provider, managedRepository, newCfg, configuration );
- ManagedRepositoryConfiguration oldCfg = configuration.findManagedRepositoryById( id );
- if ( oldCfg != null )
- {
- configuration.removeManagedRepository( oldCfg );
- }
- configuration.addManagedRepository( newCfg );
- saveConfiguration( configuration );
- if ( originRepo != managedRepository )
- {
- pushEvent( new LifecycleEvent( LifecycleEvent.REGISTERED, this, managedRepository ) );
- }
- else
- {
- pushEvent( new LifecycleEvent( LifecycleEvent.UPDATED, this, managedRepository ) );
- }
- return managedRepository;
- }
- catch ( Exception e )
- {
- // Rollback only partly, because repository is closed already
- if ( originRepo != null )
- {
- managedRepositories.put( id, originRepo );
- }
- else
- {
- managedRepositories.remove( id );
- }
- log.error( "Exception during configuration update {}", e.getMessage( ), e );
- throw new RepositoryException( "Could not save the configuration" + ( e.getMessage( ) == null ? "" : ": " + e.getMessage( ) ) );
- }
- }
- finally
- {
- rwLock.writeLock( ).unlock( );
- }
- }
-
- /**
- * Adds a new repository or updates the repository with the same id, if it exists already.
- * The configuration is saved immediately.
- *
- * @param managedRepositoryConfiguration the repository configuration
- * @return the updated or created repository
- * @throws RepositoryException if an error occurs, or the configuration is not valid.
- */
- @Override
- public ManagedRepository putRepository( ManagedRepositoryConfiguration managedRepositoryConfiguration ) throws RepositoryException
- {
- rwLock.writeLock( ).lock( );
- try
- {
- final String id = managedRepositoryConfiguration.getId( );
- final RepositoryType repositoryType = RepositoryType.valueOf( managedRepositoryConfiguration.getType( ) );
- Configuration configuration = configurationHandler.getBaseConfiguration( );
- ManagedRepository repo = managedRepositories.get( id );
- ManagedRepositoryConfiguration oldCfg = repo != null ? getProvider( repositoryType ).getManagedConfiguration( repo ) : null;
- repo = putRepository( managedRepositoryConfiguration, configuration );
- try
- {
- saveConfiguration( configuration );
- }
- catch ( IndeterminateConfigurationException | RegistryException e )
- {
- if ( oldCfg != null )
- {
- getProvider( repositoryType ).updateManagedInstance( (EditableManagedRepository) repo, oldCfg );
- }
- log.error( "Could not save the configuration for repository {}: {}", id, e.getMessage( ), e );
- throw new RepositoryException( "Could not save the configuration for repository " + id + ": " + e.getMessage( ) );
- }
- return repo;
- }
- finally
- {
- rwLock.writeLock( ).unlock( );
- }
-
- }
-
- /**
- * Adds a new repository or updates the repository with the same id. The given configuration object is updated, but
- * the configuration is not saved.
- *
- * @param managedRepositoryConfiguration the new or changed managed repository configuration
- * @param configuration the configuration object (may be <code>null</code>)
- * @return the new or updated repository
- * @throws RepositoryException if the configuration cannot be saved or updated
- */
- @Override
- public ManagedRepository putRepository( ManagedRepositoryConfiguration managedRepositoryConfiguration, Configuration configuration ) throws RepositoryException
- {
- rwLock.writeLock( ).lock( );
- try
- {
- final String id = managedRepositoryConfiguration.getId( );
- final RepositoryType repoType = RepositoryType.valueOf( managedRepositoryConfiguration.getType( ) );
- ManagedRepository repo;
- boolean registeredNew = false;
- repo = managedRepositories.get( id );
- if ( repo != null && repo.isOpen( ) )
- {
- if ( repo instanceof EditableManagedRepository )
- {
- getProvider( repoType ).updateManagedInstance( (EditableManagedRepository) repo, managedRepositoryConfiguration );
- }
- else
- {
- throw new RepositoryException( "The repository is not editable " + id );
- }
- }
- else
- {
- repo = getProvider( repoType ).createManagedInstance( managedRepositoryConfiguration );
- managedRepositories.put( id, repo );
- registeredNew = true;
- }
- updateRepositoryReferences( getProvider( repoType ), repo, managedRepositoryConfiguration, configuration );
- replaceOrAddRepositoryConfig( managedRepositoryConfiguration, configuration );
- if ( registeredNew )
- {
- pushEvent( new LifecycleEvent( LifecycleEvent.REGISTERED, this, repo ) );
- }
- else
- {
- pushEvent( new LifecycleEvent( LifecycleEvent.UPDATED, this, repo ) );
- }
- return repo;
- }
- finally
- {
- rwLock.writeLock( ).unlock( );
- }
- }
-
-
- /**
- * Adds a new repository group to the current list, or replaces the repository group definition with
- * the same id, if it exists already.
- * The change is saved to the configuration immediately.
- *
- * @param repositoryGroup the new repository group.
- * @throws RepositoryException if the new repository group could not be saved to the configuration.
- */
- @Override
- public RepositoryGroup putRepositoryGroup( RepositoryGroup repositoryGroup ) throws RepositoryException
- {
- rwLock.writeLock( ).lock( );
- try
- {
- if ( this.groupHandler == null )
- {
- throw new RepositoryException( "Fatal error. RepositoryGroupHandler not registered!" );
- }
- return this.groupHandler.put( repositoryGroup );
- }
- finally
- {
- rwLock.writeLock( ).unlock( );
- }
- }
-
- /**
- * Adds a new repository group or updates the repository with the same id, if it exists already.
- * The configuration is saved immediately.
- *
- * @param repositoryGroupConfiguration the repository configuration
- * @return the updated or created repository
- * @throws RepositoryException if an error occurs, or the configuration is not valid.
- */
- @Override
- public RepositoryGroup putRepositoryGroup( RepositoryGroupConfiguration repositoryGroupConfiguration ) throws RepositoryException
- {
- rwLock.writeLock( ).lock( );
- try
- {
- return groupHandler.put( repositoryGroupConfiguration );
- }
- finally
- {
- rwLock.writeLock( ).unlock( );
- }
-
- }
-
- @Override
- public CheckedResult<RepositoryGroup, Map<String, List<ValidationError>>> putRepositoryGroupAndValidate( RepositoryGroupConfiguration repositoryGroupConfiguration )
- throws RepositoryException
- {
- rwLock.writeLock( ).lock( );
- try
- {
- return groupHandler.putWithCheck( repositoryGroupConfiguration, groupHandler.getValidator() );
- }
- finally
- {
- rwLock.writeLock( ).unlock( );
- }
- }
-
- /**
- * Adds a new repository group or updates the repository group with the same id. The given configuration object is updated, but
- * the configuration is not saved.
- *
- * @param repositoryGroupConfiguration The configuration of the new or changed repository group.
- * @param configuration The configuration object. If it is <code>null</code>, the configuration is not saved.
- * @return The new or updated repository group
- * @throws RepositoryException if the configuration cannot be saved or updated
- */
- @Override
- public RepositoryGroup putRepositoryGroup( RepositoryGroupConfiguration repositoryGroupConfiguration, Configuration configuration ) throws RepositoryException
- {
- rwLock.writeLock( ).lock( );
- try
- {
- return groupHandler.put( repositoryGroupConfiguration, configuration );
- }
- finally
- {
- rwLock.writeLock( ).unlock( );
- }
- }
-
- private void replaceOrAddRepositoryConfig( ManagedRepositoryConfiguration managedRepositoryConfiguration, Configuration configuration )
- {
- if ( configuration != null )
- {
- ManagedRepositoryConfiguration oldCfg = configuration.findManagedRepositoryById( managedRepositoryConfiguration.getId( ) );
- if ( oldCfg != null )
- {
- configuration.removeManagedRepository( oldCfg );
- }
- configuration.addManagedRepository( managedRepositoryConfiguration );
- }
- }
-
- private void replaceOrAddRepositoryConfig( RemoteRepositoryConfiguration remoteRepositoryConfiguration, Configuration configuration )
- {
- if ( configuration != null )
- {
- RemoteRepositoryConfiguration oldCfg = configuration.findRemoteRepositoryById( remoteRepositoryConfiguration.getId( ) );
- if ( oldCfg != null )
- {
- configuration.removeRemoteRepository( oldCfg );
- }
- configuration.addRemoteRepository( remoteRepositoryConfiguration );
- }
- }
-
- private void replaceOrAddRepositoryConfig( RepositoryGroupConfiguration repositoryGroupConfiguration, Configuration configuration )
- {
- RepositoryGroupConfiguration oldCfg = configuration.findRepositoryGroupById( repositoryGroupConfiguration.getId( ) );
- if ( oldCfg != null )
- {
- configuration.removeRepositoryGroup( oldCfg );
- }
- configuration.addRepositoryGroup( repositoryGroupConfiguration );
- }
-
- @Override
- public RemoteRepository putRepository( RemoteRepository remoteRepository, Configuration configuration ) throws RepositoryException
- {
- rwLock.writeLock( ).lock( );
- try
- {
- final String id = remoteRepository.getId( );
- if ( managedRepositories.containsKey( id ) )
- {
- throw new RepositoryException( "There exists a managed repository with id " + id + ". Could not update with remote repository." );
- }
- RemoteRepository originRepo = remoteRepositories.put( id, remoteRepository );
- RemoteRepositoryConfiguration oldCfg = null;
- RemoteRepositoryConfiguration newCfg;
- try
- {
- if ( originRepo != null && originRepo != remoteRepository )
- {
- originRepo.close( );
- }
- final RepositoryProvider provider = getProvider( remoteRepository.getType( ) );
- newCfg = provider.getRemoteConfiguration( remoteRepository );
- updateRepositoryReferences( provider, remoteRepository, newCfg, configuration );
- oldCfg = configuration.findRemoteRepositoryById( id );
- if ( oldCfg != null )
- {
- configuration.removeRemoteRepository( oldCfg );
- }
- configuration.addRemoteRepository( newCfg );
- if ( remoteRepository != originRepo )
- {
- pushEvent( new LifecycleEvent( LifecycleEvent.REGISTERED, this, remoteRepository ) );
- }
- else
- {
- pushEvent( new LifecycleEvent( LifecycleEvent.UPDATED, this, remoteRepository ) );
- }
- return remoteRepository;
- }
- catch ( Exception e )
- {
- // Rollback
- if ( originRepo != null )
- {
- remoteRepositories.put( id, originRepo );
- }
- else
- {
- remoteRepositories.remove( id );
- }
- if ( oldCfg != null )
- {
- RemoteRepositoryConfiguration cfg = configuration.findRemoteRepositoryById( id );
- if ( cfg != null )
- {
- configuration.removeRemoteRepository( cfg );
- configuration.addRemoteRepository( oldCfg );
- }
- }
- log.error( "Error while adding remote repository {}", e.getMessage( ), e );
- throw new RepositoryException( "Could not save the configuration" + ( e.getMessage( ) == null ? "" : ": " + e.getMessage( ) ) );
- }
- }
- finally
- {
- rwLock.writeLock( ).unlock( );
- }
- }
-
- /**
- * Adds a remote repository, or overwrites the repository definition with the same id, if it exists already.
- * The modification is saved to the configuration immediately.
- *
- * @param remoteRepository the remote repository to add
- * @throws RepositoryException if an error occurs during configuration save
- */
- @Override
- public RemoteRepository putRepository( RemoteRepository remoteRepository ) throws RepositoryException
- {
- rwLock.writeLock( ).lock( );
- try
- {
- Configuration configuration = configurationHandler.getBaseConfiguration( );
- try
- {
- RemoteRepository repo = putRepository( remoteRepository, configuration );
- saveConfiguration( configuration );
- return repo;
- }
- catch ( RegistryException | IndeterminateConfigurationException e )
- {
- log.error( "Error while saving remote repository {}", e.getMessage( ), e );
- throw new RepositoryException( "Could not save the configuration" + ( e.getMessage( ) == null ? "" : ": " + e.getMessage( ) ) );
- }
- }
- finally
- {
- rwLock.writeLock( ).unlock( );
- }
- }
-
- /**
- * Adds a new repository or updates the repository with the same id, if it exists already.
- * The configuration is saved immediately.
- *
- * @param remoteRepositoryConfiguration the repository configuration
- * @return the updated or created repository
- * @throws RepositoryException if an error occurs, or the configuration is not valid.
- */
- @Override
- public RemoteRepository putRepository( RemoteRepositoryConfiguration remoteRepositoryConfiguration ) throws RepositoryException
- {
- rwLock.writeLock( ).lock( );
- try
- {
- final String id = remoteRepositoryConfiguration.getId( );
- final RepositoryType repositoryType = RepositoryType.valueOf( remoteRepositoryConfiguration.getType( ) );
- Configuration configuration = configurationHandler.getBaseConfiguration( );
- RemoteRepository repo = remoteRepositories.get( id );
- RemoteRepositoryConfiguration oldCfg = repo != null ? getProvider( repositoryType ).getRemoteConfiguration( repo ) : null;
- repo = putRepository( remoteRepositoryConfiguration, configuration );
- try
- {
- saveConfiguration( configuration );
- }
- catch ( IndeterminateConfigurationException | RegistryException e )
- {
- if ( oldCfg != null )
- {
- getProvider( repositoryType ).updateRemoteInstance( (EditableRemoteRepository) repo, oldCfg );
- }
- log.error( "Could not save the configuration for repository {}: {}", id, e.getMessage( ), e );
- throw new RepositoryException( "Could not save the configuration for repository " + id + ": " + e.getMessage( ) );
- }
- return repo;
- }
- finally
- {
- rwLock.writeLock( ).unlock( );
- }
-
- }
-
- /**
- * Adds a new repository or updates the repository with the same id. The given configuration object is updated, but
- * the configuration is not saved.
- *
- * @param remoteRepositoryConfiguration the new or changed repository configuration
- * @param configuration the configuration object
- * @return the new or updated repository
- * @throws RepositoryException if the configuration cannot be saved or updated
- */
- @Override
- @SuppressWarnings( "unchecked" )
- public RemoteRepository putRepository( RemoteRepositoryConfiguration remoteRepositoryConfiguration, Configuration configuration ) throws RepositoryException
- {
- rwLock.writeLock( ).lock( );
- try
- {
- final String id = remoteRepositoryConfiguration.getId( );
- final RepositoryType repoType = RepositoryType.valueOf( remoteRepositoryConfiguration.getType( ) );
- RemoteRepository repo;
- boolean registeredNew = false;
- repo = remoteRepositories.get( id );
- if ( repo != null && repo.isOpen( ) )
- {
- if ( repo instanceof EditableRemoteRepository )
- {
- getProvider( repoType ).updateRemoteInstance( (EditableRemoteRepository) repo, remoteRepositoryConfiguration );
- }
- else
- {
- throw new RepositoryException( "The repository is not editable " + id );
- }
- }
- else
- {
- repo = getProvider( repoType ).createRemoteInstance( remoteRepositoryConfiguration );
- remoteRepositories.put( id, repo );
- registeredNew = true;
- }
- updateRepositoryReferences( getProvider( repoType ), repo, remoteRepositoryConfiguration, configuration );
- replaceOrAddRepositoryConfig( remoteRepositoryConfiguration, configuration );
- if ( registeredNew )
- {
- pushEvent( new LifecycleEvent( LifecycleEvent.REGISTERED, this, repo ) );
- }
- else
- {
- pushEvent( new LifecycleEvent( LifecycleEvent.UPDATED, this, repo ) );
- }
- return repo;
- }
- finally
- {
- rwLock.writeLock( ).unlock( );
- }
-
-
- }
-
- @Override
- public void removeRepository( String repoId ) throws RepositoryException
- {
- Repository repo = getRepository( repoId );
- if ( repo != null )
- {
- removeRepository( repo );
- }
- }
-
- @Override
- public void removeRepository( Repository repo ) throws RepositoryException
- {
- if ( repo == null )
- {
- log.warn( "Trying to remove null repository" );
- return;
- }
- if ( repo instanceof RemoteRepository )
- {
- removeRepository( (RemoteRepository) repo );
- }
- else if ( repo instanceof ManagedRepository )
- {
- removeRepository( (ManagedRepository) repo );
- }
- else if ( repo instanceof RepositoryGroup )
- {
- removeRepositoryGroup( (RepositoryGroup) repo );
- }
- else
- {
- throw new RepositoryException( "Repository type not known: " + repo.getClass( ) );
- }
- }
-
- /**
- * Removes a managed repository from the registry and configuration, if it exists.
- * The change is saved to the configuration immediately.
- *
- * @param managedRepository the managed repository to remove
- * @throws RepositoryException if a error occurs during configuration save
- */
- @Override
- public void removeRepository( ManagedRepository managedRepository ) throws RepositoryException
- {
- if ( managedRepository == null )
- {
- return;
- }
- final String id = managedRepository.getId( );
- ManagedRepository repo = getManagedRepository( id );
- if ( repo != null )
- {
- rwLock.writeLock( ).lock( );
- try
- {
- repo = managedRepositories.remove( id );
- if ( repo != null )
- {
- repo.close( );
- this.groupHandler.removeRepositoryFromGroups( repo );
- Configuration configuration = configurationHandler.getBaseConfiguration( );
- ManagedRepositoryConfiguration cfg = configuration.findManagedRepositoryById( id );
- if ( cfg != null )
- {
- configuration.removeManagedRepository( cfg );
- }
- saveConfiguration( configuration );
- }
- pushEvent( new LifecycleEvent( LifecycleEvent.UNREGISTERED, this, repo ) );
- }
- catch ( RegistryException | IndeterminateConfigurationException e )
- {
- // Rollback
- log.error( "Could not save config after repository removal: {}", e.getMessage( ), e );
- managedRepositories.put( repo.getId( ), repo );
- throw new RepositoryException( "Could not save configuration after repository removal: " + e.getMessage( ) );
- }
- finally
- {
- rwLock.writeLock( ).unlock( );
- }
- }
- }
-
-
- @Override
- public void removeRepository( ManagedRepository managedRepository, Configuration configuration ) throws RepositoryException
- {
- if ( managedRepository == null )
- {
- return;
- }
- final String id = managedRepository.getId( );
- ManagedRepository repo = getManagedRepository( id );
- if ( repo != null )
- {
- rwLock.writeLock( ).lock( );
- try
- {
- repo = managedRepositories.remove( id );
- if ( repo != null )
- {
- repo.close( );
- this.groupHandler.removeRepositoryFromGroups( repo );
- ManagedRepositoryConfiguration cfg = configuration.findManagedRepositoryById( id );
- if ( cfg != null )
- {
- configuration.removeManagedRepository( cfg );
- }
- }
- pushEvent( new LifecycleEvent( LifecycleEvent.UNREGISTERED, this, repo ) );
- }
- finally
- {
- rwLock.writeLock( ).unlock( );
- }
- }
-
- }
-
-
- /**
- * Removes a repository group from the registry and configuration, if it exists.
- * The change is saved to the configuration immediately.
- *
- * @param repositoryGroup the repository group to remove
- * @throws RepositoryException if a error occurs during configuration save
- */
- @Override
- public void removeRepositoryGroup( RepositoryGroup repositoryGroup ) throws RepositoryException
- {
- if ( repositoryGroup == null )
- {
- return;
- }
- final String id = repositoryGroup.getId( );
- if ( groupHandler.has( id ) )
- {
- rwLock.writeLock( ).lock( );
- try
- {
- groupHandler.remove( id );
- }
- finally
- {
- rwLock.writeLock( ).unlock( );
- }
- }
- }
-
- @Override
- public void removeRepositoryGroup( RepositoryGroup repositoryGroup, Configuration configuration ) throws RepositoryException
- {
- if ( repositoryGroup == null )
- {
- return;
- }
- final String id = repositoryGroup.getId( );
- if ( groupHandler.has( id ) )
- {
- rwLock.writeLock( ).lock( );
- try
- {
- groupHandler.remove( id, configuration );
- }
- finally
- {
- rwLock.writeLock( ).unlock( );
- }
- }
- }
-
- private void doRemoveRepo( RemoteRepository repo, Configuration configuration )
- {
- repo.close( );
- RemoteRepositoryConfiguration cfg = configuration.findRemoteRepositoryById( repo.getId( ) );
- if ( cfg != null )
- {
- configuration.removeRemoteRepository( cfg );
- }
- List<ProxyConnectorConfiguration> proxyConnectors = new ArrayList<>( configuration.getProxyConnectors( ) );
- for ( ProxyConnectorConfiguration proxyConnector : proxyConnectors )
- {
- if ( StringUtils.equals( proxyConnector.getTargetRepoId( ), repo.getId( ) ) )
- {
- configuration.removeProxyConnector( proxyConnector );
- }
- }
- }
-
- /**
- * Removes the remote repository from the registry and configuration.
- * The change is saved to the configuration immediately.
- *
- * @param remoteRepository the remote repository to remove
- * @throws RepositoryException if a error occurs during configuration save
- */
- @Override
- public void removeRepository( RemoteRepository remoteRepository ) throws RepositoryException
- {
- if ( remoteRepository == null )
- {
- return;
- }
- final String id = remoteRepository.getId( );
- RemoteRepository repo = getRemoteRepository( id );
- if ( repo != null )
- {
- rwLock.writeLock( ).lock( );
- try
- {
- repo = remoteRepositories.remove( id );
- if ( repo != null )
- {
- Configuration configuration = configurationHandler.getBaseConfiguration( );
- doRemoveRepo( repo, configuration );
- saveConfiguration( configuration );
- }
- pushEvent( new LifecycleEvent( LifecycleEvent.UNREGISTERED, this, repo ) );
- }
- catch ( RegistryException | IndeterminateConfigurationException e )
- {
- // Rollback
- log.error( "Could not save config after repository removal: {}", e.getMessage( ), e );
- remoteRepositories.put( repo.getId( ), repo );
- throw new RepositoryException( "Could not save configuration after repository removal: " + e.getMessage( ) );
- }
- finally
- {
- rwLock.writeLock( ).unlock( );
- }
- }
- }
-
- @Override
- public void removeRepository( RemoteRepository remoteRepository, Configuration configuration ) throws RepositoryException
- {
- if ( remoteRepository == null )
- {
- return;
- }
- final String id = remoteRepository.getId( );
- RemoteRepository repo = getRemoteRepository( id );
- if ( repo != null )
- {
- rwLock.writeLock( ).lock( );
- try
- {
- repo = remoteRepositories.remove( id );
- if ( repo != null )
- {
- doRemoveRepo( repo, configuration );
- }
- pushEvent( new LifecycleEvent( LifecycleEvent.UNREGISTERED, this, repo ) );
- }
- finally
- {
- rwLock.writeLock( ).unlock( );
- }
- }
-
- }
-
- /**
- * Reloads the registry from the configuration.
- */
- @Override
- public void reload( )
- {
- initialize( );
- }
-
- /**
- * Resets the indexing context of a given repository.
- *
- * @param repository The repository
- * @throws IndexUpdateFailedException If the index could not be resetted.
- */
- @Override
- public void resetIndexingContext( Repository repository ) throws IndexUpdateFailedException
- {
- if ( repository.hasIndex( ) && repository instanceof EditableRepository )
- {
- EditableRepository eRepo = (EditableRepository) repository;
- ArchivaIndexingContext newCtx = getIndexManager( repository.getType( ) ).reset( repository.getIndexingContext( ) );
- eRepo.setIndexingContext( newCtx );
- }
- }
-
-
- /**
- * Creates a new repository instance with the same settings as this one. The cloned repository is not
- * registered or saved to the configuration.
- *
- * @param repo The origin repository
- * @return The cloned repository.
- */
- public ManagedRepository clone( ManagedRepository repo, String newId ) throws RepositoryException
- {
- if ( managedRepositories.containsKey( newId ) || remoteRepositories.containsKey( newId ) )
- {
- throw new RepositoryException( "The given id exists already " + newId );
- }
- RepositoryProvider provider = getProvider( repo.getType( ) );
- ManagedRepositoryConfiguration cfg = provider.getManagedConfiguration( repo );
- cfg.setId( newId );
- ManagedRepository cloned = provider.createManagedInstance( cfg );
- cloned.registerEventHandler( RepositoryEvent.ANY, this );
- return cloned;
- }
-
- @Override
- public <T extends Repository> T clone( T repo, String newId ) throws RepositoryException
- {
- if ( repo instanceof RemoteRepository )
- {
- return (T) this.clone( (RemoteRepository) repo, newId );
- }
- else if ( repo instanceof ManagedRepository )
- {
- return (T) this.clone( (ManagedRepository) repo, newId );
- }
- else
- {
- throw new RepositoryException( "This repository class is not supported " + repo.getClass( ).getName( ) );
- }
- }
-
- /**
- * Creates a new repository instance with the same settings as this one. The cloned repository is not
- * registered or saved to the configuration.
- *
- * @param repo The origin repository
- * @return The cloned repository.
- */
- public RemoteRepository clone( RemoteRepository repo, String newId ) throws RepositoryException
- {
- if ( managedRepositories.containsKey( newId ) || remoteRepositories.containsKey( newId ) )
- {
- throw new RepositoryException( "The given id exists already " + newId );
- }
- RepositoryProvider provider = getProvider( repo.getType( ) );
- RemoteRepositoryConfiguration cfg = provider.getRemoteConfiguration( repo );
- cfg.setId( newId );
- RemoteRepository cloned = provider.createRemoteInstance( cfg );
- cloned.registerEventHandler( RepositoryEvent.ANY, this );
- return cloned;
- }
-
- @Override
- public Repository getRepositoryOfAsset( StorageAsset asset )
- {
- if ( asset instanceof Repository )
- {
- return (Repository) asset;
- }
- else
- {
- return getRepositories( ).stream( ).filter( r -> r.getRoot( )
- .getStorage( ).equals( asset.getStorage( ) ) ).findFirst( ).orElse( null );
- }
- }
-
- @Override
- public <R extends Repository> ValidationResponse<R> validateRepository( R repository )
- {
- Map<String, List<ValidationError>> errorMap = this.validators.stream( )
- .filter( ( validator ) -> validator.getType( ).equals( RepositoryType.ALL ) || repository.getType( ).equals( validator.getType( ) ) )
- .filter( val -> val.isFlavour( repository.getClass() ))
- .flatMap( validator -> ((RepositoryValidator<R>)validator).apply( repository ).getResult().entrySet( ).stream( ) )
- .collect( Collectors.toMap(
- entry -> entry.getKey( ),
- entry -> entry.getValue( ),
- ( list1, list2 ) -> ListUtils.union( list1, list2 )
- ) );
- return new ValidationResponse( repository, errorMap );
- }
-
- @Override
- public <R extends Repository> ValidationResponse<R> validateRepositoryForUpdate( R repository )
- {
- Map<String, List<ValidationError>> errorMap = this.validators.stream( )
- .filter( ( validator ) -> validator.getType( ).equals( RepositoryType.ALL ) || repository.getType( ).equals( validator.getType( ) ) )
- .filter( val -> val.isFlavour( repository.getClass() ))
- .flatMap( validator -> ((RepositoryValidator<R>)validator).applyForUpdate( repository ).getResult().entrySet( ).stream( ) )
- .collect( Collectors.toMap(
- entry -> entry.getKey( ),
- entry -> entry.getValue( ),
- ( list1, list2 ) -> ListUtils.union( list1, list2 )
- ) );
- return new ValidationResponse( repository, errorMap );
- }
-
- @Override
- public void configurationEvent( ConfigurationEvent event )
- {
- // We ignore the event, if the save was triggered by ourself
- if ( !ConfigurationHandler.REGISTRY_EVENT_TAG.equals( event.getTag( ) ) )
- {
- reload( );
- }
- }
-
-
- @Override
- public <T extends Event> void registerEventHandler( EventType<T> type, EventHandler<? super T> eventHandler )
- {
- eventManager.registerEventHandler( type, eventHandler );
- }
-
-
- @Override
- public <T extends Event> void unregisterEventHandler( EventType<T> type, EventHandler<? super T> eventHandler )
- {
- eventManager.unregisterEventHandler( type, eventHandler );
- }
-
-
- @Override
- public void handle( Event event )
- {
- // To avoid event cycles:
- if ( sameOriginator( event ) )
- {
- return;
- }
- if ( event instanceof RepositoryIndexEvent )
- {
- handleIndexCreationEvent( (RepositoryIndexEvent) event );
- }
- // We propagate all events to our listeners, but with context of repository registry
- pushEvent( event );
- }
-
- private void handleIndexCreationEvent( RepositoryIndexEvent event )
- {
- RepositoryIndexEvent idxEvent = event;
- EditableRepository repo = (EditableRepository) idxEvent.getRepository( );
- if ( repo != null )
- {
- ArchivaIndexManager idxmgr = getIndexManager( repo.getType( ) );
- if ( repo.getIndexingContext( ) != null )
- {
- try
- {
- ArchivaIndexingContext newCtx = idxmgr.move( repo.getIndexingContext( ), repo );
- repo.setIndexingContext( newCtx );
- idxmgr.updateLocalIndexPath( repo );
-
- }
- catch ( IndexCreationFailedException e )
- {
- log.error( "Could not move index to new directory: '{}'", e.getMessage( ), e );
- }
- }
- else
- {
- try
- {
- ArchivaIndexingContext context = idxmgr.createContext( repo );
- repo.setIndexingContext( context );
- idxmgr.updateLocalIndexPath( repo );
- }
- catch ( IndexCreationFailedException e )
- {
- log.error( "Could not create index: '{}'", e.getMessage( ), e );
- }
- }
- }
- }
-
- private boolean sameOriginator( Event event )
- {
- if ( event.getSource( ) == this )
- {
- return true;
- }
- else if ( event.hasPreviousEvent( ) )
- {
- return sameOriginator( event.getPreviousEvent( ) );
- }
- else
- {
- return false;
- }
- }
-
- private void pushEvent( Event event )
- {
- eventManager.fireEvent( event );
- }
-
-
- }
|