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);
}
}
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
}
}
}
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);
}
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);
}
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());
}
Aggregations