/**
 * Copyright (C) 2014 SINTEF <franck.fleurey@sintef.no>
 *
 * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE, Version 3, 29 June 2007;
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 	http://www.gnu.org/licenses/lgpl-3.0.txt
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.sintef.thingml.resource.thingml.analysis;

import java.util.ArrayList;

import org.sintef.thingml.Property;
import org.sintef.thingml.Session;
import org.sintef.thingml.State;
import org.sintef.thingml.Thing;
import org.sintef.thingml.constraints.ThingMLHelpers;

public class PropertyAssignPropertyReferenceResolver implements org.sintef.thingml.resource.thingml.IThingmlReferenceResolver<org.sintef.thingml.PropertyAssign, org.sintef.thingml.Property> {
	
	private org.sintef.thingml.resource.thingml.analysis.ThingmlDefaultResolverDelegate<org.sintef.thingml.PropertyAssign, org.sintef.thingml.Property> delegate = new org.sintef.thingml.resource.thingml.analysis.ThingmlDefaultResolverDelegate<org.sintef.thingml.PropertyAssign, org.sintef.thingml.Property>();
	
	public void resolve(String identifier, org.sintef.thingml.PropertyAssign container, org.eclipse.emf.ecore.EReference reference, int position, boolean resolveFuzzy, final org.sintef.thingml.resource.thingml.IThingmlReferenceResolveResult<org.sintef.thingml.Property> result) {
		ArrayList<Property> ps;
		
		Session session = ThingMLHelpers.findContainingStartSession(container).getSession();
		if (session != null) {
			ps = ThingMLHelpers.findProperty(session, identifier, resolveFuzzy);
		}
		else {
			Thing s = ThingMLHelpers.findContainingThing(container);
			if (s == null) {
				s = ThingMLHelpers.findContainingInstance(container).getType();
			}
			ps = ThingMLHelpers.findProperty(s, identifier, resolveFuzzy);
		}
			
		for(Property p : ps) {
			result.addMapping(p.getName(), p);
		}
		
		if (!result.wasResolved())
			result.setErrorMessage("Cannot resolve variable " + identifier);
	}
	
	public String deResolve(org.sintef.thingml.Property element, org.sintef.thingml.PropertyAssign container, org.eclipse.emf.ecore.EReference reference) {
		return delegate.deResolve(element, container, reference);
	}
	
	public void setOptions(java.util.Map<?,?> options) {
		// save options in a field or leave method empty if this resolver does not depend
		// on any option
	}
	
}

@@ -780,16 +780,56 @@
 ession;%0A
+import org.sintef.thingml.StartSession;%0A
 import o
@@ -1749,15 +1749,40 @@
 %3E ps
+ = new ArrayList%3C%3E()
 ;%0A%09%09%0A%09%09
+Start
 Sess
@@ -1786,22 +1786,17 @@
 ession s
-ession
+s
  = Thing
@@ -1838,24 +1838,69 @@
 n(container)
+;%0A%09%09if (ss != null) %7B%0A%09%09%09Session session = ss
 .getSession(
@@ -1902,16 +1902,17 @@
 sion();%0A
+%09
 %09%09if (se
@@ -1928,16 +1928,17 @@
 null) %7B%0A
+%09
 %09%09%09ps = 
@@ -1997,24 +1997,29 @@
 olveFuzzy);%0A
+%09%09%09%7D%0A
 %09%09%7D%0A%09%09else %7B

fix resolver