=== modified file 'dhis-2/dhis-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/importers/DefaultIdentifiableObjectImporter.java' --- dhis-2/dhis-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/importers/DefaultIdentifiableObjectImporter.java 2012-05-23 18:35:22 +0000 +++ dhis-2/dhis-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/importers/DefaultIdentifiableObjectImporter.java 2012-05-23 19:58:27 +0000 @@ -141,16 +141,16 @@ log.debug( "Trying to save new object => " + getDisplayName( object ) + " (" + object.getClass().getSimpleName() + ")" ); - Map> identifiableObjectCollections = - scanIdentifiableObjectCollections( object ); + Map fields = detachFields( object ); + importConflicts.addAll( reattachFields( object, fields ) ); - importConflicts.addAll( updateIdentifiableObjects( object, scanIdentifiableObjects( object ) ) ); + Map> collectionFields = detachCollectionFields( object ); objectBridge.saveObject( object ); - importConflicts.addAll( updateIdentifiableObjectCollections( object, identifiableObjectCollections ) ); - updatePeriodTypes( object ); + importConflicts.addAll( reattachCollectionFields( object, collectionFields ) ); + objectBridge.updateObject( object ); log.debug( "Save successful." ); @@ -172,12 +172,16 @@ log.debug( "Starting update of object " + getDisplayName( oldObject ) + " (" + oldObject.getClass() .getSimpleName() + ")" ); - importConflicts.addAll( updateIdentifiableObjects( object, scanIdentifiableObjects( object ) ) ); - importConflicts.addAll( updateIdentifiableObjectCollections( object, scanIdentifiableObjectCollections( object ) ) ); + Map fields = detachFields( object ); + importConflicts.addAll( reattachFields( object, fields ) ); + + Map> collectionFields = detachCollectionFields( object ); oldObject.mergeWith( object ); updatePeriodTypes( oldObject ); + importConflicts.addAll( reattachCollectionFields( object, collectionFields ) ); + objectBridge.updateObject( oldObject ); log.debug( "Update successful." ); @@ -368,7 +372,8 @@ { if ( expression != null ) { - updateIdentifiableObjectCollections( expression, scanIdentifiableObjectCollections( expression ) ); + Map> identifiableObjectCollections = detachCollectionFields( expression ); + reattachCollectionFields( expression, identifiableObjectCollections ); expression.setId( 0 ); expressionService.addExpression( expression ); @@ -385,7 +390,8 @@ { for ( DataElementOperand dataElementOperand : dataElementOperands ) { - updateIdentifiableObjects( dataElementOperand, scanIdentifiableObjects( dataElementOperand ) ); + Map identifiableObjects = detachFields( dataElementOperand ); + reattachFields( dataElementOperand, identifiableObjects ); dataElementOperand.setId( 0 ); dataElementOperandService.addDataElementOperand( dataElementOperand ); @@ -673,37 +679,37 @@ return objectBridge.getObject( identifiableObject ); } - private Map scanIdentifiableObjects( Object object ) + private Map detachFields( Object object ) { - Map identifiableObjects = new HashMap(); + Map fieldMap = new HashMap(); Field[] fields = object.getClass().getDeclaredFields(); for ( Field field : fields ) { + if ( ReflectionUtils.isType( field, IdentifiableObject.class ) ) { - IdentifiableObject ref = ReflectionUtils.invokeGetterMethod( field.getName(), object ); + Object ref = ReflectionUtils.invokeGetterMethod( field.getName(), object ); if ( ref != null ) { - identifiableObjects.put( field, ref ); + fieldMap.put( field, ref ); ReflectionUtils.invokeSetterMethod( field.getName(), object, new Object[]{ null } ); } } } - return identifiableObjects; + return fieldMap; } - private List updateIdentifiableObjects( Object object, - Map identifiableObjects ) + private List reattachFields( Object object, Map fields ) { List importConflicts = new ArrayList(); - for ( Field field : identifiableObjects.keySet() ) + for ( Field field : fields.keySet() ) { - IdentifiableObject idObject = identifiableObjects.get( field ); + IdentifiableObject idObject = (IdentifiableObject) fields.get( field ); IdentifiableObject ref = findObjectByReference( idObject ); if ( ref == null ) @@ -729,9 +735,9 @@ return importConflicts; } - private Map> scanIdentifiableObjectCollections( Object object ) + private Map> detachCollectionFields( Object object ) { - Map> collected = new HashMap>(); + Map> collected = new HashMap>(); Field[] fields = object.getClass().getDeclaredFields(); for ( Field field : fields ) @@ -741,13 +747,11 @@ if ( b ) { - Collection objects = ReflectionUtils.invokeGetterMethod( field.getName(), - object ); + Collection objects = ReflectionUtils.invokeGetterMethod( field.getName(), object ); if ( objects != null && !objects.isEmpty() ) { - Set identifiableObjects = new HashSet( objects ); - collected.put( field, identifiableObjects ); + collected.put( field, objects ); objects.clear(); } } @@ -756,23 +760,22 @@ return collected; } - private List updateIdentifiableObjectCollections( Object object, - Map> identifiableObjectCollections ) + private List reattachCollectionFields( Object object, Map> collectionFields ) { List importConflicts = new ArrayList(); - for ( Field field : identifiableObjectCollections.keySet() ) + for ( Field field : collectionFields.keySet() ) { - Collection identifiableObjects = identifiableObjectCollections.get( field ); - Collection objects; + Collection identifiableObjects = collectionFields.get( field ); + Collection objects; if ( List.class.isAssignableFrom( field.getType() ) ) { - objects = new ArrayList(); + objects = new ArrayList(); } else if ( Set.class.isAssignableFrom( field.getType() ) ) { - objects = new HashSet(); + objects = new HashSet(); } else { @@ -780,9 +783,9 @@ continue; } - for ( IdentifiableObject idObject : identifiableObjects ) + for ( Object idObject : identifiableObjects ) { - IdentifiableObject ref = findObjectByReference( idObject ); + IdentifiableObject ref = findObjectByReference( (IdentifiableObject) idObject ); if ( ref != null ) {