jaroslav@26: /** jaroslav@106: * Back 2 Browser Bytecode Translator jaroslav@106: * Copyright (C) 2012 Jaroslav Tulach jaroslav@26: * jaroslav@26: * This program is free software: you can redistribute it and/or modify jaroslav@26: * it under the terms of the GNU General Public License as published by jaroslav@26: * the Free Software Foundation, version 2 of the License. jaroslav@26: * jaroslav@26: * This program is distributed in the hope that it will be useful, jaroslav@26: * but WITHOUT ANY WARRANTY; without even the implied warranty of jaroslav@26: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the jaroslav@26: * GNU General Public License for more details. jaroslav@26: * jaroslav@26: * You should have received a copy of the GNU General Public License jaroslav@26: * along with this program. Look for COPYING file in the top folder. jaroslav@26: * If not, see http://opensource.org/licenses/GPL-2.0. jaroslav@26: */ jaroslav@26: package org.apidesign.bck2brwsr.htmlpage; jaroslav@26: jaroslav@26: import java.io.IOException; jaroslav@26: import java.io.InputStream; jaroslav@26: import java.io.OutputStreamWriter; jaroslav@26: import java.io.Writer; jaroslav@117: import java.util.ArrayList; jaroslav@491: import java.util.Collection; jaroslav@117: import java.util.Collections; jaroslav@498: import java.util.HashMap; jaroslav@498: import java.util.LinkedHashSet; jaroslav@117: import java.util.List; jaroslav@26: import java.util.Locale; jaroslav@498: import java.util.Map; jaroslav@26: import java.util.Set; jaroslav@26: import javax.annotation.processing.AbstractProcessor; jaroslav@117: import javax.annotation.processing.Completion; jaroslav@117: import javax.annotation.processing.Completions; jaroslav@26: import javax.annotation.processing.Processor; jaroslav@26: import javax.annotation.processing.RoundEnvironment; jaroslav@26: import javax.annotation.processing.SupportedAnnotationTypes; jaroslav@117: import javax.lang.model.element.AnnotationMirror; jaroslav@26: import javax.lang.model.element.Element; jaroslav@28: import javax.lang.model.element.ElementKind; jaroslav@28: import javax.lang.model.element.ExecutableElement; jaroslav@28: import javax.lang.model.element.Modifier; jaroslav@26: import javax.lang.model.element.PackageElement; jaroslav@26: import javax.lang.model.element.TypeElement; jaroslav@491: import javax.lang.model.element.VariableElement; jaroslav@490: import javax.lang.model.type.MirroredTypeException; jaroslav@124: import javax.lang.model.type.TypeMirror; jaroslav@768: import javax.lang.model.util.Types; jaroslav@26: import javax.tools.Diagnostic; jaroslav@26: import javax.tools.FileObject; jaroslav@26: import javax.tools.StandardLocation; jaroslav@491: import org.apidesign.bck2brwsr.htmlpage.api.ComputedProperty; jaroslav@435: import org.apidesign.bck2brwsr.htmlpage.api.On; jaroslav@26: import org.apidesign.bck2brwsr.htmlpage.api.Page; jaroslav@490: import org.apidesign.bck2brwsr.htmlpage.api.Property; jaroslav@26: import org.openide.util.lookup.ServiceProvider; jaroslav@26: jaroslav@26: /** Annotation processor to process an XHTML page and generate appropriate jaroslav@26: * "id" file. jaroslav@26: * jaroslav@26: * @author Jaroslav Tulach jaroslav@26: */ jaroslav@26: @ServiceProvider(service=Processor.class) jaroslav@28: @SupportedAnnotationTypes({ jaroslav@28: "org.apidesign.bck2brwsr.htmlpage.api.Page", jaroslav@435: "org.apidesign.bck2brwsr.htmlpage.api.On" jaroslav@28: }) jaroslav@26: public final class PageProcessor extends AbstractProcessor { jaroslav@26: @Override jaroslav@26: public boolean process(Set annotations, RoundEnvironment roundEnv) { jaroslav@765: boolean ok = true; jaroslav@26: for (Element e : roundEnv.getElementsAnnotatedWith(Page.class)) { jaroslav@26: Page p = e.getAnnotation(Page.class); jaroslav@463: if (p == null) { jaroslav@463: continue; jaroslav@463: } jaroslav@100: PackageElement pe = (PackageElement)e.getEnclosingElement(); jaroslav@26: String pkg = pe.getQualifiedName().toString(); jaroslav@26: jaroslav@26: ProcessPage pp; jaroslav@26: try { jaroslav@26: InputStream is = openStream(pkg, p.xhtml()); jaroslav@26: pp = ProcessPage.readPage(is); jaroslav@26: is.close(); jaroslav@26: } catch (IOException iOException) { jaroslav@26: processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Can't read " + p.xhtml(), e); jaroslav@765: ok = false; jaroslav@765: pp = null; jaroslav@26: } jaroslav@26: Writer w; jaroslav@108: String className = p.className(); jaroslav@108: if (className.isEmpty()) { jaroslav@108: int indx = p.xhtml().indexOf('.'); jaroslav@108: className = p.xhtml().substring(0, indx); jaroslav@108: } jaroslav@26: try { jaroslav@108: FileObject java = processingEnv.getFiler().createSourceFile(pkg + '.' + className, e); jaroslav@26: w = new OutputStreamWriter(java.openOutputStream()); jaroslav@28: try { jaroslav@28: w.append("package " + pkg + ";\n"); jaroslav@28: w.append("import org.apidesign.bck2brwsr.htmlpage.api.*;\n"); jaroslav@761: w.append("import org.apidesign.bck2brwsr.htmlpage.KOList;\n"); jaroslav@505: w.append("final class ").append(className).append(" {\n"); jaroslav@528: w.append(" private boolean locked;\n"); jaroslav@510: if (!initializeOnClick(className, (TypeElement) e, w, pp)) { jaroslav@765: ok = false; jaroslav@765: } else { jaroslav@765: for (String id : pp.ids()) { jaroslav@765: String tag = pp.tagNameForId(id); jaroslav@765: String type = type(tag); jaroslav@765: w.append(" ").append("public final "). jaroslav@765: append(type).append(' ').append(cnstnt(id)).append(" = new "). jaroslav@765: append(type).append("(\"").append(id).append("\");\n"); jaroslav@765: } jaroslav@28: } jaroslav@492: List propsGetSet = new ArrayList(); jaroslav@498: Map> propsDeps = new HashMap>(); jaroslav@765: if (!generateComputedProperties(w, p.properties(), e.getEnclosedElements(), propsGetSet, propsDeps)) { jaroslav@765: ok = false; jaroslav@765: } jaroslav@498: generateProperties(w, p.properties(), propsGetSet, propsDeps); jaroslav@505: w.append(" private org.apidesign.bck2brwsr.htmlpage.Knockout ko;\n"); jaroslav@492: if (!propsGetSet.isEmpty()) { jaroslav@505: w.write("public " + className + " applyBindings() {\n"); jaroslav@496: w.write(" ko = org.apidesign.bck2brwsr.htmlpage.Knockout.applyBindings("); jaroslav@508: w.write(className + ".class, this, "); jaroslav@492: w.write("new String[] {\n"); jaroslav@492: String sep = ""; jaroslav@492: for (String n : propsGetSet) { jaroslav@492: w.write(sep); jaroslav@492: if (n == null) { jaroslav@492: w.write(" null"); jaroslav@492: } else { jaroslav@492: w.write(" \"" + n + "\""); jaroslav@492: } jaroslav@492: sep = ",\n"; jaroslav@492: } jaroslav@505: w.write("\n });\n return this;\n}\n"); jaroslav@530: jaroslav@530: w.write("public void triggerEvent(Element e, OnEvent ev) {\n"); jaroslav@530: w.write(" org.apidesign.bck2brwsr.htmlpage.Knockout.triggerEvent(e.getId(), ev.getElementPropertyName());\n"); jaroslav@530: w.write("}\n"); jaroslav@28: } jaroslav@28: w.append("}\n"); jaroslav@28: } finally { jaroslav@28: w.close(); jaroslav@26: } jaroslav@26: } catch (IOException ex) { jaroslav@108: processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Can't create " + className + ".java", e); jaroslav@26: return false; jaroslav@26: } jaroslav@26: } jaroslav@765: return ok; jaroslav@26: } jaroslav@26: jaroslav@26: private InputStream openStream(String pkg, String name) throws IOException { jaroslav@26: try { jaroslav@107: FileObject fo = processingEnv.getFiler().getResource( jaroslav@107: StandardLocation.SOURCE_PATH, pkg, name); jaroslav@26: return fo.openInputStream(); jaroslav@26: } catch (IOException ex) { jaroslav@26: return processingEnv.getFiler().getResource(StandardLocation.CLASS_OUTPUT, pkg, name).openInputStream(); jaroslav@26: } jaroslav@26: } jaroslav@26: jaroslav@26: private static String type(String tag) { jaroslav@26: if (tag.equals("title")) { jaroslav@26: return "Title"; jaroslav@26: } jaroslav@26: if (tag.equals("button")) { jaroslav@26: return "Button"; jaroslav@26: } jaroslav@26: if (tag.equals("input")) { jaroslav@26: return "Input"; jaroslav@26: } toni@521: if (tag.equals("canvas")) { toni@521: return "Canvas"; toni@521: } toni@521: if (tag.equals("img")) { toni@521: return "Image"; toni@521: } jaroslav@26: return "Element"; jaroslav@26: } jaroslav@26: jaroslav@26: private static String cnstnt(String id) { jaroslav@522: return id.toUpperCase(Locale.ENGLISH).replace('.', '_').replace('-', '_'); jaroslav@26: } jaroslav@28: jaroslav@510: private boolean initializeOnClick( jaroslav@510: String className, TypeElement type, Writer w, ProcessPage pp jaroslav@510: ) throws IOException { jaroslav@765: boolean ok = true; jaroslav@124: TypeMirror stringType = processingEnv.getElementUtils().getTypeElement("java.lang.String").asType(); jaroslav@489: { //for (Element clazz : pe.getEnclosedElements()) { jaroslav@489: // if (clazz.getKind() != ElementKind.CLASS) { jaroslav@489: // continue; jaroslav@489: // } jaroslav@512: w.append(" public ").append(className).append("() {\n"); jaroslav@512: StringBuilder dispatch = new StringBuilder(); jaroslav@512: int dispatchCnt = 0; jaroslav@489: for (Element method : type.getEnclosedElements()) { jaroslav@435: On oc = method.getAnnotation(On.class); jaroslav@28: if (oc != null) { jaroslav@124: for (String id : oc.id()) { jaroslav@765: if (pp == null) { jaroslav@765: processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "id = " + id + " not found in HTML page."); jaroslav@765: ok = false; jaroslav@765: continue; jaroslav@765: } jaroslav@124: if (pp.tagNameForId(id) == null) { jaroslav@435: processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "id = " + id + " does not exist in the HTML page. Found only " + pp.ids(), method); jaroslav@765: ok = false; jaroslav@765: continue; jaroslav@124: } jaroslav@124: ExecutableElement ee = (ExecutableElement)method; jaroslav@510: StringBuilder params = new StringBuilder(); jaroslav@510: { jaroslav@510: boolean first = true; jaroslav@510: for (VariableElement ve : ee.getParameters()) { jaroslav@510: if (!first) { jaroslav@510: params.append(", "); jaroslav@510: } jaroslav@510: first = false; jaroslav@510: if (ve.asType() == stringType) { jaroslav@510: params.append('"').append(id).append('"'); jaroslav@510: continue; jaroslav@510: } jaroslav@535: String rn = ve.asType().toString(); jaroslav@535: int last = rn.lastIndexOf('.'); jaroslav@535: if (last >= 0) { jaroslav@535: rn = rn.substring(last + 1); jaroslav@535: } jaroslav@535: if (rn.equals(className)) { jaroslav@510: params.append(className).append(".this"); jaroslav@510: continue; jaroslav@510: } jaroslav@510: processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, jaroslav@510: "@On method can only accept String or " + className + " arguments", jaroslav@510: ee jaroslav@510: ); jaroslav@124: return false; jaroslav@124: } jaroslav@124: } jaroslav@124: if (!ee.getModifiers().contains(Modifier.STATIC)) { jaroslav@435: processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "@On method has to be static", ee); jaroslav@765: ok = false; jaroslav@765: continue; jaroslav@124: } jaroslav@124: if (ee.getModifiers().contains(Modifier.PRIVATE)) { jaroslav@435: processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "@On method can't be private", ee); jaroslav@765: ok = false; jaroslav@765: continue; jaroslav@124: } jaroslav@435: w.append(" OnEvent." + oc.event()).append(".of(").append(cnstnt(id)). jaroslav@512: append(").perform(new OnDispatch(" + dispatchCnt + "));\n"); jaroslav@512: jaroslav@512: dispatch. jaroslav@512: append(" case ").append(dispatchCnt).append(": "). jaroslav@512: append(type.getSimpleName().toString()). jaroslav@512: append('.').append(ee.getSimpleName()).append("("). jaroslav@512: append(params). jaroslav@512: append("); break;\n"); jaroslav@512: jaroslav@512: dispatchCnt++; jaroslav@512: } jaroslav@28: } jaroslav@28: } jaroslav@512: w.append(" }\n"); jaroslav@512: if (dispatchCnt > 0) { jaroslav@512: w.append("class OnDispatch implements Runnable {\n"); jaroslav@512: w.append(" private final int dispatch;\n"); jaroslav@512: w.append(" OnDispatch(int d) { dispatch = d; }\n"); jaroslav@512: w.append(" public void run() {\n"); jaroslav@512: w.append(" switch (dispatch) {\n"); jaroslav@512: w.append(dispatch); jaroslav@512: w.append(" }\n"); jaroslav@512: w.append(" }\n"); jaroslav@512: w.append("}\n"); jaroslav@512: } jaroslav@512: jaroslav@512: jaroslav@28: } jaroslav@765: return ok; jaroslav@28: } jaroslav@117: jaroslav@117: @Override jaroslav@117: public Iterable getCompletions( jaroslav@117: Element element, AnnotationMirror annotation, jaroslav@117: ExecutableElement member, String userText jaroslav@117: ) { jaroslav@117: if (!userText.startsWith("\"")) { jaroslav@117: return Collections.emptyList(); jaroslav@117: } jaroslav@117: jaroslav@117: Element cls = findClass(element); jaroslav@117: Page p = cls.getAnnotation(Page.class); jaroslav@117: PackageElement pe = (PackageElement) cls.getEnclosingElement(); jaroslav@117: String pkg = pe.getQualifiedName().toString(); jaroslav@117: ProcessPage pp; jaroslav@117: try { jaroslav@117: InputStream is = openStream(pkg, p.xhtml()); jaroslav@117: pp = ProcessPage.readPage(is); jaroslav@117: is.close(); jaroslav@117: } catch (IOException iOException) { jaroslav@117: return Collections.emptyList(); jaroslav@117: } jaroslav@117: jaroslav@117: List cc = new ArrayList(); jaroslav@117: userText = userText.substring(1); jaroslav@117: for (String id : pp.ids()) { jaroslav@117: if (id.startsWith(userText)) { jaroslav@117: cc.add(Completions.of("\"" + id + "\"", id)); jaroslav@117: } jaroslav@117: } jaroslav@117: return cc; jaroslav@117: } jaroslav@117: jaroslav@117: private static Element findClass(Element e) { jaroslav@117: if (e == null) { jaroslav@117: return null; jaroslav@117: } jaroslav@117: Page p = e.getAnnotation(Page.class); jaroslav@117: if (p != null) { jaroslav@117: return e; jaroslav@117: } jaroslav@117: return e.getEnclosingElement(); jaroslav@117: } jaroslav@490: jaroslav@765: private void generateProperties( jaroslav@498: Writer w, Property[] properties, Collection props, jaroslav@498: Map> deps jaroslav@492: ) throws IOException { jaroslav@490: for (Property p : properties) { jaroslav@492: final String tn = typeName(p); jaroslav@760: String[] gs = toGetSet(p.name(), tn, p.array()); jaroslav@490: jaroslav@760: if (p.array()) { jaroslav@761: w.write("private KOList<" + tn + "> prop_" + p.name() + " = new KOList<" + tn + ">(\"" jaroslav@761: + p.name() + "\""); jaroslav@761: final Collection dependants = deps.get(p.name()); jaroslav@761: if (dependants != null) { jaroslav@761: for (String depProp : dependants) { jaroslav@761: w.write(", "); jaroslav@761: w.write('\"'); jaroslav@761: w.write(depProp); jaroslav@761: w.write('\"'); jaroslav@761: } jaroslav@761: } jaroslav@761: w.write(");\n"); jaroslav@760: w.write("public java.util.List<" + tn + "> " + gs[0] + "() {\n"); jaroslav@760: w.write(" if (locked) throw new IllegalStateException();\n"); jaroslav@761: w.write(" prop_" + p.name() + ".assign(ko);\n"); jaroslav@760: w.write(" return prop_" + p.name() + ";\n"); jaroslav@760: w.write("}\n"); jaroslav@763: w.write("private Object[] " + gs[0] + "ToArray() {\n"); jaroslav@763: w.write(" return " + gs[0] + "().toArray(new Object[0]);\n"); jaroslav@763: w.write("}\n"); jaroslav@760: } else { jaroslav@760: w.write("private " + tn + " prop_" + p.name() + ";\n"); jaroslav@760: w.write("public " + tn + " " + gs[0] + "() {\n"); jaroslav@760: w.write(" if (locked) throw new IllegalStateException();\n"); jaroslav@760: w.write(" return prop_" + p.name() + ";\n"); jaroslav@760: w.write("}\n"); jaroslav@760: w.write("public void " + gs[1] + "(" + tn + " v) {\n"); jaroslav@760: w.write(" if (locked) throw new IllegalStateException();\n"); jaroslav@760: w.write(" prop_" + p.name() + " = v;\n"); jaroslav@760: w.write(" if (ko != null) {\n"); jaroslav@760: w.write(" ko.valueHasMutated(\"" + p.name() + "\");\n"); jaroslav@760: final Collection dependants = deps.get(p.name()); jaroslav@760: if (dependants != null) { jaroslav@760: for (String depProp : dependants) { jaroslav@760: w.write(" ko.valueHasMutated(\"" + depProp + "\");\n"); jaroslav@760: } jaroslav@498: } jaroslav@760: w.write(" }\n"); jaroslav@760: w.write("}\n"); jaroslav@498: } jaroslav@492: jaroslav@492: props.add(p.name()); jaroslav@492: props.add(gs[2]); jaroslav@492: props.add(gs[3]); jaroslav@530: props.add(gs[0]); jaroslav@490: } jaroslav@490: } jaroslav@490: jaroslav@498: private boolean generateComputedProperties( jaroslav@765: Writer w, Property[] fixedProps, jaroslav@765: Collection arr, Collection props, jaroslav@498: Map> deps jaroslav@492: ) throws IOException { jaroslav@765: boolean ok = true; jaroslav@491: for (Element e : arr) { jaroslav@491: if (e.getKind() != ElementKind.METHOD) { jaroslav@491: continue; jaroslav@491: } jaroslav@491: if (e.getAnnotation(ComputedProperty.class) == null) { jaroslav@491: continue; jaroslav@491: } jaroslav@491: ExecutableElement ee = (ExecutableElement)e; jaroslav@767: final TypeMirror rt = ee.getReturnType(); jaroslav@768: final Types tu = processingEnv.getTypeUtils(); jaroslav@768: TypeMirror ert = tu.erasure(rt); jaroslav@768: String tn = ert.toString(); jaroslav@768: boolean array = false; jaroslav@768: if (tn.equals("java.util.List")) { jaroslav@768: array = true; jaroslav@768: } jaroslav@768: jaroslav@498: final String sn = ee.getSimpleName().toString(); jaroslav@768: String[] gs = toGetSet(sn, tn, array); jaroslav@498: jaroslav@505: w.write("public " + tn + " " + gs[0] + "() {\n"); jaroslav@500: w.write(" if (locked) throw new IllegalStateException();\n"); jaroslav@500: int arg = 0; jaroslav@491: for (VariableElement pe : ee.getParameters()) { jaroslav@498: final String dn = pe.getSimpleName().toString(); jaroslav@765: jaroslav@765: if (!verifyPropName(pe, dn, fixedProps)) { jaroslav@765: ok = false; jaroslav@765: } jaroslav@765: jaroslav@500: final String dt = pe.asType().toString(); jaroslav@760: String[] call = toGetSet(dn, dt, false); jaroslav@500: w.write(" " + dt + " arg" + (++arg) + " = "); jaroslav@500: w.write(call[0] + "();\n"); jaroslav@498: jaroslav@498: Collection depends = deps.get(dn); jaroslav@498: if (depends == null) { jaroslav@498: depends = new LinkedHashSet(); jaroslav@498: deps.put(dn, depends); jaroslav@498: } jaroslav@498: depends.add(sn); jaroslav@491: } jaroslav@500: w.write(" try {\n"); jaroslav@500: w.write(" locked = true;\n"); jaroslav@500: w.write(" return " + e.getEnclosingElement().getSimpleName() + '.' + e.getSimpleName() + "("); jaroslav@500: String sep = ""; jaroslav@500: for (int i = 1; i <= arg; i++) { jaroslav@500: w.write(sep); jaroslav@500: w.write("arg" + i); jaroslav@500: sep = ", "; jaroslav@500: } jaroslav@491: w.write(");\n"); jaroslav@500: w.write(" } finally {\n"); jaroslav@500: w.write(" locked = false;\n"); jaroslav@500: w.write(" }\n"); jaroslav@491: w.write("}\n"); jaroslav@768: jaroslav@768: if (array) { jaroslav@768: w.write("private Object[] " + gs[0] + "ToArray() {\n"); jaroslav@768: w.write(" return " + gs[0] + "().toArray(new Object[0]);\n"); jaroslav@768: w.write("}\n"); jaroslav@768: } jaroslav@492: props.add(e.getSimpleName().toString()); jaroslav@492: props.add(gs[2]); jaroslav@492: props.add(null); jaroslav@530: props.add(gs[0]); jaroslav@491: } jaroslav@498: jaroslav@765: return ok; jaroslav@491: } jaroslav@491: jaroslav@760: private static String[] toGetSet(String name, String type, boolean array) { jaroslav@491: String n = Character.toUpperCase(name.charAt(0)) + name.substring(1); jaroslav@492: String bck2brwsrType = "L" + type.replace('.', '_') + "_2"; jaroslav@492: if ("int".equals(type)) { jaroslav@492: bck2brwsrType = "I"; jaroslav@492: } jaroslav@492: if ("double".equals(type)) { jaroslav@492: bck2brwsrType = "D"; jaroslav@492: } jaroslav@492: String pref = "get"; jaroslav@492: if ("boolean".equals(type)) { jaroslav@492: pref = "is"; jaroslav@492: bck2brwsrType = "Z"; jaroslav@492: } jaroslav@498: final String nu = n.replace('.', '_'); jaroslav@760: if (array) { jaroslav@760: return new String[] { jaroslav@760: "get" + n, jaroslav@760: null, jaroslav@763: "get" + nu + "ToArray___3Ljava_lang_Object_2", jaroslav@760: null jaroslav@760: }; jaroslav@760: } jaroslav@492: return new String[]{ jaroslav@492: pref + n, jaroslav@492: "set" + n, jaroslav@498: pref + nu + "__" + bck2brwsrType, jaroslav@498: "set" + nu + "__V" + bck2brwsrType jaroslav@492: }; jaroslav@490: } jaroslav@490: jaroslav@765: private String typeName(Property p) { jaroslav@764: String ret; jaroslav@490: try { jaroslav@764: ret = p.type().getName(); jaroslav@490: } catch (MirroredTypeException ex) { jaroslav@765: TypeMirror tm = processingEnv.getTypeUtils().erasure(ex.getTypeMirror()); jaroslav@765: ret = tm.toString(); jaroslav@490: } jaroslav@764: if (p.array()) { jaroslav@769: String bt = findBoxedType(ret); jaroslav@769: if (bt != null) { jaroslav@769: return bt; jaroslav@764: } jaroslav@764: } jaroslav@769: if ("java.lang.String".equals(ret)) { jaroslav@769: return ret; jaroslav@769: } jaroslav@769: String bt = findBoxedType(ret); jaroslav@769: if (bt != null) { jaroslav@769: return ret; jaroslav@769: } jaroslav@769: processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Only primitive types supported in the mapping. Not " + ret); jaroslav@764: return ret; jaroslav@490: } jaroslav@769: jaroslav@769: private static String findBoxedType(String ret) { jaroslav@769: if (ret.equals("byte")) { jaroslav@769: return Byte.class.getName(); jaroslav@769: } jaroslav@769: if (ret.equals("short")) { jaroslav@769: return Short.class.getName(); jaroslav@769: } jaroslav@769: if (ret.equals("char")) { jaroslav@769: return Character.class.getName(); jaroslav@769: } jaroslav@769: if (ret.equals("int")) { jaroslav@769: return Integer.class.getName(); jaroslav@769: } jaroslav@769: if (ret.equals("long")) { jaroslav@769: return Long.class.getName(); jaroslav@769: } jaroslav@769: if (ret.equals("float")) { jaroslav@769: return Float.class.getName(); jaroslav@769: } jaroslav@769: if (ret.equals("double")) { jaroslav@769: return Double.class.getName(); jaroslav@769: } jaroslav@769: return null; jaroslav@769: } jaroslav@765: jaroslav@765: private boolean verifyPropName(Element e, String propName, Property[] existingProps) { jaroslav@765: StringBuilder sb = new StringBuilder(); jaroslav@765: String sep = ""; jaroslav@765: for (Property property : existingProps) { jaroslav@765: if (property.name().equals(propName)) { jaroslav@765: return true; jaroslav@765: } jaroslav@765: sb.append(sep); jaroslav@765: sb.append('"'); jaroslav@765: sb.append(property.name()); jaroslav@765: sb.append('"'); jaroslav@765: sep = ", "; jaroslav@765: } jaroslav@765: processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, jaroslav@765: propName + " is not one of known properties: " + sb jaroslav@765: , e jaroslav@765: ); jaroslav@765: return false; jaroslav@765: } jaroslav@26: }