← Back to team overview

dhis2-devs team mailing list archive

[Branch ~dhis2-devs-core/dhis2/trunk] Rev 19227: Data import. Checking if org units of incoming data are within hierarachy of org units of current...

 

------------------------------------------------------------
revno: 19227
committer: Lars Helge Overland <larshelge@xxxxxxxxx>
branch nick: dhis2
timestamp: Mon 2015-06-01 21:49:10 +0200
message:
  Data import. Checking if org units of incoming data are within hierarachy of org units of current user
modified:
  dhis-2/dhis-api/src/main/java/org/hisp/dhis/organisationunit/OrganisationUnitService.java
  dhis-2/dhis-api/src/main/java/org/hisp/dhis/user/CurrentUserService.java
  dhis-2/dhis-api/src/main/java/org/hisp/dhis/user/User.java
  dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/organisationunit/DefaultOrganisationUnitService.java
  dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/user/DefaultCurrentUserService.java
  dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/organisationunit/OrganisationUnitServiceTest.java
  dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/datavalueset/DefaultDataValueSetService.java
  dhis-2/dhis-services/dhis-service-dxf2/src/test/java/org/hisp/dhis/dxf2/datavalueset/DataValueSetServiceTest.java
  dhis-2/dhis-services/dhis-service-dxf2/src/test/resources/datavalueset/dataValueSetE.xml
  dhis-2/dhis-support/dhis-support-test/src/main/java/org/hisp/dhis/mock/MockCurrentUserService.java


--
lp:dhis2
https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk

Your team DHIS 2 developers is subscribed to branch lp:dhis2.
To unsubscribe from this branch go to https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk/+edit-subscription
=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/organisationunit/OrganisationUnitService.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/organisationunit/OrganisationUnitService.java	2015-03-31 17:17:03 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/organisationunit/OrganisationUnitService.java	2015-06-01 19:49:10 +0000
@@ -454,8 +454,26 @@
      */
     Collection<OrganisationUnit> getOrganisationUnitByCoordinate( double longitude, double latitude, String topOrgUnitUid,
         Integer targetLevel );
-    
+
+    /**
+     * Indicates whether the given organisation unit is part of the hierarchy
+     * of the organisation units of the current user.
+     * 
+     * @param organisationUnit the organisation unit.
+     * @return true if the given organisation unit is part of the hierarchy.
+     */
     boolean isInUserHierarchy( OrganisationUnit organisationUnit );
+
+    /**
+     * Indicates whether the given organisation unit is part of the hierarchy
+     * of the given user organisation units.
+     * 
+     * @param uid the uid of the organisation unit.
+     * @param organisationUnits the set of organisation units associated with a 
+     *        user.
+     * @return true if the organisation unit with the given uid is part of the hierarchy.
+     */
+    boolean isInUserHierarchy( String uid, Set<OrganisationUnit> organisationUnits );
     
     // -------------------------------------------------------------------------
     // OrganisationUnitHierarchy

=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/user/CurrentUserService.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/user/CurrentUserService.java	2015-01-17 07:41:26 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/user/CurrentUserService.java	2015-06-01 19:49:10 +0000
@@ -28,6 +28,9 @@
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+import java.util.Set;
+
+import org.hisp.dhis.organisationunit.OrganisationUnit;
 
 /**
  * This interface defined methods for getting access to the currently logged in
@@ -54,6 +57,12 @@
     User getCurrentUser();
     
     /**
+     * @return the data capture organisation units of the current user, empty set
+     *         if no current user.
+     */
+    Set<OrganisationUnit> getCurrentUserOrganisationUnits();
+    
+    /**
      * @return true if the current logged in user has the ALL privileges set, false
      *         otherwise.
      */

=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/user/User.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/user/User.java	2015-05-29 15:01:41 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/user/User.java	2015-06-01 19:49:10 +0000
@@ -246,9 +246,10 @@
      * of the organisation units of this user.
      * 
      * @param organisationUnit the organisation unit.
+     * @param the user organisation units.
      * @return true if the given organisation unit is part of the hierarchy.
      */
-    public boolean isInUserHierarchy( OrganisationUnit organisationUnit )
+    public static boolean isInUserHierarchy( OrganisationUnit organisationUnit, Set<OrganisationUnit> organisationUnits )
     {
         if ( organisationUnits == null )
         {
@@ -268,6 +269,18 @@
         return false;
     }
     
+    /**
+     * Indicates whether the given organisation unit is part of the hierarchy
+     * of the organisation units of this user.
+     * 
+     * @param organisationUnit the organisation unit.
+     * @return true if the given organisation unit is part of the hierarchy.
+     */
+    public boolean isInUserHierarchy( OrganisationUnit organisationUnit )
+    {
+        return User.isInUserHierarchy( organisationUnit, organisationUnits );
+    }
+    
     public String getUsername()
     {
         return userCredentials != null ? userCredentials.getUsername() : null;

=== modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/organisationunit/DefaultOrganisationUnitService.java'
--- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/organisationunit/DefaultOrganisationUnitService.java	2015-05-29 15:01:41 +0000
+++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/organisationunit/DefaultOrganisationUnitService.java	2015-06-01 19:49:10 +0000
@@ -763,6 +763,14 @@
         return user != null ? user.isInUserHierarchy( organisationUnit ) : false;
     }
 
+    @Override
+    public boolean isInUserHierarchy( String uid, Set<OrganisationUnit> organisationUnits )
+    {
+        OrganisationUnit organisationUnit = organisationUnitStore.getByUid( uid );
+        
+        return User.isInUserHierarchy( organisationUnit, organisationUnits );
+    }
+    
     // -------------------------------------------------------------------------
     // OrganisationUnitHierarchy
     // -------------------------------------------------------------------------

=== modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/user/DefaultCurrentUserService.java'
--- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/user/DefaultCurrentUserService.java	2015-01-17 07:41:26 +0000
+++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/user/DefaultCurrentUserService.java	2015-06-01 19:49:10 +0000
@@ -28,6 +28,10 @@
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+import java.util.HashSet;
+import java.util.Set;
+
+import org.hisp.dhis.organisationunit.OrganisationUnit;
 import org.hisp.dhis.security.spring.AbstractSpringSecurityCurrentUserService;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -93,6 +97,14 @@
 
         return userCredentials.isSuper();
     }
+
+    @Override
+    public Set<OrganisationUnit> getCurrentUserOrganisationUnits()
+    {
+        User user = getCurrentUser();
+        
+        return user != null ? new HashSet<OrganisationUnit>( user.getOrganisationUnits() ) : new HashSet<OrganisationUnit>();
+    }
     
     @Override
     public boolean currenUserIsAuthorized( String auth )

=== modified file 'dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/organisationunit/OrganisationUnitServiceTest.java'
--- dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/organisationunit/OrganisationUnitServiceTest.java	2015-05-29 15:01:41 +0000
+++ dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/organisationunit/OrganisationUnitServiceTest.java	2015-06-01 19:49:10 +0000
@@ -41,6 +41,7 @@
 import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Set;
 
 import org.hisp.dhis.DhisSpringTest;
 import org.hisp.dhis.user.User;
@@ -981,7 +982,8 @@
         organisationUnitService.addOrganisationUnit( ouG );
 
         User user = createUser( 'A' );
-        user.setOrganisationUnits( Sets.newHashSet( ouB ) );
+        Set<OrganisationUnit> organisationUnits = Sets.newHashSet( ouB );
+        user.setOrganisationUnits( organisationUnits );
 
         assertTrue( user.isInUserHierarchy( ouB ) );
         assertTrue( user.isInUserHierarchy( ouD ) );
@@ -991,5 +993,14 @@
         assertFalse( user.isInUserHierarchy( ouC ) );
         assertFalse( user.isInUserHierarchy( ouF ) );
         assertFalse( user.isInUserHierarchy( ouG ) );
+        
+        assertTrue( organisationUnitService.isInUserHierarchy( ouB.getUid(), organisationUnits ) );
+        assertTrue( organisationUnitService.isInUserHierarchy( ouD.getUid(), organisationUnits ) );
+        assertTrue( organisationUnitService.isInUserHierarchy( ouE.getUid(), organisationUnits ) );
+
+        assertFalse( organisationUnitService.isInUserHierarchy( ouA.getUid(), organisationUnits ) );
+        assertFalse( organisationUnitService.isInUserHierarchy( ouC.getUid(), organisationUnits ) );
+        assertFalse( organisationUnitService.isInUserHierarchy( ouF.getUid(), organisationUnits ) );
+        assertFalse( organisationUnitService.isInUserHierarchy( ouG.getUid(), organisationUnits ) );        
     }
 }

=== modified file 'dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/datavalueset/DefaultDataValueSetService.java'
--- dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/datavalueset/DefaultDataValueSetService.java	2015-05-29 15:24:03 +0000
+++ dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/datavalueset/DefaultDataValueSetService.java	2015-06-01 19:49:10 +0000
@@ -46,6 +46,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.Callable;
 
 import org.amplecode.quick.BatchHandler;
 import org.amplecode.quick.BatchHandlerFactory;
@@ -145,9 +146,16 @@
     @Autowired
     private Notifier notifier;
 
+    // Set methods for test purposes
+    
     public void setBatchHandlerFactory( BatchHandlerFactory batchHandlerFactory )
     {
-        this.batchHandlerFactory = batchHandlerFactory; // Test purpose
+        this.batchHandlerFactory = batchHandlerFactory;
+    }
+
+    public void setCurrentUserService( CurrentUserService currentUserService )
+    {
+        this.currentUserService = currentUserService;
     }
 
     //--------------------------------------------------------------------------
@@ -630,6 +638,7 @@
         CachingMap<String, OrganisationUnit> orgUnitMap = new CachingMap<>();
         CachingMap<String, DataElementCategoryOptionCombo> optionComboMap = new CachingMap<>();
         CachingMap<String, Period> periodMap = new CachingMap<>();
+        CachingMap<String, Boolean> orgUnitInHierarchyMap = new CachingMap<>();
 
         //----------------------------------------------------------------------
         // Load meta-data maps
@@ -708,8 +717,9 @@
             summary.setDataSetComplete( Boolean.FALSE.toString() );
         }
 
-        String currentUser = currentUserService.getCurrentUsername();
-
+        final String currentUser = currentUserService.getCurrentUsername();
+        final Set<OrganisationUnit> currentOrgUnits = currentUserService.getCurrentUserOrganisationUnits();
+        
         BatchHandler<DataValue> batchHandler = batchHandlerFactory.createBatchHandler( DataValueBatchHandler.class ).init();
 
         int importCount = 0;
@@ -733,10 +743,10 @@
 
             totalCount++;
 
-            DataElement dataElement = dataElementMap.get( trimToNull( dataValue.getDataElement() ), dataElementCallable.setId( trimToNull( dataValue.getDataElement() ) ) );
-            Period period = outerPeriod != null ? outerPeriod : 
+            final DataElement dataElement = dataElementMap.get( trimToNull( dataValue.getDataElement() ), dataElementCallable.setId( trimToNull( dataValue.getDataElement() ) ) );
+            final Period period = outerPeriod != null ? outerPeriod : 
                 periodMap.get( trimToNull( dataValue.getPeriod() ), periodCallable.setId( trimToNull( dataValue.getPeriod() ) ) );
-            OrganisationUnit orgUnit = outerOrgUnit != null ? outerOrgUnit : 
+            final OrganisationUnit orgUnit = outerOrgUnit != null ? outerOrgUnit : 
                 orgUnitMap.get( trimToNull( dataValue.getOrgUnit() ), orgUnitCallable.setId( trimToNull( dataValue.getOrgUnit() ) ) );
             DataElementCategoryOptionCombo categoryOptionCombo = optionComboMap.get( trimToNull( dataValue.getCategoryOptionCombo() ), 
                 optionComboCallable.setId( trimToNull( dataValue.getCategoryOptionCombo() ) ) );
@@ -786,6 +796,20 @@
             {
                 attrOptionCombo = fallbackCategoryOptionCombo;
             }
+            
+            boolean inUserHierarchy = orgUnitInHierarchyMap.get( orgUnit.getUid(), new Callable<Boolean>()
+            {
+                public Boolean call() throws Exception
+                {
+                    return organisationUnitService.isInUserHierarchy( orgUnit.getUid(), currentOrgUnits );
+                }
+            } );
+            
+            if ( !inUserHierarchy )
+            {
+                summary.getConflicts().add( new ImportConflict( dataValue.getOrgUnit(), "Organisation unit not in hierarchy of current user: " + currentUser ) );
+                continue;
+            }
 
             if ( dataValue.getValue() == null && dataValue.getComment() == null )
             {

=== modified file 'dhis-2/dhis-services/dhis-service-dxf2/src/test/java/org/hisp/dhis/dxf2/datavalueset/DataValueSetServiceTest.java'
--- dhis-2/dhis-services/dhis-service-dxf2/src/test/java/org/hisp/dhis/dxf2/datavalueset/DataValueSetServiceTest.java	2015-05-28 20:16:59 +0000
+++ dhis-2/dhis-services/dhis-service-dxf2/src/test/java/org/hisp/dhis/dxf2/datavalueset/DataValueSetServiceTest.java	2015-06-01 19:49:10 +0000
@@ -56,6 +56,7 @@
 import org.hisp.dhis.dxf2.importsummary.ImportSummary;
 import org.hisp.dhis.dxf2.common.ImportOptions;
 import org.hisp.dhis.jdbc.batchhandler.DataValueBatchHandler;
+import org.hisp.dhis.mock.MockCurrentUserService;
 import org.hisp.dhis.mock.batchhandler.MockBatchHandler;
 import org.hisp.dhis.mock.batchhandler.MockBatchHandlerFactory;
 import org.hisp.dhis.organisationunit.OrganisationUnit;
@@ -64,10 +65,14 @@
 import org.hisp.dhis.period.Period;
 import org.hisp.dhis.period.PeriodService;
 import org.hisp.dhis.period.PeriodType;
+import org.hisp.dhis.user.CurrentUserService;
+import org.hisp.dhis.user.User;
 import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.io.ClassPathResource;
 
+import com.google.common.collect.Sets;
+
 /**
  * @author Lars Helge Overland
  */
@@ -110,9 +115,12 @@
     private DataSet dsA;
     private OrganisationUnit ouA;
     private OrganisationUnit ouB;
+    private OrganisationUnit ouC;
     private Period peA;
     private Period peB;
     
+    private User user;
+    
     private InputStream in;
 
     private MockBatchHandler<DataValue> mockDataValueBatchHandler = null;
@@ -141,6 +149,7 @@
         dsA = createDataSet( 'A', new MonthlyPeriodType() );
         ouA = createOrganisationUnit( 'A' );
         ouB = createOrganisationUnit( 'B' );
+        ouC = createOrganisationUnit( 'C' );
         peA = createPeriod( PeriodType.getByNameIgnoreCase( MonthlyPeriodType.NAME ), getDate( 2012, 1, 1 ), getDate( 2012, 1, 31 ) );
         peB = createPeriod( PeriodType.getByNameIgnoreCase( MonthlyPeriodType.NAME ), getDate( 2012, 2, 1 ), getDate( 2012, 2, 29 ) );
 
@@ -152,6 +161,7 @@
         dsA.setUid( "pBOMPrpg1QX" );
         ouA.setUid( "DiszpKrYNg8" );
         ouB.setUid( "BdfsJfj87js" );
+        ouC.setUid( "j7Hg26FpoIa" );
 
         ocA.setCode( "OC_A" );
         ocB.setCode( "OC_B" );
@@ -162,6 +172,7 @@
         dsA.setCode( "DS_A" );
         ouA.setCode( "OU_A" );
         ouB.setCode( "OU_B" );
+        ouC.setCode( "OU_C" );
 
         categoryService.addDataElementCategoryOption( categoryOptionA );
         categoryService.addDataElementCategoryOption( categoryOptionB );
@@ -177,8 +188,14 @@
         dataSetService.addDataSet( dsA );
         organisationUnitService.addOrganisationUnit( ouA );
         organisationUnitService.addOrganisationUnit( ouB );
+        organisationUnitService.addOrganisationUnit( ouC );
         periodService.addPeriod( peA );
-        periodService.addPeriod( peB );        
+        periodService.addPeriod( peB );
+        
+        user = createUser( 'A' );
+        user.setOrganisationUnits( Sets.newHashSet( ouA, ouB ) );
+        CurrentUserService currentUserService = new MockCurrentUserService( user );
+        setDependency( dataValueSetService, "currentUserService", currentUserService );
     }
 
     // -------------------------------------------------------------------------
@@ -196,7 +213,7 @@
         assertNotNull( summary );
         assertNotNull( summary.getImportCount() );
         assertEquals( ImportStatus.SUCCESS, summary.getStatus() );
-        assertEquals( 0, summary.getConflicts().size() );
+        assertEquals( summary.getConflicts().toString(), 0, summary.getConflicts().size() );
         
         Collection<DataValue> dataValues = mockDataValueBatchHandler.getInserts();
         
@@ -226,7 +243,7 @@
         assertNotNull( summary );
         assertNotNull( summary.getImportCount() );
         assertEquals( ImportStatus.SUCCESS, summary.getStatus() );
-        assertEquals( 0, summary.getConflicts().size() );
+        assertEquals( summary.getConflicts().toString(), 0, summary.getConflicts().size() );
 
         Collection<DataValue> dataValues = mockDataValueBatchHandler.getInserts();
         
@@ -253,7 +270,7 @@
         
         ImportSummary summary = dataValueSetService.saveDataValueSet( in );
 
-        assertEquals( 0, summary.getConflicts().size() );
+        assertEquals( summary.getConflicts().toString(), 0, summary.getConflicts().size() );
         assertEquals( 12, summary.getImportCount().getImported() );
         assertEquals( 0, summary.getImportCount().getUpdated() );
         assertEquals( 0, summary.getImportCount().getDeleted() );
@@ -272,7 +289,7 @@
         ImportOptions options = new ImportOptions( CODE, CODE, CODE, false, true, NEW_AND_UPDATES, false );
         ImportSummary summary = dataValueSetService.saveDataValueSet( in, options );
 
-        assertEquals( 0, summary.getConflicts().size() );
+        assertEquals( summary.getConflicts().toString(), 0, summary.getConflicts().size() );
         assertEquals( 12, summary.getImportCount().getImported() );
         assertEquals( 0, summary.getImportCount().getUpdated() );
         assertEquals( 0, summary.getImportCount().getDeleted() );
@@ -291,7 +308,7 @@
         ImportOptions options = new ImportOptions( CODE, CODE, CODE, false, false, NEW_AND_UPDATES, false );
         ImportSummary summary = dataValueSetService.saveDataValueSet( in, options );
 
-        assertEquals( 0, summary.getConflicts().size() );
+        assertEquals( summary.getConflicts().toString(), 0, summary.getConflicts().size() );
         assertEquals( 12, summary.getImportCount().getImported() );
         assertEquals( 0, summary.getImportCount().getUpdated() );
         assertEquals( 0, summary.getImportCount().getDeleted() );
@@ -309,7 +326,7 @@
         
         ImportSummary summary = dataValueSetService.saveDataValueSetCsv( in, null, null );
 
-        assertEquals( 1, summary.getConflicts().size() ); // Header row
+        assertEquals( summary.getConflicts().toString(), 1, summary.getConflicts().size() ); // Header row
         assertEquals( 12, summary.getImportCount().getImported() );
         assertEquals( 0, summary.getImportCount().getUpdated() );
         assertEquals( 0, summary.getImportCount().getDeleted() );
@@ -330,7 +347,7 @@
         ImportSummary summary = dataValueSetService.saveDataValueSet( in, options );
 
         assertEquals( ImportStatus.SUCCESS, summary.getStatus() );
-        assertEquals( 0, summary.getConflicts().size() );
+        assertEquals( summary.getConflicts().toString(), 0, summary.getConflicts().size() );
         
         Collection<DataValue> dataValues = mockDataValueBatchHandler.getInserts();
         
@@ -348,7 +365,7 @@
         
         ImportSummary summary = dataValueSetService.saveDataValueSet( in, options );
 
-        assertEquals( 0, summary.getConflicts().size() );
+        assertEquals( summary.getConflicts().toString(), 0, summary.getConflicts().size() );
         assertEquals( 0, summary.getImportCount().getImported() );
         assertEquals( 0, summary.getImportCount().getUpdated() );
         assertEquals( 0, summary.getImportCount().getDeleted() );
@@ -367,7 +384,7 @@
     {
         ImportSummary summary = dataValueSetService.saveDataValueSet( new ClassPathResource( "datavalueset/dataValueSetC.xml" ).getInputStream() );
 
-        assertEquals( 0, summary.getConflicts().size() );
+        assertEquals( summary.getConflicts().toString(), 0, summary.getConflicts().size() );
         assertEquals( 3, summary.getImportCount().getImported() );
         assertEquals( 0, summary.getImportCount().getUpdated() );
         assertEquals( 0, summary.getImportCount().getDeleted() );
@@ -389,7 +406,7 @@
         ImportSummary summary = dataValueSetService.saveDataValueSet( in );
 
         assertEquals( ImportStatus.SUCCESS, summary.getStatus() );
-        assertEquals( 0, summary.getConflicts().size() );
+        assertEquals( summary.getConflicts().toString(), 0, summary.getConflicts().size() );
         
         Collection<DataValue> dataValues = mockDataValueBatchHandler.getInserts();
         
@@ -401,6 +418,24 @@
     }
 
     @Test
+    public void testImportDataValuesWithOrgUnitOutsideHierarchy()
+        throws Exception
+    {
+        in = new ClassPathResource( "datavalueset/dataValueSetE.xml" ).getInputStream();
+        
+        ImportSummary summary = dataValueSetService.saveDataValueSet( in );
+
+        assertEquals( ImportStatus.SUCCESS, summary.getStatus() );
+        assertEquals( summary.getConflicts().toString(), 2, summary.getConflicts().size() );
+        
+        Collection<DataValue> dataValues = mockDataValueBatchHandler.getInserts();
+        
+        assertNotNull( dataValues );
+        assertEquals( 1, dataValues.size() );
+        assertTrue( dataValues.contains( new DataValue( deA, peA, ouA, ocDef, ocA ) ) );
+    }
+
+    @Test
     public void testImportDataValuesWithInvalidAttributeOptionCombo()
         throws Exception
     {
@@ -425,7 +460,7 @@
         
         ImportSummary summary = dataValueSetService.saveDataValueSet( in );
         
-        assertEquals( 2, summary.getConflicts().size() );
+        assertEquals( summary.getConflicts().toString(), 2, summary.getConflicts().size() );
         assertEquals( 1, summary.getImportCount().getImported() );
         assertEquals( 0, summary.getImportCount().getUpdated() );
         assertEquals( 0, summary.getImportCount().getDeleted() );

=== modified file 'dhis-2/dhis-services/dhis-service-dxf2/src/test/resources/datavalueset/dataValueSetE.xml'
--- dhis-2/dhis-services/dhis-service-dxf2/src/test/resources/datavalueset/dataValueSetE.xml	2014-11-19 19:11:32 +0000
+++ dhis-2/dhis-services/dhis-service-dxf2/src/test/resources/datavalueset/dataValueSetE.xml	2015-06-01 19:49:10 +0000
@@ -1,6 +1,5 @@
 <dataValueSet xmlns="http://dhis2.org/schema/dxf/2.0"; dataSet="pBOMPrpg1QX" completeDate="2012-01-09" attributeOptionCombo="kjuiHgy67hg">
     <dataValue dataElement="f7n9E0hX8qk" period="201201" orgUnit="DiszpKrYNg8" value="10001" storedBy="john" timestamp="2012-01-01" comment="comment" followup="false"/>
-    <dataValue dataElement="Ix2HsbDMLea" period="201201" orgUnit="DiszpKrYNg8" value="10002" storedBy="john" timestamp="2012-01-02" comment="comment" followup="false"/>
-    <dataValue dataElement="f7n9E0hX8qk" period="201201" orgUnit="DiszpKrYNg8" value="10004" storedBy="john" timestamp="2012-01-01" comment="comment" followup="false"/> 
-    <dataValue dataElement="eY5ehpbEsB7" period="201201" orgUnit="DiszpKrYNg8" value="10003" storedBy="john" timestamp="2012-01-03" comment="comment" followup="false"/>
+    <dataValue dataElement="Ix2HsbDMLea" period="201201" orgUnit="j7Hg26FpoIa" value="10002" storedBy="john" timestamp="2012-01-02" comment="comment" followup="false"/>
+    <dataValue dataElement="eY5ehpbEsB7" period="201201" orgUnit="j7Hg26FpoIa" value="10004" storedBy="john" timestamp="2012-01-01" comment="comment" followup="false"/>
 </dataValueSet>
\ No newline at end of file

=== modified file 'dhis-2/dhis-support/dhis-support-test/src/main/java/org/hisp/dhis/mock/MockCurrentUserService.java'
--- dhis-2/dhis-support/dhis-support-test/src/main/java/org/hisp/dhis/mock/MockCurrentUserService.java	2015-04-15 11:58:48 +0000
+++ dhis-2/dhis-support/dhis-support-test/src/main/java/org/hisp/dhis/mock/MockCurrentUserService.java	2015-06-01 19:49:10 +0000
@@ -29,6 +29,7 @@
  */
 
 import java.util.Arrays;
+import java.util.HashSet;
 import java.util.Set;
 
 import org.hisp.dhis.organisationunit.OrganisationUnit;
@@ -89,6 +90,12 @@
     }
 
     @Override
+    public Set<OrganisationUnit> getCurrentUserOrganisationUnits()
+    {
+        return currentUser != null ? currentUser.getOrganisationUnits() : new HashSet<OrganisationUnit>();
+    }
+
+    @Override
     public boolean currentUserIsSuper()
     {
         return superUserFlag;