o created data model, dao and query constraint object for audit logs o save events in database git-svn-id: https://svn.apache.org/repos/asf/archiva/branches/MRM-1296@890155 13f79535-47bb-0310-9956-ffa450edef68MRM-1296
@@ -70,7 +70,7 @@ | |||
<groupId>org.codehaus.modello</groupId> | |||
<artifactId>modello-maven-plugin</artifactId> | |||
<configuration> | |||
<version>1.2.1</version> | |||
<version>1.2.3</version> | |||
<packageWithVersion>false</packageWithVersion> | |||
<models> | |||
<model>src/main/mdo/archiva-base.xml</model> |
@@ -5,7 +5,7 @@ | |||
xsd.target-namespace="http://archiva.apache.org/model/1.2.0"> | |||
<id>archiva-base-model</id> | |||
<name>ArchivaBaseModel</name> | |||
<version>1.2.1</version> | |||
<version>1.2.3</version> | |||
<description>Archiva Model</description> | |||
<defaults> | |||
<default> | |||
@@ -75,6 +75,14 @@ | |||
<multiplicity>*</multiplicity> | |||
</association> | |||
</field> | |||
<field> | |||
<name>archivaAuditLogs</name> | |||
<version>1.3.0+</version> | |||
<association> | |||
<type>ArchivaAuditLogs</type> | |||
<multiplicity>*</multiplicity> | |||
</association> | |||
</field> | |||
</fields> | |||
<codeSegments> | |||
<codeSegment> | |||
@@ -2278,5 +2286,70 @@ | |||
</codeSegment> | |||
</codeSegments> | |||
</class> | |||
<class stash.storable="true" | |||
jpox.table="AUDIT_LOGS"> | |||
<name>ArchivaAuditLogs</name> | |||
<version>1.2.3+</version> | |||
<fields> | |||
<field stash.maxSize="50"> | |||
<name>repositoryId</name> | |||
<version>1.2.3+</version> | |||
<identifier>false</identifier> | |||
<required>true</required> | |||
<type>String</type> | |||
<description> | |||
The repository id where the operation was done. | |||
</description> | |||
</field> | |||
<field> | |||
<name>eventDate</name> | |||
<version>1.2.3+</version> | |||
<identifier>false</identifier> | |||
<required>true</required> | |||
<type>Date</type> | |||
<description> | |||
The timestamp on when the event happened. | |||
</description> | |||
</field> | |||
<field> | |||
<name>artifact</name> | |||
<version>1.2.3+</version> | |||
<identifier>false</identifier> | |||
<required>false</required> | |||
<type>String</type> | |||
<description> | |||
The affected artifact, if there is one. | |||
</description> | |||
</field> | |||
<field> | |||
<name>event</name> | |||
<version>1.2.3+</version> | |||
<identifier>false</identifier> | |||
<required>false</required> | |||
<type>String</type> | |||
<description> | |||
The event that happened. | |||
</description> | |||
</field> | |||
<field> | |||
<name>username</name> | |||
<version>1.2.3+</version> | |||
<identifier>false</identifier> | |||
<required>true</required> | |||
<type>String</type> | |||
<description> | |||
The user who executed the event. | |||
</description> | |||
</field> | |||
</fields> | |||
<codeSegments> | |||
<codeSegment> | |||
<version>1.2.3+</version> | |||
<code><![CDATA[ | |||
private static final long serialVersionUID = -7113629916828442780L; | |||
]]></code> | |||
</codeSegment> | |||
</codeSegments> | |||
</class> | |||
</classes> | |||
</model> |
@@ -0,0 +1,35 @@ | |||
package org.apache.maven.archiva.database; | |||
/* | |||
* Licensed to the Apache Software Foundation (ASF) under one | |||
* or more contributor license agreements. See the NOTICE file | |||
* distributed with this work for additional information | |||
* regarding copyright ownership. The ASF licenses this file | |||
* to you under the Apache License, Version 2.0 (the | |||
* "License"); you may not use this file except in compliance | |||
* with the License. You may obtain a copy of the License at | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, | |||
* software distributed under the License is distributed on an | |||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |||
* KIND, either express or implied. See the License for the | |||
* specific language governing permissions and limitations | |||
* under the License. | |||
*/ | |||
import java.util.List; | |||
import org.apache.maven.archiva.model.ArchivaAuditLogs; | |||
public interface ArchivaAuditLogsDao | |||
{ | |||
public List<ArchivaAuditLogs> queryAuditLogs( Constraint constraint ) | |||
throws ObjectNotFoundException, ArchivaDatabaseException; | |||
public ArchivaAuditLogs saveAuditLogs( ArchivaAuditLogs logs ); | |||
public void deleteAuditLogs( ArchivaAuditLogs logs ) | |||
throws ArchivaDatabaseException; | |||
} |
@@ -0,0 +1,43 @@ | |||
package org.apache.maven.archiva.database.constraints; | |||
/* | |||
* Licensed to the Apache Software Foundation (ASF) under one | |||
* or more contributor license agreements. See the NOTICE file | |||
* distributed with this work for additional information | |||
* regarding copyright ownership. The ASF licenses this file | |||
* to you under the Apache License, Version 2.0 (the | |||
* "License"); you may not use this file except in compliance | |||
* with the License. You may obtain a copy of the License at | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, | |||
* software distributed under the License is distributed on an | |||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |||
* KIND, either express or implied. See the License for the | |||
* specific language governing permissions and limitations | |||
* under the License. | |||
*/ | |||
import org.apache.maven.archiva.model.ArchivaAuditLogs; | |||
public class MostRecentArchivaAuditLogsConstraint | |||
extends AbstractSimpleConstraint | |||
{ | |||
private String sql; | |||
public MostRecentArchivaAuditLogsConstraint() | |||
{ | |||
sql = "SELECT FROM " + ArchivaAuditLogs.class.getName() + " ORDER BY eventDate DESCENDING RANGE 0,1"; | |||
} | |||
public Class<?> getResultClass() | |||
{ | |||
return ArchivaAuditLogs.class; | |||
} | |||
public String getSelectSql() | |||
{ | |||
return sql; | |||
} | |||
} |
@@ -0,0 +1,61 @@ | |||
package org.apache.maven.archiva.database.jdo; | |||
/* | |||
* Licensed to the Apache Software Foundation (ASF) under one | |||
* or more contributor license agreements. See the NOTICE file | |||
* distributed with this work for additional information | |||
* regarding copyright ownership. The ASF licenses this file | |||
* to you under the Apache License, Version 2.0 (the | |||
* "License"); you may not use this file except in compliance | |||
* with the License. You may obtain a copy of the License at | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, | |||
* software distributed under the License is distributed on an | |||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |||
* KIND, either express or implied. See the License for the | |||
* specific language governing permissions and limitations | |||
* under the License. | |||
*/ | |||
import java.util.List; | |||
import org.apache.maven.archiva.database.ArchivaAuditLogsDao; | |||
import org.apache.maven.archiva.database.ArchivaDatabaseException; | |||
import org.apache.maven.archiva.database.Constraint; | |||
import org.apache.maven.archiva.database.ObjectNotFoundException; | |||
import org.apache.maven.archiva.model.ArchivaAuditLogs; | |||
/** | |||
* JdoArchivaAuditLogsDao | |||
* | |||
* @version | |||
* | |||
* @plexus.component role-hint="jdo" | |||
*/ | |||
public class JdoArchivaAuditLogsDao | |||
implements ArchivaAuditLogsDao | |||
{ | |||
/** | |||
* @plexus.requirement role-hint="archiva" | |||
*/ | |||
private JdoAccess jdo; | |||
public void deleteAuditLogs( ArchivaAuditLogs logs ) | |||
throws ArchivaDatabaseException | |||
{ | |||
jdo.removeObject( logs ); | |||
} | |||
public List<ArchivaAuditLogs> queryAuditLogs( Constraint constraint ) | |||
throws ObjectNotFoundException, ArchivaDatabaseException | |||
{ | |||
return (List<ArchivaAuditLogs>) jdo.queryObjects( ArchivaAuditLogs.class, constraint ); | |||
} | |||
public ArchivaAuditLogs saveAuditLogs( ArchivaAuditLogs logs ) | |||
{ | |||
return (ArchivaAuditLogs) jdo.saveObject( logs ); | |||
} | |||
} |
@@ -20,11 +20,14 @@ package org.apache.maven.archiva.web.action; | |||
*/ | |||
import java.util.ArrayList; | |||
import java.util.Calendar; | |||
import java.util.List; | |||
import java.util.Map; | |||
import javax.servlet.http.HttpServletRequest; | |||
import org.apache.maven.archiva.database.ArchivaAuditLogsDao; | |||
import org.apache.maven.archiva.model.ArchivaAuditLogs; | |||
import org.apache.maven.archiva.repository.audit.AuditEvent; | |||
import org.apache.maven.archiva.repository.audit.AuditListener; | |||
import org.apache.maven.archiva.repository.audit.Auditable; | |||
@@ -53,6 +56,11 @@ public abstract class PlexusActionSupport | |||
*/ | |||
private List<AuditListener> auditListeners = new ArrayList<AuditListener>(); | |||
/** | |||
* @plexus.requirement role-hint="jdo" | |||
*/ | |||
private ArchivaAuditLogsDao auditLogsDao; | |||
private String principal; | |||
@SuppressWarnings("unchecked") | |||
@@ -85,6 +93,15 @@ public abstract class PlexusActionSupport | |||
{ | |||
listener.auditEvent( event ); | |||
} | |||
ArchivaAuditLogs auditLogs = new ArchivaAuditLogs(); | |||
auditLogs.setArtifact( resource ); | |||
auditLogs.setEvent( action ); | |||
auditLogs.setEventDate( Calendar.getInstance().getTime() ); | |||
auditLogs.setRepositoryId( repositoryId ); | |||
auditLogs.setUsername( getPrincipal() ); | |||
auditLogsDao.saveAuditLogs( auditLogs ); | |||
} | |||
protected void triggerAuditEvent( String resource, String action ) |
@@ -41,6 +41,7 @@ import org.apache.maven.archiva.common.utils.VersionUtil; | |||
import org.apache.maven.archiva.configuration.ArchivaConfiguration; | |||
import org.apache.maven.archiva.configuration.Configuration; | |||
import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration; | |||
import org.apache.maven.archiva.database.ArchivaAuditLogsDao; | |||
import org.apache.maven.archiva.model.ArchivaProjectModel; | |||
import org.apache.maven.archiva.model.ArchivaRepositoryMetadata; | |||
import org.apache.maven.archiva.model.ArtifactReference; | |||
@@ -149,7 +150,7 @@ public class UploadAction | |||
* @plexus.requirement | |||
*/ | |||
private ArchivaTaskScheduler scheduler; | |||
private ChecksumAlgorithm[] algorithms = new ChecksumAlgorithm[]{ChecksumAlgorithm.SHA1, ChecksumAlgorithm.MD5}; | |||
private ProjectModelWriter pomWriter = new ProjectModel400Writer(); |
@@ -25,6 +25,12 @@ import java.util.List; | |||
import javax.servlet.http.HttpServletRequest; | |||
import org.apache.maven.archiva.database.ArchivaAuditLogsDao; | |||
import org.apache.maven.archiva.database.ArchivaDatabaseException; | |||
import org.apache.maven.archiva.database.Constraint; | |||
import org.apache.maven.archiva.database.ObjectNotFoundException; | |||
import org.apache.maven.archiva.database.constraints.MostRecentArchivaAuditLogsConstraint; | |||
import org.apache.maven.archiva.model.ArchivaAuditLogs; | |||
import org.apache.maven.archiva.security.AccessDeniedException; | |||
import org.apache.maven.archiva.security.ArchivaSecurityException; | |||
import org.apache.maven.archiva.security.PrincipalNotFoundException; | |||
@@ -51,6 +57,11 @@ public class ViewAuditLogReportAction | |||
*/ | |||
private UserRepositories userRepositories; | |||
/** | |||
* @plexus.requirement role-hint="jdo" | |||
*/ | |||
private ArchivaAuditLogsDao auditLogsDao; | |||
private String repository; | |||
private List<String> repositories; | |||
@@ -61,16 +72,8 @@ public class ViewAuditLogReportAction | |||
private int rowCount = 30; | |||
public int getRowCount() | |||
{ | |||
return rowCount; | |||
} | |||
public void setRowCount( int rowCount ) | |||
{ | |||
this.rowCount = rowCount; | |||
} | |||
private List<ArchivaAuditLogs> auditLogs = new ArrayList<ArchivaAuditLogs>(); | |||
public SecureActionBundle getSecureActionBundle() | |||
throws SecureActionException | |||
{ | |||
@@ -87,12 +90,25 @@ public class ViewAuditLogReportAction | |||
{ | |||
repositories = getObservableRepositories(); | |||
Constraint constraint = new MostRecentArchivaAuditLogsConstraint(); | |||
try | |||
{ | |||
this.auditLogs = auditLogsDao.queryAuditLogs( constraint ); | |||
} | |||
catch( ObjectNotFoundException e ) | |||
{ | |||
log.warn( "No audit logs found." ); | |||
} | |||
catch ( ArchivaDatabaseException e ) | |||
{ | |||
log.warn( "Error occurred while querying audit logs." ); | |||
} | |||
} | |||
public String execute() | |||
throws Exception | |||
{ | |||
{ | |||
return SUCCESS; | |||
} | |||
@@ -156,4 +172,24 @@ public class ViewAuditLogReportAction | |||
{ | |||
this.artifactId = artifactId; | |||
} | |||
public List<ArchivaAuditLogs> getAuditLogs() | |||
{ | |||
return auditLogs; | |||
} | |||
public void setAuditLogs( List<ArchivaAuditLogs> auditLogs ) | |||
{ | |||
this.auditLogs = auditLogs; | |||
} | |||
public int getRowCount() | |||
{ | |||
return rowCount; | |||
} | |||
public void setRowCount( int rowCount ) | |||
{ | |||
this.rowCount = rowCount; | |||
} | |||
} |
@@ -19,6 +19,7 @@ | |||
<%@ taglib prefix="s" uri="/struts-tags" %> | |||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> | |||
<%@ taglib uri="http://www.extremecomponents.org" prefix="ec" %> | |||
<html> | |||
<head> | |||
@@ -44,7 +45,7 @@ | |||
<div id="contentArea"> | |||
<s:form action="viewAuditLogReport" namespace="/report" validate="false"> | |||
<div id="auditLogReport"> | |||
<s:select label="Repository" name="repository" list="repositories"/> | |||
@@ -80,7 +81,27 @@ | |||
<s:submit value="View Audit Log"/> | |||
</div> | |||
</s:form> | |||
</s:form> | |||
<table border="1"> | |||
<tr> | |||
<th align="center">Event</th> | |||
<th align="center">Repository</th> | |||
<th align="center">Artifact</th> | |||
<th align="center">Event Date</th> | |||
<th align="center">Username</th> | |||
</tr> | |||
<c:forEach items="${auditLogs}" var="auditLog" varStatus="i"> | |||
<tr> | |||
<td>${auditLog.event}</td> | |||
<td>${auditLog.repositoryId}</td> | |||
<td>${auditLog.artifact}</td> | |||
<td>${auditLog.eventDate}</td> | |||
<td>${auditLog.username}</td> | |||
</tr> | |||
</c:forEach> | |||
</table> | |||
</div> | |||