Search in sources :

Example 1 with AnnotationAt

use of net.jangaroo.exml.model.AnnotationAt in project jangaroo-tools by CoreMedia.

the class ExmlToModelParser method parse.

/**
   * Parse the input stream content into a model.
   * Close the input stream after reading.
   *
   * @param inputStream the input stream
   * @param model the model
   * @throws IOException  if the input stream could not be read
   * @throws SAXException if the XML was not well-formed
   */
private void parse(InputStream inputStream, ExmlModel model) throws IOException, SAXException {
    Document document = buildDom(inputStream);
    Node root = document.getFirstChild();
    validateRootNode(root);
    NamedNodeMap attributes = root.getAttributes();
    for (int i = 0; i < attributes.getLength(); i++) {
        Attr attribute = (Attr) attributes.item(i);
        //baseClass attribute has been specified, so the super class of the component is actually that
        if (Exmlc.EXML_BASE_CLASS_ATTRIBUTE.equals(attribute.getLocalName())) {
            model.setSuperClassName(attribute.getValue());
        } else if (Exmlc.EXML_PUBLIC_API_ATTRIBUTE.equals(attribute.getLocalName())) {
            PublicApiMode publicApiMode = Exmlc.parsePublicApiMode(attribute.getValue());
            switch(publicApiMode) {
                case TRUE:
                    model.addAnnotation(Jooc.PUBLIC_API_INCLUSION_ANNOTATION_NAME);
                // fall through!
                case CONFIG:
                    model.getConfigClass().addAnnotation(Jooc.PUBLIC_API_INCLUSION_ANNOTATION_NAME);
            }
        }
    }
    NodeList childNodes = root.getChildNodes();
    Element componentNode = null;
    for (int i = 0; i < childNodes.getLength(); i++) {
        Node node = childNodes.item(i);
        if (node.getNodeType() == Node.ELEMENT_NODE) {
            if (ExmlUtils.isExmlNamespace(node.getNamespaceURI())) {
                Element element = (Element) node;
                if (Exmlc.EXML_IMPORT_NODE_NAME.equals(node.getLocalName())) {
                    String importedClassName = element.getAttribute(Exmlc.EXML_IMPORT_CLASS_ATTRIBUTE);
                    if (importedClassName == null || importedClassName.equals("")) {
                        int lineNumber = getLineNumber(componentNode);
                        throw new ExmlcException("<exml:import> element must contain a non-empty class attribute", lineNumber);
                    }
                    model.addImport(importedClassName);
                } else if (Exmlc.EXML_ANNOTATION_NODE_NAME.equals(node.getLocalName())) {
                    AnnotationAt annotationAt = Exmlc.parseAnnotationAtValue(element.getAttribute(Exmlc.EXML_ANNOTATION_AT_ATTRIBUTE));
                    if (annotationAt != AnnotationAt.CONFIG) {
                        model.addAnnotation(element.getTextContent());
                    }
                } else if (Exmlc.EXML_CONSTANT_NODE_NAME.equals(node.getLocalName())) {
                    String constantTypeName = element.getAttribute(Exmlc.EXML_DECLARATION_TYPE_ATTRIBUTE);
                    model.addImport(constantTypeName);
                } else if (Exmlc.EXML_DESCRIPTION_NODE_NAME.equals(node.getLocalName())) {
                    model.setDescription(node.getTextContent());
                } else if (Exmlc.EXML_VAR_NODE_NAME.equals(node.getLocalName())) {
                    Declaration var = createDeclaration(element, model);
                    if (!model.getVars().contains(var)) {
                        model.addVar(var);
                    }
                } else if (Exmlc.EXML_CFG_NODE_NAME.equals(node.getLocalName())) {
                    String cfgName = element.getAttribute(Exmlc.EXML_CFG_NAME_ATTRIBUTE);
                    String cfgType = element.getAttribute(Exmlc.EXML_CFG_TYPE_ATTRIBUTE);
                    String cfgDefault = element.getAttribute(Exmlc.EXML_CFG_DEFAULT_ATTRIBUTE);
                    Element defaultValueElement = findChildElement(element, Exmlc.EXML_NAMESPACE_URI, Exmlc.EXML_CFG_DEFAULT_NODE_NAME);
                    if (cfgDefault.length() != 0 && defaultValueElement != null) {
                        throw new ExmlcException("<exml:cfg> default value must be specified as either an attribute or a sub-element, not both for config '" + cfgName + "'.", getLineNumber(element));
                    }
                    if (cfgDefault.length() > 0) {
                        model.getCfgDefaults().set(cfgName, getAttributeValue(cfgDefault, cfgType));
                        model.addImport(cfgType);
                    } else if (defaultValueElement != null) {
                        model.getCfgDefaults().set(cfgName, parseValue(model, "Array".equals(cfgType), getChildElements(defaultValueElement)));
                    }
                }
            } else {
                if (componentNode != null) {
                    int lineNumber = getLineNumber(componentNode);
                    throw new ExmlcException("root node of EXML contained more than one component definition", lineNumber);
                }
                componentNode = (Element) node;
            }
        }
    }
    if (componentNode == null) {
        return;
    }
    String superFullClassName = createFullConfigClassNameFromNode(componentNode);
    if (superFullClassName.equals(model.getConfigClass().getFullName())) {
        int lineNumber = getLineNumber(componentNode);
        throw new ExmlcException("Cyclic inheritance error: super class and this component are the same.", lineNumber);
    }
    ConfigClass superConfigClass = getConfigClassByName(superFullClassName, componentNode);
    String superComponentClassName = superConfigClass.getComponentClassName();
    if (model.getSuperClassName() == null) {
        model.setSuperClassName(superComponentClassName);
    }
    //but we still need the import
    model.addImport(superComponentClassName);
    fillModelAttributes(model, model.getJsonObject(), componentNode, superConfigClass);
}
Also used : NamedNodeMap(org.w3c.dom.NamedNodeMap) PublicApiMode(net.jangaroo.exml.model.PublicApiMode) Node(org.w3c.dom.Node) NodeList(org.w3c.dom.NodeList) Element(org.w3c.dom.Element) ExmlcException(net.jangaroo.exml.api.ExmlcException) Document(org.w3c.dom.Document) Attr(org.w3c.dom.Attr) AnnotationAt(net.jangaroo.exml.model.AnnotationAt) ConfigClass(net.jangaroo.exml.model.ConfigClass) Declaration(net.jangaroo.exml.model.Declaration)

Aggregations

ExmlcException (net.jangaroo.exml.api.ExmlcException)1 AnnotationAt (net.jangaroo.exml.model.AnnotationAt)1 ConfigClass (net.jangaroo.exml.model.ConfigClass)1 Declaration (net.jangaroo.exml.model.Declaration)1 PublicApiMode (net.jangaroo.exml.model.PublicApiMode)1 Attr (org.w3c.dom.Attr)1 Document (org.w3c.dom.Document)1 Element (org.w3c.dom.Element)1 NamedNodeMap (org.w3c.dom.NamedNodeMap)1 Node (org.w3c.dom.Node)1 NodeList (org.w3c.dom.NodeList)1