You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by eb...@apache.org on 2008/04/25 11:30:15 UTC

svn commit: r651550 - /commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/PropertiesConfiguration.java

Author: ebourg
Date: Fri Apr 25 02:30:07 2008
New Revision: 651550

URL: http://svn.apache.org/viewvc?rev=651550&view=rev
Log:
Changed the property parsing in PropertiesConfiguration to use a regular expression

Modified:
    commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/PropertiesConfiguration.java

Modified: commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/PropertiesConfiguration.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/PropertiesConfiguration.java?rev=651550&r1=651549&r2=651550&view=diff
==============================================================================
--- commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/PropertiesConfiguration.java (original)
+++ commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/PropertiesConfiguration.java Fri Apr 25 02:30:07 2008
@@ -27,6 +27,8 @@
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import org.apache.commons.lang.ArrayUtils;
 import org.apache.commons.lang.StringEscapeUtils;
@@ -542,6 +544,10 @@
      */
     public static class PropertiesReader extends LineNumberReader
     {
+        /** The regular expression to parse the key and the value of a property. */
+        private static final Pattern PROPERTY_PATTERN
+                = Pattern.compile("(([\\S&&[^\\\\" + new String(SEPARATORS) + "]]|\\\\.)*)\\s*(\\s+|[" + new String(SEPARATORS) +"])(.*)");
+
         /** Stores the comment lines for the currently processed property.*/
         private List<String> commentLines;
 
@@ -718,96 +724,14 @@
          */
         private static String[] parseProperty(String line)
         {
-            // sorry for this spaghetti code, please replace it as soon as
-            // possible with a regexp when the Java 1.3 requirement is dropped
-
-            String[] result = new String[2];
-            StringBuilder key = new StringBuilder();
-            StringBuilder value = new StringBuilder();
-
-            // state of the automaton:
-            // 0: key parsing
-            // 1: antislash found while parsing the key
-            // 2: separator crossing
-            // 3: value parsing
-            int state = 0;
+            Matcher matcher = PROPERTY_PATTERN.matcher(line);
 
-            for (int pos = 0; pos < line.length(); pos++)
-            {
-                char c = line.charAt(pos);
+            String[] result = {"", ""};
 
-                switch (state)
-                {
-                    case 0:
-                        if (c == '\\')
-                        {
-                            state = 1;
-                        }
-                        else if (ArrayUtils.contains(WHITE_SPACE, c))
-                        {
-                            // switch to the separator crossing state
-                            state = 2;
-                        }
-                        else if (ArrayUtils.contains(SEPARATORS, c))
-                        {
-                            // switch to the value parsing state
-                            state = 3;
-                        }
-                        else
-                        {
-                            key.append(c);
-                        }
-
-                        break;
-
-                    case 1:
-                        if (ArrayUtils.contains(SEPARATORS, c) || ArrayUtils.contains(WHITE_SPACE, c))
-                        {
-                            // this is an escaped separator or white space
-                            key.append(c);
-                        }
-                        else
-                        {
-                            // another escaped character, the '\' is preserved
-                            key.append('\\');
-                            key.append(c);
-                        }
-
-                        // return to the key parsing state
-                        state = 0;
-
-                        break;
-
-                    case 2:
-                        if (ArrayUtils.contains(WHITE_SPACE, c))
-                        {
-                            // do nothing, eat all white spaces
-                            state = 2;
-                        }
-                        else if (ArrayUtils.contains(SEPARATORS, c))
-                        {
-                            // switch to the value parsing state
-                            state = 3;
-                        }
-                        else
-                        {
-                            // any other character indicates we encoutered the beginning of the value
-                            value.append(c);
-
-                            // switch to the value parsing state
-                            state = 3;
-                        }
-
-                        break;
-
-                    case 3:
-                        value.append(c);
-                        break;
-                }
+            if (matcher.matches()) {
+                result[0] = matcher.group(1).trim();
+                result[1] = matcher.group(4).trim();
             }
-
-            result[0] = key.toString().trim();
-            result[1] = value.toString().trim();
 
             return result;
         }