Workaround for out of memory issues: Added logic to split the amount of taxa to be...
[cdmlib.git] / cdmlib-io / src / main / java / eu / etaxonomy / cdm / io / common / ImportHelper.java
index d6a69529a330b95f66d0639cdcf4538d364cc617..05b084ec1c53f8fbd7a9ba5756d30b584e22ce07 100644 (file)
@@ -1,26 +1,32 @@
 /**\r
- * \r
- */\r
+* Copyright (C) 2009 EDIT\r
+* European Distributed Institute of Taxonomy\r
+* http://www.e-taxonomy.eu\r
+*\r
+* The contents of this file are subject to the Mozilla Public License Version 1.1\r
+* See LICENSE.TXT at the top of this package for the full license terms.\r
+*/ \r
+\r
 package eu.etaxonomy.cdm.io.common;\r
 \r
 import java.lang.reflect.InvocationTargetException;\r
 import java.lang.reflect.Method;\r
 import java.sql.ResultSet;\r
 import java.sql.SQLException;\r
-import java.util.Calendar;\r
+import java.util.List;\r
 \r
 import org.apache.log4j.Logger;\r
 import org.jdom.Element;\r
 import org.jdom.Namespace;\r
-import org.joda.time.DateTime;\r
 \r
 import eu.etaxonomy.cdm.common.CdmUtils;\r
 import eu.etaxonomy.cdm.model.common.AnnotatableEntity;\r
 import eu.etaxonomy.cdm.model.common.Annotation;\r
 import eu.etaxonomy.cdm.model.common.CdmBase;\r
+import eu.etaxonomy.cdm.model.common.ISourceable;\r
 import eu.etaxonomy.cdm.model.common.IdentifiableEntity;\r
+import eu.etaxonomy.cdm.model.common.IdentifiableSource;\r
 import eu.etaxonomy.cdm.model.common.Language;\r
-import eu.etaxonomy.cdm.model.common.OriginalSource;\r
 import eu.etaxonomy.cdm.model.common.TimePeriod;\r
 import eu.etaxonomy.cdm.model.reference.ReferenceBase;\r
 /**\r
@@ -49,11 +55,8 @@ public class ImportHelper {
         * @param sourceId\r
         * @return\r
         */\r
-       public static boolean setOriginalSource(IdentifiableEntity idEntity, ReferenceBase sourceReference, String sourceId, String namespace){\r
-               OriginalSource originalSource = new OriginalSource();\r
-               originalSource.setIdInSource(sourceId);\r
-               originalSource.setCitation(sourceReference);\r
-               originalSource.setIdNamespace(namespace);\r
+       public static boolean setOriginalSource(ISourceable idEntity, ReferenceBase sourceReference, String sourceId, String namespace){\r
+               IdentifiableSource originalSource = IdentifiableSource.NewInstance(sourceId, namespace, sourceReference, null);\r
                idEntity.addSource(originalSource);\r
                return true;\r
        }\r
@@ -157,6 +160,64 @@ public class ImportHelper {
                                return true;\r
                        }\r
                }\r
+               \r
+       }\r
+\r
+       private static boolean valuesAreNull(List<Object> values){\r
+               for (Object sourceValue : values.toArray()){\r
+                       if (sourceValue != null){\r
+                               return false;\r
+                       }\r
+               }\r
+               return true;\r
+       }\r
+       \r
+       public static boolean addMultipleValues(List<Object> sourceValues, CdmBase cdmBase, String cdmAttrName, List<Class> classes, boolean overwriteNull, boolean obligat){\r
+               String methodName;\r
+//             Object strValue;\r
+               try {\r
+                       \r
+                       if (overwriteNull == NO_OVERWRITE && valuesAreNull(sourceValues)){\r
+                               if (logger.isDebugEnabled()) { logger.debug("no overwrite for NULL-value");}\r
+                               return true;\r
+                       }\r
+                       if (logger.isDebugEnabled()) { logger.debug("addValues: " + sourceValues.toString());}\r
+                       \r
+                       \r
+                       if (cdmAttrName == null || cdmAttrName.length() < 1 ){\r
+                               throw new IllegalArgumentException("CdmAttributeName should have atleast 1 character");\r
+                       }\r
+                       methodName = "add" + cdmAttrName.substring(0, 1).toUpperCase() + cdmAttrName.substring(1) ;\r
+                       \r
+                       Class[] classArray = classes.toArray(new Class[0]);\r
+                       Method cdmMethod = cdmBase.getClass().getMethod(methodName, classArray);\r
+                       cdmMethod.invoke(cdmBase, sourceValues.toArray());\r
+                       return true;\r
+               } catch (NullPointerException e) {\r
+                       logger.error("NullPointerException: " + e.getMessage());\r
+                       return false;\r
+               } catch (IllegalArgumentException e) {\r
+                       logger.error("IllegalArgumentException: " + e.getMessage());\r
+                       return false;\r
+               } catch (IllegalAccessException e) {\r
+                       logger.error("IllegalAccessException: " + e.getMessage());\r
+                       return false;\r
+               } catch (InvocationTargetException e) {\r
+                       logger.error("InvocationTargetException: " + e.getMessage());\r
+                       return false;\r
+               }catch (SecurityException e) {\r
+                       logger.error("SecurityException: " + e.getMessage());\r
+                       return false;\r
+               } catch (NoSuchMethodException e) {\r
+                       if (obligat){\r
+                               logger.error("NoSuchMethod: " + e.getMessage());\r
+                               return false;\r
+                       }else{\r
+                               if (logger.isDebugEnabled()){ logger.debug("NoSuchMethod: " + e.getMessage());}\r
+                               return true;\r
+                       }\r
+               }\r
+               \r
        }\r
        \r
        public static boolean addAnnotationFromResultSet(ResultSet rs, String attributeName, AnnotatableEntity cdmBase, Language language){\r
@@ -189,45 +250,72 @@ public class ImportHelper {
        \r
        \r
        public static TimePeriod getDatePublished(String refYear){\r
-               //FIXME until now only quick and dirty and wrong\r
-               if (refYear == null){\r
-                       return null;\r
-               }\r
-               String[] years = refYear.split("-");\r
-               DateTime dtStart = null;\r
-               DateTime dtEnd = null;\r
-               \r
-               if (years.length > 2 || years.length <= 0){\r
-                       logger.warn("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX getDatePublished");\r
-               }else {\r
-                       dtStart = parseSingleDate(years[0]);\r
-                       \r
-                       if (years.length >= 2){\r
-                               dtEnd = parseSingleDate(years[1]);\r
-                       }\r
+               TimePeriod resultNew;\r
+               try {\r
+                       resultNew = TimePeriod.parseString(refYear);\r
+               } catch (IllegalArgumentException e) {\r
+                       logger.warn("RefYear could not be parsed: " + refYear);\r
+                       resultNew = null;\r
                }\r
-               TimePeriod result = TimePeriod.NewInstance(dtStart, dtEnd);\r
-               return result;\r
+               return resultNew;\r
        }\r
+\r
+       //************** EXPORT *******************/\r
+       \r
        \r
-       private static DateTime parseSingleDate(String singleDateString){\r
-               //FIXME until now only quick and dirty and wrong\r
-               DateTime dt = new DateTime(9999, 12, 30, 0,0,0,0);\r
-               if (CdmUtils.isNumeric(singleDateString)){\r
-                       try {\r
-                               Integer year = Integer.valueOf(singleDateString.trim());\r
-                               if (year > 1750 && year < 2050){\r
-                                       dt = dt.withYear(year);\r
+       public static<T extends Object> T getValue(CdmBase cdmBase, String cdmAttrName, boolean isBoolean, boolean obligatory){\r
+               String methodName;\r
+               T result;\r
+               try {\r
+                       if (isBoolean){\r
+                               if (cdmAttrName == null || cdmAttrName.length() < 3 ||  !( cdmAttrName.startsWith("is") || cdmAttrName.startsWith("use"))     ){\r
+                                       throw new IllegalArgumentException("boolean CdmAttributeName should have atleast 3 characters and start with 'is' or 'use': " + cdmAttrName);\r
                                }\r
-                       } catch (NumberFormatException e) {\r
-                               logger.debug("Not a Integer format in getCalendar()");\r
+                               methodName = cdmAttrName ;\r
+                       }else {\r
+                               if (cdmAttrName == null || cdmAttrName.length() < 1 ){\r
+                                       throw new IllegalArgumentException("CdmAttributeName should have atleast 1 character");\r
+                               }\r
+                               methodName = "get" + cdmAttrName.substring(0, 1).toUpperCase() + cdmAttrName.substring(1) ;\r
+                       }\r
+//                     else{\r
+//                             logger.error("Class not supported: " + clazz.toString());\r
+//                             return null;\r
+//                     }\r
+                       Method cdmMethod = cdmBase.getClass().getMethod(methodName);\r
+                       result = (T)cdmMethod.invoke(cdmBase);\r
+                       return result;\r
+               } catch (NullPointerException e) {\r
+                       logger.error("NullPointerException: " + e.getMessage());\r
+                       return null;\r
+               } catch (IllegalArgumentException e) {\r
+                       logger.error("IllegalArgumentException: " + e.getMessage());\r
+                       return null;\r
+               } catch (IllegalAccessException e) {\r
+                       logger.error("IllegalAccessException: " + e.getMessage());\r
+                       return null;\r
+               } catch (InvocationTargetException e) {\r
+                       logger.error("InvocationTargetException: " + e.getMessage());\r
+                       return null;\r
+               }catch (SecurityException e) {\r
+                       logger.error("SecurityException: " + e.getMessage());\r
+                       return null;\r
+               } catch (NoSuchMethodException e) {\r
+                       if (obligatory){\r
+                               logger.error("NoSuchMethod: " + e.getMessage());\r
+                               return null;\r
+                       }else{\r
+                               if (logger.isDebugEnabled()){ logger.debug("NoSuchMethod: " + e.getMessage());}\r
+                               return null;\r
                        }\r
                }\r
-               return dt;\r
-\r
+               \r
        }\r
 \r
        \r
+       \r
+       \r
+       \r
        //******* old *****************\r
        \r
 //     private static Calendar getCalendar(String strYear){\r