=== 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 2014-03-17 10:04:44 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentity/TrackedEntityInstanceService.java 2014-03-17 11:30:30 +0000 @@ -56,7 +56,7 @@ Grid getTrackedEntityInstances( TrackedEntityInstanceQueryParams params ); TrackedEntityInstanceQueryParams getFromUrl( Set items, String program, String trackedEntity, - Set organisationUnits, String ouMode, Integer page, Integer pageSize ); + Set ou, String ouMode, Integer page, Integer pageSize ); /** * Adds an {@link TrackedEntityInstance} === 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 2014-03-17 08:22:01 +0000 +++ dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/events/trackedentity/AbstractTrackedEntityInstanceService.java 2014-03-17 11:30:30 +0000 @@ -28,12 +28,17 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + import org.hisp.dhis.common.IdentifiableObjectManager; import org.hisp.dhis.dxf2.importsummary.ImportConflict; import org.hisp.dhis.dxf2.importsummary.ImportStatus; import org.hisp.dhis.dxf2.importsummary.ImportSummary; import org.hisp.dhis.organisationunit.OrganisationUnit; -import org.hisp.dhis.program.Program; import org.hisp.dhis.relationship.Relationship; import org.hisp.dhis.relationship.RelationshipService; import org.hisp.dhis.relationship.RelationshipType; @@ -43,12 +48,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.Assert; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - /** * @author Morten Olav Hansen */ @@ -76,51 +75,6 @@ // ------------------------------------------------------------------------- @Override - public TrackedEntityInstances getTrackedEntityInstances() - { - List entityInstances = new ArrayList( - entityInstanceService.getAllTrackedEntityInstances() ); - return getTrackedEntityInstances( entityInstances ); - } - - @Override - public TrackedEntityInstances getTrackedEntityInstances( OrganisationUnit organisationUnit ) - { - List entityInstances = new ArrayList( - entityInstanceService.getTrackedEntityInstances( organisationUnit, null, null ) ); - return getTrackedEntityInstances( entityInstances ); - } - - @Override - public TrackedEntityInstances getTrackedEntityInstances( Program program ) - { - List entityInstances = new ArrayList( - entityInstanceService.getTrackedEntityInstances( program ) ); - return getTrackedEntityInstances( entityInstances ); - } - - @Override - public TrackedEntityInstances getTrackedEntityInstances( OrganisationUnit organisationUnit, Program program ) - { - List entityInstances = new ArrayList( - entityInstanceService.getTrackedEntityInstances( organisationUnit, program ) ); - return getTrackedEntityInstances( entityInstances ); - } - - @Override - public TrackedEntityInstances getTrackedEntityInstances( Collection entityInstances ) - { - TrackedEntityInstances trackedEntityInstances = new TrackedEntityInstances(); - - for ( org.hisp.dhis.trackedentity.TrackedEntityInstance entityInstance : entityInstances ) - { - trackedEntityInstances.getTrackedEntityInstances().add( getTrackedEntityInstance( entityInstance ) ); - } - - return trackedEntityInstances; - } - - @Override public TrackedEntityInstance getTrackedEntityInstance( String uid ) { return getTrackedEntityInstance( entityInstanceService.getTrackedEntityInstance( uid ) ); === modified file 'dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/events/trackedentity/TrackedEntityInstanceService.java' --- dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/events/trackedentity/TrackedEntityInstanceService.java 2014-03-17 08:22:01 +0000 +++ dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/events/trackedentity/TrackedEntityInstanceService.java 2014-03-17 11:30:30 +0000 @@ -30,12 +30,9 @@ import java.io.IOException; import java.io.InputStream; -import java.util.Collection; import org.hisp.dhis.dxf2.importsummary.ImportSummaries; import org.hisp.dhis.dxf2.importsummary.ImportSummary; -import org.hisp.dhis.organisationunit.OrganisationUnit; -import org.hisp.dhis.program.Program; /** * @author Morten Olav Hansen @@ -46,16 +43,6 @@ // READ // ------------------------------------------------------------------------- - TrackedEntityInstances getTrackedEntityInstances(); - - TrackedEntityInstances getTrackedEntityInstances( OrganisationUnit organisationUnit ); - - TrackedEntityInstances getTrackedEntityInstances( Program program ); - - TrackedEntityInstances getTrackedEntityInstances( OrganisationUnit organisationUnit, Program program ); - - TrackedEntityInstances getTrackedEntityInstances( Collection entityInstances ); - TrackedEntityInstance getTrackedEntityInstance( String uid ); TrackedEntityInstance getTrackedEntityInstance( org.hisp.dhis.trackedentity.TrackedEntityInstance entityInstance ); === modified file 'dhis-2/dhis-services/dhis-service-dxf2/src/test/java/org/hisp/dhis/dxf2/events/TrackedEntityInstanceServiceTest.java' --- dhis-2/dhis-services/dhis-service-dxf2/src/test/java/org/hisp/dhis/dxf2/events/TrackedEntityInstanceServiceTest.java 2014-03-17 08:22:01 +0000 +++ dhis-2/dhis-services/dhis-service-dxf2/src/test/java/org/hisp/dhis/dxf2/events/TrackedEntityInstanceServiceTest.java 2014-03-17 11:30:30 +0000 @@ -28,6 +28,13 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + +import java.util.HashSet; + import org.hisp.dhis.DhisTest; import org.hisp.dhis.common.IdentifiableObjectManager; import org.hisp.dhis.dxf2.events.trackedentity.TrackedEntityInstance; @@ -42,12 +49,6 @@ import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; - -import static org.junit.Assert.*; - /** * @author Morten Olav Hansen */ @@ -106,26 +107,6 @@ } @Test - public void testGetPersons() - { - assertEquals( 4, trackedEntityInstanceService.getTrackedEntityInstances().getTrackedEntityInstances().size() ); - } - - @Test - public void testGetPersonByOrganisationUnit() - { - assertEquals( 2, trackedEntityInstanceService.getTrackedEntityInstances( organisationUnitA ).getTrackedEntityInstances().size() ); - assertEquals( 2, trackedEntityInstanceService.getTrackedEntityInstances( organisationUnitB ).getTrackedEntityInstances().size() ); - } - - @Test - public void getPersonByPatients() - { - List patients = Arrays.asList( maleA, femaleB ); - assertEquals( 2, trackedEntityInstanceService.getTrackedEntityInstances( patients ).getTrackedEntityInstances().size() ); - } - - @Test public void getPersonByUid() { assertEquals( maleA.getUid(), trackedEntityInstanceService.getTrackedEntityInstance( maleA.getUid() ).getTrackedEntityInstance() ); @@ -144,12 +125,6 @@ } @Test - public void testGetPersonByProgram() - { - assertEquals( 2, trackedEntityInstanceService.getTrackedEntityInstances( programA ).getTrackedEntityInstances().size() ); - } - - @Test @Ignore public void testUpdatePerson() { === modified file 'dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentity/DefaultTrackedEntityInstanceService.java' --- dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentity/DefaultTrackedEntityInstanceService.java 2014-03-17 10:04:44 +0000 +++ dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentity/DefaultTrackedEntityInstanceService.java 2014-03-17 11:30:30 +0000 @@ -43,6 +43,7 @@ import org.hisp.dhis.i18n.I18n; import org.hisp.dhis.i18n.I18nFormat; import org.hisp.dhis.organisationunit.OrganisationUnit; +import org.hisp.dhis.organisationunit.OrganisationUnitService; import org.hisp.dhis.program.Program; import org.hisp.dhis.program.ProgramService; import org.hisp.dhis.relationship.Relationship; @@ -86,6 +87,13 @@ { this.attributeService = attributeService; } + + private TrackedEntityService trackedEntityService; + + public void setTrackedEntityService( TrackedEntityService trackedEntityService ) + { + this.trackedEntityService = trackedEntityService; + } private RelationshipService relationshipService; @@ -107,27 +115,61 @@ { this.programService = programService; } + + private OrganisationUnitService organisationUnitService; + + public void setOrganisationUnitService( OrganisationUnitService organisationUnitService ) + { + this.organisationUnitService = organisationUnitService; + } // ------------------------------------------------------------------------- // Implementation methods // ------------------------------------------------------------------------- + @Override public Grid getTrackedEntityInstances( TrackedEntityInstanceQueryParams params ) { return trackedEntityInstanceStore.getTrackedEntityInstances( params ); } + @Override public TrackedEntityInstanceQueryParams getFromUrl( Set items, String program, String trackedEntity, - Set organisationUnits, String ouMode, Integer page, Integer pageSize ) + Set ou, String ouMode, Integer page, Integer pageSize ) { TrackedEntityInstanceQueryParams params = new TrackedEntityInstanceQueryParams(); - Program pr = programService.getProgram( program ); + Program pr = program != null ? programService.getProgram( program ) : null; - if ( pr == null ) - { - throw new IllegalQueryException( "Program does not exist: " + program ); - } + if ( program != null && pr == null ) + { + throw new IllegalQueryException( "Program does not exist: " + program ); + } + + TrackedEntity te = trackedEntity != null ? trackedEntityService.getTrackedEntity( trackedEntity ) : null; + + if ( te == null ) + { + throw new IllegalQueryException( "Program does not exist: " + program ); + } + + Set ous = new HashSet(); + + for ( String orgUnit : ou ) + { + OrganisationUnit organisationUnit = organisationUnitService.getOrganisationUnit( orgUnit ); + + if ( organisationUnit == null ) + { + throw new IllegalQueryException( "Organisation unit does not exist: " + orgUnit ); + } + + ous.add( organisationUnit ); + } + + params.setOrganisationUnitMode( ouMode ); + params.setPage( page ); + params.setPageSize( pageSize ); return params; } === modified file 'dhis-2/dhis-services/dhis-service-tracker/src/main/resources/META-INF/dhis/beans.xml' --- dhis-2/dhis-services/dhis-service-tracker/src/main/resources/META-INF/dhis/beans.xml 2014-03-17 10:04:44 +0000 +++ dhis-2/dhis-services/dhis-service-tracker/src/main/resources/META-INF/dhis/beans.xml 2014-03-17 11:30:30 +0000 @@ -242,12 +242,16 @@ ref="org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValueService" /> + + extends HashMap { - /** - * Determines if a de-serialized file is compatible with this class. - */ - private static final long serialVersionUID = -1314511873888181449L; - @Override @SuppressWarnings( "unchecked" ) public V get( Object key ) === modified file 'dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/event/TrackedEntityInstanceController.java' --- dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/event/TrackedEntityInstanceController.java 2014-03-17 08:46:22 +0000 +++ dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/event/TrackedEntityInstanceController.java 2014-03-17 11:30:30 +0000 @@ -29,44 +29,40 @@ */ import java.io.IOException; -import java.util.List; +import java.util.HashSet; import java.util.Map; +import java.util.Set; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.hibernate.Criteria; import org.hibernate.SessionFactory; -import org.hibernate.criterion.Conjunction; -import org.hibernate.criterion.Disjunction; -import org.hibernate.criterion.Order; -import org.hibernate.criterion.Restrictions; import org.hisp.dhis.api.controller.WebOptions; import org.hisp.dhis.api.controller.exception.NotFoundException; import org.hisp.dhis.api.utils.ContextUtils; +import org.hisp.dhis.common.DimensionalObject; +import org.hisp.dhis.common.Grid; import org.hisp.dhis.common.IdentifiableObjectManager; +import org.hisp.dhis.common.IllegalQueryException; import org.hisp.dhis.dxf2.events.trackedentity.TrackedEntityInstance; import org.hisp.dhis.dxf2.events.trackedentity.TrackedEntityInstanceService; -import org.hisp.dhis.dxf2.events.trackedentity.TrackedEntityInstances; import org.hisp.dhis.dxf2.importsummary.ImportStatus; import org.hisp.dhis.dxf2.importsummary.ImportSummaries; import org.hisp.dhis.dxf2.importsummary.ImportSummary; import org.hisp.dhis.dxf2.utils.JacksonUtils; -import org.hisp.dhis.organisationunit.OrganisationUnit; -import org.hisp.dhis.program.Program; -import org.hisp.dhis.trackedentity.TrackedEntityAttribute; +import org.hisp.dhis.trackedentity.TrackedEntityInstanceQueryParams; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseStatus; -import org.springframework.web.client.HttpClientErrorException; /** * @author Morten Olav Hansen @@ -80,6 +76,9 @@ @Autowired private TrackedEntityInstanceService trackedEntityInstanceService; + + @Autowired + private org.hisp.dhis.trackedentity.TrackedEntityInstanceService instanceService; @Autowired private IdentifiableObjectManager manager; @@ -90,150 +89,28 @@ // ------------------------------------------------------------------------- // READ // ------------------------------------------------------------------------- - - @RequestMapping( value = "", method = RequestMethod.GET ) - @PreAuthorize( "hasRole('ALL') or hasRole('F_ACCESS_PATIENT_ATTRIBUTES')" ) - public String getTrackedEntityInstances( @RequestParam(value = "orgUnit", required = false) String orgUnitUid, - @RequestParam(value = "program", required = false) String programUid, - @RequestParam(value = "attribute", required = false) List attributeFilters, - @RequestParam(required = false) Map parameters, Model model ) - throws Exception - { - WebOptions options = new WebOptions( parameters ); - TrackedEntityInstances trackedEntityInstances = new TrackedEntityInstances(); - - if ( attributeFilters != null ) - { - trackedEntityInstances = trackedEntityInstancesByFilter( attributeFilters, orgUnitUid ); - } - else if ( orgUnitUid != null ) - { - if ( programUid != null ) - { - OrganisationUnit organisationUnit = getOrganisationUnit( orgUnitUid ); - Program program = getProgram( programUid ); - - trackedEntityInstances = trackedEntityInstanceService.getTrackedEntityInstances( organisationUnit, program ); - } - else - { - OrganisationUnit organisationUnit = getOrganisationUnit( orgUnitUid ); - trackedEntityInstances = trackedEntityInstanceService.getTrackedEntityInstances( organisationUnit ); - } - } - else - { - throw new HttpClientErrorException( HttpStatus.BAD_REQUEST, "Missing required orgUnit parameter." ); - } - - model.addAttribute( "model", trackedEntityInstances ); - model.addAttribute( "viewClass", options.getViewClass( "basic" ) ); - - return "trackedEntityInstances"; - } - - @SuppressWarnings( "unchecked" ) - private TrackedEntityInstances trackedEntityInstancesByFilter( List attributeFilters, String orgUnitUid ) - { - Criteria criteria = sessionFactory.getCurrentSession().createCriteria( org.hisp.dhis.trackedentity.TrackedEntityInstance.class ); - criteria.createAlias( "attributeValues", "attributeValue" ); - criteria.createAlias( "attributeValue.attribute", "attribute" ); - - Disjunction or = Restrictions.or(); - criteria.add( or ); - - if ( orgUnitUid != null ) - { - OrganisationUnit organisationUnit = manager.get( OrganisationUnit.class, orgUnitUid ); - - if ( organisationUnit == null ) - { - throw new HttpClientErrorException( HttpStatus.BAD_REQUEST, "OrganisationUnit with UID " + orgUnitUid + " does not exist." ); - } - - criteria.createAlias( "organisationUnit", "organisationUnit" ); - criteria.add( Restrictions.eq( "organisationUnit.uid", orgUnitUid ) ); - } - - // validate attributes, and build criteria - for ( String filter : attributeFilters ) - { - String[] split = filter.split( ":" ); - - Conjunction and = Restrictions.and(); - or.add( and ); - - if ( split.length != 3 ) - { - throw new HttpClientErrorException( HttpStatus.BAD_REQUEST, "Filter " + filter + " is not in valid format. " + - "Valid syntax is attribute=ATTRIBUTE_UID:OPERATOR:VALUE." ); - } - - TrackedEntityAttribute attribute = manager.get( TrackedEntityAttribute.class, split[0] ); - - if ( attribute == null ) - { - throw new HttpClientErrorException( HttpStatus.BAD_REQUEST, "TrackedEntityAttribute with UID " + split[0] + " does not exist." ); - } - - if ( "like".equals( split[1].toLowerCase() ) ) - { - and.add( Restrictions.and( - Restrictions.eq( "attribute.uid", split[0] ), - Restrictions.ilike( "attributeValue.value", "%" + split[2] + "%" ) - ) ); - } - else if ( "eq".equals( split[1].toLowerCase() ) ) - { - and.add( Restrictions.and( - Restrictions.eq( "attribute.uid", split[0] ), - Restrictions.eq( "attributeValue.value", split[2] ) - ) ); - } - else if ( "ne".equals( split[1].toLowerCase() ) ) - { - and.add( Restrictions.and( - Restrictions.eq( "attribute.uid", split[0] ), - Restrictions.ne( "attributeValue.value", split[2] ) - ) ); - } - else if ( "gt".equals( split[1].toLowerCase() ) ) - { - and.add( Restrictions.and( - Restrictions.eq( "attribute.uid", split[0] ), - Restrictions.gt( "attributeValue.value", split[2] ) - ) ); - } - else if ( "lt".equals( split[1].toLowerCase() ) ) - { - and.add( Restrictions.and( - Restrictions.eq( "attribute.uid", split[0] ), - Restrictions.lt( "attributeValue.value", split[2] ) - ) ); - } - else if ( "ge".equals( split[1].toLowerCase() ) ) - { - and.add( Restrictions.and( - Restrictions.eq( "attribute.uid", split[0] ), - Restrictions.ge( "attributeValue.value", split[2] ) - ) ); - } - else if ( "in".equals( split[1].toLowerCase() ) ) - { - String[] in = split[2].split( ";" ); - - and.add( Restrictions.and( - Restrictions.eq( "attribute.uid", split[0] ), - Restrictions.in( "attributeValue.value", in ) - ) ); - } - } - - criteria.addOrder( Order.desc( "lastUpdated" ) ); - - return trackedEntityInstanceService.getTrackedEntityInstances( criteria.list() ); - } - + + @RequestMapping( method = RequestMethod.GET, produces = { "application/json", "application/javascript" } ) + public String queryTrackedEntityInstances( // JSON, JSONP + @RequestParam Set items, + @RequestParam(required=false) String program, + @RequestParam(required=false) String trackedEntity, + @RequestParam String ou, + @RequestParam(required=false, defaultValue=DimensionalObject.OU_MODE_SELECTED) String ouMode, + @RequestParam(required=false) Integer page, + @RequestParam(required=false) Integer pageSize, + Model model, + HttpServletResponse response ) throws Exception + { + Set orgUnits = new HashSet( ContextUtils.getQueryParamValues( ou ) ); + TrackedEntityInstanceQueryParams params = instanceService.getFromUrl( items, program, trackedEntity, orgUnits, ouMode, page, pageSize ); + Grid grid = instanceService.getTrackedEntityInstances( params ); + + model.addAttribute( "model", grid ); + model.addAttribute( "viewClass", "detailed" ); + return "grid"; + } + @RequestMapping( value = "/{id}", method = RequestMethod.GET ) @PreAuthorize( "hasRole('ALL') or hasRole('F_ACCESS_PATIENT_ATTRIBUTES')" ) public String getTrackedEntityInstance( @PathVariable String id, @RequestParam Map parameters, Model model ) @@ -358,38 +235,18 @@ return trackedEntityInstance; } - private Program getProgram( String id ) - throws NotFoundException - { - Program program = manager.get( Program.class, id ); - - if ( program == null ) - { - throw new NotFoundException( "TrackedEntityInstance", id ); - } - - return program; - } - private String getResourcePath( HttpServletRequest request, ImportSummary importSummary ) { return ContextUtils.getContextPath( request ) + "/api/" + "trackedEntityInstances" + "/" + importSummary.getReference(); } - - private OrganisationUnit getOrganisationUnit( String orgUnitUid ) + + // ------------------------------------------------------------------------- + // Exception handling + // ------------------------------------------------------------------------- + + @ExceptionHandler(IllegalQueryException.class) + public void handleError( IllegalQueryException ex, HttpServletResponse response ) { - if ( orgUnitUid == null ) - { - return null; - } - - OrganisationUnit organisationUnit = manager.get( OrganisationUnit.class, orgUnitUid ); - - if ( organisationUnit == null ) - { - throw new HttpClientErrorException( HttpStatus.BAD_REQUEST, "orgUnit is not a valid uid." ); - } - - return organisationUnit; + ContextUtils.conflictResponse( response, ex.getMessage() ); } } \ No newline at end of file