NEW - bug 296651: Support multi-scales for Escape target
https://bugs.eclipse.org/bugs/show_bug.cgi?id=296651
diff --git a/org.eclipse.amp.amf/plugins/org.eclipse.amp.amf.gen.ascape/src/metaabm/ascape/tmpl/ScapeAspect.xpt b/org.eclipse.amp.amf/plugins/org.eclipse.amp.amf.gen.ascape/src/metaabm/ascape/tmpl/ScapeAspect.xpt
index fd0325d..11d0284 100644
--- a/org.eclipse.amp.amf/plugins/org.eclipse.amp.amf.gen.ascape/src/metaabm/ascape/tmpl/ScapeAspect.xpt
+++ b/org.eclipse.amp.amf/plugins/org.eclipse.amp.amf.gen.ascape/src/metaabm/ascape/tmpl/ScapeAspect.xpt
@@ -12,10 +12,11 @@
 «EXTENSION metaabm::ascape::tmpl::namesascape»

 «EXTENSION metaabm::ascape::tmpl::inferascape»

 

+

 «DEFINE AgentBody FOR SAgent-»

 	«IF owner != null»

 	public «owner.typeName()» «owner.getterName()»() {

-		return («owner.typeName()») getScape().getRoot();

+		return («owner.typeName()») getScape().getScape();

 	}

 	«ENDIF»

 	«IF parent != null && !((SContext) parent).projections.typeSelect(SNetwork).isEmpty-»

@@ -28,16 +29,32 @@
 «DEFINE ScapeBody FOR SContext-»

     «EXPAND metaabm::tmpl::Java::UtilBody-»

     

-	«EXPAND metaabm::tmpl::Java::Field FOREACH agents-»

+    «FOREACH agents AS agent-»

+    «IF !agent.isHost()-»

+	org.ascape.model.Scape «agent.scape()»;

+	«ENDIF-»

+    «ENDFOREACH-»

+        

+    static int next_vm_id;

     

-	«EXPAND metaabm::tmpl::Java::Accessor FOREACH agents-»

+    int vm_unique_id;

     

 	/**

 	 * Creates the members of «label». 

 	 */

 	public void createScape() {

 		super.createScape();

-		setName(toString());

+		«IF parent != null»

+		vm_unique_id = next_vm_id;

+		setName("«label» " + vm_unique_id);

+		next_vm_id++;

+		«ELSE»

+		setName("«label»");

+		«ENDIF»

+		«IF parent != null»

+        setAutoCreate(false);

+        setPrototypeAgent(new org.ascape.model.Scape());

+   		«ENDIF»

 		«IF (rootActivity != null)-»

 			«EXPAND CreateScape (0) FOREACH agents-»

 			«EXPAND CreateScape (0) FOR rootActivity-»

@@ -74,6 +91,17 @@
 			«EXPAND Setup FOR rootActivity-»

 		«ENDIF-»

     }

+    

+    «FOREACH agents AS agent-»

+    «IF !agent.isHost()-»

+	/**

+	 * Returns the Scape containing «agent.pluralLabel».

+	 */

+	public org.ascape.model.Scape «agent.getterName()»Scape() {

+		return «agent.scape()»;

+	}

+	«ENDIF-»

+    «ENDFOREACH-»

 «ENDDEFINE»

 

 «DEFINE NameAccessor FOR SAgent-»

@@ -108,10 +136,9 @@
                 }

             }

         };

-    «ENDIF-»

-«ENDDEFINE»    

+    «ENDIF-»«ENDDEFINE»    

 

-«DEFINE BeginQuery (List[metaabm::act::AAct] path, Boolean inner) FOR AAct»

+«DEFINE BeginQuery (List[metaabm::act::AAct] path, Boolean inner) FOR AAct-»

     «IF !convert()-»

     «selector().typeName()» «selector().id()» = («selector().typeName()») «findStatement(path)»;

     «ELSE-»

@@ -124,26 +151,22 @@
     if («selector().id()» «metaType != ANone ? "!=" : "=="» null) {

     «IF expression(path, inner) != "" && hasControl("here") && !selector().isRoot()-»

         if («expression(path, inner)») {

-    «ENDIF-»

-«ENDDEFINE»

-«DEFINE EndQuery (List[metaabm::act::AAct] path, Boolean inner) FOR AAct»

+    «ENDIF-»«ENDDEFINE»

+«DEFINE EndQuery (List[metaabm::act::AAct] path, Boolean inner) FOR AAct-»

     «IF expression(path, inner) != "" && hasControl("here") && !selector().isRoot()-»}

-    «ENDIF-»}

-«ENDDEFINE»

+    «ENDIF-»}«ENDDEFINE»

 

 «DEFINE BeginSerial(List[AAct] path, Boolean inner) FOR AControl-»

     «IF selector().isRoot() && selector().agent.isHost() && !controlFunctions({"available", "withinBoundaries"}).isEmpty-»

         if («EXPAND metaabm::tmpl::Java::FunctionInnerBlock(path, false) FOREACH controlFunctions({"available", "withinBoundaries"}) SEPARATOR "&&"-») {

-    «ENDIF-»

-«ENDDEFINE»

+    «ENDIF-»«ENDDEFINE»

 «DEFINE EndSerial(List[AAct] path, Boolean inner) FOR AControl-»

     «IF selector().isRoot() && selector().agent.isHost() && !controlFunctions({"available", "withinBoundaries"}).isEmpty-»}

-    «ENDIF-»

-«ENDDEFINE»

+    «ENDIF-»«ENDDEFINE»

 

 «DEFINE Setup FOR ACreateAgents-»

 	«IF !agent.isHost()-»

-		«agent.fieldName()».setSize(«agentCount.id()»);

+		«agent.scape()».setSize(«agentCount.id()»);

 	«ENDIF-»

 «ENDDEFINE»

 «DEFINE Setup FOR IAct-»«ENDDEFINE»

@@ -151,6 +174,13 @@
 	«EXPAND Setup FOREACH members-»

 «ENDDEFINE»

 

+«DEFINE CreateScape(int stage) FOR ACreateAgents-»

+	«IF stage == 0-»

+	«IF !agent.isHost()-»

+		«agent.scape()».setSize(«agentCount.id()»);

+	«ENDIF-»

+	«ENDIF-»

+«ENDDEFINE»

 «DEFINE CreateScape(int stage) FOR ABuildSpace-»«ENDDEFINE»

 «DEFINE CreateScape(int stage) FOR ABuildNetwork-»

 		«IF stage == 0-»

@@ -170,6 +200,10 @@
 	        «ENDIF-»

 			add(«projection.fieldName()»);

 			org.ascape.model.Scape «fillAgent.fieldName()» = «projection.id()»;

+	        «IF fillAgent.metaType == SContext»

+	        «projection.fieldName()».setAutoCreate(false);

+	        «projection.fieldName()».createScape();

+	        «ENDIF»

 		«ELSEIF stage == 1-»

 	        «FOREACH agents AS agent-»

 	        «agent.proto()».setHostScape(«projection.fieldName()»);

@@ -183,14 +217,18 @@
 	«IF !isHost()»

 		«IF stage == 0-»

 		«typeName()» «proto()» = new «typeName()»();

-		«fieldName()» = new «pkgm()»Scape();

-		«fieldName()».setName("«label»");

-		«fieldName()».setPrototypeAgent(«proto()»);

-        «fieldName()».setExecutionOrder(«pkgm()»Scape.RULE_ORDER);

+		«scape()» = new «pkgm()»Scape();

+		«scape()».setName("«label»");

+		«scape()».setPrototypeAgent(«proto()»);

+        «scape()».setExecutionOrder(«pkgm()»Scape.RULE_ORDER);

 		«ELSEIF stage == 1»

-		add(«fieldName()»);

+		add(«scape()»);

 		«ELSEIF stage == 2»

 		«EXPAND StatBuilder-»

+        «IF metaType == SContext»

+        «scape()».setAutoCreate(false);

+        «scape()».createScape();

+        «ENDIF»

 		«ENDIF-»

 	«ENDIF»

 «ENDDEFINE»

@@ -219,7 +257,7 @@
 «ENDDEFINE»

 

 «DEFINE StatBuilderAdd(SAttribute outer, String mod, String desc) FOR SAttribute-»

-    «((SAgent) parent()).fieldName()».addStatCollector(new org.ascape.util.data.StatCollector«outer(outer).statCondTerm()»CSAMM("«statLabel(outer, desc)»") {

+    «((SAgent) parent()).fieldName()».addStatCollector(new org.ascape.util.data.StatCollector«outer(outer).statCondTerm()»CSAMM(«statLabel(outer, desc)») {

 		private static final long serialVersionUID = 6846144446402098985L;

 		«IF outer != this-»

 		«EXPAND StatBuilderBody (outer, mod) FOR outer-»

@@ -250,7 +288,7 @@
 «ENDDEFINE»

 «DEFINE StatBuilder FOR SAgent-»

 	«IF genStats() != "none"»

-        «fieldName()».addStatCollector(new org.ascape.util.data.StatCollectorCSA("«label» Population") {

+        «scape()».addStatCollector(new org.ascape.util.data.StatCollectorCSA(getName() + " Population") {

 				private static final long serialVersionUID = 684614444640209893L;

 				

                 @SuppressWarnings("unused")

@@ -261,7 +299,7 @@
 «ENDDEFINE»

 

 «DEFINE ChildBuilder FOR ARule-»

-		«reference.fieldName()».addRule(new «pkgm()»rule.Rule("«label»") {

+		«reference.scape()».addRule(new «pkgm()»rule.Rule("«label»") {

 			private static final long serialVersionUID = 6846144446402098981L;

 			public void execute(«pkgm()»Agent a) {

 				((«reference.implementation.qualifiedName») a).«id()»();

@@ -270,7 +308,7 @@
 «ENDDEFINE»

 «DEFINE ChildBuilder FOR AInitialize-»

 		«REM»Initialize is automatically invoked by default from framework«ENDREM»

-		«reference.fieldName()».addInitialRule(new «pkgm()»rule.Rule("«label»") {

+		«reference.scape()».addInitialRule(new «pkgm()»rule.Rule("«label»") {

 			private static final long serialVersionUID = 6846144446402098982L;

 			public void execute(«pkgm()»Agent a) {

 				((«reference.implementation.qualifiedName») a).«id()»();

diff --git a/org.eclipse.amp.amf/plugins/org.eclipse.amp.amf.gen.ascape/src/metaabm/ascape/tmpl/inferascape.ext b/org.eclipse.amp.amf/plugins/org.eclipse.amp.amf.gen.ascape/src/metaabm/ascape/tmpl/inferascape.ext
index cd75c53..78c80fc 100644
--- a/org.eclipse.amp.amf/plugins/org.eclipse.amp.amf.gen.ascape/src/metaabm/ascape/tmpl/inferascape.ext
+++ b/org.eclipse.amp.amf/plugins/org.eclipse.amp.amf.gen.ascape/src/metaabm/ascape/tmpl/inferascape.ext
@@ -79,7 +79,7 @@
 		act.selected.asAgent().pre() + act.method(path, inner) + "(" + act.destination.asHost().expl() + ");";

 

 cached String call(ACreateAgents act, List[AAct] path, Boolean inner) :

-	act.agent.typeName() + " " + act.id() + " = (" + act.agent.typeName() + ")" + act.getterPath(act.reference.parent(), inner) + "." + act.agent.getterName() + "().getSpace().newLocation(false);";

+	act.agent.typeName() + " " + act.id() + " = (" + act.agent.typeName() + ")" + act.getterPath(act.reference.parent(), inner) + ".get" + act.agent.scape().toFirstUpper() + "().getSpace().newLocation(false);";

 	

 cached String call(ADie act, List[AAct] path, Boolean inner) :

 		act.selected.local(act.selected.id()).expl().pre() + "die();";

@@ -202,7 +202,7 @@
 	statCond(typed) ? "Cond" : "";

 

 cached String statLabel(SAttribute inner, SAttribute outer, String desc) :

-	inner.parent().label + " " + desc.spaceTrail() + (outer != inner ? outer.label.spaceTrail() : "") + inner.label;

+	(inner.parent().parent().parent() != null ? "getName() + \" " : "\"") + inner.parent().label + " " + desc.spaceTrail() + (outer != inner ? outer.label.spaceTrail() : "") + inner.label + "\"";

 

 cached int gridDimSize(SGrid grid) : 

 	grid.attributes.size > 1 ? grid.attributes.get(1).defaultValue.asInteger() : 20;

@@ -224,4 +224,8 @@
 	attr.gatherData && attr.sType == SAttributeType::Boolean ? {{"is " + attr.label, attr.setTo("true")}, {"is not " + attr.label, attr.setTo("false")}} : {};

 	

 List setterSpace(SStyle style) :

-	style.agent.attributes.setterSpace();	
\ No newline at end of file
+	style.agent.attributes.setterSpace();

+	

+//cached String typeName(SAgent agent) :			

+//	"org.ascape.model.Scape";

+	
\ No newline at end of file
diff --git a/org.eclipse.amp.amf/plugins/org.eclipse.amp.amf.gen.ascape/src/metaabm/ascape/tmpl/namesascape.ext b/org.eclipse.amp.amf/plugins/org.eclipse.amp.amf.gen.ascape/src/metaabm/ascape/tmpl/namesascape.ext
index 5c1c43d..89d4d0c 100644
--- a/org.eclipse.amp.amf/plugins/org.eclipse.amp.amf.gen.ascape/src/metaabm/ascape/tmpl/namesascape.ext
+++ b/org.eclipse.amp.amf/plugins/org.eclipse.amp.amf.gen.ascape/src/metaabm/ascape/tmpl/namesascape.ext
@@ -74,4 +74,10 @@
     

 cached String coordinateType(SNDimensional proj) :          

     "org.ascape.model.space.Coordinate" + proj.dimension() + "D" + spaceType(proj);

-    
\ No newline at end of file
+

+cached String scape(SAgent agent) :

+	agent.id() + "Scape";

+

+cached String fieldName(SAgent agent) :

+	agent.scape();

+	
\ No newline at end of file
diff --git a/org.eclipse.amp.amf/plugins/org.eclipse.amp.amf.gen.ascape/src/model/generate_ascape_tests.mwe b/org.eclipse.amp.amf/plugins/org.eclipse.amp.amf.gen.ascape/src/model/generate_ascape_tests.mwe
index bd27c4b..95bbde1 100644
--- a/org.eclipse.amp.amf/plugins/org.eclipse.amp.amf.gen.ascape/src/model/generate_ascape_tests.mwe
+++ b/org.eclipse.amp.amf/plugins/org.eclipse.amp.amf.gen.ascape/src/model/generate_ascape_tests.mwe
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <workflow>
 	<property name="outputPath" value="./" />
-	<property name="modelPath" value="test/" />
+	<property name="modelPath" value="" />
 	<property name="modelFile" value="TestGeneration.metaabm" />
     <property name="testing" value="true" />
     <property name="fullStats" value="true" />