From 5589558f89307eb8d62ad555559bb817279ccb52 Mon Sep 17 00:00:00 2001
From: Sven Robertz <sven@cs.lth.se>
Date: Tue, 9 Jul 2013 13:08:30 +0200
Subject: [PATCH] a bit more elaborate example, now doing encode/decode

---
 examples/dynamic/README                   |   3 +-
 examples/dynamic/TestLabCommCompiler.java | 187 +++++++++++++++++-----
 examples/dynamic/runme.sh                 |   2 +-
 examples/dynamic/simple.lc                |  15 +-
 4 files changed, 158 insertions(+), 49 deletions(-)

diff --git a/examples/dynamic/README b/examples/dynamic/README
index 810e1ff..4b8c397 100644
--- a/examples/dynamic/README
+++ b/examples/dynamic/README
@@ -5,4 +5,5 @@ NB! There is currently no connection between the files StaticPart.java, DynamicP
 TestLabCommCompiler.java
 
 the runme.sh script builds and runs the TestLabCommCompiler, which illustrates the 
-on-the-fly compilation to RAM, but is not yet connected to an actual LabComm channel
+on-the-fly compilation to RAM, reading the labcomm declarations from file but with the
+handlers hard coded in the test program.
diff --git a/examples/dynamic/TestLabCommCompiler.java b/examples/dynamic/TestLabCommCompiler.java
index c50037b..1092420 100644
--- a/examples/dynamic/TestLabCommCompiler.java
+++ b/examples/dynamic/TestLabCommCompiler.java
@@ -1,15 +1,23 @@
 import java.io.ByteArrayInputStream;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.FileReader;
 import java.io.IOException;
 import java.io.InputStream;
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
+import java.nio.CharBuffer;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.Map;
 
+import se.lth.control.labcomm.LabCommDecoder;
+import se.lth.control.labcomm.LabCommDecoderChannel;
+import se.lth.control.labcomm.LabCommEncoder;
+import se.lth.control.labcomm.LabCommEncoderChannel;
 import AST.LabCommParser;
 import AST.LabCommScanner;
 import AST.Program;
@@ -19,59 +27,136 @@ import beaver.Parser.Exception;
 
 public class TestLabCommCompiler {
 
+	private static final String BAR = "bar";
+	private static final String FOO = "foo";
+
 	/**
 	 * @param args
 	 */
 	public static void main(String[] args) {
 
 		/* input data: */
-		String prg ="sample struct { int x; int y; int z;}foo; sample int bar;";
-
+		FileReader fr;
+		int len=0;;
+		CharBuffer buf = CharBuffer.allocate(1024);
+		try {
+			fr = new FileReader(args[0]);
+			len = fr.read(buf);
+			buf.rewind();
+		} catch (Throwable e) {
+			e.printStackTrace();
+			System.exit(1);
+		}
+		
+		String labcommStr = buf.toString().substring(0, len-1);
+		
 		HashMap <String, String> handlers = new HashMap<String, String>();
-		handlers.put("foo", "public void handle_foo(foo value) {\nSystem.out.println(value.x);\nSystem.out.println(value.y);\nSystem.out.println(value.z);}");
-		handlers.put("bar", "public void handle_bar(int value) {System.out.println(value);}");
 
-		generateCode(prg, handlers);
+		handlers.put(FOO, "public void handle_"+FOO+"("+FOO+" value) {\nSystem.out.println(value.x);\nSystem.out.println(value.y);\nSystem.out.println(value.z);}");
+		handlers.put(BAR, "public void handle_"+BAR+"(int value) {System.out.println(value);}");
+
+		InRAMCompiler irc = generateCode(labcommStr, handlers);
+
+		if(irc != null) {
+			System.out.println("*** Testing instantiation and invocation of Handler ");
+			dummyTest(irc);
+			
+//			String tmpFile = "/tmp/lcctest";
+			String tmpFile = args[1];
+			System.out.println("*** Testing writing and reading file "+tmpFile);
+			encodeTest(irc, tmpFile);
+			decodeTest(irc, tmpFile);
+		}
+	}
+	private static void decodeTest(InRAMCompiler irc, String tmpFile) {
+		try {
+			FileInputStream in = new FileInputStream(tmpFile);
+			LabCommDecoderChannel dec = new LabCommDecoderChannel(in);
 	
+			Class fc = irc.load(FOO);
+			Class hc = irc.load("gen_"+FOO+"Handler");
+			Class hi = irc.load(FOO+"$Handler");
+
+			Object h = hc.newInstance(); 
+		
+			Method reg = fc.getDeclaredMethod("register", LabCommDecoder.class, hi);
+			reg.invoke(fc, dec, h);
+			
+			dec.runOne();
+			in.close();
+		} catch (Throwable e) {
+			e.printStackTrace();
+		}
+		
+	}
+	private static void encodeTest(InRAMCompiler irc, String tmpFile) {
+		Class<?> hc;
+		try {
+			hc = irc.load("gen_"+FOO+"Handler");
+			Object h = hc.newInstance(); 
+			Class fc = irc.load(FOO);
+			Object f = fc.newInstance();
+			Field x = fc.getDeclaredField("x");
+			Field y = fc.getDeclaredField("y");
+			Field z = fc.getDeclaredField("z");
+			x.setInt(f, 10);
+			y.setInt(f, 11);
+			z.setInt(f, 12);
+			
+			FileOutputStream out = new FileOutputStream(tmpFile);
+			LabCommEncoderChannel enc = new LabCommEncoderChannel(out);
+			Method reg = fc.getDeclaredMethod("register", LabCommEncoder.class);
+			reg.invoke(fc, enc);
+			
+			Method doEncode = fc.getDeclaredMethod("encode", LabCommEncoder.class, fc);
+			doEncode.invoke(fc, enc, f);
+			
+			out.close();
+		} catch (Throwable e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+
 	}
-	public static void generateCode(String prg, HashMap<String, String> handlers) {
+	public static InRAMCompiler generateCode(String lcDecl, HashMap<String, String> handlers) {
 		Program ast = null;
-		InputStream in = new ByteArrayInputStream(prg.getBytes());
+		InputStream in = new ByteArrayInputStream(lcDecl.getBytes());
 		LabCommScanner scanner = new LabCommScanner(in);
 		LabCommParser parser = new LabCommParser();
 		Collection errors = new LinkedList();
-	
+
+		InRAMCompiler irc = null;
 		try {
 			Program p = (Program)parser.parse(scanner);
 			p.errorCheck(errors);
-	        if (errors.isEmpty()) {
-	            ast = p;
-	          } else {
-	        	System.out.println("*** Errors:");
-	            for (Iterator iter = errors.iterator(); iter.hasNext(); ) {
-	              String s = (String)iter.next();
-	              System.out.println(s);
-	            }
-	          }
+			if (errors.isEmpty()) {
+				ast = p;
+			} else {
+				System.out.println("*** Errors:");
+				for (Iterator iter = errors.iterator(); iter.hasNext(); ) {
+					String s = (String)iter.next();
+					System.out.println(s);
+				}
+			}
 		} catch (IOException e) {
 			e.printStackTrace();
 		} catch (Exception e) {
 			e.printStackTrace();
 		}
-		
+
 		if (ast != null) {
-			InRAMCompiler irc = handleAst(ast, handlers);
-			dummyTest(irc);
+			irc = handleAst(ast, handlers);
 		} else {
 			System.err.println("compilation failed");
 		}
+		return irc;
 	}
 	/* dummy test creating instances of sample and handler, and calling handle*/
 	private static void dummyTest(InRAMCompiler irc) {
 		try {
-			Class hc = irc.load("gen_fooHandler");
+			Class hc = irc.load("gen_"+FOO+"Handler");
 			Object h = hc.newInstance(); 
-			Class fc = irc.load("foo");
+			Class fc = irc.load(FOO);
 			Object f = fc.newInstance();
 			Field x = fc.getDeclaredField("x");
 			Field y = fc.getDeclaredField("y");
@@ -81,21 +166,49 @@ public class TestLabCommCompiler {
 			z.setInt(f, 12);
 			Method m;
 			try {
-				m = hc.getDeclaredMethod("handle_foo", fc);
+				m = hc.getDeclaredMethod("handle_"+FOO, fc);
 				m.invoke(h, f);
-			} catch (Throwable e) {
+			} catch (SecurityException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			} catch (NoSuchMethodException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			} catch (IllegalArgumentException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			} catch (InvocationTargetException e) {
+				// TODO Auto-generated catch block
 				e.printStackTrace();
 			}
-			
-		} catch (Throwable e) {
+
+		} catch (ClassNotFoundException e) {
+			e.printStackTrace();
+		} catch (InstantiationException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (IllegalAccessException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (SecurityException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (NoSuchFieldException e) {
+			// TODO Auto-generated catch block
 			e.printStackTrace();
 		}
 	}
 
-	private static InRAMCompiler handleAst(Program ast, HashMap<String, String> handlers) {
-		Map<String, String> foo = new HashMap<String, String>();
+	/** generate labcomm code and compile handlers 
+	 *
+	 * @param lcAST - the AST of the labcomm declaration
+	 * @param handlers - a map <name, source> of handlers for the types in ast
+	 * @return an InRAMCompiler object containing the generated clases
+	 */
+	private static InRAMCompiler handleAst(Program lcAST, HashMap<String, String> handlers) {
+		Map<String, String> genCode = new HashMap<String, String>();
 		try {
-			ast.J_gen(foo, "labcomm.generated");
+			lcAST.J_gen(genCode, "labcomm.generated");
 		} catch (IOException e) {
 			e.printStackTrace();
 		}
@@ -103,21 +216,21 @@ public class TestLabCommCompiler {
 
 		InRAMCompiler irc = new InRAMCompilerJavax("labcomm.generated", null);
 
-		Iterator<String> i = foo.keySet().iterator();
+		Iterator<String> i = genCode.keySet().iterator();
 		while(i.hasNext()){
-			final String name = i.next();
-			final String src = foo.get(name);
-			System.out.println("***"+name+"\n"+src);
+			final String sampleName = i.next();
+			final String src = genCode.get(sampleName);
+			System.out.println("***"+sampleName+"\n"+src);
 			StringBuilder sb = new StringBuilder();
 			sb.append("package labcomm.generated;\n");
-			sb.append("public class gen_"+name+"Handler implements "+name+".Handler {\n");
-			sb.append(handlers.get(name));
+			sb.append("public class gen_"+sampleName+"Handler implements "+sampleName+".Handler {\n");
+			sb.append(handlers.get(sampleName));
 			sb.append("}\n");
 			System.out.println("-------------------------------------");
 			System.out.println(sb.toString());
 			try {
-				irc.compile(name, src);
-				irc.compile("gen_"+name+"Handler", sb.toString());
+				irc.compile(sampleName, src);
+				irc.compile("gen_"+sampleName+"Handler", sb.toString());
 			} catch (IllegalArgumentException e) {
 				e.printStackTrace();
 			} catch (SecurityException e) {
diff --git a/examples/dynamic/runme.sh b/examples/dynamic/runme.sh
index fed042d..3ad8f8d 100644
--- a/examples/dynamic/runme.sh
+++ b/examples/dynamic/runme.sh
@@ -2,4 +2,4 @@
 
 javac -cp .:../../compiler/labComm.jar:../../lib/java/labcomm.jar:../../lib/tools/beaver.jar:../../lib/tools/beaver-rt.jar:../../lib/tools/jastadd2.jar:../../lib/tools/JFlex.jar:../../lib/tools/proj.jar  TestLabCommCompiler.java
 
-java -cp .:../../compiler/labComm.jar:../../lib/java/labcomm.jar:../../lib/tools/beaver.jar:../../lib/tools/beaver-rt.jar:../../lib/tools/jastadd2.jar:../../lib/tools/JFlex.jar:../../lib/tools/proj.jar  TestLabCommCompiler
+java -cp .:../../compiler/labComm.jar:../../lib/java/labcomm.jar:../../lib/tools/beaver.jar:../../lib/tools/beaver-rt.jar:../../lib/tools/jastadd2.jar:../../lib/tools/JFlex.jar:../../lib/tools/proj.jar  TestLabCommCompiler simple.lc encoded_data
diff --git a/examples/dynamic/simple.lc b/examples/dynamic/simple.lc
index 6443d6c..915cb44 100644
--- a/examples/dynamic/simple.lc
+++ b/examples/dynamic/simple.lc
@@ -1,13 +1,8 @@
-typedef struct {
-  int a;
-  int b;
-} TwoInts;
-
-sample TwoInts theTwoInts;
-sample TwoInts anotherTwoInts;
-
 sample struct {
   int x;
-  string s;
-} IntString;
+  int y;
+  int z;
+} foo;
+
+sample int bar;
 
-- 
GitLab