Automatically try to locate and add missing metamodels (refs #560843)
diff --git a/core/plugins/org.hawk.emf/src/org/hawk/emf/model/EMFModelResourceFactory.java b/core/plugins/org.hawk.emf/src/org/hawk/emf/model/EMFModelResourceFactory.java
index 288f449..7c2caeb 100644
--- a/core/plugins/org.hawk.emf/src/org/hawk/emf/model/EMFModelResourceFactory.java
+++ b/core/plugins/org.hawk.emf/src/org/hawk/emf/model/EMFModelResourceFactory.java
@@ -19,7 +19,6 @@
import java.io.File;
import java.util.HashSet;
-import java.util.Map;
import java.util.Set;
import org.eclipse.emf.common.util.URI;
diff --git a/core/plugins/org.hawk.graph/src/org/hawk/graph/updater/GraphMetaModelResourceInjector.java b/core/plugins/org.hawk.graph/src/org/hawk/graph/updater/GraphMetaModelResourceInjector.java
index 1ff8602..1064bda 100644
--- a/core/plugins/org.hawk.graph/src/org/hawk/graph/updater/GraphMetaModelResourceInjector.java
+++ b/core/plugins/org.hawk.graph/src/org/hawk/graph/updater/GraphMetaModelResourceInjector.java
@@ -277,7 +277,7 @@
LOGGER.info("Updating any relevant derived attributes...");
try {
- new GraphModelInserter(hawk, () -> del, new TypeCache())
+ new GraphModelInserter(hawk, () -> del, new TypeCache(hawk))
.updateDerivedAttributes(hawk.getDerivedAttributeExecutionEngine(), toBeUpdated);
toBeUpdated = new HashSet<>();
} catch (Exception e) {
diff --git a/core/plugins/org.hawk.graph/src/org/hawk/graph/updater/GraphModelUpdater.java b/core/plugins/org.hawk.graph/src/org/hawk/graph/updater/GraphModelUpdater.java
index 45e6f42..d801a89 100644
--- a/core/plugins/org.hawk.graph/src/org/hawk/graph/updater/GraphModelUpdater.java
+++ b/core/plugins/org.hawk.graph/src/org/hawk/graph/updater/GraphModelUpdater.java
@@ -52,7 +52,7 @@
protected IModelIndexer indexer;
protected IConsole console;
- protected TypeCache typeCache = new TypeCache();
+ protected TypeCache typeCache;
private boolean isActive = false;
protected Set<IGraphNode> toBeUpdated = new HashSet<>();
@@ -60,6 +60,7 @@
public void run(IConsole c, IModelIndexer hawk) throws Exception {
this.indexer = hawk;
this.console = c;
+ this.typeCache = new TypeCache(hawk);
}
@Override
@@ -174,7 +175,7 @@
+ "ms [proxy update]");
// Clear the type cache by creating a new one and letting the old one be GC'ed
- typeCache = new TypeCache();
+ typeCache = new TypeCache(indexer);
}
public boolean isActive() {
diff --git a/core/plugins/org.hawk.graph/src/org/hawk/graph/updater/TypeCache.java b/core/plugins/org.hawk.graph/src/org/hawk/graph/updater/TypeCache.java
index ca33eec..f3557cd 100644
--- a/core/plugins/org.hawk.graph/src/org/hawk/graph/updater/TypeCache.java
+++ b/core/plugins/org.hawk.graph/src/org/hawk/graph/updater/TypeCache.java
@@ -16,16 +16,21 @@
******************************************************************************/
package org.hawk.graph.updater;
+import java.util.Arrays;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.Map;
import java.util.NoSuchElementException;
+import org.hawk.core.IMetaModelResourceFactory;
import org.hawk.core.IModelIndexer;
import org.hawk.core.graph.IGraphDatabase;
import org.hawk.core.graph.IGraphEdge;
+import org.hawk.core.graph.IGraphIterable;
import org.hawk.core.graph.IGraphNode;
import org.hawk.core.model.IHawkClass;
import org.hawk.core.model.IHawkClassifier;
+import org.hawk.core.model.IHawkMetaModelResource;
import org.hawk.graph.Slot;
import org.hawk.graph.TypeNode;
import org.slf4j.Logger;
@@ -42,6 +47,11 @@
private Map<IHawkClass, IGraphNode> hashedEClasses = new HashMap<>();
private Map<IGraphNode, Map<String, Slot>> hashedEClassSlots = new HashMap<>();
+ private IModelIndexer hawk;
+
+ public TypeCache(IModelIndexer hawk) {
+ this.hawk = hawk;
+ }
public IGraphNode getEClassNode(IGraphDatabase graph, IHawkClassifier e) throws Exception {
IHawkClass eClass = null;
@@ -56,12 +66,27 @@
if (classnode == null) {
final String packageNSURI = eClass.getPackageNSURI();
IGraphNode ePackageNode = null;
+
+ final IGraphIterable<? extends IGraphNode> iterMM = graph.getMetamodelIndex().get("id", packageNSURI);
+ if (!iterMM.iterator().hasNext()) {
+ // Metamodel is not in the store, try to find it
+ LOGGER.info("Metamodel {} is not in the graph, trying to locate it", packageNSURI);
+ for (IMetaModelResourceFactory mmp : hawk.getMetaModelParsers()) {
+ IHawkMetaModelResource mr = mmp.getMetamodel(packageNSURI);
+ if (mr != null) {
+ LOGGER.info("Found metamodel for {}, inserting", packageNSURI);
+ final HashSet<IHawkMetaModelResource> setMR = new HashSet<>(Arrays.asList(mr));
+ hawk.getMetaModelUpdater().insertMetamodels(setMR, hawk);
+ }
+ }
+ }
+
try {
- ePackageNode = graph.getMetamodelIndex().get("id", packageNSURI).getSingle();
+ ePackageNode = iterMM.getSingle();
} catch (NoSuchElementException ex) {
throw new Exception(String.format(
- "Metamodel %s does not have a Node associated with it in the store, please make sure it has been inserted",
- packageNSURI));
+ "Metamodel %s does not have a Node associated with it in the store, please make sure it has been inserted",
+ packageNSURI));
} catch (Exception e2) {
LOGGER.error("Error while finding metamodel node", e2);
}