You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@archiva.apache.org by oc...@apache.org on 2010/01/11 16:07:02 UTC

svn commit: r897892 [1/2] - in /archiva/trunk: archiva-docs/src/site/ archiva-docs/src/site/apt/userguide/ archiva-docs/src/site/resources/images/ archiva-modules/archiva-base/archiva-model/ archiva-modules/archiva-base/archiva-model/src/main/mdo/ arch...

Author: oching
Date: Mon Jan 11 15:07:00 2010
New Revision: 897892

URL: http://svn.apache.org/viewvc?rev=897892&view=rev
Log:
[MRM-1296] Audit logging report
merged MRM-1296 branch to trunk

Added:
    archiva/trunk/archiva-docs/src/site/apt/userguide/auditlog-report.apt
    archiva/trunk/archiva-docs/src/site/resources/images/latest-events.png   (with props)
    archiva/trunk/archiva-modules/archiva-database/src/main/java/org/apache/maven/archiva/database/ArchivaAuditLogsDao.java
    archiva/trunk/archiva-modules/archiva-database/src/main/java/org/apache/maven/archiva/database/constraints/ArchivaAuditLogsConstraint.java
    archiva/trunk/archiva-modules/archiva-database/src/main/java/org/apache/maven/archiva/database/constraints/MostRecentArchivaAuditLogsConstraint.java
    archiva/trunk/archiva-modules/archiva-database/src/main/java/org/apache/maven/archiva/database/jdo/JdoArchivaAuditLogsDao.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/AuditLogsReportTest.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/reports/ViewAuditLogReportAction.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/reports/auditLogReport.jsp
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/ArchivaAuditLogsDaoStub.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/resources/org/apache/maven/archiva/web/action/admin/appearance/
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/resources/org/apache/maven/archiva/web/action/admin/appearance/EditOrganizationInfoActionTest.xml
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/resources/org/apache/maven/archiva/web/action/admin/appearance/OrganizationInfoActionTest.xml
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/resources/org/apache/maven/archiva/web/action/admin/connectors/proxy/DeleteProxyConnectorActionTest.xml
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/resources/org/apache/maven/archiva/web/action/admin/connectors/proxy/DisableProxyConnectorActionTest.xml
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/resources/org/apache/maven/archiva/web/action/admin/connectors/proxy/EnableProxyConnectorActionTest.xml
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/resources/org/apache/maven/archiva/web/action/admin/connectors/proxy/ProxyConnectorsActionTest.xml
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/resources/org/apache/maven/archiva/web/action/admin/connectors/proxy/SortProxyConnectorsActionTest.xml
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/resources/org/apache/maven/archiva/web/action/admin/repositories/AddRemoteRepositoryActionTest.xml
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/resources/org/apache/maven/archiva/web/action/admin/repositories/DeleteRemoteRepositoryActionTest.xml
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/resources/org/apache/maven/archiva/web/action/admin/repositories/DeleteRepositoryGroupActionTest.xml
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/resources/org/apache/maven/archiva/web/action/admin/repositories/EditRemoteRepositoryActionTest.xml
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/resources/org/apache/maven/archiva/web/action/admin/repositories/RepositoryGroupsActionTest.xml
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/resources/org/apache/maven/archiva/web/action/admin/repositories/SortRepositoriesActionTest.xml
Modified:
    archiva/trunk/archiva-docs/src/site/apt/userguide/index.apt
    archiva/trunk/archiva-docs/src/site/site.xml
    archiva/trunk/archiva-modules/archiva-base/archiva-model/pom.xml
    archiva/trunk/archiva-modules/archiva-base/archiva-model/src/main/mdo/archiva-base.xml
    archiva/trunk/archiva-modules/archiva-database/src/main/java/org/apache/maven/archiva/database/jdo/JdoAccess.java
    archiva/trunk/archiva-modules/archiva-web/archiva-security/src/main/java/org/apache/maven/archiva/security/ArchivaRoleConstants.java
    archiva/trunk/archiva-modules/archiva-web/archiva-security/src/main/resources/META-INF/redback/redback.xml
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/config/testng.xml
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/PlexusActionSupport.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/UploadAction.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/resources/struts.xml
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/decorators/default.jsp
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/css/site.css
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/UploadActionTest.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/DisableProxyConnectorActionTest.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/AddManagedRepositoryActionTest.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/DeleteManagedRepositoryActionTest.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/EditManagedRepositoryActionTest.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/resources/org/apache/maven/archiva/web/action/BrowseActionTest.xml
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/resources/org/apache/maven/archiva/web/action/ShowArtifactActionTest.xml
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/resources/org/apache/maven/archiva/web/action/admin/connectors/proxy/AddProxyConnectorActionTest.xml
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/resources/org/apache/maven/archiva/web/action/admin/connectors/proxy/EditProxyConnectorActionTest.xml
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/resources/org/apache/maven/archiva/web/action/admin/repositories/AbstractManagedRepositoriesActionTest.xml
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/resources/org/apache/maven/archiva/web/action/admin/repositories/DeleteManagedRepositoryActionTest.xml
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/resources/org/apache/maven/archiva/web/action/admin/repositories/RepositoriesActionTest.xml
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/resources/org/apache/maven/archiva/web/action/reports/GenerateReportActionTest.xml
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/resources/org/apache/maven/archiva/web/rss/RssFeedServletTest.xml
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/ArchivaDavResource.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/ArchivaDavResourceFactory.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/maven/archiva/webdav/ArchivaDavResourceFactoryTest.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/maven/archiva/webdav/DavResourceTest.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/maven/archiva/webdav/RepositoryServletSecurityTest.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/test/resources/org/apache/maven/archiva/webdav/RepositoryServletSecurityTest.xml
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/test/resources/org/apache/maven/archiva/webdav/RepositoryServletTest.xml

Added: archiva/trunk/archiva-docs/src/site/apt/userguide/auditlog-report.apt
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-docs/src/site/apt/userguide/auditlog-report.apt?rev=897892&view=auto
==============================================================================
--- archiva/trunk/archiva-docs/src/site/apt/userguide/auditlog-report.apt (added)
+++ archiva/trunk/archiva-docs/src/site/apt/userguide/auditlog-report.apt Mon Jan 11 15:07:00 2010
@@ -0,0 +1,38 @@
+ ------
+ Audit Log Report
+ ------
+
+Audit Log Report
+
+  Starting with Archiva 1.3, audit events can be viewed and queried from the web UI. In the current implementation, only artifact upload events are viewable 
+  but there are plans to include other events such as artifact delete, repository creation and deletion, configuration changes, etc.  
+ 
+  To view the audit events, click <<<Audit Log Report>>> from the navigation menu. Initially, the latest 10 artifact upload events are displayed.
+
+[../images/latest-events.png] Latest Events
+
+* Customizing the Audit Log Report
+
+  The following fields can be specified when querying for the audit events:
+  
+  [[1]] Repository - the repository where the events happened. Only those repositories which the logged in user has permission to access are listed in the drop-down
+  box.
+  
+  [[2]] Group ID - the <<<groupId>>> of the artifact whose audit events you want to view.
+  
+  [[3]] Artifact ID - the <<<artifactId>>> of the artifact whose audit events you want to view.
+  
+  [[4]] Start Date - the start date of the event(s) you want to view. This defaults to the current date if none is specified.
+  
+  [[5]] End Date - the end date of the event(s) you want to view. This defaults to the current date if none is specified.
+  
+  [[6]] Row Count - the number of rows you want displayed per page. This will be the basis for the pagination of the results. The default value is 30 rows.
+  
+  []
+  
+  Just specify values for either one or all of the above fields and then submit the form to perform the query. The results of the query will be displayed at the lower
+  section of the page, similar to that shown in the <<<Latest Events>>> except that the heading will be <<<Results>>> instead of <<<Latest Events>>>.
+
+
+
+

Modified: archiva/trunk/archiva-docs/src/site/apt/userguide/index.apt
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-docs/src/site/apt/userguide/index.apt?rev=897892&r1=897891&r2=897892&view=diff
==============================================================================
--- archiva/trunk/archiva-docs/src/site/apt/userguide/index.apt (original)
+++ archiva/trunk/archiva-docs/src/site/apt/userguide/index.apt Mon Jan 11 15:07:00 2010
@@ -20,6 +20,8 @@
     * {{{virtual-repositories.html} Configuring Virtual Repositories}}
 
     * {{{rss.html}RSS Feeds in Archiva}}
+    
+    * {{{auditlog-report.html}Viewing the Audit Log Report}}
 
     []
 

Added: archiva/trunk/archiva-docs/src/site/resources/images/latest-events.png
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-docs/src/site/resources/images/latest-events.png?rev=897892&view=auto
==============================================================================
Binary file - no diff available.

Propchange: archiva/trunk/archiva-docs/src/site/resources/images/latest-events.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Modified: archiva/trunk/archiva-docs/src/site/site.xml
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-docs/src/site/site.xml?rev=897892&r1=897891&r2=897892&view=diff
==============================================================================
--- archiva/trunk/archiva-docs/src/site/site.xml (original)
+++ archiva/trunk/archiva-docs/src/site/site.xml Mon Jan 11 15:07:00 2010
@@ -40,6 +40,7 @@
       <item name="Deploying to repository"   href="/userguide/deploy.html" />
       <item name="Configuring Virtual Repositories"   href="/userguide/virtual-repositories.html" />
       <item name="Rss Feeds in Archiva"      href="/userguide/rss.html"/>
+      <item name="Audit Log Report"      href="/userguide/auditlog-report.html"/>
     </menu>
 
     <menu name="Administrators Guide">

Modified: archiva/trunk/archiva-modules/archiva-base/archiva-model/pom.xml
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-base/archiva-model/pom.xml?rev=897892&r1=897891&r2=897892&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-base/archiva-model/pom.xml (original)
+++ archiva/trunk/archiva-modules/archiva-base/archiva-model/pom.xml Mon Jan 11 15:07:00 2010
@@ -70,7 +70,7 @@
         <groupId>org.codehaus.modello</groupId>
         <artifactId>modello-maven-plugin</artifactId>
         <configuration>
-          <version>1.2.1</version>
+          <version>1.3.0</version>
           <packageWithVersion>false</packageWithVersion>
           <models>
             <model>src/main/mdo/archiva-base.xml</model>

Modified: archiva/trunk/archiva-modules/archiva-base/archiva-model/src/main/mdo/archiva-base.xml
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-base/archiva-model/src/main/mdo/archiva-base.xml?rev=897892&r1=897891&r2=897892&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-base/archiva-model/src/main/mdo/archiva-base.xml (original)
+++ archiva/trunk/archiva-modules/archiva-base/archiva-model/src/main/mdo/archiva-base.xml Mon Jan 11 15:07:00 2010
@@ -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.3.0</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.3.0+</version>
+      <fields>
+        <field stash.maxSize="50">
+          <name>repositoryId</name>
+          <version>1.3.0+</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.3.0+</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.3.0+</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.3.0+</version>
+          <identifier>false</identifier>
+          <required>false</required>
+          <type>String</type>
+          <description>
+            The event that happened.
+          </description>
+        </field>
+        <field>
+          <name>username</name>
+          <version>1.3.0+</version>
+          <identifier>false</identifier>
+          <required>true</required>
+          <type>String</type>
+          <description>
+            The user who executed the event.
+          </description>
+        </field>
+      </fields>
+      <codeSegments>
+        <codeSegment>
+          <version>1.3.0+</version>
+          <code><![CDATA[
+    private static final long serialVersionUID = -7113629916828442780L;
+          ]]></code>
+        </codeSegment>
+      </codeSegments>
+    </class>
   </classes>
 </model>

Added: archiva/trunk/archiva-modules/archiva-database/src/main/java/org/apache/maven/archiva/database/ArchivaAuditLogsDao.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-database/src/main/java/org/apache/maven/archiva/database/ArchivaAuditLogsDao.java?rev=897892&view=auto
==============================================================================
--- archiva/trunk/archiva-modules/archiva-database/src/main/java/org/apache/maven/archiva/database/ArchivaAuditLogsDao.java (added)
+++ archiva/trunk/archiva-modules/archiva-database/src/main/java/org/apache/maven/archiva/database/ArchivaAuditLogsDao.java Mon Jan 11 15:07:00 2010
@@ -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;
+}

Added: archiva/trunk/archiva-modules/archiva-database/src/main/java/org/apache/maven/archiva/database/constraints/ArchivaAuditLogsConstraint.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-database/src/main/java/org/apache/maven/archiva/database/constraints/ArchivaAuditLogsConstraint.java?rev=897892&view=auto
==============================================================================
--- archiva/trunk/archiva-modules/archiva-database/src/main/java/org/apache/maven/archiva/database/constraints/ArchivaAuditLogsConstraint.java (added)
+++ archiva/trunk/archiva-modules/archiva-database/src/main/java/org/apache/maven/archiva/database/constraints/ArchivaAuditLogsConstraint.java Mon Jan 11 15:07:00 2010
@@ -0,0 +1,106 @@
+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 java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * ArchivaAuditLogsConstraint
+ */
+public class ArchivaAuditLogsConstraint
+    extends RangeConstraint
+{
+    private String whereClause;
+    
+    private void createWhereClause( String desiredArtifact, String desiredRepositoryId, String desiredEvent,
+                                    Date startDate, Date endDate )
+    {
+        whereClause = "eventDate >= desiredStartDate && eventDate <= desiredEndDate";        
+        declImports = new String[] { "import java.util.Date" };
+                
+        List<String> declParamsList = new ArrayList<String>();
+        declParamsList.add( "Date desiredStartDate" );
+        declParamsList.add( "Date desiredEndDate" );
+
+        List<Object> paramsList = new ArrayList<Object>();
+        paramsList.add( startDate );
+        paramsList.add( endDate );
+
+        if ( desiredArtifact != null && !"".equals( desiredArtifact ) )
+        {
+            whereClause = whereClause + " && artifact.like(desiredArtifact)";
+            declParamsList.add( "String desiredArtifact" );
+            paramsList.add( desiredArtifact );            
+        }
+
+        if ( desiredRepositoryId != null && !"".equals( desiredRepositoryId ) )
+        {
+            whereClause = whereClause + " && repositoryId == desiredRepositoryId";
+            declParamsList.add( "String desiredRepositoryId" );
+            paramsList.add( desiredRepositoryId );
+        }
+
+        if ( desiredEvent != null && !"".equals( desiredEvent ) )
+        {
+            whereClause = whereClause + " && event ==  desiredEvent";
+            declParamsList.add( "String desiredEvent" );
+            paramsList.add( desiredEvent );
+        }
+
+        int size = declParamsList.size();
+        int i = 0;
+        declParams = new String[size];       
+        
+        while( i < size )
+        {
+            declParams[i] = declParamsList.get( i );
+            i++;
+        }        
+        
+        params = paramsList.toArray();
+    }
+
+    public ArchivaAuditLogsConstraint( int[] range, String desiredArtifact, String desiredRepositoryId,
+                                       String desiredEvent, Date startDate, Date endDate )
+    {
+        super( range );
+        createWhereClause( desiredArtifact, desiredRepositoryId, desiredEvent, startDate, endDate );
+    }
+    
+    public ArchivaAuditLogsConstraint( String desiredArtifact, String desiredRepositoryId,
+                                       String desiredEvent, Date startDate, Date endDate )
+    {
+        super();
+        createWhereClause( desiredArtifact, desiredRepositoryId, desiredEvent, startDate, endDate );
+    }
+
+
+    public String getSortColumn()
+    {
+        return "eventDate";
+    }
+
+    public String getWhereCondition()
+    {
+        return whereClause;
+    }
+}

Added: archiva/trunk/archiva-modules/archiva-database/src/main/java/org/apache/maven/archiva/database/constraints/MostRecentArchivaAuditLogsConstraint.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-database/src/main/java/org/apache/maven/archiva/database/constraints/MostRecentArchivaAuditLogsConstraint.java?rev=897892&view=auto
==============================================================================
--- archiva/trunk/archiva-modules/archiva-database/src/main/java/org/apache/maven/archiva/database/constraints/MostRecentArchivaAuditLogsConstraint.java (added)
+++ archiva/trunk/archiva-modules/archiva-database/src/main/java/org/apache/maven/archiva/database/constraints/MostRecentArchivaAuditLogsConstraint.java Mon Jan 11 15:07:00 2010
@@ -0,0 +1,49 @@
+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;
+import org.apache.maven.archiva.repository.audit.AuditEvent;
+
+public class MostRecentArchivaAuditLogsConstraint
+    extends AbstractSimpleConstraint
+{
+    private String sql;
+
+    public MostRecentArchivaAuditLogsConstraint()
+    {
+        sql =
+            "SELECT FROM " + ArchivaAuditLogs.class.getName() +
+                " WHERE event == uploadArtifact PARAMETERS String uploadArtifact" +
+                " ORDER BY eventDate DESCENDING RANGE 0,10";
+
+        super.params = new Object[] { AuditEvent.UPLOAD_FILE };
+    }
+
+    public Class<?> getResultClass()
+    {
+        return ArchivaAuditLogs.class;
+    }
+
+    public String getSelectSql()
+    {
+        return sql;
+    }
+}

Modified: archiva/trunk/archiva-modules/archiva-database/src/main/java/org/apache/maven/archiva/database/jdo/JdoAccess.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-database/src/main/java/org/apache/maven/archiva/database/jdo/JdoAccess.java?rev=897892&r1=897891&r2=897892&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-database/src/main/java/org/apache/maven/archiva/database/jdo/JdoAccess.java (original)
+++ archiva/trunk/archiva-modules/archiva-database/src/main/java/org/apache/maven/archiva/database/jdo/JdoAccess.java Mon Jan 11 15:07:00 2010
@@ -395,7 +395,7 @@
             case 3:
                 return (List<?>) query.execute( parameters[0], parameters[1], parameters[2] );
             default:
-                throw new JDOException( "Unable to use more than 3 parameters." );
+                return (List<?>) query.executeWithArray( parameters );                
         }
     }
 

Added: archiva/trunk/archiva-modules/archiva-database/src/main/java/org/apache/maven/archiva/database/jdo/JdoArchivaAuditLogsDao.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-database/src/main/java/org/apache/maven/archiva/database/jdo/JdoArchivaAuditLogsDao.java?rev=897892&view=auto
==============================================================================
--- archiva/trunk/archiva-modules/archiva-database/src/main/java/org/apache/maven/archiva/database/jdo/JdoArchivaAuditLogsDao.java (added)
+++ archiva/trunk/archiva-modules/archiva-database/src/main/java/org/apache/maven/archiva/database/jdo/JdoArchivaAuditLogsDao.java Mon Jan 11 15:07:00 2010
@@ -0,0 +1,62 @@
+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 );
+    }
+
+    @SuppressWarnings( "unchecked" )
+    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 );
+    }
+}

Modified: archiva/trunk/archiva-modules/archiva-web/archiva-security/src/main/java/org/apache/maven/archiva/security/ArchivaRoleConstants.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-security/src/main/java/org/apache/maven/archiva/security/ArchivaRoleConstants.java?rev=897892&r1=897891&r2=897892&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-security/src/main/java/org/apache/maven/archiva/security/ArchivaRoleConstants.java (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-security/src/main/java/org/apache/maven/archiva/security/ArchivaRoleConstants.java Mon Jan 11 15:07:00 2010
@@ -65,6 +65,8 @@
     public static final String OPERATION_REPOSITORY_UPLOAD = "archiva-upload-repository";
 
     public static final String OPERATION_REPOSITORY_DELETE = "archiva-delete-artifact";
+    
+    public static final String OPERATION_VIEW_AUDIT_LOG = "archiva-view-audit-logs";
 
     // Role templates
     public static final String TEMPLATE_REPOSITORY_MANAGER = "archiva-repository-manager";

Modified: archiva/trunk/archiva-modules/archiva-web/archiva-security/src/main/resources/META-INF/redback/redback.xml
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-security/src/main/resources/META-INF/redback/redback.xml?rev=897892&r1=897891&r2=897892&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-security/src/main/resources/META-INF/redback/redback.xml (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-security/src/main/resources/META-INF/redback/redback.xml Mon Jan 11 15:07:00 2010
@@ -66,6 +66,11 @@
           <description>Access Archiva Repository</description>
         </operation>
         <operation>
+          <id>archiva-view-audit-logs</id>
+          <name>archiva-view-audit-logs</name>
+          <description>View Archiva Audit Logs</description>
+        </operation>
+        <operation>
           <id>archiva-guest</id>
           <name>archiva-guest</name>
           <description>Active Archiva Guest</description>
@@ -219,6 +224,12 @@
               <operation>archiva-upload-repository</operation>
               <resource>${resource}</resource>
             </permission>
+            <permission>
+              <id>archiva-view-audit-logs</id>
+              <name>Archiva View Audit Logs</name>
+              <operation>archiva-view-audit-logs</operation>
+              <resource>${resource}</resource>
+            </permission>
           </permissions>
           <childTemplates>
             <childTemplate>archiva-repository-observer</childTemplate>

Modified: archiva/trunk/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/config/testng.xml
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/config/testng.xml?rev=897892&r1=897891&r2=897892&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/config/testng.xml (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/config/testng.xml Mon Jan 11 15:07:00 2010
@@ -33,6 +33,7 @@
 				<include name= "reposcan" />
 				<include name= "artifactmanagement" />
 				<include name= "search" />
+				<include name= "auditlogsreport" />
 				<include name= "browse" />
 				<include name= "reports" />
 				<include name= "virtualrepository" />

Added: archiva/trunk/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/AuditLogsReportTest.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/AuditLogsReportTest.java?rev=897892&view=auto
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/AuditLogsReportTest.java (added)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/AuditLogsReportTest.java Mon Jan 11 15:07:00 2010
@@ -0,0 +1,125 @@
+package org.apache.archiva.web.test;
+
+/*
+ * 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.archiva.web.test.parent.AbstractArchivaTest;
+import org.testng.annotations.Test;
+
+@Test( groups = { "auditlogsreport" }, dependsOnMethods = { "testWithCorrectUsernamePassword" } )
+public class AuditLogsReportTest
+    extends AbstractArchivaTest
+{
+    private void goToAuditLogReports()
+    {
+        clickLinkWithText( "Audit Log Report" );        
+    }
+    
+    private void assertAuditLogsReportPage()
+    {   
+        assertPage( "Apache Archiva \\ Audit Log Report" );
+        assertTextPresent( "Audit Log Report" );
+        
+        assertElementPresent( "repository" );
+        assertElementPresent( "groupId" );
+        assertElementPresent( "artifactId" );
+        assertElementPresent( "startDate" );
+        assertElementPresent( "endDate" );
+        assertElementPresent( "rowCount" );
+        assertButtonWithValuePresent( "View Audit Log" );
+    }
+    
+    @Test(dependsOnMethods = { "testWithCorrectUsernamePassword" } )
+    public void testAuditLogsReport()
+    {
+        goToAuditLogReports();        
+        assertAuditLogsReportPage();
+        assertTextPresent( "Latest Events" );
+    }
+    
+    @Test(dependsOnMethods = { "testWithCorrectUsernamePassword" } )
+    public void testViewAuditLogsNoDataFound()
+    {
+        goToAuditLogReports();        
+        assertAuditLogsReportPage();
+        
+        setFieldValue( "groupId", "non.existing" );
+        submit();
+        
+        assertPage( "Apache Archiva \\ Audit Log Report" );   
+        assertTextPresent( "Results" );
+        assertTextPresent( "No audit logs found." );
+    }    
+    
+    @Test (dependsOnMethods = { "testAddArtifactValidValues" } )
+    public void testViewAuditLogsDataFound()
+    {
+        goToAuditLogReports();        
+        assertAuditLogsReportPage();
+        
+        selectValue( "repository", "internal" );
+        setFieldValue( "groupId", "test" );
+        submit();
+                
+        assertAuditLogsReportPage();
+        assertTextPresent( "Results" );
+        assertTextNotPresent( "No audit logs found." );
+        assertTextPresent( "test-1.0.jar" );
+        assertTextPresent( "Uploaded File" );
+        assertTextPresent( "internal" );
+        assertTextPresent( "admin" );
+    }
+    
+    @Test (dependsOnMethods = { "testViewAuditLogsDataFound" } )
+    public void testViewAuditLogsOnlyArtifactIdIsSpecified()
+    {
+        goToAuditLogReports();        
+        assertAuditLogsReportPage();
+        
+        selectValue( "repository", "internal" );
+        setFieldValue( "artifactId", "test" );
+        submit();
+                
+        assertAuditLogsReportPage();
+        assertTextPresent( "Results" );
+        assertTextNotPresent( "No audit logs found." );
+        assertTextPresent( "test-1.0.jar" );
+        assertTextPresent( "Uploaded File" );
+        assertTextPresent( "internal" );
+        assertTextPresent( "admin" );
+    }
+    
+    @Test (dependsOnMethods = { "testViewAuditLogsOnlyArtifactIdIsSpecified" } )
+    public void testViewAuditLogsForAllRepositories()
+    {
+        goToAuditLogReports();        
+        assertAuditLogsReportPage();
+        
+        selectValue( "repository", "all" );
+        submit();
+        
+        assertAuditLogsReportPage();
+        assertTextPresent( "Results" );
+        assertTextNotPresent( "No audit logs found." );
+        assertTextPresent( "test-1.0.jar" );
+        assertTextPresent( "Uploaded File" );
+        assertTextPresent( "internal" );
+        assertTextPresent( "admin" );
+    }
+}

Modified: archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/PlexusActionSupport.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/PlexusActionSupport.java?rev=897892&r1=897891&r2=897892&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/PlexusActionSupport.java (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/PlexusActionSupport.java Mon Jan 11 15:07:00 2010
@@ -20,11 +20,14 @@
  */
 
 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 @@
      */
     private List<AuditListener> auditListeners = new ArrayList<AuditListener>();
 
+    /**
+     * @plexus.requirement role-hint="jdo"
+     */
+    private ArchivaAuditLogsDao auditLogsDao;    
+
     private String principal;
 
     @SuppressWarnings("unchecked")
@@ -85,6 +93,15 @@
         {
             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 )
@@ -129,4 +146,9 @@
     {
         this.principal = principal;
     }
+    
+    public void setAuditLogsDao( ArchivaAuditLogsDao auditLogsDao )
+    {
+        this.auditLogsDao = auditLogsDao;
+    }
 }

Modified: archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/UploadAction.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/UploadAction.java?rev=897892&r1=897891&r2=897892&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/UploadAction.java (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/UploadAction.java Mon Jan 11 15:07:00 2010
@@ -149,7 +149,7 @@
      * @plexus.requirement
      */
     private ArchivaTaskScheduler scheduler;
-
+    
     private ChecksumAlgorithm[] algorithms = new ChecksumAlgorithm[]{ChecksumAlgorithm.SHA1, ChecksumAlgorithm.MD5};
 
     private ProjectModelWriter pomWriter = new ProjectModel400Writer();
@@ -423,7 +423,7 @@
             String msg = "Artifact \'" + groupId + ":" + artifactId + ":" + version +
                 "\' was successfully deployed to repository \'" + repositoryId + "\'";
 
-            triggerAuditEvent( repositoryId, groupId + ":" + artifactId + ":" + version, AuditEvent.UPLOAD_FILE );
+            triggerAuditEvent( repositoryId, artifactPath, AuditEvent.UPLOAD_FILE );  
 
             addActionMessage( msg );
 

Added: archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/reports/ViewAuditLogReportAction.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/reports/ViewAuditLogReportAction.java?rev=897892&view=auto
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/reports/ViewAuditLogReportAction.java (added)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/reports/ViewAuditLogReportAction.java Mon Jan 11 15:07:00 2010
@@ -0,0 +1,433 @@
+package org.apache.maven.archiva.web.action.reports;
+
+/*
+ * 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.ArrayList;
+import java.util.Calendar;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.time.DateUtils;
+import org.apache.maven.archiva.database.ArchivaAuditLogsDao;
+import org.apache.maven.archiva.database.ArchivaDAO;
+import org.apache.maven.archiva.database.ArchivaDatabaseException;
+import org.apache.maven.archiva.database.ObjectNotFoundException;
+import org.apache.maven.archiva.database.SimpleConstraint;
+import org.apache.maven.archiva.database.constraints.ArchivaAuditLogsConstraint;
+import org.apache.maven.archiva.database.constraints.MostRecentArchivaAuditLogsConstraint;
+import org.apache.maven.archiva.model.ArchivaAuditLogs;
+import org.apache.maven.archiva.repository.audit.AuditEvent;
+import org.apache.maven.archiva.security.AccessDeniedException;
+import org.apache.maven.archiva.security.ArchivaSecurityException;
+import org.apache.maven.archiva.security.PrincipalNotFoundException;
+import org.apache.maven.archiva.security.UserRepositories;
+import org.apache.maven.archiva.web.action.PlexusActionSupport;
+import org.apache.struts2.interceptor.ServletRequestAware;
+import org.codehaus.redback.integration.interceptor.SecureAction;
+import org.codehaus.redback.integration.interceptor.SecureActionBundle;
+import org.codehaus.redback.integration.interceptor.SecureActionException;
+
+import com.opensymphony.xwork2.Preparable;
+
+/**
+ * @plexus.component role="com.opensymphony.xwork2.Action" role-hint="viewAuditLogReport"
+ *                   instantiation-strategy="per-lookup"
+ */
+public class ViewAuditLogReportAction
+    extends PlexusActionSupport
+    implements SecureAction, ServletRequestAware, Preparable
+{
+    protected HttpServletRequest request;
+
+    /**
+     * @plexus.requirement
+     */
+    private UserRepositories userRepositories;
+
+    /**
+     * @plexus.requirement role-hint="jdo"
+     */
+    private ArchivaAuditLogsDao auditLogsDao;
+
+    /**
+     * @plexus.requirement role-hint="jdo"
+     */
+    private ArchivaDAO dao;
+
+    private String repository;
+
+    private List<String> repositories;
+
+    private String groupId;
+
+    private String artifactId;
+
+    private String startDate;
+
+    private String endDate;
+    
+    private int rowCount = 30;
+
+    private int page = 1;
+
+    private String prev;
+
+    private String next;
+
+    protected boolean isLastPage = true;
+
+    private List<ArchivaAuditLogs> auditLogs;
+
+    private static final String ALL_REPOSITORIES = "all";
+
+    protected int[] range = new int[2];
+    
+    private String initial = "true";
+    
+    private String headerName;
+    
+    private static final String HEADER_LATEST_EVENTS = "Latest Events";
+    
+    private static final String HEADER_RESULTS = "Results";
+    
+    private String[] datePatterns = new String[] { "MM/dd/yy", "MM/dd/yyyy", "MMMMM/dd/yyyy", "MMMMM/dd/yy", 
+        "dd MMMMM yyyy", "dd/MM/yy", "dd/MM/yyyy", "yyyy/MM/dd", "yyyy-MM-dd", "yyyy-dd-MM", "MM-dd-yyyy",
+        "MM-dd-yy" };
+
+    public SecureActionBundle getSecureActionBundle()
+        throws SecureActionException
+    {
+        return null;
+    }
+
+    public void setServletRequest( HttpServletRequest request )
+    {
+        this.request = request;
+    }
+
+    @SuppressWarnings( "unchecked" )
+    public void prepare()
+        throws Exception
+    {
+        repositories = new ArrayList<String>();
+        repositories.add( ALL_REPOSITORIES );
+        repositories.addAll( getObservableRepositories() );
+
+        auditLogs = null;
+        groupId = "";
+        artifactId = "";
+        repository = "";
+                
+        if( Boolean.parseBoolean( initial ) )
+        {
+            headerName = HEADER_LATEST_EVENTS;
+        }
+        else
+        {
+            headerName = HEADER_RESULTS;
+        }
+
+        SimpleConstraint constraint = new MostRecentArchivaAuditLogsConstraint();
+        auditLogs = (List<ArchivaAuditLogs>) dao.query( constraint );
+    }
+
+    public String execute()
+        throws Exception
+    {
+        auditLogs = null;
+        String artifact = "";
+        
+        if ( groupId != null && !"".equals( groupId.trim() ) )
+        {
+            artifact = groupId + ( ( artifactId != null  && !"".equals( artifactId.trim() ) ) ? ( "/" + artifactId + "/%" ) : "%" );
+        }
+        else
+        {               
+            artifact = ( artifactId != null  && !"".equals( artifactId.trim() ) ) ? ( "%" + artifactId + "%" ) : "";
+        }        
+                
+        Date startDateInDF = null;
+        Date endDateInDF = null;        
+        if ( startDate == null || "".equals( startDate ) )
+        {            
+            Calendar cal = Calendar.getInstance();
+            cal.set( Calendar.HOUR, 0 );
+            cal.set( Calendar.MINUTE, 0 );
+            cal.set( Calendar.SECOND, 0 );
+
+            startDateInDF = cal.getTime();
+        }
+        else
+        {
+            startDateInDF = DateUtils.parseDate( startDate, datePatterns );
+        }
+
+        if ( endDate == null || "".equals( endDate ) )
+        {
+            endDateInDF = Calendar.getInstance().getTime();
+        } 
+        else
+        {
+            endDateInDF = DateUtils.parseDate( endDate, datePatterns );
+            Calendar cal = Calendar.getInstance();
+            cal.setTime( endDateInDF );
+            cal.set( Calendar.HOUR, 23 );
+            cal.set( Calendar.MINUTE, 59 );
+            cal.set( Calendar.SECOND, 59 );
+            
+            endDateInDF = cal.getTime();            
+        }
+
+        range[0] = ( page - 1 ) * rowCount;
+        range[1] = ( page * rowCount ) + 1;
+        
+        ArchivaAuditLogsConstraint constraint = null;
+        if ( !repository.equals( ALL_REPOSITORIES ) )
+        {
+            constraint =
+                new ArchivaAuditLogsConstraint( range, artifact, repository, AuditEvent.UPLOAD_FILE, startDateInDF, endDateInDF );
+        }
+        else
+        {
+            constraint =
+                new ArchivaAuditLogsConstraint( range, artifact, null, AuditEvent.UPLOAD_FILE, startDateInDF, endDateInDF );
+        }
+
+        try
+        {
+            auditLogs = auditLogsDao.queryAuditLogs( constraint );            
+            if( auditLogs.isEmpty() )
+            {
+                addActionError( "No audit logs found." );
+                initial = "true";                
+            }
+            else
+            {   
+                initial = "false";
+            }
+            
+            headerName = HEADER_RESULTS;         
+            paginate();
+        }
+        catch ( ObjectNotFoundException e )
+        {
+            addActionError( "No audit logs found." );
+            return ERROR;
+        }
+        catch ( ArchivaDatabaseException e )
+        {
+            addActionError( "Error occurred while querying audit logs." );
+            return ERROR;
+        }
+
+        return SUCCESS;
+    }
+    
+    private void paginate()
+    {
+        if ( auditLogs.size() <= rowCount )
+        {
+            isLastPage = true;
+        }
+        else
+        {   
+            isLastPage = false;
+            auditLogs.remove( rowCount );
+        }
+
+        prev =
+            request.getRequestURL() + "?page=" + ( page - 1 ) + "&rowCount=" + rowCount + "&groupId=" + groupId +
+                "&artifactId=" + artifactId + "&repository=" + repository + "&startDate=" + startDate + "&endDate=" +
+                endDate;
+        
+        next =
+            request.getRequestURL() + "?page=" + ( page + 1 ) + "&rowCount=" + rowCount + "&groupId=" + groupId +
+                "&artifactId=" + artifactId + "&repository=" + repository + "&startDate=" + startDate + "&endDate=" +
+                endDate;
+        
+        prev = StringUtils.replace( prev, " ", "%20" );
+        next = StringUtils.replace( next, " ", "%20" );
+    }
+
+    private List<String> getObservableRepositories()
+    {
+        try
+        {
+            return userRepositories.getObservableRepositoryIds( getPrincipal() );
+        }
+        catch ( PrincipalNotFoundException e )
+        {
+            log.warn( e.getMessage(), e );
+        }
+        catch ( AccessDeniedException e )
+        {
+            log.warn( e.getMessage(), e );
+        }
+        catch ( ArchivaSecurityException e )
+        {
+            log.warn( e.getMessage(), e );
+        }
+        return Collections.emptyList();
+    }
+
+    public String getRepository()
+    {
+        return repository;
+    }
+
+    public void setRepository( String repository )
+    {
+        this.repository = repository;
+    }
+
+    public List<String> getRepositories()
+    {
+        return repositories;
+    }
+
+    public void setRepositories( List<String> repositories )
+    {
+        this.repositories = repositories;
+    }
+
+    public String getGroupId()
+    {
+        return groupId;
+    }
+
+    public void setGroupId( String groupId )
+    {
+        this.groupId = groupId;
+    }
+
+    public String getArtifactId()
+    {
+        return artifactId;
+    }
+
+    public void setArtifactId( String artifactId )
+    {
+        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;
+    }
+
+    public String getStartDate()
+    {
+        return startDate;
+    }
+
+    public void setStartDate( String startDate )
+    {
+        this.startDate = startDate;
+    }
+
+    public String getEndDate()
+    {
+        return endDate;
+    }
+
+    public void setEndDate( String endDate )
+    {
+        this.endDate = endDate;
+    }
+
+    public int getPage()
+    {
+        return page;
+    }
+
+    public void setPage( int page )
+    {
+        this.page = page;
+    }
+
+    public boolean getIsLastPage()
+    {
+        return isLastPage;
+    }
+
+    public void setIsLastPage( boolean isLastPage )
+    {
+        this.isLastPage = isLastPage;
+    }
+    
+    public String getPrev()
+    {
+        return prev;
+    }
+
+    public void setPrev( String prev )
+    {
+        this.prev = prev;
+    }
+
+    public String getNext()
+    {
+        return next;
+    }
+
+    public void setNext( String next )
+    {
+        this.next = next;
+    }
+    
+    public String getInitial()
+    {
+        return initial;
+    }
+
+    public void setInitial( String initial )
+    {
+        this.initial = initial;
+    }
+
+    public String getHeaderName()
+    {
+        return headerName;
+    }
+
+    public void setHeaderName( String headerName )
+    {
+        this.headerName = headerName;
+    }
+}

Modified: archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/resources/struts.xml
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/resources/struts.xml?rev=897892&r1=897891&r2=897892&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/resources/struts.xml (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/resources/struts.xml Mon Jan 11 15:07:00 2010
@@ -523,6 +523,16 @@
       </result>
     </action>
     
+    <!--  audit logs -->
+    <action name="queryAuditLogReport" class="viewAuditLogReport" method="input">
+      <result name="input">/WEB-INF/jsp/reports/auditLogReport.jsp</result>
+    </action>
+    
+    <action name="viewAuditLogReport" class="viewAuditLogReport">
+      <result name="input">/WEB-INF/jsp/reports/auditLogReport.jsp</result>
+      <result>/WEB-INF/jsp/reports/auditLogReport.jsp</result>
+    </action>
+    
   </package>
 </struts>
 

Modified: archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/decorators/default.jsp
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/decorators/default.jsp?rev=897892&r1=897891&r2=897892&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/decorators/default.jsp (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/decorators/default.jsp Mon Jan 11 15:07:00 2010
@@ -80,7 +80,7 @@
       </li>
     </ul>
 
-    <redback:ifAnyAuthorized permissions="archiva-upload-repository,archiva-delete-artifact,archiva-manage-users,archiva-access-reports,archiva-manage-configuration">
+    <redback:ifAnyAuthorized permissions="archiva-upload-repository,archiva-delete-artifact,archiva-manage-users,archiva-access-reports,archiva-manage-configuration,archiva-view-audit-logs">
       <h5>Manage</h5>
       <ul>
         <redback:ifAuthorized permission="archiva-access-reports">
@@ -88,6 +88,11 @@
             <my:currentWWUrl action="pickReport" namespace="/report">Reports</my:currentWWUrl>
           </li>
         </redback:ifAuthorized>
+        <redback:ifAuthorized permission="archiva-view-audit-logs">
+          <li class="none">
+            <my:currentWWUrl action="queryAuditLogReport" namespace="/report">Audit Log Report</my:currentWWUrl>
+          </li>
+        </redback:ifAuthorized>
         <redback:ifAuthorized permission="archiva-manage-users">
           <li class="none">
             <my:currentWWUrl action="userlist" namespace="/security">User Management</my:currentWWUrl>
@@ -112,7 +117,7 @@
           <li class="none">
             <my:currentWWUrl action="deleteArtifact" namespace="/">Delete Artifact</my:currentWWUrl>
           </li>
-        </redback:ifAuthorized>
+        </redback:ifAuthorized>        
           <%-- TODO: future options here.
              * Repository Statistics.
              * Web Services Statistics.

Added: archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/reports/auditLogReport.jsp
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/reports/auditLogReport.jsp?rev=897892&view=auto
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/reports/auditLogReport.jsp (added)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/reports/auditLogReport.jsp Mon Jan 11 15:07:00 2010
@@ -0,0 +1,152 @@
+<%--
+  ~ 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.
+  --%>
+
+<%@ 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>
+
+  <title>Audit Log Report</title>
+  <s:head theme="ajax" />
+  
+  <link rel="stylesheet" href="<c:url value='/css/ui.datepicker.css'/>" type="text/css" media="all"/>
+  <script type="text/javascript" src="<c:url value='/js/jquery/jquery-1.2.6.pack.js'/>"></script>
+  <script type="text/javascript" src="<c:url value='/js/jquery/ui.datepicker.packed.js'/>"></script>
+  <script type="text/javascript" charset="utf-8">
+    $(document).ready(function()
+    {
+		$('#startDate').datepicker()
+		$('#endDate').datepicker()
+    });
+  </script>
+</head>
+
+<body>
+<h1>Audit Log Report</h1>
+  
+<div id="contentArea">
+  
+  <s:form action="viewAuditLogReport" namespace="/report" validate="false">
+     
+    <s:hidden name="initial"/>
+    
+    <div id="auditLogReport"> 	
+        <table id="auditLogFieds">
+          <tbody>
+            <tr>
+	   	      <td>Repository: </td>
+	   	      <td><s:select name="repository" list="repositories" theme="simple"/></td>
+	   	    <tr>
+	   	    <tr>
+	   	      <td>Group ID: </td>
+	   	      <td><s:textfield id="groupId" name="groupId" theme="simple"/></td>
+	   	    <tr>
+	   	    <tr>
+	   	      <td>Artifact ID: </td>
+	   	      <td><s:textfield id="artifactId" name="artifactId" theme="simple"/></td>
+	   	    <tr>
+	   	    <tr>
+	   	      <td>Start Date: </td>
+	   	      <td><s:textfield id="startDate" name="startDate" theme="simple"/>	      
+			    <%--
+			    <script type="text/javascript">
+			      Calendar.setup({
+			        inputField     :    "startDate",     
+			        ifFormat       :    "%Y-%m-%d",             
+			        align          :    "Tl",           
+			        singleClick    :    true
+			      });
+			    </script>
+			    --%>
+	    	  </td>
+	   	    <tr>
+	   	    <tr>
+	   	      <td>End Date: </td>
+	   	      <td><s:textfield id="endDate" name="endDate" theme="simple"/>
+				<%--
+				<script type="text/javascript">
+			      Calendar.setup({
+			        inputField     :    "endDate",     
+			        ifFormat       :    "%Y-%m-%d",             
+			        align          :    "Tl",           
+			        singleClick    :    true
+			      });
+			    </script>
+				--%>    		
+	    	  </td>
+	   	    <tr>
+	   	    <tr>
+	   	      <td>Row Count: </td>
+	   	      <td><s:textfield name="rowCount" theme="simple"/></td>
+	   	    <tr>
+	   	    <tr>
+	   	      <td/>
+	   	      <td style="text-align: right"><s:submit value="View Audit Log" theme="simple"/></td>
+	   	    </tr>
+	   	  </tbody>
+	   	</table>	
+    </div>    
+    
+    <p/>
+    
+    <div class="auditLogReportResults">
+    
+    <h2>${headerName}</h2>
+      <p>
+        <s:actionerror/>
+      </p>
+        
+	    <c:if test="${not empty (auditLogs)}">  
+		  <table class="auditlogs" cellspacing="0">
+	         <tr>
+		        <th>Event</th>
+		        <th>Repository</th>
+		        <th>Artifact</th>
+		        <th>Event Date</th>
+		        <th>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>	
+		  
+		  <s:set name="page" value="page"/>
+	      <c:if test="${page > 1}"><a href="<s:property value='prev' />">&lt;&lt;</a></c:if>
+			  <strong>Page: </strong>${page}
+		  <s:set name="isLastPage" value="isLastPage"/>		  
+		  <c:if test="${!isLastPage}"><a href="<s:property value='next' />">&gt;&gt;</a></c:if>
+		</c:if>  
+	</div>
+   
+  </s:form>
+    
+  
+</div>
+
+</body>
+</html>

Modified: archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/css/site.css
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/css/site.css?rev=897892&r1=897891&r2=897892&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/css/site.css (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/css/site.css Mon Jan 11 15:07:00 2010
@@ -435,4 +435,46 @@
 div.versions a.expand {
     font-size: 7pt;
 	color: gray;	
-}
\ No newline at end of file
+}
+
+table.auditlogs {
+	text-align: center;
+	font-family: Verdana, Geneva, Arial, Helvetica, sans-serif ;
+	font-weight: normal;
+	font-size: 11px;
+	color: #fff;
+	width: 100%;
+	background-color: #666;
+	border: 0px;
+	border-collapse: collapse;
+	border-spacing: 0px;
+}
+
+table.auditlogs th {
+	background-color: #666;
+	color: #fff;
+	padding: 4px;
+	text-align: center;
+	border-bottom: 2px #fff solid;
+	font-size: 12px;
+	font-weight: bold;
+}
+
+table.auditlogs td {
+	background-color: #CCC;
+	color: #000;
+	padding: 4px;
+	text-align: center;
+	border: 1px #fff solid;
+}
+
+div.auditLogReportResults {
+	border: 1px dashed #DFDEDE;
+	margin-bottom: 15px;
+	margin-left: 2px;
+	padding: 5px;
+}
+
+
+
+

Modified: archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/UploadActionTest.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/UploadActionTest.java?rev=897892&r1=897891&r2=897892&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/UploadActionTest.java (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/UploadActionTest.java Mon Jan 11 15:07:00 2010
@@ -31,6 +31,8 @@
 import org.apache.maven.archiva.configuration.Configuration;
 import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration;
 import org.apache.maven.archiva.configuration.RepositoryScanningConfiguration;
+import org.apache.maven.archiva.database.ArchivaAuditLogsDao;
+import org.apache.maven.archiva.model.ArchivaAuditLogs;
 import org.apache.maven.archiva.repository.ManagedRepositoryContent;
 import org.apache.maven.archiva.repository.RepositoryContentFactory;
 import org.apache.maven.archiva.repository.RepositoryNotFoundException;
@@ -62,10 +64,14 @@
     private RepositoryContentFactory repoFactory;
 
     private MockControl repoFactoryControl;
+    
+    private ArchivaAuditLogsDao auditLogsDao;
+
+    private MockControl auditLogsDaoControl;
 
     private static final String REPOSITORY_ID = "test-repo";
 
-    private Configuration config;
+    private Configuration config;    
 
     public void setUp()
         throws Exception
@@ -80,11 +86,16 @@
 
         repoFactoryControl = MockClassControl.createControl( RepositoryContentFactory.class );
         repoFactory = (RepositoryContentFactory) repoFactoryControl.getMock();
+        
+        auditLogsDaoControl = MockControl.createControl( ArchivaAuditLogsDao.class );
+        auditLogsDaoControl.setDefaultMatcher( MockControl.ALWAYS_MATCHER );
+        auditLogsDao = (ArchivaAuditLogsDao) auditLogsDaoControl.getMock();
 
         uploadAction = new UploadAction();
         uploadAction.setScheduler( scheduler );
         uploadAction.setConfiguration( archivaConfig );
         uploadAction.setRepositoryFactory( repoFactory );
+        uploadAction.setAuditLogsDao( auditLogsDao );
 
         File testRepo = new File( getBasedir(), "target/test-classes/test-repo" );
         testRepo.mkdirs();
@@ -216,16 +227,19 @@
 
         archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config );
         repoFactoryControl.expectAndReturn( repoFactory.getManagedRepositoryContent( REPOSITORY_ID ), content );
+        auditLogsDaoControl.expectAndReturn( auditLogsDao.saveAuditLogs( new ArchivaAuditLogs() ), null );
 
         archivaConfigControl.replay();
         repoFactoryControl.replay();
+        auditLogsDaoControl.replay();
 
         String returnString = uploadAction.doUpload();
         assertEquals( Action.SUCCESS, returnString );
 
         archivaConfigControl.verify();
         repoFactoryControl.verify();
-
+        auditLogsDaoControl.verify();
+        
         String repoLocation = config.findManagedRepositoryById( REPOSITORY_ID ).getLocation();
         assertAllArtifactsIncludingSupportArtifactsArePresent( repoLocation );
 
@@ -245,15 +259,18 @@
 
         archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config );
         repoFactoryControl.expectAndReturn( repoFactory.getManagedRepositoryContent( REPOSITORY_ID ), content );
+        auditLogsDaoControl.expectAndReturn( auditLogsDao.saveAuditLogs( new ArchivaAuditLogs() ), null );
 
         archivaConfigControl.replay();
         repoFactoryControl.replay();
-
+        auditLogsDaoControl.replay();
+        
         String returnString = uploadAction.doUpload();
         assertEquals( Action.SUCCESS, returnString );
 
         archivaConfigControl.verify();
         repoFactoryControl.verify();
+        auditLogsDaoControl.verify();
 
         String repoLocation = config.findManagedRepositoryById( REPOSITORY_ID ).getLocation();
         assertTrue( new File( repoLocation, "/org/apache/archiva/artifact-upload/1.0/artifact-upload-1.0-tests.jar" ).exists() );
@@ -319,15 +336,18 @@
 
         archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config );
         repoFactoryControl.expectAndReturn( repoFactory.getManagedRepositoryContent( REPOSITORY_ID ), content );
+        auditLogsDaoControl.expectAndReturn( auditLogsDao.saveAuditLogs( new ArchivaAuditLogs() ), null );
 
         archivaConfigControl.replay();
         repoFactoryControl.replay();
+        auditLogsDaoControl.replay();
 
         String returnString = uploadAction.doUpload();
         assertEquals( Action.SUCCESS, returnString );
 
         archivaConfigControl.verify();
         repoFactoryControl.verify();
+        auditLogsDaoControl.verify();
 
         String repoLocation = config.findManagedRepositoryById( REPOSITORY_ID ).getLocation();
         assertAllArtifactsIncludingSupportArtifactsArePresent( repoLocation );
@@ -377,15 +397,18 @@
 
         archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config );
         repoFactoryControl.expectAndReturn( repoFactory.getManagedRepositoryContent( REPOSITORY_ID ), content );
-
+        auditLogsDaoControl.expectAndReturn( auditLogsDao.saveAuditLogs( new ArchivaAuditLogs() ), null );
+        
         archivaConfigControl.replay();
         repoFactoryControl.replay();
-
+        auditLogsDaoControl.replay();
+       
         String returnString = uploadAction.doUpload();
         assertEquals( Action.SUCCESS, returnString );
 
         archivaConfigControl.verify();
         repoFactoryControl.verify();
+        auditLogsDaoControl.verify();
 
         String repoLocation = config.findManagedRepositoryById( REPOSITORY_ID ).getLocation();
         assertEquals( 6, new File( repoLocation, "/org/apache/archiva/artifact-upload/1.0-SNAPSHOT/" ).list().length );
@@ -412,18 +435,23 @@
         
         archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config );
         repoFactoryControl.expectAndReturn( repoFactory.getManagedRepositoryContent( REPOSITORY_ID ), content );
+        auditLogsDaoControl.expectAndReturn( auditLogsDao.saveAuditLogs( new ArchivaAuditLogs() ), null );
         
         archivaConfigControl.replay();
         repoFactoryControl.replay();
+        auditLogsDaoControl.replay();
 
         String returnString = uploadAction.doUpload();
         assertEquals( Action.SUCCESS, returnString );
 
         archivaConfigControl.verify();
         repoFactoryControl.verify();
+        auditLogsDaoControl.verify();
 
         archivaConfigControl.reset();
         repoFactoryControl.reset();
+        auditLogsDaoControl.reset();
+        auditLogsDaoControl.setDefaultMatcher( MockControl.ALWAYS_MATCHER );
 
         String repoLocation = config.findManagedRepositoryById( REPOSITORY_ID ).getLocation();
         assertAllArtifactsIncludingSupportArtifactsArePresent( repoLocation );
@@ -438,15 +466,18 @@
 
         archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config );
         repoFactoryControl.expectAndReturn( repoFactory.getManagedRepositoryContent( REPOSITORY_ID ), content );
-
+        auditLogsDaoControl.expectAndReturn( auditLogsDao.saveAuditLogs( new ArchivaAuditLogs() ), null );
+        
         archivaConfigControl.replay();
         repoFactoryControl.replay();
+        auditLogsDaoControl.replay();
 
         returnString = uploadAction.doUpload();
         assertEquals( Action.SUCCESS, returnString );
 
         archivaConfigControl.verify();
         repoFactoryControl.verify();
+        auditLogsDaoControl.verify();
 
         repoLocation = config.findManagedRepositoryById( REPOSITORY_ID ).getLocation();
         assertAllArtifactsIncludingSupportArtifactsArePresent( repoLocation );
@@ -467,9 +498,11 @@
 
         archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config, 2 );
         repoFactoryControl.expectAndReturn( repoFactory.getManagedRepositoryContent( REPOSITORY_ID ), content, 2 );
-
+        auditLogsDaoControl.expectAndReturn( auditLogsDao.saveAuditLogs( new ArchivaAuditLogs() ), null );
+        
         archivaConfigControl.replay();
         repoFactoryControl.replay();
+        auditLogsDaoControl.replay();
 
         String returnString = uploadAction.doUpload();
         assertEquals( Action.SUCCESS, returnString );
@@ -484,6 +517,7 @@
 
         archivaConfigControl.verify();
         repoFactoryControl.verify();
+        auditLogsDaoControl.verify();
 
         String repoLocation = config.findManagedRepositoryById( REPOSITORY_ID ).getLocation();
         assertAllArtifactsIncludingSupportArtifactsArePresent( repoLocation );
@@ -506,9 +540,11 @@
     
         archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config, 2 );
         repoFactoryControl.expectAndReturn( repoFactory.getManagedRepositoryContent( REPOSITORY_ID ), content, 2 );
+        auditLogsDaoControl.expectAndReturn( auditLogsDao.saveAuditLogs( new ArchivaAuditLogs() ), null, 2 );
     
         archivaConfigControl.replay();
         repoFactoryControl.replay();
+        auditLogsDaoControl.replay();
     
         String returnString = uploadAction.doUpload();
         assertEquals( Action.SUCCESS, returnString );
@@ -523,6 +559,7 @@
         
         archivaConfigControl.verify();
         repoFactoryControl.verify();
+        auditLogsDaoControl.verify();
     
         String repoLocation = config.findManagedRepositoryById( REPOSITORY_ID ).getLocation();
         assertAllArtifactsIncludingSupportArtifactsArePresent( repoLocation );

Modified: archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/DisableProxyConnectorActionTest.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/DisableProxyConnectorActionTest.java?rev=897892&r1=897891&r2=897892&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/DisableProxyConnectorActionTest.java (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/DisableProxyConnectorActionTest.java Mon Jan 11 15:07:00 2010
@@ -40,7 +40,7 @@
     private MockControl archivaConfigurationControl;
 
     private ArchivaConfiguration archivaConfiguration;
-
+    
     public void testConfirmDisableBadSourceOrTarget()
         throws Exception
     {

Modified: archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/AddManagedRepositoryActionTest.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/AddManagedRepositoryActionTest.java?rev=897892&r1=897891&r2=897892&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/AddManagedRepositoryActionTest.java (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/AddManagedRepositoryActionTest.java Mon Jan 11 15:07:00 2010
@@ -24,6 +24,8 @@
 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.ArchivaAuditLogs;
 import org.apache.maven.archiva.security.ArchivaRoleConstants;
 import org.codehaus.plexus.redback.role.RoleManager;
 import org.codehaus.redback.integration.interceptor.SecureActionBundle;
@@ -51,6 +53,10 @@
     private MockControl archivaConfigurationControl;
 
     private ArchivaConfiguration archivaConfiguration;
+    
+    private ArchivaAuditLogsDao auditLogsDao;
+
+    private MockControl auditLogsDaoControl;
 
     private static final String REPO_ID = "repo-ident";
 
@@ -74,6 +80,11 @@
         archivaConfiguration = (ArchivaConfiguration) archivaConfigurationControl.getMock();
         action.setArchivaConfiguration( archivaConfiguration );
 
+        auditLogsDaoControl = MockControl.createControl( ArchivaAuditLogsDao.class );
+        auditLogsDaoControl.setDefaultMatcher( MockControl.ALWAYS_MATCHER );
+        auditLogsDao = (ArchivaAuditLogsDao) auditLogsDaoControl.getMock();
+        action.setAuditLogsDao( auditLogsDao );
+        
         roleManagerControl = MockControl.createControl( RoleManager.class );
         roleManager = (RoleManager) roleManagerControl.getMock();
         action.setRoleManager( roleManager );
@@ -148,15 +159,18 @@
         ManagedRepositoryConfiguration repository = action.getRepository();
         populateRepository( repository );
 
+        auditLogsDaoControl.expectAndReturn( auditLogsDao.saveAuditLogs( new ArchivaAuditLogs() ), null );
+        auditLogsDaoControl.replay();
+        
         assertFalse( location.exists() );
         String status = action.commit();
         assertEquals( Action.SUCCESS, status );
-        assertTrue( location.exists() );
-
+        assertTrue( location.exists() );        
         assertEquals( Collections.singletonList( repository ), configuration.getManagedRepositories() );
 
         roleManagerControl.verify();
         archivaConfigurationControl.verify();
+        auditLogsDaoControl.verify();
     }
     
     

Added: archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/ArchivaAuditLogsDaoStub.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/ArchivaAuditLogsDaoStub.java?rev=897892&view=auto
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/ArchivaAuditLogsDaoStub.java (added)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/ArchivaAuditLogsDaoStub.java Mon Jan 11 15:07:00 2010
@@ -0,0 +1,34 @@
+package org.apache.maven.archiva.web.action.admin.repositories;
+
+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;
+
+public class ArchivaAuditLogsDaoStub
+    implements ArchivaAuditLogsDao
+{
+
+    public void deleteAuditLogs( ArchivaAuditLogs logs )
+        throws ArchivaDatabaseException
+    {
+        // TODO Auto-generated method stub
+    }
+
+    public List<ArchivaAuditLogs> queryAuditLogs( Constraint constraint )
+        throws ObjectNotFoundException, ArchivaDatabaseException
+    {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public ArchivaAuditLogs saveAuditLogs( ArchivaAuditLogs logs )
+    {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+}

Modified: archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/DeleteManagedRepositoryActionTest.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/DeleteManagedRepositoryActionTest.java?rev=897892&r1=897891&r2=897892&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/DeleteManagedRepositoryActionTest.java (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/DeleteManagedRepositoryActionTest.java Mon Jan 11 15:07:00 2010
@@ -27,6 +27,8 @@
 import org.apache.maven.archiva.configuration.ProxyConnectorConfiguration;
 import org.apache.maven.archiva.configuration.RemoteRepositoryConfiguration;
 import org.apache.maven.archiva.configuration.RepositoryGroupConfiguration;
+import org.apache.maven.archiva.database.ArchivaAuditLogsDao;
+import org.apache.maven.archiva.model.ArchivaAuditLogs;
 import org.apache.maven.archiva.model.ArchivaProjectModel;
 import org.apache.maven.archiva.security.ArchivaRoleConstants;
 import org.codehaus.plexus.redback.role.RoleManager;
@@ -60,6 +62,10 @@
 
     private ArchivaConfiguration archivaConfiguration;
     
+    private ArchivaAuditLogsDao auditLogsDao;
+
+    private MockControl auditLogsDaoControl;
+    
     private static final String REPO_ID = "repo-ident";
 
     private File location;
@@ -80,6 +86,11 @@
         archivaConfigurationControl = MockControl.createControl( ArchivaConfiguration.class );
         archivaConfiguration = (ArchivaConfiguration) archivaConfigurationControl.getMock();
         action.setArchivaConfiguration( archivaConfiguration );
+        
+        auditLogsDaoControl = MockControl.createControl( ArchivaAuditLogsDao.class );
+        auditLogsDaoControl.setDefaultMatcher( MockControl.ALWAYS_MATCHER );
+        auditLogsDao = (ArchivaAuditLogsDao) auditLogsDaoControl.getMock();
+        action.setAuditLogsDao( auditLogsDao );
 
         roleManagerControl = MockControl.createControl( RoleManager.class );
         roleManager = (RoleManager) roleManagerControl.getMock();
@@ -117,9 +128,10 @@
         ManagedRepositoryConfiguration repository = action.getRepository();
         assertNotNull( repository );
         assertRepositoryEquals( repository, createRepository() );
-
+        
         String status = action.execute();
         assertEquals( Action.SUCCESS, status );
+                
         repository = action.getRepository();
         assertRepositoryEquals( repository, createRepository() );
         assertEquals( Collections.singletonList( originalRepository ), configuration.getManagedRepositories() );
@@ -132,8 +144,13 @@
         
         Configuration configuration = prepDeletionTest( createRepository(), 4 );                
         
+        auditLogsDaoControl.expectAndReturn( auditLogsDao.saveAuditLogs( new ArchivaAuditLogs() ), null );
+        auditLogsDaoControl.replay();
+        
         String status = action.deleteEntry();        
                 
+        auditLogsDaoControl.verify();
+        
         assertEquals( Action.SUCCESS, status );
 
         assertTrue( configuration.getManagedRepositories().isEmpty() );
@@ -148,7 +165,12 @@
         
         Configuration configuration = prepDeletionTest( createRepository(), 4 );              
         
+        auditLogsDaoControl.expectAndReturn( auditLogsDao.saveAuditLogs( new ArchivaAuditLogs() ), null );
+        auditLogsDaoControl.replay();
+        
         String status = action.deleteContents();
+        
+        auditLogsDaoControl.verify();
                
         assertEquals( Action.SUCCESS, status );
 
@@ -169,7 +191,12 @@
 
         assertEquals( 1, configuration.getProxyConnectors().size() );
         
+        auditLogsDaoControl.expectAndReturn( auditLogsDao.saveAuditLogs( new ArchivaAuditLogs() ), null );
+        auditLogsDaoControl.replay();
+        
         String status = action.deleteContents();
+        
+        auditLogsDaoControl.verify();
         assertEquals( Action.SUCCESS, status );
 
         assertTrue( configuration.getManagedRepositories().isEmpty() );
@@ -183,6 +210,7 @@
     {
         ManagedRepositoryConfiguration originalRepository = createRepository();
         Configuration configuration = prepDeletionTest( originalRepository, 3 );
+                
         String status = action.execute();
         assertEquals( Action.SUCCESS, status );
 
@@ -205,8 +233,12 @@
 
         assertEquals( 1, configuration.getRepositoryGroups().size() );
         
+        auditLogsDaoControl.expectAndReturn( auditLogsDao.saveAuditLogs( new ArchivaAuditLogs() ), null );
+        auditLogsDaoControl.replay();
+        
         String status = action.deleteContents();
         assertEquals( Action.SUCCESS, status );
+        auditLogsDaoControl.verify();
 
         assertTrue( configuration.getManagedRepositories().isEmpty() );
         assertEquals( 0, ( ( RepositoryGroupConfiguration ) configuration.getRepositoryGroups().get( 0 ) ).getRepositories().size() );