]> source.dussan.org Git - archiva.git/blob
5c0aec7125de135700b28c9db2e4e6e3541194d5
[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 java.util.ArrayList;
23 import java.util.Calendar;
24 import java.util.Collections;
25 import java.util.Date;
26 import java.util.List;
27
28 import javax.servlet.http.HttpServletRequest;
29
30 import org.apache.commons.lang.StringUtils;
31 import org.apache.commons.lang.time.DateUtils;
32 import org.apache.maven.archiva.database.ArchivaAuditLogsDao;
33 import org.apache.maven.archiva.database.ArchivaDAO;
34 import org.apache.maven.archiva.database.ArchivaDatabaseException;
35 import org.apache.maven.archiva.database.ObjectNotFoundException;
36 import org.apache.maven.archiva.database.SimpleConstraint;
37 import org.apache.maven.archiva.database.constraints.ArchivaAuditLogsConstraint;
38 import org.apache.maven.archiva.database.constraints.MostRecentArchivaAuditLogsConstraint;
39 import org.apache.maven.archiva.model.ArchivaAuditLogs;
40 import org.apache.maven.archiva.repository.audit.AuditEvent;
41 import org.apache.maven.archiva.security.AccessDeniedException;
42 import org.apache.maven.archiva.security.ArchivaSecurityException;
43 import org.apache.maven.archiva.security.PrincipalNotFoundException;
44 import org.apache.maven.archiva.security.UserRepositories;
45 import org.apache.maven.archiva.web.action.PlexusActionSupport;
46 import org.apache.struts2.interceptor.ServletRequestAware;
47 import org.codehaus.redback.integration.interceptor.SecureAction;
48 import org.codehaus.redback.integration.interceptor.SecureActionBundle;
49 import org.codehaus.redback.integration.interceptor.SecureActionException;
50
51 import com.opensymphony.xwork2.Preparable;
52
53 /**
54  * @plexus.component role="com.opensymphony.xwork2.Action" role-hint="viewAuditLogReport"
55  *                   instantiation-strategy="per-lookup"
56  */
57 public class ViewAuditLogReportAction
58     extends PlexusActionSupport
59     implements SecureAction, ServletRequestAware, Preparable
60 {
61     protected HttpServletRequest request;
62
63     /**
64      * @plexus.requirement
65      */
66     private UserRepositories userRepositories;
67
68     /**
69      * @plexus.requirement role-hint="jdo"
70      */
71     private ArchivaAuditLogsDao auditLogsDao;
72
73     /**
74      * @plexus.requirement role-hint="jdo"
75      */
76     private ArchivaDAO dao;
77
78     private String repository;
79
80     private List<String> repositories;
81
82     private String groupId;
83
84     private String artifactId;
85
86     private String startDate;
87
88     private String endDate;
89     
90     private int rowCount = 30;
91
92     private int page = 1;
93
94     private String prev;
95
96     private String next;
97
98     protected boolean isLastPage = true;
99
100     private List<ArchivaAuditLogs> auditLogs;
101
102     private static final String ALL_REPOSITORIES = "all";
103
104     protected int[] range = new int[2];
105     
106     private String initial = "true";
107     
108     private String headerName;
109     
110     private static final String HEADER_LATEST_EVENTS = "Latest Events";
111     
112     private static final String HEADER_RESULTS = "Results";
113     
114     private String[] datePatterns = new String[] { "MM/dd/yy", "MM/dd/yyyy", "MMMMM/dd/yyyy", "MMMMM/dd/yy", 
115         "dd MMMMM yyyy", "dd/MM/yy", "dd/MM/yyyy", "yyyy/MM/dd", "yyyy-MM-dd", "yyyy-dd-MM", "MM-dd-yyyy",
116         "MM-dd-yy" };
117
118     public SecureActionBundle getSecureActionBundle()
119         throws SecureActionException
120     {
121         return null;
122     }
123
124     public void setServletRequest( HttpServletRequest request )
125     {
126         this.request = request;
127     }
128
129     @SuppressWarnings( "unchecked" )
130     public void prepare()
131         throws Exception
132     {
133         repositories = new ArrayList<String>();
134         repositories.add( ALL_REPOSITORIES );
135         repositories.addAll( getObservableRepositories() );
136
137         auditLogs = null;
138         groupId = "";
139         artifactId = "";
140         repository = "";
141                 
142         if( Boolean.parseBoolean( initial ) )
143         {
144             headerName = HEADER_LATEST_EVENTS;
145         }
146         else
147         {
148             headerName = HEADER_RESULTS;
149         }
150
151         SimpleConstraint constraint = new MostRecentArchivaAuditLogsConstraint();
152         auditLogs = filterLogs( (List<ArchivaAuditLogs>) dao.query( constraint ) );
153     }
154
155     public String execute()
156         throws Exception
157     {
158         auditLogs = null;
159         String artifact = "";
160         
161         if ( groupId != null && !"".equals( groupId.trim() ) )
162         {
163             artifact = groupId + ( ( artifactId != null  && !"".equals( artifactId.trim() ) ) ? ( "/" + artifactId + "/%" ) : "%" );
164         }
165         else
166         {               
167             artifact = ( artifactId != null  && !"".equals( artifactId.trim() ) ) ? ( "%" + artifactId + "%" ) : "";
168         }        
169                 
170         Date startDateInDF = null;
171         Date endDateInDF = null;        
172         if ( startDate == null || "".equals( startDate ) )
173         {            
174             Calendar cal = Calendar.getInstance();
175             cal.set( Calendar.HOUR, 0 );
176             cal.set( Calendar.MINUTE, 0 );
177             cal.set( Calendar.SECOND, 0 );
178
179             startDateInDF = cal.getTime();
180         }
181         else
182         {
183             startDateInDF = DateUtils.parseDate( startDate, datePatterns );
184         }
185
186         if ( endDate == null || "".equals( endDate ) )
187         {
188             endDateInDF = Calendar.getInstance().getTime();
189         } 
190         else
191         {
192             endDateInDF = DateUtils.parseDate( endDate, datePatterns );
193             Calendar cal = Calendar.getInstance();
194             cal.setTime( endDateInDF );
195             cal.set( Calendar.HOUR, 23 );
196             cal.set( Calendar.MINUTE, 59 );
197             cal.set( Calendar.SECOND, 59 );
198             
199             endDateInDF = cal.getTime();            
200         }
201
202         range[0] = ( page - 1 ) * rowCount;
203         range[1] = ( page * rowCount ) + 1;
204         
205         ArchivaAuditLogsConstraint constraint = null;
206         if ( !repository.equals( ALL_REPOSITORIES ) )
207         {
208             constraint =
209                 new ArchivaAuditLogsConstraint( range, artifact, repository, AuditEvent.UPLOAD_FILE, startDateInDF, endDateInDF );
210         }
211         else
212         {
213             constraint =
214                 new ArchivaAuditLogsConstraint( range, artifact, null, AuditEvent.UPLOAD_FILE, startDateInDF, endDateInDF );
215         }
216
217         try
218         {
219             auditLogs = filterLogs( auditLogsDao.queryAuditLogs( constraint ) );
220             
221             if( auditLogs.isEmpty() )
222             {
223                 addActionError( "No audit logs found." );
224                 initial = "true";                
225             }
226             else
227             {   
228                 initial = "false";
229             }
230             
231             headerName = HEADER_RESULTS;         
232             paginate();
233         }
234         catch ( ObjectNotFoundException e )
235         {
236             addActionError( "No audit logs found." );
237             return ERROR;
238         }
239         catch ( ArchivaDatabaseException e )
240         {
241             addActionError( "Error occurred while querying audit logs." );
242             return ERROR;
243         }
244
245         return SUCCESS;
246     }
247     
248     private List<ArchivaAuditLogs> filterLogs( List<ArchivaAuditLogs> auditLogs )
249     {
250         List<String> observableRepos = getManageableRepositories();
251         List<ArchivaAuditLogs> filteredAuditLogs = new ArrayList<ArchivaAuditLogs>();
252         
253         if( auditLogs != null )
254         {
255             for( ArchivaAuditLogs auditLog : auditLogs )
256             {
257                 if( observableRepos.contains( auditLog.getRepositoryId() ) )
258                 {
259                     filteredAuditLogs.add( auditLog );
260                 }
261             }
262         }
263         
264         return filteredAuditLogs;
265     }
266         
267     private void paginate()
268     {
269         if ( auditLogs.size() <= rowCount )
270         {
271             isLastPage = true;
272         }
273         else
274         {   
275             isLastPage = false;
276             auditLogs.remove( rowCount );
277         }
278
279         prev =
280             request.getRequestURL() + "?page=" + ( page - 1 ) + "&rowCount=" + rowCount + "&groupId=" + groupId +
281                 "&artifactId=" + artifactId + "&repository=" + repository + "&startDate=" + startDate + "&endDate=" +
282                 endDate;
283         
284         next =
285             request.getRequestURL() + "?page=" + ( page + 1 ) + "&rowCount=" + rowCount + "&groupId=" + groupId +
286                 "&artifactId=" + artifactId + "&repository=" + repository + "&startDate=" + startDate + "&endDate=" +
287                 endDate;
288         
289         prev = StringUtils.replace( prev, " ", "%20" );
290         next = StringUtils.replace( next, " ", "%20" );
291     }
292
293     private List<String> getManageableRepositories()
294     {
295         try
296         {
297             return userRepositories.getManagableRepositoryIds( getPrincipal() );
298         }
299         catch ( PrincipalNotFoundException e )
300         {
301             log.warn( e.getMessage(), e );
302         }
303         catch ( AccessDeniedException e )
304         {
305             log.warn( e.getMessage(), e );
306         }
307         catch ( ArchivaSecurityException e )
308         {
309             log.warn( e.getMessage(), e );
310         }
311         return Collections.emptyList();
312     }
313     
314     private List<String> getObservableRepositories()
315     {
316         try
317         {
318             return userRepositories.getObservableRepositoryIds( getPrincipal() );
319         }
320         catch ( PrincipalNotFoundException e )
321         {
322             log.warn( e.getMessage(), e );
323         }
324         catch ( AccessDeniedException e )
325         {
326             log.warn( e.getMessage(), e );
327         }
328         catch ( ArchivaSecurityException e )
329         {
330             log.warn( e.getMessage(), e );
331         }
332         return Collections.emptyList();
333     }
334
335     public String getRepository()
336     {
337         return repository;
338     }
339
340     public void setRepository( String repository )
341     {
342         this.repository = repository;
343     }
344
345     public List<String> getRepositories()
346     {
347         return repositories;
348     }
349
350     public void setRepositories( List<String> repositories )
351     {
352         this.repositories = repositories;
353     }
354
355     public String getGroupId()
356     {
357         return groupId;
358     }
359
360     public void setGroupId( String groupId )
361     {
362         this.groupId = groupId;
363     }
364
365     public String getArtifactId()
366     {
367         return artifactId;
368     }
369
370     public void setArtifactId( String artifactId )
371     {
372         this.artifactId = artifactId;
373     }
374
375     public List<ArchivaAuditLogs> getAuditLogs()
376     {
377         return auditLogs;
378     }
379
380     public void setAuditLogs( List<ArchivaAuditLogs> auditLogs )
381     {
382         this.auditLogs = auditLogs;
383     }
384
385     public int getRowCount()
386     {
387         return rowCount;
388     }
389
390     public void setRowCount( int rowCount )
391     {
392         this.rowCount = rowCount;
393     }
394
395     public String getStartDate()
396     {
397         return startDate;
398     }
399
400     public void setStartDate( String startDate )
401     {
402         this.startDate = startDate;
403     }
404
405     public String getEndDate()
406     {
407         return endDate;
408     }
409
410     public void setEndDate( String endDate )
411     {
412         this.endDate = endDate;
413     }
414
415     public int getPage()
416     {
417         return page;
418     }
419
420     public void setPage( int page )
421     {
422         this.page = page;
423     }
424
425     public boolean getIsLastPage()
426     {
427         return isLastPage;
428     }
429
430     public void setIsLastPage( boolean isLastPage )
431     {
432         this.isLastPage = isLastPage;
433     }
434     
435     public String getPrev()
436     {
437         return prev;
438     }
439
440     public void setPrev( String prev )
441     {
442         this.prev = prev;
443     }
444
445     public String getNext()
446     {
447         return next;
448     }
449
450     public void setNext( String next )
451     {
452         this.next = next;
453     }
454     
455     public String getInitial()
456     {
457         return initial;
458     }
459
460     public void setInitial( String initial )
461     {
462         this.initial = initial;
463     }
464
465     public String getHeaderName()
466     {
467         return headerName;
468     }
469
470     public void setHeaderName( String headerName )
471     {
472         this.headerName = headerName;
473     }
474 }