=== 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 09:59:02 +0000 +++ dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/utils/WebUtils.java 2014-02-07 06:32:38 +0000 @@ -30,6 +30,7 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hisp.dhis.api.controller.WebMetaData; @@ -195,13 +196,13 @@ } Map classMap = ReflectionUtils.getJacksonClassMap( entityList.get( 0 ).getClass() ); - String[] split = fields.split( "," ); + List parsedFields = parseFieldExpression( fields ); for ( T object : entityList ) { Map objMap = Maps.newLinkedHashMap(); - for ( String field : split ) + for ( String field : parsedFields ) { if ( classMap.containsKey( field ) ) { @@ -277,4 +278,60 @@ return idProps; } + + private static List parseFieldExpression( String fields ) + { + List splitFields = Lists.newArrayList(); + + StringBuilder builder = new StringBuilder(); + ArrayList prefixList = Lists.newArrayList(); + + for ( String c : fields.split( "" ) ) + { + if ( c.equals( "," ) ) + { + splitFields.add( joinedWithPrefix( builder, prefixList ) ); + builder = new StringBuilder(); + continue; + } + + if ( c.equals( "[" ) ) + { + prefixList.add( builder.toString() ); + builder = new StringBuilder(); + continue; + } + + if ( c.equals( "]" ) ) + { + if ( !builder.toString().isEmpty() ) + { + splitFields.add( joinedWithPrefix( builder, prefixList ) ); + } + + prefixList.remove( prefixList.size() - 1 ); + builder = new StringBuilder(); + continue; + } + + if ( StringUtils.isAlpha( c ) ) + { + builder.append( c ); + } + } + + if ( !builder.toString().isEmpty() ) + { + splitFields.add( joinedWithPrefix( builder, prefixList ) ); + } + + return splitFields; + } + + private static String joinedWithPrefix( StringBuilder builder, List prefixList ) + { + String output = StringUtils.join( prefixList, "." ); + output = output.isEmpty() ? builder.toString() : (output + "." + builder.toString()); + return output; + } }