Revision: 561
Author: mr0...@mro.name
Date: Sat Jul 25 06:11:25 2009
Log: proposal to fix issue#22
http://code.google.com/p/piccolo2d/source/detail?r=561

Modified:
  /piccolo2d.java/trunk/core/src/main/java/edu/umd/cs/piccolo/PNode.java
  /piccolo2d.java/trunk/core/src/test/java/edu/umd/cs/piccolo/PNodeTest.java

=======================================
--- /piccolo2d.java/trunk/core/src/main/java/edu/umd/cs/piccolo/PNode.java      
 
Sun Jul 19 07:32:25 2009
+++ /piccolo2d.java/trunk/core/src/main/java/edu/umd/cs/piccolo/PNode.java      
 
Sat Jul 25 06:11:25 2009
@@ -55,6 +55,7 @@
  import java.io.ObjectInputStream;
  import java.io.ObjectOutputStream;
  import java.io.Serializable;
+import java.text.ParseException;
  import java.util.ArrayList;
  import java.util.Collection;
  import java.util.Collections;
@@ -63,6 +64,7 @@
  import java.util.Iterator;
  import java.util.List;
  import java.util.ListIterator;
+import java.util.regex.Pattern;

  import javax.swing.event.EventListenerList;
  import javax.swing.event.SwingPropertyChangeSupport;
@@ -235,6 +237,112 @@
      private boolean fullBoundsInvalid;
      private boolean childBoundsInvalid;
      private boolean occluded;
+
+    /**
+     * <a
+     *  
href="http://www.w3.org/TR/SVGTiny12/struct.html#IDAttribute";>xml:id</a>
+     */
+    private static final Pattern nameValuePat;
+
+    private static String join(final String prefix, final String[] parts,  
final String sep, final String suffix) {
+        final StringBuffer ret = new StringBuffer(prefix);
+        if (parts != null && parts.length > 0) {
+            ret.append(parts[0]);
+            for (int i = 1; i < parts.length; i++)
+                ret.append(sep).append(parts[i]);
+        }
+        ret.append(suffix);
+        return ret.toString();
+    }
+
+    static {
+        // http://www.w3.org/TR/REC-xml/#NT-BaseChar
+        Pattern BaseChar = Pattern.compile(join("(?:", new String[]  
{ "[\u0041-\u005A]", "[\u0061-\u007A]",
+                "[\u00C0-\u00D6]", "[\u00D8-\u00F6]", "[\u00F8-\u00FF]", 
"[\u0100-\u0131]", "[\u0134-\u013E]",
+                "[\u0141-\u0148]", "[\u014A-\u017E]", "[\u0180-\u01C3]", 
"[\u01CD-\u01F0]", "[\u01F4-\u01F5]",
+                "[\u01FA-\u0217]", "[\u0250-\u02A8]", "[\u02BB-\u02C1]", 
"[\u0386]", "[\u0388-\u038A]", "[\u038C]",
+                "[\u038E-\u03A1]", "[\u03A3-\u03CE]", "[\u03D0-\u03D6]", 
"[\u03DA]", "[\u03DC]", "[\u03DE]",
+                "[\u03E0]", "[\u03E2-\u03F3]", "[\u0401-\u040C]", 
"[\u040E-\u044F]", "[\u0451-\u045C]",
+                "[\u045E-\u0481]", "[\u0490-\u04C4]", "[\u04C7-\u04C8]", 
"[\u04CB-\u04CC]", "[\u04D0-\u04EB]",
+                "[\u04EE-\u04F5]", "[\u04F8-\u04F9]", "[\u0531-\u0556]", 
"[\u0559]", "[\u0561-\u0586]",
+                "[\u05D0-\u05EA]", "[\u05F0-\u05F2]", "[\u0621-\u063A]", 
"[\u0641-\u064A]", "[\u0671-\u06B7]",
+                "[\u06BA-\u06BE]", "[\u06C0-\u06CE]", "[\u06D0-\u06D3]", 
"[\u06D5]", "[\u06E5-\u06E6]",
+                "[\u0905-\u0939]", "[\u093D]", "[\u0958-\u0961]", 
"[\u0985-\u098C]", "[\u098F-\u0990]",
+                "[\u0993-\u09A8]", "[\u09AA-\u09B0]", "[\u09B2]", 
"[\u09B6-\u09B9]", "[\u09DC-\u09DD]",
+                "[\u09DF-\u09E1]", "[\u09F0-\u09F1]", "[\u0A05-\u0A0A]", 
"[\u0A0F-\u0A10]", "[\u0A13-\u0A28]",
+                "[\u0A2A-\u0A30]", "[\u0A32-\u0A33]", "[\u0A35-\u0A36]", 
"[\u0A38-\u0A39]", "[\u0A59-\u0A5C]",
+                "[\u0A5E]", "[\u0A72-\u0A74]", "[\u0A85-\u0A8B]", "[\u0A8D]", 
"[\u0A8F-\u0A91]", "[\u0A93-\u0AA8]",
+                "[\u0AAA-\u0AB0]", "[\u0AB2-\u0AB3]", "[\u0AB5-\u0AB9]", 
"[\u0ABD]", "[\u0AE0]", "[\u0B05-\u0B0C]",
+                "[\u0B0F-\u0B10]", "[\u0B13-\u0B28]", "[\u0B2A-\u0B30]", 
"[\u0B32-\u0B33]", "[\u0B36-\u0B39]",
+                "[\u0B3D]", "[\u0B5C-\u0B5D]", "[\u0B5F-\u0B61]", 
"[\u0B85-\u0B8A]", "[\u0B8E-\u0B90]",
+                "[\u0B92-\u0B95]", "[\u0B99-\u0B9A]", "[\u0B9C]", 
"[\u0B9E-\u0B9F]", "[\u0BA3-\u0BA4]",
+                "[\u0BA8-\u0BAA]", "[\u0BAE-\u0BB5]", "[\u0BB7-\u0BB9]", 
"[\u0C05-\u0C0C]", "[\u0C0E-\u0C10]",
+                "[\u0C12-\u0C28]", "[\u0C2A-\u0C33]", "[\u0C35-\u0C39]", 
"[\u0C60-\u0C61]", "[\u0C85-\u0C8C]",
+                "[\u0C8E-\u0C90]", "[\u0C92-\u0CA8]", "[\u0CAA-\u0CB3]", 
"[\u0CB5-\u0CB9]", "[\u0CDE]",
+                "[\u0CE0-\u0CE1]", "[\u0D05-\u0D0C]", "[\u0D0E-\u0D10]", 
"[\u0D12-\u0D28]", "[\u0D2A-\u0D39]",
+                "[\u0D60-\u0D61]", "[\u0E01-\u0E2E]", "[\u0E30]", 
"[\u0E32-\u0E33]", "[\u0E40-\u0E45]",
+                "[\u0E81-\u0E82]", "[\u0E84]", "[\u0E87-\u0E88]", "[\u0E8A]", 
"[\u0E8D]", "[\u0E94-\u0E97]",
+                "[\u0E99-\u0E9F]", "[\u0EA1-\u0EA3]", "[\u0EA5]", "[\u0EA7]", 
"[\u0EAA-\u0EAB]", "[\u0EAD-\u0EAE]",
+                "[\u0EB0]", "[\u0EB2-\u0EB3]", "[\u0EBD]", "[\u0EC0-\u0EC4]", 
"[\u0F40-\u0F47]", "[\u0F49-\u0F69]",
+                "[\u10A0-\u10C5]", "[\u10D0-\u10F6]", "[\u1100]", 
"[\u1102-\u1103]", "[\u1105-\u1107]", "[\u1109]",
+                "[\u110B-\u110C]", "[\u110E-\u1112]", "[\u113C]", "[\u113E]", 
"[\u1140]", "[\u114C]", "[\u114E]",
+                "[\u1150]", "[\u1154-\u1155]", "[\u1159]", "[\u115F-\u1161]", 
"[\u1163]", "[\u1165]", "[\u1167]",
+                "[\u1169]", "[\u116D-\u116E]", "[\u1172-\u1173]", "[\u1175]", 
"[\u119E]", "[\u11A8]", "[\u11AB]",
+                "[\u11AE-\u11AF]", "[\u11B7-\u11B8]", "[\u11BA]", 
"[\u11BC-\u11C2]", "[\u11EB]", "[\u11F0]",
+                "[\u11F9]", "[\u1E00-\u1E9B]", "[\u1EA0-\u1EF9]", 
"[\u1F00-\u1F15]", "[\u1F18-\u1F1D]",
+                "[\u1F20-\u1F45]", "[\u1F48-\u1F4D]", "[\u1F50-\u1F57]", 
"[\u1F59]", "[\u1F5B]", "[\u1F5D]",
+                "[\u1F5F-\u1F7D]", "[\u1F80-\u1FB4]", "[\u1FB6-\u1FBC]", 
"[\u1FBE]", "[\u1FC2-\u1FC4]",
+                "[\u1FC6-\u1FCC]", "[\u1FD0-\u1FD3]", "[\u1FD6-\u1FDB]", 
"[\u1FE0-\u1FEC]", "[\u1FF2-\u1FF4]",
+                "[\u1FF6-\u1FFC]", "[\u2126]", "[\u212A-\u212B]", "[\u212E]", 
"[\u2180-\u2182]", "[\u3041-\u3094]",
+                "[\u30A1-\u30FA]", "[\u3105-\u312C]", "[\uAC00-\uD7A3]"  
}, "|", ")"));
+        Pattern IdeoGraphic = Pattern.compile(join("(?:",
+                new String[]  
{ "[\u4E00-\u9FA5]", "\u3007", "[\u3021-\u3029]" }, "|", ")"));
+        Pattern Letter = Pattern.compile(join("(?:", new String[] {  
BaseChar.pattern(), IdeoGraphic.pattern() }, "|",
+                ")"));
+        // http://www.w3.org/TR/REC-xml/#NT-NameStartChar without ':'
+        Pattern NCNameStartChar_ = Pattern.compile(join("(?:", new  
String[] { "[A-Z]", "_", "[a-z]", "[\u00C0-\u00D6]",
+                "[\u00D8-\u00F6]", "[\u00F8-\u02FF]", "[\u0370-\u037D]", 
"[\u037F-\u1FFF]", "[\u200C-\u200D]",
+                "[\u2070-\u218F]", "[\u2C00-\u2FEF]", "[\u3001-\uD7FF]", 
"[\uF900-\uFDCF]", "[\uFDF0-\uFFFD]"
+        // , "\u10000-\uEFFFF"
+                }, "|", ")"));
+        // http://www.w3.org/TR/REC-xml/#NT-NameChar
+        Pattern NCNameChar = Pattern.compile(join("(?:", new String[] {  
NCNameStartChar_.pattern(), "-", "\\.",
+                "[0-9]", "\u00B7", "[\u0300-\u036F]", "[\u203F-\u2040]"  
}, "|", ")"));
+        // http://www.w3.org/TR/REC-xml/#NT-NameStartChar
+        Pattern NCNameStartChar = Pattern.compile(join("(?:", new String[]  
{ Letter.pattern(), "_" }, "|", ")"));
+        Pattern NCName = Pattern.compile(join("^(?:", new String[] {  
NCNameStartChar.pattern(), NCNameChar.pattern(),
+                "*" }, "", ")$"));
+        nameValuePat = NCName;
+    }
+
+    private String name;
+
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * Set the property allowing values of <a
+     *  
href="http://www.w3.org/TR/SVGTiny12/struct.html#IDAttribute";>xml:id</a>
+     *
+     * @throws IllegalArgumentException with nested @link ParseException.
+     */
+    public void setName(final String name) {
+        if (name != null) {
+            if (!nameValuePat.matcher(name).matches()) {
+                RuntimeException e = new IllegalArgumentException("'" +  
name + "' doesn't match '"
+                        + nameValuePat.pattern() + "'");
+                e.initCause(new ParseException(name, 0));
+                throw e;
+            }
+        }
+        this.name = name;
+    }
+
+    public PNode(final String name) {
+        this();
+        setName(name);
+    }

      /**
       * Constructs a new PNode.
=======================================
---  
/piccolo2d.java/trunk/core/src/test/java/edu/umd/cs/piccolo/PNodeTest.java      
 
Sat Jul 18 17:44:30 2009
+++  
/piccolo2d.java/trunk/core/src/test/java/edu/umd/cs/piccolo/PNodeTest.java      
 
Sat Jul 25 06:11:25 2009
@@ -42,6 +42,7 @@
  import java.util.Enumeration;
  import java.util.Iterator;
  import java.util.ListIterator;
+import java.util.regex.Pattern;

  import javax.swing.text.MutableAttributeSet;

@@ -74,6 +75,38 @@
          node = new PNode();
          mockListener = new MockPropertyChangeListener();
      }
+
+    public void testSetName() {
+        PNode n = new PNode(null);
+        n.setName("_.");
+        assertEquals("_.", n.getName());
+        n.setName("_-");
+        assertEquals("_-", n.getName());
+        try {
+            n.setName("-_");
+            fail();
+        }
+        catch (IllegalArgumentException e) {
+        }
+        try {
+            n.setName("");
+            fail();
+        }
+        catch (IllegalArgumentException e) {
+        }
+        try {
+            n.setName("a:b");
+            fail();
+        }
+        catch (IllegalArgumentException e) {
+        }
+        try {
+            n.setName("0name");
+            fail();
+        }
+        catch (IllegalArgumentException e) {
+        }
+    }

      public void testCenterBaseBoundsOnPoint() {
          node.setBounds(100, 300, 100, 80);
@@ -881,7 +914,8 @@
          try {
              node.getInverseTransform();
              fail("Exception not thrown");
-        } catch (PAffineTransformException e) {
+        }
+        catch (PAffineTransformException e) {
              // expected
          }
      }

--~--~---------~--~----~------------~-------~--~----~
Piccolo2D Developers Group: http://groups.google.com/group/piccolo2d-dev?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to