=== modified file 'dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/events/event/AbstractEventService.java' --- dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/events/event/AbstractEventService.java 2014-10-08 10:23:24 +0000 +++ dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/events/event/AbstractEventService.java 2014-10-08 11:24:12 +0000 @@ -77,8 +77,10 @@ import java.util.Arrays; import java.util.Collection; import java.util.Date; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; /** @@ -491,8 +493,8 @@ saveTrackedEntityComment( programStageInstance, event, storedBy ); - Set dataValues = new HashSet<>( - dataValueService.getTrackedEntityDataValues( programStageInstance ) ); + Set dataValues = new HashSet<>( dataValueService.getTrackedEntityDataValues( programStageInstance ) ); + Map existingDataValues = getDataElementDataValueMap( dataValues ); for ( DataValue value : event.getDataValues() ) { @@ -510,8 +512,10 @@ } else { + TrackedEntityDataValue existingDataValue = existingDataValues.get( value.getDataElement() ); + saveDataValue( programStageInstance, event.getStoredBy(), dataElement, value.getValue(), - value.getProvidedElsewhere() ); + value.getProvidedElsewhere(), existingDataValue ); } } @@ -527,7 +531,7 @@ public void updateEventForNote( Event event ) { - ProgramStageInstance programStageInstance = programStageInstanceService.getProgramStageInstance( + ProgramStageInstance programStageInstance = programStageInstanceService.getProgramStageInstance( event.getEvent() ); if ( programStageInstance == null ) @@ -729,23 +733,20 @@ new ImportConflict( "stored by", storedBy + " is more than 31 characters, using current username instead" ) ); } - + storedBy = currentUserService.getCurrentUsername(); } return storedBy; } private void saveDataValue( ProgramStageInstance programStageInstance, String storedBy, DataElement dataElement, - String value, Boolean providedElsewhere ) + String value, Boolean providedElsewhere, TrackedEntityDataValue dataValue ) { if ( value != null && value.trim().length() == 0 ) { value = null; } - TrackedEntityDataValue dataValue = dataValueService.getTrackedEntityDataValue( programStageInstance, - dataElement ); - if ( value != null ) { if ( dataValue == null ) @@ -772,7 +773,7 @@ } } - private ProgramStageInstance createProgramStageInstance( ProgramStage programStage, ProgramInstance programInstance, + private ProgramStageInstance createProgramStageInstance( ProgramStage programStage, ProgramInstance programInstance, OrganisationUnit organisationUnit, Date dueDate, Date executionDate, int status, Coordinate coordinate, String storedBy, String programStageInstanceUid ) { @@ -860,36 +861,55 @@ importSummary.setReference( programStageInstance.getUid() ); } + Collection existingDataValues = dataValueService.getTrackedEntityDataValues( programStageInstance ); + Map dataElementValueMap = getDataElementDataValueMap( existingDataValues ); + for ( DataValue dataValue : event.getDataValues() ) { - DataElement dataElement = dataElementService.getDataElement( dataValue.getDataElement() ); - - if ( dataElement == null ) - { - importSummary.getConflicts().add( - new ImportConflict( "dataElement", dataValue.getDataElement() + " is not a valid data element" ) ); - importSummary.getDataValueCount().incrementIgnored(); - } - else - { + DataElement dataElement; + + if ( dataElementValueMap.containsKey( dataValue.getDataElement() ) ) + { + dataElement = dataElementValueMap.get( dataValue.getDataElement() ).getDataElement(); + if ( validateDataValue( dataElement, dataValue.getValue(), importSummary ) ) { String dataValueStoredBy = dataValue.getStoredBy() != null ? dataValue.getStoredBy() : storedBy; if ( !dryRun ) { + TrackedEntityDataValue existingDataValue = dataElementValueMap.get( dataValue.getDataElement() ); + saveDataValue( programStageInstance, dataValueStoredBy, dataElement, dataValue.getValue(), - dataValue.getProvidedElsewhere() ); + dataValue.getProvidedElsewhere(), existingDataValue ); } importSummary.getDataValueCount().incrementImported(); } } + else + { + importSummary.getConflicts().add( + new ImportConflict( "dataElement", dataValue.getDataElement() + " is not a valid data element" ) ); + importSummary.getDataValueCount().incrementIgnored(); + } } return importSummary; } + private Map getDataElementDataValueMap( Collection dataValues ) + { + Map map = new HashMap<>(); + + for ( TrackedEntityDataValue value : dataValues ) + { + map.put( value.getDataElement().getUid(), value ); + } + + return map; + } + private void saveTrackedEntityComment( ProgramStageInstance programStageInstance, Event event, String storedBy ) { for ( Note note : event.getNotes() )