Author: gvanmatre
Date: Sat Oct 21 15:46:02 2006
New Revision: 466600

URL: http://svn.apache.org/viewvc?view=rev&rev=466600
Log:
Added better mock value binding expression support for scoped attribute names 
that contain dotted values.

Modified:
    
shale/framework/trunk/shale-test/src/main/java/org/apache/shale/test/el/MockValueExpression.java
    
shale/framework/trunk/shale-test/src/main/java/org/apache/shale/test/mock/MockValueBinding.java
    
shale/framework/trunk/shale-test/src/test/java/org/apache/shale/test/el/MockExpressionFactoryTestCase.java
    
shale/framework/trunk/shale-test/src/test/java/org/apache/shale/test/mock/ValueBindingTest.java

Modified: 
shale/framework/trunk/shale-test/src/main/java/org/apache/shale/test/el/MockValueExpression.java
URL: 
http://svn.apache.org/viewvc/shale/framework/trunk/shale-test/src/main/java/org/apache/shale/test/el/MockValueExpression.java?view=diff&rev=466600&r1=466599&r2=466600
==============================================================================
--- 
shale/framework/trunk/shale-test/src/main/java/org/apache/shale/test/el/MockValueExpression.java
 (original)
+++ 
shale/framework/trunk/shale-test/src/main/java/org/apache/shale/test/el/MockValueExpression.java
 Sat Oct 21 15:46:02 2006
@@ -264,19 +264,34 @@
         }
 
         if (expression.startsWith("${") || expression.startsWith("#{")) {
-            if (expression.endsWith("}")) {
-                String temp = expression.substring(2, expression.length() - 
1).replaceAll(" ", "");
+            if (expression.endsWith("}")) {               
                 List names = new ArrayList();
-                while (temp.length() > 0) {
-                    int period= temp.indexOf(".");
-                    if (period >= 0) {
-                        names.add(temp.substring(0, period));
-                        temp = temp.substring(period + 1);
-                    } else {
-                        names.add(temp);
-                        temp = "";
+                StringBuffer expr = new StringBuffer(expression.substring(2, 
expression.length() - 1).replaceAll(" ", ""));
+                boolean isBlockOn = false;
+                next: for (int i = expr.length() - 1; i > -1; i--) {
+                    if (expr.charAt(i) == ' ') {
+                        expr.deleteCharAt(i);
+                    } else if (expr.charAt(i) == ']') {
+                        expr.deleteCharAt(i);
+                    } else if (expr.charAt(i) == '[') {
+                        expr.deleteCharAt(i);
+                    } else if (expr.charAt(i) == '\'') {
+                        if (!isBlockOn) {
+                            expr.deleteCharAt(i);
+                        } else {
+                            names.add(0, expr.substring(i + 1));
+                            expr.delete(i, expr.length());
+                        }
+                        isBlockOn = !isBlockOn;
+                    } else if (expr.charAt(i) == '.' && !isBlockOn) {
+                        names.add(0, expr.substring(i + 1));
+                        expr.delete(i, expr.length());
                     }
                 }
+                if (expr.length() > 0) {
+                    names.add(0, expr.toString());
+                }
+
                 elements = (String[]) names.toArray(new String[names.size()]);
             } else {
                 throw new IllegalArgumentException(expression);

Modified: 
shale/framework/trunk/shale-test/src/main/java/org/apache/shale/test/mock/MockValueBinding.java
URL: 
http://svn.apache.org/viewvc/shale/framework/trunk/shale-test/src/main/java/org/apache/shale/test/mock/MockValueBinding.java?view=diff&rev=466600&r1=466599&r2=466600
==============================================================================
--- 
shale/framework/trunk/shale-test/src/main/java/org/apache/shale/test/mock/MockValueBinding.java
 (original)
+++ 
shale/framework/trunk/shale-test/src/main/java/org/apache/shale/test/mock/MockValueBinding.java
 Sat Oct 21 15:46:02 2006
@@ -326,27 +326,43 @@
      */
     private List parse(String ref) {
 
-        String expr = ref.replaceAll(" ", "");
         List names = new ArrayList();
-        while (expr.length() > 0) {
-            int period = expr.indexOf(".");
-            if (period >= 0) {
-                names.add(expr.substring(0, period));
-                expr = expr.substring(period + 1);
-            } else {
-                names.add(expr);
-                expr = "";
+        StringBuffer expr = new StringBuffer(ref);
+        boolean isBlockOn = false;
+        next: for (int i = expr.length() - 1; i > -1; i--) {
+            if (expr.charAt(i) == ' ') {
+                expr.deleteCharAt(i);
+            } else if (expr.charAt(i) == ']') {
+                expr.deleteCharAt(i);
+            } else if (expr.charAt(i) == '[') {
+                expr.deleteCharAt(i);
+            } else if (expr.charAt(i) == '\'') {
+                if (!isBlockOn) {
+                    expr.deleteCharAt(i);
+                } else {
+                    names.add(0, expr.substring(i + 1));
+                    expr.delete(i, expr.length());
+                }
+                isBlockOn = !isBlockOn;
+            } else if (expr.charAt(i) == '.' && !isBlockOn) {
+                names.add(0, expr.substring(i + 1));
+                expr.delete(i, expr.length());
             }
         }
+
+        if (expr.length() > 0) {
+            names.add(0, expr.toString());
+        }
+
         if (names.size() < 1) {
             throw new ReferenceSyntaxException("No expression in '"
-                                               + ref + "'");
+                    + ref + "'");
         }
         for (int i = 0; i < names.size(); i++) {
             String name = (String) names.get(i);
             if (name.length() < 1) {
                 throw new ReferenceSyntaxException("Invalid expression '"
-                                                   + ref + "'");
+                        + ref + "'");
             }
         }
         return (names);

Modified: 
shale/framework/trunk/shale-test/src/test/java/org/apache/shale/test/el/MockExpressionFactoryTestCase.java
URL: 
http://svn.apache.org/viewvc/shale/framework/trunk/shale-test/src/test/java/org/apache/shale/test/el/MockExpressionFactoryTestCase.java?view=diff&rev=466600&r1=466599&r2=466600
==============================================================================
--- 
shale/framework/trunk/shale-test/src/test/java/org/apache/shale/test/el/MockExpressionFactoryTestCase.java
 (original)
+++ 
shale/framework/trunk/shale-test/src/test/java/org/apache/shale/test/el/MockExpressionFactoryTestCase.java
 Sat Oct 21 15:46:02 2006
@@ -320,6 +320,19 @@
     }
 
 
+    // Test ValueExpression
+    public void testValueExpressionString() {
+
+        request.setAttribute("org.apache.shale.test", new Integer(123));
+        ELContext context = facesContext.getELContext();
+
+        ValueExpression expr = factory.createValueExpression(context, 
"#{requestScope['org.apache.shale.test']}", String.class);
+        Object ref = expr.getValue(context);
+        assertNotNull(ref);
+        assertTrue(ref instanceof String);
+        assertEquals("123", ref);
+    }
+
     public void testPristine() {
 
         assertNotNull(factory);

Modified: 
shale/framework/trunk/shale-test/src/test/java/org/apache/shale/test/mock/ValueBindingTest.java
URL: 
http://svn.apache.org/viewvc/shale/framework/trunk/shale-test/src/test/java/org/apache/shale/test/mock/ValueBindingTest.java?view=diff&rev=466600&r1=466599&r2=466600
==============================================================================
--- 
shale/framework/trunk/shale-test/src/test/java/org/apache/shale/test/mock/ValueBindingTest.java
 (original)
+++ 
shale/framework/trunk/shale-test/src/test/java/org/apache/shale/test/mock/ValueBindingTest.java
 Sat Oct 21 15:46:02 2006
@@ -59,6 +59,21 @@
     
     assertEquals("Matthias", vb.getValue(facesContext).toString());
     
+    vb = 
facesContext.getApplication().createValueBinding("#{requestScope['bean']}");
+    
+    Bean copy = (Bean) vb.getValue(facesContext);
+    assertNotNull(copy);
+    assertTrue(bean == copy);
+
+    
facesContext.getExternalContext().getRequestMap().put("org.apache.shale.bean",
+            bean);
+
+    vb = 
facesContext.getApplication().createValueBinding("#{requestScope['org.apache.shale.bean']}");
+    
+    copy = (Bean) vb.getValue(facesContext);
+    assertNotNull(copy);
+    assertTrue(bean == copy);
+
 
   }
 


Reply via email to