=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/BaseMetaDataCollectionObject.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/BaseMetaDataCollectionObject.java 2014-10-25 21:58:41 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/BaseMetaDataCollectionObject.java 2014-11-29 05:00:47 +0000 @@ -129,8 +129,7 @@ } @JsonProperty - @JsonSerialize( contentAs = BaseIdentifiableObject.class ) - @JsonView( DetailedView.class ) + @JsonView( { DetailedView.class, ExportView.class } ) @JacksonXmlElementWrapper( localName = "dataElementOperands", namespace = DxfNamespaces.DXF_2_0 ) @JacksonXmlProperty( localName = "dataElementOperand", namespace = DxfNamespaces.DXF_2_0 ) public List getDataElementOperands() === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElementOperand.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElementOperand.java 2014-11-18 11:35:52 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElementOperand.java 2014-11-29 05:00:47 +0000 @@ -31,6 +31,8 @@ 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.apache.commons.lang.StringUtils; import org.hisp.dhis.common.BaseIdentifiableObject; @@ -149,6 +151,12 @@ // ------------------------------------------------------------------------- @Override + public boolean haveUniqueNames() + { + return false; + } + + @Override public String getUid() { if ( uid != null ) @@ -254,7 +262,7 @@ public Integer getRelevantAggregationLevel( int organisationUnitLevel ) { List levels = new ArrayList<>( aggregationLevels ); - + Collections.sort( levels ); for ( final Integer aggregationLevel : levels ) @@ -426,6 +434,7 @@ @JsonProperty @JsonSerialize( as = BaseIdentifiableObject.class ) @JsonView( { DetailedView.class, ExportView.class } ) + @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0 ) public DataElement getDataElement() { return dataElement; @@ -439,6 +448,7 @@ @JsonProperty @JsonSerialize( as = BaseIdentifiableObject.class ) @JsonView( { DetailedView.class, ExportView.class } ) + @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0 ) public DataElementCategoryOptionCombo getCategoryOptionCombo() { return categoryOptionCombo; @@ -451,6 +461,7 @@ @JsonProperty @JsonView( { DetailedView.class } ) + @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0 ) public String getDataElementId() { return dataElementId; @@ -463,6 +474,7 @@ @JsonProperty @JsonView( { DetailedView.class } ) + @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0 ) public String getOptionComboId() { return optionComboId; @@ -475,6 +487,7 @@ @JsonProperty @JsonView( { DetailedView.class } ) + @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0 ) public String getOperandId() { return operandId; @@ -487,6 +500,7 @@ @JsonProperty @JsonView( { DetailedView.class } ) + @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0 ) public String getOperandName() { return operandName; @@ -499,6 +513,7 @@ @JsonProperty @JsonView( { DetailedView.class } ) + @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0 ) public String getValueType() { return valueType; @@ -511,6 +526,7 @@ @JsonProperty @JsonView( { DetailedView.class } ) + @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0 ) public String getAggregationOperator() { return aggregationOperator; @@ -523,6 +539,8 @@ @JsonProperty @JsonView( { DetailedView.class } ) + @JacksonXmlElementWrapper( localName = "aggregationLevels", namespace = DxfNamespaces.DXF_2_0 ) + @JacksonXmlProperty( localName = "aggregationLevel", namespace = DxfNamespaces.DXF_2_0 ) public List getAggregationLevels() { return aggregationLevels; @@ -535,6 +553,7 @@ @JsonProperty @JsonView( { DetailedView.class } ) + @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0 ) public int getFrequencyOrder() { return frequencyOrder; @@ -547,6 +566,7 @@ @JsonProperty @JsonView( { DetailedView.class } ) + @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0 ) public String getOperandType() { return operandType; @@ -559,6 +579,7 @@ @JsonProperty @JsonView( { DetailedView.class } ) + @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0 ) public boolean isHasAggregationLevels() { return hasAggregationLevels; === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataset/Section.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataset/Section.java 2014-09-30 09:08:21 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataset/Section.java 2014-11-29 05:00:47 +0000 @@ -28,11 +28,12 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - +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.IdentifiableObject; @@ -44,14 +45,12 @@ import org.hisp.dhis.dataelement.DataElementOperand; import org.hisp.dhis.indicator.Indicator; -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 java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; -@JacksonXmlRootElement(localName = "section", namespace = DxfNamespaces.DXF_2_0) +@JacksonXmlRootElement( localName = "section", namespace = DxfNamespaces.DXF_2_0 ) public class Section extends BaseIdentifiableObject { @@ -61,7 +60,7 @@ private static final long serialVersionUID = -4657657995917502852L; private String description; - + private DataSet dataSet; @Scanned @@ -156,7 +155,7 @@ { return true; } - + categoryCombo = element.getCategoryCombo(); } } @@ -164,7 +163,7 @@ return false; } - + public boolean hasDataElements() { return dataElements != null && !dataElements.isEmpty(); @@ -181,22 +180,22 @@ // ------------------------------------------------------------------------- @JsonProperty - @JsonView({ DetailedView.class, ExportView.class }) + @JsonView( { DetailedView.class, ExportView.class } ) @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0 ) public String getDescription() { return description; } - + public void setDescription( String description ) { this.description = description; } - + @JsonProperty - @JsonSerialize(as = BaseIdentifiableObject.class) - @JsonView({ DetailedView.class, ExportView.class }) - @JacksonXmlProperty(namespace = DxfNamespaces.DXF_2_0) + @JsonSerialize( as = BaseIdentifiableObject.class ) + @JsonView( { DetailedView.class, ExportView.class } ) + @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0 ) public DataSet getDataSet() { return dataSet; @@ -208,10 +207,10 @@ } @JsonProperty - @JsonSerialize(contentAs = BaseIdentifiableObject.class) - @JsonView({ DetailedView.class, ExportView.class }) - @JacksonXmlElementWrapper(localName = "dataElements", namespace = DxfNamespaces.DXF_2_0) - @JacksonXmlProperty(localName = "dataElement", namespace = DxfNamespaces.DXF_2_0) + @JsonSerialize( contentAs = BaseIdentifiableObject.class ) + @JsonView( { DetailedView.class, ExportView.class } ) + @JacksonXmlElementWrapper( localName = "dataElements", namespace = DxfNamespaces.DXF_2_0 ) + @JacksonXmlProperty( localName = "dataElement", namespace = DxfNamespaces.DXF_2_0 ) public List getDataElements() { return dataElements; @@ -223,10 +222,10 @@ } @JsonProperty - @JsonSerialize(contentAs = BaseIdentifiableObject.class) - @JsonView({ DetailedView.class, ExportView.class }) - @JacksonXmlElementWrapper(localName = "indicators", namespace = DxfNamespaces.DXF_2_0) - @JacksonXmlProperty(localName = "indicator", namespace = DxfNamespaces.DXF_2_0) + @JsonSerialize( contentAs = BaseIdentifiableObject.class ) + @JsonView( { DetailedView.class, ExportView.class } ) + @JacksonXmlElementWrapper( localName = "indicators", namespace = DxfNamespaces.DXF_2_0 ) + @JacksonXmlProperty( localName = "indicator", namespace = DxfNamespaces.DXF_2_0 ) public List getIndicators() { return indicators; @@ -248,9 +247,9 @@ } @JsonProperty - @JsonView({ DetailedView.class, ExportView.class }) - @JacksonXmlElementWrapper(localName = "greyedFields", namespace = DxfNamespaces.DXF_2_0) - @JacksonXmlProperty(localName = "greyedField", namespace = DxfNamespaces.DXF_2_0) + @JsonView( { DetailedView.class, ExportView.class } ) + @JacksonXmlElementWrapper( localName = "greyedFields", namespace = DxfNamespaces.DXF_2_0 ) + @JacksonXmlProperty( localName = "greyedField", namespace = DxfNamespaces.DXF_2_0 ) public Set getGreyedFields() { return greyedFields; === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/dataset/hibernate/DataSet.hbm.xml' --- dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/dataset/hibernate/DataSet.hbm.xml 2014-10-13 13:58:43 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/dataset/hibernate/DataSet.hbm.xml 2014-11-29 05:00:47 +0000 @@ -38,7 +38,7 @@ - +g === 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-24 14:15:14 +0000 +++ dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/importers/DefaultIdentifiableObjectImporter.java 2014-11-29 05:00:47 +0000 @@ -131,7 +131,7 @@ @Autowired private SchemaService schemaService; - @Autowired(required = false) + @Autowired( required = false ) private List> objectHandlers; @Autowired @@ -674,6 +674,12 @@ private Map detachFields( final Object object ) { final Map fieldMap = Maps.newHashMap(); + + if ( object == null ) + { + return fieldMap; + } + final Collection fieldCollection = ReflectionUtils.collectFields( object.getClass(), idObjects ); for ( Field field : fieldCollection ) @@ -832,6 +838,7 @@ private Set compulsoryDataElementOperands = Sets.newHashSet(); private Set greyedFields = Sets.newHashSet(); + private List dataElementOperands = Lists.newArrayList(); private Collection programStageDataElements = Lists.newArrayList(); private List programTrackedEntityAttributes = new ArrayList<>(); @@ -842,8 +849,9 @@ leftSide = extractExpression( object, "leftSide" ); rightSide = extractExpression( object, "rightSide" ); dataEntryForm = extractDataEntryForm( object, "dataEntryForm" ); - compulsoryDataElementOperands = extractDataElementOperands( object, "compulsoryDataElementOperands" ); - greyedFields = extractDataElementOperands( object, "greyedFields" ); + compulsoryDataElementOperands = Sets.newHashSet( extractDataElementOperands( object, "compulsoryDataElementOperands" ) ); + greyedFields = Sets.newHashSet( extractDataElementOperands( object, "greyedFields" ) ); + dataElementOperands = Lists.newArrayList( extractDataElementOperands( object, "dataElementOperands" ) ); programStageDataElements = extractProgramStageDataElements( object ); programTrackedEntityAttributes = extractProgramTrackedEntityAttributes( object ); } @@ -860,9 +868,10 @@ if ( options.getImportStrategy().isDelete() ) { deleteDataElementOperands( object, "compulsoryDataElementOperands" ); + deleteDataElementOperands( object, "dataElementOperands" ); + deleteDataElementOperands( object, "greyedFields" ); } - deleteDataElementOperands( object, "greyedFields" ); deleteProgramStageDataElements( object ); deleteProgramTrackedEntityAttributes( object ); } @@ -876,6 +885,7 @@ saveDataEntryForm( object, "dataEntryForm", dataEntryForm ); saveDataElementOperands( object, "compulsoryDataElementOperands", compulsoryDataElementOperands ); saveDataElementOperands( object, "greyedFields", greyedFields ); + saveDataElementOperands( object, "dataElementOperands", dataElementOperands ); saveProgramStageDataElements( object, programStageDataElements ); saveProgramTrackedEntityAttributes( object, programTrackedEntityAttributes ); } @@ -944,20 +954,18 @@ return expression; } - private Set extractDataElementOperands( T object, String fieldName ) + private Collection extractDataElementOperands( T object, String fieldName ) { - Set dataElementOperands = Sets.newHashSet(); + Collection dataElementOperands = Sets.newHashSet(); if ( ReflectionUtils.findGetterMethod( fieldName, object ) != null ) { - Set detachedDataElementOperands = ReflectionUtils.invokeGetterMethod( fieldName, object ); - dataElementOperands = Sets.newHashSet( detachedDataElementOperands ); + Collection detachedDataElementOperands = ReflectionUtils.invokeGetterMethod( fieldName, object ); - if ( detachedDataElementOperands.size() > 0 ) - { - detachedDataElementOperands.clear(); - ReflectionUtils.invokeSetterMethod( fieldName, object, Sets.newHashSet() ); - } + dataElementOperands = ReflectionUtils.newCollectionInstance( detachedDataElementOperands.getClass() ); + dataElementOperands.addAll( detachedDataElementOperands ); + detachedDataElementOperands.clear(); + // ReflectionUtils.invokeSetterMethod( fieldName, object, ReflectionUtils.newCollectionInstance( detachedDataElementOperands.getClass() ) ); } return dataElementOperands; @@ -994,38 +1002,28 @@ } } - private void saveDataElementOperands( T object, String fieldName, Set dataElementOperands ) + private void saveDataElementOperands( T object, String fieldName, Collection dataElementOperands ) { - if ( dataElementOperands.size() > 0 ) - { - // need special handling for compulsoryDataElementOperands since they cascade with all-delete-orphan - if ( "compulsoryDataElementOperands".equals( fieldName ) ) - { - for ( DataElementOperand dataElementOperand : dataElementOperands ) - { - Map identifiableObjects = detachFields( dataElementOperand ); - reattachFields( dataElementOperand, identifiableObjects ); - } - - Set detachedDataElementOperands = ReflectionUtils.invokeGetterMethod( fieldName, object ); - detachedDataElementOperands.clear(); - detachedDataElementOperands.addAll( dataElementOperands ); - sessionFactory.getCurrentSession().flush(); - } - else - { - for ( DataElementOperand dataElementOperand : dataElementOperands ) - { - Map identifiableObjects = detachFields( dataElementOperand ); - reattachFields( dataElementOperand, identifiableObjects ); - - dataElementOperand.setId( 0 ); - dataElementOperandService.addDataElementOperand( dataElementOperand ); - } - - ReflectionUtils.invokeSetterMethod( fieldName, object, dataElementOperands ); - } - } + for ( DataElementOperand dataElementOperand : dataElementOperands ) + { + Map identifiableObjects = detachFields( dataElementOperand ); + reattachFields( dataElementOperand, identifiableObjects ); + + dataElementOperandService.addDataElementOperand( dataElementOperand ); + sessionFactory.getCurrentSession().flush(); + } + + Collection detachedDataElementOperands = ReflectionUtils.invokeGetterMethod( fieldName, object ); + + if ( detachedDataElementOperands == null ) + { + detachedDataElementOperands = ReflectionUtils.newCollectionInstance( dataElementOperands.getClass() ); + ReflectionUtils.invokeSetterMethod( fieldName, object, detachedDataElementOperands ); + } + + detachedDataElementOperands.clear(); + detachedDataElementOperands.addAll( dataElementOperands ); + sessionFactory.getCurrentSession().flush(); } private void deleteAttributeValues( T object ) @@ -1080,7 +1078,7 @@ private void deleteDataElementOperands( T object, String fieldName ) { - Set dataElementOperands = extractDataElementOperands( object, fieldName ); + Collection dataElementOperands = extractDataElementOperands( object, fieldName ); for ( DataElementOperand dataElementOperand : dataElementOperands ) {