Flexmi: use a map to store templates (3x speedup)
diff --git a/plugins/org.eclipse.epsilon.flexmi/src/org/eclipse/epsilon/flexmi/FlexmiResource.java b/plugins/org.eclipse.epsilon.flexmi/src/org/eclipse/epsilon/flexmi/FlexmiResource.java
index 617c2f6..f264a54 100644
--- a/plugins/org.eclipse.epsilon.flexmi/src/org/eclipse/epsilon/flexmi/FlexmiResource.java
+++ b/plugins/org.eclipse.epsilon.flexmi/src/org/eclipse/epsilon/flexmi/FlexmiResource.java
@@ -63,7 +63,7 @@
protected StringSimilarityProvider stringSimilarityProvider = new CachedStringSimilarityProvider(new DefaultStringSimilarityProvider());
protected Stack<URI> parsedFragmentURIStack = new Stack<>();
protected Set<URI> parsedFragmentURIs = new HashSet<>();
- protected List<Template> templates = new ArrayList<>();
+ protected Map<String, Template> templates = new HashMap<>();
protected BiMap<String, EObject> fullyQualifiedIDs = HashBiMap.create();
protected Map<EObject, String> localIDs = new HashMap<>();
protected FrameStack frameStack = new FrameStack();
@@ -86,19 +86,18 @@
return parsedFragmentURIs;
}
- public List<Template> getTemplates() {
- return templates;
+ public void addTemplate(Template template) {
+ templates.put(template.getName(), template);
}
- public Template getTemplate(String name) {
- for (Template template : templates) {
- if (template.getName().equals(name)) {
- return template;
- }
- }
- return null;
+ public Template getTemplate(String templateName) {
+ return templates.get(templateName);
}
+ public Collection<Template> getTemplates() {
+ return templates.values();
+ }
+
public static void main(String[] args) throws Exception {
// Load the metamodel
@@ -799,5 +798,5 @@
if (importedFrom == null) return this;
else return importedFrom.getRootResource();
}
-
+
}
diff --git a/plugins/org.eclipse.epsilon.flexmi/src/org/eclipse/epsilon/flexmi/xml/FlexmiXmlParser.java b/plugins/org.eclipse.epsilon.flexmi/src/org/eclipse/epsilon/flexmi/xml/FlexmiXmlParser.java
index 328b8a2..ecbfaef 100644
--- a/plugins/org.eclipse.epsilon.flexmi/src/org/eclipse/epsilon/flexmi/xml/FlexmiXmlParser.java
+++ b/plugins/org.eclipse.epsilon.flexmi/src/org/eclipse/epsilon/flexmi/xml/FlexmiXmlParser.java
@@ -78,13 +78,13 @@
if (isFlexmiRootNode(document.getDocumentElement())) {
for (Element templateElement : Xml.getChildren(document.getDocumentElement(), Template.NODE_NAME)) {
- resource.getTemplates().add(TemplateFactory.getInstance().createTemplate(templateElement, resource, new java.net.URI(uri.toString())));
+ resource.addTemplate(TemplateFactory.getInstance().createTemplate(templateElement, resource, new java.net.URI(uri.toString())));
document.getDocumentElement().removeChild(templateElement);
}
}
else {
if (isTemplate(document.getDocumentElement())) {
- resource.getTemplates().add(TemplateFactory.getInstance().createTemplate(document.getDocumentElement(), resource, new java.net.URI(uri.toString())));
+ resource.addTemplate(TemplateFactory.getInstance().createTemplate(document.getDocumentElement(), resource, new java.net.URI(uri.toString())));
document.removeChild(document.getDocumentElement());
return;
}
diff --git a/tests/org.eclipse.epsilon.flexmi.test/src/org/eclipse/epsilon/flexmi/test/TemplateTests.java b/tests/org.eclipse.epsilon.flexmi.test/src/org/eclipse/epsilon/flexmi/test/TemplateTests.java
index eb892e5..5d0e3d4 100644
--- a/tests/org.eclipse.epsilon.flexmi.test/src/org/eclipse/epsilon/flexmi/test/TemplateTests.java
+++ b/tests/org.eclipse.epsilon.flexmi.test/src/org/eclipse/epsilon/flexmi/test/TemplateTests.java
@@ -23,8 +23,8 @@
FlexmiResource resource = loadResource("templates/model-with-template.flexmi");
assertEquals(0, resource.getWarnings().size());
assertEquals(3, resource.getTemplates().size());
- assertEquals("t1", resource.getTemplates().get(0).getName());
- assertEquals("p", resource.getTemplates().get(0).getParameters().get(0).getName());
+ assertTrue(resource.getTemplate("t1") != null);
+ assertEquals("p", resource.getTemplate("t1").getParameters().get(0).getName());
}
@Test