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