123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364 |
- package org.apache.archiva.admin.repository.remote;
- /*
- * 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.admin.model.AuditInformation;
- import org.apache.archiva.admin.model.RepositoryAdminException;
- import org.apache.archiva.admin.model.beans.RemoteRepository;
- import org.apache.archiva.admin.model.remote.RemoteRepositoryAdmin;
- import org.apache.archiva.admin.repository.AbstractRepositoryAdmin;
- import org.apache.archiva.audit.AuditEvent;
- import org.apache.archiva.common.plexusbridge.MavenIndexerUtils;
- import org.apache.archiva.common.plexusbridge.PlexusSisuBridge;
- import org.apache.archiva.common.plexusbridge.PlexusSisuBridgeException;
- import org.apache.archiva.configuration.Configuration;
- import org.apache.archiva.configuration.ProxyConnectorConfiguration;
- import org.apache.archiva.configuration.RemoteRepositoryConfiguration;
- import org.apache.commons.lang.StringUtils;
- import org.apache.maven.index.NexusIndexer;
- import org.apache.maven.index.context.IndexCreator;
- import org.apache.maven.index.context.IndexingContext;
- import org.apache.maven.index.context.UnsupportedExistingLuceneIndexException;
- import org.springframework.stereotype.Service;
-
- import javax.annotation.PostConstruct;
- import javax.annotation.PreDestroy;
- import javax.inject.Inject;
- import java.io.File;
- import java.io.IOException;
- import java.net.MalformedURLException;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
-
- /**
- * @author Olivier Lamy
- * @since 1.4-M1
- */
- @Service("remoteRepositoryAdmin#default")
- public class DefaultRemoteRepositoryAdmin
- extends AbstractRepositoryAdmin
- implements RemoteRepositoryAdmin
- {
-
- @Inject
- private PlexusSisuBridge plexusSisuBridge;
-
- @Inject
- private MavenIndexerUtils mavenIndexerUtils;
-
- // fields
- List<? extends IndexCreator> indexCreators;
-
- NexusIndexer indexer;
-
- @PostConstruct
- private void initialize()
- throws RepositoryAdminException
- {
- try
- {
- indexCreators = mavenIndexerUtils.getAllIndexCreators();
- indexer = plexusSisuBridge.lookup( NexusIndexer.class );
- }
- catch ( PlexusSisuBridgeException e )
- {
- throw new RepositoryAdminException( e.getMessage(), e );
- }
- for ( RemoteRepository remoteRepository : getRemoteRepositories() )
- {
- createIndexContext( remoteRepository );
- }
- }
-
- @PreDestroy
- private void shutdown()
- throws RepositoryAdminException
- {
- try
- {
- List<RemoteRepository> remoteRepositories = getRemoteRepositories();
- // close index on shutdown
- for ( RemoteRepository remoteRepository : remoteRepositories )
- {
- IndexingContext context = indexer.getIndexingContexts().get( remoteRepository.getId() );
- if ( context != null )
- {
- indexer.removeIndexingContext( context, false );
- }
- }
- }
- catch ( IOException e )
- {
- throw new RepositoryAdminException( e.getMessage(), e );
- }
- }
-
-
- public List<RemoteRepository> getRemoteRepositories()
- throws RepositoryAdminException
- {
- List<RemoteRepository> remoteRepositories =
- new ArrayList<>( getArchivaConfiguration().getConfiguration().getRemoteRepositories().size() );
- for ( RemoteRepositoryConfiguration repositoryConfiguration : getArchivaConfiguration().getConfiguration().getRemoteRepositories() )
- {
- RemoteRepository remoteRepository =
- new RemoteRepository( repositoryConfiguration.getId(), repositoryConfiguration.getName(),
- repositoryConfiguration.getUrl(), repositoryConfiguration.getLayout(),
- repositoryConfiguration.getUsername(), repositoryConfiguration.getPassword(),
- repositoryConfiguration.getTimeout() );
- remoteRepository.setDownloadRemoteIndex( repositoryConfiguration.isDownloadRemoteIndex() );
- remoteRepository.setRemoteIndexUrl( repositoryConfiguration.getRemoteIndexUrl() );
- remoteRepository.setCronExpression( repositoryConfiguration.getRefreshCronExpression() );
- remoteRepository.setIndexDirectory( repositoryConfiguration.getIndexDir() );
- remoteRepository.setRemoteDownloadNetworkProxyId(
- repositoryConfiguration.getRemoteDownloadNetworkProxyId() );
- remoteRepository.setRemoteDownloadTimeout( repositoryConfiguration.getRemoteDownloadTimeout() );
- remoteRepository.setDownloadRemoteIndexOnStartup(
- repositoryConfiguration.isDownloadRemoteIndexOnStartup() );
- remoteRepository.setDescription( repositoryConfiguration.getDescription() );
- remoteRepository.setExtraHeaders( repositoryConfiguration.getExtraHeaders() );
- remoteRepository.setExtraParameters( repositoryConfiguration.getExtraParameters() );
- remoteRepositories.add( remoteRepository );
- }
- return remoteRepositories;
- }
-
- public RemoteRepository getRemoteRepository( String repositoryId )
- throws RepositoryAdminException
- {
- for ( RemoteRepository remoteRepository : getRemoteRepositories() )
- {
- if ( StringUtils.equals( repositoryId, remoteRepository.getId() ) )
- {
- return remoteRepository;
- }
- }
- return null;
- }
-
- public Boolean addRemoteRepository( RemoteRepository remoteRepository, AuditInformation auditInformation )
- throws RepositoryAdminException
- {
- triggerAuditEvent( remoteRepository.getId(), null, AuditEvent.ADD_REMOTE_REPO, auditInformation );
- getRepositoryCommonValidator().basicValidation( remoteRepository, false );
-
- //TODO we can validate it's a good uri/url
- if ( StringUtils.isEmpty( remoteRepository.getUrl() ) )
- {
- throw new RepositoryAdminException( "url cannot be null" );
- }
-
- //MRM-752 - url needs trimming
- remoteRepository.setUrl( StringUtils.trim( remoteRepository.getUrl() ) );
-
- RemoteRepositoryConfiguration remoteRepositoryConfiguration =
- getRemoteRepositoryConfiguration( remoteRepository );
-
- Configuration configuration = getArchivaConfiguration().getConfiguration();
- configuration.addRemoteRepository( remoteRepositoryConfiguration );
- saveConfiguration( configuration );
-
- return Boolean.TRUE;
- }
-
- public Boolean deleteRemoteRepository( String repositoryId, AuditInformation auditInformation )
- throws RepositoryAdminException
- {
-
- triggerAuditEvent( repositoryId, null, AuditEvent.DELETE_REMOTE_REPO, auditInformation );
-
- Configuration configuration = getArchivaConfiguration().getConfiguration();
-
- RemoteRepositoryConfiguration remoteRepositoryConfiguration =
- configuration.getRemoteRepositoriesAsMap().get( repositoryId );
- if ( remoteRepositoryConfiguration == null )
- {
- throw new RepositoryAdminException(
- "remoteRepository with id " + repositoryId + " not exist cannot remove it" );
- }
-
- configuration.removeRemoteRepository( remoteRepositoryConfiguration );
-
- // TODO use ProxyConnectorAdmin interface ?
- // [MRM-520] Proxy Connectors are not deleted with the deletion of a Repository.
- List<ProxyConnectorConfiguration> proxyConnectors = new ArrayList<>( configuration.getProxyConnectors() );
- for ( ProxyConnectorConfiguration proxyConnector : proxyConnectors )
- {
- if ( StringUtils.equals( proxyConnector.getTargetRepoId(), repositoryId ) )
- {
- configuration.removeProxyConnector( proxyConnector );
- }
- }
-
- saveConfiguration( configuration );
-
- return Boolean.TRUE;
- }
-
- public Boolean updateRemoteRepository( RemoteRepository remoteRepository, AuditInformation auditInformation )
- throws RepositoryAdminException
- {
-
- String repositoryId = remoteRepository.getId();
-
- triggerAuditEvent( repositoryId, null, AuditEvent.MODIFY_REMOTE_REPO, auditInformation );
-
- // update means : remove and add
-
- Configuration configuration = getArchivaConfiguration().getConfiguration();
-
- RemoteRepositoryConfiguration remoteRepositoryConfiguration =
- configuration.getRemoteRepositoriesAsMap().get( repositoryId );
- if ( remoteRepositoryConfiguration == null )
- {
- throw new RepositoryAdminException(
- "remoteRepository with id " + repositoryId + " not exist cannot remove it" );
- }
-
- configuration.removeRemoteRepository( remoteRepositoryConfiguration );
-
- remoteRepositoryConfiguration = getRemoteRepositoryConfiguration( remoteRepository );
- configuration.addRemoteRepository( remoteRepositoryConfiguration );
- saveConfiguration( configuration );
-
- return Boolean.TRUE;
- }
-
- public Map<String, RemoteRepository> getRemoteRepositoriesAsMap()
- throws RepositoryAdminException
- {
- java.util.Map<String, RemoteRepository> map = new HashMap<String, RemoteRepository>();
-
- for ( RemoteRepository repo : getRemoteRepositories() )
- {
- map.put( repo.getId(), repo );
- }
-
- return map;
- }
-
- public IndexingContext createIndexContext( RemoteRepository remoteRepository )
- throws RepositoryAdminException
- {
- try
- {
- String appServerBase = getRegistry().getString( "appserver.base" );
-
- String contextKey = "remote-" + remoteRepository.getId();
- IndexingContext indexingContext = indexer.getIndexingContexts().get( contextKey );
- if ( indexingContext != null )
- {
- return indexingContext;
- }
- // create remote repository path
- File repoDir = new File( appServerBase, "data/remotes/" + remoteRepository.getId() );
- if ( !repoDir.exists() )
- {
- repoDir.mkdirs();
- }
-
- File indexDirectory = null;
-
- // is there configured indexDirectory ?
- String indexDirectoryPath = remoteRepository.getIndexDirectory();
-
- if ( StringUtils.isNotBlank( indexDirectoryPath ) )
- {
- if ( new File( indexDirectoryPath ).isAbsolute() )
- {
- indexDirectory = new File( indexDirectoryPath );
- }
- else
- {
- indexDirectory = new File( repoDir, indexDirectoryPath );
- }
- }
- // if not configured use a default value
- if ( indexDirectory == null )
- {
- indexDirectory = new File( repoDir, ".index" );
- }
- if ( !indexDirectory.exists() )
- {
- indexDirectory.mkdirs();
- }
- return indexer.addIndexingContext( contextKey, remoteRepository.getId(), repoDir, indexDirectory,
- remoteRepository.getUrl(), calculateIndexRemoteUrl( remoteRepository ),
- mavenIndexerUtils.getAllIndexCreators() );
- }
- catch ( MalformedURLException e )
- {
- throw new RepositoryAdminException( e.getMessage(), e );
- }
- catch ( IOException e )
- {
- throw new RepositoryAdminException( e.getMessage(), e );
- }
- catch ( UnsupportedExistingLuceneIndexException e )
- {
- throw new RepositoryAdminException( e.getMessage(), e );
- }
-
- }
-
- protected String calculateIndexRemoteUrl( RemoteRepository remoteRepository )
- {
- if ( StringUtils.startsWith( remoteRepository.getRemoteIndexUrl(), "http" ) )
- {
- String baseUrl = remoteRepository.getRemoteIndexUrl();
- return baseUrl.endsWith( "/" ) ? StringUtils.substringBeforeLast( baseUrl, "/" ) : baseUrl;
- }
- String baseUrl = StringUtils.endsWith( remoteRepository.getUrl(), "/" ) ? StringUtils.substringBeforeLast(
- remoteRepository.getUrl(), "/" ) : remoteRepository.getUrl();
-
- baseUrl = StringUtils.isEmpty( remoteRepository.getRemoteIndexUrl() )
- ? baseUrl + "/.index"
- : baseUrl + "/" + remoteRepository.getRemoteIndexUrl();
- return baseUrl;
-
- }
-
- private RemoteRepositoryConfiguration getRemoteRepositoryConfiguration( RemoteRepository remoteRepository )
- {
- RemoteRepositoryConfiguration remoteRepositoryConfiguration = new RemoteRepositoryConfiguration();
- remoteRepositoryConfiguration.setId( remoteRepository.getId() );
- remoteRepositoryConfiguration.setPassword( remoteRepository.getPassword() );
- remoteRepositoryConfiguration.setTimeout( remoteRepository.getTimeout() );
- remoteRepositoryConfiguration.setUrl( remoteRepository.getUrl() );
- remoteRepositoryConfiguration.setUsername( remoteRepository.getUserName() );
- remoteRepositoryConfiguration.setLayout( remoteRepository.getLayout() );
- remoteRepositoryConfiguration.setName( remoteRepository.getName() );
- remoteRepositoryConfiguration.setDownloadRemoteIndex( remoteRepository.isDownloadRemoteIndex() );
- remoteRepositoryConfiguration.setRemoteIndexUrl( remoteRepository.getRemoteIndexUrl() );
- remoteRepositoryConfiguration.setRefreshCronExpression( remoteRepository.getCronExpression() );
- remoteRepositoryConfiguration.setIndexDir( remoteRepository.getIndexDirectory() );
- remoteRepositoryConfiguration.setRemoteDownloadNetworkProxyId(
- remoteRepository.getRemoteDownloadNetworkProxyId() );
- remoteRepositoryConfiguration.setRemoteDownloadTimeout( remoteRepository.getRemoteDownloadTimeout() );
- remoteRepositoryConfiguration.setDownloadRemoteIndexOnStartup(
- remoteRepository.isDownloadRemoteIndexOnStartup() );
- remoteRepositoryConfiguration.setDescription( remoteRepository.getDescription() );
- remoteRepositoryConfiguration.setExtraHeaders( remoteRepository.getExtraHeaders() );
- remoteRepositoryConfiguration.setExtraParameters( remoteRepository.getExtraParameters() );
- return remoteRepositoryConfiguration;
- }
-
- }
|