Unifiy name and taxon creation
[cdmlib-apps.git] / app-import / src / main / java / eu / etaxonomy / cdm / io / globis / GlobisImportBase.java
index ebcc6754eb60e9503f5e3d9a655ca977d4ba97da..87380caec7e316e2111851917f0d02f1235dcfb1 100644 (file)
@@ -1,8 +1,8 @@
 /**\r
 * Copyright (C) 2007 EDIT\r
-* European Distributed Institute of Taxonomy \r
+* European Distributed Institute of Taxonomy\r
 * http://www.e-taxonomy.eu\r
-* \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
@@ -22,7 +22,6 @@ import org.apache.log4j.Logger;
 import org.hibernate.NonUniqueObjectException;\r
 import org.joda.time.DateTime;\r
 \r
-import eu.etaxonomy.cdm.api.service.AgentServiceImpl;\r
 import eu.etaxonomy.cdm.io.common.CdmImportBase;\r
 import eu.etaxonomy.cdm.io.common.ICdmIO;\r
 import eu.etaxonomy.cdm.io.common.IImportConfigurator.EDITOR;\r
@@ -43,8 +42,8 @@ import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.common.IdentifiableEntity;\r
 import eu.etaxonomy.cdm.model.common.Language;\r
 import eu.etaxonomy.cdm.model.common.User;\r
-import eu.etaxonomy.cdm.model.location.NamedArea;\r
 import eu.etaxonomy.cdm.model.location.Country;\r
+import eu.etaxonomy.cdm.model.location.NamedArea;\r
 import eu.etaxonomy.cdm.model.name.ZoologicalName;\r
 import eu.etaxonomy.cdm.strategy.exceptions.StringNotParsableException;\r
 import eu.etaxonomy.cdm.strategy.parser.INonViralNameParser;\r
@@ -56,28 +55,28 @@ import eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl;
  */\r
 public abstract class GlobisImportBase<CDM_BASE extends CdmBase> extends CdmImportBase<GlobisImportConfigurator, GlobisImportState> implements ICdmIO<GlobisImportState>, IPartitionedIO<GlobisImportState> {\r
        private static final Logger logger = Logger.getLogger(GlobisImportBase.class);\r
-       \r
+\r
        public static final UUID ID_IN_SOURCE_EXT_UUID = UUID.fromString("23dac094-e793-40a4-bad9-649fc4fcfd44");\r
-       \r
+\r
        //NAMESPACES\r
-       \r
+\r
        protected static final String REFERENCE_NAMESPACE = "Literatur";\r
        protected static final String TAXON_NAMESPACE = "current_species";\r
        protected static final String COLLECTION_NAMESPACE = "Collection";\r
        protected static final String IMAGE_NAMESPACE = "Einzelbilder";\r
        protected static final String SPEC_TAX_NAMESPACE = "specTax";\r
        protected static final String TYPE_NAMESPACE = "specTax.SpecTypeDepository";\r
-       \r
-       private String pluralString;\r
-       private String dbTableName;\r
-       private Class cdmTargetClass;\r
 \r
-       private INonViralNameParser<?> parser = NonViralNameParserImpl.NewInstance();\r
+       private final String pluralString;\r
+       private final String dbTableName;\r
+       private final Class cdmTargetClass;\r
+\r
+       private final INonViralNameParser<?> parser = NonViralNameParserImpl.NewInstance();\r
+\r
 \r
-       \r
        /**\r
         * @param dbTableName\r
-        * @param dbTableName2 \r
+        * @param dbTableName2\r
         */\r
        public GlobisImportBase(String pluralString, String dbTableName, Class<?> cdmTargetClass) {\r
                this.pluralString = pluralString;\r
@@ -85,11 +84,12 @@ public abstract class GlobisImportBase<CDM_BASE extends CdmBase> extends CdmImpo
                this.cdmTargetClass = cdmTargetClass;\r
        }\r
 \r
-       protected void doInvoke(GlobisImportState state){\r
+       @Override\r
+    protected void doInvoke(GlobisImportState state){\r
                logger.info("start make " + getPluralString() + " ...");\r
                GlobisImportConfigurator config = state.getConfig();\r
                Source source = config.getSource();\r
-                       \r
+\r
                String strIdQuery = getIdQuery();\r
                String strRecordQuery = getRecordQuery(config);\r
 \r
@@ -103,7 +103,7 @@ public abstract class GlobisImportBase<CDM_BASE extends CdmBase> extends CdmImpo
                        logger.error("SQLException:" +  e);\r
                        state.setUnsuccessfull();\r
                }\r
-               \r
+\r
                logger.info("end make " + getPluralString() + " ... " + getSuccessString(true));\r
                return;\r
        }\r
@@ -115,46 +115,58 @@ public abstract class GlobisImportBase<CDM_BASE extends CdmBase> extends CdmImpo
        protected void handleAuthorAndYear(String authorAndYear, ZoologicalName zooName, Integer id, GlobisImportState state) {\r
                if (isBlank(authorAndYear)){\r
                        return;\r
-               }\r
-               try {\r
-                       String doubtfulAuthorAndYear = null;\r
-                       if(authorAndYear.matches(".+\\,\\s\\[\\d{4}\\].*")){\r
-                               doubtfulAuthorAndYear = authorAndYear;\r
-                               authorAndYear = authorAndYear.replace("[", "").replace("]", "");\r
-                       }\r
-//                     if (authorAndYear.contains("?")){\r
-//                             authorAndYear = authorAndYear.replace("H?bner", "H\u00fcbner");\r
-//                             authorAndYear = authorAndYear.replace("Oberth?r", "Oberth\u00fcr");\r
-//                             authorAndYear = authorAndYear.replace("M?n?tri?s","M\u00E9n\u00E9tri\u00E9s");\r
-//                             authorAndYear = authorAndYear.replace("Schifferm?ller","Schifferm\u00fcller");\r
-//                             \r
-//                             //TODO remove\r
-//                             authorAndYear = authorAndYear.replace("?", "");\r
-//                             \r
-//                     }\r
-                       \r
-                       parser.parseAuthors(zooName, authorAndYear);\r
-                       deduplicateAuthors(zooName, state);\r
-                       \r
-                       if (doubtfulAuthorAndYear != null){\r
-                               zooName.setAuthorshipCache(doubtfulAuthorAndYear, true);\r
+               }else if ("[Denis & Schifferm\u00FCller], 1775".equals(authorAndYear)){\r
+                       handleDenisSchiffermueller(zooName, state);\r
+                       return;\r
+               }else{\r
+                       try {\r
+                               String doubtfulAuthorAndYear = null;\r
+                               if(authorAndYear.matches(".+\\,\\s\\[\\d{4}\\].*")){\r
+                                       doubtfulAuthorAndYear = authorAndYear;\r
+                                       authorAndYear = authorAndYear.replace("[", "").replace("]", "");\r
+                               }\r
+\r
+                               parser.parseAuthors(zooName, authorAndYear);\r
+                               deduplicateAuthors(zooName, state);\r
+\r
+                               if (doubtfulAuthorAndYear != null){\r
+                                       zooName.setAuthorshipCache(doubtfulAuthorAndYear, true);\r
+                               }\r
+\r
+                       } catch (StringNotParsableException e) {\r
+                               logger.warn("Author could not be parsed: " + authorAndYear + " for id "  +id);\r
+                               zooName.setAuthorshipCache(authorAndYear, true);\r
                        }\r
-                       \r
-               } catch (StringNotParsableException e) {\r
-                       logger.warn("Author could not be parsed: " + authorAndYear + " for id "  +id);\r
-                       zooName.setAuthorshipCache(authorAndYear, true);\r
                }\r
        }\r
-       \r
+\r
+       /**\r
+        * @param zooName\r
+        * @param state\r
+        */\r
+       private void handleDenisSchiffermueller(ZoologicalName zooName,\r
+                       GlobisImportState state) {\r
+               String teamStr = "Denis & Schifferm\u00FCller";\r
+               Team team = state.getTeam(teamStr);\r
+               if (team == null){\r
+                       team = Team.NewInstance();\r
+                       state.putTeam(teamStr, team);\r
+                       getAgentService().save(team);\r
+               }\r
+               zooName.setCombinationAuthorship(team);\r
+               zooName.setPublicationYear(1775);\r
+               zooName.setAuthorshipCache("[Denis & Schifferm\u00FCller], 1775", true);\r
+       }\r
+\r
 \r
        private void deduplicateAuthors(ZoologicalName zooName, GlobisImportState state) {\r
-               zooName.setCombinationAuthorTeam(getExistingAuthor(zooName.getCombinationAuthorTeam(), state));\r
-               zooName.setExCombinationAuthorTeam(getExistingAuthor(zooName.getExCombinationAuthorTeam(), state));\r
-               zooName.setBasionymAuthorTeam(getExistingAuthor(zooName.getBasionymAuthorTeam(), state));\r
-               zooName.setExBasionymAuthorTeam(getExistingAuthor(zooName.getExBasionymAuthorTeam(), state));\r
+               zooName.setCombinationAuthorship(getExistingAuthor(zooName.getCombinationAuthorship(), state));\r
+               zooName.setExCombinationAuthorship(getExistingAuthor(zooName.getExCombinationAuthorship(), state));\r
+               zooName.setBasionymAuthorship(getExistingAuthor(zooName.getBasionymAuthorship(), state));\r
+               zooName.setExBasionymAuthorship(getExistingAuthor(zooName.getExBasionymAuthorship(), state));\r
        }\r
 \r
-       private INomenclaturalAuthor getExistingAuthor(INomenclaturalAuthor nomAuthor, GlobisImportState state) {\r
+       private TeamOrPersonBase<?> getExistingAuthor(INomenclaturalAuthor nomAuthor, GlobisImportState state) {\r
                TeamOrPersonBase<?> author = (TeamOrPersonBase<?>)nomAuthor;\r
                if (author == null){\r
                        return null;\r
@@ -173,22 +185,22 @@ public abstract class GlobisImportBase<CDM_BASE extends CdmBase> extends CdmImpo
                                                try {\r
                                                        getAgentService().update(existingPerson);\r
                                                } catch (NonUniqueObjectException nuoe){\r
-                                                       // person already exists in \r
+                                                       // person already exists in\r
                                                        existingPerson = CdmBase.deproxy(getAgentService().find(existingPerson.getUuid()), Person.class);\r
                                                        state.putPerson(existingPerson.getTitleCache(), existingPerson);\r
                                                } catch (Exception e) {\r
                                                        throw new RuntimeException (e);\r
                                                }\r
                                                newTeam.addTeamMember(existingPerson);\r
-                                               \r
-                                               logger.warn("newTeam " + newTeam.getId());\r
+//\r
+//                                             logger.warn("newTeam " + newTeam.getId());\r
                                        }else{\r
                                                newTeam.addTeamMember(member);\r
-                                       }       \r
+                                       }\r
                                }\r
                                author = newTeam;\r
                        }\r
-                       \r
+\r
                        return saveAndDecide(existingTeam, author, key, state);\r
                }else{\r
                        logger.warn("Author type not supported: " + author.getClass().getName());\r
@@ -201,7 +213,7 @@ public abstract class GlobisImportBase<CDM_BASE extends CdmBase> extends CdmImpo
                        try {\r
                                getAgentService().update(existing);\r
                        } catch (NonUniqueObjectException nuoe){\r
-                               // person already exists in \r
+                               // person already exists in\r
                                existing = CdmBase.deproxy(getAgentService().find(existing.getUuid()), TeamOrPersonBase.class);\r
                                putAgent(existing, key, state);\r
                        } catch (Exception e) {\r
@@ -237,7 +249,7 @@ public abstract class GlobisImportBase<CDM_BASE extends CdmBase> extends CdmImpo
                NamedArea country = Country.getCountryByLabel(countryStr);\r
                if (country == null){\r
                        try {\r
-                               country = (NamedArea)state.getTransformer().getNamedAreaByKey(countryStr);\r
+                               country = state.getTransformer().getNamedAreaByKey(countryStr);\r
                        } catch (UndefinedTransformerMethodException e) {\r
                                e.printStackTrace();\r
                        }\r
@@ -245,15 +257,16 @@ public abstract class GlobisImportBase<CDM_BASE extends CdmBase> extends CdmImpo
                return country;\r
        }\r
 \r
-       \r
 \r
-       public boolean doPartition(ResultSetPartitioner partitioner, GlobisImportState state) {\r
+\r
+       @Override\r
+    public boolean doPartition(ResultSetPartitioner partitioner, GlobisImportState state) {\r
                boolean success = true ;\r
                Set objectsToSave = new HashSet();\r
-               \r
+\r
                DbImportMapping<?, ?> mapping = getMapping();\r
                mapping.initialize(state, cdmTargetClass);\r
-               \r
+\r
                ResultSet rs = partitioner.getResultSet();\r
                try{\r
                        while (rs.next()){\r
@@ -263,21 +276,21 @@ public abstract class GlobisImportBase<CDM_BASE extends CdmBase> extends CdmImpo
                        logger.error("SQLException:" +  e);\r
                        return false;\r
                }\r
-       \r
+\r
                partitioner.startDoSave();\r
                getCommonService().save(objectsToSave);\r
                return success;\r
        }\r
 \r
 \r
-       \r
+\r
        /**\r
         * @return\r
         */\r
        protected /*abstract*/ DbImportMapping<?, ?> getMapping(){\r
                return null;\r
        }\r
-       \r
+\r
        /**\r
         * @return\r
         */\r
@@ -290,11 +303,12 @@ public abstract class GlobisImportBase<CDM_BASE extends CdmBase> extends CdmImpo
                String result = " SELECT id FROM " + getTableName();\r
                return result;\r
        }\r
-       \r
+\r
        /* (non-Javadoc)\r
         * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#getPluralString()\r
         */\r
-       public String getPluralString(){\r
+       @Override\r
+    public String getPluralString(){\r
                return pluralString;\r
        }\r
 \r
@@ -304,7 +318,7 @@ public abstract class GlobisImportBase<CDM_BASE extends CdmBase> extends CdmImpo
        protected String getTableName(){\r
                return this.dbTableName;\r
        }\r
-       \r
+\r
        protected boolean doIdCreatedUpdatedNotes(GlobisImportState state, IdentifiableEntity identifiableEntity, ResultSet rs, long id, String namespace)\r
                        throws SQLException{\r
                boolean success = true;\r
@@ -314,8 +328,8 @@ public abstract class GlobisImportBase<CDM_BASE extends CdmBase> extends CdmImpo
                success &= doCreatedUpdatedNotes(state, identifiableEntity, rs, namespace);\r
                return success;\r
        }\r
-       \r
-       \r
+\r
+\r
        protected boolean doCreatedUpdatedNotes(GlobisImportState state, AnnotatableEntity annotatableEntity, ResultSet rs, String namespace)\r
                        throws SQLException{\r
 \r
@@ -325,9 +339,9 @@ public abstract class GlobisImportBase<CDM_BASE extends CdmBase> extends CdmImpo
                Object updatedWhen = rs.getObject("Updated_When");\r
                String updatedWho = rs.getString("Updated_who");\r
                String notes = rs.getString("notes");\r
-               \r
+\r
                boolean success  = true;\r
-               \r
+\r
                //Created When, Who, Updated When Who\r
                if (config.getEditor() == null || config.getEditor().equals(EDITOR.NO_EDITORS)){\r
                        //do nothing\r
@@ -352,8 +366,8 @@ public abstract class GlobisImportBase<CDM_BASE extends CdmBase> extends CdmImpo
                }else {\r
                        logger.warn("Editor type not yet implemented: " + config.getEditor());\r
                }\r
-               \r
-               \r
+\r
+\r
                //notes\r
                if (StringUtils.isNotBlank(notes)){\r
                        String notesString = String.valueOf(notes);\r
@@ -368,13 +382,13 @@ public abstract class GlobisImportBase<CDM_BASE extends CdmBase> extends CdmImpo
                }\r
                return success;\r
        }\r
-       \r
+\r
        private User getUser(String userString, GlobisImportState state){\r
                if (isBlank(userString)){\r
                        return null;\r
                }\r
                userString = userString.trim();\r
-               \r
+\r
                User user = state.getUser(userString);\r
                if (user == null){\r
                        user = getTransformedUser(userString,state);\r
@@ -387,7 +401,7 @@ public abstract class GlobisImportBase<CDM_BASE extends CdmBase> extends CdmImpo
                }\r
                return user;\r
        }\r
-       \r
+\r
        private User getTransformedUser(String userString, GlobisImportState state){\r
                Method method = state.getConfig().getUserTransformationMethod();\r
                if (method == null){\r
@@ -403,19 +417,19 @@ public abstract class GlobisImportBase<CDM_BASE extends CdmBase> extends CdmImpo
        }\r
 \r
        private User makeNewUser(String userString, GlobisImportState state){\r
-               String pwd = getPassword(); \r
+               String pwd = getPassword();\r
                User user = User.NewInstance(userString, pwd);\r
                state.putUser(userString, user);\r
                getUserService().save(user);\r
                logger.info("Added new user: " + userString);\r
                return user;\r
        }\r
-       \r
+\r
        private String getPassword(){\r
                String result = UUID.randomUUID().toString();\r
                return result;\r
        }\r
-       \r
+\r
        private DateTime getDateTime(Object timeString){\r
                if (timeString == null){\r
                        return null;\r
@@ -430,9 +444,9 @@ public abstract class GlobisImportBase<CDM_BASE extends CdmBase> extends CdmImpo
                }\r
                return dateTime;\r
        }\r
-       \r
-       \r
-       \r
+\r
+\r
+\r
        /**\r
         * Reads a foreign key field from the result set and adds its value to the idSet.\r
         * @param rs\r
@@ -447,10 +461,10 @@ public abstract class GlobisImportBase<CDM_BASE extends CdmBase> extends CdmImpo
                        idSet.add(id);\r
                }\r
        }\r
-       \r
-       \r
-       \r
-       \r
+\r
+\r
+\r
+\r
        /**\r
         * Returns true if i is a multiple of recordsPerTransaction\r
         * @param i\r
@@ -461,12 +475,12 @@ public abstract class GlobisImportBase<CDM_BASE extends CdmBase> extends CdmImpo
                startTransaction();\r
                return (i % recordsPerLoop) == 0;\r
        }\r
-       \r
+\r
        protected void doLogPerLoop(int count, int recordsPerLog, String pluralString){\r
                if ((count % recordsPerLog ) == 0 && count!= 0 ){ logger.info(pluralString + " handled: " + (count));}\r
        }\r
-       \r
 \r
 \r
-       \r
+\r
+\r
 }\r