merge-update from trunk
[cdmlib.git] / cdmlib-model / src / main / java / eu / etaxonomy / cdm / strategy / merge / DefaultMergeStrategy.java
index f84611b5a580abb1e22924947e9c7391f57785ce..d8f2ad77f5ca15d2c995e7dfd92ddfa476728c33 100644 (file)
@@ -14,8 +14,9 @@ import java.lang.annotation.Annotation;
 import java.lang.reflect.Field;\r
 import java.lang.reflect.GenericDeclaration;\r
 import java.lang.reflect.Method;\r
-import java.lang.reflect.Modifier;\r
+import java.lang.reflect.ParameterizedType;\r
 import java.lang.reflect.Type;\r
+import java.lang.reflect.TypeVariable;\r
 import java.util.ArrayList;\r
 import java.util.Collection;\r
 import java.util.HashMap;\r
@@ -25,21 +26,13 @@ import java.util.Map;
 import java.util.Set;\r
 import java.util.UUID;\r
 \r
-import javax.persistence.Transient;\r
-\r
 import org.apache.log4j.Logger;\r
-import org.joda.time.DateTime;\r
 \r
-import sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl;\r
-import sun.reflect.generics.reflectiveObjects.TypeVariableImpl;\r
 import eu.etaxonomy.cdm.common.CdmUtils;\r
-import eu.etaxonomy.cdm.model.agent.Contact;\r
 import eu.etaxonomy.cdm.model.common.CdmBase;\r
 import eu.etaxonomy.cdm.model.common.ICdmBase;\r
 import eu.etaxonomy.cdm.model.common.IRelated;\r
-import eu.etaxonomy.cdm.model.common.LSID;\r
 import eu.etaxonomy.cdm.model.common.RelationshipBase;\r
-import eu.etaxonomy.cdm.model.common.TimePeriod;\r
 import eu.etaxonomy.cdm.strategy.StrategyBase;\r
 \r
 /**\r
@@ -192,6 +185,8 @@ public class DefaultMergeStrategy extends StrategyBase implements IMergeStrategy
                                        mergeSingleCdmBaseField(mergeFirst, mergeSecond, field, deleteSet);\r
                                }else if(fieldType.isInterface()){\r
                                        mergeInterfaceField(mergeFirst, mergeSecond, field, deleteSet);\r
+                               }else if(fieldType.isEnum()){\r
+                                       mergeEnumField(mergeFirst, mergeSecond, field, deleteSet);\r
                                }else{\r
                                        throw new RuntimeException("Unknown Object type for merging: " + fieldType);\r
                                }\r
@@ -213,7 +208,21 @@ public class DefaultMergeStrategy extends StrategyBase implements IMergeStrategy
                if (mergeMode != MergeMode.FIRST){\r
                        mergeCdmBaseValue(mergeFirst, mergeSecond, field, deleteSet);\r
                }\r
-               System.out.println(propertyName + ": " + mergeMode + ", " + field.getType().getName());\r
+               logger.debug(propertyName + ": " + mergeMode + ", " + field.getType().getName());\r
+               \r
+       }\r
+\r
+       /**\r
+        * @throws Exception \r
+        * \r
+        */\r
+       private <T extends IMergable> void mergeEnumField(T mergeFirst, T mergeSecond, Field field, Set<ICdmBase> deleteSet) throws Exception {\r
+               String propertyName = field.getName();\r
+               MergeMode mergeMode =  this.getMergeMode(propertyName);\r
+               if (mergeMode != MergeMode.FIRST){\r
+                       mergeCdmBaseValue(mergeFirst, mergeSecond, field, deleteSet);\r
+               }\r
+               logger.debug(propertyName + ": " + mergeMode + ", " + field.getType().getName());\r
                \r
        }\r
        \r
@@ -227,7 +236,7 @@ public class DefaultMergeStrategy extends StrategyBase implements IMergeStrategy
                if (mergeMode != MergeMode.FIRST){\r
                        mergeCdmBaseValue(mergeFirst, mergeSecond, field, deleteSet);\r
                }\r
-               System.out.println(propertyName + ": " + mergeMode + ", " + field.getType().getName());\r
+               logger.debug(propertyName + ": " + mergeMode + ", " + field.getType().getName());\r
                \r
        }\r
        \r
@@ -264,7 +273,7 @@ public class DefaultMergeStrategy extends StrategyBase implements IMergeStrategy
                        Object value = getMergeValue(mergeFirst, mergeSecond, field);\r
                        field.set(mergeFirst, value);\r
                }\r
-               System.out.println(propertyName + ": " + mergeMode + ", " + fieldType.getName());\r
+               logger.debug(propertyName + ": " + mergeMode + ", " + fieldType.getName());\r
        }\r
        \r
        /**\r
@@ -290,7 +299,7 @@ public class DefaultMergeStrategy extends StrategyBase implements IMergeStrategy
                if (mergeMode != MergeMode.FIRST){\r
                        mergeCollectionFieldNoFirst(mergeFirst, mergeSecond, field, mergeMode, deleteSet, clonedObjects);\r
                }\r
-               System.out.println(propertyName + ": " + mergeMode + ", " + fieldType.getName());\r
+               logger.debug(propertyName + ": " + mergeMode + ", " + fieldType.getName());\r
                \r
        }\r
 \r
@@ -304,6 +313,7 @@ public class DefaultMergeStrategy extends StrategyBase implements IMergeStrategy
                        if (Set.class.isAssignableFrom(fieldType) || List.class.isAssignableFrom(fieldType)){\r
                                Collection<ICdmBase> secondCollection = (Collection<ICdmBase>)field.get(mergeSecond);\r
                                List<ICdmBase> removeList = new ArrayList<ICdmBase>();\r
+                               if(secondCollection != null) {\r
                                for (ICdmBase obj : secondCollection){\r
                                        Object objectToAdd; \r
                                        if (mergeMode == MergeMode.ADD){\r
@@ -318,6 +328,7 @@ public class DefaultMergeStrategy extends StrategyBase implements IMergeStrategy
                                        addMethod.invoke(mergeFirst, objectToAdd);\r
                                        removeList.add(obj);\r
                                }\r
+                               }\r
                                for (ICdmBase removeObj : removeList ){\r
                                        //removeMethod.invoke(mergeSecond, removeObj);\r
                                        if ((removeObj instanceof CdmBase)&& mergeMode == MergeMode.ADD_CLONE) {\r
@@ -413,7 +424,7 @@ public class DefaultMergeStrategy extends StrategyBase implements IMergeStrategy
                        Object value = getMergeValue(mergeFirst, mergeSecond, field);\r
                        field.set(mergeFirst, value);\r
                }\r
-               System.out.println(propertyName + ": " + mergeMode + ", " + fieldType.getName());\r
+               logger.debug(propertyName + ": " + mergeMode + ", " + fieldType.getName());\r
                \r
        }\r
        \r
@@ -429,7 +440,7 @@ public class DefaultMergeStrategy extends StrategyBase implements IMergeStrategy
                        Object value = getMergeValue(mergeFirst, mergeSecond, field);\r
                        field.set(mergeFirst, value);\r
                }\r
-               System.out.println(propertyName + ": " + mergeMode + ", " + fieldType.getName());\r
+               logger.debug(propertyName + ": " + mergeMode + ", " + fieldType.getName());\r
                \r
        }\r
 \r
@@ -482,18 +493,18 @@ public class DefaultMergeStrategy extends StrategyBase implements IMergeStrategy
 \r
        \r
        private static Class getCollectionType(Field field) throws MergeException{\r
-               Type genericType = (ParameterizedTypeImpl)field.getGenericType();\r
-               if (genericType instanceof ParameterizedTypeImpl){\r
-                       ParameterizedTypeImpl paraType = (ParameterizedTypeImpl)genericType;\r
-                       Class<?> rawType = paraType.getRawType();\r
+               Type genericType = (ParameterizedType)field.getGenericType();\r
+               if (genericType instanceof ParameterizedType/*Impl*/){\r
+                       ParameterizedType paraType = (ParameterizedType)genericType;\r
+                       Type rawType = paraType.getRawType();\r
                        Type[] arguments = paraType.getActualTypeArguments();\r
-                       //System.out.println(arguments.length);\r
+\r
                        if (arguments.length == 1){\r
                                Class collectionClass;\r
                                if (arguments[0] instanceof Class){\r
                                        collectionClass = (Class)arguments[0];\r
-                               }else if(arguments[0] instanceof TypeVariableImpl){\r
-                                       TypeVariableImpl typeVariable = (TypeVariableImpl)arguments[0];\r
+                               }else if(arguments[0] instanceof TypeVariable/*Impl*/){\r
+                                       TypeVariable typeVariable = (TypeVariable)arguments[0];\r
                                        GenericDeclaration genericDeclaration = typeVariable.getGenericDeclaration();\r
                                        collectionClass = (Class)genericDeclaration;\r
                                }else{\r