Flexmi: parse EGL templates just once
diff --git a/plugins/org.eclipse.epsilon.flexmi/src/org/eclipse/epsilon/flexmi/templates/EglTemplate.java b/plugins/org.eclipse.epsilon.flexmi/src/org/eclipse/epsilon/flexmi/templates/EglTemplate.java
index edbaf80..1b93e59 100644
--- a/plugins/org.eclipse.epsilon.flexmi/src/org/eclipse/epsilon/flexmi/templates/EglTemplate.java
+++ b/plugins/org.eclipse.epsilon.flexmi/src/org/eclipse/epsilon/flexmi/templates/EglTemplate.java
@@ -14,6 +14,7 @@
import org.eclipse.epsilon.egl.EglTemplateFactory;
import org.eclipse.epsilon.egl.EglTemplateFactoryModuleAdapter;
+import org.eclipse.epsilon.eol.execute.context.FrameType;
import org.eclipse.epsilon.flexmi.FlexmiResource;
import org.eclipse.epsilon.flexmi.xml.Xml;
import org.w3c.dom.Document;
@@ -21,6 +22,8 @@
public class EglTemplate extends DynamicTemplate {
+ protected EglTemplateFactoryModuleAdapter module;
+
public EglTemplate(Element element, FlexmiResource resource, URI uri) {
super(element, resource, uri);
}
@@ -28,15 +31,26 @@
@Override
public List<Element> getApplication(Element call) {
try {
- EglTemplateFactoryModuleAdapter module = new EglTemplateFactoryModuleAdapter(new EglTemplateFactory());
- module.parse(content.getTextContent().trim(), uri);
- if (!module.getParseProblems().isEmpty()) throw new RuntimeException(module.getParseProblems().get(0).toString());
-
+ if (module == null) {
+ module = new EglTemplateFactoryModuleAdapter(new EglTemplateFactory());
+ module.parse(content.getTextContent().trim(), uri);
+ if (!module.getParseProblems().isEmpty())
+ throw new RuntimeException(module.getParseProblems().get(0).toString());
+ }
+
+ module.getContext().getFrameStack().enterLocal(FrameType.UNPROTECTED, module);
+
prepareModule(module, call);
String xml = "<?xml version=\"1.0\"?><root>" + (module.execute() + "").trim() + "</root>";
Document document = Xml.parse(xml);
replaceSlots(call, document.getDocumentElement());
+
+ module.getContext().getFrameStack().leaveLocal(module);
+
+ // reset for next template application
+ module.getCurrentTemplate().reset();
+
return Xml.getChildren(document.getDocumentElement());
} catch (Exception e) {