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();
+ }
}