public OclExpression TranslateConstraint(ClassifierConstraintBlock classifierConstraintBlock, OclExpression pimInvariant, Dictionary <VariableDeclaration, List <PSMClass> > initialVariableMappings, Dictionary <PIMPath, List <PSMPath> > initialPathMappings, Dictionary <VariableDeclaration, VariableDeclaration> variableTranslations, out Classifier psmContextSuggestion) { #region fill prepared translations foreach (KeyValuePair <VariableDeclaration, List <PSMClass> > kvp in initialVariableMappings) { VariableClassMappings.CreateSubCollectionIfNeeded(kvp.Key); VariableClassMappings[kvp.Key].AddRange(kvp.Value); } foreach (KeyValuePair <PIMPath, List <PSMPath> > kvp in initialPathMappings) { PathMappings.CreateSubCollectionIfNeeded(kvp.Key); PathMappings[kvp.Key].AddRange(kvp.Value); } foreach (KeyValuePair <VariableDeclaration, VariableDeclaration> kvp in variableTranslations) { VariableTranslations[kvp.Key] = kvp.Value; } #endregion psmBridge = new PSMBridge(TargetPSMSchema); #region prepare self variable PSMClass psmClass = VariableClassMappings[classifierConstraintBlock.Self].First(); Classifier variableType = psmBridge.Find(psmClass); VariableDeclaration vd = new VariableDeclaration(classifierConstraintBlock.Self.Name, variableType, null); this.SelfVariableDeclaration = vd; #endregion OclExpression translateConstraint = pimInvariant.Accept(this); psmContextSuggestion = psmBridge.Find(VariableClassMappings[classifierConstraintBlock.Self].First()); if (isSuitable) { return(translateConstraint); } else { return(null); } }
public bool CheckConstraintSuitability(ClassifierConstraintBlock classifierConstraintBlock, OclExpression oclExpression) { Clear(); psmBridge = new PSMBridge(TargetPSMSchema); PIMClass contextClass = (PIMClass)classifierConstraintBlock.Context.Tag; VariableClassMappings.CreateSubCollectionIfNeeded(classifierConstraintBlock.Self); VariableClassMappings[classifierConstraintBlock.Self].AddRange(GetInterpretations(contextClass)); oclExpression.Accept(this); IEnumerable <VariableDeclaration> f = from m in VariableClassMappings where m.Value.Count == 0 select m.Key; if (f.Count() > 0) { isSuitable = false; } return(isSuitable); }
private void TranslateInvariantsToXPath(ClassifierConstraintBlock constraintBlock, XElement ruleElement, PSMBridge psmBridge, TranslationSettings translationSettings) { foreach (InvariantWithMessage invariant in constraintBlock.Invariants) { string xpath = TranslateInvariantToXPath(constraintBlock, psmBridge, invariant.Constraint, translationSettings); try { ruleElement.Add(new XComment(invariant.ToString())); XElement assertElement = ruleElement.SchematronAssert(xpath); #region process user error message and subexpressions in the message if (invariant.MessageIsString) { if (invariant.MessageSubExpressions.Count > 0) { foreach (SubExpressionInfo messagePart in invariant.MessageSubExpressions) { if (messagePart.SubExpression == null) { XText messageTextElement = new XText(messagePart.PartAsString); assertElement.Add(messageTextElement); } else { if (messagePart.Parsed) { string subExpressionTranslation = TranslateInvariantToXPath(constraintBlock, psmBridge, messagePart.SubExpression, translationSettings, true); assertElement.SchematronValueOf(subExpressionTranslation); } else { Log.AddWarning(string.Format("Failed to integrate subexpression `{0}` into the schema. ", messagePart.PartAsString), messagePart.SubExpression); } } } } else { XText messageTextElement = new XText(((StringLiteralExp)invariant.Message).Value); assertElement.Add(messageTextElement); } } #endregion } catch { ruleElement.Add(new XComment("Translation of the constraint failed. ")); } } }