dhis2-devs team mailing list archive
-
dhis2-devs team
-
Mailing list archive
-
Message #34364
[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 );
}