You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ode.apache.org by ha...@apache.org on 2012/12/14 22:08:10 UTC

svn commit: r1422083 - /ode/trunk/jacob-generator/src/main/java/org/apache/ode/jacob/generator/ChannelTypeProcessor.java

Author: hadrian
Date: Fri Dec 14 21:08:09 2012
New Revision: 1422083

URL: http://svn.apache.org/viewvc?rev=1422083&view=rev
Log:
Temp commit (wip). Need to fix compiler issues with java6 first

Modified:
    ode/trunk/jacob-generator/src/main/java/org/apache/ode/jacob/generator/ChannelTypeProcessor.java

Modified: ode/trunk/jacob-generator/src/main/java/org/apache/ode/jacob/generator/ChannelTypeProcessor.java
URL: http://svn.apache.org/viewvc/ode/trunk/jacob-generator/src/main/java/org/apache/ode/jacob/generator/ChannelTypeProcessor.java?rev=1422083&r1=1422082&r2=1422083&view=diff
==============================================================================
--- ode/trunk/jacob-generator/src/main/java/org/apache/ode/jacob/generator/ChannelTypeProcessor.java (original)
+++ ode/trunk/jacob-generator/src/main/java/org/apache/ode/jacob/generator/ChannelTypeProcessor.java Fri Dec 14 21:08:09 2012
@@ -19,6 +19,7 @@ package org.apache.ode.jacob.generator;
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.io.Writer;
+import java.util.Date;
 import java.util.Set;
 
 import javax.annotation.processing.AbstractProcessor;
@@ -27,9 +28,9 @@ import javax.annotation.processing.Suppo
 import javax.annotation.processing.SupportedSourceVersion;
 import javax.lang.model.SourceVersion;
 import javax.lang.model.element.Element;
+import javax.lang.model.element.ElementKind;
 import javax.lang.model.element.TypeElement;
 import javax.tools.Diagnostic;
-import javax.tools.JavaFileObject;
 
 import org.apache.ode.jacob.annotation.ChannelType;
 
@@ -40,26 +41,113 @@ public class ChannelTypeProcessor extend
 
     public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
         for (Element elem : roundEnv.getElementsAnnotatedWith(ChannelType.class)) {
-            @SuppressWarnings("unused")
-            ChannelType channel = elem.getAnnotation(ChannelType.class);
-            String message = "annotation found in " + elem.getSimpleName();
-            PrintWriter pw = null;
-            try {
-                // TODO: resolve the output directory issue and plugin the code from the old generator
-                JavaFileObject source = processingEnv.getFiler().createSourceFile("org.apache.ode.jacob.generator.Foo", elem);
-                final Writer writer = source.openWriter();
-                pw = new PrintWriter(writer);
-                pw.append("package ").append("org.apache.ode.jacob.generator").println(';');
-            } catch (IOException e) {
-                processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, e.getMessage());
-            } finally {
-                if (pw != null) {
-                    pw.close();
-                }
+            if (elem.getKind() != ElementKind.INTERFACE) {
+                processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "The @" + ChannelType.class.getSimpleName()
+                    + " is only supported on interfaces; " + elem.asType().toString() + " is a " + elem.getKind().toString());
+                continue;
             }
-            processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, message);
+            if (generateSourceFile(elem, channelClass(elem)) && generateSourceFile(elem, channelListener(elem))) {
+                processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE,
+                    "Generation complete: @ChannelType implementation and listener for " + elem.asType().toString());
+            } else {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    protected boolean generateSourceFile(Element elem, SourceGenerator gen) {
+        try {
+            gen.generate(processingEnv.getFiler().createSourceFile(gen.getSourceFileName(), elem).openWriter());
+        } catch (IOException e) {
+            processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, e.getMessage());
+            return false;
         }
         return true;
     }
+    
+    private SourceGenerator channelClass(Element element) {
+        return new ChannelClassGenerator(element);
+    }
+
+    private SourceGenerator channelListener(Element element) {
+        return new ChannelListenerGenerator(element);
+    }
 
+    public abstract class SourceGenerator {
+        private final Date today = new Date();
+        private final String suffix;
+        private Element type;
+        
+        public SourceGenerator(Element type, String suffix) {
+            this.type = type;
+            this.suffix = suffix;
+        }
+
+        public Element getType() {
+            return type;
+        }
+
+        public void generate(Writer writer) {
+            final PrintWriter w = new PrintWriter(writer);
+            generateHeader(w);
+            generateContent(w);
+            w.close();
+        }
+
+        // TODO: is it really worth splitting this into a interface/abstract class? maybe later...
+        protected abstract void generateContent(PrintWriter writer);
+
+        protected String getSuffix() {
+            return suffix;
+        }
+
+        protected String getSourceFileName() {
+            return getType().asType().toString() + suffix;
+        }
+
+        protected String getPackage() {
+            return type.asType().toString();
+        }
+        
+        protected void generateHeader(PrintWriter writer) {
+            // TODO: ported from earlier version, but ugly as hell, could use a facelift
+            writer.println("/*");
+            writer.println(" * SOURCE FILE GENERATATED BY JACOB CHANNEL CLASS GENERATOR");
+            writer.println(" * ");
+            writer.println(" *               !!! DO NOT EDIT !!!! ");
+            writer.println(" * ");
+            writer.println(" * Generated On  : "  + today);
+            writer.println(" * For Interface : "  + getType().asType().toString());
+            writer.println(" */");
+            writer.println();
+     
+            writer.append("package ").append(getPackage()).println(';');
+            writer.println();
+        }
+    };
+
+    private class ChannelClassGenerator extends SourceGenerator {
+
+        public ChannelClassGenerator(Element type) {
+            super(type, "Channel");
+        }
+
+        protected void generateContent(PrintWriter writer) {
+            writer.append("public interface ").append(getType().getSimpleName()).append(getSuffix()).println("{}");
+            writer.flush();
+        }
+    };
+    
+    private class ChannelListenerGenerator extends SourceGenerator {
+
+        public ChannelListenerGenerator(Element type) {
+            super(type, "ChannelListener");
+        }
+
+        protected void generateContent(PrintWriter writer) {
+            writer.append("public interface ").append(getType().getSimpleName()).append(getSuffix()).println("{}");
+            writer.flush();
+        }
+    }
 }