You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by gn...@apache.org on 2018/05/17 12:11:27 UTC

svn commit: r1831770 - in /felix/trunk/gogo/runtime/src: main/java/org/apache/felix/gogo/runtime/Expander.java test/java/org/apache/felix/gogo/runtime/ExpanderTest.java

Author: gnodet
Date: Thu May 17 12:11:27 2018
New Revision: 1831770

URL: http://svn.apache.org/viewvc?rev=1831770&view=rev
Log:
[FELIX-5855] Support array subscript in expander

Modified:
    felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/Expander.java
    felix/trunk/gogo/runtime/src/test/java/org/apache/felix/gogo/runtime/ExpanderTest.java

Modified: felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/Expander.java
URL: http://svn.apache.org/viewvc/felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/Expander.java?rev=1831770&r1=1831769&r2=1831770&view=diff
==============================================================================
--- felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/Expander.java (original)
+++ felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/Expander.java Thu May 17 12:11:27 2018
@@ -19,12 +19,14 @@
 package org.apache.felix.gogo.runtime;
 
 import java.io.IOException;
+import java.lang.reflect.Array;
 import java.nio.file.FileVisitOption;
 import java.nio.file.FileVisitResult;
 import java.nio.file.FileVisitor;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.attribute.BasicFileAttributes;
+import java.util.AbstractList;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -1480,6 +1482,33 @@ public class Expander extends BaseTokeni
                             val = list.get(nLeft ? list.size() - 1 - iLeft : iLeft);
                         }
                     }
+                    else if (val != null && val.getClass().isArray())
+                    {
+                        if (sLeft.equals("@") || sLeft.equals("*"))
+                        {
+                            Object array = val;
+                            List<Object> l = new AbstractList<Object>()
+                            {
+                                @Override
+                                public Object get(int index)
+                                {
+                                    return Array.get(array, index);
+                                }
+                                @Override
+                                public int size()
+                                {
+                                    return Array.getLength(array);
+                                }
+                            };
+                            val = new ArgList(l);
+                        }
+                        else
+                        {
+                            int iLeft = Integer.parseInt(sLeft);
+                            Object array = val;
+                            val = Array.get(array, iLeft);
+                        }
+                    }
                     else if (val != null)
                     {
                         if (sLeft.equals("@") || sLeft.equals("*"))

Modified: felix/trunk/gogo/runtime/src/test/java/org/apache/felix/gogo/runtime/ExpanderTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/gogo/runtime/src/test/java/org/apache/felix/gogo/runtime/ExpanderTest.java?rev=1831770&r1=1831769&r2=1831770&view=diff
==============================================================================
--- felix/trunk/gogo/runtime/src/test/java/org/apache/felix/gogo/runtime/ExpanderTest.java (original)
+++ felix/trunk/gogo/runtime/src/test/java/org/apache/felix/gogo/runtime/ExpanderTest.java Thu May 17 12:11:27 2018
@@ -33,6 +33,44 @@ import static org.junit.Assert.assertNot
 public class ExpanderTest {
 
     @Test
+    public void testSubscriptOnArrays() throws  Exception {
+        Evaluate evaluate = new Evaluate() {
+            @Override
+            public Object eval(Token t) {
+                return null;
+            }
+            @Override
+            public Object get(String key) {
+                switch (key) {
+                    case "a":
+                        return new Object[] { 1, 3 };
+                    case "b":
+                        return new int[] { 1, 3 };
+                    case "c":
+                        return Arrays.asList(1, 3);
+                }
+                return null;
+            }
+            @Override
+            public Object put(String key, Object value) {
+                return null;
+            }
+            @Override
+            public Object expr(Token t) {
+                return null;
+            }
+            @Override
+            public Path currentDir() {
+                return null;
+            }
+        };
+
+        assertEquals(3, Expander.expand("${a[1]}", evaluate));
+        assertEquals(3, Expander.expand("${b[1]}", evaluate));
+        assertEquals(3, Expander.expand("${c[1]}", evaluate));
+    }
+
+    @Test
     public void testOctalAndHex() throws Exception {
         Evaluate evaluate = new Evaluate() {
             @Override