=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentity/TrackedEntityAttributeService.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentity/TrackedEntityAttributeService.java 2015-06-16 13:17:59 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentity/TrackedEntityAttributeService.java 2015-09-30 05:42:06 +0000 @@ -28,6 +28,8 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import org.hisp.dhis.organisationunit.OrganisationUnit; + import java.util.List; /** @@ -197,4 +199,15 @@ */ int getTrackedEntityAttributeCountByName( String name ); + /** + * Validate scope of tracked entity attribute. Will return true if attribute is non-unique. + * + * @param trackedEntityInstance TrackedEntityInstance + * @param trackedEntityAttribute TrackedEntityAttribute + * @param organisationUnit OrganisationUnit - only required if org unit scoped + * @param value Value + * @return true is unique, false otherwise + */ + boolean validateScope( TrackedEntityInstance trackedEntityInstance, TrackedEntityAttribute trackedEntityAttribute, + OrganisationUnit organisationUnit, String value ); } === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentity/TrackedEntityInstanceService.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentity/TrackedEntityInstanceService.java 2015-09-30 05:00:31 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentity/TrackedEntityInstanceService.java 2015-09-30 05:42:06 +0000 @@ -32,6 +32,7 @@ import org.hisp.dhis.common.IllegalQueryException; import org.hisp.dhis.common.OrganisationUnitSelectionMode; import org.hisp.dhis.event.EventStatus; +import org.hisp.dhis.organisationunit.OrganisationUnit; import org.hisp.dhis.program.Program; import org.hisp.dhis.program.ProgramStatus; import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValue; === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/trackedentity/DefaultTrackedEntityAttributeService.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/trackedentity/DefaultTrackedEntityAttributeService.java 2015-08-26 07:01:51 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/trackedentity/DefaultTrackedEntityAttributeService.java 2015-09-30 05:42:06 +0000 @@ -31,9 +31,16 @@ import java.util.ArrayList; import java.util.List; +import org.hisp.dhis.common.Grid; +import org.hisp.dhis.common.OrganisationUnitSelectionMode; +import org.hisp.dhis.common.QueryItem; +import org.hisp.dhis.common.QueryOperator; +import org.hisp.dhis.organisationunit.OrganisationUnit; import org.hisp.dhis.program.Program; import org.hisp.dhis.program.ProgramService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.Assert; /** * @author Abyot Asalefew @@ -60,6 +67,9 @@ this.programService = programService; } + @Autowired + private TrackedEntityInstanceService trackedEntityInstanceService; + // ------------------------------------------------------------------------- // Implementation methods // ------------------------------------------------------------------------- @@ -181,4 +191,35 @@ { return attributeStore.getCountLikeName( name ); } + + @Override + public boolean validateScope( TrackedEntityInstance trackedEntityInstance, TrackedEntityAttribute trackedEntityAttribute, + OrganisationUnit organisationUnit, String value ) + { + Assert.notNull( trackedEntityInstance, "trackedEntityInstance is required." ); + Assert.notNull( trackedEntityAttribute, "trackedEntityAttribute is required." ); + + if ( !trackedEntityAttribute.isUnique() ) + { + return true; + } + + TrackedEntityInstanceQueryParams params = new TrackedEntityInstanceQueryParams(); + params.addAttribute( new QueryItem( trackedEntityAttribute, QueryOperator.EQ, value, trackedEntityAttribute.getValueType(), + trackedEntityAttribute.getAggregationType(), trackedEntityAttribute.getOptionSet() ) ); + + if ( trackedEntityAttribute.getOrgunitScope() ) + { + params.getOrganisationUnits().add( organisationUnit ); + params.setOrganisationUnitMode( OrganisationUnitSelectionMode.SELECTED ); + } + else + { + params.setOrganisationUnitMode( OrganisationUnitSelectionMode.ALL ); + } + + Grid instances = trackedEntityInstanceService.getTrackedEntityInstancesGrid( params ); + + return instances.getHeight() == 0 || instances.getHeight() == 1 && instances.getRow( 0 ).contains( trackedEntityInstance.getUid() ); + } } === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/trackedentity/DefaultTrackedEntityInstanceService.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/trackedentity/DefaultTrackedEntityInstanceService.java 2015-09-30 05:00:31 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/trackedentity/DefaultTrackedEntityInstanceService.java 2015-09-30 05:42:06 +0000 @@ -59,6 +59,7 @@ import org.hisp.dhis.validation.ValidationCriteria; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.Assert; import java.util.Collection; import java.util.Date; @@ -724,4 +725,5 @@ return null; } + } === modified file 'dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/events/trackedentity/AbstractTrackedEntityInstanceService.java' --- dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/events/trackedentity/AbstractTrackedEntityInstanceService.java 2015-09-30 04:08:38 +0000 +++ dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/events/trackedentity/AbstractTrackedEntityInstanceService.java 2015-09-30 05:42:06 +0000 @@ -30,11 +30,7 @@ import com.google.common.collect.Lists; import org.hisp.dhis.common.CodeGenerator; -import org.hisp.dhis.common.Grid; import org.hisp.dhis.common.IdentifiableObjectManager; -import org.hisp.dhis.common.OrganisationUnitSelectionMode; -import org.hisp.dhis.common.QueryItem; -import org.hisp.dhis.common.QueryOperator; import org.hisp.dhis.common.ValueType; import org.hisp.dhis.commons.collection.CachingMap; import org.hisp.dhis.dbms.DbmsManager; @@ -51,7 +47,7 @@ import org.hisp.dhis.system.util.MathUtils; import org.hisp.dhis.trackedentity.TrackedEntity; import org.hisp.dhis.trackedentity.TrackedEntityAttribute; -import org.hisp.dhis.trackedentity.TrackedEntityInstanceQueryParams; +import org.hisp.dhis.trackedentity.TrackedEntityAttributeService; import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValue; import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValueService; import org.hisp.dhis.user.UserService; @@ -63,6 +59,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.stream.Collectors; /** * @author Morten Olav Hansen @@ -78,7 +75,7 @@ protected org.hisp.dhis.trackedentity.TrackedEntityInstanceService teiService; @Autowired - protected TrackedEntityAttributeValueService attributeValueService; + protected TrackedEntityAttributeService trackedEntityAttributeService; @Autowired protected RelationshipService relationshipService; @@ -111,14 +108,7 @@ @Override public List getTrackedEntityInstances( List trackedEntityInstances ) { - List teiItems = new ArrayList<>(); - - for ( org.hisp.dhis.trackedentity.TrackedEntityInstance trackedEntityInstance : trackedEntityInstances ) - { - teiItems.add( getTrackedEntityInstance( trackedEntityInstance ) ); - } - - return teiItems; + return trackedEntityInstances.stream().map( this::getTrackedEntityInstance ).collect( Collectors.toList() ); } @Override @@ -381,7 +371,7 @@ attributeValue.setValue( attribute.getValue() ); attributeValue.setAttribute( entityAttribute ); - attributeValueService.addTrackedEntityAttributeValue( attributeValue ); + trackedEntityAttributeValueService.addTrackedEntityAttributeValue( attributeValue ); } } } @@ -412,7 +402,7 @@ private void removeAttributeValues( org.hisp.dhis.trackedentity.TrackedEntityInstance entityInstance ) { - entityInstance.getAttributeValues().forEach( attributeValueService::deleteTrackedEntityAttributeValue ); + entityInstance.getAttributeValues().forEach( trackedEntityAttributeValueService::deleteTrackedEntityAttributeValue ); teiService.updateTrackedEntityInstance( entityInstance ); } @@ -530,30 +520,12 @@ return importConflicts; } - TrackedEntityInstanceQueryParams params = new TrackedEntityInstanceQueryParams(); - - QueryItem queryItem = new QueryItem( attribute, QueryOperator.EQ, value, attribute.getValueType(), attribute.getAggregationType(), attribute.getOptionSet() ); - params.addAttribute( queryItem ); - - if ( attribute.getOrgunitScope() ) - { - params.getOrganisationUnits().add( organisationUnit ); - params.setOrganisationUnitMode( OrganisationUnitSelectionMode.SELECTED ); - } - else - { - params.setOrganisationUnitMode( OrganisationUnitSelectionMode.ALL ); - } - - Grid instances = teiService.getTrackedEntityInstancesGrid( params ); - - if ( instances.getHeight() == 0 || (tei != null && instances.getHeight() == 1 && instances.getRow( 0 ).contains( tei.getUid() )) ) + if ( trackedEntityAttributeService.validateScope( tei, attribute, organisationUnit, value ) ) { return importConflicts; } importConflicts.add( new ImportConflict( "Attribute.value", "Non-unique attribute value '" + value + "' for attribute " + attribute.getUid() ) ); - return importConflicts; }