Support pinset templates in picto EGX visualisations
diff --git a/examples/org.eclipse.epsilon.examples.picto.socialnetwork/picto/persons2table.pinset b/examples/org.eclipse.epsilon.examples.picto.socialnetwork/picto/persons2table.pinset
new file mode 100644
index 0000000..5849c32
--- /dev/null
+++ b/examples/org.eclipse.epsilon.examples.picto.socialnetwork/picto/persons2table.pinset
@@ -0,0 +1,15 @@
+dataset personStats over person : Person {
+	properties[name]
+	
+	column liked_by : Person.all.select(p | p.likes.includes(person)).size()
+	column liking : person.likes.size()
+	
+	column disliked_by : Person.all.select(p | p.dislikes.includes(person)).size()
+	column disliking : person.dislikes.size()
+	
+	column like_meter : liked_by - disliked_by
+}
+
+dataset otherStats over p : Person {
+	properties[name]
+}
diff --git a/examples/org.eclipse.epsilon.examples.picto.socialnetwork/picto/socialnetwork.egx b/examples/org.eclipse.epsilon.examples.picto.socialnetwork/picto/socialnetwork.egx
index 3a23e43..2c05d0a 100644
--- a/examples/org.eclipse.epsilon.examples.picto.socialnetwork/picto/socialnetwork.egx
+++ b/examples/org.eclipse.epsilon.examples.picto.socialnetwork/picto/socialnetwork.egx
@@ -38,6 +38,19 @@
 	

 }

 

+rule Persons2Table {

+

+	template : "persons2table.pinset"

+

+	parameters : Map {

+		"path" = Sequence{"Stats"},

+		"icon" = "table",

+		"format" = "csv"

+		

+		// ,"pinsetrule" = "otherStats"

+	}

+}

+

 @lazy

 rule Persons2Graphviz {

 

diff --git a/plugins/org.eclipse.epsilon.picto/META-INF/MANIFEST.MF b/plugins/org.eclipse.epsilon.picto/META-INF/MANIFEST.MF
index 3319350..8894701 100644
--- a/plugins/org.eclipse.epsilon.picto/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.epsilon.picto/META-INF/MANIFEST.MF
@@ -18,6 +18,7 @@
  org.eclipse.emf.edit,
  org.eclipse.epsilon.common.dt;visibility:=reexport,
  org.eclipse.epsilon.egl.engine;visibility:=reexport,
+ org.eclipse.epsilon.pinset.engine,
  org.eclipse.epsilon.emc.emf,
  org.eclipse.ui.ide,
  org.eclipse.emf.emfatic.ui;resolution:=optional,
diff --git a/plugins/org.eclipse.epsilon.picto/src/org/eclipse/epsilon/picto/LazyEgxModule.java b/plugins/org.eclipse.epsilon.picto/src/org/eclipse/epsilon/picto/LazyEgxModule.java
index 8ea730a..214b670 100644
--- a/plugins/org.eclipse.epsilon.picto/src/org/eclipse/epsilon/picto/LazyEgxModule.java
+++ b/plugins/org.eclipse.epsilon.picto/src/org/eclipse/epsilon/picto/LazyEgxModule.java
@@ -14,6 +14,7 @@
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
+
 import org.eclipse.epsilon.common.module.ModuleElement;
 import org.eclipse.epsilon.common.parse.AST;
 import org.eclipse.epsilon.egl.EglTemplate;
@@ -29,6 +30,8 @@
 import org.eclipse.epsilon.eol.execute.context.IEolContext;
 import org.eclipse.epsilon.eol.execute.context.Variable;
 import org.eclipse.epsilon.eol.types.EolAnyType;
+import org.eclipse.epsilon.pinset.DatasetRule;
+import org.eclipse.epsilon.pinset.PinsetModule;
 
 public class LazyEgxModule extends EgxModule {
 	
@@ -153,7 +156,46 @@
 		@Override
 		public String getContent() throws Exception {
 			if (templateUri == null) return "";
-			
+
+			if (templateUri.toString().endsWith(".pinset")) {
+				PinsetModule module = new PinsetModule();
+				module.setContext(context);
+				module.persistDatasets(false);
+				module.parse(templateUri);
+
+				String ruleName = null;
+				for (Variable variable : variables) {
+					if (variable.getName().equalsIgnoreCase("pinsetrule")) {
+						ruleName = "" + variable.getValue();
+						break;
+					}
+				}
+
+				DatasetRule rule = null;
+				if (ruleName != null) {
+					rule = module.getDatasetRule(ruleName);
+					if (rule == null) {
+						throw new RuntimeException("Pinset rule \"" + ruleName + "\" not found");
+					}
+				}
+				else {
+					rule = module.getDatasetRules().get(0);
+				}
+
+				context.getFrameStack().enterLocal(FrameType.PROTECTED, module,
+						variables.toArray(new Variable[variables.size()]));
+
+				module.preExecution();
+				rule.execute(module.getContext());
+
+				context.getFrameStack().leaveLocal(module);
+
+				String content = rule.getDataset().toString(module.getSeparator());
+				rule.dispose();
+
+				return content;
+			}
+
 			EglTemplate template = null;
 			if (templateCache == null || (template = templateCache.get(templateUri)) == null) {
 				template = templateFactory.load(templateUri);
diff --git a/plugins/org.eclipse.epsilon.pinset.engine/src/org/eclipse/epsilon/pinset/PinsetModule.java b/plugins/org.eclipse.epsilon.pinset.engine/src/org/eclipse/epsilon/pinset/PinsetModule.java
index 21e5423..06940aa 100644
--- a/plugins/org.eclipse.epsilon.pinset.engine/src/org/eclipse/epsilon/pinset/PinsetModule.java
+++ b/plugins/org.eclipse.epsilon.pinset.engine/src/org/eclipse/epsilon/pinset/PinsetModule.java
@@ -119,10 +119,23 @@
 		return null;
 	}
 
+	public void preExecution() throws EolRuntimeException {
+		execute(getPre(), getContext());
+	}
+
 	public List<DatasetRule> getDatasetRules() {
 		return datasetRules;
 	}
 
+	public DatasetRule getDatasetRule(String ruleName) {
+		for (DatasetRule rule : datasetRules) {
+			if (rule.getName().equalsIgnoreCase(ruleName)) {
+				return rule;
+			}
+		}
+		return null;
+	}
+
 	public void setOutputFolder(String attribute) {
 		outputFolder = attribute;
 	}