use of com.dexels.navajo.mapping.compiler.meta.IncludeDependency in project navajo by Dexels.
the class TslCompiler method includeNode.
/**
* Resolve include nodes in the script: <include
* script="[name of script to be included]"/>
*
* @param scriptPath
* @param n
* @param parent
* @param deps
* @throws MetaCompileException
* @throws IOException
* @throws KeywordException
* @throws ClassNotFoundException
* @throws Exception
*/
private final void includeNode(String scriptPath, Node n, Document parent, String tenant, List<Dependency> deps) throws UserException, ClassNotFoundException, KeywordException, IOException, MetaCompileException {
included++;
if (included > 1000) {
throw new UserException(-1, "Too many included scripts!!!");
}
String script = ((Element) n).getAttribute("script");
if (script == null || script.equals("")) {
throw new UserException(-1, "No script name found in include tag (" + "missing or empty script attribute): " + n);
}
// Construct scriptName:
// First try if applicationGroup specific script exists.
String fileName = script + "_" + tenant;
Document includeDoc = null;
String includeFileName = fetchScriptFileName(scriptPath + "/" + fileName);
File includedFile = null;
if (includeFileName != null) {
includedFile = new File(includeFileName);
includeDoc = XMLDocumentUtils.createDocument(new FileInputStream(includeFileName), false);
} else {
// no tenant specific include found. Try non-tenant include instead.
fileName = script;
includeFileName = fetchScriptFileName(scriptPath + "/" + fileName);
if (includeFileName != null) {
includedFile = new File(includeFileName);
if (includeFileName.endsWith(".ns")) {
// It's an NS3 based script
NS3ToNSXML nstoxml = new NS3ToNSXML();
nstoxml.initialize();
try {
String content = nstoxml.read(includeFileName);
String tslResult = MapMetaData.getInstance().parse(scriptPath + "/" + fileName + ".ns", nstoxml.parseNavascript(content));
includeDoc = XMLDocumentUtils.createDocument(new ByteArrayInputStream(tslResult.getBytes()), false);
} catch (Exception e) {
throw new UserException(e.getLocalizedMessage(), e);
}
} else {
// It's an XML based script
includeDoc = XMLDocumentUtils.createDocument(new FileInputStream(includedFile), false);
}
}
}
if (includedFile == null) {
logger.error("Could not file include file: {}", script);
throw new UserException("Could not find include file for script: " + script);
}
// Add dependency.
addDependency("dependentObjects.add( new IncludeDependency( Long.valueOf(\"" + IncludeDependency.getFileTimeStamp(includedFile) + "\"), \"" + fileName + "\"));\n", "INCLUDE" + script);
deps.add(new IncludeDependency(IncludeDependency.getFileTimeStamp(includedFile), fileName, fileName));
if (includeDoc.getElementsByTagName("tsl").item(0) == null) {
// Maybe
// it is
// navascript??
String tslResult = MapMetaData.getInstance().parse(scriptPath + "/" + fileName + ".xml");
includeDoc = XMLDocumentUtils.createDocument(new ByteArrayInputStream(tslResult.getBytes()), false);
}
NodeList content = includeDoc.getElementsByTagName("tsl").item(0).getChildNodes();
Node nextNode = n.getNextSibling();
while (nextNode != null && !(nextNode instanceof Element)) {
nextNode = nextNode.getNextSibling();
}
if (nextNode == null || !(nextNode instanceof Element)) {
nextNode = n;
}
Node parentNode = nextNode.getParentNode();
for (int i = 0; i < content.getLength(); i++) {
Node child = content.item(i);
Node imported = parent.importNode(child.cloneNode(true), true);
parentNode.insertBefore(imported, nextNode);
}
parentNode.removeChild(n);
}
Aggregations