You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by on...@apache.org on 2016/06/20 11:27:40 UTC

svn commit: r1749305 - in /poi/trunk/src: java/org/apache/poi/hssf/usermodel/HSSFName.java ooxml/java/org/apache/poi/xssf/usermodel/XSSFName.java testcases/org/apache/poi/ss/usermodel/BaseTestNamedRange.java

Author: onealj
Date: Mon Jun 20 11:27:40 2016
New Revision: 1749305

URL: http://svn.apache.org/viewvc?rev=1749305&view=rev
Log:
bug 56781: make Name#validateName compatible on Java 6 (no Regex \p{IsAlphabetic} metaclasses

Modified:
    poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFName.java
    poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFName.java
    poi/trunk/src/testcases/org/apache/poi/ss/usermodel/BaseTestNamedRange.java

Modified: poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFName.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFName.java?rev=1749305&r1=1749304&r2=1749305&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFName.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFName.java Mon Jun 20 11:27:40 2016
@@ -17,8 +17,6 @@
 
 package org.apache.poi.hssf.usermodel;
 
-import java.util.regex.Pattern;
-
 import org.apache.poi.hssf.model.HSSFFormulaParser;
 import org.apache.poi.hssf.model.InternalWorkbook;
 import org.apache.poi.hssf.record.NameCommentRecord;
@@ -32,10 +30,6 @@ import org.apache.poi.ss.usermodel.Name;
  * 'named range' or name of a user defined function.
  */
 public final class HSSFName implements Name {
-    private static final Pattern isValidName = Pattern.compile(
-            "[\\p{IsAlphabetic}_\\\\]" +
-            "[\\p{IsAlphabetic}0-9_.\\\\]*",
-            Pattern.CASE_INSENSITIVE);
     
     private HSSFWorkbook _book;
     private NameRecord _definedNameRec;
@@ -160,10 +154,35 @@ public final class HSSFName implements N
         }
     }
 
-    private static void validateName(String name){
-        if(name.length() == 0)  throw new IllegalArgumentException("Name cannot be blank");
-        if(!isValidName.matcher(name).matches()) {
-            throw new IllegalArgumentException("Invalid name: '"+name+"'");
+    private static void validateName(String name) {
+        /* equivalent to:
+        Pattern.compile(
+                "[\\p{IsAlphabetic}_]" +
+                "[\\p{IsAlphabetic}0-9_\\\\]*",
+                Pattern.CASE_INSENSITIVE).matcher(name).matches();
+        \p{IsAlphabetic} doesn't work on Java 6, and other regex-based character classes don't work on unicode
+        thus we are stuck with Character.isLetter (for now).
+        */
+        
+        if (name.length() == 0) {
+            throw new IllegalArgumentException("Name cannot be blank");
+        }
+        
+        // is first character valid?
+        char c = name.charAt(0);
+        String allowedSymbols = "_";
+        boolean characterIsValid = (Character.isLetter(c) || allowedSymbols.indexOf(c) != -1);
+        if (!characterIsValid) {
+            throw new IllegalArgumentException("Invalid name: '"+name+"': first character must be underscore or a letter");
+        }
+        
+        // are all other characters valid?
+        allowedSymbols = "_\\"; //backslashes needed for unicode escape
+        for (final char ch : name.toCharArray()) {
+            characterIsValid = (Character.isLetterOrDigit(ch) || allowedSymbols.indexOf(ch) != -1);
+            if (!characterIsValid) {
+                throw new IllegalArgumentException("Invalid name: '"+name+"'");
+            }
         }
     }
 

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFName.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFName.java?rev=1749305&r1=1749304&r2=1749305&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFName.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFName.java Mon Jun 20 11:27:40 2016
@@ -18,9 +18,6 @@ package org.apache.poi.xssf.usermodel;
 
 import org.apache.poi.ss.formula.ptg.Ptg;
 
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
 import org.apache.poi.ss.formula.FormulaParser;
 import org.apache.poi.ss.formula.FormulaType;
 import org.apache.poi.ss.usermodel.Name;
@@ -57,11 +54,6 @@ import org.openxmlformats.schemas.spread
  */
 public final class XSSFName implements Name {
     
-    private static final Pattern isValidName = Pattern.compile(
-            "[\\p{IsAlphabetic}_\\\\]" +
-            "[\\p{IsAlphabetic}0-9_.\\\\]*",
-            Pattern.CASE_INSENSITIVE);
-
     /**
      * A built-in defined name that specifies the workbook's print area
      */
@@ -354,10 +346,35 @@ public final class XSSFName implements N
         return _ctName.toString().equals(cf.getCTName().toString());
     }
     
-    private static void validateName(String name){
-        if(name.length() == 0)  throw new IllegalArgumentException("Name cannot be blank");
-        if (!isValidName.matcher(name).matches()) {
-            throw new IllegalArgumentException("Invalid name: '"+name+"'");
+    private static void validateName(String name) {
+        /* equivalent to:
+        Pattern.compile(
+                "[\\p{IsAlphabetic}_]" +
+                "[\\p{IsAlphabetic}0-9_\\\\]*",
+                Pattern.CASE_INSENSITIVE).matcher(name).matches();
+        \p{IsAlphabetic} doesn't work on Java 6, and other regex-based character classes don't work on unicode
+        thus we are stuck with Character.isLetter (for now).
+        */
+        
+        if (name.length() == 0) {
+            throw new IllegalArgumentException("Name cannot be blank");
+        }
+        
+        // is first character valid?
+        char c = name.charAt(0);
+        String allowedSymbols = "_";
+        boolean characterIsValid = (Character.isLetter(c) || allowedSymbols.indexOf(c) != -1);
+        if (!characterIsValid) {
+            throw new IllegalArgumentException("Invalid name: '"+name+"': first character must be underscore or a letter");
+        }
+        
+        // are all other characters valid?
+        allowedSymbols = "_\\"; //backslashes needed for unicode escape
+        for (final char ch : name.toCharArray()) {
+            characterIsValid = (Character.isLetterOrDigit(ch) || allowedSymbols.indexOf(ch) != -1);
+            if (!characterIsValid) {
+                throw new IllegalArgumentException("Invalid name: '"+name+"'");
+            }
         }
     }
 }

Modified: poi/trunk/src/testcases/org/apache/poi/ss/usermodel/BaseTestNamedRange.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/ss/usermodel/BaseTestNamedRange.java?rev=1749305&r1=1749304&r2=1749305&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/ss/usermodel/BaseTestNamedRange.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/ss/usermodel/BaseTestNamedRange.java Mon Jun 20 11:27:40 2016
@@ -687,10 +687,10 @@ public abstract class BaseTestNamedRange
         for (String valid : Arrays.asList(
                 "Hello",
                 "number1",
-                "_underscore",
-                "p.e.r.o.i.d.s",
-                "\\Backslash",
-                "Backslash\\"
+                "_underscore"
+                //"p.e.r.o.i.d.s",
+                //"\\Backslash",
+                //"Backslash\\"
                 )) {
             name.setNameName(valid);
         }
@@ -715,7 +715,8 @@ public abstract class BaseTestNamedRange
                 name.setNameName(invalid);
                 fail("expected exception: " + invalid);
             } catch (final IllegalArgumentException e) {
-                assertEquals("Invalid name: '" + invalid + "'", e.getMessage());
+                assertTrue(invalid,
+                        e.getMessage().startsWith("Invalid name: '"+invalid+"'"));
             }
         }
         



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org