From 3078e1af860b8ab78ff042d628505317c428899e Mon Sep 17 00:00:00 2001 From: "Maria Odea B. Ching" Date: Tue, 15 Dec 2009 14:52:41 +0000 Subject: [PATCH] [MRM-1296] Audit Log Report o added selenium test for viewing audit log reports o fixed bu when querying log using artifactId git-svn-id: https://svn.apache.org/repos/asf/archiva/branches/MRM-1296@890811 13f79535-47bb-0310-9956-ffa450edef68 --- .../ArchivaAuditLogsConstraint.java | 2 +- .../src/test/testng/config/testng.xml | 1 + .../archiva/web/test/AuditLogsReportTest.java | 120 +++++++++++++ .../archiva/web/test/RepositoryTest.java | 3 +- .../web/test/VirtualRepositoryTest.java | 5 +- .../web/test/parent/AbstractArchivaTest.java | 3 +- .../reports/ViewAuditLogReportAction.java | 167 ++++++++++++------ .../webapp/WEB-INF/jsp/decorators/default.jsp | 2 +- .../WEB-INF/jsp/reports/auditLogReport.jsp | 31 ++-- 9 files changed, 266 insertions(+), 68 deletions(-) create mode 100644 archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/AuditLogsReportTest.java diff --git a/archiva-modules/archiva-database/src/main/java/org/apache/maven/archiva/database/constraints/ArchivaAuditLogsConstraint.java b/archiva-modules/archiva-database/src/main/java/org/apache/maven/archiva/database/constraints/ArchivaAuditLogsConstraint.java index a9c798f1f..7eed42817 100644 --- a/archiva-modules/archiva-database/src/main/java/org/apache/maven/archiva/database/constraints/ArchivaAuditLogsConstraint.java +++ b/archiva-modules/archiva-database/src/main/java/org/apache/maven/archiva/database/constraints/ArchivaAuditLogsConstraint.java @@ -49,7 +49,7 @@ public class ArchivaAuditLogsConstraint { whereClause = whereClause + " && artifact.like(desiredArtifact)"; declParamsList.add( "String desiredArtifact" ); - paramsList.add( desiredArtifact + "%" ); + paramsList.add( desiredArtifact ); } if ( desiredRepositoryId != null && !"".equals( desiredRepositoryId ) ) diff --git a/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/config/testng.xml b/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/config/testng.xml index c107bda61..e8607fb3b 100644 --- a/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/config/testng.xml +++ b/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/config/testng.xml @@ -33,6 +33,7 @@ under the License. + diff --git a/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/AuditLogsReportTest.java b/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/AuditLogsReportTest.java new file mode 100644 index 000000000..2857cf7cf --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/AuditLogsReportTest.java @@ -0,0 +1,120 @@ +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(); + } + + @Test(dependsOnMethods = { "testWithCorrectUsernamePassword" } ) + public void testViewAuditLogsNoDataFound() + { + goToAuditLogReports(); + assertAuditLogsReportPage(); + + setFieldValue( "groupId", "non.existing" ); + submit(); + + assertPage( "Apache Archiva \\ Audit Log Report" ); + assertTextPresent( "No audit logs found." ); + } + + @Test (dependsOnMethods = { "testAddArtifactValidValues" } ) + public void testViewAuditLogsDataFound() + { + goToAuditLogReports(); + assertAuditLogsReportPage(); + + selectValue( "repository", "internal" ); + setFieldValue( "groupId", "test" ); + submit(); + + assertAuditLogsReportPage(); + assertTextNotPresent( "No audit logs found." ); + assertTextPresent( "test:test:1.0" ); + assertTextPresent( "Uploaded File" ); + assertTextPresent( "internal" ); + assertTextPresent( "admin" ); + } + + @Test (dependsOnMethods = { "testViewAuditLogsDataFound" } ) + public void testViewAuditLogsOnlyArtifactIdIsSpecified() + { + goToAuditLogReports(); + assertAuditLogsReportPage(); + + selectValue( "repository", "internal" ); + setFieldValue( "artifactId", "test" ); + submit(); + + assertAuditLogsReportPage(); + assertTextNotPresent( "No audit logs found." ); + assertTextPresent( "test:test:1.0" ); + assertTextPresent( "Uploaded File" ); + assertTextPresent( "internal" ); + assertTextPresent( "admin" ); + } + + @Test (dependsOnMethods = { "testViewAuditLogsOnlyArtifactIdIsSpecified" } ) + public void testViewAuditLogsForAllRepositories() + { + goToAuditLogReports(); + assertAuditLogsReportPage(); + + selectValue( "repository", "all" ); + submit(); + + assertAuditLogsReportPage(); + assertTextNotPresent( "No audit logs found." ); + assertTextPresent( "test:test:1.0" ); + assertTextPresent( "Uploaded File" ); + assertTextPresent( "internal" ); + assertTextPresent( "admin" ); + } +} diff --git a/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/RepositoryTest.java b/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/RepositoryTest.java index e23e6bf93..7b2eff95d 100644 --- a/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/RepositoryTest.java +++ b/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/RepositoryTest.java @@ -39,8 +39,7 @@ public class RepositoryTest @Test(dependsOnMethods = { "testAddManagedRepoValidValues" } ) public void testAddManagedRepoInvalidValues() - { - goToRepositoriesPage(); + { assertRepositoriesPage(); clickLinkWithLocator( "//div[@id='contentArea']/div/div/a[@href='/archiva/admin/addRepository.action']" ); addManagedRepository( "", "" , "" , "", "Maven 2.x Repository", "", "", "" ); diff --git a/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/VirtualRepositoryTest.java b/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/VirtualRepositoryTest.java index 081320fb8..d06e12481 100644 --- a/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/VirtualRepositoryTest.java +++ b/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/VirtualRepositoryTest.java @@ -51,9 +51,8 @@ public class VirtualRepositoryTest @Test(dependsOnMethods = { "testAddRepositoryToRepositoryGroup" } ) public void testDeleteRepositoryOfRepositoryGroup() - { - goToRepositoryGroupsPage(); - deleteRepositoryInRepositoryGroups(); + { + deleteRepositoryInRepositoryGroups(); assertTextPresent( "Repository Groups" ); assertTextNotPresent( "No Repository Groups Defined." ); waitPage(); diff --git a/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/parent/AbstractArchivaTest.java b/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/parent/AbstractArchivaTest.java index 95e2fa853..c5222e994 100644 --- a/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/parent/AbstractArchivaTest.java +++ b/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/parent/AbstractArchivaTest.java @@ -394,12 +394,13 @@ public abstract class AbstractArchivaTest assertLinkPresent( "Browse" ); assertLinkPresent( "Upload Artifact" ); assertLinkPresent( "Delete Artifact" ); + assertLinkPresent( "Audit Log Report" ); assertLinkNotPresent( "Repositories" ); } else { assertTextPresent( "Search" ); - String navMenu = "Find Artifact,Browse,Reports,User Management,User Roles,Appearance,Upload Artifact,Delete Artifact,Repository Groups,Repositories,Proxy Connectors,Legacy Support,Network Proxies,Repository Scanning,Database"; + String navMenu = "Find Artifact,Browse,Reports,Audit Log Report,User Management,User Roles,Appearance,Upload Artifact,Delete Artifact,Repository Groups,Repositories,Proxy Connectors,Legacy Support,Network Proxies,Repository Scanning,Database"; String[] arrayMenu = navMenu.split( "," ); for (String navmenu : arrayMenu ) assertLinkPresent( navmenu ); diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/reports/ViewAuditLogReportAction.java b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/reports/ViewAuditLogReportAction.java index ea9d9c411..24a8ed197 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/reports/ViewAuditLogReportAction.java +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/reports/ViewAuditLogReportAction.java @@ -24,6 +24,7 @@ import java.util.Calendar; import java.util.Collections; import java.util.Date; import java.util.List; +import java.util.regex.Pattern; import javax.servlet.http.HttpServletRequest; @@ -49,140 +50,176 @@ 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" + * @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 repositories; - + private String groupId; - + private String artifactId; - + private Date startDate; private Date endDate; - + private int rowCount = 30; - + private int page = 1; - private List auditLogs; - + private String prev; + + private String next; + + protected boolean isLastPage = true; + + private List auditLogs; + private static final String ALL_REPOSITORIES = "all"; - + protected int[] range = new int[2]; - + 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(); repositories.add( ALL_REPOSITORIES ); repositories.addAll( getObservableRepositories() ); - + auditLogs = null; - - SimpleConstraint constraint = new MostRecentArchivaAuditLogsConstraint(); + groupId = ""; + artifactId = ""; + repository = ""; + + SimpleConstraint constraint = new MostRecentArchivaAuditLogsConstraint(); auditLogs = (List) dao.query( constraint ); } - + public String execute() throws Exception - { + { auditLogs = null; String artifact = ""; - if( groupId != null || !"".equals( groupId.trim() ) ) + if ( groupId != null && !"".equals( groupId.trim() ) ) { - artifact = groupId; - } - - if( artifactId != null || !"".equals( artifactId.trim() ) ) - { - artifact = artifact + ":" + artifactId; + artifact = groupId + ( ( artifactId != null && !"".equals( artifactId.trim() ) ) ? ( ":" + artifactId + ":%" ) : ":%" ); } + else + { + artifact = ( artifactId != null && !"".equals( artifactId.trim() ) ) ? ( "%:" + artifactId + ":%" ) : ""; + } - if( startDate == null ) + if ( startDate == null ) { Calendar cal = Calendar.getInstance(); cal.set( Calendar.HOUR, 0 ); cal.set( Calendar.MINUTE, 0 ); - cal.set( Calendar.SECOND, 0 ); - - startDate = cal.getTime(); + cal.set( Calendar.SECOND, 0 ); + + startDate = cal.getTime(); } - - if( startDate.equals( endDate ) || endDate == null ) + + if ( startDate.equals( endDate ) || endDate == null ) { endDate = Calendar.getInstance().getTime(); } - + range[0] = ( page - 1 ) * rowCount; - range[1] = ( page * rowCount ) + 1; + range[1] = ( page * rowCount ) + 1; ArchivaAuditLogsConstraint constraint = null; - if( !repository.equals( ALL_REPOSITORIES ) ) + if ( !repository.equals( ALL_REPOSITORIES ) ) { - constraint = new ArchivaAuditLogsConstraint( range, artifact, repository, AuditEvent.UPLOAD_FILE, startDate, endDate ); + constraint = + new ArchivaAuditLogsConstraint( range, artifact, repository, AuditEvent.UPLOAD_FILE, startDate, endDate ); } else { - constraint = new ArchivaAuditLogsConstraint( range, artifact, null, AuditEvent.UPLOAD_FILE, startDate, endDate ); + constraint = + new ArchivaAuditLogsConstraint( range, artifact, null, AuditEvent.UPLOAD_FILE, startDate, endDate ); } - + try { auditLogs = auditLogsDao.queryAuditLogs( constraint ); - startDate = null; - endDate = null; + if( auditLogs.isEmpty() ) + { + addActionError( "No audit logs found." ); + } } catch ( ObjectNotFoundException e ) { addActionError( "No audit logs found." ); return ERROR; } - catch( ArchivaDatabaseException e ) + catch ( ArchivaDatabaseException e ) { addActionError( "Error occurred while querying audit logs." ); return ERROR; } + // pagination + paginate(); + + startDate = null; + endDate = null; + return SUCCESS; } - + + private void paginate() + { + if ( auditLogs.size() <= rowCount ) + { + isLastPage = true; + } + + prev = + request.getRequestURL() + "?page=" + ( page - 1 ) + "&rowCount=" + rowCount + "&groupId=" + groupId + + "&artifactId=" + artifactId + "&repositoryId=" + repository + "&startDate=" + startDate + "&endDate=" + + endDate; + next = + request.getRequestURL() + "?page=" + ( page + 1 ) + "&rowCount=" + rowCount + "&groupId=" + groupId + + "&artifactId=" + artifactId + "&repositoryId=" + repository + "&startDate=" + startDate + "&endDate=" + + endDate; + } + private List getObservableRepositories() { try @@ -203,7 +240,7 @@ public class ViewAuditLogReportAction } return Collections.emptyList(); } - + public String getRepository() { return repository; @@ -243,7 +280,7 @@ public class ViewAuditLogReportAction { this.artifactId = artifactId; } - + public List getAuditLogs() { return auditLogs; @@ -263,7 +300,7 @@ public class ViewAuditLogReportAction { this.rowCount = rowCount; } - + public Date getStartDate() { return startDate; @@ -283,7 +320,7 @@ public class ViewAuditLogReportAction { this.endDate = endDate; } - + public int getPage() { return page; @@ -293,4 +330,34 @@ public class ViewAuditLogReportAction { this.page = page; } + + public boolean isLastPage() + { + return isLastPage; + } + + public void setLastPage( 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; + } } diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/decorators/default.jsp b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/decorators/default.jsp index 5e5dffa13..4dc48af6d 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/decorators/default.jsp +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/decorators/default.jsp @@ -90,7 +90,7 @@
  • - Audit Log Reports + Audit Log Report
  • diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/reports/auditLogReport.jsp b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/reports/auditLogReport.jsp index af853370b..ece7ca95c 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/reports/auditLogReport.jsp +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/reports/auditLogReport.jsp @@ -46,6 +46,10 @@ +

    + +

    +
    @@ -80,19 +84,26 @@ + + + << + Page: ${page} + + >> +
    - - - + + +
    - - - - - + + + + + @@ -106,8 +117,8 @@ -
    EventRepositoryArtifactEvent DateUsernameEventRepositoryArtifactEvent DateUsername
    -
    + + -- 2.39.5