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();
+        }
+    }
 }


Reply via email to