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