=== 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 2014-12-08 21:01:08 +0000 +++ dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/datavalueset/DefaultDataValueSetService.java 2014-12-09 07:25:53 +0000 @@ -635,7 +635,7 @@ Period outerPeriod = PeriodType.getPeriodFromIsoString( trimToNull( dataValueSet.getPeriod() ) ); - OrganisationUnit outerOrgUnit; + OrganisationUnit outerOrgUnit = null; DataElementCategoryOptionCombo fallbackCategoryOptionCombo = categoryService.getDefaultDataElementCategoryOptionCombo(); @@ -651,6 +651,36 @@ DataElementCategoryOptionCombo outerAttrOptionCombo = dataValueSet.getAttributeOptionCombo() != null ? identifiableObjectManager.getObject( DataElementCategoryOptionCombo.class, idScheme, trimToNull( dataValueSet.getAttributeOptionCombo() ) ) : null; + // --------------------------------------------------------------------- + // Validation + // --------------------------------------------------------------------- + + if ( dataSet == null && trimToNull( dataValueSet.getDataSet() ) != null ) + { + summary.getConflicts().add( new ImportConflict( dataValueSet.getDataSet(), "Data set not found or not accessible" ) ); + summary.setStatus( ImportStatus.ERROR ); + } + + if ( outerOrgUnit == null && trimToNull( dataValueSet.getOrgUnit() ) != null ) + { + summary.getConflicts().add( new ImportConflict( dataValueSet.getDataSet(), "Org unit not found or not accessible" ) ); + summary.setStatus( ImportStatus.ERROR ); + } + + if ( outerAttrOptionCombo == null && trimToNull( dataValueSet.getAttributeOptionCombo() ) != null ) + { + summary.getConflicts().add( new ImportConflict( dataValueSet.getDataSet(), "Attribute option combo not found or not accessible" ) ); + summary.setStatus( ImportStatus.ERROR ); + } + + if ( ImportStatus.ERROR.equals( summary.getStatus() ) ) + { + summary.setDescription( "Import process was aborted" ); + notifier.notify( id, INFO, "Import process aborted", true ).addTaskSummary( id, summary ); + dataValueSet.close(); + return summary; + } + if ( dataSet != null && completeDate != null ) { notifier.notify( id, "Completing data set" ); @@ -693,6 +723,10 @@ DataElementCategoryOptionCombo attrOptionCombo = outerAttrOptionCombo != null ? outerAttrOptionCombo : categoryOptionComboMap.get( trimToNull( dataValue.getAttributeOptionCombo() ) ); + // ----------------------------------------------------------------- + // Validation + // ----------------------------------------------------------------- + if ( dataElement == null ) { summary.getConflicts().add( new ImportConflict( dataValue.getDataElement(), "Data element not found or not acccessible" ) ); @@ -792,7 +826,11 @@ summary.getConflicts().add( new ImportConflict( internalValue.getValue(), "Value is zero and not significant" ) ); continue; } - + + // ----------------------------------------------------------------- + // Save, update or delete data value + // ----------------------------------------------------------------- + if ( !skipExistingCheck && batchHandler.objectExists( internalValue ) ) { if ( strategy.isCreateAndUpdate() || strategy.isUpdate() ) === 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 2014-10-15 18:59:11 +0000 +++ dhis-2/dhis-services/dhis-service-dxf2/src/test/java/org/hisp/dhis/dxf2/datavalueset/DataValueSetServiceTest.java 2014-12-09 07:25:53 +0000 @@ -52,6 +52,7 @@ import org.hisp.dhis.dataset.DataSet; import org.hisp.dhis.dataset.DataSetService; import org.hisp.dhis.datavalue.DataValue; +import org.hisp.dhis.dxf2.importsummary.ImportStatus; import org.hisp.dhis.dxf2.importsummary.ImportSummary; import org.hisp.dhis.dxf2.metadata.ImportOptions; import org.hisp.dhis.jdbc.batchhandler.DataValueBatchHandler; @@ -194,6 +195,7 @@ assertNotNull( summary ); assertNotNull( summary.getDataValueCount() ); + assertEquals( ImportStatus.SUCCESS, summary.getStatus() ); Collection dataValues = mockDataValueBatchHandler.getInserts(); @@ -222,6 +224,7 @@ assertNotNull( summary ); assertNotNull( summary.getDataValueCount() ); + assertEquals( ImportStatus.SUCCESS, summary.getStatus() ); Collection dataValues = mockDataValueBatchHandler.getInserts(); @@ -247,6 +250,8 @@ in = new ClassPathResource( "datavalueset/dataValueSetB.xml" ).getInputStream(); ImportSummary summary = dataValueSetService.saveDataValueSet( in ); + + assertEquals( ImportStatus.SUCCESS, summary.getStatus() ); assertImportDataValues( summary ); } @@ -259,6 +264,8 @@ ImportOptions options = new ImportOptions( CODE, CODE, false, true, NEW_AND_UPDATES, false ); ImportSummary summary = dataValueSetService.saveDataValueSet( in, options ); + + assertEquals( ImportStatus.SUCCESS, summary.getStatus() ); assertImportDataValues( summary ); } @@ -270,6 +277,8 @@ in = new ClassPathResource( "datavalueset/dataValueSetB.csv" ).getInputStream(); ImportSummary summary = dataValueSetService.saveDataValueSetCsv( in, null, null ); + + assertEquals( ImportStatus.SUCCESS, summary.getStatus() ); assertImportDataValues( summary ); } @@ -282,8 +291,10 @@ ImportOptions options = new ImportOptions( UID, UID, true, true, NEW_AND_UPDATES, false ); - dataValueSetService.saveDataValueSet( in, options ); + ImportSummary summary = dataValueSetService.saveDataValueSet( in, options ); + assertEquals( ImportStatus.SUCCESS, summary.getStatus() ); + Collection dataValues = mockDataValueBatchHandler.getInserts(); assertNotNull( dataValues ); @@ -298,8 +309,10 @@ ImportOptions options = new ImportOptions( UID, UID, false, true, UPDATES, false ); - dataValueSetService.saveDataValueSet( in, options ); + ImportSummary summary = dataValueSetService.saveDataValueSet( in, options ); + assertEquals( ImportStatus.SUCCESS, summary.getStatus() ); + Collection dataValues = mockDataValueBatchHandler.getInserts(); assertNotNull( dataValues ); @@ -310,8 +323,10 @@ public void testImportDataValuesWithNewPeriod() throws Exception { - dataValueSetService.saveDataValueSet( new ClassPathResource( "datavalueset/dataValueSetC.xml" ).getInputStream() ); + ImportSummary summary = dataValueSetService.saveDataValueSet( new ClassPathResource( "datavalueset/dataValueSetC.xml" ).getInputStream() ); + assertEquals( ImportStatus.SUCCESS, summary.getStatus() ); + Collection dataValues = mockDataValueBatchHandler.getInserts(); assertNotNull( dataValues ); @@ -324,8 +339,10 @@ { in = new ClassPathResource( "datavalueset/dataValueSetD.xml" ).getInputStream(); - dataValueSetService.saveDataValueSet( in ); + ImportSummary summary = dataValueSetService.saveDataValueSet( in ); + assertEquals( ImportStatus.SUCCESS, summary.getStatus() ); + Collection dataValues = mockDataValueBatchHandler.getInserts(); assertNotNull( dataValues ); @@ -335,6 +352,21 @@ assertTrue( dataValues.contains( new DataValue( deC, peA, ouA, ocDef, ocA ) ) ); } + @Test + public void testImportDataValuesWithInvalidAttributeOptionCombo() + throws Exception + { + in = new ClassPathResource( "datavalueset/dataValueSetF.xml" ).getInputStream(); + + ImportSummary summary = dataValueSetService.saveDataValueSet( in ); + + Collection dataValues = mockDataValueBatchHandler.getInserts(); + + assertNotNull( dataValues ); + assertEquals( 0, dataValues.size() ); + assertEquals( ImportStatus.ERROR, summary.getStatus() ); + } + // ------------------------------------------------------------------------- // Supportive methods // ------------------------------------------------------------------------- === added file 'dhis-2/dhis-services/dhis-service-dxf2/src/test/resources/datavalueset/dataValueSetF.xml' --- dhis-2/dhis-services/dhis-service-dxf2/src/test/resources/datavalueset/dataValueSetF.xml 1970-01-01 00:00:00 +0000 +++ dhis-2/dhis-services/dhis-service-dxf2/src/test/resources/datavalueset/dataValueSetF.xml 2014-12-09 07:25:53 +0000 @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file === modified file 'dhis-2/dhis-web/dhis-web-commons/src/main/resources/META-INF/dhis/security.xml' --- dhis-2/dhis-web/dhis-web-commons/src/main/resources/META-INF/dhis/security.xml 2014-12-04 15:32:30 +0000 +++ dhis-2/dhis-web/dhis-web-commons/src/main/resources/META-INF/dhis/security.xml 2014-12-09 07:25:53 +0000 @@ -308,8 +308,6 @@ F_REPORTTABLE_EXTERNAL F_METADATA_EXPORT F_METADATA_IMPORT - F_METADATA_SUBSET_IMPORT - F_METADATA_SUBSET_EXPORT F_APPROVE_DATA F_APPROVE_DATA_LOWER_LEVELS F_ACCEPT_DATA_LOWER_LEVELS === modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/resources/org/hisp/dhis/user/i18n_module.properties' --- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/resources/org/hisp/dhis/user/i18n_module.properties 2014-12-08 19:51:34 +0000 +++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/resources/org/hisp/dhis/user/i18n_module.properties 2014-12-09 07:25:53 +0000 @@ -259,8 +259,6 @@ F_IMPORT_GML=Import GML F_EXPORT_DATA=Export data F_EXPORT_EVENTS=Export events -F_METADATA_SUBSET_IMPORT=Import sub-set of meta-data -F_METADATA_SUBSET_EXPORT=Export sub-set of meta-data F_METADATA_IMPORT=Import meta-Data F_METADATA_EXPORT=Export meta-Data F_APPROVE_DATA=Approve data