=== modified file 'dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/common/ImportOptions.java' --- dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/common/ImportOptions.java 2015-08-31 07:11:10 +0000 +++ dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/common/ImportOptions.java 2015-08-31 07:39:12 +0000 @@ -74,6 +74,10 @@ private boolean strictAttributeOptionCombos; + private boolean requireCategoryOptionCombo; + + private boolean requireAttributeOptionCombo; + //-------------------------------------------------------------------------- // Constructors //-------------------------------------------------------------------------- @@ -172,6 +176,16 @@ return strictAttributeOptionCombos; } + public boolean isRequireCategoryOptionCombo() + { + return requireCategoryOptionCombo; + } + + public boolean isRequireAttributeOptionCombo() + { + return requireAttributeOptionCombo; + } + //-------------------------------------------------------------------------- // Set methods //-------------------------------------------------------------------------- @@ -254,6 +268,18 @@ return this; } + public ImportOptions setRequireCategoryOptionCombo( boolean requireCategoryOptionCombo ) + { + this.requireCategoryOptionCombo = requireCategoryOptionCombo; + return this; + } + + public ImportOptions setRequireAttributeOptionCombo( boolean requireAttributeOptionCombo ) + { + this.requireAttributeOptionCombo = requireAttributeOptionCombo; + return this; + } + @Override public String toString() { @@ -270,6 +296,8 @@ add( "Strict periods", strictPeriods ). add( "Strict category option combos", strictCategoryOptionCombos ). add( "Strict attr option combos", strictAttributeOptionCombos ). + add( "Require category option combo", requireCategoryOptionCombo ). + add( "Require attribute option combo", requireAttributeOptionCombo ). toString(); } } === 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-08-31 07:11:10 +0000 +++ dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/datavalueset/DefaultDataValueSetService.java 2015-08-31 07:39:12 +0000 @@ -579,6 +579,8 @@ boolean strictPeriods = importOptions.isStrictPeriods() || (Boolean) systemSettingManager.getSystemSetting( KEY_DATA_IMPORT_STRICT_PERIODS, false ); boolean strictCategoryOptionCombos = importOptions.isStrictCategoryOptionCombos() || (Boolean) systemSettingManager.getSystemSetting( KEY_DATA_IMPORT_STRICT_CATEGORY_OPTION_COMBOS, false ); boolean strictAttrOptionCombos = importOptions.isStrictAttributeOptionCombos() || (Boolean) systemSettingManager.getSystemSetting( KEY_DATA_IMPORT_STRICT_ATTRIBUTE_OPTION_COMBOS, false ); + boolean requireCategoryOptionCombo = importOptions.isRequireCategoryOptionCombo() || (Boolean) systemSettingManager.getSystemSetting( KEY_DATA_IMPORT_REQUIRE_CATEGORY_OPTION_COMBO, false ); + boolean requireAttrOptionCombo = importOptions.isRequireAttributeOptionCombo() || (Boolean) systemSettingManager.getSystemSetting( KEY_DATA_IMPORT_REQUIRE_ATTRIBUTE_OPTION_COMBO, false ); //---------------------------------------------------------------------- // Create meta-data maps @@ -743,16 +745,6 @@ continue; } - if ( categoryOptionCombo == null ) - { - categoryOptionCombo = fallbackCategoryOptionCombo; - } - - if ( attrOptionCombo == null ) - { - attrOptionCombo = fallbackCategoryOptionCombo; - } - boolean inUserHierarchy = orgUnitInHierarchyMap.get( orgUnit.getUid(), () -> organisationUnitService.isInUserHierarchy( orgUnit.getUid(), currentOrgUnits ) ); @@ -787,6 +779,32 @@ // Constraints // ----------------------------------------------------------------- + if ( categoryOptionCombo == null ) + { + if ( requireCategoryOptionCombo ) + { + summary.getConflicts().add( new ImportConflict( dataValue.getValue(), "Category option combo is required but is not specified" ) ); + continue; + } + else + { + categoryOptionCombo = fallbackCategoryOptionCombo; + } + } + + if ( attrOptionCombo == null ) + { + if ( requireAttrOptionCombo ) + { + summary.getConflicts().add( new ImportConflict( dataValue.getValue(), "Attribute option combo is required but is not specified" ) ); + continue; + } + else + { + attrOptionCombo = fallbackCategoryOptionCombo; + } + } + if ( strictPeriods && !dataElementPeriodTypesMap.get( dataValue.getDataElement(), () -> dataElement.getPeriodTypes() ).contains( period.getPeriodType() ) ) { === 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-08-30 18:24:11 +0000 +++ dhis-2/dhis-services/dhis-service-dxf2/src/test/java/org/hisp/dhis/dxf2/datavalueset/DataValueSetServiceTest.java 2015-08-31 07:39:12 +0000 @@ -535,6 +535,42 @@ assertEquals( ImportStatus.SUCCESS, summary.getStatus() ); } + @Test + public void testImportDataValuesWithRequiredCategoryOptionCombo() + throws Exception + { + in = new ClassPathResource( "datavalueset/dataValueSetNonStrict.xml" ).getInputStream(); + + ImportOptions options = new ImportOptions().setRequireCategoryOptionCombo( true ); + + ImportSummary summary = dataValueSetService.saveDataValueSet( in, options ); + + assertEquals( summary.getConflicts().toString(), 2, summary.getConflicts().size() ); + assertEquals( 1, summary.getImportCount().getImported() ); + assertEquals( 0, summary.getImportCount().getUpdated() ); + assertEquals( 0, summary.getImportCount().getDeleted() ); + assertEquals( 2, summary.getImportCount().getIgnored() ); + assertEquals( ImportStatus.SUCCESS, summary.getStatus() ); + } + + @Test + public void testImportDataValuesWithRequiredAttributeOptionCombo() + throws Exception + { + in = new ClassPathResource( "datavalueset/dataValueSetNonStrict.xml" ).getInputStream(); + + ImportOptions options = new ImportOptions().setRequireAttributeOptionCombo( true ); + + ImportSummary summary = dataValueSetService.saveDataValueSet( in, options ); + + assertEquals( summary.getConflicts().toString(), 2, summary.getConflicts().size() ); + assertEquals( 1, summary.getImportCount().getImported() ); + assertEquals( 0, summary.getImportCount().getUpdated() ); + assertEquals( 0, summary.getImportCount().getDeleted() ); + assertEquals( 2, summary.getImportCount().getIgnored() ); + assertEquals( ImportStatus.SUCCESS, summary.getStatus() ); + } + // ------------------------------------------------------------------------- // Supportive methods // -------------------------------------------------------------------------