Sfoglia il codice sorgente

new: ResolverScanner

Ranides Atterwim 11 anni fa
parent
commit
c0d45979ea

+ 0 - 2
src/main/java/net/ranides/assira/text/ResolveFormatter.java

@@ -7,8 +7,6 @@
 package net.ranides.assira.text;
 
 import java.io.IOException;
-import java.io.InvalidObjectException;
-import java.io.ObjectInputStream;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;

+ 74 - 0
src/main/java/net/ranides/assira/text/ResolveScanner.java

@@ -0,0 +1,74 @@
+/*
+ * @author Ranides Atterwim <ranides@gmail.com>
+ * @copyright Ranides Atterwim
+ * @license WTFPL
+ * @url http://ranides.net/projects/assira
+ */
+package net.ranides.assira.text;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import net.ranides.assira.generic.Function;
+import net.ranides.assira.reflection.Resolver;
+
+/**
+ *
+ * @author Ranides Atterwim <ranides@gmail.com>
+ */
+public class ResolveScanner implements Serializable {
+    
+    private static final long serialVersionUID = 1L;
+
+    public static final Pattern RE_COMPILE = Pattern.compile("\\{(.+?)\\}");
+    
+    private final String pattern;
+    
+    private final Pattern re;
+    
+    private final Resolver[] resolvers;
+    
+    // @todo (assira # 1) implement serialization
+    
+    private ResolveScanner(String pattern) {
+        
+        final List<Resolver> list = new ArrayList<>();
+        String cpattern = StringUtils.replace(pattern, RE_COMPILE, new Function<String, Matcher>() {
+            @Override
+            public String apply(Matcher source) {
+                list.add( Resolver.compile(source.group(1)) );
+                return "(.+)";
+            }
+        });
+        this.pattern = pattern;
+        this.re = Pattern.compile(cpattern);
+        this.resolvers = list.toArray(new Resolver[list.size()]);
+
+    }
+    
+    public static ResolveScanner compile(String pattern) {
+        return new ResolveScanner(pattern);
+    }
+    
+    public static boolean scan(CharSequence input, String pattern, Object context) {
+        return new ResolveScanner(pattern).scan(input, context);
+    }
+    
+    public boolean scan(CharSequence input, Object context) {
+        Matcher hit = re.matcher(input);
+        if(!hit.matches()) {
+            return false;
+        }
+        for(int i=0; i<resolvers.length; i++) {
+            resolvers[i].reference(context).put(hit.group(i+1));
+        }
+        return true;
+    }
+    
+    public String pattern() {
+        return pattern;
+    }
+
+}

+ 0 - 1
src/test/java/net/ranides/assira/collection/map/SwitchMapBenchmark.java

@@ -19,7 +19,6 @@ import net.ranides.assira.collection.Grid;
 import net.ranides.assira.math.Randomizer;
 
 /**
- * @todo (assira # 3) caliper automatic conversion to CSV
  * Comparison of performance #get methods
  * 
  * RESULTS:

+ 83 - 0
src/test/java/net/ranides/assira/text/ResolveScannerTest.java

@@ -0,0 +1,83 @@
+/*
+ * @author Ranides Atterwim <ranides@gmail.com>
+ * @copyright Ranides Atterwim
+ * @license WTFPL
+ * @url http://ranides.net/projects/assira
+ */
+package net.ranides.assira.text;
+
+import net.ranides.assira.math.HashHelper;
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+/**
+ *
+ * @author Ranides Atterwim <ranides@gmail.com>
+ */
+public class ResolveScannerTest {
+    
+    public ResolveScannerTest() {
+    }
+
+    @Test
+    public void testCompile() {
+        // that's only "smoke test"
+        // we will test if compilation is correct in other tests
+        ResolveScanner scanner1 = ResolveScanner.compile("{x} {y} {z}");
+        assertEquals("{x} {y} {z}", scanner1.pattern());
+    }
+    
+    @Test
+    public void testScan() {
+        A target = new A();
+        
+        assertTrue( ResolveScanner.scan("12/37 45", "{x}/{y} {z}", target) );
+        assertEquals(new A(12, 37, 45), target);
+        
+        assertTrue( ResolveScanner.scan("23 45 56", "{x} {y} {z}", target) );
+        assertEquals(new A(23, 45, 56), target);
+        
+        assertTrue( ResolveScanner.scan("32-54-65", "{x}-{y}-{z}", target) );
+        assertEquals(new A(32, 54, 65), target);
+    }
+    
+    private static class A {
+        
+        public int x;
+        public int y;
+        public int z;
+        
+        public A() {
+            this(0,0,0);
+        }
+
+        public A(int x, int y, int z) {
+            this.x = x;
+            this.y = y;
+            this.z = z;
+        }
+
+        @Override
+        public int hashCode() {
+            return HashHelper.hashValues(5, 37, x, y, z);
+        }
+
+        @Override
+        public boolean equals(Object object) {
+            if(!(object instanceof A)) {
+                return false;
+            }
+            final A other = (A) object;
+            return 
+                (this.x == other.x) &&
+                (this.y == other.y) &&
+                (this.z == other.z);
+        }
+
+        @Override
+        public String toString() {
+            return "A{" + "x=" + x + ", y=" + y + ", z=" + z + '}';
+        }
+        
+    }
+}