Details
Description
Its impossible now to keep namespaces used in outbound message template couse of "tmp['tagname1']['tagname2'].." syntax used for E4X
We can solve this provlem:
1. Parse message templates with namespaces: add docFactory.setNamespaceAware(true); in TreePanel.setMessage
2. Create treenodes with namespace in such form: <namespace>::<tagname> , use some predefined default for doc default namespace (for example, doc_ns)
3. Make MirthTree.constructPath return path of this form: prefix.<treenode.toString()>[<index>].<treenode.toString()>[<index>]. (tmp.doc_ns::patient.doc_ns::firstname)
4. Do not to remove the namespaces from templates in JavaScriptTransformer.generateScript (remove template.replace(/xmlns:?[^=]*=[\"\"][^\"\"]*[\"\"]/g, '');\n" )
4. Add namespace declarations to script in JavaScriptTransformer.generateScript, for example using this code:
...
scope.put("template", scope, template);
String src = "var tmp = new XML(template);\n" +
"var spaces = tmp.inScopeNamespaces();\n" +
"var result = '';\n" +
"for (var i=0; i<spaces.length; i++) {\n" +
"if ((spaces[i].prefix != undefined) && (spaces[i].prefix != ''))\n" +
" result = result + 'var ' + spaces[i].prefix + \" = new Namespace('\" + spaces[i].prefix + \"', '\" + spaces[i].uri + \"');\\n\";\n" +
" else\n" +
" result = result +\"var doc_ns = new Namespace('', '\" + spaces[i].uri + \"');\\n\";\n" +
"}\n" +
"result\n";
logger.info("Source : " +src);
Script script = context.compileString(src, "getNamespaces", 1, null);
// append namespaсe declarations to script, before oldScript
newScript.append(script.exec(context, scope).toString);
...
We can solve this provlem:
1. Parse message templates with namespaces: add docFactory.setNamespaceAware(true); in TreePanel.setMessage
2. Create treenodes with namespace in such form: <namespace>::<tagname> , use some predefined default for doc default namespace (for example, doc_ns)
3. Make MirthTree.constructPath return path of this form: prefix.<treenode.toString()>[<index>].<treenode.toString()>[<index>]. (tmp.doc_ns::patient.doc_ns::firstname)
4. Do not to remove the namespaces from templates in JavaScriptTransformer.generateScript (remove template.replace(/xmlns:?[^=]*=[\"\"][^\"\"]*[\"\"]/g, '');\n" )
4. Add namespace declarations to script in JavaScriptTransformer.generateScript, for example using this code:
...
scope.put("template", scope, template);
String src = "var tmp = new XML(template);\n" +
"var spaces = tmp.inScopeNamespaces();\n" +
"var result = '';\n" +
"for (var i=0; i<spaces.length; i++) {\n" +
"if ((spaces[i].prefix != undefined) && (spaces[i].prefix != ''))\n" +
" result = result + 'var ' + spaces[i].prefix + \" = new Namespace('\" + spaces[i].prefix + \"', '\" + spaces[i].uri + \"');\\n\";\n" +
" else\n" +
" result = result +\"var doc_ns = new Namespace('', '\" + spaces[i].uri + \"');\\n\";\n" +
"}\n" +
"result\n";
logger.info("Source : " +src);
Script script = context.compileString(src, "getNamespaces", 1, null);
// append namespaсe declarations to script, before oldScript
newScript.append(script.exec(context, scope).toString);
...

