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