]> source.dussan.org Git - archiva.git/blob
a2cdcffb457c61f50c20889a80244c18427e012c
[archiva.git] /
1 package org.apache.maven.archiva.web.action.admin;
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.xwork.ModelDriven;
23 import com.opensymphony.xwork.Preparable;
24 import com.opensymphony.xwork.Validateable;
25
26 import org.apache.maven.archiva.configuration.ArchivaConfiguration;
27 import org.apache.maven.archiva.configuration.Configuration;
28 import org.apache.maven.archiva.configuration.InvalidConfigurationException;
29 import org.apache.maven.archiva.indexer.RepositoryIndexException;
30 import org.apache.maven.archiva.indexer.RepositoryIndexSearchException;
31 import org.apache.maven.archiva.repositories.ActiveManagedRepositories;
32 import org.apache.maven.archiva.security.ArchivaRoleConstants;
33 import org.codehaus.plexus.registry.RegistryException;
34 import org.codehaus.plexus.scheduler.CronExpressionValidator;
35 import org.codehaus.plexus.security.rbac.Resource;
36 import org.codehaus.plexus.security.ui.web.interceptor.SecureAction;
37 import org.codehaus.plexus.security.ui.web.interceptor.SecureActionBundle;
38 import org.codehaus.plexus.security.ui.web.interceptor.SecureActionException;
39 import org.codehaus.plexus.xwork.action.PlexusActionSupport;
40
41 import java.io.File;
42 import java.io.IOException;
43 import java.util.Date;
44
45 /**
46  * Configures the application.
47  *
48  * @plexus.component role="com.opensymphony.xwork.Action" role-hint="configureAction"
49  */
50 public class ConfigureAction
51     extends PlexusActionSupport
52     implements ModelDriven, Preparable, Validateable, SecureAction
53 {
54     /**
55      * @plexus.requirement
56      */
57     private ArchivaConfiguration archivaConfiguration;
58
59     /**
60      * @plexus.requirement
61      */
62     private ActiveManagedRepositories activeRepositories;
63
64     /**
65      * The configuration.
66      */
67     private Configuration configuration;
68     
69     private CronExpressionValidator cronValidator;
70
71     private String second = "0";
72
73     private String minute = "0";
74
75     private String hour = "*";
76
77     private String dayOfMonth = "*";
78
79     private String month = "*";
80
81     private String dayOfWeek = "?";
82
83     private String year;
84
85     private String lastIndexingTime;
86
87     public void validate()
88     {
89         //validate cron expression
90         cronValidator = new CronExpressionValidator();
91
92         if ( !cronValidator.validate( getCronExpression() ) )
93         {
94             addActionError( "Invalid Cron Expression" );
95         }
96     }
97
98     public String execute()
99         throws IOException, RepositoryIndexException, RepositoryIndexSearchException, InvalidConfigurationException,
100         RegistryException
101     {
102         // TODO: if this didn't come from the form, go to configure.action instead of going through with re-saving what was just loaded
103         // TODO: if this is changed, do we move the index or recreate it?
104         configuration.setDataRefreshCronExpression( getCronExpression() );
105
106         // Normalize the path
107         File file = new File( configuration.getIndexPath() );
108         configuration.setIndexPath( file.getCanonicalPath() );
109         if ( !file.exists() )
110         {
111             file.mkdirs();
112             // TODO: error handling when this fails, or is not a directory!
113         }
114
115         // Just double checking that our validation routines line up with what is expected in the configuration
116         assert configuration.isValid();
117
118         archivaConfiguration.save( configuration );
119
120         // TODO: if the repository has changed, we need to check if indexing is needed!
121
122         addActionMessage( "Successfully saved configuration" );
123
124         return SUCCESS;
125     }
126
127     public String input()
128     {
129         String[] cronEx = configuration.getDataRefreshCronExpression().split( " " );
130         int i = 0;
131
132         while ( i < cronEx.length )
133         {
134             switch ( i )
135             {
136                 case 0:
137                     second = cronEx[i];
138                     break;
139                 case 1:
140                     minute = cronEx[i];
141                     break;
142                 case 2:
143                     hour = cronEx[i];
144                     break;
145                 case 3:
146                     dayOfMonth = cronEx[i];
147                     break;
148                 case 4:
149                     month = cronEx[i];
150                     break;
151                 case 5:
152                     dayOfWeek = cronEx[i];
153                     break;
154                 case 6:
155                     year = cronEx[i];
156                     break;
157             }
158             i++;
159         }
160
161         if ( activeRepositories.getLastDataRefreshTime() != 0 )
162         {
163             lastIndexingTime = new Date( activeRepositories.getLastDataRefreshTime() ).toString();
164         }
165         else
166         {
167             lastIndexingTime = "Never been run.";
168         }
169
170         return INPUT;
171     }
172
173     public Object getModel()
174     {
175         return configuration;
176     }
177
178     public void prepare()
179     {
180         configuration = archivaConfiguration.getConfiguration();
181     }
182
183     public String getLastIndexingTime()
184     {
185         return lastIndexingTime;
186     }
187
188     public void setLastIndexingTime( String lastIndexingTime )
189     {
190         this.lastIndexingTime = lastIndexingTime;
191     }
192
193     public String getSecond()
194     {
195         return second;
196     }
197
198     public void setSecond( String second )
199     {
200         this.second = second;
201     }
202
203     public String getMinute()
204     {
205         return minute;
206     }
207
208     public void setMinute( String minute )
209     {
210         this.minute = minute;
211     }
212
213     public String getHour()
214     {
215         return hour;
216     }
217
218     public void setHour( String hour )
219     {
220         this.hour = hour;
221     }
222
223     public String getDayOfMonth()
224     {
225         return dayOfMonth;
226     }
227
228     public void setDayOfMonth( String dayOfMonth )
229     {
230         this.dayOfMonth = dayOfMonth;
231     }
232
233     public String getYear()
234     {
235         return year;
236     }
237
238     public void setYear( String year )
239     {
240         this.year = year;
241     }
242
243     public String getMonth()
244     {
245         return month;
246     }
247
248     public void setMonth( String month )
249     {
250         this.month = month;
251     }
252
253     public String getDayOfWeek()
254     {
255         return dayOfWeek;
256     }
257
258     public void setDayOfWeek( String dayOfWeek )
259     {
260         this.dayOfWeek = dayOfWeek;
261     }
262
263     private String getCronExpression()
264     {
265         return ( second + " " + minute + " " + hour + " " + dayOfMonth + " " + month + " " + dayOfWeek + " " +
266             year ).trim();
267     }
268
269     public SecureActionBundle getSecureActionBundle()
270         throws SecureActionException
271     {
272         SecureActionBundle bundle = new SecureActionBundle();
273
274         bundle.setRequiresAuthentication( true );
275         bundle.addRequiredAuthorization( ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION, Resource.GLOBAL );
276
277         return bundle;
278     }
279 }