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);
 			}