=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataentryform/DataEntryFormService.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataentryform/DataEntryFormService.java 2012-09-16 14:44:45 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataentryform/DataEntryFormService.java 2012-10-10 18:17:25 +0000 @@ -33,6 +33,7 @@ import java.util.regex.Pattern; import org.hisp.dhis.dataelement.DataElement; +import org.hisp.dhis.dataelement.DataElementOperand; import org.hisp.dhis.dataset.DataSet; import org.hisp.dhis.i18n.I18n; @@ -145,6 +146,8 @@ Set getDataElementsInDataEntryForm( DataSet dataSet ); + Set getOperandsInDataEntryForm( DataSet dataSet ); + Collection listDisctinctDataEntryFormByProgramStageIds( List programStageIds ); Collection listDisctinctDataEntryFormByDataSetIds( List dataSetIds ); === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/period/MonthlyPeriodType.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/period/MonthlyPeriodType.java 2012-10-10 10:12:33 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/period/MonthlyPeriodType.java 2012-10-10 18:17:25 +0000 @@ -172,24 +172,24 @@ @Override public Period createPeriod( String isoDate ) { - Date date = null; - try - { - date = new SimpleDateFormat( ISO_FORMAT ).parse( isoDate ); - return createPeriod( date ); - } - catch ( ParseException ex1 ) - { - // if at first you don't succeed ... try again - try - { - date = new SimpleDateFormat( ALTERNATIVE_ISO_FORMAT ).parse( isoDate ); - return createPeriod( date ); - } - catch ( ParseException ex2 ) - { - throw new RuntimeException( ex2 ); - } + try + { + Date date = new SimpleDateFormat( ISO_FORMAT ).parse( isoDate ); + return createPeriod( date ); + } + catch ( ParseException ex ) + { + // Ignore and try alternative format + } + + try + { + Date date = new SimpleDateFormat( ALTERNATIVE_ISO_FORMAT ).parse( isoDate ); + return createPeriod( date ); + } + catch ( ParseException ex ) + { + throw new RuntimeException( ex ); } } === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataentryform/DefaultDataEntryFormService.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataentryform/DefaultDataEntryFormService.java 2012-09-18 09:17:06 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataentryform/DefaultDataEntryFormService.java 2012-10-10 18:17:25 +0000 @@ -41,6 +41,7 @@ import org.hisp.dhis.dataelement.DataElementCategoryCombo; import org.hisp.dhis.dataelement.DataElementCategoryOptionCombo; import org.hisp.dhis.dataelement.DataElementCategoryService; +import org.hisp.dhis.dataelement.DataElementOperand; import org.hisp.dhis.dataelement.DataElementService; import org.hisp.dhis.dataset.DataSet; import org.hisp.dhis.i18n.I18n; @@ -397,6 +398,37 @@ return dataElements; } + + public Set getOperandsInDataEntryForm( DataSet dataSet ) + { + if ( dataSet == null || dataSet.getDataEntryForm() == null ) + { + return null; + } + + Set operands = new HashSet(); + + Matcher inputMatcher = INPUT_PATTERN.matcher( dataSet.getDataEntryForm().getHtmlCode() ); + + while ( inputMatcher.find() ) + { + String inputHtml = inputMatcher.group(); + + Matcher identifierMatcher = IDENTIFIER_PATTERN.matcher( inputHtml ); + + if ( identifierMatcher.find() && identifierMatcher.groupCount() > 0 ) + { + int dataElementId = Integer.parseInt( identifierMatcher.group( 1 ) ); + int categoryOptionComboId = Integer.parseInt( identifierMatcher.group( 2 ) ); + + DataElementOperand operand = new DataElementOperand( dataElementId, categoryOptionComboId ); + + operands.add( operand ); + } + } + + return operands; + } public Collection listDisctinctDataEntryFormByProgramStageIds( List programStageIds ) { === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/validation/DefaultValidationRuleService.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/validation/DefaultValidationRuleService.java 2012-09-22 21:59:39 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/validation/DefaultValidationRuleService.java 2012-10-10 18:17:25 +0000 @@ -33,7 +33,8 @@ import static org.hisp.dhis.i18n.I18nUtils.getObjectsByName; import static org.hisp.dhis.i18n.I18nUtils.i18n; import static org.hisp.dhis.system.util.MathUtils.expressionIsTrue; -import static org.hisp.dhis.system.util.MathUtils.*; +import static org.hisp.dhis.system.util.MathUtils.getRounded; +import static org.hisp.dhis.system.util.MathUtils.zeroIfNull; import java.util.Collection; import java.util.Date; @@ -45,6 +46,7 @@ import org.hisp.dhis.constant.ConstantService; import org.hisp.dhis.dataelement.DataElement; import org.hisp.dhis.dataelement.DataElementOperand; +import org.hisp.dhis.dataentryform.DataEntryFormService; import org.hisp.dhis.dataset.DataSet; import org.hisp.dhis.datavalue.DataValueService; import org.hisp.dhis.expression.ExpressionService; @@ -92,6 +94,13 @@ { this.expressionService = expressionService; } + + private DataEntryFormService dataEntryFormService; + + public void setDataEntryFormService( DataEntryFormService dataEntryFormService ) + { + this.dataEntryFormService = dataEntryFormService; + } private PeriodService periodService; @@ -206,7 +215,16 @@ { Map constantMap = constantService.getConstantMap(); - Collection relevantRules = getRelevantValidationRules( dataSet.getDataElements() ); + Collection relevantRules = null; + + if ( DataSet.TYPE_CUSTOM.equals( dataSet.getDataSetType() ) ) + { + relevantRules = getRelevantValidationRules( dataSet ); + } + else + { + relevantRules = getRelevantValidationRules( dataSet.getDataElements() ); + } Set dataElements = getDataElementsInValidationRules( relevantRules ); @@ -318,6 +336,29 @@ return relevantValidationRules; } + + public Collection getRelevantValidationRules( DataSet dataSet ) + { + Set relevantValidationRules = new HashSet(); + + Set operands = dataEntryFormService.getOperandsInDataEntryForm( dataSet ); + + Set validationRuleOperands = new HashSet(); + + for ( ValidationRule validationRule : getAllValidationRules() ) + { + validationRuleOperands.clear(); + validationRuleOperands.addAll( expressionService.getOperandsInExpression( validationRule.getLeftSide().getExpression() ) ); + validationRuleOperands.addAll( expressionService.getOperandsInExpression( validationRule.getRightSide().getExpression() ) ); + + if ( operands.containsAll( validationRuleOperands ) ) + { + relevantValidationRules.add( validationRule ); + } + } + + return relevantValidationRules; + } /** * Returns all validation rules referred to in the left and right side expressions === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/resources/META-INF/dhis/beans.xml' --- dhis-2/dhis-services/dhis-service-core/src/main/resources/META-INF/dhis/beans.xml 2012-09-27 17:19:33 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/resources/META-INF/dhis/beans.xml 2012-10-10 18:17:25 +0000 @@ -364,6 +364,7 @@ + === modified file 'dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/dataentryform/DataEntryFormServiceTest.java' --- dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/dataentryform/DataEntryFormServiceTest.java 2011-12-26 10:07:59 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/dataentryform/DataEntryFormServiceTest.java 2012-10-10 18:17:25 +0000 @@ -34,11 +34,13 @@ import java.util.Collection; import java.util.List; +import java.util.Set; import org.hisp.dhis.DhisSpringTest; import org.hisp.dhis.dataelement.DataElement; import org.hisp.dhis.dataelement.DataElementCategoryOptionCombo; import org.hisp.dhis.dataelement.DataElementCategoryService; +import org.hisp.dhis.dataelement.DataElementOperand; import org.hisp.dhis.dataelement.DataElementService; import org.hisp.dhis.dataset.DataSet; import org.hisp.dhis.dataset.DataSetService; @@ -243,12 +245,28 @@ assertEquals( dataSets.size(), 2 ); } + + @Test + public void testGetOperands() + { + String html = "
"; + DataEntryForm dataEntryForm = new DataEntryForm( "FormA", html ); + DataSet dataSet = createDataSet( 'A', new MonthlyPeriodType() ); + dataSet.setDataEntryForm( dataEntryForm ); + + Set operands = dataEntryFormService.getOperandsInDataEntryForm( dataSet ); + + DataElementOperand operand = new DataElementOperand( 1434, 11 ); + + assertEquals( 1, operands.size() ); + assertTrue( operands.contains( operand ) ); + } @Test public void testPrepareForSave() { - String html = "
"; - String expected = "
"; + String html = "
"; + String expected = "
"; String actual = dataEntryFormService.prepareDataEntryFormForSave( html ); assertEquals( expected, actual ); === modified file 'dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/MetaDataController.java' --- dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/MetaDataController.java 2012-09-26 08:46:31 +0000 +++ dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/MetaDataController.java 2012-10-10 18:17:25 +0000 @@ -38,7 +38,6 @@ import org.hisp.dhis.system.scheduling.Scheduler; import org.hisp.dhis.user.CurrentUserService; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.MediaType; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.stereotype.Controller; import org.springframework.ui.Model;