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:29 UTC

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

Author: hadrian
Date: Fri Dec 14 21:08:26 2012
New Revision: 1422084

URL: http://svn.apache.org/viewvc?rev=1422084&view=rev
Log:
ODE-979. Completed code generation to match previous versions

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=1422084&r1=1422083&r2=1422084&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:26 2012
@@ -19,10 +19,13 @@ package org.apache.ode.jacob.generator;
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.io.Writer;
+import java.util.ArrayList;
 import java.util.Date;
+import java.util.List;
 import java.util.Set;
 
 import javax.annotation.processing.AbstractProcessor;
+import javax.annotation.processing.ProcessingEnvironment;
 import javax.annotation.processing.RoundEnvironment;
 import javax.annotation.processing.SupportedAnnotationTypes;
 import javax.annotation.processing.SupportedSourceVersion;
@@ -30,6 +33,9 @@ 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.lang.model.type.DeclaredType;
+import javax.lang.model.type.TypeKind;
+import javax.lang.model.type.TypeMirror;
 import javax.tools.Diagnostic;
 
 import org.apache.ode.jacob.annotation.ChannelType;
@@ -46,7 +52,7 @@ public class ChannelTypeProcessor extend
                     + " is only supported on interfaces; " + elem.asType().toString() + " is a " + elem.getKind().toString());
                 continue;
             }
-            if (generateSourceFile(elem, channelClass(elem)) && generateSourceFile(elem, channelListener(elem))) {
+            if (channelClass(elem).generate() && channelListener(elem).generate()) {
                 processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE,
                     "Generation complete: @ChannelType implementation and listener for " + elem.asType().toString());
             } else {
@@ -56,43 +62,98 @@ public class ChannelTypeProcessor extend
         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);
+        return new ChannelClassGenerator(processingEnv, element);
     }
 
     private SourceGenerator channelListener(Element element) {
-        return new ChannelListenerGenerator(element);
+        return new ChannelListenerGenerator(processingEnv, element);
     }
 
+    // TODO: check if instead of using a String and '\n' line terminators wouldn't be better to
+    //  return a String[] of lines and use println foreach line (would probably use crlf on Win)
+    private static final String HEADER = 
+        // TODO: ported from earlier version, but ugly as hell, could use a facelift
+        "/*\n" +
+        " * SOURCE FILE GENERATATED BY JACOB CHANNEL CLASS GENERATOR\n" +
+        " * \n" +
+        " *               !!! DO NOT EDIT !!!! \n" +
+        " * \n" +
+        " * Generated On  : <today>\n" +
+        " * For Interface : <fqn>\n" +
+        " */\n" +
+        "package <package>;\n";
+    private static final String CHANNEL_DECL = 
+		"/**\n" +
+		" * An auto-generated channel interface for the channel type\n" +
+		" * {@link <fqn>}.\n" +
+		" * @see <fqn>\n" +
+		" * @see <fqn>ChannelListener\n" +
+		" */\n" +
+		"public interface <name>Channel extends\n" + 
+        "<interfaces> {\n" + 
+        "}";
+    private static final String LISTENER_DECL = 
+        "import org.apache.commons.logging.Log;\n" + 
+        "import org.apache.commons.logging.LogFactory;\n" + 
+        "\n" + 
+        "/**\n" +
+        " * An auto-generated channel listener abstract class for the \n" +
+        " * {@link <fqn>} channel type. \n" +
+        " * @see <fqn>\n" +
+        " * @see <fqn>Channel\n" +
+        " */\n" +
+        "public abstract class <name>ChannelListener\n" +
+        "    extends org.apache.ode.jacob.ChannelListener<<fqn>Channel>\n" +
+        "    implements <fqn> {\n" + 
+        "\n" + 
+        "    private static final Log LOG = LogFactory.getLog(<fqn>.class);\n" +
+        "\n" + 
+        "    protected Log log() {\n" +
+        "        return LOG;\n" +
+        "    }\n" +
+        "\n" + 
+        "    protected <name>ChannelListener(<fqn>Channel channel) {\n" +
+        "        super(channel);\n" +
+        "    }\n" +
+        "}";
+
     public abstract class SourceGenerator {
+        public static final String INDENT = "    ";
+        private final ProcessingEnvironment penv;
         private final Date today = new Date();
         private final String suffix;
         private Element type;
         
-        public SourceGenerator(Element type, String suffix) {
+        public SourceGenerator(ProcessingEnvironment penv, Element type, String suffix) {
+            this.penv = penv;
             this.type = type;
             this.suffix = suffix;
         }
 
+        public ProcessingEnvironment getProcessingEnvironment() {
+            return penv;
+        }
+
         public Element getType() {
             return type;
         }
 
-        public void generate(Writer writer) {
-            final PrintWriter w = new PrintWriter(writer);
-            generateHeader(w);
-            generateContent(w);
-            w.close();
+        public boolean generate() {
+            Writer w;
+            try {
+                w = penv.getFiler().createSourceFile(getSourceFileName(), type).openWriter();
+            } catch (IOException e) {
+                penv.getMessager().printMessage(Diagnostic.Kind.NOTE, e.getMessage());
+                return false;
+            }
+
+            final PrintWriter writer = new PrintWriter(w);
+            generateHeader(writer);
+            generateContent(writer);
+            writer.flush();
+            writer.close();
+            return true;
         }
 
         // TODO: is it really worth splitting this into a interface/abstract class? maybe later...
@@ -107,47 +168,64 @@ public class ChannelTypeProcessor extend
         }
 
         protected String getPackage() {
-            return type.asType().toString();
+            return penv.getElementUtils().getPackageOf(type).toString();
         }
         
+        protected List<TypeMirror> getSuperInterfaces() {
+            List<TypeMirror> answer = new ArrayList<TypeMirror>();
+            for (TypeMirror m : getProcessingEnvironment().getTypeUtils().directSupertypes(getType().asType())) {
+                DeclaredType decl = m.getKind() == TypeKind.DECLARED ? (DeclaredType) m : null;
+                if (decl.asElement().getKind() == ElementKind.INTERFACE) {
+                    answer.add(m);
+                }
+            }
+            return answer;
+        }
+
         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();
+        	writer.println(HEADER
+        		.replaceAll("<today>", today.toString())
+        		.replaceAll("<fqn>", getType().asType().toString())
+        		.replaceAll("<package>", getPackage()));
         }
     };
 
     private class ChannelClassGenerator extends SourceGenerator {
 
-        public ChannelClassGenerator(Element type) {
-            super(type, "Channel");
+        public ChannelClassGenerator(ProcessingEnvironment penv, Element type) {
+            super(penv, type, "Channel");
+        }
+
+        protected String generateInterfaces() {
+        	StringBuilder ifs = new StringBuilder();
+            for (TypeMirror m : getSuperInterfaces()) {
+                ifs.append("    ").append(m.toString()).append("\n");
+            }
+            ifs.append("    org.apache.ode.jacob.Channel,\n");
+            ifs.append("    ").append(getType().asType().toString());
+            return ifs.toString();
         }
 
         protected void generateContent(PrintWriter writer) {
-            writer.append("public interface ").append(getType().getSimpleName()).append(getSuffix()).println("{}");
-            writer.flush();
+            // TODO: add the javadoc class prefix?
+        	writer.println(CHANNEL_DECL
+        		.replaceAll("<name>", getType().getSimpleName().toString())
+        		.replaceAll("<interfaces>", generateInterfaces())
+    		    .replaceAll("<fqn>", getType().asType().toString()));
         }
     };
     
     private class ChannelListenerGenerator extends SourceGenerator {
 
-        public ChannelListenerGenerator(Element type) {
-            super(type, "ChannelListener");
+        public ChannelListenerGenerator(ProcessingEnvironment penv, Element type) {
+            super(penv, type, "ChannelListener");
         }
 
         protected void generateContent(PrintWriter writer) {
-            writer.append("public interface ").append(getType().getSimpleName()).append(getSuffix()).println("{}");
-            writer.flush();
+            // TODO: add the javadoc class prefix?
+        	writer.println(LISTENER_DECL
+        		.replaceAll("<name>", getType().getSimpleName().toString())
+        		.replaceAll("<fqn>", getType().asType().toString()));
         }
     }
 }