Search in sources :

Example 1 with ChildElementDeclarationInfo

use of com.predic8.membrane.annot.model.ChildElementDeclarationInfo in project service-proxy by membrane.

the class SpringConfigurationXSDGeneratingAnnotationProcessor method process.

@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
    // * in the last round, "roundEnv.processingOver()" is true
    try {
        String status = "process() a=" + annotations.size() + " r=" + roundEnv.getRootElements().size() + " h=" + hashCode() + (roundEnv.processingOver() ? " processing-over" : " ");
        log(status);
        read();
        if (roundEnv.processingOver())
            write();
        if (annotations.size() > 0) {
            // a class with one of our annotation needs to be compiled
            status = "working with " + getCachedElementsAnnotatedWith(roundEnv, MCMain.class).size() + " and " + getCachedElementsAnnotatedWith(roundEnv, MCElement.class).size();
            log(status);
            Model m = new Model();
            Set<? extends Element> mcmains = getCachedElementsAnnotatedWith(roundEnv, MCMain.class);
            if (mcmains.isEmpty()) {
                processingEnv.getMessager().printMessage(Kind.WARNING, "@MCMain was nowhere found.");
                return true;
            }
            for (Element element : mcmains) {
                MainInfo main = new MainInfo();
                main.setElement((TypeElement) element);
                main.setAnnotation(element.getAnnotation(MCMain.class));
                m.getMains().add(main);
            }
            for (Element e : getCachedElementsAnnotatedWith(roundEnv, MCElement.class)) {
                ElementInfo ii = new ElementInfo();
                ii.setElement((TypeElement) e);
                ii.setAnnotation(e.getAnnotation(MCElement.class));
                MainInfo main = ii.getMain(m);
                main.getIis().add(ii);
                main.getElements().put(ii.getElement(), ii);
                if (main.getGlobals().containsKey(ii.getAnnotation().name()))
                    throw new ProcessingException("Duplicate global @MCElement name.", main.getGlobals().get(ii.getAnnotation().name()).getElement(), ii.getElement());
                if (main.getIds().containsKey(ii.getId()))
                    throw new ProcessingException("Duplicate element id \"" + ii.getId() + "\". Please assign one using @MCElement(id=\"...\").", e, main.getIds().get(ii.getId()).getElement());
                main.getIds().put(ii.getId(), ii);
                scan(m, main, ii);
                if (ii.getTci() != null && !ii.getAnnotation().mixed())
                    throw new ProcessingException("@MCTextContent requires @MCElement(..., mixed=true) on the class.", ii.getElement());
                if (ii.getTci() == null && ii.getAnnotation().mixed())
                    throw new ProcessingException("@MCElement(..., mixed=true) requires @MCTextContent on a property.", ii.getElement());
            }
            for (MainInfo main : m.getMains()) {
                for (Map.Entry<TypeElement, ChildElementDeclarationInfo> f : main.getChildElementDeclarations().entrySet()) {
                    ChildElementDeclarationInfo cedi = f.getValue();
                    ElementInfo ei = main.getElements().get(f.getKey());
                    if (ei != null)
                        cedi.getElementInfo().add(ei);
                    else {
                        for (Map.Entry<TypeElement, ElementInfo> e : main.getElements().entrySet()) if (processingEnv.getTypeUtils().isAssignable(e.getKey().asType(), f.getKey().asType()))
                            cedi.getElementInfo().add(e.getValue());
                    }
                    for (ElementInfo ei2 : cedi.getElementInfo()) ei2.addUsedBy(f.getValue());
                    if (cedi.getElementInfo().isEmpty() && cedi.isRaiseErrorWhenNoSpecimen()) {
                        processingEnv.getMessager().printMessage(Kind.ERROR, "@MCChildElement references " + f.getKey().getQualifiedName() + ", but there is no @MCElement among it and its subclasses.", f.getKey());
                        return true;
                    }
                }
            }
            if (mcmains.isEmpty()) {
                processingEnv.getMessager().printMessage(Kind.ERROR, "@MCMain but no @MCElement found.", mcmains.iterator().next());
                return true;
            }
            process(m);
        }
        return true;
    } catch (IOException e) {
        throw new RuntimeException(e);
    } catch (ProcessingException e1) {
        for (int i = 0; i < e1.getElements().length; i++) processingEnv.getMessager().printMessage(Kind.ERROR, i == 0 ? e1.getMessage() : "also here", e1.getElements()[i]);
        return true;
    }
}
Also used : ElementInfo(com.predic8.membrane.annot.model.ElementInfo) ChildElementInfo(com.predic8.membrane.annot.model.ChildElementInfo) IOException(java.io.IOException) MainInfo(com.predic8.membrane.annot.model.MainInfo) Model(com.predic8.membrane.annot.model.Model) ChildElementDeclarationInfo(com.predic8.membrane.annot.model.ChildElementDeclarationInfo)

Example 2 with ChildElementDeclarationInfo

use of com.predic8.membrane.annot.model.ChildElementDeclarationInfo in project service-proxy by membrane.

the class HelpReference method getPrimaryParentId.

private String getPrimaryParentId(Model m, MainInfo mi, ElementInfo ei) {
    // choose a random parent (TODO: choose a better one)
    Set<ElementInfo> possibleParents = new HashSet<ElementInfo>();
    for (Map.Entry<TypeElement, ChildElementDeclarationInfo> e : mi.getChildElementDeclarations().entrySet()) if (e.getValue().getElementInfo().contains(ei)) {
        for (ChildElementInfo usedBy : e.getValue().getUsedBy()) {
            ElementInfo e2 = mi.getElements().get(usedBy.getEi().getElement());
            if (e2 != null)
                possibleParents.add(e2);
        }
    }
    for (ElementInfo ei2 : possibleParents) if (ei2.getAnnotation().topLevel())
        return ei2.getId();
    possibleParents.remove(ei);
    if (possibleParents.size() > 0)
        return possibleParents.iterator().next().getId();
    return null;
}
Also used : ElementInfo(com.predic8.membrane.annot.model.ElementInfo) ChildElementInfo(com.predic8.membrane.annot.model.ChildElementInfo) TypeElement(javax.lang.model.element.TypeElement) Map(java.util.Map) ChildElementInfo(com.predic8.membrane.annot.model.ChildElementInfo) ChildElementDeclarationInfo(com.predic8.membrane.annot.model.ChildElementDeclarationInfo) HashSet(java.util.HashSet)

Example 3 with ChildElementDeclarationInfo

use of com.predic8.membrane.annot.model.ChildElementDeclarationInfo in project service-proxy by membrane.

the class SpringConfigurationXSDGeneratingAnnotationProcessor method scan.

private void scan(Model m, MainInfo main, ElementInfo ii, TypeElement te) {
    TypeMirror superclass = te.getSuperclass();
    if (superclass instanceof DeclaredType)
        scan(m, main, ii, (TypeElement) ((DeclaredType) superclass).asElement());
    for (Element e2 : te.getEnclosedElements()) {
        MCAttribute a = e2.getAnnotation(MCAttribute.class);
        if (a != null) {
            AttributeInfo ai = new AttributeInfo();
            ai.setAnnotation(a);
            ai.setE((ExecutableElement) e2);
            ai.setRequired(isRequired(e2));
            ii.getAis().add(ai);
            ii.setHasIdField(ii.isHasIdField() || ai.getXMLName().equals("id"));
        }
        MCOtherAttributes d = e2.getAnnotation(MCOtherAttributes.class);
        if (d != null) {
            OtherAttributesInfo oai = new OtherAttributesInfo();
            oai.setOtherAttributesSetter((ExecutableElement) e2);
            ii.setOai(oai);
        }
        MCChildElement b = e2.getAnnotation(MCChildElement.class);
        if (b != null) {
            ChildElementInfo cei = new ChildElementInfo();
            cei.setEi(ii);
            cei.setAnnotation(b);
            cei.setE((ExecutableElement) e2);
            List<? extends VariableElement> parameters = cei.getE().getParameters();
            if (parameters.size() == 0)
                throw new ProcessingException("Setter must have exactly one parameter.", e2);
            TypeMirror setterArgType = parameters.get(0).asType();
            if (!(setterArgType instanceof DeclaredType))
                throw new ProcessingException("Setter argument must be of an @MCElement-annotated type.", parameters.get(0));
            cei.setTypeDeclaration((TypeElement) ((DeclaredType) setterArgType).asElement());
            cei.setPropertyName(AnnotUtils.dejavaify(e2.getSimpleName().toString().substring(3)));
            cei.setRequired(isRequired(e2));
            ii.getCeis().add(cei);
            // unwrap "java.util.List<?>" and "java.util.Collection<?>"
            if (cei.getTypeDeclaration().getQualifiedName().toString().startsWith("java.util.List") || cei.getTypeDeclaration().getQualifiedName().toString().startsWith("java.util.Collection")) {
                cei.setTypeDeclaration((TypeElement) ((DeclaredType) ((DeclaredType) setterArgType).getTypeArguments().get(0)).asElement());
                cei.setList(true);
            }
            ChildElementDeclarationInfo cedi;
            if (!main.getChildElementDeclarations().containsKey(cei.getTypeDeclaration())) {
                cedi = new ChildElementDeclarationInfo();
                cedi.setTarget(cei.getTypeDeclaration());
                cedi.setRaiseErrorWhenNoSpecimen(!cei.getAnnotation().allowForeign());
                main.getChildElementDeclarations().put(cei.getTypeDeclaration(), cedi);
            } else {
                cedi = main.getChildElementDeclarations().get(cei.getTypeDeclaration());
                cedi.setRaiseErrorWhenNoSpecimen(cedi.isRaiseErrorWhenNoSpecimen() || !cei.getAnnotation().allowForeign());
            }
            cedi.addUsedBy(cei);
        }
        MCTextContent c = e2.getAnnotation(MCTextContent.class);
        if (c != null) {
            TextContentInfo tci = new TextContentInfo();
            tci.setPropertyName(AnnotUtils.dejavaify(e2.getSimpleName().toString().substring(3)));
            ii.setTci(tci);
        }
    }
    HashSet<Integer> childOrders = new HashSet<Integer>();
    for (ChildElementInfo cei : ii.getCeis()) {
        if (!childOrders.add(cei.getAnnotation().order()))
            throw new ProcessingException("@MCChildElement(order=...) must be unique.", cei.getE());
    }
    Collections.sort(ii.getCeis());
}
Also used : OtherAttributesInfo(com.predic8.membrane.annot.model.OtherAttributesInfo) TextContentInfo(com.predic8.membrane.annot.model.TextContentInfo) ChildElementInfo(com.predic8.membrane.annot.model.ChildElementInfo) AttributeInfo(com.predic8.membrane.annot.model.AttributeInfo) TypeMirror(javax.lang.model.type.TypeMirror) ChildElementDeclarationInfo(com.predic8.membrane.annot.model.ChildElementDeclarationInfo) DeclaredType(javax.lang.model.type.DeclaredType)

Example 4 with ChildElementDeclarationInfo

use of com.predic8.membrane.annot.model.ChildElementDeclarationInfo in project service-proxy by membrane.

the class BlueprintParsers method writeParserDefinitior.

public void writeParserDefinitior(Model m) throws IOException {
    for (MainInfo main : m.getMains()) {
        List<Element> sources = new ArrayList<Element>();
        sources.addAll(main.getInterceptorElements());
        sources.add(main.getElement());
        try {
            FileObject o = processingEnv.getFiler().createSourceFile(main.getAnnotation().outputPackage() + ".blueprint" + ".BlueprintNamespaceParser", sources.toArray(new Element[0]));
            BufferedWriter bw = new BufferedWriter(o.openWriter());
            try {
                bw.write("/* Copyright 2014 predic8 GmbH, www.predic8.com\r\n" + "\r\n" + "   Licensed under the Apache License, Version 2.0 (the \"License\");\r\n" + "   you may not use this file except in compliance with the License.\r\n" + "   You may obtain a copy of the License at\r\n" + "\r\n" + "   http://www.apache.org/licenses/LICENSE-2.0\r\n" + "\r\n" + "   Unless required by applicable law or agreed to in writing, software\r\n" + "   distributed under the License is distributed on an \"AS IS\" BASIS,\r\n" + "   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n" + "   See the License for the specific language governing permissions and\r\n" + "   limitations under the License. */\r\n" + "\r\n" + "package " + main.getAnnotation().outputPackage() + ".blueprint;\r\n" + "\r\n" + "/**\r\n" + "  * Automatically generated by " + BlueprintParsers.class.getName() + ".\r\n" + "  */\r\n" + "public class BlueprintNamespaceParser extends com.predic8.membrane.annot.parser.BlueprintNamespaceParser {\r\n" + "\r\n" + "	public void init() {\r\n");
                for (ElementInfo i : main.getIis()) {
                    if (i.getAnnotation().topLevel()) {
                        bw.write("		registerGlobalBeanDefinitionParser(\"" + i.getAnnotation().name() + "\", new " + i.getParserClassSimpleName() + "());\r\n");
                    } else {
                        for (ChildElementDeclarationInfo cedi : i.getUsedBy()) {
                            for (ChildElementInfo cei : cedi.getUsedBy()) {
                                TypeElement element = cei.getEi().getElement();
                                String clazz = AnnotUtils.getRuntimeClassName(element);
                                bw.write("		registerLocalBeanDefinitionParser(\"" + clazz + "\", \"" + i.getAnnotation().name() + "\", new " + i.getParserClassSimpleName() + "());\r\n");
                            }
                        }
                    }
                }
                bw.write("	}\r\n" + "}\r\n" + "");
            } finally {
                bw.close();
            }
        } catch (FilerException e) {
            if (e.getMessage().contains("Source file already created"))
                return;
            throw e;
        }
    }
}
Also used : ElementInfo(com.predic8.membrane.annot.model.ElementInfo) ChildElementInfo(com.predic8.membrane.annot.model.ChildElementInfo) TypeElement(javax.lang.model.element.TypeElement) Element(javax.lang.model.element.Element) TypeElement(javax.lang.model.element.TypeElement) ArrayList(java.util.ArrayList) ChildElementInfo(com.predic8.membrane.annot.model.ChildElementInfo) BufferedWriter(java.io.BufferedWriter) MainInfo(com.predic8.membrane.annot.model.MainInfo) FileObject(javax.tools.FileObject) FilerException(javax.annotation.processing.FilerException) ChildElementDeclarationInfo(com.predic8.membrane.annot.model.ChildElementDeclarationInfo)

Example 5 with ChildElementDeclarationInfo

use of com.predic8.membrane.annot.model.ChildElementDeclarationInfo in project service-proxy by membrane.

the class Parsers method writeParserDefinitior.

public void writeParserDefinitior(Model m) throws IOException {
    for (MainInfo main : m.getMains()) {
        List<Element> sources = new ArrayList<Element>();
        sources.addAll(main.getInterceptorElements());
        sources.add(main.getElement());
        try {
            FileObject o = processingEnv.getFiler().createSourceFile(main.getAnnotation().outputPackage() + ".NamespaceHandlerAutoGenerated", sources.toArray(new Element[0]));
            BufferedWriter bw = new BufferedWriter(o.openWriter());
            try {
                bw.write("/* Copyright 2012,2013 predic8 GmbH, www.predic8.com\r\n" + "\r\n" + "   Licensed under the Apache License, Version 2.0 (the \"License\");\r\n" + "   you may not use this file except in compliance with the License.\r\n" + "   You may obtain a copy of the License at\r\n" + "\r\n" + "   http://www.apache.org/licenses/LICENSE-2.0\r\n" + "\r\n" + "   Unless required by applicable law or agreed to in writing, software\r\n" + "   distributed under the License is distributed on an \"AS IS\" BASIS,\r\n" + "   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n" + "   See the License for the specific language governing permissions and\r\n" + "   limitations under the License. */\r\n" + "\r\n" + "package " + main.getAnnotation().outputPackage() + ";\r\n" + "\r\n" + "/**\r\n" + "  * Automatically generated by " + Parsers.class.getName() + ".\r\n" + "  */\r\n" + "public class NamespaceHandlerAutoGenerated {\r\n" + "\r\n" + "	public static void registerBeanDefinitionParsers(NamespaceHandler nh) {\r\n");
                for (ElementInfo i : main.getIis()) {
                    if (i.getAnnotation().topLevel()) {
                        bw.write("		nh.registerGlobalBeanDefinitionParser(\"" + i.getAnnotation().name() + "\", new " + i.getParserClassSimpleName() + "());\r\n");
                    } else {
                        for (ChildElementDeclarationInfo cedi : i.getUsedBy()) {
                            for (ChildElementInfo cei : cedi.getUsedBy()) {
                                TypeElement element = cei.getEi().getElement();
                                String clazz = AnnotUtils.getRuntimeClassName(element);
                                bw.write("		nh.registerLocalBeanDefinitionParser(\"" + clazz + "\", \"" + i.getAnnotation().name() + "\", new " + i.getParserClassSimpleName() + "());\r\n");
                            }
                        }
                    }
                }
                bw.write("	}\r\n" + "}\r\n" + "");
            } finally {
                bw.close();
            }
        } catch (FilerException e) {
            if (e.getMessage().contains("Source file already created"))
                return;
            throw e;
        }
    }
}
Also used : ElementInfo(com.predic8.membrane.annot.model.ElementInfo) ChildElementInfo(com.predic8.membrane.annot.model.ChildElementInfo) TypeElement(javax.lang.model.element.TypeElement) Element(javax.lang.model.element.Element) TypeElement(javax.lang.model.element.TypeElement) ArrayList(java.util.ArrayList) ChildElementInfo(com.predic8.membrane.annot.model.ChildElementInfo) BufferedWriter(java.io.BufferedWriter) MainInfo(com.predic8.membrane.annot.model.MainInfo) FileObject(javax.tools.FileObject) FilerException(javax.annotation.processing.FilerException) ChildElementDeclarationInfo(com.predic8.membrane.annot.model.ChildElementDeclarationInfo)

Aggregations

ChildElementDeclarationInfo (com.predic8.membrane.annot.model.ChildElementDeclarationInfo)5 ChildElementInfo (com.predic8.membrane.annot.model.ChildElementInfo)5 ElementInfo (com.predic8.membrane.annot.model.ElementInfo)4 MainInfo (com.predic8.membrane.annot.model.MainInfo)3 TypeElement (javax.lang.model.element.TypeElement)3 BufferedWriter (java.io.BufferedWriter)2 ArrayList (java.util.ArrayList)2 FilerException (javax.annotation.processing.FilerException)2 Element (javax.lang.model.element.Element)2 FileObject (javax.tools.FileObject)2 AttributeInfo (com.predic8.membrane.annot.model.AttributeInfo)1 Model (com.predic8.membrane.annot.model.Model)1 OtherAttributesInfo (com.predic8.membrane.annot.model.OtherAttributesInfo)1 TextContentInfo (com.predic8.membrane.annot.model.TextContentInfo)1 IOException (java.io.IOException)1 HashSet (java.util.HashSet)1 Map (java.util.Map)1 DeclaredType (javax.lang.model.type.DeclaredType)1 TypeMirror (javax.lang.model.type.TypeMirror)1