]> source.dussan.org Git - archiva.git/blob
4c703c5cc9605968c2f759f4cd438a174729f6c0
[archiva.git] /
1 package org.apache.archiva.admin.repository.remote;
2 /*
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  */
20
21 import org.apache.archiva.admin.model.AuditInformation;
22 import org.apache.archiva.admin.model.RepositoryAdminException;
23 import org.apache.archiva.admin.model.beans.RemoteRepository;
24 import org.apache.archiva.admin.model.remote.RemoteRepositoryAdmin;
25 import org.apache.archiva.admin.repository.AbstractRepositoryAdmin;
26 import org.apache.archiva.audit.AuditEvent;
27 import org.apache.archiva.common.plexusbridge.MavenIndexerUtils;
28 import org.apache.archiva.common.plexusbridge.PlexusSisuBridge;
29 import org.apache.archiva.common.plexusbridge.PlexusSisuBridgeException;
30 import org.apache.archiva.configuration.Configuration;
31 import org.apache.archiva.configuration.ProxyConnectorConfiguration;
32 import org.apache.archiva.configuration.RemoteRepositoryConfiguration;
33 import org.apache.commons.lang.StringUtils;
34 import org.apache.maven.index.NexusIndexer;
35 import org.apache.maven.index.context.IndexCreator;
36 import org.apache.maven.index.context.IndexingContext;
37 import org.apache.maven.index.context.UnsupportedExistingLuceneIndexException;
38 import org.springframework.stereotype.Service;
39
40 import javax.annotation.PostConstruct;
41 import javax.inject.Inject;
42 import java.io.File;
43 import java.io.IOException;
44 import java.net.MalformedURLException;
45 import java.util.ArrayList;
46 import java.util.HashMap;
47 import java.util.List;
48 import java.util.Map;
49
50 /**
51  * @author Olivier Lamy
52  * @since 1.4-M1
53  */
54 @Service( "remoteRepositoryAdmin#default" )
55 public class DefaultRemoteRepositoryAdmin
56     extends AbstractRepositoryAdmin
57     implements RemoteRepositoryAdmin
58 {
59
60     @Inject
61     private PlexusSisuBridge plexusSisuBridge;
62
63     @Inject
64     private MavenIndexerUtils mavenIndexerUtils;
65
66     @PostConstruct
67     private void initialize()
68         throws RepositoryAdminException
69     {
70         for ( RemoteRepository remoteRepository : getRemoteRepositories() )
71         {
72             createIndexContext( remoteRepository );
73         }
74     }
75
76
77     public List<RemoteRepository> getRemoteRepositories()
78         throws RepositoryAdminException
79     {
80         List<RemoteRepository> remoteRepositories = new ArrayList<RemoteRepository>();
81         for ( RemoteRepositoryConfiguration repositoryConfiguration : getArchivaConfiguration().getConfiguration().getRemoteRepositories() )
82         {
83             RemoteRepository remoteRepository =
84                 new RemoteRepository( repositoryConfiguration.getId(), repositoryConfiguration.getName(),
85                                       repositoryConfiguration.getUrl(), repositoryConfiguration.getLayout(),
86                                       repositoryConfiguration.getUsername(), repositoryConfiguration.getPassword(),
87                                       repositoryConfiguration.getTimeout() );
88             remoteRepository.setDownloadRemoteIndex( repositoryConfiguration.isDownloadRemoteIndex() );
89             remoteRepository.setRemoteIndexUrl( repositoryConfiguration.getRemoteIndexUrl() );
90             remoteRepository.setCronExpression( repositoryConfiguration.getRefreshCronExpression() );
91             remoteRepository.setIndexDirectory( repositoryConfiguration.getIndexDir() );
92             remoteRepository.setRemoteDownloadNetworkProxyId(
93                 repositoryConfiguration.getRemoteDownloadNetworkProxyId() );
94             remoteRepository.setRemoteDownloadTimeout( repositoryConfiguration.getRemoteDownloadTimeout() );
95             remoteRepositories.add( remoteRepository );
96         }
97         return remoteRepositories;
98     }
99
100     public RemoteRepository getRemoteRepository( String repositoryId )
101         throws RepositoryAdminException
102     {
103         for ( RemoteRepository remoteRepository : getRemoteRepositories() )
104         {
105             if ( StringUtils.equals( repositoryId, remoteRepository.getId() ) )
106             {
107                 return remoteRepository;
108             }
109         }
110         return null;
111     }
112
113     public Boolean addRemoteRepository( RemoteRepository remoteRepository, AuditInformation auditInformation )
114         throws RepositoryAdminException
115     {
116         triggerAuditEvent( remoteRepository.getId(), null, AuditEvent.ADD_REMOTE_REPO, auditInformation );
117         getRepositoryCommonValidator().basicValidation( remoteRepository, false );
118
119         //TODO we can validate it's a good uri/url
120         if ( StringUtils.isEmpty( remoteRepository.getUrl() ) )
121         {
122             throw new RepositoryAdminException( "url cannot be null" );
123         }
124
125         //MRM-752 - url needs trimming
126         remoteRepository.setUrl( StringUtils.trim( remoteRepository.getUrl() ) );
127
128         RemoteRepositoryConfiguration remoteRepositoryConfiguration =
129             getRemoteRepositoryConfiguration( remoteRepository );
130
131         Configuration configuration = getArchivaConfiguration().getConfiguration();
132         configuration.addRemoteRepository( remoteRepositoryConfiguration );
133         saveConfiguration( configuration );
134
135         return Boolean.TRUE;
136     }
137
138     public Boolean deleteRemoteRepository( String repositoryId, AuditInformation auditInformation )
139         throws RepositoryAdminException
140     {
141
142         triggerAuditEvent( repositoryId, null, AuditEvent.DELETE_REMOTE_REPO, auditInformation );
143
144         Configuration configuration = getArchivaConfiguration().getConfiguration();
145
146         RemoteRepositoryConfiguration remoteRepositoryConfiguration =
147             configuration.getRemoteRepositoriesAsMap().get( repositoryId );
148         if ( remoteRepositoryConfiguration == null )
149         {
150             throw new RepositoryAdminException(
151                 "remoteRepository with id " + repositoryId + " not exist cannot remove it" );
152         }
153
154         configuration.removeRemoteRepository( remoteRepositoryConfiguration );
155
156         // TODO use ProxyConnectorAdmin interface ?
157         // [MRM-520] Proxy Connectors are not deleted with the deletion of a Repository.
158         List<ProxyConnectorConfiguration> proxyConnectors =
159             new ArrayList<ProxyConnectorConfiguration>( configuration.getProxyConnectors() );
160         for ( ProxyConnectorConfiguration proxyConnector : proxyConnectors )
161         {
162             if ( StringUtils.equals( proxyConnector.getTargetRepoId(), repositoryId ) )
163             {
164                 configuration.removeProxyConnector( proxyConnector );
165             }
166         }
167
168         saveConfiguration( configuration );
169
170         return Boolean.TRUE;
171     }
172
173     public Boolean updateRemoteRepository( RemoteRepository remoteRepository, AuditInformation auditInformation )
174         throws RepositoryAdminException
175     {
176
177         String repositoryId = remoteRepository.getId();
178
179         triggerAuditEvent( repositoryId, null, AuditEvent.MODIFY_REMOTE_REPO, auditInformation );
180
181         // update means : remove and add
182
183         Configuration configuration = getArchivaConfiguration().getConfiguration();
184
185         RemoteRepositoryConfiguration remoteRepositoryConfiguration =
186             configuration.getRemoteRepositoriesAsMap().get( repositoryId );
187         if ( remoteRepositoryConfiguration == null )
188         {
189             throw new RepositoryAdminException(
190                 "remoteRepository with id " + repositoryId + " not exist cannot remove it" );
191         }
192
193         configuration.removeRemoteRepository( remoteRepositoryConfiguration );
194
195         remoteRepositoryConfiguration = getRemoteRepositoryConfiguration( remoteRepository );
196         configuration.addRemoteRepository( remoteRepositoryConfiguration );
197         saveConfiguration( configuration );
198
199         return Boolean.TRUE;
200     }
201
202     public Map<String, RemoteRepository> getRemoteRepositoriesAsMap()
203         throws RepositoryAdminException
204     {
205         java.util.Map<String, RemoteRepository> map = new HashMap<String, RemoteRepository>();
206
207         for ( RemoteRepository repo : getRemoteRepositories() )
208         {
209             map.put( repo.getId(), repo );
210         }
211
212         return map;
213     }
214
215     public IndexingContext createIndexContext( RemoteRepository remoteRepository )
216         throws RepositoryAdminException
217     {
218         try
219         {
220             // FIXME get this from ArchivaAdministration
221             String appServerBase = System.getProperty( "appserver.base" );
222
223             List<? extends IndexCreator> indexCreators = mavenIndexerUtils.getAllIndexCreators();
224             NexusIndexer nexusIndexer = plexusSisuBridge.lookup( NexusIndexer.class );
225
226             String contextKey = "remote-" + remoteRepository.getId();
227             IndexingContext indexingContext = nexusIndexer.getIndexingContexts().get( contextKey );
228             if ( indexingContext != null )
229             {
230                 return indexingContext;
231             }
232             // create path
233             File repoDir = new File( appServerBase, "data/remotes/" + remoteRepository.getId() );
234             if ( !repoDir.exists() )
235             {
236                 repoDir.mkdirs();
237             }
238             File indexDirectory = new File( repoDir, ".index" );
239             if ( !indexDirectory.exists() )
240             {
241                 indexDirectory.mkdirs();
242             }
243             return nexusIndexer.addIndexingContext( contextKey, remoteRepository.getId(), repoDir, indexDirectory,
244                                                     remoteRepository.getUrl(),
245                                                     calculateIndexRemoteUrl( remoteRepository ),
246                                                     mavenIndexerUtils.getAllIndexCreators() );
247         }
248         catch ( MalformedURLException e )
249         {
250             throw new RepositoryAdminException( e.getMessage(), e );
251         }
252         catch ( IOException e )
253         {
254             throw new RepositoryAdminException( e.getMessage(), e );
255         }
256         catch ( PlexusSisuBridgeException e )
257         {
258             throw new RepositoryAdminException( e.getMessage(), e );
259         }
260         catch ( UnsupportedExistingLuceneIndexException e )
261         {
262             throw new RepositoryAdminException( e.getMessage(), e );
263         }
264
265     }
266
267     protected String calculateIndexRemoteUrl( RemoteRepository remoteRepository )
268     {
269         if ( StringUtils.startsWith( remoteRepository.getRemoteIndexUrl(), "http" ) )
270         {
271             String baseUrl = remoteRepository.getRemoteIndexUrl();
272             return baseUrl.endsWith( "/" ) ? StringUtils.substringBeforeLast( baseUrl, "/" ) : baseUrl;
273         }
274         String baseUrl = StringUtils.endsWith( remoteRepository.getUrl(), "/" ) ? StringUtils.substringBeforeLast(
275             remoteRepository.getUrl(), "/" ) : remoteRepository.getUrl();
276
277         baseUrl = StringUtils.isEmpty( remoteRepository.getRemoteIndexUrl() )
278             ? baseUrl + "/.index"
279             : baseUrl + "/" + remoteRepository.getRemoteIndexUrl();
280         return baseUrl;
281
282     }
283
284     private RemoteRepositoryConfiguration getRemoteRepositoryConfiguration( RemoteRepository remoteRepository )
285     {
286         RemoteRepositoryConfiguration remoteRepositoryConfiguration = new RemoteRepositoryConfiguration();
287         remoteRepositoryConfiguration.setId( remoteRepository.getId() );
288         remoteRepositoryConfiguration.setPassword( remoteRepository.getPassword() );
289         remoteRepositoryConfiguration.setTimeout( remoteRepository.getTimeout() );
290         remoteRepositoryConfiguration.setUrl( remoteRepository.getUrl() );
291         remoteRepositoryConfiguration.setUsername( remoteRepository.getUserName() );
292         remoteRepositoryConfiguration.setLayout( remoteRepository.getLayout() );
293         remoteRepositoryConfiguration.setName( remoteRepository.getName() );
294         remoteRepositoryConfiguration.setDownloadRemoteIndex( remoteRepository.isDownloadRemoteIndex() );
295         remoteRepositoryConfiguration.setRemoteIndexUrl( remoteRepository.getRemoteIndexUrl() );
296         remoteRepositoryConfiguration.setRefreshCronExpression( remoteRepository.getCronExpression() );
297         remoteRepositoryConfiguration.setIndexDir( remoteRepository.getIndexDirectory() );
298         remoteRepositoryConfiguration.setRemoteDownloadNetworkProxyId(
299             remoteRepository.getRemoteDownloadNetworkProxyId() );
300         remoteRepositoryConfiguration.setRemoteDownloadTimeout( remoteRepository.getRemoteDownloadTimeout() );
301         return remoteRepositoryConfiguration;
302     }
303
304 }