Search in sources :

Example 6 with LayerDescriptor

use of org.qi4j.api.structure.LayerDescriptor in project qi4j-sdk by Qi4j.

the class Model2XML method map.

@Override
public Document map(ApplicationDescriptor Application) {
    try {
        DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        final Document document = builder.newDocument();
        final Stack<Node> current = new Stack<Node>();
        current.push(document);
        Application.accept(new HierarchicalVisitor<Object, Object, DOMException>() {

            @Override
            public boolean visitEnter(Object visited) throws DOMException {
                String mapping = simpleMappings.get(visited.getClass().getSimpleName());
                if (mapping != null) {
                    Node node = document.createElement("mapping");
                    current.push(node);
                } else if (visited instanceof ApplicationDescriptor) {
                    ApplicationDescriptor applicationDescriptor = (ApplicationDescriptor) visited;
                    Node application = document.createElement("application");
                    addAttribute("name", applicationDescriptor.name(), application);
                    current.push(application);
                } else if (visited instanceof LayerDescriptor) {
                    LayerDescriptor layerDescriptor = (LayerDescriptor) visited;
                    Node layer = document.createElement("layer");
                    addAttribute("name", layerDescriptor.name(), layer);
                    current.push(layer);
                } else if (visited instanceof ModuleDescriptor) {
                    ModuleDescriptor moduleDescriptor = (ModuleDescriptor) visited;
                    Node module = document.createElement("module");
                    addAttribute("name", moduleDescriptor.name(), module);
                    current.push(module);
                } else if (visited instanceof TransientDescriptor) {
                    TransientDescriptor descriptor = (TransientDescriptor) visited;
                    Node node = document.createElement("transient");
                    addAttribute("type", first(descriptor.types()).getName(), node);
                    addAttribute("visibility", descriptor.visibility().name(), node);
                    current.push(node);
                } else if (visited instanceof MethodDescriptor) {
                    MethodDescriptor descriptor = (MethodDescriptor) visited;
                    Node node = document.createElement("method");
                    addAttribute("name", descriptor.method().getName(), node);
                    current.push(node);
                } else if (visited instanceof MixinDescriptor) {
                    MixinDescriptor descriptor = (MixinDescriptor) visited;
                    Node node = document.createElement("mixin");
                    addAttribute("class", descriptor.mixinClass().getName(), node);
                    current.push(node);
                } else if (visited instanceof DependencyDescriptor) {
                    DependencyDescriptor descriptor = (DependencyDescriptor) visited;
                    Node node = document.createElement("dependency");
                    addAttribute("annotation", descriptor.injectionAnnotation().toString(), node);
                    addAttribute("injection", descriptor.injectionType().toString(), node);
                    addAttribute("optional", Boolean.toString(descriptor.optional()), node);
                    current.push(node);
                } else {
                    Element element = document.createElement(visited.getClass().getSimpleName());
                    current.push(element);
                }
                return true;
            }

            @Override
            public boolean visitLeave(Object visited) throws DOMException {
                Node node = current.pop();
                if (node.getChildNodes().getLength() == 0 && node.getAttributes().getLength() == 0) {
                    return true;
                }
                current.peek().appendChild(node);
                return true;
            }

            @Override
            public boolean visit(Object visited) throws DOMException {
                Element element;
                if (visited instanceof DependencyDescriptor) {
                    DependencyDescriptor descriptor = (DependencyDescriptor) visited;
                    element = document.createElement("dependency");
                    addAttribute("annotation", descriptor.injectionAnnotation().toString(), element);
                    addAttribute("injection", descriptor.injectionType().toString(), element);
                    addAttribute("optional", Boolean.toString(descriptor.optional()), element);
                } else {
                    element = document.createElement(visited.getClass().getSimpleName());
                }
                current.peek().appendChild(element);
                return true;
            }

            private void addAttribute(String name, String value, Node node) {
                Attr attr = document.createAttribute(name);
                attr.setValue(value);
                ((Element) node).setAttributeNode(attr);
            }
        });
        return document;
    } catch (Exception exception) {
        throw new IllegalArgumentException(exception);
    }
}
Also used : DependencyDescriptor(org.qi4j.api.composite.DependencyDescriptor) Node(org.w3c.dom.Node) Element(org.w3c.dom.Element) MixinDescriptor(org.qi4j.api.mixin.MixinDescriptor) Document(org.w3c.dom.Document) MethodDescriptor(org.qi4j.api.composite.MethodDescriptor) ApplicationDescriptor(org.qi4j.api.structure.ApplicationDescriptor) Attr(org.w3c.dom.Attr) DOMException(org.w3c.dom.DOMException) Stack(java.util.Stack) DOMException(org.w3c.dom.DOMException) ModuleDescriptor(org.qi4j.api.structure.ModuleDescriptor) DocumentBuilder(javax.xml.parsers.DocumentBuilder) TransientDescriptor(org.qi4j.api.composite.TransientDescriptor) LayerDescriptor(org.qi4j.api.structure.LayerDescriptor)

Aggregations

LayerDescriptor (org.qi4j.api.structure.LayerDescriptor)6 ModuleDescriptor (org.qi4j.api.structure.ModuleDescriptor)4 ApplicationDescriptor (org.qi4j.api.structure.ApplicationDescriptor)3 HashSet (java.util.HashSet)2 MethodDescriptor (org.qi4j.api.composite.MethodDescriptor)2 TransientDescriptor (org.qi4j.api.composite.TransientDescriptor)2 EntityDescriptor (org.qi4j.api.entity.EntityDescriptor)2 ArrayDeque (java.util.ArrayDeque)1 ArrayList (java.util.ArrayList)1 Stack (java.util.Stack)1 Matcher (java.util.regex.Matcher)1 DocumentBuilder (javax.xml.parsers.DocumentBuilder)1 Test (org.junit.Test)1 QualifiedName (org.qi4j.api.common.QualifiedName)1 CompositeDescriptor (org.qi4j.api.composite.CompositeDescriptor)1 DependencyDescriptor (org.qi4j.api.composite.DependencyDescriptor)1 MixinDescriptor (org.qi4j.api.mixin.MixinDescriptor)1 ObjectDescriptor (org.qi4j.api.object.ObjectDescriptor)1 Application (org.qi4j.api.structure.Application)1 UsedLayersDescriptor (org.qi4j.api.structure.UsedLayersDescriptor)1