You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@continuum.apache.org by ct...@apache.org on 2010/05/25 05:51:20 UTC
svn commit: r947907 [1/3] - in /continuum/trunk:
continuum-api/src/main/java/org/apache/continuum/dao/
continuum-api/src/main/java/org/apache/maven/continuum/
continuum-core/src/main/java/org/apache/maven/continuum/
continuum-data-management/data-manag...
Author: ctan
Date: Tue May 25 03:51:19 2010
New Revision: 947907
URL: http://svn.apache.org/viewvc?rev=947907&view=rev
Log:
[CONTINUUM-2521] added a builds report page
- search by date range, triggered by, build status
- paginated
- TODO: export to file, selectable fields to display
Added:
continuum/trunk/continuum-webapp-test/src/test/testng/org/apache/continuum/web/test/ReportTest.java
continuum/trunk/continuum-webapp/src/main/java/org/apache/continuum/web/action/ViewBuildsReportAction.java
continuum/trunk/continuum-webapp/src/main/webapp/WEB-INF/jsp/viewProjectBuildsReport.jsp
continuum/trunk/continuum-webapp/src/main/webapp/css/no-theme/
continuum/trunk/continuum-webapp/src/main/webapp/css/no-theme/jquery-ui-1.7.2.custom.css
continuum/trunk/continuum-webapp/src/main/webapp/js/jquery-1.3.2.min.js
continuum/trunk/continuum-webapp/src/main/webapp/js/jquery-ui-1.7.2.custom.min.js
continuum/trunk/continuum-webapp/src/test/java/org/apache/continuum/web/action/ViewBuildsReportActionTest.java
continuum/trunk/continuum-webapp/src/test/java/org/apache/continuum/web/action/stub/ViewBuildsReportActionStub.java
Modified:
continuum/trunk/continuum-api/src/main/java/org/apache/continuum/dao/BuildResultDao.java
continuum/trunk/continuum-api/src/main/java/org/apache/maven/continuum/Continuum.java
continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/DefaultContinuum.java
continuum/trunk/continuum-data-management/data-management-jdo/src/test/resources/expected.xml
continuum/trunk/continuum-security/src/main/java/org/apache/maven/continuum/security/ContinuumRoleConstants.java
continuum/trunk/continuum-security/src/main/resources/META-INF/redback/redback.xml
continuum/trunk/continuum-store/src/main/java/org/apache/continuum/dao/BuildResultDaoImpl.java
continuum/trunk/continuum-store/src/test/java/org/apache/maven/continuum/store/AbstractContinuumStoreTestCase.java
continuum/trunk/continuum-store/src/test/java/org/apache/maven/continuum/store/ContinuumStoreTest.java
continuum/trunk/continuum-webapp-test/src/test/testng/config/testng.xml
continuum/trunk/continuum-webapp-test/src/test/testng/org/apache/continuum/web/test/parent/AbstractContinuumTest.java
continuum/trunk/continuum-webapp/pom.xml
continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/ContinuumActionSupport.java
continuum/trunk/continuum-webapp/src/main/mdo/view-models.mdo
continuum/trunk/continuum-webapp/src/main/resources/localization/Continuum.properties
continuum/trunk/continuum-webapp/src/main/resources/struts.xml
continuum/trunk/continuum-webapp/src/main/webapp/WEB-INF/jsp/navigations/Menu.jsp
Modified: continuum/trunk/continuum-api/src/main/java/org/apache/continuum/dao/BuildResultDao.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-api/src/main/java/org/apache/continuum/dao/BuildResultDao.java?rev=947907&r1=947906&r2=947907&view=diff
==============================================================================
--- continuum/trunk/continuum-api/src/main/java/org/apache/continuum/dao/BuildResultDao.java (original)
+++ continuum/trunk/continuum-api/src/main/java/org/apache/continuum/dao/BuildResultDao.java Tue May 25 03:51:19 2010
@@ -100,4 +100,6 @@ public interface BuildResultDao
long endIndex );
List<BuildResult> getAllBuildsForAProjectByDate( int projectId );
+
+ List<BuildResult> getBuildResultsInRange( long fromDate, long toDate, int state, String triggeredBy );
}
Modified: continuum/trunk/continuum-api/src/main/java/org/apache/maven/continuum/Continuum.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-api/src/main/java/org/apache/maven/continuum/Continuum.java?rev=947907&r1=947906&r2=947907&view=diff
==============================================================================
--- continuum/trunk/continuum-api/src/main/java/org/apache/maven/continuum/Continuum.java (original)
+++ continuum/trunk/continuum-api/src/main/java/org/apache/maven/continuum/Continuum.java Tue May 25 03:51:19 2010
@@ -210,6 +210,8 @@ public interface Continuum
void removeBuildResult( int buildId )
throws ContinuumException;
+ List<BuildResult> getBuildResultsInRange( long fromDate, long toDate, int state, String triggeredBy );
+
// ----------------------------------------------------------------------
// Projects
// ----------------------------------------------------------------------
Modified: continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/DefaultContinuum.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/DefaultContinuum.java?rev=947907&r1=947906&r2=947907&view=diff
==============================================================================
--- continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/DefaultContinuum.java (original)
+++ continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/DefaultContinuum.java Tue May 25 03:51:19 2010
@@ -101,6 +101,7 @@ import org.springframework.beans.BeanUti
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
+import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -586,6 +587,11 @@ public class DefaultContinuum
return ( builds.isEmpty() ? null : builds.get( 0 ) );
}
+ public List<BuildResult> getBuildResultsInRange( long fromDate, long toDate, int state, String triggeredBy )
+ {
+ return buildResultDao.getBuildResultsInRange( fromDate, toDate, state, triggeredBy );
+ }
+
// ----------------------------------------------------------------------
//
// ----------------------------------------------------------------------
Modified: continuum/trunk/continuum-data-management/data-management-jdo/src/test/resources/expected.xml
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-data-management/data-management-jdo/src/test/resources/expected.xml?rev=947907&r1=947906&r2=947907&view=diff
==============================================================================
--- continuum/trunk/continuum-data-management/data-management-jdo/src/test/resources/expected.xml (original)
+++ continuum/trunk/continuum-data-management/data-management-jdo/src/test/resources/expected.xml Tue May 25 03:51:19 2010
@@ -23,7 +23,8 @@
<project id="1"></project>
<id>1</id>
<buildNumber>1</buildNumber>
- <state>1</state>
+ <username>user</username>
+ <state>2</state>
<trigger>1</trigger>
<startTime>1239794961904</startTime>
<endTime>1239794962904</endTime>
@@ -80,7 +81,8 @@
<project id="1"></project>
<id>2</id>
<buildNumber>2</buildNumber>
- <state>2</state>
+ <username>schedule</username>
+ <state>3</state>
<trigger>2</trigger>
<startTime>1239794963904</startTime>
<endTime>1239794964904</endTime>
@@ -200,8 +202,9 @@
<project id="2"></project>
<id>3</id>
<buildNumber>3</buildNumber>
- <state>3</state>
- <trigger>3</trigger>
+ <username>schedule</username>
+ <state>2</state>
+ <trigger>2</trigger>
<startTime>1239794965904</startTime>
<endTime>1239794966904</endTime>
<error>error3</error>
Modified: continuum/trunk/continuum-security/src/main/java/org/apache/maven/continuum/security/ContinuumRoleConstants.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-security/src/main/java/org/apache/maven/continuum/security/ContinuumRoleConstants.java?rev=947907&r1=947906&r2=947907&view=diff
==============================================================================
--- continuum/trunk/continuum-security/src/main/java/org/apache/maven/continuum/security/ContinuumRoleConstants.java (original)
+++ continuum/trunk/continuum-security/src/main/java/org/apache/maven/continuum/security/ContinuumRoleConstants.java Tue May 25 03:51:19 2010
@@ -127,4 +127,6 @@ public class ContinuumRoleConstants
public static final String CONTINUUM_VIEW_RELEASE = "continuum-view-release";
public static final String CONTINUUM_MANAGE_PARALLEL_BUILDS = "continuum-manage-parallel-builds";
+
+ public static final String CONTINUUM_VIEW_REPORT = "continuum-view-report";
}
Modified: continuum/trunk/continuum-security/src/main/resources/META-INF/redback/redback.xml
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-security/src/main/resources/META-INF/redback/redback.xml?rev=947907&r1=947906&r2=947907&view=diff
==============================================================================
--- continuum/trunk/continuum-security/src/main/resources/META-INF/redback/redback.xml (original)
+++ continuum/trunk/continuum-security/src/main/resources/META-INF/redback/redback.xml Tue May 25 03:51:19 2010
@@ -200,6 +200,11 @@
<name>continuum-manage-parallel-builds</name>
<description>Continuum Manage Parallel Builds</description>
</operation>
+ <operation>
+ <id>continuum-view-report</id>
+ <name>continuum-view-report</name>
+ <description>Continuum View Report</description>
+ </operation>
</operations>
<roles>
<role>
@@ -616,6 +621,12 @@
<operation>continuum-view-queues</operation>
<resource>global</resource>
</permission>
+ <permission>
+ <id>continuum-view-report</id>
+ <name>Continuum View Report</name>
+ <operation>continuum-view-report</operation>
+ <resource>global</resource>
+ </permission>
</permissions>
<parentRoles>
<parentRole>continuum-group-project-user</parentRole>
Modified: continuum/trunk/continuum-store/src/main/java/org/apache/continuum/dao/BuildResultDaoImpl.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-store/src/main/java/org/apache/continuum/dao/BuildResultDaoImpl.java?rev=947907&r1=947906&r2=947907&view=diff
==============================================================================
--- continuum/trunk/continuum-store/src/main/java/org/apache/continuum/dao/BuildResultDaoImpl.java (original)
+++ continuum/trunk/continuum-store/src/main/java/org/apache/continuum/dao/BuildResultDaoImpl.java Tue May 25 03:51:19 2010
@@ -748,4 +748,83 @@ public class BuildResultDaoImpl
return null;
}
+
+ @SuppressWarnings( "unchecked" )
+ public List<BuildResult> getBuildResultsInRange( long fromDate, long toDate, int state, String triggeredBy )
+ {
+ PersistenceManager pm = getPersistenceManager();
+
+ Transaction tx = pm.currentTransaction();
+
+ try
+ {
+ tx.begin();
+
+ pm.getFetchPlan().addGroup( BUILD_RESULT_WITH_DETAILS_FETCH_GROUP );
+
+ Extent extent = pm.getExtent( BuildResult.class, true );
+
+ Query query = pm.newQuery( extent );
+
+ String parameters = "";
+ String filter = "";
+
+ Map params = new HashMap();
+
+ int ctr = 0;
+ if ( state > 0 )
+ {
+ params.put( "state", state );
+ ctr++;
+ parameters += "int state, ";
+ filter += "this.state == state && ";
+ }
+
+ if ( triggeredBy != null && !triggeredBy.equals( "" ) )
+ {
+ params.put( "triggeredBy", triggeredBy );
+ ctr++;
+ query.declareImports( "import java.lang.String" );
+ parameters += "String triggeredBy, ";
+ filter += "this.username == triggeredBy && ";
+ }
+
+ if ( fromDate > 0 )
+ {
+ params.put( "fromDate", fromDate );
+ ctr++;
+ parameters += "long fromDate, ";
+ filter += "this.startTime >= fromDate && ";
+ }
+
+ if ( toDate > 0 )
+ {
+ params.put( "toDate", toDate );
+ ctr++;
+ parameters += "long toDate";
+ filter += "this.startTime <= toDate";
+ }
+
+ if ( filter.endsWith( "&& " ) )
+ {
+ filter = filter.substring( 0, filter.length() - 3 );
+ parameters = parameters.substring( 0, parameters.length() - 2 );
+ }
+
+ query.declareParameters( parameters );
+ query.setFilter( filter );
+
+ List<BuildResult> result = (List<BuildResult>) query.executeWithMap( params );
+
+ result = (List<BuildResult>) pm.detachCopyAll( result );
+
+ tx.commit();
+
+ return result;
+ }
+ finally
+ {
+ rollback( tx );
+ }
+ }
}
Modified: continuum/trunk/continuum-store/src/test/java/org/apache/maven/continuum/store/AbstractContinuumStoreTestCase.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-store/src/test/java/org/apache/maven/continuum/store/AbstractContinuumStoreTestCase.java?rev=947907&r1=947906&r2=947907&view=diff
==============================================================================
--- continuum/trunk/continuum-store/src/test/java/org/apache/maven/continuum/store/AbstractContinuumStoreTestCase.java (original)
+++ continuum/trunk/continuum-store/src/test/java/org/apache/maven/continuum/store/AbstractContinuumStoreTestCase.java Tue May 25 03:51:19 2010
@@ -161,6 +161,8 @@ public abstract class AbstractContinuumS
protected BuildQueue testBuildQueue3;
+ protected long baseTime;
+
private SystemConfiguration systemConfiguration;
@Override
@@ -343,8 +345,10 @@ public abstract class AbstractContinuumS
ProjectDependency testDependency3 = createTestDependency( "groupId3", "artifactId3", "version3" );
// TODO: simplify by deep copying the relationships in createTest... ?
- long baseTime = System.currentTimeMillis();
- testBuildResult1 = createTestBuildResult( 1, true, 1, 1, "error1", 1, baseTime, baseTime + 1000 );
+ baseTime = System.currentTimeMillis();
+
+ // successful forced build
+ testBuildResult1 = createTestBuildResult( 1, true, 2, 1, "error1", 1, baseTime, baseTime + 1000, "user" );
BuildResult buildResult1 = createTestBuildResult( testBuildResult1 );
ScmResult scmResult = createTestScmResult( "commandOutput1", "providerMessage1", true, "1" );
buildResult1.setScmResult( scmResult );
@@ -355,11 +359,13 @@ public abstract class AbstractContinuumS
testProject1.setCheckoutResult( checkoutResult1 );
testProject1.addBuildResult( buildResult1 );
- testBuildResult2 = createTestBuildResult( 2, false, 2, 2, "error2", 2, baseTime + 2000, baseTime + 3000 );
+ // failed scheduled build
+ testBuildResult2 = createTestBuildResult( 2, false, 3, 2, "error2", 2, baseTime + 2000, baseTime + 3000, "schedule" );
BuildResult buildResult2 = createTestBuildResult( testBuildResult2 );
testProject1.addBuildResult( buildResult2 );
- testBuildResult3 = createTestBuildResult( 3, true, 3, 3, "error3", 3, baseTime + 4000, baseTime + 5000 );
+ // successful scheduled build
+ testBuildResult3 = createTestBuildResult( 2, true, 2, 3, "error3", 3, baseTime + 4000, baseTime + 5000, "schedule" );
BuildResult buildResult3 = createTestBuildResult( testBuildResult3 );
scmResult = createTestScmResult( "commandOutput3", "providerMessage3", true, "3" );
buildResult3.setScmResult( scmResult );
@@ -1090,11 +1096,11 @@ public abstract class AbstractContinuumS
{
return createTestBuildResult( buildResult.getTrigger(), buildResult.isSuccess(), buildResult.getState(),
buildResult.getExitCode(), buildResult.getError(), buildResult.getBuildNumber(),
- buildResult.getStartTime(), buildResult.getEndTime() );
+ buildResult.getStartTime(), buildResult.getEndTime(), buildResult.getUsername() );
}
private static BuildResult createTestBuildResult( int trigger, boolean success, int state, int exitCode,
- String error, int buildNumber, long startTime, long endTime )
+ String error, int buildNumber, long startTime, long endTime, String triggeredBy )
{
BuildResult result = new BuildResult();
result.setBuildNumber( buildNumber );
@@ -1105,6 +1111,7 @@ public abstract class AbstractContinuumS
result.setState( state );
result.setSuccess( success );
result.setTrigger( trigger );
+ result.setUsername( triggeredBy );
return result;
}
Modified: continuum/trunk/continuum-store/src/test/java/org/apache/maven/continuum/store/ContinuumStoreTest.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-store/src/test/java/org/apache/maven/continuum/store/ContinuumStoreTest.java?rev=947907&r1=947906&r2=947907&view=diff
==============================================================================
--- continuum/trunk/continuum-store/src/test/java/org/apache/maven/continuum/store/ContinuumStoreTest.java (original)
+++ continuum/trunk/continuum-store/src/test/java/org/apache/maven/continuum/store/ContinuumStoreTest.java Tue May 25 03:51:19 2010
@@ -1399,6 +1399,33 @@ public class ContinuumStoreTest
}
+ public void testGetBuildResultsInRange()
+ throws Exception
+ {
+ List<BuildResult> results = buildResultDao.getBuildResultsInRange( 0, 0, 0, null );
+ assertEquals( "check number of build results returned", 3, results.size() );
+
+ results = buildResultDao.getBuildResultsInRange( 0, 0, 2, null );
+ assertEquals( "check number of build results returned with state == OK", 2, results.size() );
+
+ results = buildResultDao.getBuildResultsInRange( 0, 0, 0, "user" );
+ assertEquals( "check number of build results returned with triggeredBy == user", 1, results.size() );
+
+ results = buildResultDao.getBuildResultsInRange( 0, 0, 0, "schedule" );
+ assertEquals( "check number of build results returned with triggeredBy == schedule", 2, results.size() );
+
+ results = buildResultDao.getBuildResultsInRange( 0, 0, 2, "schedule" );
+ assertEquals( "check number of build results returned with state == Ok and triggeredBy == schedule", 1, results.size() );
+
+ results = buildResultDao.getBuildResultsInRange( 0, 0, 3, "user" );
+ assertEquals( "check number of build results returned with state == Failed and triggeredBy == user", 0, results.size() );
+
+ results = buildResultDao.getBuildResultsInRange( baseTime, baseTime + 2000, 0, null );
+ assertEquals( "check number of build results returned with startDate and endDate", 2, results.size() );
+
+ results = buildResultDao.getBuildResultsInRange( baseTime, baseTime, 0, null );
+ assertEquals( "check number of build results returned with the same startDate and endDate", 1, results.size() );
+ }
// ----------------------------------------------------------------------
// HELPER METHODS
// ----------------------------------------------------------------------
Modified: continuum/trunk/continuum-webapp-test/src/test/testng/config/testng.xml
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-webapp-test/src/test/testng/config/testng.xml?rev=947907&r1=947906&r2=947907&view=diff
==============================================================================
--- continuum/trunk/continuum-webapp-test/src/test/testng/config/testng.xml (original)
+++ continuum/trunk/continuum-webapp-test/src/test/testng/config/testng.xml Tue May 25 03:51:19 2010
@@ -49,6 +49,7 @@ under the License.
<include name="mavenOneProject" />
<include name="antProject"/>
<include name="shellProject"/>
+ <include name="report"/>
<include name="agent"/>
<include name="release"/>
<include name="buildDefinition" />
Added: continuum/trunk/continuum-webapp-test/src/test/testng/org/apache/continuum/web/test/ReportTest.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-webapp-test/src/test/testng/org/apache/continuum/web/test/ReportTest.java?rev=947907&view=auto
==============================================================================
--- continuum/trunk/continuum-webapp-test/src/test/testng/org/apache/continuum/web/test/ReportTest.java (added)
+++ continuum/trunk/continuum-webapp-test/src/test/testng/org/apache/continuum/web/test/ReportTest.java Tue May 25 03:51:19 2010
@@ -0,0 +1,38 @@
+package org.apache.continuum.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.continuum.web.test.parent.AbstractContinuumTest;
+import org.testng.annotations.Test;
+
+@Test( groups = { "report" }, dependsOnMethods = { "testWithCorrectUsernamePassword" } )
+public class ReportTest
+ extends AbstractContinuumTest
+{
+ @Test( dependsOnMethods = { "testProjectGroupAllBuildSuccess" } )
+ public void testViewBuildsReport()
+ throws Exception
+ {
+ goToProjectBuildsReport();
+ clickButtonWithValue( "View Report" );
+
+ assertProjectBuildReport();
+ }
+}
Modified: continuum/trunk/continuum-webapp-test/src/test/testng/org/apache/continuum/web/test/parent/AbstractContinuumTest.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-webapp-test/src/test/testng/org/apache/continuum/web/test/parent/AbstractContinuumTest.java?rev=947907&r1=947906&r2=947907&view=diff
==============================================================================
--- continuum/trunk/continuum-webapp-test/src/test/testng/org/apache/continuum/web/test/parent/AbstractContinuumTest.java (original)
+++ continuum/trunk/continuum-webapp-test/src/test/testng/org/apache/continuum/web/test/parent/AbstractContinuumTest.java Tue May 25 03:51:19 2010
@@ -1067,4 +1067,42 @@ public abstract class AbstractContinuumT
assertTextPresent("Build Agent Groups");
assertButtonWithValuePresent( "Add" );
}
+
+ // ////////////////////////////////////
+ // Reports
+ // ////////////////////////////////////
+
+ public void goToProjectBuildsReport()
+ {
+ clickLinkWithText( "Project Builds" );
+ assertViewBuildsReportPage();
+ }
+
+ public void assertViewBuildsReportPage()
+ {
+ assertPage( "Continuum - Project Builds Report" );
+ assertTextPresent( "Start Date" );
+ assertElementPresent( "startDate" );
+ assertTextPresent( "End Date" );
+ assertElementPresent( "endDate" );
+ assertTextPresent( "Triggered By" );
+ assertElementPresent( "triggeredBy" );
+ assertTextPresent( "Build Status" );
+ assertElementPresent( "buildStatus" );
+ assertTextPresent( "Row Count" );
+ assertElementPresent( "rowCount" );
+ assertButtonWithValuePresent( "View Report" );
+ assertTextPresent( "Results" );
+ }
+
+ public void assertProjectBuildReport()
+ {
+ assertTextPresent( "Project Group" );
+ assertTextPresent( "Project" );
+ assertTextPresent( "Build Date" );
+ assertTextPresent( "Triggered By" );
+ assertTextPresent( "Build Status" );
+ assertTextPresent( "Prev" );
+ assertTextPresent( "Next" );
+ }
}
Modified: continuum/trunk/continuum-webapp/pom.xml
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-webapp/pom.xml?rev=947907&r1=947906&r2=947907&view=diff
==============================================================================
--- continuum/trunk/continuum-webapp/pom.xml (original)
+++ continuum/trunk/continuum-webapp/pom.xml Tue May 25 03:51:19 2010
@@ -105,7 +105,7 @@ under the License.
<models>
<model>src/main/mdo/view-models.mdo</model>
</models>
- <version>1.0.0</version>
+ <version>1.4.1</version>
</configuration>
<goals>
<goal>java</goal>
Added: continuum/trunk/continuum-webapp/src/main/java/org/apache/continuum/web/action/ViewBuildsReportAction.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-webapp/src/main/java/org/apache/continuum/web/action/ViewBuildsReportAction.java?rev=947907&view=auto
==============================================================================
--- continuum/trunk/continuum-webapp/src/main/java/org/apache/continuum/web/action/ViewBuildsReportAction.java (added)
+++ continuum/trunk/continuum-webapp/src/main/java/org/apache/continuum/web/action/ViewBuildsReportAction.java Tue May 25 03:51:19 2010
@@ -0,0 +1,284 @@
+package org.apache.continuum.web.action;
+
+/*
+ * 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.text.ParseException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.time.DateUtils;
+import org.apache.maven.continuum.model.project.BuildResult;
+import org.apache.maven.continuum.model.project.Project;
+import org.apache.maven.continuum.project.ContinuumProjectState;
+import org.apache.maven.continuum.web.action.ContinuumActionSupport;
+import org.apache.maven.continuum.web.exception.AuthorizationRequiredException;
+import org.apache.maven.continuum.web.model.ProjectBuildsSummary;
+
+/**
+ * @plexus.component role="com.opensymphony.xwork2.Action" role-hint="projectBuildsReport"
+ */
+public class ViewBuildsReportAction
+ extends ContinuumActionSupport
+{
+ private int buildStatus;
+
+ private String triggeredBy = "";
+
+ private String startDate = "";
+
+ private String endDate = "";
+
+ private int rowCount = 30;
+
+ private int page = 1;
+
+ private int numPages;
+
+ private Map<Integer, String> buildStatuses;
+
+ private List<ProjectBuildsSummary> projectBuilds;
+
+ private static final 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 void prepare()
+ throws Exception
+ {
+ super.prepare();
+
+ buildStatuses = new LinkedHashMap<Integer, String>();
+ buildStatuses.put( 0, "ALL" );
+ buildStatuses.put( ContinuumProjectState.OK, "Ok" );
+ buildStatuses.put( ContinuumProjectState.FAILED, "Failed" );
+ buildStatuses.put( ContinuumProjectState.ERROR, "Error" );
+ }
+
+ public String init()
+ {
+ try
+ {
+ checkViewReportsAuthorization();
+ }
+ catch ( AuthorizationRequiredException authzE )
+ {
+ addActionError( authzE.getMessage() );
+ return REQUIRES_AUTHORIZATION;
+ }
+
+ // action class was called from the Menu; do not generate report first
+ return SUCCESS;
+ }
+
+ public String execute()
+ {
+ try
+ {
+ checkViewReportsAuthorization();
+ }
+ catch ( AuthorizationRequiredException authzE )
+ {
+ addActionError( authzE.getMessage() );
+ return REQUIRES_AUTHORIZATION;
+ }
+
+ long fromDate = 0;
+ long toDate = 0;
+
+ try
+ {
+ if ( !StringUtils.isEmpty( startDate ) )
+ {
+ fromDate = DateUtils.parseDate( startDate, datePatterns ).getTime();
+ }
+
+ if ( !StringUtils.isEmpty( endDate ) )
+ {
+ toDate = DateUtils.parseDate( endDate, datePatterns ).getTime();
+ }
+ }
+ catch ( ParseException e )
+ {
+ addActionError( "Error parsing date(s): " + e.getMessage() );
+ return ERROR;
+ }
+
+ if ( fromDate != 0 && toDate != 0 && new Date( fromDate ).after( new Date( toDate ) ) )
+ {
+ addFieldError( "startDate", "Start Date must be earlier than the End Date" );
+ return INPUT;
+ }
+
+ if ( rowCount < 10 )
+ {
+ // TODO: move to validation framework
+ addFieldError( "rowCount", "Row count must be larger than 10." );
+ return INPUT;
+ }
+
+ List<BuildResult> buildResults = getContinuum().getBuildResultsInRange( fromDate, toDate, buildStatus, triggeredBy );
+
+ if ( buildResults != null && !buildResults.isEmpty() )
+ {
+ projectBuilds = mapBuildResultsToProjectBuildsSummaries( buildResults );
+
+ int extraPage = ( projectBuilds.size() % rowCount ) != 0 ? 1 : 0;
+ numPages = ( projectBuilds.size() / rowCount ) + extraPage;
+
+ if ( page > numPages )
+ {
+ addActionError(
+ "Error encountered while generating project builds report :: The requested page exceeds the total number of pages." );
+ return ERROR;
+ }
+
+ int start = rowCount * ( page - 1 );
+ int end = ( start + rowCount ) - 1;
+
+ if ( end > projectBuilds.size() )
+ {
+ end = projectBuilds.size() - 1;
+ }
+
+ projectBuilds = projectBuilds.subList( start, end + 1 );
+ }
+
+ return SUCCESS;
+ }
+
+ private List<ProjectBuildsSummary> mapBuildResultsToProjectBuildsSummaries( List<BuildResult> buildResults )
+ {
+ List<ProjectBuildsSummary> buildsSummary = new ArrayList<ProjectBuildsSummary>();
+
+ for( BuildResult buildResult : buildResults )
+ {
+ Project project = buildResult.getProject();
+
+ // check if user is authorised to view build result
+ if ( !isAuthorized( project.getProjectGroup().getName() ) )
+ {
+ continue;
+ }
+
+ ProjectBuildsSummary summary = new ProjectBuildsSummary();
+ summary.setProjectGroupName( project.getProjectGroup().getName() );
+ summary.setProjectName( project.getName() );
+ summary.setBuildDate( buildResult.getStartTime() );
+ summary.setBuildState( buildResult.getState() );
+ summary.setBuildTriggeredBy( buildResult.getUsername() );
+
+ buildsSummary.add( summary );
+ }
+
+ return buildsSummary;
+ }
+
+ public int getBuildStatus()
+ {
+ return this.buildStatus;
+ }
+
+ public void setBuildStatus( int buildStatus )
+ {
+ this.buildStatus = buildStatus;
+ }
+
+ public String getTriggeredBy()
+ {
+ return this.triggeredBy;
+ }
+
+ public void setTriggeredBy( String triggeredBy )
+ {
+ this.triggeredBy = triggeredBy;
+ }
+
+ public String getStartDate()
+ {
+ return this.startDate;
+ }
+
+ public void setStartDate( String startDate )
+ {
+ this.startDate = startDate;
+ }
+
+ public String getEndDate()
+ {
+ return this.endDate;
+ }
+
+ public void setEndDate( String endDate )
+ {
+ this.endDate = endDate;
+ }
+
+ public int getRowCount()
+ {
+ return rowCount;
+ }
+
+ public void setRowCount( int rowCount )
+ {
+ this.rowCount = rowCount;
+ }
+
+ public Map<Integer, String> getBuildStatuses()
+ {
+ return buildStatuses;
+ }
+
+ public List<ProjectBuildsSummary> getProjectBuilds()
+ {
+ return projectBuilds;
+ }
+
+ public int getPage()
+ {
+ return page;
+ }
+
+ public void setPage( int page )
+ {
+ this.page = page;
+ }
+
+ public int getNumPages()
+ {
+ return numPages;
+ }
+
+ private boolean isAuthorized( String projectGroupName )
+ {
+ try
+ {
+ checkViewProjectGroupAuthorization( projectGroupName );
+ return true;
+ }
+ catch ( AuthorizationRequiredException authzE )
+ {
+ return false;
+ }
+ }
+}
Modified: continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/ContinuumActionSupport.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/ContinuumActionSupport.java?rev=947907&r1=947906&r2=947907&view=diff
==============================================================================
--- continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/ContinuumActionSupport.java (original)
+++ continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/ContinuumActionSupport.java Tue May 25 03:51:19 2010
@@ -485,6 +485,12 @@ public class ContinuumActionSupport
checkAuthorization( ContinuumRoleConstants.CONTINUUM_MANAGE_REPOSITORIES );
}
+ protected void checkViewReportsAuthorization()
+ throws AuthorizationRequiredException
+ {
+ checkAuthorization( ContinuumRoleConstants.CONTINUUM_VIEW_REPORT );
+ }
+
/**
* Get the security session
*
@@ -561,5 +567,5 @@ public class ContinuumActionSupport
principal = "unknown-user";
}
return principal;
- }
+ }
}
Modified: continuum/trunk/continuum-webapp/src/main/mdo/view-models.mdo
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-webapp/src/main/mdo/view-models.mdo?rev=947907&r1=947906&r2=947907&view=diff
==============================================================================
--- continuum/trunk/continuum-webapp/src/main/mdo/view-models.mdo (original)
+++ continuum/trunk/continuum-webapp/src/main/mdo/view-models.mdo Tue May 25 03:51:19 2010
@@ -29,11 +29,11 @@
<classes>
<class rootElement="true">
<name>ContinuumViewModels</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<fields>
<field>
<name>projectSummarys</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<description></description>
<required>true</required>
<association>
@@ -43,7 +43,7 @@
</field>
<field>
<name>groupSummarys</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<description></description>
<required>true</required>
<association>
@@ -53,7 +53,7 @@
</field>
<field>
<name>buildDefinitionSummarys</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<description></description>
<required>true</required>
<association>
@@ -63,7 +63,7 @@
</field>
<field>
<name>notifierSummarys</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<description></description>
<required>false</required>
<association>
@@ -75,11 +75,11 @@
</class>
<class>
<name>ProjectSummary</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<fields>
<field>
<name>id</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<description>project id of the project</description>
<type>int</type>
@@ -87,21 +87,21 @@
</field>
<field>
<name>name</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<description>name of the project</description>
<type>String</type>
</field>
<field>
<name>version</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<description>version of the project</description>
<type>String</type>
</field>
<field>
<name>projectGroupId</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<description>id of the project group this project is a member of</description>
<type>int</type>
@@ -109,14 +109,14 @@
</field>
<field>
<name>projectGroupName</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<description>name of the project group this project is a member of</description>
<type>String</type>
</field>
<field>
<name>latestBuildId</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<description>latest build id of the project</description>
<type>int</type>
@@ -124,7 +124,7 @@
</field>
<field>
<name>buildInSuccessId</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<description></description>
<type>int</type>
@@ -132,7 +132,7 @@
</field>
<field>
<name>buildNumber</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<description></description>
<type>int</type>
@@ -140,7 +140,7 @@
</field>
<field>
<name>state</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<description>lifecycle state of the project</description>
<type>int</type>
@@ -148,7 +148,7 @@
</field>
<field>
<name>inBuildingQueue</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<description>true/false depending on if the project is in the build queue or not</description>
<type>boolean</type>
@@ -156,7 +156,7 @@
</field>
<field>
<name>inCheckoutQueue</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<description>true/false depending on if the project is in the checkout queue or not</description>
<type>boolean</type>
@@ -164,21 +164,21 @@
</field>
<field>
<name>lastBuildDateTime</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<description>last build dateTime of the project</description>
<type>long</type>
</field>
<field>
<name>lastBuildDuration</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<description>last build duration of the project</description>
<type>String</type>
</field>
<field>
<name>projectType</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<description>type of the project</description>
<type>String</type>
@@ -187,11 +187,11 @@
</class>
<class>
<name>GroupSummary</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<fields>
<field>
<name>id</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<description>internal continuum group id</description>
<type>int</type>
@@ -199,56 +199,56 @@
</field>
<field>
<name>name</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<description>name of the project group</description>
<type>String</type>
</field>
<field>
<name>groupId</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>false</required>
<description>maven groupId of the project group</description>
<type>String</type>
</field>
<field>
<name>description</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>false</required>
<description>description of the project group</description>
<type>String</type>
</field>
<field>
<name>numProjects</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<description>the number of projects in the project group</description>
<type>int</type>
</field>
<field>
<name>projectType</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<description>the type of project, maven2/maven1/ant/shell</description>
<type>String</type>
</field>
<field>
<name>statusMessage</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>false</required>
<description>a status message like, (building project X)</description>
<type>String</type>
</field>
<field>
<name>nextScheduledBuild</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>false</required>
<description>timestamp for the next scheduled build</description>
<type>String</type>
</field>
<field>
<name>projects</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<description></description>
<required>true</required>
<association>
@@ -258,7 +258,7 @@
</field>
<field>
<name>numSuccesses</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<description>number of successful builds in the project group</description>
<type>int</type>
@@ -266,7 +266,7 @@
</field>
<field>
<name>numFailures</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<description>number of failed builds in the project group</description>
<type>int</type>
@@ -274,7 +274,7 @@
</field>
<field>
<name>numErrors</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<description>number of errored builds in the project group</description>
<type>int</type>
@@ -282,7 +282,7 @@
</field>
<field>
<name>repositoryId</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>false</required>
<description>local repository id of the project group</description>
<type>int</type>
@@ -290,7 +290,7 @@
</field>
<field>
<name>repositoryName</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>false</required>
<description>local repository name of the project group</description>
<type>String</type>
@@ -303,115 +303,115 @@
<fields>
<field>
<name>id</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<description>id of the build definition</description>
<type>int</type>
</field>
<field>
<name>projectId</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>false</required>
<description>project id of the project containing the build definition</description>
<type>int</type>
</field>
<field>
<name>projectGroupId</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>false</required>
<description>project group id of the project group with the build definition</description>
<type>int</type>
</field>
<field>
<name>goals</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<description>goals for build definition</description>
<type>String</type>
</field>
<field>
<name>arguments</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<description>arguments for build definition</description>
<type>String</type>
</field>
<field>
<name>buildFile</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<description>goals for build definition</description>
<type>String</type>
</field>
<field>
<name>isBuildFresh</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<description>if the build is to be smoked and checked back out from the scm each build</description>
<type>boolean</type>
</field>
<field>
<name>isDefault</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<description>if the build definition is used in default cases</description>
<type>boolean</type>
</field>
<field>
<name>scheduleId</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<description>id of the schedule for build definition</description>
<type>int</type>
</field>
<field>
<name>scheduleName</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<description>name of the schedule for build definition</description>
<type>String</type>
</field>
<field>
<name>from</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<description>source of build definition, project or project group lvl</description>
<type>String</type>
</field>
<field>
<name>profileName</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<description>name of the profile for the build definition</description>
<type>String</type>
</field>
<field>
<name>projectName</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<description>if project lvl, then the name of the project using the definition</description>
<type>String</type>
</field>
<field>
<name>profileId</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<description>id of the profile for build definition</description>
<type>int</type>
</field>
<field>
<name>description</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<type>String</type>
<description>description of the buid defintion</description>
</field>
<field>
<name>type</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<type>String</type>
<description>type of the buid defintion</description>
</field>
<field>
<name>alwaysBuild</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<type>boolean</type>
<defaultValue>false</defaultValue>
<description>true if the build had to be forced even if there is no scm change</description>
@@ -424,70 +424,70 @@
<fields>
<field>
<name>id</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<description>id of the notifier</description>
<type>int</type>
</field>
<field>
<name>projectId</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>false</required>
<description>project id of the project containing the notifier</description>
<type>int</type>
</field>
<field>
<name>projectName</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>false</required>
<description>project name of the project containing the notifier</description>
<type>String</type>
</field>
<field>
<name>projectGroupId</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>false</required>
<description>project group id of the project group with the notifier</description>
<type>int</type>
</field>
<field>
<name>type</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<description>Type of notifier - mail, IRC, jabber etc.</description>
<type>String</type>
</field>
<field>
<name>fromProject</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<description>The origin of the notifier (pom or user).</description>
<type>boolean</type>
</field>
<field>
<name>events</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>false</required>
<description>Events that trigger this notifier</description>
<type>String</type>
</field>
<field>
<name>recipient</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>false</required>
<description>Recipient for notifications generated by the notifier</description>
<type>String</type>
</field>
<field>
<name>sender</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>false</required>
<description>Sender of the notifications</description>
<type>String</type>
</field>
<field>
<name>enabled</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<description>Determines if the notifier is enabled</description>
<type>boolean</type>
@@ -500,42 +500,42 @@
<fields>
<field>
<name>buildAgentUrl</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>false</required>
<description>URL of the build agent</description>
<type>String</type>
</field>
<field>
<name>projectGroupId</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<description>ID of the project group</description>
<type>int</type>
</field>
<field>
<name>projectGroupName</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<description>Name of the project group</description>
<type>String</type>
</field>
<field>
<name>scmRootAddress</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<description>Scm root address of projects</description>
<type>String</type>
</field>
<field>
<name>scmRootId</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<description>ID of the scm root</description>
<type>int</type>
</field>
<field>
<name>hashCode</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>false</required>
<type>int</type>
</field>
@@ -547,7 +547,7 @@
<fields>
<field>
<name>phases</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<description>Release Phases</description>
<association>
@@ -557,7 +557,7 @@
</field>
<field>
<name>completedPhases</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<description>Completed release phases</description>
<association>
<type>String</type>
@@ -566,13 +566,13 @@
</field>
<field>
<name>inProgress</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<description>Release phase in progress</description>
<type>String</type>
</field>
<field>
<name>error</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<type>String</type>
</field>
</fields>
@@ -583,25 +583,25 @@
<fields>
<field>
<name>releaseId</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<type>String</type>
</field>
<field>
<name>releaseGoal</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<type>String</type>
</field>
<field>
<name>buildAgentUrl</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<type>String</type>
</field>
<field>
<name>projectId</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<type>int</type>
</field>
@@ -613,47 +613,78 @@
<fields>
<field>
<name>projectId</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<type>int</type>
</field>
<field>
<name>projectName</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<type>String</type>
</field>
<field>
<name>projectGroupName</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<type>String</type>
</field>
<field>
<name>buildDefinitionId</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<type>int</type>
</field>
<field>
<name>buildDefinitionLabel</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<type>String</type>
</field>
<field>
<name>buildAgentUrl</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<type>String</type>
</field>
<field>
<name>hashCode</name>
- <version>1.0.0</version>
+ <version>1.0.0+</version>
<required>true</required>
<type>int</type>
</field>
</fields>
</class>
+ <class>
+ <name>ProjectBuildsSummary</name>
+ <version>1.4.1+</version>
+ <fields>
+ <field>
+ <name>projectGroupName</name>
+ <version>1.4.1+</version>
+ <type>String</type>
+ </field>
+ <field>
+ <name>projectName</name>
+ <version>1.4.1+</version>
+ <type>String</type>
+ </field>
+ <field>
+ <name>buildDate</name>
+ <version>1.4.1+</version>
+ <type>long</type>
+ </field>
+ <field>
+ <name>buildState</name>
+ <version>1.4.1+</version>
+ <type>int</type>
+ </field>
+ <field>
+ <name>buildTriggeredBy</name>
+ <version>1.4.1+</version>
+ <type>String</type>
+ </field>
+ </fields>
+ </class>
</classes>
</model>
Modified: continuum/trunk/continuum-webapp/src/main/resources/localization/Continuum.properties
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-webapp/src/main/resources/localization/Continuum.properties?rev=947907&r1=947906&r2=947907&view=diff
==============================================================================
--- continuum/trunk/continuum-webapp/src/main/resources/localization/Continuum.properties (original)
+++ continuum/trunk/continuum-webapp/src/main/resources/localization/Continuum.properties Tue May 25 03:51:19 2010
@@ -69,7 +69,7 @@ bottom.version.number = ${pom.parent.par
menu.continuum = Continuum
menu.continuum.about = About
menu.continuum.showProjects = Show Projects
-menu.continuum.showProjectGroups = Show Project Groups
+menu.continuum.showProjectGroups = Show Project Groups
menu.addProject = Add Project
menu.add.m2Project = Maven 2.0.x Project
menu.add.m1Project = Maven 1.x Project
@@ -95,6 +95,8 @@ menu.distributedBuilds.buildAgents = Bui
menu.distributedBuilds.releases = Releases
menu.parallelBuilds = Parallel Builds
menu.parallelBuilds.build.queue= Build Queue
+menu.reports = Reports
+menu.reports.projectBuilds = Project Builds
# ----------------------------------------------------------------------
# Page: error
@@ -1259,3 +1261,20 @@ errorOccured.section.title=Error Occured
releaseError.page.title=Continuum - Release Error
releaseError.section.title=Release Error
releasePrepare.input.error = Unable to get release plugin parameters and process project - {0}
+
+# ----------------------------------------------------------------------
+# Page: Project Builds Report
+# ----------------------------------------------------------------------
+projectBuilds.report.title=Continuum - Project Builds Report
+projectBuilds.report.section.title=Project Builds Report
+projectBuilds.report.startDate=Start Date
+projectBuilds.report.endDate=End Date
+projectBuilds.report.triggeredBy=Triggered By
+projectBuilds.report.buildStatus=Build Status
+projectBuilds.report.rowCount=Row Count
+projectBuilds.report.view=View Report
+projectBuilds.report.prev=Prev
+projectBuilds.report.next=Next
+projectBuilds.report.projectGroup = Project Group
+projectBuilds.report.project=Project
+projectBuilds.report.buildDate=Build Date
\ No newline at end of file
Modified: continuum/trunk/continuum-webapp/src/main/resources/struts.xml
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-webapp/src/main/resources/struts.xml?rev=947907&r1=947906&r2=947907&view=diff
==============================================================================
--- continuum/trunk/continuum-webapp/src/main/resources/struts.xml (original)
+++ continuum/trunk/continuum-webapp/src/main/resources/struts.xml Tue May 25 03:51:19 2010
@@ -624,6 +624,15 @@
<action name="viewReleases" class="distributedRelease" method="list">
<result name="success">/WEB-INF/jsp/releases.jsp</result>
</action>
+
+ <action name="viewProjectBuildsReport" class="projectBuildsReport" method="init">
+ <result name="success">/WEB-INF/jsp/viewProjectBuildsReport.jsp</result>
+ </action>
+
+ <action name="generateProjectBuildsReport" class="projectBuildsReport">
+ <result name="input">/WEB-INF/jsp/viewProjectBuildsReport.jsp</result>
+ <result name="success">/WEB-INF/jsp/viewProjectBuildsReport.jsp</result>
+ </action>
</package>
<!--
Modified: continuum/trunk/continuum-webapp/src/main/webapp/WEB-INF/jsp/navigations/Menu.jsp
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-webapp/src/main/webapp/WEB-INF/jsp/navigations/Menu.jsp?rev=947907&r1=947906&r2=947907&view=diff
==============================================================================
--- continuum/trunk/continuum-webapp/src/main/webapp/WEB-INF/jsp/navigations/Menu.jsp (original)
+++ continuum/trunk/continuum-webapp/src/main/webapp/WEB-INF/jsp/navigations/Menu.jsp Tue May 25 03:51:19 2010
@@ -39,7 +39,6 @@
<s:text name="menu.continuum.showProjectGroups"/>
</s:a>
</div>
-
</div>
</div>
@@ -178,6 +177,22 @@
</div>
</redback:ifAnyAuthorized>
+ <redback:ifAuthorized permission="continuum-view-report">
+ <div id="projectmenu" class="toolgroup">
+ <div class="label">
+ <s:text name="menu.reports"/>
+ </div>
+ <div>
+ <div class="body">
+ <s:url id="viewProjectBuildsReportUrl" action="viewProjectBuildsReport" method="init" namespace="/" includeParams="none"/>
+ <s:a href="%{viewProjectBuildsReportUrl}">
+ <s:text name="menu.reports.projectBuilds"/>
+ </s:a>
+ </div>
+ </div>
+ </div>
+ </redback:ifAuthorized>
+
<c1:ifBuildTypeEnabled buildType="distributed">
<redback:ifAnyAuthorized permissions="continuum-manage-distributed-builds,continuum-view-release">
<div id="projectmenu" class="toolgroup">
Added: continuum/trunk/continuum-webapp/src/main/webapp/WEB-INF/jsp/viewProjectBuildsReport.jsp
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-webapp/src/main/webapp/WEB-INF/jsp/viewProjectBuildsReport.jsp?rev=947907&view=auto
==============================================================================
--- continuum/trunk/continuum-webapp/src/main/webapp/WEB-INF/jsp/viewProjectBuildsReport.jsp (added)
+++ continuum/trunk/continuum-webapp/src/main/webapp/WEB-INF/jsp/viewProjectBuildsReport.jsp Tue May 25 03:51:19 2010
@@ -0,0 +1,182 @@
+<%--
+ ~ 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 uri="/struts-tags" prefix="s" %>
+<%@ taglib uri='http://java.sun.com/jsp/jstl/core' prefix='c'%>
+<%@ taglib uri="http://www.extremecomponents.org" prefix="ec" %>
+<%@ taglib uri="continuum" prefix="c1" %>
+
+<html>
+ <s:i18n name="localization.Continuum">
+ <head>
+ <title><s:text name="projectBuilds.report.title"/></title>
+ <s:head/>
+ <link rel="stylesheet" href="<c:url value='/css/no-theme/jquery-ui-1.7.2.custom.css'/>" type="text/css" />
+ <script type="text/javascript" src="<c:url value='/js/jquery-1.3.2.min.js'/>"></script>
+ <script type="text/javascript" src="<c:url value='/js/jquery-ui-1.7.2.custom.min.js'/>"></script>
+ <script type="text/javascript">
+ $(document).ready(function()
+ {
+ $('#startDate').datepicker()
+ $('#endDate').datepicker()
+ });
+ </script>
+ </head>
+
+ <body>
+ <h3><s:text name="projectBuilds.report.section.title"/></h3>
+
+ <s:form name="generateReportForm" action="generateProjectBuildsReport.action">
+ <c:if test="${!empty actionErrors || !empty errorMessages}">
+ <div class="errormessage">
+ <s:iterator value="actionErrors">
+ <p><s:property/></p>
+ </s:iterator>
+ <c:forEach items="${errorMessages}" var="errorMessage">
+ <p>${errorMessage}</p>
+ </c:forEach>
+ </div>
+ </c:if>
+
+ <div class="axial">
+ <table>
+ <s:textfield label="%{getText('projectBuilds.report.startDate')}" name="startDate" id="startDate" size="20"/>
+ <s:textfield label="%{getText('projectBuilds.report.endDate')}" name="endDate" id="endDate" size="20"/>
+ <s:select label="%{getText('projectBuilds.report.buildStatus')}" name="buildStatus" list="buildStatuses"/>
+ <s:textfield label="%{getText('projectBuilds.report.triggeredBy')}" name="triggeredBy" size="40"/>
+ <s:textfield label="%{getText('projectBuilds.report.rowCount')}" name="rowCount" size="10"/>
+ </table>
+ <div class="functnbar3">
+ <c1:submitcancel value="%{getText('projectBuilds.report.view')}" cancel="%{getText('cancel')}"/>
+ </div>
+ </div>
+ </s:form>
+
+ </p>
+
+ <div id="h3">
+ <h3>Results</h3>
+ <c:if test="${not empty projectBuilds}">
+ <c:set var="prevPageUrl">
+ <s:url action="generateProjectBuildsReport">
+ <s:param name="triggeredBy" value="%{#attr.triggeredBy}"/>
+ <s:param name="buildStatus" value="%{#attr.buildStatus}"/>
+ <s:param name="rowCount" value="%{#attr.rowCount}"/>
+ <s:param name="startDate" value="%{#attr.startDate}"/>
+ <s:param name="endDate" value="%{#attr.endDate}"/>
+ <s:param name="page" value="%{#attr.page - 1}"/>
+ </s:url>
+ </c:set>
+ <c:set var="nextPageUrl">
+ <s:url action="generateProjectBuildsReport">
+ <s:param name="triggeredBy" value="%{#attr.triggeredBy}"/>
+ <s:param name="buildStatus" value="%{#attr.buildStatus}"/>
+ <s:param name="rowCount" value="%{#attr.rowCount}"/>
+ <s:param name="startDate" value="%{#attr.startDate}"/>
+ <s:param name="endDate" value="%{#attr.endDate}"/>
+ <s:param name="page" value="%{#attr.page + 1}"/>
+ </s:url>
+ </c:set>
+ <c:choose>
+ <c:when test="${page == 1}">
+ <s:text name="projectBuilds.report.prev"/>
+ </c:when>
+ <c:otherwise>
+ <a href="${prevPageUrl}">
+ <s:text name="projectBuilds.report.prev"/>
+ </a>
+ </c:otherwise>
+ </c:choose>
+
+ <c:choose>
+ <c:when test="${numPages > 11}">
+ <c:choose>
+ <c:when test="${(page - 5) < 0}">
+ <c:set var="beginVal">0</c:set>
+ <c:set var="endVal">10</c:set>
+ </c:when>
+ <c:when test="${(page + 5) > (numPages - 1)}">
+ <c:set var="beginVal">${(numPages - 1) - 10}</c:set>
+ <c:set var="endVal">${numPages - 1}</c:set>
+ </c:when>
+ <c:otherwise>
+ <c:set var="beginVal">${page - 5}</c:set>
+ <c:set var="endVal">${page + 5}</c:set>
+ </c:otherwise>
+ </c:choose>
+ </c:when>
+ <c:otherwise>
+ <c:set var="beginVal">0</c:set>
+ <c:set var="endVal">${numPages - 1}</c:set>
+ </c:otherwise>
+ </c:choose>
+
+ <c:forEach var="i" begin="${beginVal}" end="${endVal}">
+ <c:choose>
+ <c:when test="${i != (page - 1)}">
+ <c:set var="specificPageUrl">
+ <s:url action="generateProjectBuildsReport">
+ <s:param name="triggeredBy" value="%{#attr.triggeredBy}"/>
+ <s:param name="buildStatus" value="%{#attr.buildStatus}"/>
+ <s:param name="rowCount" value="%{#attr.rowCount}"/>
+ <s:param name="startDate" value="%{#attr.startDate}"/>
+ <s:param name="endDate" value="%{#attr.endDate}"/>
+ <s:param name="page" value="%{#attr.i + 1}"/>
+ </s:url>
+ </c:set>
+ <a href="${specificPageUrl}">${i + 1}</a>
+ </c:when>
+ <c:otherwise>
+ <b>${i + 1}</b>
+ </c:otherwise>
+ </c:choose>
+ </c:forEach>
+
+ <c:choose>
+ <c:when test="${page == numPages}">
+ <s:text name="projectBuilds.report.next"/>
+ </c:when>
+ <c:otherwise>
+ <a href="${nextPageUrl}">
+ <s:text name="projectBuilds.report.next"/>
+ </a>
+ </c:otherwise>
+ </c:choose>
+
+ <s:set name="projectBuilds" value="projectBuilds" scope="request"/>
+ <ec:table items="projectBuilds"
+ var="projectBuild"
+ showExports="false"
+ showPagination="false"
+ showStatusBar="false"
+ sortable="false"
+ filterable="false">
+ <ec:row highlightRow="true">
+ <ec:column property="projectGroupName" title="projectBuilds.report.projectGroup"/>
+ <ec:column property="projectName" title="projectBuilds.report.project"/>
+ <ec:column property="buildDate" title="projectBuilds.report.buildDate" cell="date"/>
+ <ec:column property="buildTriggeredBy" title="projectBuilds.report.triggeredBy"/>
+ <ec:column property="buildState" title="projectBuilds.report.buildStatus" cell="org.apache.maven.continuum.web.view.buildresults.StateCell"/>
+ </ec:row>
+ </ec:table>
+ </c:if>
+ </div>
+ </body>
+ </s:i18n>
+</html>
\ No newline at end of file
Re: svn commit: r947907 [1/3] - in /continuum/trunk: continuum-api/src/main/java/org/apache/continuum/dao/ continuum-api/src/main/java/org/apache/maven/continuum/ continuum-core/src/main/java/org/apache/maven/continuum/ continuum-data-management/data-manag...
Posted by Brett Porter <br...@apache.org>.
On 25/05/2010, at 1:51 PM, ctan@apache.org wrote:
>
> + @SuppressWarnings( "unchecked" )
> + public List<BuildResult> getBuildResultsInRange( long fromDate, long toDate, int state, String triggeredBy )
Would it be easier to work with Date objects here, so that the action doesn't need to do the conversion?
--
Brett Porter
brett@apache.org
http://brettporter.wordpress.com/