Search in sources :

Example 6 with ExmlcException

use of net.jangaroo.exml.api.ExmlcException in project jangaroo-tools by CoreMedia.

the class ExmlSourceFile method parseExmlToConfigClass.

public ConfigClass parseExmlToConfigClass() {
    try {
        ConfigClass configClass = new ExmlToConfigClassParser().parseExmlToConfigClass(getSourceFile());
        configClass.setFullName(getConfigClassName());
        configClass.setComponentClassName(getTargetClassName());
        return configClass;
    } catch (IOException e) {
        // TODO Log and continue?
        throw new ExmlcException("could not read EXML file", e);
    }
}
Also used : ExmlcException(net.jangaroo.exml.api.ExmlcException) IOException(java.io.IOException) ExmlToConfigClassParser(net.jangaroo.exml.parser.ExmlToConfigClassParser)

Example 7 with ExmlcException

use of net.jangaroo.exml.api.ExmlcException in project jangaroo-tools by CoreMedia.

the class ExmlToConfigClassParser method parseFileWithHandler.

public static void parseFileWithHandler(File source, ContentHandler handler) {
    InputStream inputStream = null;
    try {
        inputStream = new FileInputStream(source);
        XMLReader xr = XMLReaderFactory.createXMLReader();
        xr.setContentHandler(handler);
        if (handler instanceof LexicalHandler) {
            xr.setProperty("http://xml.org/sax/properties/lexical-handler", handler);
        }
        xr.parse(new org.xml.sax.InputSource(inputStream));
    } catch (ExmlcException e) {
        // Simply pass our own exceptions.
        e.setFile(source);
        throw e;
    } catch (Exception e) {
        throw new ExmlcException("could not parse EXML file", source, e);
    } finally {
        try {
            if (inputStream != null) {
                inputStream.close();
            }
        } catch (IOException e) {
        //never happened
        }
    }
}
Also used : LexicalHandler(org.xml.sax.ext.LexicalHandler) FileInputStream(java.io.FileInputStream) InputStream(java.io.InputStream) ExmlcException(net.jangaroo.exml.api.ExmlcException) IOException(java.io.IOException) FileInputStream(java.io.FileInputStream) XMLReader(org.xml.sax.XMLReader) ExmlcException(net.jangaroo.exml.api.ExmlcException) IOException(java.io.IOException)

Example 8 with ExmlcException

use of net.jangaroo.exml.api.ExmlcException in project jangaroo-tools by CoreMedia.

the class ExmlToModelParser method createDeclaration.

private Declaration createDeclaration(Element element, ExmlModel model) {
    final String name = element.getAttribute(Exmlc.EXML_DECLARATION_NAME_ATTRIBUTE);
    String type = element.getAttribute(Exmlc.EXML_DECLARATION_TYPE_ATTRIBUTE);
    if (type == null || type.isEmpty()) {
        type = AS3Type.ANY.toString();
    }
    final NodeList valueElements = element.getElementsByTagNameNS(Exmlc.EXML_NAMESPACE_URI, Exmlc.EXML_DECLARATION_VALUE_NODE_NAME);
    final Object valueObject;
    boolean addTypeCast = false;
    if (valueElements.getLength() > 0) {
        if (element.hasAttribute(Exmlc.EXML_DECLARATION_VALUE_ATTRIBUTE)) {
            throw new ExmlcException("The value of <exml:var> or <exml:const> '\" + name + \"' must be specified as either an attribute or a sub-element, not both.", getLineNumber(element));
        }
        Element valueElement = (Element) valueElements.item(0);
        final List<Element> valueChildElements = getChildElements(valueElement);
        if (valueChildElements.isEmpty()) {
            valueObject = getAttributeValue(valueElement.getTextContent(), type);
        } else {
            valueObject = parseValue(model, "Array".equals(type), valueChildElements);
            addTypeCast = !AS3Type.ANY.toString().equals(type) && !ApplyExpr.isCoerceFunction(type);
        }
    } else {
        valueObject = getAttributeValue(element.getAttribute(Exmlc.EXML_DECLARATION_VALUE_ATTRIBUTE), type);
    }
    String value = JsonObject.valueToString(valueObject, 2, 4);
    if (addTypeCast) {
        value = type + "(" + value + ")";
    }
    return new Declaration(name, value, type);
}
Also used : NodeList(org.w3c.dom.NodeList) ExmlcException(net.jangaroo.exml.api.ExmlcException) Element(org.w3c.dom.Element) JsonObject(net.jangaroo.exml.json.JsonObject) Declaration(net.jangaroo.exml.model.Declaration)

Example 9 with ExmlcException

use of net.jangaroo.exml.api.ExmlcException 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)

Example 10 with ExmlcException

use of net.jangaroo.exml.api.ExmlcException in project jangaroo-tools by CoreMedia.

the class AbstractExmlCompileMojo method execute.

public void execute() throws MojoExecutionException, MojoFailureException {
    File gSourcesDirectory = getGeneratedSourcesDirectory();
    if (!gSourcesDirectory.exists()) {
        getLog().info("generating sources into: " + gSourcesDirectory.getPath());
        getLog().debug("created " + gSourcesDirectory.mkdirs());
    }
    if (!generatedResourcesDirectory.exists()) {
        getLog().info("generating resources into: " + generatedResourcesDirectory.getPath());
        getLog().debug("created " + generatedResourcesDirectory.mkdirs());
    }
    List<File> sourcePath = getSourcePath();
    ExmlConfiguration exmlConfiguration = createExmlConfiguration(getActionScriptClassPath(), sourcePath, gSourcesDirectory);
    exmlConfiguration.setResourceOutputDirectory(generatedResourcesDirectory);
    exmlConfiguration.setSourceFiles(getMavenPluginHelper().computeStaleSources(sourcePath, includes, excludes, gSourcesDirectory, Exmlc.EXML_SUFFIX, Jooc.AS_SUFFIX, staleMillis));
    if (StringUtils.isNotEmpty(validationMode)) {
        try {
            exmlConfiguration.setValidationMode(ValidationMode.valueOf(validationMode.toUpperCase()));
        } catch (IllegalArgumentException e) {
            throw new MojoFailureException("The specified EXML validation mode '" + validationMode + "' is unsupported. " + "Legal values are 'error', 'warn', and 'off'.");
        }
    }
    CompileLog compileLog = new MavenCompileLog();
    exmlConfiguration.setLog(compileLog);
    Exmlc exmlc;
    try {
        getLog().debug("Exmlc configuration: " + exmlConfiguration);
        exmlc = new Exmlc(exmlConfiguration);
        executeExmlc(exmlc);
    } catch (ExmlcException e) {
        throw new MojoFailureException(e.toString(), e);
    }
    if (compileLog.hasErrors()) {
        throw new MojoFailureException("There were EXML compiler errors, see log for details.");
    }
    getProject().addCompileSourceRoot(gSourcesDirectory.getPath());
}
Also used : Exmlc(net.jangaroo.exml.compiler.Exmlc) ExmlcException(net.jangaroo.exml.api.ExmlcException) MojoFailureException(org.apache.maven.plugin.MojoFailureException) ExmlConfiguration(net.jangaroo.exml.config.ExmlConfiguration) File(java.io.File) CompileLog(net.jangaroo.jooc.api.CompileLog)

Aggregations

ExmlcException (net.jangaroo.exml.api.ExmlcException)12 IOException (java.io.IOException)6 File (java.io.File)5 Element (org.w3c.dom.Element)3 InputStream (java.io.InputStream)2 JsonObject (net.jangaroo.exml.json.JsonObject)2 ConfigClass (net.jangaroo.exml.model.ConfigClass)2 Declaration (net.jangaroo.exml.model.Declaration)2 NodeList (org.w3c.dom.NodeList)2 Environment (freemarker.core.Environment)1 Configuration (freemarker.template.Configuration)1 DefaultObjectWrapper (freemarker.template.DefaultObjectWrapper)1 Template (freemarker.template.Template)1 FileInputStream (java.io.FileInputStream)1 FileOutputStream (java.io.FileOutputStream)1 OutputStreamWriter (java.io.OutputStreamWriter)1 UnsupportedEncodingException (java.io.UnsupportedEncodingException)1 Writer (java.io.Writer)1 ArrayList (java.util.ArrayList)1 Exmlc (net.jangaroo.exml.compiler.Exmlc)1