Object change mapper for PESI and empty epithet bugfix and empty hybrid formula bugfix
authorAndreas Müller <a.mueller@bgbm.org>
Fri, 13 Jan 2012 09:48:13 +0000 (09:48 +0000)
committerAndreas Müller <a.mueller@bgbm.org>
Fri, 13 Jan 2012 09:48:13 +0000 (09:48 +0000)
16 files changed:
.gitattributes
cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/berlinModel/in/BerlinModelAuthorImport.java
cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/berlinModel/in/BerlinModelNameStatusImport.java
cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/berlinModel/in/BerlinModelTaxonNameImport.java
cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/berlinModel/in/BerlinModelTaxonNameRelationImport.java
cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/berlinModel/in/BerlinModelUserImport.java
cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/common/ImportHelper.java
cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/common/mapping/CdmAttributeMapperBase.java
cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/common/mapping/CdmIoMapping.java
cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/common/mapping/CdmMapperBase.java [new file with mode: 0644]
cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/common/mapping/DbImportMapping.java
cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/common/mapping/out/CdmDbExportMapping.java
cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/common/mapping/out/CollectionExportMapping.java
cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/common/mapping/out/DbStringMapper.java
cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/common/mapping/out/MethodMapper.java
cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/common/mapping/out/ObjectChangeMapper.java [new file with mode: 0644]

index 83193b35d1e92895007a076752a7c9789e9d09d7..81bfacf6785c5ca003b6614bf8328221658c3439 100644 (file)
@@ -198,6 +198,7 @@ cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/common/events/IoProgressEvent.java -
 cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/common/events/LoggingIoObserver.java -text
 cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/common/mapping/CdmAttributeMapperBase.java -text
 cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/common/mapping/CdmIoMapping.java -text
+cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/common/mapping/CdmMapperBase.java -text
 cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/common/mapping/CdmSingleAttributeMapperBase.java -text
 cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/common/mapping/DbIgnoreMapper.java -text
 cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/common/mapping/DbImportAnnotationCreationMapper.java -text
@@ -270,6 +271,7 @@ cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/common/mapping/out/IDbExportMapper.j
 cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/common/mapping/out/IdMapper.java -text
 cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/common/mapping/out/IndexCounter.java -text
 cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/common/mapping/out/MethodMapper.java -text
+cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/common/mapping/out/ObjectChangeMapper.java -text
 cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/dwca/TermUri.java -text
 cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/dwca/in/ConverterBase.java -text
 cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/dwca/in/CsvStream.java -text
index 4a56682d0ff3ca29cb480e63876f5b96af004724..a6226f24b507ac3381f546c3fbca2b5ebc042fd1 100644 (file)
@@ -40,6 +40,8 @@ import eu.etaxonomy.cdm.model.common.TimePeriod;
  */\r
 @Component\r
 public class BerlinModelAuthorImport extends BerlinModelImportBase {\r
+       private static final boolean BLANK_TO_NULL = true;\r
+\r
        private static final Logger logger = Logger.getLogger(BerlinModelAuthorImport.class);\r
 \r
        public static final String NAMESPACE = "Author";\r
@@ -102,15 +104,15 @@ public class BerlinModelAuthorImport extends BerlinModelImportBase {
                                        \r
                                        dbAttrName = "Abbrev";\r
                                        cdmAttrName = "nomenclaturalTitle";\r
-                                       success &= ImportHelper.addStringValue(rs, author, dbAttrName, cdmAttrName);\r
+                                       success &= ImportHelper.addStringValue(rs, author, dbAttrName, cdmAttrName, BLANK_TO_NULL);\r
 \r
                                        dbAttrName = "FirstName";\r
                                        cdmAttrName = "firstname";\r
-                                       success &= ImportHelper.addStringValue(rs, author, dbAttrName, cdmAttrName);\r
+                                       success &= ImportHelper.addStringValue(rs, author, dbAttrName, cdmAttrName, BLANK_TO_NULL);\r
                                        \r
                                        dbAttrName = "LastName";\r
                                        cdmAttrName = "lastname";\r
-                                       success &= ImportHelper.addStringValue(rs, author, dbAttrName, cdmAttrName);\r
+                                       success &= ImportHelper.addStringValue(rs, author, dbAttrName, cdmAttrName, BLANK_TO_NULL);\r
                                        \r
                                        String dates = rs.getString("dates");\r
                                        if (dates != null){\r
index 193ccc5f51b8b47dbc690542b3d7521ec6d5d60e..5643470c40d7b377bb3f080d9de7dba7253a7e27 100644 (file)
@@ -149,7 +149,7 @@ public class BerlinModelNameStatusImport extends BerlinModelImportBase {
                                                //Details\r
                                                dbAttrName = "details";\r
                                                cdmAttrName = "citationMicroReference";\r
-                                               success &= ImportHelper.addStringValue(rs, nomStatus, dbAttrName, cdmAttrName);\r
+                                               success &= ImportHelper.addStringValue(rs, nomStatus, dbAttrName, cdmAttrName, true);\r
                                                \r
                                                //doubtful\r
                                                if (doubtful){\r
index b697d6f1645ec4f43a23273ae4ccc0083b0b2b31..c9f8c00cd5e6e08d39f2580892f3dd78ffb13120 100644 (file)
@@ -53,6 +53,8 @@ import eu.etaxonomy.cdm.strategy.exceptions.UnknownCdmTypeException;
  */\r
 @Component\r
 public class BerlinModelTaxonNameImport extends BerlinModelImportBase {\r
+       private static final boolean BLANK_TO_NULL = true;\r
+\r
        private static final Logger logger = Logger.getLogger(BerlinModelTaxonNameImport.class);\r
 \r
        public static final String NAMESPACE = "TaxonName";\r
@@ -176,29 +178,29 @@ public class BerlinModelTaxonNameImport extends BerlinModelImportBase {
                                                dbAttrName = "genus";\r
                                        }\r
                                        cdmAttrName = "genusOrUninomial";\r
-                                       success &= ImportHelper.addStringValue(rs, taxonNameBase, dbAttrName, cdmAttrName);\r
+                                       success &= ImportHelper.addStringValue(rs, taxonNameBase, dbAttrName, cdmAttrName, BLANK_TO_NULL);\r
                                        \r
                                        dbAttrName = "genusSubdivisionEpi";\r
                                        cdmAttrName = "infraGenericEpithet";\r
-                                       success &= ImportHelper.addStringValue(rs, taxonNameBase, dbAttrName, cdmAttrName);\r
+                                       success &= ImportHelper.addStringValue(rs, taxonNameBase, dbAttrName, cdmAttrName, BLANK_TO_NULL);\r
                                        \r
                                        dbAttrName = "speciesEpi";\r
                                        cdmAttrName = "specificEpithet";\r
-                                       success &= ImportHelper.addStringValue(rs, taxonNameBase, dbAttrName, cdmAttrName);\r
+                                       success &= ImportHelper.addStringValue(rs, taxonNameBase, dbAttrName, cdmAttrName, BLANK_TO_NULL);\r
                                        \r
        \r
                                        dbAttrName = "infraSpeciesEpi";\r
                                        cdmAttrName = "infraSpecificEpithet";\r
-                                       success &= ImportHelper.addStringValue(rs, taxonNameBase, dbAttrName, cdmAttrName);\r
+                                       success &= ImportHelper.addStringValue(rs, taxonNameBase, dbAttrName, cdmAttrName, BLANK_TO_NULL);\r
                                        \r
                                        dbAttrName = "unnamedNamePhrase";\r
                                        cdmAttrName = "appendedPhrase";\r
-                                       success &= ImportHelper.addStringValue(rs, taxonNameBase, dbAttrName, cdmAttrName);\r
+                                       success &= ImportHelper.addStringValue(rs, taxonNameBase, dbAttrName, cdmAttrName, BLANK_TO_NULL);\r
                                        \r
                                        //Details\r
                                        dbAttrName = "details";\r
                                        cdmAttrName = "nomenclaturalMicroReference";\r
-                                       success &= ImportHelper.addStringValue(rs, taxonNameBase, dbAttrName, cdmAttrName);\r
+                                       success &= ImportHelper.addStringValue(rs, taxonNameBase, dbAttrName, cdmAttrName, BLANK_TO_NULL);\r
        \r
                                        //nomRef\r
                                        success &= makeNomenclaturalReference(config, taxonNameBase, nameId, rs, partitioner);\r
index cc2c18e5ee8826a9d460c007009f22cfce0613c0..97514b7c5f4d72cc4c4cc164b7d7acd2b83bb659 100644 (file)
@@ -153,6 +153,10 @@ public class BerlinModelTaxonNameRelationImport extends BerlinModelImportBase {
                                        success = handleNameRelationship(success, config, name1Id, name2Id,\r
                                                        relQualifierFk, notes, nameFrom, nameTo, citation,\r
                                                        microcitation, rule);\r
+                                       nameFrom.setTitleCache(null);\r
+                                       nameTo.setTitleCache(null);\r
+                                       nameFrom.getTitleCache();\r
+                                       nameTo.getTitleCache();\r
                                        nameToSave.add(nameFrom);\r
                                        \r
                                        //TODO\r
index daa5335484b13a4f93313d83252cb4316aea7582..58542cf7a55bf827d4f1be0c78fd99f571a22dff 100644 (file)
@@ -101,7 +101,7 @@ public class BerlinModelUserImport extends BerlinModelImportBase {
                                        \r
                                        dbAttrName = "RealName";\r
                                        cdmAttrName = "TitleCache";\r
-                                       success &= ImportHelper.addStringValue(rs, person, dbAttrName, cdmAttrName);\r
+                                       success &= ImportHelper.addStringValue(rs, person, dbAttrName, cdmAttrName, false);\r
        \r
        \r
                                        userMap.put(username, user);\r
index ba1c1bf8cf1e279580da2e0692958247e7989e5b..b87229740fc14ad048677e7a67d7238a8440a966 100644 (file)
@@ -72,19 +72,19 @@ public class ImportHelper {
                return true;\r
        }\r
        \r
-       public static boolean addStringValue(ResultSet rs, CdmBase cdmBase, String dbAttrName, String cdmAttrName){\r
-               return addValue(rs, cdmBase, dbAttrName, cdmAttrName, String.class, OVERWRITE);\r
+       public static boolean addStringValue(ResultSet rs, CdmBase cdmBase, String dbAttrName, String cdmAttrName, boolean blankToNull){\r
+               return addValue(rs, cdmBase, dbAttrName, cdmAttrName, String.class, OVERWRITE, blankToNull);\r
        }\r
        \r
-       public static boolean addStringValue(ResultSet rs, CdmBase cdmBase, String dbAttrName, String cdmAttrName, boolean overwriteNull){\r
-               return addValue(rs, cdmBase, dbAttrName, cdmAttrName, String.class, overwriteNull);\r
-       }\r
+//     public static boolean addStringValue(ResultSet rs, CdmBase cdmBase, String dbAttrName, String cdmAttrName, boolean overwriteNull){\r
+//             return addValue(rs, cdmBase, dbAttrName, cdmAttrName, String.class, overwriteNull);\r
+//     }\r
                \r
        public static boolean addBooleanValue(ResultSet rs, CdmBase cdmBase, String dbAttrName, String cdmAttrName){\r
-               return addValue(rs, cdmBase, dbAttrName, cdmAttrName, boolean.class, OVERWRITE);\r
+               return addValue(rs, cdmBase, dbAttrName, cdmAttrName, boolean.class, OVERWRITE, false);\r
        }\r
 \r
-       public static boolean addValue(ResultSet rs, CdmBase cdmBase, String dbAttrName, String cdmAttrName, Class clazz, boolean overwriteNull){\r
+       public static boolean addValue(ResultSet rs, CdmBase cdmBase, String dbAttrName, String cdmAttrName, Class clazz, boolean overwriteNull, boolean blankToNull){\r
                Object strValue;\r
                try {\r
                        strValue = rs.getObject(dbAttrName);\r
index 530cdb71eb8e16d7a53ba6982fcf11cabe8ea5d5..82f45ee87fc30123406dd11baad0018e76100b5c 100644 (file)
@@ -21,7 +21,7 @@ import eu.etaxonomy.cdm.common.CdmUtils;
  * @created 05.08.2008\r
  * @version 1.0\r
  */\r
-public abstract class CdmAttributeMapperBase {\r
+public abstract class CdmAttributeMapperBase extends CdmMapperBase{\r
        @SuppressWarnings("unused")\r
        private static final Logger logger = Logger.getLogger(CdmAttributeMapperBase.class);\r
        \r
index 1ed4c23fa2281a2db3c2f340b1c5814c95d1791c..84c449573e21f8e5acd52dc16d8f5e4917edfa9b 100644 (file)
@@ -16,6 +16,8 @@ import java.util.Set;
 \r
 import org.apache.log4j.Logger;\r
 \r
+import eu.etaxonomy.cdm.io.common.mapping.out.ObjectChangeMapper;\r
+\r
 \r
 \r
 /**\r
@@ -27,7 +29,7 @@ public class CdmIoMapping {
        private static final Logger logger = Logger.getLogger(CdmIoMapping.class);\r
        \r
        //protected List<CdmAttributeMapperBase> mapperList = new ArrayList<CdmAttributeMapperBase>();\r
-       protected List<CdmAttributeMapperBase> mapperList = new ArrayList<CdmAttributeMapperBase>();\r
+       protected List<CdmMapperBase> mapperList = new ArrayList<CdmMapperBase>();\r
        Set<String> sourceAttributes = new HashSet<String>();\r
        Set<String> destinationAttributes = new HashSet<String>();\r
        List<String> sourceAttributeList = new ArrayList<String>();\r
@@ -51,6 +53,13 @@ public class CdmIoMapping {
                        sourceAttributeList.addAll(multipleMapper.getSourceAttributes());\r
                        destinationAttributes.addAll(multipleMapper.getDestinationAttributes());\r
                        destinationAttributeList.addAll(multipleMapper.getDestinationAttributeList());\r
+               }else if (mapper instanceof ObjectChangeMapper){\r
+                       ObjectChangeMapper changeMapper = (ObjectChangeMapper)mapper;\r
+                       sourceAttributes.addAll(changeMapper.getSourceAttributes());\r
+                       sourceAttributeList.addAll(changeMapper.getSourceAttributes());\r
+                       destinationAttributes.addAll(changeMapper.getDestinationAttributes());\r
+                       destinationAttributeList.addAll(changeMapper.getDestinationAttributeList());\r
+                       \r
                }else{\r
                        logger.error("Unknown mapper type: " + mapper.getClass().getSimpleName());\r
                        throw new IllegalArgumentException("Unknown mapper type: " + mapper.getClass().getSimpleName());\r
diff --git a/cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/common/mapping/CdmMapperBase.java b/cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/common/mapping/CdmMapperBase.java
new file mode 100644 (file)
index 0000000..a925733
--- /dev/null
@@ -0,0 +1,23 @@
+/**\r
+* Copyright (C) 2007 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.mapping;\r
+\r
+import org.apache.log4j.Logger;\r
+\r
+/**\r
+ * The most general mapper class for all cdm mappers.\r
+ * @author a.mueller\r
+ * @created 12.01.2012\r
+ */\r
+public abstract class CdmMapperBase {\r
+       @SuppressWarnings("unused")\r
+       private static final Logger logger = Logger.getLogger(CdmMapperBase.class);\r
+       \r
+}
\ No newline at end of file
index c84c3760c97854e9d39d652ab201af6000f14b56..62f5310a8850b6c4b4c0c60780f350e5a5f28f14 100644 (file)
@@ -18,6 +18,7 @@ import org.apache.log4j.Logger;
 \r
 import eu.etaxonomy.cdm.io.common.DbImportStateBase;\r
 import eu.etaxonomy.cdm.io.common.IImportConfigurator;\r
+import eu.etaxonomy.cdm.io.common.mapping.out.DbStringMapper;\r
 import eu.etaxonomy.cdm.model.common.CdmBase;\r
 \r
 /**\r
@@ -31,6 +32,7 @@ public class DbImportMapping<STATE extends DbImportStateBase, CONFIG extends IIm
        private boolean isInitialized = false;;\r
        private Class<? extends CdmBase> destinationClass;\r
        private DbImportMapping<STATE, CONFIG> secondPathMapping;\r
+       private boolean blankToNull = false;\r
        \r
        public DbImportMapping(){\r
 //             this.dbTableName = tableName;\r
@@ -40,9 +42,11 @@ public class DbImportMapping<STATE extends DbImportStateBase, CONFIG extends IIm
                if (!isInitialized){\r
                        //      this.dbTableName = tableName;\r
                        this.destinationClass = destinationClass;\r
-                       for (CdmAttributeMapperBase mapper: this.mapperList){\r
+                       for (CdmMapperBase mapper: this.mapperList){\r
                                if (mapper instanceof IDbImportMapper){\r
                                        ((IDbImportMapper) mapper).initialize(state, destinationClass);\r
+                               }else{\r
+                                       logger.warn("Mapper type " + mapper.getClass().getSimpleName() + " not yet implemented for DB import mapping");\r
                                }\r
                        }\r
                        isInitialized = true;\r
@@ -52,6 +56,13 @@ public class DbImportMapping<STATE extends DbImportStateBase, CONFIG extends IIm
                }\r
                return true;\r
        }\r
+\r
+       public void addMapper(CdmAttributeMapperBase mapper){\r
+               super.addMapper(mapper);\r
+               if (mapper instanceof DbStringMapper){\r
+                       ((DbStringMapper)mapper).setBlankToNull(isBlankToNull());\r
+               }\r
+       }\r
        \r
        /**\r
         * Invokes the second path mapping if one has been defined\r
@@ -79,7 +90,7 @@ public class DbImportMapping<STATE extends DbImportStateBase, CONFIG extends IIm
                } else {\r
                        CdmBase objectToSave = null;\r
                        //              try {\r
-                       for (CdmAttributeMapperBase mapper : this.mapperList){\r
+                       for (CdmMapperBase mapper : this.mapperList){\r
                                if (mapper instanceof IDbImportMapper){\r
                                        IDbImportMapper<DbImportStateBase<?,?>,CdmBase> dbMapper = (IDbImportMapper)mapper;\r
                                        try {\r
@@ -107,6 +118,22 @@ public class DbImportMapping<STATE extends DbImportStateBase, CONFIG extends IIm
                this.secondPathMapping = secondPathMapping;\r
        }\r
 \r
+       /**\r
+        * If <code>true</code> all {@link DbStringMapper} map blank strings to <code>null</code>\r
+        * @return\r
+        */\r
+       public boolean isBlankToNull() {\r
+               return blankToNull;\r
+       }\r
+\r
+       /**\r
+        * @see #isBlankToNull()\r
+        * @param blankToNull\r
+        */\r
+       public void setBlankToNull(boolean blankToNull) {\r
+               this.blankToNull = blankToNull;\r
+       }\r
+\r
 //     /**\r
 //      * @return the berlinModelTableName\r
 //      */\r
index 5556f0329718ca8accc95f80ab12ce8b798e04a9..cdc0ce9488e5213735b3f28e115bc218c0d7c9e5 100644 (file)
@@ -25,6 +25,7 @@ import eu.etaxonomy.cdm.io.common.ExportStateBase;
 import eu.etaxonomy.cdm.io.common.Source;\r
 import eu.etaxonomy.cdm.io.common.mapping.CdmAttributeMapperBase;\r
 import eu.etaxonomy.cdm.io.common.mapping.CdmIoMapping;\r
+import eu.etaxonomy.cdm.io.common.mapping.CdmMapperBase;\r
 import eu.etaxonomy.cdm.model.common.CdmBase;\r
 \r
 /**\r
@@ -55,7 +56,7 @@ public class CdmDbExportMapping<STATE extends DbExportStateBase<CONFIG>, CONFIG
                        this.preparedStatement = db.getConnection().prepareStatement(strPreparedStatement);\r
                        index = new IndexCounter(1);\r
                        \r
-                       for (CdmAttributeMapperBase mapper : this.mapperList){\r
+                       for (CdmMapperBase mapper : this.mapperList){\r
                                if (mapper instanceof IDbExportMapper){\r
                                        IDbExportMapper<DbExportStateBase<?>> dbMapper = (IDbExportMapper)mapper;\r
                                        dbMapper.initialize(preparedStatement, index, state, dbTableName);\r
@@ -77,8 +78,11 @@ public class CdmDbExportMapping<STATE extends DbExportStateBase<CONFIG>, CONFIG
        public boolean invoke(CdmBase cdmBase) throws SQLException{\r
                try {\r
                        boolean result = true;\r
-                       for (CdmAttributeMapperBase mapper : this.mapperList){\r
-                               if (mapper instanceof IDbExportMapper){\r
+                       for (CdmMapperBase mapper : this.mapperList){\r
+                               if (mapper instanceof ObjectChangeMapper){\r
+                                       ObjectChangeMapper changeMapper = (ObjectChangeMapper)mapper;\r
+                                       cdmBase = changeMapper.getNewObject(cdmBase);\r
+                               }else if (mapper instanceof IDbExportMapper){\r
                                        IDbExportMapper<DbExportStateBase<?>> dbMapper = (IDbExportMapper)mapper;\r
                                        try {\r
                                                result &= dbMapper.invoke(cdmBase);\r
@@ -88,7 +92,7 @@ public class CdmDbExportMapping<STATE extends DbExportStateBase<CONFIG>, CONFIG
                                                e.printStackTrace();\r
                                                continue;\r
                                        }\r
-                               }else{\r
+                               }else {\r
                                        logger.warn("mapper is not of type " + IDbExportMapper.class.getSimpleName());\r
                                }\r
                        }\r
@@ -154,10 +158,10 @@ public class CdmDbExportMapping<STATE extends DbExportStateBase<CONFIG>, CONFIG
                this.preparedStatement = preparedStatement;\r
        }\r
        \r
-       protected List<CdmAttributeMapperBase> getAttributeMapperList(){\r
-               List<CdmAttributeMapperBase> list = this.mapperList;\r
-               return list;\r
-       }\r
+//     protected List<CdmAttributeMapperBase> getAttributeMapperList(){\r
+//             List<CdmAttributeMapperBase> list = this.mapperList;\r
+//             return list;\r
+//     }\r
        \r
        \r
 }\r
index 791a9b5ffad68b8d9968271145e4d879290b7dc1..edabee60c98b24cdb06a8ee1f52e0bc3eb5ce631 100644 (file)
@@ -18,8 +18,7 @@ import org.apache.log4j.Logger;
 import eu.etaxonomy.cdm.io.common.DbExportConfiguratorBase;\r
 import eu.etaxonomy.cdm.io.common.DbExportStateBase;\r
 import eu.etaxonomy.cdm.io.common.ImportHelper;\r
-import eu.etaxonomy.cdm.io.common.Source;\r
-import eu.etaxonomy.cdm.io.common.mapping.CdmAttributeMapperBase;\r
+import eu.etaxonomy.cdm.io.common.mapping.CdmMapperBase;\r
 import eu.etaxonomy.cdm.model.common.CdmBase;\r
 \r
 /**\r
@@ -73,7 +72,7 @@ public class CollectionExportMapping<STATE extends DbExportStateBase<CONFIG>, CO
                                        result = false;\r
                                        continue;\r
                                }\r
-                               for (CdmAttributeMapperBase mapper : this.mapperList){\r
+                               for (CdmMapperBase mapper : this.mapperList){\r
                                        if (mapper == this.parentMapper){\r
                                                parentMapper.invoke(parent);\r
                                        }else if (mapper == this.sequenceMapper){\r
index 845699b2c5cdbfe36b35b0a306e90c136bb3e687..3f265d398070ba26ab514812e353203ba7fb4747 100644 (file)
@@ -10,6 +10,7 @@
 \r
 package eu.etaxonomy.cdm.io.common.mapping.out;\r
 \r
+import org.apache.commons.lang.StringUtils;\r
 import org.apache.log4j.Logger;\r
 import org.hsqldb.Types;\r
 \r
@@ -25,6 +26,7 @@ public class DbStringMapper extends DbSingleAttributeExportMapperBase<DbExportSt
        private static final Logger logger = Logger.getLogger(DbStringMapper.class);\r
 \r
        private static final int MAX_PRECISION = -1;  //precision for datatype nvarchar(max) == clob (SQL Server 2008)\r
+       private boolean blankToNull = false;\r
        \r
        public static DbStringMapper NewInstance(String cdmAttributeString, String dbAttributeString){\r
                return new DbStringMapper(cdmAttributeString, dbAttributeString, null, true);\r
@@ -58,13 +60,35 @@ public class DbStringMapper extends DbSingleAttributeExportMapperBase<DbExportSt
        @Override\r
        protected Object getValue(CdmBase cdmBase) {\r
                String result = (String)super.getValue(cdmBase);\r
-               if (result != null && result.length() > getPrecision() && getPrecision() != MAX_PRECISION){\r
-                       logger.warn("Truncation (" + result.length() + "->" + getPrecision() + ") needed for Attribute " + getDestinationAttribute() + " in " +  cdmBase + "." );\r
-                       result = result.substring(0, getPrecision());\r
+               if (isBlankToNull() && StringUtils.isBlank(result)){\r
+                       result = null;\r
+               }\r
+               if (result != null){\r
+                       if (result.length() > getPrecision() && getPrecision() != MAX_PRECISION){\r
+                               logger.warn("Truncation (" + result.length() + "->" + getPrecision() + ") needed for Attribute " + getDestinationAttribute() + " in " +  cdmBase + "." );\r
+                               result = result.substring(0, getPrecision());\r
+                       }\r
                }\r
                return result;\r
        }\r
        \r
+\r
+       /**\r
+        * If <code>true</code> all {@link DbStringMapper} map blank strings to <code>null</code>\r
+        * @return\r
+        */\r
+       public boolean isBlankToNull() {\r
+               return blankToNull;\r
+       }\r
+\r
+       /**\r
+        * @see #isBlankToNull()\r
+        * @param blankToNull\r
+        */\r
+       public void setBlankToNull(boolean blankToNull) {\r
+               this.blankToNull = blankToNull;\r
+       }\r
+       \r
        \r
 \r
        /* (non-Javadoc)\r
index 9084efa8beee24febd8771c9c52a424cd8506289..d792c6535c9956e77db37e7fdbddd47241eed956 100644 (file)
@@ -37,6 +37,11 @@ public class MethodMapper extends DbSingleAttributeExportMapperBase<DbExportStat
                return NewInstance(dbAttributeString, bmeb, methodName);\r
        }\r
        \r
+       public static <T extends DbExportBase> MethodMapper NewInstance(String dbAttributeString, DbExportBase bmeb, Class<?> parameterTypes){\r
+               String methodName = "get" + dbAttributeString;\r
+               return new MethodMapper(dbAttributeString, bmeb.getClass(), methodName, parameterTypes);\r
+       }\r
+       \r
        public static <T extends DbExportBase> MethodMapper NewInstance(String dbAttributeString, DbExportBase bmeb, String methodName){\r
                Class<?> parameterTypes = bmeb.getStandardMethodParameter();\r
                MethodMapper result = new MethodMapper(dbAttributeString, bmeb.getClass(), methodName, parameterTypes);\r
diff --git a/cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/common/mapping/out/ObjectChangeMapper.java b/cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/common/mapping/out/ObjectChangeMapper.java
new file mode 100644 (file)
index 0000000..da22070
--- /dev/null
@@ -0,0 +1,110 @@
+// $Id$\r
+/**\r
+* Copyright (C) 2007 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.mapping.out;\r
+\r
+import java.lang.reflect.Method;\r
+import java.sql.PreparedStatement;\r
+import java.util.ArrayList;\r
+import java.util.HashSet;\r
+import java.util.List;\r
+import java.util.Set;\r
+\r
+import org.apache.log4j.Logger;\r
+\r
+import eu.etaxonomy.cdm.io.common.DbExportStateBase;\r
+import eu.etaxonomy.cdm.io.common.mapping.CdmAttributeMapperBase;\r
+import eu.etaxonomy.cdm.model.common.CdmBase;\r
+\r
+/**\r
+ * @author a.mueller\r
+ * @created 12.05.2009\r
+ * @version 1.0\r
+ */\r
+public class ObjectChangeMapper extends CdmAttributeMapperBase implements IDbExportMapper<DbExportStateBase<?>> {\r
+       private static final Logger logger = Logger.getLogger(ObjectChangeMapper.class);\r
+\r
+       private DbExportStateBase<?> state;  //for possible later use\r
+       \r
+       private String cdmAttribute;\r
+       \r
+       private Method method;\r
+//     private Class<?>[] parameterTypes;\r
+       \r
+       public static ObjectChangeMapper NewInstance(Class<? extends CdmBase>  oldClass, Class<? extends CdmBase> newClass, String cdmAttribute){\r
+               String methodName = "get" + cdmAttribute;\r
+               return new ObjectChangeMapper(oldClass, methodName, (Class<?>[])null);\r
+       }\r
+       \r
+       /**\r
+        * @param parameterTypes \r
+        * @param dbIdAttributString\r
+        */\r
+       protected ObjectChangeMapper(Class<?> clazz, String methodName, Class<?>... parameterTypes) {\r
+               try {\r
+//                     this.parameterTypes = parameterTypes;\r
+                       method = clazz.getDeclaredMethod(methodName, parameterTypes);\r
+                       method.setAccessible(true);\r
+               } catch (SecurityException e) {\r
+                       logger.error("SecurityException", e);\r
+               } catch (NoSuchMethodException e) {\r
+                       logger.error("NoSuchMethodException", e);\r
+               }\r
+       }\r
+       \r
+       \r
+       @Override\r
+       public void initialize(PreparedStatement stmt, IndexCounter index, DbExportStateBase<?> state, String tableName) {\r
+               this.state = state;\r
+       }\r
+\r
+       public boolean invoke(CdmBase cdmBase) {\r
+               throw new RuntimeException("Invoke must not be called for " + this.getClass().getSimpleName() + ".  Return type is still incompatible. Use getNewObject instead.");\r
+       }\r
+\r
+       public CdmBase getNewObject(CdmBase oldCdmBase){\r
+               try {\r
+                       return  (CdmBase)method.invoke(oldCdmBase, (Object[])null);\r
+               } catch (Exception e) {\r
+                       throw new RuntimeException(e);\r
+               }\r
+       }\r
+\r
+       @Override\r
+       public Set<String> getSourceAttributes() {\r
+               Set<String> result = new HashSet<String>();\r
+               if (cdmAttribute != null){\r
+                       result.add(cdmAttribute);\r
+               }\r
+               return result;\r
+       }\r
+\r
+       @Override\r
+       public Set<String> getDestinationAttributes() {\r
+               return new HashSet<String>();\r
+       }\r
+\r
+       @Override\r
+       public List<String> getSourceAttributeList() {\r
+               ArrayList<String> result = new ArrayList<String>();\r
+               if (cdmAttribute != null){\r
+                       result.add(cdmAttribute);\r
+               }\r
+               return result;\r
+       }\r
+\r
+       @Override\r
+       public List<String> getDestinationAttributeList() {\r
+               return new ArrayList<String>();\r
+       }\r
+\r
+\r
+\r
+}\r