001    package org.apache.archiva.admin.repository.admin;
002    /*
003     * Licensed to the Apache Software Foundation (ASF) under one
004     * or more contributor license agreements.  See the NOTICE file
005     * distributed with this work for additional information
006     * regarding copyright ownership.  The ASF licenses this file
007     * to you under the Apache License, Version 2.0 (the
008     * "License"); you may not use this file except in compliance
009     * with the License.  You may obtain a copy of the License at
010     *
011     *   http://www.apache.org/licenses/LICENSE-2.0
012     *
013     * Unless required by applicable law or agreed to in writing,
014     * software distributed under the License is distributed on an
015     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
016     * KIND, either express or implied.  See the License for the
017     * specific language governing permissions and limitations
018     * under the License.
019     */
020    
021    import net.sf.beanlib.provider.replicator.BeanReplicator;
022    import org.apache.archiva.admin.model.AuditInformation;
023    import org.apache.archiva.admin.model.RepositoryAdminException;
024    import org.apache.archiva.admin.model.admin.ArchivaAdministration;
025    import org.apache.archiva.admin.model.beans.FileType;
026    import org.apache.archiva.admin.model.beans.LegacyArtifactPath;
027    import org.apache.archiva.admin.model.beans.NetworkConfiguration;
028    import org.apache.archiva.admin.model.beans.OrganisationInformation;
029    import org.apache.archiva.admin.model.beans.UiConfiguration;
030    import org.apache.archiva.admin.repository.AbstractRepositoryAdmin;
031    import org.apache.archiva.audit.AuditEvent;
032    import org.apache.archiva.configuration.Configuration;
033    import org.apache.archiva.configuration.UserInterfaceOptions;
034    import org.apache.archiva.configuration.WebappConfiguration;
035    import org.apache.commons.lang.StringUtils;
036    import org.apache.http.impl.conn.PoolingClientConnectionManager;
037    import org.apache.maven.wagon.providers.http.HttpWagon;
038    import org.springframework.stereotype.Service;
039    
040    import javax.annotation.PostConstruct;
041    import javax.annotation.PreDestroy;
042    import java.util.ArrayList;
043    import java.util.Collections;
044    import java.util.List;
045    
046    /**
047     * @author Olivier Lamy
048     */
049    @Service( "archivaAdministration#default" )
050    public class DefaultArchivaAdministration
051        extends AbstractRepositoryAdmin
052        implements ArchivaAdministration
053    {
054    
055        private PoolingClientConnectionManager poolingClientConnectionManager;
056    
057        @PostConstruct
058        public void initialize()
059            throws RepositoryAdminException
060        {
061            // setup wagon on start with initial values
062            NetworkConfiguration networkConfiguration = getNetworkConfiguration();
063            setupWagon( networkConfiguration );
064        }
065    
066        @PreDestroy
067        public void shutdown()
068        {
069            if ( this.poolingClientConnectionManager != null )
070            {
071                this.poolingClientConnectionManager.shutdown();
072            }
073        }
074    
075    
076        public List<LegacyArtifactPath> getLegacyArtifactPaths()
077            throws RepositoryAdminException
078        {
079            List<LegacyArtifactPath> legacyArtifactPaths = new ArrayList<LegacyArtifactPath>(
080                getArchivaConfiguration().getConfiguration().getLegacyArtifactPaths().size() );
081            for ( org.apache.archiva.configuration.LegacyArtifactPath legacyArtifactPath : getArchivaConfiguration().getConfiguration().getLegacyArtifactPaths() )
082            {
083                legacyArtifactPaths.add(
084                    new BeanReplicator().replicateBean( legacyArtifactPath, LegacyArtifactPath.class ) );
085            }
086            return legacyArtifactPaths;
087        }
088    
089        public void addLegacyArtifactPath( LegacyArtifactPath legacyArtifactPath, AuditInformation auditInformation )
090            throws RepositoryAdminException
091        {
092            Configuration configuration = getArchivaConfiguration().getConfiguration();
093    
094            configuration.addLegacyArtifactPath( new BeanReplicator().replicateBean( legacyArtifactPath,
095                                                                                     org.apache.archiva.configuration.LegacyArtifactPath.class ) );
096    
097            saveConfiguration( configuration );
098            triggerAuditEvent( "", "", AuditEvent.ADD_LEGACY_PATH, auditInformation );
099        }
100    
101        public void deleteLegacyArtifactPath( String path, AuditInformation auditInformation )
102            throws RepositoryAdminException
103        {
104            Configuration configuration = getArchivaConfiguration().getConfiguration();
105            org.apache.archiva.configuration.LegacyArtifactPath legacyArtifactPath =
106                new org.apache.archiva.configuration.LegacyArtifactPath();
107    
108            legacyArtifactPath.setPath( path );
109            configuration.removeLegacyArtifactPath( legacyArtifactPath );
110    
111            saveConfiguration( configuration );
112            triggerAuditEvent( "", "", AuditEvent.REMOVE_LEGACY_PATH, auditInformation );
113        }
114    
115    
116        public void addFileTypePattern( String fileTypeId, String pattern, AuditInformation auditInformation )
117            throws RepositoryAdminException
118        {
119            Configuration configuration = getArchivaConfiguration().getConfiguration();
120    
121            org.apache.archiva.configuration.FileType fileType = getFileTypeById( fileTypeId, configuration );
122            if ( fileType == null )
123            {
124                return;
125            }
126    
127            if ( fileType.getPatterns().contains( pattern ) )
128            {
129                throw new RepositoryAdminException(
130                    "File type [" + fileTypeId + "] already contains pattern [" + pattern + "]" );
131            }
132            fileType.addPattern( pattern );
133    
134            saveConfiguration( configuration );
135            triggerAuditEvent( "", "", AuditEvent.ADD_PATTERN, auditInformation );
136        }
137    
138        public void removeFileTypePattern( String fileTypeId, String pattern, AuditInformation auditInformation )
139            throws RepositoryAdminException
140        {
141            Configuration configuration = getArchivaConfiguration().getConfiguration();
142    
143            org.apache.archiva.configuration.FileType fileType = getFileTypeById( fileTypeId, configuration );
144            if ( fileType == null )
145            {
146                return;
147            }
148            fileType.removePattern( pattern );
149    
150            saveConfiguration( configuration );
151            triggerAuditEvent( "", "", AuditEvent.REMOVE_PATTERN, auditInformation );
152        }
153    
154        public FileType getFileType( String fileTypeId )
155            throws RepositoryAdminException
156        {
157            org.apache.archiva.configuration.FileType fileType =
158                getFileTypeById( fileTypeId, getArchivaConfiguration().getConfiguration() );
159            if ( fileType == null )
160            {
161                return null;
162            }
163            return new BeanReplicator().replicateBean( fileType, FileType.class );
164        }
165    
166        public void addFileType( FileType fileType, AuditInformation auditInformation )
167            throws RepositoryAdminException
168        {
169            Configuration configuration = getArchivaConfiguration().getConfiguration();
170            if ( getFileTypeById( fileType.getId(), configuration ) != null )
171            {
172                throw new RepositoryAdminException(
173                    "impossible to FileType with id " + fileType.getId() + " already exists" );
174            }
175    
176            configuration.getRepositoryScanning().addFileType(
177                new BeanReplicator().replicateBean( fileType, org.apache.archiva.configuration.FileType.class ) );
178            saveConfiguration( configuration );
179        }
180    
181        public void removeFileType( String fileTypeId, AuditInformation auditInformation )
182            throws RepositoryAdminException
183        {
184            Configuration configuration = getArchivaConfiguration().getConfiguration();
185            org.apache.archiva.configuration.FileType fileType = new org.apache.archiva.configuration.FileType();
186            fileType.setId( fileTypeId );
187            configuration.getRepositoryScanning().removeFileType( fileType );
188            saveConfiguration( configuration );
189        }
190    
191        public void addKnownContentConsumer( String knownContentConsumer, AuditInformation auditInformation )
192            throws RepositoryAdminException
193        {
194            Configuration configuration = getArchivaConfiguration().getConfiguration();
195            if ( configuration.getRepositoryScanning().getKnownContentConsumers().contains( knownContentConsumer ) )
196            {
197                log.warn( "skip adding knownContentConsumer {} as already here", knownContentConsumer );
198                return;
199            }
200            configuration.getRepositoryScanning().addKnownContentConsumer( knownContentConsumer );
201            saveConfiguration( configuration );
202            triggerAuditEvent( "", "", AuditEvent.ENABLE_REPO_CONSUMER, auditInformation );
203        }
204    
205        public void removeKnownContentConsumer( String knownContentConsumer, AuditInformation auditInformation )
206            throws RepositoryAdminException
207        {
208            Configuration configuration = getArchivaConfiguration().getConfiguration();
209            configuration.getRepositoryScanning().removeKnownContentConsumer( knownContentConsumer );
210            saveConfiguration( configuration );
211            triggerAuditEvent( "", "", AuditEvent.DISABLE_REPO_CONSUMER, auditInformation );
212        }
213    
214        public void addInvalidContentConsumer( String invalidContentConsumer, AuditInformation auditInformation )
215            throws RepositoryAdminException
216        {
217            Configuration configuration = getArchivaConfiguration().getConfiguration();
218            if ( configuration.getRepositoryScanning().getInvalidContentConsumers().contains( invalidContentConsumer ) )
219            {
220                log.warn( "skip adding invalidContentConsumer {} as already here", invalidContentConsumer );
221                return;
222            }
223            configuration.getRepositoryScanning().addInvalidContentConsumer( invalidContentConsumer );
224            saveConfiguration( configuration );
225            triggerAuditEvent( "", "", AuditEvent.ENABLE_REPO_CONSUMER, auditInformation );
226        }
227    
228        public void removeInvalidContentConsumer( String invalidContentConsumer, AuditInformation auditInformation )
229            throws RepositoryAdminException
230        {
231            Configuration configuration = getArchivaConfiguration().getConfiguration();
232            configuration.getRepositoryScanning().removeInvalidContentConsumer( invalidContentConsumer );
233            saveConfiguration( configuration );
234            triggerAuditEvent( "", "", AuditEvent.DISABLE_REPO_CONSUMER, auditInformation );
235        }
236    
237        public void setKnownContentConsumers( List<String> knownContentConsumers, AuditInformation auditInformation )
238            throws RepositoryAdminException
239        {
240            if ( knownContentConsumers == null )
241            {
242                return;
243            }
244            for ( String knowContentConsumer : knownContentConsumers )
245            {
246                addKnownContentConsumer( knowContentConsumer, auditInformation );
247            }
248        }
249    
250        public void setInvalidContentConsumers( List<String> invalidContentConsumers, AuditInformation auditInformation )
251            throws RepositoryAdminException
252        {
253            if ( invalidContentConsumers == null )
254            {
255                return;
256            }
257            for ( String invalidContentConsumer : invalidContentConsumers )
258            {
259                addKnownContentConsumer( invalidContentConsumer, auditInformation );
260            }
261        }
262    
263        public List<FileType> getFileTypes()
264            throws RepositoryAdminException
265        {
266            List<org.apache.archiva.configuration.FileType> configFileTypes =
267                getArchivaConfiguration().getConfiguration().getRepositoryScanning().getFileTypes();
268            if ( configFileTypes == null || configFileTypes.isEmpty() )
269            {
270                return Collections.emptyList();
271            }
272            List<FileType> fileTypes = new ArrayList<FileType>( configFileTypes.size() );
273            for ( org.apache.archiva.configuration.FileType fileType : configFileTypes )
274            {
275                fileTypes.add( new BeanReplicator().replicateBean( fileType, FileType.class ) );
276            }
277            return fileTypes;
278        }
279    
280        public List<String> getKnownContentConsumers()
281            throws RepositoryAdminException
282        {
283            return new ArrayList<String>(
284                getArchivaConfiguration().getConfiguration().getRepositoryScanning().getKnownContentConsumers() );
285        }
286    
287        public List<String> getInvalidContentConsumers()
288            throws RepositoryAdminException
289        {
290            return new ArrayList<String>(
291                getArchivaConfiguration().getConfiguration().getRepositoryScanning().getInvalidContentConsumers() );
292        }
293    
294        public OrganisationInformation getOrganisationInformation()
295            throws RepositoryAdminException
296        {
297            org.apache.archiva.configuration.OrganisationInformation organisationInformation =
298                getArchivaConfiguration().getConfiguration().getOrganisationInfo();
299            if ( organisationInformation == null )
300            {
301                return null;
302            }
303            return new BeanReplicator().replicateBean( organisationInformation, OrganisationInformation.class );
304        }
305    
306        public void setOrganisationInformation( OrganisationInformation organisationInformation )
307            throws RepositoryAdminException
308        {
309            Configuration configuration = getArchivaConfiguration().getConfiguration();
310            if ( organisationInformation != null )
311            {
312                org.apache.archiva.configuration.OrganisationInformation organisationInformationModel =
313                    new BeanReplicator().replicateBean( organisationInformation,
314                                                        org.apache.archiva.configuration.OrganisationInformation.class );
315                configuration.setOrganisationInfo( organisationInformationModel );
316            }
317            else
318            {
319                configuration.setOrganisationInfo( null );
320            }
321            saveConfiguration( configuration );
322        }
323    
324        public UiConfiguration getUiConfiguration()
325            throws RepositoryAdminException
326        {
327            WebappConfiguration webappConfiguration = getArchivaConfiguration().getConfiguration().getWebapp();
328            if ( webappConfiguration == null )
329            {
330                return null;
331            }
332            UserInterfaceOptions userInterfaceOptions = webappConfiguration.getUi();
333            if ( userInterfaceOptions == null )
334            {
335                return null;
336            }
337            return new BeanReplicator().replicateBean( userInterfaceOptions, UiConfiguration.class );
338        }
339    
340        public void updateUiConfiguration( UiConfiguration uiConfiguration )
341            throws RepositoryAdminException
342        {
343            Configuration configuration = getArchivaConfiguration().getConfiguration();
344            if ( uiConfiguration != null )
345            {
346    
347                UserInterfaceOptions userInterfaceOptions =
348                    new BeanReplicator().replicateBean( uiConfiguration, UserInterfaceOptions.class );
349                configuration.getWebapp().setUi( userInterfaceOptions );
350            }
351            else
352            {
353                configuration.getWebapp().setUi( null );
354            }
355            saveConfiguration( configuration );
356    
357        }
358    
359        public NetworkConfiguration getNetworkConfiguration()
360            throws RepositoryAdminException
361        {
362            org.apache.archiva.configuration.NetworkConfiguration networkConfiguration =
363                getArchivaConfiguration().getConfiguration().getNetworkConfiguration();
364    
365            if ( networkConfiguration == null )
366            {
367                return null;
368            }
369            return new BeanReplicator().replicateBean( networkConfiguration, NetworkConfiguration.class );
370        }
371    
372        public void setNetworkConfiguration( NetworkConfiguration networkConfiguration )
373            throws RepositoryAdminException
374        {
375            Configuration configuration = getArchivaConfiguration().getConfiguration();
376            if ( networkConfiguration == null )
377            {
378                configuration.setNetworkConfiguration( null );
379            }
380            else
381            {
382                configuration.setNetworkConfiguration( new BeanReplicator().replicateBean( networkConfiguration,
383                                                                                           org.apache.archiva.configuration.NetworkConfiguration.class ) );
384            }
385            setupWagon( networkConfiguration );
386            saveConfiguration( configuration );
387        }
388    
389        protected void setupWagon( NetworkConfiguration networkConfiguration )
390        {
391            if ( networkConfiguration == null )
392            {
393                // back to default values
394                HttpWagon.setUseClientManagerPooled( true );
395                poolingClientConnectionManager = new PoolingClientConnectionManager();
396                poolingClientConnectionManager.setDefaultMaxPerRoute( 30 );
397                poolingClientConnectionManager.setMaxTotal( 30 );
398                HttpWagon.setConnectionManagerPooled( poolingClientConnectionManager );
399    
400            }
401            else
402            {
403                HttpWagon.setUseClientManagerPooled( networkConfiguration.isUsePooling() );
404                poolingClientConnectionManager = new PoolingClientConnectionManager();
405                poolingClientConnectionManager.setDefaultMaxPerRoute( networkConfiguration.getMaxTotalPerHost() );
406                poolingClientConnectionManager.setMaxTotal( networkConfiguration.getMaxTotal() );
407                HttpWagon.setConnectionManagerPooled( poolingClientConnectionManager );
408            }
409        }
410    
411        //-------------------------
412        //
413        //-------------------------
414    
415        private org.apache.archiva.configuration.FileType getFileTypeById( String id, Configuration configuration )
416        {
417            for ( org.apache.archiva.configuration.FileType fileType : configuration.getRepositoryScanning().getFileTypes() )
418            {
419                if ( StringUtils.equals( id, fileType.getId() ) )
420                {
421                    return fileType;
422                }
423            }
424            return null;
425        }
426    
427    }