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 );