← Back to team overview

dhis2-devs team mailing list archive

[Branch ~dhis2-devs-core/dhis2/trunk] Rev 17637: support import/export of AnalyticalObjects with category dimensions

 

------------------------------------------------------------
revno: 17637
committer: Morten Olav Hansen <mortenoh@xxxxxxxxx>
branch nick: dhis2
timestamp: Tue 2014-12-02 16:31:18 +0700
message:
  support import/export of AnalyticalObjects with category dimensions
modified:
  dhis-2/dhis-api/src/main/java/org/hisp/dhis/chart/BaseChart.java
  dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/BaseAnalyticalObject.java
  dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElementCategoryDimension.java
  dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/importers/DefaultIdentifiableObjectImporter.java
  dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/ReflectionUtils.java


--
lp:dhis2
https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk

Your team DHIS 2 developers is subscribed to branch lp:dhis2.
To unsubscribe from this branch go to https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk/+edit-subscription
=== 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<OrganisationUnit> organisationUnitsInGroups = new ArrayList<>();
 
     protected transient Grid dataItemGrid = null;
-    
+
     // -------------------------------------------------------------------------
     // Abstract methods
     // -------------------------------------------------------------------------
 
     public abstract List<NameableObject> series();
-    
+
     public abstract List<NameableObject> category();
-    
+
     public abstract AnalyticsType getAnalyticsType();
-    
+
     // -------------------------------------------------------------------------
     // Logic
     // -------------------------------------------------------------------------
@@ -167,7 +166,7 @@
     public String generateTitle()
     {
         List<String> 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<DataElementCategoryDimension> 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<String, TrackedEntityDataElementDimension> 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<String, Object> 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<DataElementCategoryDimension> 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<DataElementCategoryOption> 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<DataElementCategoryOption> 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<DataElementOperand> compulsoryDataElementOperands = Sets.newHashSet();
-        private Set<DataElementOperand> greyedFields = Sets.newHashSet();
-        private List<DataElementOperand> dataElementOperands = Lists.newArrayList();
+        private Set<DataElementOperand> compulsoryDataElementOperands = new HashSet<>();
+        private Set<DataElementOperand> greyedFields = new HashSet<>();
+        private List<DataElementOperand> dataElementOperands = new ArrayList<>();
 
-        private Collection<ProgramStageDataElement> programStageDataElements = Lists.newArrayList();
+        private Collection<ProgramStageDataElement> programStageDataElements = new ArrayList<>();
         private List<ProgramTrackedEntityAttribute> programTrackedEntityAttributes = new ArrayList<>();
 
+        private List<DataElementCategoryDimension> 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<DataElementCategoryDimension> extractCategoryDimensions( T object )
+        {
+            List<DataElementCategoryDimension> dataElementCategoryDimensions = new ArrayList<>();
+            Method getterMethod = ReflectionUtils.findGetterMethod( "categoryDimensions", object );
+
+            if ( getterMethod != null )
+            {
+                List<DataElementCategoryDimension> detachedCategoryDimensions = ReflectionUtils.invokeMethod( object, getterMethod );
+                dataElementCategoryDimensions.addAll( detachedCategoryDimensions );
+                detachedCategoryDimensions.clear();
+            }
+
+            return dataElementCategoryDimensions;
+        }
+
+        private void saveCategoryDimensions( T object, List<DataElementCategoryDimension> categoryDimensions )
+        {
+            Method getterMethod = ReflectionUtils.findGetterMethod( "categoryDimensions", object );
+
+            if ( categoryDimensions != null && !categoryDimensions.isEmpty() && getterMethod != null )
+            {
+                List<DataElementCategoryDimension> detachedCategoryDimensions = ReflectionUtils.invokeMethod( object, getterMethod );
+
+                for ( DataElementCategoryDimension categoryDimension : categoryDimensions )
+                {
+                    Map<Field, Object> detachFields = detachFields( categoryDimension );
+                    reattachFields( categoryDimension, detachFields );
+
+                    Map<Field, Collection<Object>> detachCollectionFields = detachCollectionFields( categoryDimension );
+                    reattachCollectionFields( categoryDimension, detachCollectionFields );
+
+                    categoryDimension.setId( 0 );
+                    detachedCategoryDimensions.add( categoryDimension );
+                }
+
+            }
+        }
+
         private Set<AttributeValue> extractAttributeValues( T object )
         {
             Set<AttributeValue> 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 );
         }