]> source.dussan.org Git - archiva.git/blob
05912417444e6b8fe938358c57694d65b1ac74e7
[archiva.git] /
1 package org.apache.maven.archiva.web.action.reports;
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 org.apache.archiva.audit.AuditEvent;
24 import org.apache.archiva.audit.AuditManager;
25 import org.apache.archiva.metadata.repository.RepositorySession;
26 import org.apache.commons.lang.StringUtils;
27 import org.apache.commons.lang.time.DateUtils;
28 import org.apache.archiva.security.AccessDeniedException;
29 import org.apache.archiva.security.ArchivaSecurityException;
30 import org.apache.archiva.security.PrincipalNotFoundException;
31 import org.apache.archiva.security.UserRepositories;
32 import org.apache.maven.archiva.web.action.AbstractActionSupport;
33 import org.apache.struts2.interceptor.ServletRequestAware;
34 import org.codehaus.redback.integration.interceptor.SecureAction;
35 import org.codehaus.redback.integration.interceptor.SecureActionBundle;
36 import org.codehaus.redback.integration.interceptor.SecureActionException;
37 import org.springframework.context.annotation.Scope;
38 import org.springframework.stereotype.Controller;
39
40 import javax.inject.Inject;
41 import javax.servlet.http.HttpServletRequest;
42 import java.util.ArrayList;
43 import java.util.Calendar;
44 import java.util.Collection;
45 import java.util.Collections;
46 import java.util.Date;
47 import java.util.List;
48
49 /**
50  * plexus.component role="com.opensymphony.xwork2.Action" role-hint="viewAuditLogReport"
51  * instantiation-strategy="per-lookup"
52  */
53 @Controller( "viewAuditLogReport" )
54 @Scope( "prototype" )
55 public class ViewAuditLogReportAction
56     extends AbstractActionSupport
57     implements SecureAction, ServletRequestAware, Preparable
58 {
59     protected HttpServletRequest request;
60
61     /**
62      * plexus.requirement
63      */
64     @Inject
65     private UserRepositories userRepositories;
66
67     private String repository;
68
69     private List<String> repositories;
70
71     private String groupId;
72
73     private String artifactId;
74
75     private String startDate;
76
77     private String endDate;
78
79     private int rowCount = 30;
80
81     private int page = 1;
82
83     protected boolean isLastPage = true;
84
85     private List<AuditEvent> auditLogs;
86
87     private static final String ALL_REPOSITORIES = "all";
88
89     private String initial = "true";
90
91     private String headerName;
92
93     private static final String HEADER_LATEST_EVENTS = "Latest Events";
94
95     private static final String HEADER_RESULTS = "Results";
96
97     private String[] datePatterns =
98         new String[]{ "MM/dd/yy", "MM/dd/yyyy", "MMMMM/dd/yyyy", "MMMMM/dd/yy", "dd MMMMM yyyy", "dd/MM/yy",
99             "dd/MM/yyyy", "yyyy/MM/dd", "yyyy-MM-dd", "yyyy-dd-MM", "MM-dd-yyyy", "MM-dd-yy" };
100
101     /**
102      * plexus.requirement
103      */
104     @Inject
105     private AuditManager auditManager;
106
107     public SecureActionBundle getSecureActionBundle()
108         throws SecureActionException
109     {
110         SecureActionBundle bundle = new SecureActionBundle();
111
112         // TODO: should require this, but for now we trust in the list of repositories
113 //        bundle.setRequiresAuthentication( true );
114 //        bundle.addRequiredAuthorization( ArchivaRoleConstants.OPERATION_VIEW_AUDIT_LOG );
115
116         return bundle;
117     }
118
119     public void setServletRequest( HttpServletRequest request )
120     {
121         this.request = request;
122     }
123
124     @SuppressWarnings( "unchecked" )
125     public void prepare()
126         throws Exception
127     {
128         repositories = new ArrayList<String>();
129         repositories.add( ALL_REPOSITORIES );
130         List<String> repos = getManagableRepositories();
131         repositories.addAll( repos );
132
133         auditLogs = null;
134         groupId = "";
135         artifactId = "";
136         repository = "";
137
138         if ( Boolean.parseBoolean( initial ) )
139         {
140             headerName = HEADER_LATEST_EVENTS;
141         }
142         else
143         {
144             headerName = HEADER_RESULTS;
145         }
146
147         RepositorySession repositorySession = repositorySessionFactory.createSession();
148         try
149         {
150             auditLogs = auditManager.getMostRecentAuditEvents( repositorySession.getRepository(), repos );
151         }
152         finally
153         {
154             repositorySession.close();
155         }
156     }
157
158     public String execute()
159         throws Exception
160     {
161         Date startDateInDF = null;
162         Date endDateInDF = null;
163         if ( !StringUtils.isEmpty( startDate ) )
164         {
165             startDateInDF = DateUtils.parseDate( startDate, datePatterns );
166         }
167
168         if ( !StringUtils.isEmpty( endDate ) )
169         {
170             endDateInDF = DateUtils.parseDate( endDate, datePatterns );
171             Calendar cal = Calendar.getInstance();
172             cal.setTime( endDateInDF );
173             cal.set( Calendar.HOUR, 23 );
174             cal.set( Calendar.MINUTE, 59 );
175             cal.set( Calendar.SECOND, 59 );
176
177             endDateInDF = cal.getTime();
178         }
179
180         Collection<String> repos = getManagableRepositories();
181         if ( !repository.equals( ALL_REPOSITORIES ) )
182         {
183             if ( repos.contains( repository ) )
184             {
185                 repos = Collections.singletonList( repository );
186             }
187             else
188             {
189                 repos = Collections.emptyList();
190             }
191         }
192
193         if ( StringUtils.isEmpty( groupId ) && !StringUtils.isEmpty( artifactId ) )
194         {
195             // Until we store the full artifact metadata in the audit event, we can't query by these individually
196             addActionError( "If you specify an artifact ID, you must specify a group ID" );
197             auditLogs = null;
198             return INPUT;
199         }
200
201         String resource = null;
202         if ( !StringUtils.isEmpty( groupId ) )
203         {
204             String groupIdAsPath = groupId.replace( '.', '/' );
205             if ( StringUtils.isEmpty( artifactId ) )
206             {
207                 resource = groupIdAsPath;
208             }
209             else
210             {
211                 resource = groupIdAsPath + "/" + artifactId;
212             }
213         }
214
215         RepositorySession repositorySession = repositorySessionFactory.createSession();
216         try
217         {
218             auditLogs =
219                 auditManager.getAuditEventsInRange( repositorySession.getRepository(), repos, resource, startDateInDF,
220                                                     endDateInDF );
221         }
222         finally
223         {
224             repositorySession.close();
225         }
226
227         headerName = HEADER_RESULTS;
228
229         if ( auditLogs.isEmpty() )
230         {
231             addActionError( "No audit logs found." );
232             initial = "true";
233             return SUCCESS;
234         }
235         else
236         {
237             initial = "false";
238             return paginate();
239         }
240     }
241
242     private String paginate()
243     {
244         int rowCount = getRowCount();
245         int extraPage = ( auditLogs.size() % rowCount ) != 0 ? 1 : 0;
246         int totalPages = ( auditLogs.size() / rowCount ) + extraPage;
247
248         int currentPage = getPage();
249         if ( currentPage > totalPages )
250         {
251             addActionError(
252                 "Error encountered while generating report :: The requested page exceeds the total number of pages." );
253             return ERROR;
254         }
255
256         if ( currentPage == totalPages )
257         {
258             isLastPage = true;
259         }
260         else
261         {
262             isLastPage = false;
263         }
264
265         int start = rowCount * ( currentPage - 1 );
266         int end = ( start + rowCount ) - 1;
267
268         if ( end >= auditLogs.size() )
269         {
270             end = auditLogs.size() - 1;
271         }
272
273         auditLogs = auditLogs.subList( start, end + 1 );
274
275         return SUCCESS;
276     }
277
278     private List<String> getManagableRepositories()
279     {
280         try
281         {
282             return userRepositories.getManagableRepositoryIds( getPrincipal() );
283         }
284         catch ( PrincipalNotFoundException e )
285         {
286             log.warn( e.getMessage(), e );
287         }
288         catch ( AccessDeniedException e )
289         {
290             log.warn( e.getMessage(), e );
291         }
292         catch ( ArchivaSecurityException e )
293         {
294             log.warn( e.getMessage(), e );
295         }
296         return Collections.emptyList();
297     }
298
299     public String getRepository()
300     {
301         return repository;
302     }
303
304     public void setRepository( String repository )
305     {
306         this.repository = repository;
307     }
308
309     public List<String> getRepositories()
310     {
311         return repositories;
312     }
313
314     public void setRepositories( List<String> repositories )
315     {
316         this.repositories = repositories;
317     }
318
319     public String getGroupId()
320     {
321         return groupId;
322     }
323
324     public void setGroupId( String groupId )
325     {
326         this.groupId = groupId;
327     }
328
329     public String getArtifactId()
330     {
331         return artifactId;
332     }
333
334     public void setArtifactId( String artifactId )
335     {
336         this.artifactId = artifactId;
337     }
338
339     public List<AuditEvent> getAuditLogs()
340     {
341         return auditLogs;
342     }
343
344     public int getRowCount()
345     {
346         return rowCount;
347     }
348
349     public void setRowCount( int rowCount )
350     {
351         this.rowCount = rowCount;
352     }
353
354     public String getStartDate()
355     {
356         return startDate;
357     }
358
359     public void setStartDate( String startDate )
360     {
361         this.startDate = startDate;
362     }
363
364     public String getEndDate()
365     {
366         return endDate;
367     }
368
369     public void setEndDate( String endDate )
370     {
371         this.endDate = endDate;
372     }
373
374     public int getPage()
375     {
376         return page;
377     }
378
379     public void setPage( int page )
380     {
381         this.page = page;
382     }
383
384     public boolean getIsLastPage()
385     {
386         return isLastPage;
387     }
388
389     public void setIsLastPage( boolean isLastPage )
390     {
391         this.isLastPage = isLastPage;
392     }
393
394     public String getInitial()
395     {
396         return initial;
397     }
398
399     public void setInitial( String initial )
400     {
401         this.initial = initial;
402     }
403
404     public String getHeaderName()
405     {
406         return headerName;
407     }
408
409     public void setHeaderName( String headerName )
410     {
411         this.headerName = headerName;
412     }
413 }