From 454846ea65aaa8474b3a70a31dc9019e9abde5ba Mon Sep 17 00:00:00 2001 From: Sven Robertz <sven@cs.lth.se> Date: Tue, 23 Jul 2013 13:41:11 +0200 Subject: [PATCH] WIP: put classes in a package --- examples/dynamic/DynamicPart.java | 3 - examples/dynamic/runme.sh | 4 +- examples/dynamic/test/DynamicPart.java | 373 ++++++++++++++++++ .../dynamic/{ => test}/InRAMCompiler.java | 4 +- .../{ => test}/InRAMCompilerJavax.java | 2 +- examples/dynamic/{ => test}/StaticPart.java | 1 + .../dynamic/{ => test}/TestHandlerGen.java | 2 + .../{ => test}/TestLabCommCompiler.java | 2 + .../dynamic/{ => test}/TestLabcommGen.java | 2 + 9 files changed, 385 insertions(+), 8 deletions(-) delete mode 100644 examples/dynamic/DynamicPart.java create mode 100644 examples/dynamic/test/DynamicPart.java rename examples/dynamic/{ => test}/InRAMCompiler.java (98%) rename examples/dynamic/{ => test}/InRAMCompilerJavax.java (99%) rename examples/dynamic/{ => test}/StaticPart.java (99%) rename examples/dynamic/{ => test}/TestHandlerGen.java (99%) rename examples/dynamic/{ => test}/TestLabCommCompiler.java (99%) rename examples/dynamic/{ => test}/TestLabcommGen.java (99%) diff --git a/examples/dynamic/DynamicPart.java b/examples/dynamic/DynamicPart.java deleted file mode 100644 index e8fbba0..0000000 --- a/examples/dynamic/DynamicPart.java +++ /dev/null @@ -1,3 +0,0 @@ -public class DynamicPart { - -}; diff --git a/examples/dynamic/runme.sh b/examples/dynamic/runme.sh index b83a2d2..acf9924 100644 --- a/examples/dynamic/runme.sh +++ b/examples/dynamic/runme.sh @@ -1,5 +1,5 @@ #dummy script to test the on-the-fly compilation -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 TestLabcommGen.java +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 test/TestLabcommGen.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 TestLabcommGen simple.lc handlers.txt encoded_data +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 test.TestLabcommGen simple.lc handlers.txt encoded_data diff --git a/examples/dynamic/test/DynamicPart.java b/examples/dynamic/test/DynamicPart.java new file mode 100644 index 0000000..08fdd47 --- /dev/null +++ b/examples/dynamic/test/DynamicPart.java @@ -0,0 +1,373 @@ +package test; +import java.io.ByteArrayInputStream; +import java.io.EOFException; +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; +import beaver.Parser.Exception; + + + +/** Simple test class that illustrates on-the-fly generation, compilation, and loading + * of labcomm handlers. + * + * It reads, modifies and writes the "foo" and "bar" sample types + */ +public class DynamicPart { + + private static final String SAMPLE_NAME_FOO = "foo"; + private static final String SAMPLE_NAME_BAR = "bar"; + + /** A class representing the source code for one Labcomm handler */ + static class HandlerSrc { + private String sampleName; + private String param; + private String body; + + private final String proto = "public void handle_"; + + public HandlerSrc(String sampleName, String param, String body) { + this.sampleName = sampleName; + this.param = param; + this.body = body; + } + + public String getSrc() { + String res = proto+sampleName+"("+param+")"+body; + return res; + } + } + + public void doTest(InRAMCompiler irc, String inFile, String outFile) { + System.out.println("*** DynamicPart reading from "+inFile); + decodeTest(irc, tmpFile, SAMPLE_NAME_FOO, SAMPLE_NAME_BAR); + System.out.println("*** DynamicPart writing to "+outFile); + encodeTest(irc, tmpFile); + } + + /** + * @param args (types.lc, handlers.txt, inputfile, outputfile) + */ + public static void main(String[] args) { + + /* input data: */ + String labcommStr = readLabcommDecl(args[0]); + String srcStr = readHandlerDecl(args[1]); + + /*Map<sample name, handler code>*/ + HashMap <String, String> handlers = new HashMap<String, String>(); + + generateHandlers(srcStr, handlers); + + System.out.println("*** Generated handler source:"); + handlers.keySet(); + + for (String n : handlers.keySet()) { + System.out.println(n+":"); + System.out.println(handlers.get(n)); + } + + + InRAMCompiler irc = generateCode(labcommStr, handlers); + + if(irc != null) { + String inFile = args[2]; + String outFile = args[3]; + new DynamicPart().doTest(irc, inFile, outFile); + } + } + + public static void generateHandlers(String srcStr, HashMap<String,String> handlers) { + int pos = 0; + while(pos < srcStr.length()) { + // System.out.println("--------"); + int nameEnd = srcStr.indexOf(':', pos); + if(nameEnd <0) break; + + String name = srcStr.substring(pos,nameEnd); + // System.out.println("Name="+name); + + pos=nameEnd+1; + String par = ""; + final String handler_decl = "handler("; + if(srcStr.startsWith(handler_decl, pos)) { + int endPar = srcStr.indexOf(')', pos); + par = srcStr.substring(pos+handler_decl.length(), endPar); + // System.out.println("param="+par); + pos = endPar+1; + } else { + System.out.println("expeced handler decl:\n"+srcStr.substring(pos)); + } + int bodyEnd = srcStr.indexOf("}###", pos); // HERE BE DRAGONS! a bit brittle + String body = srcStr.substring(pos, bodyEnd+1); + pos = bodyEnd+5; + // System.out.println("body:"); + // System.out.println(body); + + // System.out.println("**** generates:"); + + HandlerSrc s = new HandlerSrc(name, par, body); + final String genSrc = s.getSrc(); + // System.out.println(genSrc); + handlers.put(name,genSrc); + } + } + + + public static String readHandlerDecl(String decl) { + FileReader fr; + int len=0;; + CharBuffer buf = CharBuffer.allocate(1024); + try { + fr = new FileReader(decl); + len = fr.read(buf); + buf.rewind(); + } catch (Throwable e) { + e.printStackTrace(); + System.exit(1); + } + + String srcStr = buf.toString().substring(0, len); + return srcStr; + } + + private static String readLabcommDecl(String lcfile) { + FileReader fr; + int len=0;; + CharBuffer buf = CharBuffer.allocate(1024); + try { + fr = new FileReader(lcfile); + len = fr.read(buf); + // buf.append((char) 0x04); + buf.rewind(); + } catch (Throwable e) { + e.printStackTrace(); + System.exit(1); + } + + String labcommStr = buf.toString().substring(0, len-1); + return labcommStr; + } + + public static InRAMCompiler generateCode(String lcDecl, HashMap<String, String> handlers) { + Program ast = null; + 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); + } + } + } catch (IOException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + + if (ast != null) { + irc = handleAst(ast, handlers); + } else { + System.err.println("compilation failed"); + } + return irc; + } + + /** 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 { + lcAST.J_gen(genCode, "labcomm.generated"); + } catch (IOException e) { + e.printStackTrace(); + } + System.out.println("Generated labcomm code:"); + + InRAMCompiler irc = new InRAMCompilerJavax("labcomm.generated", null); + + Iterator<String> i = genCode.keySet().iterator(); + while(i.hasNext()){ + 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_"+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(sampleName, src); + irc.compile("gen_"+sampleName+"Handler", sb.toString()); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (SecurityException e) { + e.printStackTrace(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } + System.out.println("================================"); + } + return irc; + } + /** test method + */ + private void decodeTest(InRAMCompiler irc, String tmpFile, String... sampleNames) { + try { + FileInputStream in = new FileInputStream(tmpFile); + LabCommDecoderChannel dec = new LabCommDecoderChannel(in); + for (String sampleName : sampleNames) { + System.out.println("registering handler for "+sampleName); + Class sampleClass = irc.load(sampleName); + Class handlerClass = irc.load("gen_"+sampleName+"Handler"); + Class handlerInterface = irc.load(sampleName+"$Handler"); + + Object handler = handlerClass.newInstance(); + + Method reg = sampleClass.getDeclaredMethod("register", LabCommDecoder.class, handlerInterface); + reg.invoke(sampleClass, dec, handler); + } + + try{ + System.out.println("*** decoding:"); + dec.run(); + } catch(EOFException e) { + System.out.println("*** reached EOF ***"); + } + in.close(); + } catch (Throwable e) { + e.printStackTrace(); + } + + } + /** test encoding + */ + private void encodeTest(InRAMCompiler irc, String tmpFile) { + try { + Class fc = irc.load(SAMPLE_NAME_FOO); + Class bc = irc.load(SAMPLE_NAME_BAR); + + /* create sample class and instance objects */ + 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); + + /* register and send foo */ + Method regFoo = fc.getDeclaredMethod("register", LabCommEncoder.class); + regFoo.invoke(fc, enc); + + Method doEncodeFoo = fc.getDeclaredMethod("encode", LabCommEncoder.class, fc); + doEncodeFoo.invoke(fc, enc, f); + + /* register and send bar (NB! uses primitive type int) */ + Method regBar = bc.getDeclaredMethod("register", LabCommEncoder.class); + regBar.invoke(bc, enc); + + Method doEncodeBar = bc.getDeclaredMethod("encode", LabCommEncoder.class, Integer.TYPE); + doEncodeBar.invoke(bc, enc, 42); + + out.close(); + } catch (Throwable e) { + e.printStackTrace(); + } + + } + + /** dummy test creating instances of sample and handler, and calling handle*/ + private static void dummyTest(InRAMCompiler irc) { + try { + Class hc = irc.load("gen_"+SAMPLE_NAME_FOO+"Handler"); + Object h = hc.newInstance(); + Class fc = irc.load(SAMPLE_NAME_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); + Method m; + try { + m = hc.getDeclaredMethod("handle_"+SAMPLE_NAME_FOO, fc); + m.invoke(h, f); + } 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 (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(); + } + } +} diff --git a/examples/dynamic/InRAMCompiler.java b/examples/dynamic/test/InRAMCompiler.java similarity index 98% rename from examples/dynamic/InRAMCompiler.java rename to examples/dynamic/test/InRAMCompiler.java index 7e19afa..26a2346 100644 --- a/examples/dynamic/InRAMCompiler.java +++ b/examples/dynamic/test/InRAMCompiler.java @@ -1,4 +1,4 @@ - +package test; import java.lang.reflect.InvocationTargetException; @@ -24,4 +24,4 @@ public interface InRAMCompiler { */ public Class<?> load(String className) throws ClassNotFoundException; -} \ No newline at end of file +} diff --git a/examples/dynamic/InRAMCompilerJavax.java b/examples/dynamic/test/InRAMCompilerJavax.java similarity index 99% rename from examples/dynamic/InRAMCompilerJavax.java rename to examples/dynamic/test/InRAMCompilerJavax.java index 4a747ba..e81d2a7 100644 --- a/examples/dynamic/InRAMCompilerJavax.java +++ b/examples/dynamic/test/InRAMCompilerJavax.java @@ -1,4 +1,4 @@ - +package test; import java.io.ByteArrayInputStream; diff --git a/examples/dynamic/StaticPart.java b/examples/dynamic/test/StaticPart.java similarity index 99% rename from examples/dynamic/StaticPart.java rename to examples/dynamic/test/StaticPart.java index 9ce424c..3ffb362 100644 --- a/examples/dynamic/StaticPart.java +++ b/examples/dynamic/test/StaticPart.java @@ -1,3 +1,4 @@ +package test; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; diff --git a/examples/dynamic/TestHandlerGen.java b/examples/dynamic/test/TestHandlerGen.java similarity index 99% rename from examples/dynamic/TestHandlerGen.java rename to examples/dynamic/test/TestHandlerGen.java index e610276..cf29cb4 100644 --- a/examples/dynamic/TestHandlerGen.java +++ b/examples/dynamic/test/TestHandlerGen.java @@ -1,3 +1,5 @@ +package test; + import java.io.ByteArrayInputStream; import java.io.FileInputStream; import java.io.FileOutputStream; diff --git a/examples/dynamic/TestLabCommCompiler.java b/examples/dynamic/test/TestLabCommCompiler.java similarity index 99% rename from examples/dynamic/TestLabCommCompiler.java rename to examples/dynamic/test/TestLabCommCompiler.java index 1092420..6b75d8d 100644 --- a/examples/dynamic/TestLabCommCompiler.java +++ b/examples/dynamic/test/TestLabCommCompiler.java @@ -1,3 +1,5 @@ +package test; + import java.io.ByteArrayInputStream; import java.io.FileInputStream; import java.io.FileOutputStream; diff --git a/examples/dynamic/TestLabcommGen.java b/examples/dynamic/test/TestLabcommGen.java similarity index 99% rename from examples/dynamic/TestLabcommGen.java rename to examples/dynamic/test/TestLabcommGen.java index d9df125..839124e 100644 --- a/examples/dynamic/TestLabcommGen.java +++ b/examples/dynamic/test/TestLabcommGen.java @@ -1,3 +1,5 @@ +package test; + import java.io.ByteArrayInputStream; import java.io.EOFException; import java.io.FileInputStream; -- GitLab