FELIX-2468 don't coerce CharSequence types to String

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@962374 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/Closure.java b/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/Closure.java
index c93036e..4deb2a7 100644
--- a/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/Closure.java
+++ b/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/Closure.java
@@ -111,7 +111,6 @@
     }
 
     // implements Function interface
-    // XXX: session arg x not used?
     public Object execute(CommandSession x, List<Object> values) throws Exception
     {
         try
@@ -257,10 +256,6 @@
                 {
                     v = eval(v);
                 }
-                else if (v instanceof CharSequence)
-                {
-                    v = v.toString();
-                }
                 break;
 
             case CLOSURE:
diff --git a/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/Tokenizer.java b/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/Tokenizer.java
index 0856bf0..b1c529e 100644
--- a/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/Tokenizer.java
+++ b/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/Tokenizer.java
@@ -544,9 +544,10 @@
                     value = ww;
                     Object expand = expand(value, evaluate, true);
 
-                    if (eot() && buf.length() == 0 && value.equals(expand))
+                    if (eot() && buf.length() == 0 && value == expand)
                     {
-                        return ww.value;
+                        // FELIX-2468 avoid returning CharSequence implementation
+                        return ww.value.toString();
                     }
 
                     if (null != expand)
diff --git a/gogo/runtime/src/test/java/org/apache/felix/gogo/runtime/TestParser2.java b/gogo/runtime/src/test/java/org/apache/felix/gogo/runtime/TestParser2.java
index 2ef58ff..350f9f6 100644
--- a/gogo/runtime/src/test/java/org/apache/felix/gogo/runtime/TestParser2.java
+++ b/gogo/runtime/src/test/java/org/apache/felix/gogo/runtime/TestParser2.java
@@ -67,6 +67,8 @@
     {
         Context c = new Context();
         c.addCommand("echo", this);
+        c.addCommand("new", this);
+        
         // FELIX-2433
         assertEquals("helloworld", c.execute("echo \"$(echo hello)world\""));
         
@@ -78,6 +80,11 @@
             fail("expected: command not found: four");
         } catch (IllegalArgumentException e) {
         }
+        
+        // check CharSequence types are preserved
+        Object b = c.execute("b = new java.lang.StringBuilder");
+        assertTrue(b instanceof StringBuilder);
+        assertEquals(b, c.execute("c = $b"));
     }
 
     public CharSequence echo(Object args[])
@@ -96,5 +103,9 @@
         }
         return sb.toString();
     }
+    
+    public Object _new(String className) throws Exception {
+        return Class.forName(className).newInstance();
+    }
 
 }