You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@continuum.apache.org by ba...@apache.org on 2015/05/04 03:42:55 UTC
svn commit: r1677509 - 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-store/src/main/java/org/apache/...
Author: batkinson
Date: Mon May 4 01:42:54 2015
New Revision: 1677509
URL: http://svn.apache.org/r1677509
Log:
[CONTINUUM-2761] Build reports should only scan database records a user has permission to view.
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-store/src/main/java/org/apache/continuum/dao/BuildResultDaoImpl.java
continuum/trunk/continuum-store/src/test/java/org/apache/maven/continuum/store/ContinuumStoreTest.java
continuum/trunk/continuum-webapp/src/main/java/org/apache/continuum/web/action/ViewBuildsReportAction.java
continuum/trunk/continuum-webapp/src/test/java/org/apache/continuum/web/action/ViewBuildsReportActionTest.java
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=1677509&r1=1677508&r2=1677509&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 Mon May 4 01:42:54 2015
@@ -23,6 +23,7 @@ import org.apache.maven.continuum.model.
import org.apache.maven.continuum.model.project.Project;
import org.apache.maven.continuum.store.ContinuumStoreException;
+import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;
@@ -122,5 +123,5 @@ public interface BuildResultDao
List<BuildResult> getAllBuildsForAProjectByDate( int projectId );
List<BuildResult> getBuildResultsInRange( Date fromDate, Date toDate, int state, String triggeredBy,
- int projectGroupId, int offset, int length );
+ Collection<Integer> projectGroupIds, int offset, int length );
}
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=1677509&r1=1677508&r2=1677509&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 Mon May 4 01:42:54 2015
@@ -207,7 +207,7 @@ public interface Continuum
void removeBuildResult( int buildId )
throws ContinuumException;
- List<BuildResult> getBuildResultsInRange( int projectGroupId, Date fromDate, Date toDate, int state,
+ List<BuildResult> getBuildResultsInRange( Collection<Integer> projectGroupId, Date fromDate, Date toDate, int state,
String triggeredBy, int offset, int length );
// ----------------------------------------------------------------------
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=1677509&r1=1677508&r2=1677509&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 Mon May 4 01:42:54 2015
@@ -540,10 +540,10 @@ public class DefaultContinuum
return ( builds.isEmpty() ? null : builds.get( 0 ) );
}
- public List<BuildResult> getBuildResultsInRange( int projectGroupId, Date fromDate, Date toDate, int state,
- String triggeredBy, int offset, int length )
+ public List<BuildResult> getBuildResultsInRange( Collection<Integer> projectGroupIds, Date fromDate, Date toDate,
+ int state, String triggeredBy, int offset, int length )
{
- return buildResultDao.getBuildResultsInRange( fromDate, toDate, state, triggeredBy, projectGroupId, offset,
+ return buildResultDao.getBuildResultsInRange( fromDate, toDate, state, triggeredBy, projectGroupIds, offset,
length );
}
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=1677509&r1=1677508&r2=1677509&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 Mon May 4 01:42:54 2015
@@ -32,6 +32,7 @@ import javax.jdo.PersistenceManager;
import javax.jdo.Query;
import javax.jdo.Transaction;
import java.util.Calendar;
+import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
@@ -816,7 +817,7 @@ public class BuildResultDaoImpl
}
public List<BuildResult> getBuildResultsInRange( Date fromDate, Date toDate, int state, String triggeredBy,
- int projectGroupId, int offset, int length )
+ Collection<Integer> projectGroupIds, int offset, int length )
{
PersistenceManager pm = getPersistenceManager();
Transaction tx = pm.currentTransaction();
@@ -832,7 +833,7 @@ public class BuildResultDaoImpl
Query query = pm.newQuery( extent );
InRangeQueryAttrs inRangeQueryAttrs =
- new InRangeQueryAttrs( fromDate, toDate, state, triggeredBy, projectGroupId, query ).build();
+ new InRangeQueryAttrs( fromDate, toDate, state, triggeredBy, projectGroupIds, query ).build();
String parameters = inRangeQueryAttrs.getParameters();
String filter = inRangeQueryAttrs.getFilter();
@@ -867,7 +868,7 @@ public class BuildResultDaoImpl
private String triggeredBy;
- private int projectGroupId;
+ private Collection<Integer> projectGroupIds;
private Query query;
@@ -877,14 +878,14 @@ public class BuildResultDaoImpl
private Map params;
- public InRangeQueryAttrs( Date fromDate, Date toDate, int state, String triggeredBy, int projectGroupId,
- Query query )
+ public InRangeQueryAttrs( Date fromDate, Date toDate, int state, String triggeredBy,
+ Collection<Integer> projectGroupIds, Query query )
{
this.fromDate = fromDate;
this.toDate = toDate;
this.state = state;
this.triggeredBy = triggeredBy;
- this.projectGroupId = projectGroupId;
+ this.projectGroupIds = projectGroupIds;
this.query = query;
}
@@ -917,11 +918,12 @@ public class BuildResultDaoImpl
filter += "this.state == state && ";
}
- if ( projectGroupId > 0 )
+ if ( projectGroupIds != null && !projectGroupIds.isEmpty() )
{
- params.put( "projectGroupId", projectGroupId );
- parameters += "int projectGroupId, ";
- filter += "this.project.projectGroup.id == projectGroupId && ";
+ params.put( "projectGroupIds", projectGroupIds );
+ query.declareImports( "import java.util.Collection" );
+ parameters += "Collection projectGroupIds, ";
+ filter += "projectGroupIds.contains(this.project.projectGroup.id) && ";
}
if ( triggeredBy != null && !triggeredBy.equals( "" ) )
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=1677509&r1=1677508&r2=1677509&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 Mon May 4 01:42:54 2015
@@ -1455,23 +1455,23 @@ public class ContinuumStoreTest
throws Exception
{
int maxFetch = 5;
- List<BuildResult> results = buildResultDao.getBuildResultsInRange( null, null, 0, null, 0, 0, maxFetch );
+ List<BuildResult> results = buildResultDao.getBuildResultsInRange( null, null, 0, null, null, 0, maxFetch );
assertEquals( "check number of build results returned", 3, results.size() );
- results = buildResultDao.getBuildResultsInRange( null, null, 2, null, 0, 0, maxFetch );
+ results = buildResultDao.getBuildResultsInRange( null, null, 2, null, null, 0, maxFetch );
assertEquals( "check number of build results returned with state == OK", 2, results.size() );
- results = buildResultDao.getBuildResultsInRange( null, null, 0, "user", 0, 0, maxFetch );
+ results = buildResultDao.getBuildResultsInRange( null, null, 0, "user", null, 0, maxFetch );
assertEquals( "check number of build results returned with triggeredBy == user", 1, results.size() );
- results = buildResultDao.getBuildResultsInRange( null, null, 0, "schedule", 0, 0, maxFetch );
+ results = buildResultDao.getBuildResultsInRange( null, null, 0, "schedule", null, 0, maxFetch );
assertEquals( "check number of build results returned with triggeredBy == schedule", 2, results.size() );
- results = buildResultDao.getBuildResultsInRange( null, null, 2, "schedule", 0, 0, maxFetch );
+ results = buildResultDao.getBuildResultsInRange( null, null, 2, "schedule", null, 0, maxFetch );
assertEquals( "check number of build results returned with state == Ok and triggeredBy == schedule", 1,
results.size() );
- results = buildResultDao.getBuildResultsInRange( null, null, 3, "user", 0, 0, maxFetch );
+ results = buildResultDao.getBuildResultsInRange( null, null, 3, "user", null, 0, maxFetch );
assertEquals( "check number of build results returned with state == Failed and triggeredBy == user", 0,
results.size() );
@@ -1479,17 +1479,17 @@ public class ContinuumStoreTest
cal.setTime( new Date( baseTime ) );
cal.add( Calendar.DAY_OF_MONTH, 1 );
- results = buildResultDao.getBuildResultsInRange( new Date( baseTime ), cal.getTime(), 0, null, 0, 0, maxFetch );
+ results = buildResultDao.getBuildResultsInRange( new Date( baseTime ), cal.getTime(), 0, null, null, 0, maxFetch );
assertEquals( "check number of build results returned with startDate and endDate", 2, results.size() );
- results = buildResultDao.getBuildResultsInRange( new Date( baseTime ), new Date( baseTime ), 0, null, 0, 0,
+ results = buildResultDao.getBuildResultsInRange( new Date( baseTime ), new Date( baseTime ), 0, null, null, 0,
maxFetch );
assertEquals( "check number of build results returned with the same startDate and endDate", 1, results.size() );
- results = buildResultDao.getBuildResultsInRange( null, null, 0, null, 1, 0, maxFetch );
+ results = buildResultDao.getBuildResultsInRange( null, null, 0, null, null, 0, maxFetch );
assertEquals( "check number of build results returned with an existing group id", 3, results.size() );
- results = buildResultDao.getBuildResultsInRange( null, null, 0, null, 2, 0, maxFetch );
+ results = buildResultDao.getBuildResultsInRange( null, null, 0, null, null, 0, maxFetch );
assertEquals( "check number of build results returned with non-existing group id", 0, results.size() );
}
// ----------------------------------------------------------------------
Modified: 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=1677509&r1=1677508&r2=1677509&view=diff
==============================================================================
--- continuum/trunk/continuum-webapp/src/main/java/org/apache/continuum/web/action/ViewBuildsReportAction.java (original)
+++ continuum/trunk/continuum-webapp/src/main/java/org/apache/continuum/web/action/ViewBuildsReportAction.java Mon May 4 01:42:54 2015
@@ -39,13 +39,13 @@ import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
-import java.util.Set;
@Component( role = com.opensymphony.xwork2.Action.class, hint = "projectBuildsReport", instantiationStrategy = "per-lookup" )
public class ViewBuildsReportAction
@@ -137,7 +137,7 @@ public class ViewBuildsReportAction
private Map<Integer, String> projectGroups;
- private Set<String> permittedGroups = new HashSet<String>();
+ private Map<String, Integer> permittedGroups;
private List<BuildResult> filteredResults = new ArrayList<BuildResult>();
@@ -174,6 +174,7 @@ public class ViewBuildsReportAction
buildStatuses.put( state.getDataId(), getText( state.getTextKey() ) );
}
+ permittedGroups = new HashMap<String, Integer>();
projectGroups = new LinkedHashMap<Integer, String>();
projectGroups.put( 0, "ALL" );
@@ -187,7 +188,7 @@ public class ViewBuildsReportAction
if ( isAuthorized( groupName ) )
{
projectGroups.put( group.getId(), groupName );
- permittedGroups.add( groupName );
+ permittedGroups.put( groupName, group.getId() );
}
}
}
@@ -253,20 +254,32 @@ public class ViewBuildsReportAction
return INPUT;
}
+ // Limit query to scan only what the user is permitted to see
+ Collection<Integer> groupIds = new HashSet<Integer>();
+ if ( projectGroupId > 0 )
+ {
+ groupIds.add( projectGroupId );
+ }
+ else
+ {
+ groupIds.addAll( permittedGroups.values() );
+ }
+
// Users can preview a limited number of records (use export for more)
int offset = 0;
List<BuildResult> results;
populating:
do
{
+
// Fetch a batch of records (may be filtered based on permissions)
- results = getContinuum().getBuildResultsInRange( projectGroupId, fromDate, toDate, buildStatus, triggeredBy,
+ results = getContinuum().getBuildResultsInRange( groupIds, fromDate, toDate, buildStatus, triggeredBy,
offset, MAX_BROWSE_SIZE );
offset += MAX_BROWSE_SIZE;
for ( BuildResult result : results )
{
- if ( permittedGroups.contains( result.getProject().getProjectGroup().getName() ) )
+ if ( permittedGroups.containsKey( result.getProject().getProjectGroup().getName() ) )
{
filteredResults.add( result );
}
@@ -356,13 +369,24 @@ public class ViewBuildsReportAction
// Write the header
output.append( "Group,Project,ID,Build#,Started,Duration,Triggered By,Status\n" );
+ // Limit query to scan only what the user is permitted to see
+ Collection<Integer> groupIds = new HashSet<Integer>();
+ if ( projectGroupId > 0 )
+ {
+ groupIds.add( projectGroupId );
+ }
+ else
+ {
+ groupIds.addAll( permittedGroups.values() );
+ }
+
// Build the output file by walking through the results in batches
int offset = 0, exported = 0;
List<BuildResult> results;
export:
do
{
- results = getContinuum().getBuildResultsInRange( projectGroupId, fromDate, toDate, buildStatus,
+ results = getContinuum().getBuildResultsInRange( groupIds, fromDate, toDate, buildStatus,
triggeredBy, offset, EXPORT_BATCH_SIZE );
offset += EXPORT_BATCH_SIZE; // Ensure we advance through results
@@ -371,7 +395,7 @@ public class ViewBuildsReportAction
for ( BuildResult result : results )
{
- if ( !permittedGroups.contains( result.getProject().getProjectGroup().getName() ) )
+ if ( !permittedGroups.containsKey( result.getProject().getProjectGroup().getName() ) )
{
continue;
}
Modified: continuum/trunk/continuum-webapp/src/test/java/org/apache/continuum/web/action/ViewBuildsReportActionTest.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-webapp/src/test/java/org/apache/continuum/web/action/ViewBuildsReportActionTest.java?rev=1677509&r1=1677508&r2=1677509&view=diff
==============================================================================
--- continuum/trunk/continuum-webapp/src/test/java/org/apache/continuum/web/action/ViewBuildsReportActionTest.java (original)
+++ continuum/trunk/continuum-webapp/src/test/java/org/apache/continuum/web/action/ViewBuildsReportActionTest.java Mon May 4 01:42:54 2015
@@ -104,7 +104,7 @@ public class ViewBuildsReportActionTest
@Test
public void testStartDateSameWithEndDate()
{
- when( continuum.getBuildResultsInRange( anyInt(), any( Date.class ), any( Date.class ), anyInt(),
+ when( continuum.getBuildResultsInRange( anyCollection(), any( Date.class ), any( Date.class ), anyInt(),
anyString(), anyInt(), anyInt() ) ).thenReturn( buildResults );
action.setStartDate( "04/25/2010" );
@@ -117,7 +117,7 @@ public class ViewBuildsReportActionTest
@Test
public void testEndDateWithNoStartDate()
{
- when( continuum.getBuildResultsInRange( anyInt(), any( Date.class ), any( Date.class ), anyInt(),
+ when( continuum.getBuildResultsInRange( anyCollection(), any( Date.class ), any( Date.class ), anyInt(),
anyString(), anyInt(), anyInt() ) ).thenReturn( buildResults );
action.setEndDate( "04/25/2010" );
String result = action.execute();
@@ -134,7 +134,7 @@ public class ViewBuildsReportActionTest
List<BuildResult> results = createBuildResult( cal.getTimeInMillis() );
- when( continuum.getBuildResultsInRange( anyInt(), any( Date.class ), any( Date.class ), anyInt(),
+ when( continuum.getBuildResultsInRange( anyCollection(), any( Date.class ), any( Date.class ), anyInt(),
anyString(), anyInt(), anyInt() ) ).thenReturn( results );
action.setProjectGroupId( 0 );
action.setBuildStatus( 0 );