=== 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-10 08:47:17 +0000 +++ dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/utils/WebUtils.java 2014-02-10 10:55:32 +0000 @@ -250,9 +250,9 @@ private static String joinedWithPrefix( StringBuilder builder, List prefixList ) { - String output = StringUtils.join( prefixList, "." ); - output = output.isEmpty() ? builder.toString() : (output + "." + builder.toString()); - return output; + String prefixes = StringUtils.join( prefixList, "." ); + prefixes = prefixes.isEmpty() ? builder.toString() : (prefixes + "." + builder.toString()); + return prefixes; } public static List filterFields( List objects, String fields ) @@ -277,6 +277,11 @@ @SuppressWarnings( "unchecked" ) private static Map buildObjectOutput( Object object, Map fieldMap ) { + if ( object == null ) + { + return null; + } + Map output = Maps.newHashMap(); Map classMap = ReflectionUtils.getJacksonClassMap( object.getClass() ); @@ -289,24 +294,51 @@ Map value = fieldMap.get( key ); ReflectionUtils.MethodDescriptor descriptor = classMap.get( key ); + Object returned = ReflectionUtils.invokeMethod( object, descriptor.getMethod() ); + + if ( returned == null ) + { + continue; + } if ( value.isEmpty() ) { if ( !descriptor.isCollection() && !descriptor.isIdentifiableObject() ) { - Object returned = ReflectionUtils.invokeMethod( object, descriptor.getMethod() ); - output.put( key, returned ); - } - else if ( descriptor.isIdentifiableObject() && !descriptor.isCollection() ) - { - Object returned = getIdentifiableObjectProperties( object ); - output.put( key, returned ); - } - else if ( descriptor.isCollection() && descriptor.isIdentifiableObject() ) - { - Object returned = ReflectionUtils.invokeMethod( object, descriptor.getMethod() ); - returned = getIdentifiableObjectCollectionProperties( returned ); - output.put( key, returned ); + output.put( key, returned ); + } + else if ( descriptor.isIdentifiableObject() ) + { + if ( descriptor.isCollection() ) + { + List> properties = getIdentifiableObjectCollectionProperties( returned ); + output.put( key, properties ); + } + else + { + Map properties = getIdentifiableObjectProperties( returned ); + output.put( key, properties ); + } + } + } + else + { + if ( descriptor.isCollection() ) + { + Collection objects = (Collection) returned; + ArrayList arrayList = Lists.newArrayList(); + output.put( key, arrayList ); + + for ( IdentifiableObject identifiableObject : objects ) + { + Map properties = buildObjectOutput( identifiableObject, value ); + arrayList.add( properties ); + } + } + else + { + Map properties = buildObjectOutput( returned, value ); + output.put( key, properties ); } } } @@ -314,16 +346,16 @@ return output; } - private static Object getIdentifiableObjectCollectionProperties( Object object ) + private static List> getIdentifiableObjectCollectionProperties( Object object ) { List fields = Lists.newArrayList( "id", "name", "code", "created", "lastUpdated" ); return getIdentifiableObjectCollectionProperties( object, fields ); } @SuppressWarnings( "unchecked" ) - private static Object getIdentifiableObjectCollectionProperties( Object object, List fields ) + private static List> getIdentifiableObjectCollectionProperties( Object object, List fields ) { - List> idPropertiesList = Lists.newArrayList(); + List> output = Lists.newArrayList(); Collection identifiableObjects; try @@ -333,16 +365,16 @@ catch ( ClassCastException ex ) { ex.printStackTrace(); - return idPropertiesList; + return output; } for ( IdentifiableObject identifiableObject : identifiableObjects ) { Map properties = getIdentifiableObjectProperties( identifiableObject, fields ); - idPropertiesList.add( properties ); + output.add( properties ); } - return idPropertiesList; + return output; } private static Map getIdentifiableObjectProperties( Object object )