Support for java array expansion
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1736041 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/Expander.java b/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/Expander.java
index b5c1ec5..34bbcbb 100644
--- a/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/Expander.java
+++ b/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/Expander.java
@@ -1030,13 +1030,17 @@
// Map to List conversion
boolean _flagk = flagk;
boolean _flagv = flagv;
- Function<Object, Object> mapToList = v -> v instanceof Map ? toList(asMap(v), _flagk, _flagv) : v;
+ Function<Object, Object> toCollection = v -> v instanceof Map
+ ? toList(asMap(v), _flagk, _flagv)
+ : v != null && v.getClass().isArray()
+ ? Arrays.asList((Object[]) v)
+ : v;
//
// String transformations
//
BiFunction<Function<String, String>, Object, Object> stringApplyer = (func, v) -> {
- v = mapToList.apply(v);
+ v = toCollection.apply(v);
if (v instanceof Collection) {
return asCollection(v).stream()
.map(String::valueOf)
@@ -1139,7 +1143,7 @@
r = "";
}
String m = op.charAt(0) == '#' ? "^" + p : op.charAt(0) == '%' ? p + "$" : p;
- val1 = mapToList.apply(val1);
+ val1 = toCollection.apply(val1);
if (val1 instanceof Collection) {
List<String> l = new ArrayList<>();
for (Object o : ((Collection) val1)) {
@@ -1287,7 +1291,7 @@
// Double quote joining
boolean joined = false;
if (inQuote && !computeLength && !flagExpand) {
- val = mapToList.apply(val);
+ val = toCollection.apply(val);
if (val instanceof Collection) {
String j = flagj != null ? flagj : " ";
val = asCollection(val).stream()
@@ -1320,7 +1324,7 @@
// Forced joining
if (flagj != null || flags != null && !joined) {
- val = mapToList.apply(val);
+ val = toCollection.apply(val);
if (val instanceof Collection) {
String j = flagj != null ? flagj : " ";
val = asCollection(val).stream()
@@ -1332,7 +1336,7 @@
// Simple word splitting
if (flags != null) {
String _flags = flags;
- val = mapToList.apply(val);
+ val = toCollection.apply(val);
if (!(val instanceof Collection)) {
val = Collections.singletonList(val);
}
@@ -1370,7 +1374,7 @@
// Uniqueness
if (flagu) {
- val = mapToList.apply(val);
+ val = toCollection.apply(val);
if (val instanceof Collection) {
val = new ArrayList<>(new HashSet<>(asCollection(val)));
}
@@ -1378,7 +1382,7 @@
// Ordering
if (flaga || flagi || flagn || flago || flagO) {
- val = mapToList.apply(val);
+ val = toCollection.apply(val);
if (val instanceof Collection) {
List<Object> list;
if (flagn) {
@@ -1405,7 +1409,7 @@
// Semantic joining
if (semanticJoin) {
- val = mapToList.apply(val);
+ val = toCollection.apply(val);
if (val instanceof Collection) {
val = asCollection(val).stream()
.map(String::valueOf)
@@ -1421,7 +1425,7 @@
}
if (asPattern && !inQuote && !flagPattern) {
- val = mapToList.apply(val);
+ val = toCollection.apply(val);
Stream<Object> stream = val instanceof Collection ? asCollection(val).stream() : Stream.of(val);
List<String> patterns = stream.map(String::valueOf)
.map(s -> quote(s, 2))
@@ -1430,7 +1434,7 @@
}
if (inQuote) {
- val = mapToList.apply(val);
+ val = toCollection.apply(val);
if (val instanceof Collection) {
List<Object> l = new ArrayList<>(asCollection(val));
if (flagExpand) {
diff --git a/gogo/runtime/src/test/java/org/apache/felix/gogo/runtime/TestTokenizer.java b/gogo/runtime/src/test/java/org/apache/felix/gogo/runtime/TestTokenizer.java
index 2e2d3a9..a674b60 100644
--- a/gogo/runtime/src/test/java/org/apache/felix/gogo/runtime/TestTokenizer.java
+++ b/gogo/runtime/src/test/java/org/apache/felix/gogo/runtime/TestTokenizer.java
@@ -183,6 +183,14 @@
}
@Test
+ public void testJavaArray() throws Exception
+ {
+ vars.put("a", new Object[] { "b", "c"});
+
+ assertEquals(Arrays.asList("B", "C"), expand("${(U)a}"));
+ }
+
+ @Test
public void testRawVariable() throws Exception
{
vars.put("a1", Arrays.asList("a", 1));