/** * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * 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. * * See the NOTICE file distributed with this work for additional * information regarding copyright ownership. */ package org.sintef.thingml.resource.thingml.analysis; import java.util.List; import org.sintef.thingml.Action; import org.sintef.thingml.Event; import org.sintef.thingml.Handler; import org.sintef.thingml.ReceiveMessage; import org.sintef.thingml.SimpleSource; import org.sintef.thingml.Source; import org.sintef.thingml.SourceComposition; import org.sintef.thingml.Stream; import org.sintef.thingml.ThingMLElement; import org.sintef.thingml.Variable; import org.sintef.thingml.constraints.ThingMLHelpers; public class ReferenceReferenceReferenceResolver implements org.sintef.thingml.resource.thingml.IThingmlReferenceResolver<org.sintef.thingml.Reference, org.sintef.thingml.ReferencedElmt> { private org.sintef.thingml.resource.thingml.analysis.ThingmlDefaultResolverDelegate<org.sintef.thingml.Reference, org.sintef.thingml.ReferencedElmt> delegate = new org.sintef.thingml.resource.thingml.analysis.ThingmlDefaultResolverDelegate<org.sintef.thingml.Reference, org.sintef.thingml.ReferencedElmt>(); public void resolve(String identifier, org.sintef.thingml.Reference container, org.eclipse.emf.ecore.EReference reference, int position, boolean resolveFuzzy, final org.sintef.thingml.resource.thingml.IThingmlReferenceResolveResult<org.sintef.thingml.ReferencedElmt> result) { Action parentAction = ThingMLHelpers.findContainer(container,Action.class); if(parentAction != null) { List<Variable> variables = ThingMLHelpers.allVisibleVariables(parentAction); for(Variable v : variables) { if (v.getName() != null) { if (resolveFuzzy && v.getName().startsWith(identifier)) { result.addMapping(v.getName(), v); } else if (!resolveFuzzy && v.getName().equals(identifier)) { result.addMapping(v.getName(), v); } } } if(result.wasResolved()) { return; } } ThingMLElement parent = ThingMLHelpers.findReferenceContainer(container); if(parent instanceof Handler) { //we reference an event in a handler Handler handler = (Handler) parent; for (Event event : handler.getEvent()) { if(event instanceof ReceiveMessage && event.getName() != null) { if (resolveFuzzy && event.getName().startsWith(identifier)) { result.addMapping(event.getName(), (ReceiveMessage)event); } else if (!resolveFuzzy && event.getName().equals(identifier)) { result.addMapping(event.getName(),(ReceiveMessage)event); } } } if (!result.wasResolved()) result.setErrorMessage("Cannot resolve receive message (event): " + identifier); } else if(parent instanceof SourceComposition) {//we reference an event in one of the stream inputs SourceComposition sc = (SourceComposition) parent; //FIXME: to be improved System.out.println("SourceComposition " + sc.getName()); if(resolveFuzzy && sc.getName().startsWith(identifier)) { result.addMapping(sc.getName(), sc.getResultMessage()); /*for(Source s : sc.getSources()) { if (s instanceof SimpleSource) { SimpleSource ss = (SimpleSource) s; result.addMapping(sc.getName(), ss.getMessage()); } }*/ } else if(!resolveFuzzy && sc.getName().equals(identifier)) { result.addMapping(sc.getName(), sc.getResultMessage()); /*for(Source s : sc.getSources()) { if (s instanceof SimpleSource) { SimpleSource ss = (SimpleSource) s; result.addMapping(sc.getName(), ss.getMessage()); } }*/ } //if(!result.wasResolved()) { for(Source source : ((SourceComposition) parent).getSources()) { ReceiveMessage receiveMessage = ((SimpleSource) source).getMessage(); if(resolveFuzzy && source.getName().startsWith(identifier)) { result.addMapping(source.getName(),receiveMessage); } else if(!resolveFuzzy && source.getName().equals(identifier)) { result.addMapping(source.getName(),receiveMessage); } } //} if(!result.wasResolved()) { Stream stream = ThingMLHelpers.findContainingStream(parent); result.setErrorMessage("Cannot resolve receive message " + identifier + " in the sources of " + stream.getName()); } } else if(parent instanceof Stream) {//we reference an event in one of the stream inputs Source source = ((Stream) parent).getInput(); if(resolveFuzzy && source.getName().startsWith(identifier)) { result.addMapping(source.getName(),source); } else if(!resolveFuzzy && source.getName().equals(identifier)) { result.addMapping(source.getName(),source); } if(!result.wasResolved()) { Stream stream = ThingMLHelpers.findContainingStream(parent); result.setErrorMessage("Cannot resolve receive message " + identifier + " in the sources of " + stream.getName()); } } else if(parent instanceof SimpleSource) {//we reference an event in one of the stream inputs SimpleSource source = (SimpleSource) parent; if(resolveFuzzy && source.getName().startsWith(identifier)) { result.addMapping(source.getName(),source.getMessage()); } else if(!resolveFuzzy && source.getName().equals(identifier)) { result.addMapping(source.getName(),source.getMessage()); } if(!result.wasResolved()) { Stream stream = ThingMLHelpers.findContainingStream(parent); result.setErrorMessage("Cannot resolve receive message " + identifier + " in the sources of " + stream.getName()); } } else { if (parent != null) result.setErrorMessage("The reference has not a good parent (" + parent.getClass().getName() + ")! "); else result.setErrorMessage("The reference has not a good parent (null)! "); } } public String deResolve(org.sintef.thingml.ReferencedElmt element, org.sintef.thingml.Reference 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 } }