AnnotationProcessor to generate jaxb.index for Java 6-. Replacing jelly-apt
[annotation-processors.git] / src / main / java / com / indexdata / annotations / processor / JAXBIndexGenerator.java
1 package com.indexdata.annotations.processor;
2
3 import java.io.IOException;
4 import java.io.Writer;
5 import java.util.HashMap;
6 import java.util.LinkedList;
7 import java.util.List;
8 import java.util.Map;
9 import java.util.Set;
10
11 import javax.annotation.processing.AbstractProcessor;
12 import javax.annotation.processing.Messager;
13 import javax.annotation.processing.RoundEnvironment;
14 import javax.annotation.processing.SupportedAnnotationTypes;
15 import javax.annotation.processing.SupportedOptions;
16 import javax.annotation.processing.SupportedSourceVersion;
17 import javax.lang.model.SourceVersion;
18 import javax.lang.model.element.Element;
19 import javax.lang.model.element.TypeElement;
20 import javax.tools.Diagnostic.Kind;
21 import javax.tools.FileObject;
22 import javax.tools.StandardLocation;
23 import javax.xml.bind.annotation.XmlRootElement;
24
25 @SupportedAnnotationTypes("javax.xml.bind.annotation.XmlRootElement")
26 @SupportedSourceVersion(SourceVersion.RELEASE_6)
27 @SupportedOptions({ "test", "test2" })
28 public class JAXBIndexGenerator extends AbstractProcessor {
29
30   @Override
31   public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
32     Set<String> options = this.getSupportedOptions();
33     Messager messager = processingEnv.getMessager();
34     for (String option : options) {
35        messager.printMessage(Kind.NOTE, "option: " + option);
36     }
37     Map<String, List<String>> packageMap = new HashMap<String, List<String>>();
38     for (Element elem : roundEnv.getElementsAnnotatedWith(XmlRootElement.class)) {
39       // XmlRootElement xmlRootElement =
40       // elem.getAnnotation(XmlRootElement.class);
41       String pkg = elem.getEnclosingElement().toString();
42       String className = elem.getSimpleName().toString();
43       String message = "XmlRootElement annotation found in " + pkg + ": " + className;
44       messager.printMessage(Kind.NOTE, message);
45       List<String> classList = packageMap.get(pkg);
46       if (classList == null) {
47         classList = new LinkedList<String>();
48         packageMap.put(pkg, classList);
49       }
50       classList.add(className);
51     }
52     FileObject fo = null;
53     for (String pkg : packageMap.keySet()) {
54       try {
55         Writer w = null;
56         fo = processingEnv.getFiler().createResource(StandardLocation.SOURCE_OUTPUT, pkg,
57             "jaxb.index");
58         w = fo.openWriter();
59         messager.printMessage(Kind.NOTE, "Writing " + fo.getName() + " for package " + pkg);
60         for (String className : packageMap.get(pkg)) {
61           messager.printMessage(Kind.NOTE, "Class " + className);
62           w.write(className + "\n");
63         }
64         w.close();
65       } catch (IOException e) {
66         e.printStackTrace();
67       }
68     }
69     return true; // no further processing of this annotation type
70   }
71
72 }