Author: hlship
Date: Fri Sep 12 11:15:28 2008
New Revision: 694761

URL: http://svn.apache.org/viewvc?rev=694761&view=rev
Log:
TAPESTRY-2236: Strip trailing punctuation (_ and $) from member names, as is 
done with leading punctuation

Modified:
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/BlockInjectionProvider.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/InternalClassTransformationImpl.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ComponentWorker.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/InjectComponentWorker.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ParameterWorker.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/PropertyWorker.java
    
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/InternalUtils.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/test/conf/testng.xml
    
tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/util/InternalUtilsTest.java

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/BlockInjectionProvider.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/BlockInjectionProvider.java?rev=694761&r1=694760&r2=694761&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/BlockInjectionProvider.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/BlockInjectionProvider.java
 Fri Sep 12 11:15:28 2008
@@ -1,4 +1,4 @@
-// Copyright 2007 The Apache Software Foundation
+// Copyright 2007, 2008 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -63,7 +63,6 @@
     {
         if (annotation != null) return annotation.value();
 
-        return InternalUtils.stripMemberPrefix(fieldName);
+        return InternalUtils.stripMemberName(fieldName);
     }
-
 }

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/InternalClassTransformationImpl.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/InternalClassTransformationImpl.java?rev=694761&r1=694760&r2=694761&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/InternalClassTransformationImpl.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/InternalClassTransformationImpl.java
 Fri Sep 12 11:15:28 2008
@@ -442,7 +442,7 @@
 
     public String newMemberName(String prefix, String baseName)
     {
-        return newMemberName(prefix + "_" + 
InternalUtils.stripMemberPrefix(baseName));
+        return newMemberName(prefix + "_" + 
InternalUtils.stripMemberName(baseName));
     }
 
     public void addImplementedInterface(Class interfaceClass)

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ComponentWorker.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ComponentWorker.java?rev=694761&r1=694760&r2=694761&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ComponentWorker.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ComponentWorker.java
 Fri Sep 12 11:15:28 2008
@@ -54,7 +54,7 @@
 
             String id = annotation.id();
 
-            if (InternalUtils.isBlank(id)) id = 
InternalUtils.stripMemberPrefix(fieldName);
+            if (InternalUtils.isBlank(id)) id = 
InternalUtils.stripMemberName(fieldName);
 
             String type = transformation.getFieldType(fieldName);
 
@@ -113,5 +113,4 @@
             embedded.addParameter(kv.getKey(), kv.getValue());
         }
     }
-
 }

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/InjectComponentWorker.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/InjectComponentWorker.java?rev=694761&r1=694760&r2=694761&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/InjectComponentWorker.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/InjectComponentWorker.java
 Fri Sep 12 11:15:28 2008
@@ -1,4 +1,4 @@
-// Copyright  2008 The Apache Software Foundation
+// Copyright 2008 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -43,7 +43,7 @@
 
             String componentId = annotation.value();
             if (InternalUtils.isBlank(componentId))
-                componentId = InternalUtils.stripMemberPrefix(fieldName);
+                componentId = InternalUtils.stripMemberName(fieldName);
 
             transformation.makeReadOnly(fieldName);
 

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ParameterWorker.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ParameterWorker.java?rev=694761&r1=694760&r2=694761&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ParameterWorker.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ParameterWorker.java
 Fri Sep 12 11:15:28 2008
@@ -175,7 +175,6 @@
                            resourcesFieldName, parameterName, 
bindingFactoryFieldName, defaultPrefix, defaultBinding);
 
             return;
-
         }
 
         if (autoconnect)
@@ -311,7 +310,7 @@
     {
         if (InternalUtils.isNonBlank(annotatedName)) return annotatedName;
 
-        return InternalUtils.stripMemberPrefix(fieldName);
+        return InternalUtils.stripMemberName(fieldName);
     }
 
     public static void bind(String parameterName, InternalComponentResources 
resources, Object value)

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/PropertyWorker.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/PropertyWorker.java?rev=694761&r1=694760&r2=694761&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/PropertyWorker.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/PropertyWorker.java
 Fri Sep 12 11:15:28 2008
@@ -38,7 +38,7 @@
         {
             Property annotation = transformation.getFieldAnnotation(fieldName, 
Property.class);
 
-            String propertyName = 
InternalUtils.capitalize(InternalUtils.stripMemberPrefix(fieldName));
+            String propertyName = 
InternalUtils.capitalize(InternalUtils.stripMemberName(fieldName));
 
             String fieldType = transformation.getFieldType(fieldName);
 
@@ -56,13 +56,12 @@
             {
                 TransformMethodSignature setter
                         = new TransformMethodSignature(Modifier.PUBLIC | 
Modifier.FINAL, "void", "set" + propertyName,
-                                                       new String[] { 
fieldType }, null);
+                                                       new String[] 
{fieldType}, null);
 
                 transformation.addTransformedMethod(setter, fieldName + " = 
$1;");
             }
 
             // The field is NOT claimed, because we want annotation for the 
fields to operate.
         }
-
     }
 }

Modified: 
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/InternalUtils.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/InternalUtils.java?rev=694761&r1=694760&r2=694761&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/InternalUtils.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/InternalUtils.java
 Fri Sep 12 11:15:28 2008
@@ -33,6 +33,8 @@
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
 import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 /**
  * Utilities used within various internal implemenations of Tapestry IOC and 
the rest of the tapestry-core framework.
@@ -46,6 +48,11 @@
     private static final String NAME_PREFIX = "_$";
 
     /**
+     * Pattern used to eliminate leading and trailing underscores and dollar 
signs.
+     */
+    private static final Pattern NAME_PATTERN = 
Pattern.compile("^[_|$]*([\\w|$]+?)[_|$]*$", Pattern.CASE_INSENSITIVE);
+
+    /**
      * Converts a method to a user presentable string using a [EMAIL 
PROTECTED] ClassFactory} to obtain a [EMAIL PROTECTED] Location} (where
      * possible). [EMAIL PROTECTED] #asString(Method)} is used under the 
covers, to present a detailed, but not excessive,
      * description of the class, method and parameters.
@@ -99,28 +106,18 @@
     }
 
     /**
-     * Strips leading punctuation ("_" and "$") from the provided name.
+     * Strips leading "_" and "$" and trailing "_" from the name.
      */
-    public static String stripMemberPrefix(String memberName)
+    public static String stripMemberName(String memberName)
     {
-        StringBuilder builder = new StringBuilder(memberName);
-
-        // There may be other prefixes we want to strip off, at some point!
-
-        // Strip off leading characters defined by NAME_PREFIX
-
-        // This code is really ugly and needs to be fixed.
+        Defense.notBlank(memberName, "memberName");
 
-        while (true)
-        {
-            char ch = builder.charAt(0);
-
-            if (InternalUtils.NAME_PREFIX.indexOf(ch) < 0) break;
+        Matcher matcher = NAME_PATTERN.matcher(memberName);
 
-            builder.deleteCharAt(0);
-        }
+        if (!matcher.matches())
+            throw new IllegalArgumentException(String.format("Input '%s' is 
not a valid Java identifier.", memberName));
 
-        return builder.toString();
+        return matcher.group(1);
     }
 
     /**
@@ -128,7 +125,7 @@
      */
     public static String createMemberName(String memberName)
     {
-        return NAME_PREFIX + stripMemberPrefix(memberName);
+        return NAME_PREFIX + stripMemberName(memberName);
     }
 
     /**
@@ -178,7 +175,6 @@
             {
                 return findAnnotation(parameterAnnotations, annotationClass);
             }
-
         };
 
         // At some point, it would be nice to eliminate InjectService, and rely
@@ -417,7 +413,6 @@
             {
                 throw new UnsupportedOperationException();
             }
-
         };
     }
 
@@ -576,6 +571,5 @@
                     "Constructor %s is not public and may not be used for 
autobuilding an instance of the class. " +
                             "You should make the constructor public, or mark 
an alternate public constructor with the @Inject annotation.",
                     constructor));
-
     }
 }

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/test/conf/testng.xml
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/test/conf/testng.xml?rev=694761&r1=694760&r2=694761&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/test/conf/testng.xml (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/test/conf/testng.xml Fri Sep 12 
11:15:28 2008
@@ -15,7 +15,7 @@
    limitations under the License.
 -->
 
-<suite name="Tapestry IOC" thread-count="10" annotations="1.5" verbose="2" 
parallel="tests">
+<suite name="Tapestry IOC" annotations="1.5" verbose="2">
     <test name="Public APIs">
         <packages>
             <package name="org.apache.tapestry5.ioc"/>

Modified: 
tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/util/InternalUtilsTest.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/util/InternalUtilsTest.java?rev=694761&r1=694760&r2=694761&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/util/InternalUtilsTest.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/util/InternalUtilsTest.java
 Fri Sep 12 11:15:28 2008
@@ -96,22 +96,44 @@
     @Test
     public void array_size_when_non_null()
     {
-        Object[] array = { 1, 2, 3 };
+        Object[] array = {1, 2, 3};
 
         assertEquals(InternalUtils.size(array), 3);
     }
 
-    @Test(dataProvider = "memberPrefixData")
-    public void strip_member_prefix(String input, String expected)
+    @Test(dataProvider = "memberNameData")
+    public void strip_member_name(String input, String expected)
     {
-        assertEquals(InternalUtils.stripMemberPrefix(input), expected);
+        assertEquals(InternalUtils.stripMemberName(input), expected);
     }
 
-    @DataProvider(name = "memberPrefixData")
-    public Object[][] memberPrefixData()
+    @DataProvider(name = "memberNameData")
+    public Object[][] memberNameData()
     {
-        return new Object[][] { { "simple", "simple" }, { "_name", "name" }, { 
"$name", "name" },
-                { "$_$__$__$_$___$_$_$_$$name$", "name$" } };
+        return new Object[][] {
+                {"simple", "simple"},
+                {"_name", "name"},
+                {"$name", "name"},
+                {"ruby_style", "ruby_style"},
+                {"__$ruby_style_", "ruby_style"},
+                {"$_$__$__$_$___$_$_$_$$name$", "name"},
+                {"foo_", "foo"},
+                {"_foo_", "foo"}
+        };
+    }
+
+    @Test
+    public void strip_illegal_member_name()
+    {
+        try
+        {
+            InternalUtils.stripMemberName("!foo");
+            unreachable();
+        }
+        catch (IllegalArgumentException ex)
+        {
+            assertEquals(ex.getMessage(), "Input '!foo' is not a valid Java 
identifier.");
+        }
     }
 
     @Test
@@ -153,7 +175,6 @@
     {
         List<String> many = Arrays.asList("fred", "barney", "", "wilma");
         assertEquals(InternalUtils.join(many), "fred, barney, (blank), wilma");
-
     }
 
     @Test
@@ -175,7 +196,6 @@
         List<String> unsorted = Arrays.asList("betty", "fred", "barney", "", 
"wilma");
 
         assertEquals(InternalUtils.joinSorted(unsorted), "(blank), barney, 
betty, fred, wilma");
-
     }
 
     @Test(dataProvider = "capitalize_inputs")
@@ -187,8 +207,8 @@
     @DataProvider(name = "capitalize_inputs")
     public Object[][] capitalize_inputs()
     {
-        return new Object[][] { { "hello", "Hello" }, { "Goodbye", "Goodbye" 
}, { "", "" }, { "a", "A" },
-                { "A", "A" } };
+        return new Object[][] {{"hello", "Hello"}, {"Goodbye", "Goodbye"}, 
{"", ""}, {"a", "A"},
+                {"A", "A"}};
     }
 
     @Test
@@ -333,7 +353,7 @@
 
         try
         {
-            InternalUtils.validateMarkerAnnotations(new Class[] { 
Inject.class, NotRetainedRuntime.class });
+            InternalUtils.validateMarkerAnnotations(new Class[] {Inject.class, 
NotRetainedRuntime.class});
             unreachable();
         }
         catch (IllegalArgumentException ex)
@@ -432,7 +452,6 @@
         {
             assertMessageContains(ex,
                                   "Constructor protected 
org.apache.tapestry5.ioc.internal.util.InternalUtilsTest$PublicInnerClass() is 
not public and may not be used for autobuilding an instance of the class.");
-
         }
     }
 }


Reply via email to