ref #6661 remove brackets from initials updater
authorAndreas Müller <a.mueller@bgbm.org>
Wed, 14 Jun 2017 20:23:10 +0000 (22:23 +0200)
committerAndreas Müller <a.mueller@bgbm.org>
Wed, 14 Jun 2017 20:23:10 +0000 (22:23 +0200)
cdmlib-model/src/main/java/eu/etaxonomy/cdm/strategy/cache/agent/PersonDefaultCacheStrategy.java
cdmlib-model/src/test/java/eu/etaxonomy/cdm/strategy/cache/agent/PersonDefaultCacheStrategyTest.java
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/v41_47/InitialsUpdater.java

index c8eea9a09107cb796b26e03c4618685c1c56784a..c6deaa300c8948eae6a3688e6494ad351255d6ec 100644 (file)
@@ -10,6 +10,8 @@
 package eu.etaxonomy.cdm.strategy.cache.agent;\r
 \r
 import java.util.UUID;\r
+import java.util.regex.Matcher;\r
+import java.util.regex.Pattern;\r
 \r
 import org.apache.commons.lang.StringUtils;\r
 import org.apache.log4j.Logger;\r
@@ -125,11 +127,17 @@ public class PersonDefaultCacheStrategy
         }else if (StringUtils.isBlank(firstname)){\r
             return "";\r
         }\r
+        //remove brackets\r
+        final String regex = "\\([^)]*\\)";\r
+        final Pattern pattern = Pattern.compile(regex);\r
+        final Matcher matcher = pattern.matcher(firstname);\r
+        firstname = matcher.replaceAll("").replaceAll("\\s\\s", " ");\r
+\r
         String result = "";\r
         String[] splits = firstname.split("((?<=\\.)|\\s+|(?=([\\-\u2013])))+"); // [\\-\u2013]? // (?!=\\s) wasn't successful to trim\r
         for (String split : splits){\r
             split = split.trim();\r
-            if (StringUtils.isBlank(split)){\r
+            if (StringUtils.isBlank(split) || split.matches("\\(.*\\)")){  //again checking brackets not really necessary\r
                 continue;\r
             }\r
             if (split.matches("^[\\-\u2013].*")){\r
index bafaadc13d15ff15a790176ae2626be2ca93e344..624e2a74db9c70abc2ad1880ff94e3e43e39c0a3 100644 (file)
@@ -262,6 +262,24 @@ public class PersonDefaultCacheStrategyTest {
         firstname = "Pe. Y.";\r
         Assert.assertEquals("Pe.Y.", formatter.getInitialsFromFirstname(firstname, force));\r
 \r
+        //brackets\r
+        force = true;\r
+        firstname = "Constantin (Konstantin) Georg Alexander";\r
+        Assert.assertEquals("C.G.A.", formatter.getInitialsFromFirstname(firstname, force));\r
+        firstname = "Franz (Joseph Andreas Nicolaus)";\r
+        Assert.assertEquals("F.", formatter.getInitialsFromFirstname(firstname, force));\r
+        firstname = "Viktor V. (W.W.)";\r
+        Assert.assertEquals("V.V.", formatter.getInitialsFromFirstname(firstname, force));\r
+        firstname = "(Georg Ferdinand) Otto";\r
+        Assert.assertEquals("O.", formatter.getInitialsFromFirstname(firstname, force));\r
+        firstname = "(Sébastien-) René";\r
+        Assert.assertEquals("R.", formatter.getInitialsFromFirstname(firstname, force));\r
+        firstname = "Joyce (M.) Chismore Lewin";\r
+        Assert.assertEquals("J.C.L.", formatter.getInitialsFromFirstname(firstname, force));\r
+        firstname = "Joyce (M.) Chismore Lewin";\r
+        Assert.assertEquals("J.C.L.", formatter.getInitialsFromFirstname(firstname, force));\r
+\r
+//      "Robert. K." wurde auf "Robert. K." gemapped\r
 \r
         //must not throw exception (exact result may change in future)\r
         firstname = "W.-H.-";\r
index fd389d269aba39c0e6ae5a3e4414dff25bc9c5b2..d66941d34875c16699c36efca9bb260ea592048f 100644 (file)
@@ -11,6 +11,7 @@ package eu.etaxonomy.cdm.database.update.v41_47;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.log4j.Logger;
 
 import eu.etaxonomy.cdm.common.CdmUtils;
@@ -57,14 +58,14 @@ public class InitialsUpdater extends SchemaUpdaterStepBase{
             PersonDefaultCacheStrategy formatter = PersonDefaultCacheStrategy.NewInstance();
 
             String sqlCopyFirstname = "UPDATE AgentBase SET initials = firstname WHERE DTYPE='Person'"
-                    + " AND firstname IS NOT NULL ";
+                    + " AND firstname IS NOT NULL AND initials IS NULL ";
 
-            String sqlRemoveFirstname = "UPDATE AgentBase SET firstname = %s, initials = '%s' WHERE id = %d";
+            String sqlRemoveFirstname = "UPDATE AgentBase SET firstname = %s, initials = %s WHERE id = %d";
 
             String sqlSelectInitials = "SELECT id, firstname FROM AgentBase WHERE DTYPE='Person'"
-                    + " AND firstname IS NOT NULL ";
+                    + " AND firstname IS NOT NULL AND initials = firstname ";
 
-            datasource.executeUpdate(sqlCopyFirstname);
+            int n = datasource.executeUpdate(sqlCopyFirstname);
 
             ResultSet rs = datasource.executeQuery(sqlSelectInitials);
             while (rs.next()){
@@ -105,17 +106,24 @@ public class InitialsUpdater extends SchemaUpdaterStepBase{
                 firstnameSql = " null ";
                 initialsSql = initialsForced;
             }else if (CdmUtils.equalsIgnoreWS(firstname, initialsAllow)){
-                //firstname has only abbreviations, but not all of them being 1-letter, keep everything
+                //first name has only abbreviations, but not all of them being 1-letter, keep everything
                 firstnameSql = " firstname ";
                 initialsSql = initialsAllow;
             }else {
-                //firstname has non abbreviated parts, keep it as it is and use initials forced as initials
+                //first name has non abbreviated parts, keep it as it is and use initials forced as initials
                 firstnameSql = " firstname ";
                 initialsSql = initialsForced;
             }
             if (initialsSql!= null){
                 initialsSql = initialsSql.replace("'", "\\'");
             }
+            //handle blank
+            if (StringUtils.isBlank(firstname)){
+                firstnameSql = " null ";
+                initialsSql = " null ";
+            }else {
+                initialsSql = "'" + initialsSql + "'";
+            }
 
             String sql = String.format(sqlRemoveFirstname, firstnameSql, initialsSql, id);
             //remove old relationship