=== 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 2015-11-23 07:21:18 +0000 +++ dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/importers/DefaultIdentifiableObjectImporter.java 2015-11-24 06:16:34 +0000 @@ -37,7 +37,6 @@ import org.hisp.dhis.attribute.Attribute; import org.hisp.dhis.attribute.AttributeService; import org.hisp.dhis.attribute.AttributeValue; -import org.hisp.dhis.attribute.exception.NonUniqueAttributeValueException; import org.hisp.dhis.common.BaseAnalyticalObject; import org.hisp.dhis.common.BaseIdentifiableObject; import org.hisp.dhis.common.DataDimensionItem; @@ -73,6 +72,7 @@ import org.hisp.dhis.program.ProgramStageDataElement; import org.hisp.dhis.program.ProgramTrackedEntityAttribute; import org.hisp.dhis.program.ProgramValidation; +import org.hisp.dhis.schema.Schema; import org.hisp.dhis.schema.SchemaService; import org.hisp.dhis.security.acl.AclService; import org.hisp.dhis.system.util.ReflectionUtils; @@ -938,6 +938,8 @@ private User user; + private Schema schema; + private NonIdentifiableObjects( User user ) { this.user = user; @@ -945,6 +947,7 @@ public void extract( T object ) { + schema = schemaService.getDynamicSchema( object.getClass() ); attributeValues = extractAttributeValues( object ); leftSide = extractExpression( object, "leftSide" ); rightSide = extractExpression( object, "rightSide" ); @@ -958,9 +961,10 @@ public void delete( T object ) { + schema = schemaService.getDynamicSchema( object.getClass() ); + if ( !options.isDryRun() ) { - deleteAttributeValues( object ); deleteExpression( object, "leftSide" ); deleteExpression( object, "rightSide" ); deleteDataEntryForm( object, "dataEntryForm" ); @@ -976,6 +980,8 @@ public void save( T object ) { + schema = schemaService.getDynamicSchema( object.getClass() ); + saveAttributeValues( object, attributeValues ); saveExpression( object, "leftSide", leftSide ); saveExpression( object, "rightSide", rightSide ); @@ -1112,23 +1118,6 @@ } } - private Set extractAttributeValues( T object ) - { - Set attributeValues = Sets.newHashSet(); - - if ( ReflectionUtils.findGetterMethod( "attributeValues", object ) != null ) - { - attributeValues = ReflectionUtils.invokeGetterMethod( "attributeValues", object ); - - if ( attributeValues != null && attributeValues.size() > 0 ) - { - ReflectionUtils.invokeSetterMethod( "attributeValues", object, Sets.newHashSet() ); - } - } - - return attributeValues; - } - private void saveExpression( T object, String fieldName, Expression expression ) { if ( expression != null ) @@ -1166,46 +1155,41 @@ sessionFactory.getCurrentSession().flush(); } - private void deleteAttributeValues( T object ) + private Set extractAttributeValues( T object ) { - if ( !Attribute.class.isAssignableFrom( object.getClass() ) ) + Set attributeValues = new HashSet<>(); + + if ( schema.havePersistedProperty( "attributeValues" ) ) { - Set attributeValues = extractAttributeValues( object ); - attributeValues.forEach( attributeService::deleteAttributeValue ); + attributeValues = ReflectionUtils.invokeGetterMethod( "attributeValues", object ); + ReflectionUtils.invokeSetterMethod( "attributeValues", object, new HashSet<>() ); } + + return attributeValues; } private void saveAttributeValues( T object, Collection attributeValues ) { - if ( attributeValues != null && attributeValues.size() > 0 ) - { - for ( AttributeValue attributeValue : attributeValues ) - { - Attribute attribute = objectBridge.getObject( attributeValue.getAttribute() ); - - if ( attribute == null ) - { - log.debug( "Unknown reference to " + attributeValue.getAttribute() + " on object " + attributeValue ); - return; - } - - attributeValue.setId( 0 ); - attributeValue.setAttribute( attribute ); - } - - for ( AttributeValue attributeValue : attributeValues ) - { - try - { - attributeService.addAttributeValue( object, attributeValue ); - } - catch ( NonUniqueAttributeValueException ex ) - { - log.info( ex.getMessage() ); - } - } - - ReflectionUtils.invokeSetterMethod( "attributeValues", object, attributeValues ); + for ( AttributeValue attributeValue : attributeValues ) + { + Attribute attribute = objectBridge.getObject( attributeValue.getAttribute() ); + + if ( attribute == null ) + { + log.debug( "Unknown reference to " + attributeValue.getAttribute() + " on object " + attributeValue ); + return; + } + + attributeValue.setAttribute( attribute ); + } + + try + { + attributeService.updateAttributeValues( object, new HashSet<>( attributeValues ) ); + } + catch ( Exception ex ) + { + log.info( ex.getMessage() ); } }