package com.sap.furcas.runtime.referenceresolving;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.ocl.ParserException;
import org.eclipse.ocl.ecore.OCL.Helper;
import org.eclipse.ocl.ecore.OCLExpression;
import org.eclipse.ocl.ecore.opposites.OppositeEndFinder;
import com.sap.furcas.metamodel.FURCAS.TCS.SequenceElement;
import com.sap.furcas.metamodel.FURCAS.TCS.Template;
import com.sap.furcas.runtime.common.util.ContextAndForeachHelper;
/**
* Used to set a property by executing one of multiple possible templates that have non-empty but equal syntax. Which template to
* use is determined by an OCL expression evaluated in the context of the element whose property is to be set.
*
* @author Axel Uhl (D043530)
*
*/
public class SemanticPredicatePropertyInitUpdater extends AbstractFurcasOCLBasedModelUpdater {
private final List<SemanticDisambRuleData> predicates;
private final Template containingTemplate;
public class SemanticDisambRuleData {
private final Template templateToInvoke;
private final String ocl;
public SemanticDisambRuleData(Template templateToInvoke, String ocl) {
super();
this.templateToInvoke = templateToInvoke;
this.ocl = ocl;
}
public String getOCL() {
return ocl;
}
public Template getTemplateToInvoke() {
return templateToInvoke;
}
}
protected SemanticPredicatePropertyInitUpdater(EStructuralFeature propertyToUpdate, EPackage.Registry metamodelPackageRegistry,
OppositeEndFinder oppositeEndFinder, List<SemanticDisambRuleData> predicates, Template containingTemplate) {
super(propertyToUpdate, metamodelPackageRegistry, oppositeEndFinder, /* expression TODO */ null,
/* notifyOnNewContextElements TODO */ true, /* TODO */ SelfKind.SELF,
ContextAndForeachHelper.getContextTag(/* expression TODO */ null));
this.predicates = predicates;
this.containingTemplate = containingTemplate;
}
@Override
public void notify(OCLExpression expression, Collection<EObject> affectedContextObjects,
OppositeEndFinder oppositeEndFinder, Notification change) {
// TODO Implement SemanticPredicatePropertyInitUpdater.notify(...)
}
@Override
public Collection<OCLExpression> getTriggerExpressionsWithoutContext() {
Collection<OCLExpression> result = new LinkedList<OCLExpression>();
Helper oclHelper = org.eclipse.ocl.examples.impactanalyzer.util.OCL.newInstance(getOppositeEndFinder()).createOCLHelper();
for (SemanticDisambRuleData predicate : predicates) {
try {
oclHelper.setContext(ContextAndForeachHelper.getParsingContext(predicate.getOCL(), containingTemplate));
result.add(oclHelper.createQuery(ContextAndForeachHelper.prepareOclQuery(predicate.getOCL())));
} catch (ParserException e) {
throw new RuntimeException(e);
}
}
return result;
}
@Override
protected SequenceElement getSequenceElement() {
// TODO Auto-generated method stub
return null;
}
}