]> source.dussan.org Git - archiva.git/blob
0d8086c1bc4c9e4a778c2364b593f09899d22431
[archiva.git] /
1 package org.apache.maven.archiva.web.action.admin.scanning;
2
3 /*
4  * Licensed to the Apache Software Foundation (ASF) under one
5  * or more contributor license agreements.  See the NOTICE file
6  * distributed with this work for additional information
7  * regarding copyright ownership.  The ASF licenses this file
8  * to you under the Apache License, Version 2.0 (the
9  * "License"); you may not use this file except in compliance
10  * with the License.  You may obtain a copy of the License at
11  *
12  *  http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing,
15  * software distributed under the License is distributed on an
16  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17  * KIND, either express or implied.  See the License for the
18  * specific language governing permissions and limitations
19  * under the License.
20  */
21
22 import com.opensymphony.xwork2.Preparable;
23 import com.opensymphony.xwork2.Validateable;
24 import org.apache.commons.collections.CollectionUtils;
25 import org.apache.commons.lang.StringUtils;
26 import org.apache.maven.archiva.configuration.ArchivaConfiguration;
27 import org.apache.maven.archiva.configuration.Configuration;
28 import org.apache.maven.archiva.configuration.FileType;
29 import org.apache.maven.archiva.configuration.IndeterminateConfigurationException;
30 import org.apache.maven.archiva.configuration.RepositoryScanningConfiguration;
31 import org.apache.maven.archiva.configuration.functors.FiletypeSelectionPredicate;
32 import org.apache.maven.archiva.configuration.functors.FiletypeToMapClosure;
33 import org.apache.maven.archiva.repository.scanner.RepositoryContentConsumers;
34 import org.apache.maven.archiva.security.ArchivaRoleConstants;
35 import org.apache.maven.archiva.web.action.PlexusActionSupport;
36
37 import org.codehaus.plexus.redback.rbac.Resource;
38 import org.codehaus.redback.integration.interceptor.SecureAction;
39 import org.codehaus.redback.integration.interceptor.SecureActionBundle;
40 import org.codehaus.redback.integration.interceptor.SecureActionException;
41 import org.codehaus.plexus.registry.RegistryException;
42
43 import java.util.ArrayList;
44 import java.util.Collections;
45 import java.util.List;
46 import java.util.Map;
47
48 /**
49  * RepositoryScanningAction
50  *
51  * @version $Id$
52  * @plexus.component role="com.opensymphony.xwork2.Action" role-hint="repositoryScanningAction" instantiation-strategy="per-lookup"
53  */
54 public class RepositoryScanningAction
55     extends PlexusActionSupport
56     implements Preparable, Validateable, SecureAction
57 {
58     /**
59      * @plexus.requirement
60      */
61     private ArchivaConfiguration archivaConfiguration;
62
63     /**
64      * @plexus.requirement
65      */
66     private RepositoryContentConsumers repoconsumerUtil;
67
68     private Map fileTypeMap;
69
70     private List fileTypeIds;
71
72     /**
73      * List of {@link AdminRepositoryConsumer} objects for consumers of known content.
74      */
75     private List knownContentConsumers;
76
77     /**
78      * List of enabled {@link AdminRepositoryConsumer} objects for consumers of known content.
79      */
80     private List enabledKnownContentConsumers;
81
82     /**
83      * List of {@link AdminRepositoryConsumer} objects for consumers of invalid/unknown content.
84      */
85     private List invalidContentConsumers;
86
87     /**
88      * List of enabled {@link AdminRepositoryConsumer} objects for consumers of invalid/unknown content.
89      */
90     private List enabledInvalidContentConsumers;
91
92     private String pattern;
93
94     private String fileTypeId;
95
96     public void addActionError( String anErrorMessage )
97     {
98         super.addActionError( anErrorMessage );
99         log.warn( "[ActionError] " + anErrorMessage );
100     }
101
102     public void addActionMessage( String aMessage )
103     {
104         super.addActionMessage( aMessage );
105         log.info( "[ActionMessage] " + aMessage );
106     }
107
108     public String addFiletypePattern()
109     {
110         log.info( "Add New File Type Pattern [" + getFileTypeId() + ":" + getPattern() + "]" );
111
112         if ( !isValidFiletypeCommand() )
113         {
114             return INPUT;
115         }
116
117         String id = getFileTypeId();
118         String pattern = getPattern();
119
120         FileType filetype = findFileType( id );
121         if ( filetype == null )
122         {
123             addActionError( "Pattern not added, unable to find filetype " + id );
124             return INPUT;
125         }
126
127         if ( filetype.getPatterns().contains( pattern ) )
128         {
129             addActionError( "Not adding pattern \"" + pattern + "\" to filetype " + id + " as it already exists." );
130             return INPUT;
131         }
132
133         filetype.addPattern( pattern );
134         addActionMessage( "Added pattern \"" + pattern + "\" to filetype " + id );
135
136         return saveConfiguration();
137     }
138
139     public String getFileTypeId()
140     {
141         return fileTypeId;
142     }
143
144     public List getFileTypeIds()
145     {
146         return fileTypeIds;
147     }
148
149     public Map getFileTypeMap()
150     {
151         return fileTypeMap;
152     }
153
154     public List getInvalidContentConsumers()
155     {
156         return invalidContentConsumers;
157     }
158
159     public List getKnownContentConsumers()
160     {
161         return knownContentConsumers;
162     }
163
164     public String getPattern()
165     {
166         return pattern;
167     }
168
169     public SecureActionBundle getSecureActionBundle()
170         throws SecureActionException
171     {
172         SecureActionBundle bundle = new SecureActionBundle();
173
174         bundle.setRequiresAuthentication( true );
175         bundle.addRequiredAuthorization( ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION, Resource.GLOBAL );
176
177         return bundle;
178     }
179
180     public void prepare()
181         throws Exception
182     {
183         Configuration config = archivaConfiguration.getConfiguration();
184         RepositoryScanningConfiguration reposcanning = config.getRepositoryScanning();
185
186         FiletypeToMapClosure filetypeToMapClosure = new FiletypeToMapClosure();
187
188         CollectionUtils.forAllDo( reposcanning.getFileTypes(), filetypeToMapClosure );
189         fileTypeMap = filetypeToMapClosure.getMap();
190
191         AddAdminRepoConsumerClosure addAdminRepoConsumer;
192
193         addAdminRepoConsumer = new AddAdminRepoConsumerClosure( reposcanning.getKnownContentConsumers() );
194         CollectionUtils.forAllDo( repoconsumerUtil.getAvailableKnownConsumers(), addAdminRepoConsumer );
195         this.knownContentConsumers = addAdminRepoConsumer.getList();
196         Collections.sort( knownContentConsumers, AdminRepositoryConsumerComparator.getInstance() );
197
198         addAdminRepoConsumer = new AddAdminRepoConsumerClosure( reposcanning.getInvalidContentConsumers() );
199         CollectionUtils.forAllDo( repoconsumerUtil.getAvailableInvalidConsumers(), addAdminRepoConsumer );
200         this.invalidContentConsumers = addAdminRepoConsumer.getList();
201         Collections.sort( invalidContentConsumers, AdminRepositoryConsumerComparator.getInstance() );
202
203         fileTypeIds = new ArrayList();
204         fileTypeIds.addAll( fileTypeMap.keySet() );
205         Collections.sort( fileTypeIds );
206     }
207
208     public String removeFiletypePattern()
209     {
210         log.info( "Remove File Type Pattern [" + getFileTypeId() + ":" + getPattern() + "]" );
211
212         if ( !isValidFiletypeCommand() )
213         {
214             return INPUT;
215         }
216
217         FileType filetype = findFileType( getFileTypeId() );
218         if ( filetype == null )
219         {
220             addActionError( "Pattern not removed, unable to find filetype " + getFileTypeId() );
221             return INPUT;
222         }
223
224         filetype.removePattern( getPattern() );
225
226         return saveConfiguration();
227     }
228
229     public void setFileTypeId( String fileTypeId )
230     {
231         this.fileTypeId = fileTypeId;
232     }
233
234     public void setPattern( String pattern )
235     {
236         this.pattern = pattern;
237     }
238
239     public String updateInvalidConsumers()
240     {
241         addActionMessage( "Update Invalid Consumers" );
242
243         archivaConfiguration.getConfiguration().getRepositoryScanning().setInvalidContentConsumers(
244             enabledInvalidContentConsumers );
245
246         return saveConfiguration();
247     }
248
249     public String updateKnownConsumers()
250     {
251         addActionMessage( "Update Known Consumers" );
252
253         archivaConfiguration.getConfiguration().getRepositoryScanning().setKnownContentConsumers(
254             enabledKnownContentConsumers );
255
256         return saveConfiguration();
257     }
258
259     private FileType findFileType( String id )
260     {
261         RepositoryScanningConfiguration scanning = archivaConfiguration.getConfiguration().getRepositoryScanning();
262         return (FileType) CollectionUtils.find( scanning.getFileTypes(), new FiletypeSelectionPredicate( id ) );
263     }
264
265     private boolean isValidFiletypeCommand()
266     {
267         if ( StringUtils.isBlank( getFileTypeId() ) )
268         {
269             addActionError( "Unable to process blank filetype id." );
270         }
271
272         if ( StringUtils.isBlank( getPattern() ) )
273         {
274             addActionError( "Unable to process blank pattern." );
275         }
276
277         return !hasActionErrors();
278     }
279
280     private String saveConfiguration()
281     {
282         try
283         {
284             archivaConfiguration.save( archivaConfiguration.getConfiguration() );
285             addActionMessage( "Successfully saved configuration" );
286         }
287         catch ( RegistryException e )
288         {
289             addActionError( "Unable to save configuration: " + e.getMessage() );
290             return INPUT;
291         }
292         catch ( IndeterminateConfigurationException e )
293         {
294             addActionError( e.getMessage() );
295             return INPUT;
296         }
297
298         return SUCCESS;
299     }
300
301     public List getEnabledInvalidContentConsumers()
302     {
303         return enabledInvalidContentConsumers;
304     }
305
306     public void setEnabledInvalidContentConsumers( List enabledInvalidContentConsumers )
307     {
308         this.enabledInvalidContentConsumers = enabledInvalidContentConsumers;
309     }
310
311     public List getEnabledKnownContentConsumers()
312     {
313         return enabledKnownContentConsumers;
314     }
315
316     public void setEnabledKnownContentConsumers( List enabledKnownContentConsumers )
317     {
318         this.enabledKnownContentConsumers = enabledKnownContentConsumers;
319     }
320 }