=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/chart/BaseChart.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/chart/BaseChart.java 2014-11-10 19:46:15 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/chart/BaseChart.java 2014-12-02 09:31:18 +0000 @@ -28,11 +28,12 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -import static org.apache.commons.lang.StringUtils.join; - -import java.util.ArrayList; -import java.util.List; - +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonView; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; import org.hisp.dhis.common.AnalyticsType; import org.hisp.dhis.common.BaseAnalyticalObject; import org.hisp.dhis.common.DimensionalObject; @@ -50,12 +51,10 @@ import org.hisp.dhis.period.Period; import org.hisp.dhis.user.User; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonView; -import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; -import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; -import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; +import java.util.ArrayList; +import java.util.List; + +import static org.apache.commons.lang.StringUtils.join; /** * @author Lars Helge Overland @@ -76,7 +75,7 @@ public static final String TYPE_PIE = "pie"; public static final String TYPE_RADAR = "radar"; public static final String TYPE_METER = "gauge"; - + protected String domainAxisLabel; protected String rangeAxisLabel; @@ -134,17 +133,17 @@ protected transient List organisationUnitsInGroups = new ArrayList<>(); protected transient Grid dataItemGrid = null; - + // ------------------------------------------------------------------------- // Abstract methods // ------------------------------------------------------------------------- public abstract List series(); - + public abstract List category(); - + public abstract AnalyticsType getAnalyticsType(); - + // ------------------------------------------------------------------------- // Logic // ------------------------------------------------------------------------- @@ -167,7 +166,7 @@ public String generateTitle() { List titleItems = new ArrayList<>(); - + for ( String filter : filterDimensions ) { DimensionalObject object = getDimensionalObject( filter, relativePeriodDate, user, true, @@ -177,32 +176,38 @@ { String item = IdentifiableObjectUtils.join( object.getItems() ); String filt = DimensionalObjectUtils.getPrettyFilter( object.getFilter() ); - + if ( item != null ) { titleItems.add( item ); } - + if ( filt != null ) { titleItems.add( filt ); } } } - + return join( titleItems, DimensionalObjectUtils.TITLE_ITEM_SEP ); } - + public boolean isAnalyticsType( AnalyticsType type ) { return getAnalyticsType().equals( type ); } - + public boolean hasTitle() { return title != null && !title.isEmpty(); } - + + @Override + public boolean haveUniqueNames() + { + return false; + } + // ------------------------------------------------------------------------- // Getters and setters for transient properties // ------------------------------------------------------------------------- @@ -242,7 +247,7 @@ { this.dataItemGrid = dataItemGrid; } - + // ------------------------------------------------------------------------- // Getters and setters // ------------------------------------------------------------------------- @@ -507,7 +512,7 @@ if ( other.getClass().isInstance( this ) ) { BaseChart chart = (BaseChart) other; - + domainAxisLabel = chart.getDomainAxisLabel(); rangeAxisLabel = chart.getRangeAxisLabel(); type = chart.getType(); === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/BaseAnalyticalObject.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/BaseAnalyticalObject.java 2014-11-30 13:56:15 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/BaseAnalyticalObject.java 2014-12-02 09:31:18 +0000 @@ -28,31 +28,14 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -import static org.hisp.dhis.common.DimensionalObject.CATEGORYOPTIONCOMBO_DIM_ID; -import static org.hisp.dhis.common.DimensionalObject.DATAELEMENT_DIM_ID; -import static org.hisp.dhis.common.DimensionalObject.DATAELEMENT_OPERAND_ID; -import static org.hisp.dhis.common.DimensionalObject.DATASET_DIM_ID; -import static org.hisp.dhis.common.DimensionalObject.DATA_X_DIM_ID; -import static org.hisp.dhis.common.DimensionalObject.DIMENSION_SEP; -import static org.hisp.dhis.common.DimensionalObject.INDICATOR_DIM_ID; -import static org.hisp.dhis.common.DimensionalObject.ORGUNIT_DIM_ID; -import static org.hisp.dhis.common.DimensionalObject.PERIOD_DIM_ID; -import static org.hisp.dhis.common.DimensionalObject.STATIC_DIMS; -import static org.hisp.dhis.organisationunit.OrganisationUnit.KEY_LEVEL; -import static org.hisp.dhis.organisationunit.OrganisationUnit.KEY_ORGUNIT_GROUP; -import static org.hisp.dhis.organisationunit.OrganisationUnit.KEY_USER_ORGUNIT; -import static org.hisp.dhis.organisationunit.OrganisationUnit.KEY_USER_ORGUNIT_CHILDREN; -import static org.hisp.dhis.organisationunit.OrganisationUnit.KEY_USER_ORGUNIT_GRANDCHILDREN; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonView; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; import org.apache.commons.lang.StringUtils; import org.hisp.dhis.common.annotation.Scanned; import org.hisp.dhis.common.view.DetailedView; @@ -75,14 +58,17 @@ import org.hisp.dhis.trackedentity.TrackedEntityDataElementDimension; import org.hisp.dhis.user.User; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonView; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; -import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; -import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static org.hisp.dhis.common.DimensionalObject.*; +import static org.hisp.dhis.organisationunit.OrganisationUnit.*; /** * This class contains associations to dimensional meta-data. Should typically @@ -111,7 +97,6 @@ // Persisted properties // ------------------------------------------------------------------------- - @Scanned protected List categoryDimensions = new ArrayList<>(); @Scanned @@ -193,7 +178,7 @@ { return itemOrganisationUnitGroups != null && !itemOrganisationUnitGroups.isEmpty(); } - + public boolean hasSortOrder() { return sortOrder != 0; @@ -214,7 +199,7 @@ this.transientOrganisationUnits.add( organisationUnit ); } } - + /** * Assembles a DimensionalObject based on the persisted properties of this * AnalyticalObject. Collapses indicators, data elements, data element @@ -396,7 +381,7 @@ // Tracked entity data element Map dataElements = new HashMap<>(); - + for ( TrackedEntityDataElementDimension dataElement : dataElementDimensions ) { dataElements.put( dataElement.getUid(), dataElement ); @@ -641,11 +626,11 @@ RelativePeriods.setName( period, null, dynamicNames, format ); } } - + /** - * Sorts the keys in the given map by splitting on the '-' character and + * Sorts the keys in the given map by splitting on the '-' character and * sorting the components alphabetically. - * + * * @param valueMap the mapping of keys and values. */ public static void sortKeys( Map valueMap ) @@ -655,7 +640,7 @@ for ( String key : valueMap.keySet() ) { String sortKey = sortKey( key ); - + if ( sortKey != null ) { map.put( sortKey, valueMap.get( key ) ); @@ -667,9 +652,9 @@ } /** - * Sorts the given key by splitting on the '-' character and sorting the + * Sorts the given key by splitting on the '-' character and sorting the * components alphabetically. - * + * * @param valueMap the mapping of keys and values. */ public static String sortKey( String key ) @@ -682,7 +667,7 @@ key = StringUtils.join( ids, DIMENSION_SEP ); } - + return key; } @@ -807,6 +792,10 @@ // Getters and setters // ------------------------------------------------------------------------- + @JsonProperty + @JsonView( { DetailedView.class, ExportView.class } ) + @JacksonXmlElementWrapper( localName = "categoryDimensions", namespace = DxfNamespaces.DXF_2_0 ) + @JacksonXmlProperty( localName = "categoryDimension", namespace = DxfNamespaces.DXF_2_0 ) public List getCategoryDimensions() { return categoryDimensions; === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElementCategoryDimension.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElementCategoryDimension.java 2014-08-15 07:40:20 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElementCategoryDimension.java 2014-12-02 09:31:18 +0000 @@ -28,18 +28,32 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonView; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; +import org.hisp.dhis.common.BaseIdentifiableObject; +import org.hisp.dhis.common.DxfNamespaces; +import org.hisp.dhis.common.annotation.Scanned; +import org.hisp.dhis.common.view.DetailedView; +import org.hisp.dhis.common.view.ExportView; + import java.util.ArrayList; import java.util.List; /** -* @author Lars Helge Overland -*/ + * @author Lars Helge Overland + */ +@JacksonXmlRootElement( localName = "categoryDimension", namespace = DxfNamespaces.DXF_2_0 ) public class DataElementCategoryDimension { private int id; - + private DataElementCategory dimension; - + + @Scanned private List items = new ArrayList<>(); public int getId() @@ -52,6 +66,10 @@ this.id = id; } + @JsonProperty( "dataElementCategory" ) + @JsonSerialize( as = BaseIdentifiableObject.class ) + @JsonView( { DetailedView.class, ExportView.class } ) + @JacksonXmlProperty( localName = "dataElementCategory", namespace = DxfNamespaces.DXF_2_0 ) public DataElementCategory getDimension() { return dimension; @@ -62,6 +80,10 @@ this.dimension = dimension; } + @JsonProperty( "categoryOptions" ) + @JsonView( { DetailedView.class, ExportView.class } ) + @JacksonXmlElementWrapper( localName = "categoryOptions", namespace = DxfNamespaces.DXF_2_0 ) + @JacksonXmlProperty( localName = "categoryOption", namespace = DxfNamespaces.DXF_2_0 ) public List getItems() { return items; @@ -71,4 +93,16 @@ { this.items = items; } + + + @Override + public String toString() + { + final StringBuilder sb = new StringBuilder( "DataElementCategoryDimension{" ); + sb.append( "id=" ).append( id ); + sb.append( ", dimension=" ).append( dimension ); + sb.append( ", items=" ).append( items ); + sb.append( '}' ); + return sb.toString(); + } } === modified file 'dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/importers/DefaultIdentifiableObjectImporter.java' --- dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/importers/DefaultIdentifiableObjectImporter.java 2014-11-29 05:33:04 +0000 +++ dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/importers/DefaultIdentifiableObjectImporter.java 2014-12-02 09:31:18 +0000 @@ -42,6 +42,8 @@ import org.hisp.dhis.common.IdentifiableObject; import org.hisp.dhis.common.NameableObject; import org.hisp.dhis.dashboard.DashboardItem; +import org.hisp.dhis.dataelement.DataElementCategoryDimension; +import org.hisp.dhis.dataelement.DataElementCategoryService; import org.hisp.dhis.dataelement.DataElementOperand; import org.hisp.dhis.dataelement.DataElementOperandService; import org.hisp.dhis.dataentryform.DataEntryForm; @@ -80,6 +82,7 @@ import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collection; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -137,6 +140,9 @@ @Autowired private PasswordManager passwordManager; + @Autowired + private DataElementCategoryService categoryService; + //------------------------------------------------------------------------------------------------------- // Constructor //------------------------------------------------------------------------------------------------------- @@ -836,13 +842,15 @@ private DataEntryForm dataEntryForm; - private Set compulsoryDataElementOperands = Sets.newHashSet(); - private Set greyedFields = Sets.newHashSet(); - private List dataElementOperands = Lists.newArrayList(); + private Set compulsoryDataElementOperands = new HashSet<>(); + private Set greyedFields = new HashSet<>(); + private List dataElementOperands = new ArrayList<>(); - private Collection programStageDataElements = Lists.newArrayList(); + private Collection programStageDataElements = new ArrayList<>(); private List programTrackedEntityAttributes = new ArrayList<>(); + private List categoryDimensions = new ArrayList<>(); + public void extract( T object ) { attributeValues = extractAttributeValues( object ); @@ -854,6 +862,7 @@ dataElementOperands = Lists.newArrayList( extractDataElementOperands( object, "dataElementOperands" ) ); programStageDataElements = extractProgramStageDataElements( object ); programTrackedEntityAttributes = extractProgramTrackedEntityAttributes( object ); + categoryDimensions = extractCategoryDimensions( object ); } public void delete( T object ) @@ -888,6 +897,7 @@ saveDataElementOperands( object, "dataElementOperands", dataElementOperands ); saveProgramStageDataElements( object, programStageDataElements ); saveProgramTrackedEntityAttributes( object, programTrackedEntityAttributes ); + saveCategoryDimensions( object, categoryDimensions ); } private void saveDataEntryForm( T object, String fieldName, DataEntryForm dataEntryForm ) @@ -965,12 +975,49 @@ dataElementOperands = ReflectionUtils.newCollectionInstance( detachedDataElementOperands.getClass() ); dataElementOperands.addAll( detachedDataElementOperands ); detachedDataElementOperands.clear(); - // ReflectionUtils.invokeSetterMethod( fieldName, object, ReflectionUtils.newCollectionInstance( detachedDataElementOperands.getClass() ) ); } return dataElementOperands; } + private List extractCategoryDimensions( T object ) + { + List dataElementCategoryDimensions = new ArrayList<>(); + Method getterMethod = ReflectionUtils.findGetterMethod( "categoryDimensions", object ); + + if ( getterMethod != null ) + { + List detachedCategoryDimensions = ReflectionUtils.invokeMethod( object, getterMethod ); + dataElementCategoryDimensions.addAll( detachedCategoryDimensions ); + detachedCategoryDimensions.clear(); + } + + return dataElementCategoryDimensions; + } + + private void saveCategoryDimensions( T object, List categoryDimensions ) + { + Method getterMethod = ReflectionUtils.findGetterMethod( "categoryDimensions", object ); + + if ( categoryDimensions != null && !categoryDimensions.isEmpty() && getterMethod != null ) + { + List detachedCategoryDimensions = ReflectionUtils.invokeMethod( object, getterMethod ); + + for ( DataElementCategoryDimension categoryDimension : categoryDimensions ) + { + Map detachFields = detachFields( categoryDimension ); + reattachFields( categoryDimension, detachFields ); + + Map> detachCollectionFields = detachCollectionFields( categoryDimension ); + reattachCollectionFields( categoryDimension, detachCollectionFields ); + + categoryDimension.setId( 0 ); + detachedCategoryDimensions.add( categoryDimension ); + } + + } + } + private Set extractAttributeValues( T object ) { Set attributeValues = Sets.newHashSet(); === 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-09-30 07:02:57 +0000 +++ dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/ReflectionUtils.java 2014-12-02 09:31:18 +0000 @@ -429,11 +429,7 @@ { return (T) method.invoke( target, args ); } - catch ( InvocationTargetException e ) - { - throw new RuntimeException( e ); - } - catch ( IllegalAccessException e ) + catch ( InvocationTargetException | IllegalAccessException e ) { throw new RuntimeException( e ); }