=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/ProgramDataEntryService.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/ProgramDataEntryService.java 2011-05-27 01:09:01 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/ProgramDataEntryService.java 2011-05-27 04:02:40 +0000 @@ -28,7 +28,9 @@ package org.hisp.dhis.program; import java.util.Collection; +import java.util.regex.Pattern; +import org.hisp.dhis.dataelement.DataElement; import org.hisp.dhis.i18n.I18n; import org.hisp.dhis.organisationunit.OrganisationUnit; import org.hisp.dhis.patientdatavalue.PatientDataValue; @@ -40,7 +42,18 @@ */ public interface ProgramDataEntryService { + final Pattern INPUT_PATTERN = Pattern.compile( "(", Pattern.DOTALL ); + final Pattern SELECT_PATTERN = Pattern.compile( "(", Pattern.DOTALL ); + final Pattern IDENTIFIER_PATTERN_TEXTBOX = Pattern.compile( "\"value\\[([\\p{Digit}.]*)\\].value:value\\[([\\p{Digit}.]*)\\].value:value\\[([\\p{Digit}.]*)\\].value\"" ); + final Pattern IDENTIFIER_PATTERN_OTHERS = Pattern.compile( "\"value\\[([\\p{Digit}.]*)\\].\\S+:value\\[([\\p{Digit}.]*)\\].\\S+\"" ); + + //-------------------------------------------------------------------------- + // ProgramDataEntryService + //-------------------------------------------------------------------------- + String prepareDataEntryFormForEntry( String htmlCode, Collection dataValues, String disabled, I18n i18n, ProgramStage programStage, ProgramStageInstance programStageInstance, OrganisationUnit organisationUnit ); + + String prepareDataEntryFormForEdit( String htmlCode, Collection dataElements ); } === modified file 'dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/program/DefaultProgramDataEntryService.java' --- dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/program/DefaultProgramDataEntryService.java 2011-05-27 01:09:01 +0000 +++ dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/program/DefaultProgramDataEntryService.java 2011-05-27 04:02:40 +0000 @@ -35,6 +35,8 @@ import org.apache.commons.lang.BooleanUtils; import org.hisp.dhis.dataelement.DataElement; +import org.hisp.dhis.dataelement.DataElementCategoryOptionCombo; +import org.hisp.dhis.dataelement.DataElementCategoryService; import org.hisp.dhis.dataelement.DataElementService; import org.hisp.dhis.i18n.I18n; import org.hisp.dhis.organisationunit.OrganisationUnit; @@ -54,6 +56,8 @@ private static final String UNKNOW_CLINIC = "unknow_clinic"; private static final String NOTAVAILABLE = "not_available"; + + private static final String DATA_ELEMENT_DOES_NOT_EXIST = "Data element doesn't exist."; // ------------------------------------------------------------------------- // Dependencies @@ -94,10 +98,17 @@ this.programStageDataElementService = programStageDataElementService; } + private DataElementCategoryService categoryService; + + public void setCategoryService( DataElementCategoryService categoryService ) + { + this.categoryService = categoryService; + } + // ------------------------------------------------------------------------- // Implementation methods // ------------------------------------------------------------------------- - + @Override public String prepareDataEntryFormForEntry( String htmlCode, Collection dataValues, String disabled, I18n i18n, ProgramStage programStage, ProgramStageInstance programStageInstance, @@ -107,30 +118,210 @@ String result = ""; - result = populateCustomDataEntryForTextBox( htmlCode, dataValues, disabled, i18n, - programStage, programStageInstance, organisationUnit, mapDataValue ); - - result = populateCustomDataEntryForBoolean( result, dataValues, disabled, i18n, - programStage, programStageInstance, organisationUnit, mapDataValue ); - - result = populateCustomDataEntryForMutiDimentionalString( result, dataValues, - disabled, i18n, programStage, programStageInstance, organisationUnit, mapDataValue ); - - result = populateCustomDataEntryForDate( result, dataValues, disabled, i18n, - programStage, programStageInstance, organisationUnit, mapDataValue ); + result = populateCustomDataEntryForTextBox( htmlCode, dataValues, disabled, i18n, programStage, + programStageInstance, organisationUnit, mapDataValue ); + + result = populateCustomDataEntryForBoolean( result, dataValues, disabled, i18n, programStage, + programStageInstance, organisationUnit, mapDataValue ); + + result = populateCustomDataEntryForMutiDimentionalString( result, dataValues, disabled, i18n, programStage, + programStageInstance, organisationUnit, mapDataValue ); + + result = populateCustomDataEntryForDate( result, dataValues, disabled, i18n, programStage, + programStageInstance, organisationUnit, mapDataValue ); result = populateI18nStrings( result, i18n ); return result; } + public String prepareDataEntryFormForEdit( String htmlCode , Collection dataElements ) + { + String result = populateCustomDataEntryForTextBox( htmlCode, dataElements ); + + result = populateCustomDataEntryForCombo( htmlCode, dataElements ); + + result = populateCustomDataEntryForDate( htmlCode, dataElements ); + + return result; + } + // ------------------------------------------------------------------------- // Supportive methods // ------------------------------------------------------------------------- + private String populateCustomDataEntryForTextBox( String htmlCode , Collection dataElements ) + { + // --------------------------------------------------------------------- + // Metadata code to add to HTML before outputting + // --------------------------------------------------------------------- + + StringBuffer sb = new StringBuffer(); + + // --------------------------------------------------------------------- + // Pattern to match data elements in the HTML code + // --------------------------------------------------------------------- + + Matcher inputMatcher = INPUT_PATTERN.matcher( htmlCode ); + + // --------------------------------------------------------------------- + // Iterate through all matching data element fields + // --------------------------------------------------------------------- + + while ( inputMatcher.find() ) + { + // ----------------------------------------------------------------- + // Get HTML input field code + // ----------------------------------------------------------------- + + String dataElementCode = inputMatcher.group( 1 ); + + String inputHTML = inputMatcher.group(); + + Matcher identifierMatcher = IDENTIFIER_PATTERN_TEXTBOX.matcher( dataElementCode ); + + if ( identifierMatcher.find() && identifierMatcher.groupCount() > 0 ) + { + + // ------------------------------------------------------------- + // Get data element ID of data element + // ------------------------------------------------------------- + + int dataElementId = Integer.parseInt( identifierMatcher.group( 2 ) ); + + int optionComboId = Integer.parseInt( identifierMatcher.group( 3 ) ); + + DataElement dataElement = dataElementService.getDataElement( dataElementId ); + + DataElementCategoryOptionCombo optionCombo = categoryService + .getDataElementCategoryOptionCombo( optionComboId ); + + if ( !dataElements.contains( dataElement ) || optionCombo == null ) + { + inputMatcher.appendReplacement( sb, DATA_ELEMENT_DOES_NOT_EXIST ); + } + else + { + inputMatcher.appendReplacement( sb, inputHTML ); + } + + } + } + + return sb.toString(); + } + + private String populateCustomDataEntryForCombo( String htmlCode, Collection dataElements) + { + // --------------------------------------------------------------------- + // Metadata code to add to HTML before outputting + // --------------------------------------------------------------------- + + StringBuffer sb = new StringBuffer(); + + // --------------------------------------------------------------------- + // Pattern to match data elements in the HTML code + // --------------------------------------------------------------------- + + Matcher inputMatcher = SELECT_PATTERN.matcher( htmlCode ); + + // --------------------------------------------------------------------- + // Iterate through all matching data element fields + // --------------------------------------------------------------------- + + while ( inputMatcher.find() ) + { + String inputHTML = inputMatcher.group(); + + // ----------------------------------------------------------------- + // Get HTML input field code + // ----------------------------------------------------------------- + + String dataElementCode = inputMatcher.group( 1 ); + + Matcher identifierMatcher = IDENTIFIER_PATTERN_OTHERS.matcher( dataElementCode ); + + if ( identifierMatcher.find() && identifierMatcher.groupCount() > 0 ) + { + // ------------------------------------------------------------- + // Get data element ID of data element + // ------------------------------------------------------------- + + int dataElementId = Integer.parseInt( identifierMatcher.group( 2 ) ); + + DataElement dataElement = dataElementService.getDataElement( dataElementId ); + + if ( !dataElements.contains( dataElement ) ) + { + inputMatcher.appendReplacement( sb, DATA_ELEMENT_DOES_NOT_EXIST ); + } + else + { + inputMatcher.appendReplacement( sb, inputHTML ); + } + } + } + + return sb.toString(); + } + + private String populateCustomDataEntryForDate( String htmlCode, Collection dataElements ) + { + // --------------------------------------------------------------------- + // Metadata code to add to HTML before outputting + // --------------------------------------------------------------------- + + StringBuffer sb = new StringBuffer(); + + // --------------------------------------------------------------------- + // Pattern to match data elements in the HTML code + // --------------------------------------------------------------------- + + Matcher inputMatcher = INPUT_PATTERN.matcher( htmlCode ); + + // --------------------------------------------------------------------- + // Iterate through all matching data element fields + // --------------------------------------------------------------------- + + while ( inputMatcher.find() ) + { + String inputHTML = inputMatcher.group(); + + // ----------------------------------------------------------------- + // Get HTML input field code + // ----------------------------------------------------------------- + + String dataElementCode = inputMatcher.group( 1 ); + + Matcher identifierMatcher = IDENTIFIER_PATTERN_OTHERS.matcher( dataElementCode ); + + if ( identifierMatcher.find() && identifierMatcher.groupCount() > 0 ) + { + // ------------------------------------------------------------- + // Get data element ID of data element + // ------------------------------------------------------------- + + int dataElementId = Integer.parseInt( identifierMatcher.group( 2 ) ); + + DataElement dataElement = dataElementService.getDataElement( dataElementId ); + + if ( !dataElements.contains( dataElement ) ) + { + inputMatcher.appendReplacement( sb, DATA_ELEMENT_DOES_NOT_EXIST ); + } else + { + inputMatcher.appendReplacement( sb, inputHTML ); + } + } + } + + return sb.toString(); + } + private String populateCustomDataEntryForTextBox( String dataEntryFormCode, - Collection dataValues, String disabled, I18n i18n, ProgramStage programStage, ProgramStageInstance programStageInstance, - OrganisationUnit organisationUnit, Map> mapDataValue ) + Collection dataValues, String disabled, I18n i18n, ProgramStage programStage, + ProgramStageInstance programStageInstance, OrganisationUnit organisationUnit, + Map> mapDataValue ) { // --------------------------------------------------------------------- // Inline Javascript to add to HTML before outputting @@ -148,15 +339,8 @@ // Pattern to match data elements in the HTML code // --------------------------------------------------------------------- - Pattern dataElementPattern = Pattern.compile( "(", Pattern.DOTALL ); - Matcher dataElementMatcher = dataElementPattern.matcher( dataEntryFormCode ); - - // --------------------------------------------------------------------- - // Pattern to extract data element ID from data element field - // --------------------------------------------------------------------- - - Pattern identifierPattern = Pattern - .compile( "\"value\\[([\\p{Digit}.]*)\\].value:value\\[([\\p{Digit}.]*)\\].value:value\\[([\\p{Digit}.]*)\\].value\"" ); + Pattern INPUT_PATTERN = Pattern.compile( "(", Pattern.DOTALL ); + Matcher dataElementMatcher = INPUT_PATTERN.matcher( dataEntryFormCode ); // --------------------------------------------------------------------- // Iterate through all matching data element fields @@ -173,7 +357,7 @@ String compulsory = "null"; String dataElementCode = dataElementMatcher.group( 1 ); - Matcher identifierMatcher = identifierPattern.matcher( dataElementCode ); + Matcher identifierMatcher = IDENTIFIER_PATTERN_TEXTBOX.matcher( dataElementCode ); if ( identifierMatcher.find() && identifierMatcher.groupCount() > 0 ) { @@ -204,7 +388,7 @@ dataElement = dataElementMap.get( dataElementId ); if ( dataElement == null ) { - return i18n.getString( "program_stage_lack_data_elements" ); + return i18n.getString( "some_data_element_not_exist" ); } ProgramStageDataElement psde = programStageDataElementService.get( programStage, dataElement ); @@ -372,14 +556,7 @@ // Pattern to match data elements in the HTML code // --------------------------------------------------------------------- - Pattern dataElementPattern = Pattern.compile( "(", Pattern.DOTALL ); - Matcher dataElementMatcher = dataElementPattern.matcher( dataEntryFormCode ); - - // --------------------------------------------------------------------- - // Pattern to extract data element ID from data element field - // --------------------------------------------------------------------- - - Pattern identifierPattern = Pattern.compile( "value\\[(.*)\\].boolean:value\\[(.*)\\].boolean" ); + Matcher dataElementMatcher = SELECT_PATTERN.matcher( dataEntryFormCode ); // --------------------------------------------------------------------- // Iterate through all matching data element fields @@ -395,7 +572,7 @@ String compulsory = "null"; String dataElementCode = dataElementMatcher.group( 1 ); - Matcher identifierMatcher = identifierPattern.matcher( dataElementCode ); + Matcher identifierMatcher = IDENTIFIER_PATTERN_OTHERS.matcher( dataElementCode ); if ( identifierMatcher.find() && identifierMatcher.groupCount() > 0 ) { // ------------------------------------------------------------- @@ -422,7 +599,7 @@ dataElement = dataElementMap.get( dataElementId ); if ( dataElement == null ) { - return i18n.getString( "program_stage_lack_data_elements" ); + return i18n.getString( "some_data_element_not_exist" ); } ProgramStageDataElement psde = programStageDataElementService.get( programStage, dataElement ); @@ -439,6 +616,7 @@ { continue; } + // ------------------------------------------------------------- // Find type of data element // ------------------------------------------------------------- @@ -474,7 +652,7 @@ { patientDataValue = getValue( dataValues, dataElementId ); - + if ( patientDataValue != null ) { dataElementValue = patientDataValue.getValue(); @@ -559,7 +737,7 @@ // ----------------------------------------------------------- // // ----------------------------------------------------------- - + String orgUnitName = i18n.getString( NOTAVAILABLE ); if ( patientDataValue != null ) { @@ -608,7 +786,7 @@ // --------------------------------------------------------------------- final String jsCodeForCombo = " name=\"entryselect\" $DISABLED data=\"{compulsory:$COMPULSORY, dataElementId:$DATAELEMENTID, dataElementName:'$DATAELEMENTNAME', dataElementType:'$DATAELEMENTTYPE', programStageId:$PROGRAMSTAGEID, programStageName: '$PROGRAMSTAGENAME', orgUnitName:'$ORGUNITNAME'}\" onchange=\"saveChoiceCustom( $PROGRAMSTAGEID, $DATAELEMENTID,this)\""; - + // --------------------------------------------------------------------- // Metadata code to add to HTML before outputting // --------------------------------------------------------------------- @@ -621,15 +799,7 @@ // Pattern to match data elements in the HTML code // --------------------------------------------------------------------- - Pattern dataElementPattern = Pattern.compile( "(", Pattern.DOTALL ); - Matcher dataElementMatcher = dataElementPattern.matcher( dataEntryFormCode ); - - // --------------------------------------------------------------------- - // Pattern to extract data element ID from data element field - // --------------------------------------------------------------------- - - Pattern identifierPattern = Pattern - .compile( "\"value\\[([\\p{Digit}.]*)\\].combo:value\\[([\\p{Digit}.]*)\\].combo\"" ); + Matcher dataElementMatcher = SELECT_PATTERN.matcher( dataEntryFormCode ); // --------------------------------------------------------------------- // Iterate through all matching data element fields @@ -644,8 +814,8 @@ // ----------------------------------------------------------------- String dataElementCode = dataElementMatcher.group( 1 ); - - Matcher identifierMatcher = identifierPattern.matcher( dataElementCode ); + + Matcher identifierMatcher = IDENTIFIER_PATTERN_OTHERS.matcher( dataElementCode ); String compulsory = "null"; @@ -674,7 +844,7 @@ dataElement = dataElementMap.get( dataElementId ); if ( dataElement == null ) { - return i18n.getString( "program_stage_lack_data_elements" ); + return i18n.getString( "some_data_element_not_exist" ); } ProgramStageDataElement psde = programStageDataElementService.get( programStage, dataElement ); @@ -690,7 +860,7 @@ { continue; } - + // ------------------------------------------------------------- // Find type of data element // ------------------------------------------------------------- @@ -700,7 +870,7 @@ // ------------------------------------------------------------- // Find existing value of data element in data set // ------------------------------------------------------------- - + PatientDataValue patientDataValue = null; String dataElementValue = EMPTY; if ( programStageId != programStage.getId() ) @@ -717,7 +887,7 @@ } patientDataValue = getValue( patientDataValues, dataElementId ); - + dataElementValue = patientDataValue != null ? patientDataValue.getValue() : dataElementValue; } else @@ -729,20 +899,20 @@ String appendCode = dataElementCode; appendCode = appendCode.replace( "name=\"entryselect\"", jsCodeForCombo ); - + // ------------------------------------------------------------- // Insert value of data element in output code // ------------------------------------------------------------- - + if ( patientDataValue != null ) { - appendCode = appendCode.replace( "id=\"combo[" + patientDataValue.getOptionCombo().getId() + appendCode = appendCode.replace( "id=\"combo[" + patientDataValue.getOptionCombo().getId() + "].combo\"", "id=\"combo[" + patientDataValue.getOptionCombo().getId() + "].combo\" selected=\"selected\"" ); } appendCode += ""; - + // ------------------------------------------------------------- // Remove placeholder view attribute from input field // ------------------------------------------------------------- @@ -778,7 +948,7 @@ // disable // If programStagsInstance is completed then disabled it // ----------------------------------------------------------- - + disabled = ""; if ( programStageId != programStage.getId() || programStageInstance.isCompleted() ) { @@ -789,14 +959,14 @@ // ----------------------------------------------------------- // Add ProvidedByOtherFacility checkbox // ----------------------------------------------------------- - + appendCode = addProvidedByOtherFacilityCheckbox( appendCode, patientDataValue ); } // ----------------------------------------------------------- // // ----------------------------------------------------------- - + String orgUnitName = i18n.getString( NOTAVAILABLE ); if ( patientDataValue != null ) { @@ -841,7 +1011,7 @@ // --------------------------------------------------------------------- final String jsCodeForDate = " name=\"entryfield\" $DISABLED onchange=\"saveDateCustom( this )\" data=\"{compulsory:$COMPULSORY, dataElementId:$DATAELEMENTID, dataElementName:'$DATAELEMENTNAME', dataElementType:'$DATAELEMENTTYPE', programStageId:$PROGRAMSTAGEID, programStageName: '$PROGRAMSTAGENAME', orgUnitName:'$ORGUNITNAME'}\""; - + // --------------------------------------------------------------------- // Metadata code to add to HTML before outputting // --------------------------------------------------------------------- @@ -865,9 +1035,6 @@ // Pattern to extract data element ID from data element field // --------------------------------------------------------------------- - Pattern identifierPattern = Pattern - .compile( "id=\"value\\[([\\p{Digit}.]*)\\].date:value\\[([\\p{Digit}.]*)\\].date\"" ); - // --------------------------------------------------------------------- // Iterate through all matching data element fields // --------------------------------------------------------------------- @@ -879,18 +1046,18 @@ // ----------------------------------------------------------------- // Get HTML input field code // ----------------------------------------------------------------- - + String compulsory = "null"; String dataElementCode = dataElementMatcher.group( 1 ); - - Matcher identifierMatcher = identifierPattern.matcher( dataElementCode ); + + Matcher identifierMatcher = IDENTIFIER_PATTERN_OTHERS.matcher( dataElementCode ); if ( identifierMatcher.find() && identifierMatcher.groupCount() > 0 ) { // ------------------------------------------------------------- // Get data element ID of data element // ------------------------------------------------------------- - + int programStageId = Integer.parseInt( identifierMatcher.group( 1 ) ); int dataElementId = Integer.parseInt( identifierMatcher.group( 2 ) ); @@ -910,7 +1077,7 @@ dataElement = dataElementMap.get( dataElementId ); if ( dataElement == null ) { - return i18n.getString( "program_stage_lack_data_elements" ); + return i18n.getString( "some_data_element_not_exist" ); } ProgramStageDataElement psde = programStageDataElementService.get( programStage, dataElement ); @@ -926,6 +1093,7 @@ { continue; } + // ------------------------------------------------------------- // Find type of data element // ------------------------------------------------------------- @@ -953,7 +1121,7 @@ } patientDataValue = getValue( patientDataValues, dataElementId ); - + dataElementValue = patientDataValue != null ? patientDataValue.getValue() : dataElementValue; } else @@ -981,7 +1149,7 @@ // ------------------------------------------------------------- dataElementCode = dataElementCode.replaceAll( "view=\".*?\"", "" ); - + // ------------------------------------------------------------- // Append Javascript code and meta data (type/min/max) for // persisting to output code, and insert value and type for @@ -990,7 +1158,7 @@ String appendCode = dataElementCode + "/>"; appendCode = appendCode.replace( "name=\"entryfield\"", jsCodeForDate ); - + appendCode += metaDataCode; // ------------------------------------------------------------- @@ -998,7 +1166,7 @@ // disable // If programStagsInstance is completed then disabled it // ------------------------------------------------------------- - + disabled = ""; if ( programStageId != programStage.getId() || programStageInstance.isCompleted() ) { @@ -1011,7 +1179,7 @@ // --------------------------------------------------------- // Add ProvidedByOtherFacility checkbox // --------------------------------------------------------- - + appendCode = addProvidedByOtherFacilityCheckbox( appendCode, patientDataValue ); } @@ -1019,7 +1187,7 @@ // ------------------------------------------------------------- // Get Org Unit name // ------------------------------------------------------------- - + String orgUnitName = i18n.getString( NOTAVAILABLE ); if ( patientDataValue != null ) { @@ -1061,8 +1229,8 @@ return sb.toString(); } - - /** + + /** * Returns the value of the PatientDataValue in the Collection of DataValues * with the given data element identifier and category option combo id. */ === modified file 'dhis-2/dhis-services/dhis-service-patient/src/main/resources/META-INF/dhis/beans.xml' --- dhis-2/dhis-services/dhis-service-patient/src/main/resources/META-INF/dhis/beans.xml 2011-05-27 01:09:01 +0000 +++ dhis-2/dhis-services/dhis-service-patient/src/main/resources/META-INF/dhis/beans.xml 2011-05-27 04:02:40 +0000 @@ -154,6 +154,8 @@ + ( programStageDataElementService.getListDataElement( programStage ) ); + + Collections.sort( dataElements, new DataElementNameComparator() ); + + // --------------------------------------------------------------------- // Get dataEntryForm of selected program-stage // --------------------------------------------------------------------- @@ -146,7 +162,7 @@ if ( dataEntryForm != null ) { - dataEntryValue = dataEntryFormService.prepareDataEntryFormForEdit( dataEntryForm.getHtmlCode() ); + dataEntryValue = programDataEntryService.prepareDataEntryFormForEdit( dataEntryForm.getHtmlCode(), dataElements ); } else { @@ -170,14 +186,6 @@ existingDataEntryForms.remove( dataEntryForm ); // --------------------------------------------------------------------- - // Get data-elements into selected program-stage - // --------------------------------------------------------------------- - - dataElements = new ArrayList( programStageDataElementService.getListDataElement( programStage ) ); - - Collections.sort( dataElements, new DataElementNameComparator() ); - - // --------------------------------------------------------------------- // Get other program-stages into the program // --------------------------------------------------------------------- === modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/resources/META-INF/dhis/beans.xml' --- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/resources/META-INF/dhis/beans.xml 2011-05-26 05:41:52 +0000 +++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/resources/META-INF/dhis/beans.xml 2011-05-27 04:02:40 +0000 @@ -811,6 +811,8 @@ +