=== modified file 'dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/ReflectionUtils.java' --- dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/ReflectionUtils.java 2014-02-04 12:54:31 +0000 +++ dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/ReflectionUtils.java 2014-02-06 06:37:09 +0000 @@ -31,6 +31,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; import com.google.common.collect.Maps; +import org.hisp.dhis.common.IdentifiableObject; import org.hisp.dhis.system.util.functional.Function1; import org.hisp.dhis.system.util.functional.Predicate; import org.springframework.util.StringUtils; === modified file 'dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/AbstractCrudController.java' --- dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/AbstractCrudController.java 2014-02-06 05:59:21 +0000 +++ dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/AbstractCrudController.java 2014-02-06 06:37:09 +0000 @@ -28,6 +28,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import com.google.common.collect.Maps; import org.hisp.dhis.api.controller.exception.NotFoundException; import org.hisp.dhis.api.controller.exception.NotFoundForQueryException; import org.hisp.dhis.api.utils.WebUtils; @@ -102,13 +103,16 @@ postProcessEntities( entityList ); postProcessEntities( entityList, options, parameters ); - Map output = WebUtils.filterFields( entityList, fields ); + List objects = WebUtils.filterFields( entityList, fields ); + Map output = Maps.newLinkedHashMap(); if ( options.hasPaging() ) { output.put( "pager", metaData.getPager() ); } + output.put( "objects", objects ); + JacksonUtils.toJson( response.getOutputStream(), output ); } === modified file 'dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/utils/WebUtils.java' --- dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/utils/WebUtils.java 2014-02-06 06:09:18 +0000 +++ dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/utils/WebUtils.java 2014-02-06 06:37:09 +0000 @@ -131,7 +131,7 @@ generateLinks( object, true ); } - @SuppressWarnings("unchecked") + @SuppressWarnings( "unchecked" ) public static void generateLinks( Object object, boolean deep ) { if ( object == null ) @@ -185,15 +185,13 @@ } } - public static Map filterFields( List entityList, String fields ) + public static List filterFields( List entityList, String fields ) { - Map output = Maps.newHashMap(); - ArrayList objects = Lists.newArrayList(); - output.put( "objects", objects ); + List objects = Lists.newArrayList(); if ( entityList.isEmpty() || fields == null ) { - return output; + return objects; } Map classMap = ReflectionUtils.getJacksonClassMap( entityList.get( 0 ).getClass() ); @@ -201,7 +199,7 @@ for ( T object : entityList ) { - Map objMap = Maps.newHashMap(); + Map objMap = Maps.newLinkedHashMap(); for ( String field : split ) { @@ -209,17 +207,56 @@ { Object o = ReflectionUtils.invokeMethod( object, classMap.get( field ) ); - // skip collections for now + if ( o == null ) + { + continue; + } + if ( !ReflectionUtils.isCollection( o ) ) { objMap.put( field, o ); } + else + { + objMap.put( field, getIdentifiableObjectProperties( o ) ); + } } } objects.add( objMap ); } - return output; + return objects; + } + + @SuppressWarnings( "unchecked" ) + private static List> getIdentifiableObjectProperties( Object o ) + { + List> idPropertiesList = Lists.newArrayList(); + Collection identifiableObjects; + + try + { + identifiableObjects = (Collection) o; + } + catch ( ClassCastException ex ) + { + return null; + } + + for ( IdentifiableObject identifiableObject : identifiableObjects ) + { + Map idProps = Maps.newLinkedHashMap(); + + idProps.put( "id", identifiableObject.getUid() ); + idProps.put( "name", identifiableObject.getDisplayName() ); + idProps.put( "code", identifiableObject.getCode() ); + idProps.put( "created", identifiableObject.getCreated() ); + idProps.put( "lastUpdated", identifiableObject.getLastUpdated() ); + + idPropertiesList.add( idProps ); + } + + return idPropertiesList; } }