Пример #1
0
        private string TranslateInvariantToXPath(ClassifierConstraintBlock constraintBlock, IBridgeToOCL bridge, OclExpression invariant,
                                                 TranslationSettings translationSettings, bool forceTranslation = false)
        {
            invariant.IsInvariant       = true;
            invariant.ConstraintContext = constraintBlock;

            PSMOCLtoXPathConverter xpathConverter;

            if (translationSettings.Functional)
            {
                xpathConverter = new PSMOCLtoXPathConverterFunctional();
            }
            else
            {
                xpathConverter = new PSMOCLtoXPathConverterDynamic();
            }

            xpathConverter.Bridge     = (PSMBridge)bridge;
            xpathConverter.OclContext = constraintBlock;
            xpathConverter.Log        = Log;
            xpathConverter.Settings   = translationSettings;
            if (forceTranslation || !translationSettings.Retranslation)
            {
                try
                {
                    string invariantStr = xpathConverter.TranslateExpression(invariant);
                    translationSettings.SubexpressionTranslations.XPathContextVariableReplacementMode = xpathConverter.ContextVariableReplacementMode;
                    translationSettings.SubexpressionTranslations.Merge(xpathConverter.SubexpressionTranslations);
                    return(invariantStr);
                }
                catch (ExpressionNotSupportedInXPath e)
                {
                    Log.AddError(e.Message, e.Expression);
                }
                catch
                {
                    Log.AddError("Unable to translate invariant. ", invariant);
                }
            }
            else
            {
                try
                {
                    // this must stay here because of the string comparison - translation renames some variables
                    xpathConverter.TranslateExpression(invariant);

                    foreach (OclExpression translatedExp in translationSettings.SubexpressionTranslations.Translations.Keys)
                    {
                        if (translatedExp.ToString() == invariant.ToString())
                        {
                            translationSettings.SubexpressionTranslations.SelfVariableDeclaration = translatedExp.ConstraintContext.Self;
                            return(translationSettings.SubexpressionTranslations.GetSubexpressionTranslation(translatedExp).GetString(true));
                        }
                    }
                }
                catch (ExpressionNotSupportedInXPath e)
                {
                    Log.AddError(e.Message, e.Expression);
                }
                catch
                {
                    Log.AddError("Unable to translate invariant. ", invariant);
                }
            }
            return("### ERROR");
        }
        public void testTupleLiteralExp()
        {
            AstOclModelElementFactory factory1 = AstOclModelElementFactoryManager.getInstance(umlModel.getOclPackage());

            OclExpression       init1 = factory1.createIntegerLiteralExp(100, getClassifier("Integer"));
            VariableDeclaration part1 = factory1.createVariableDeclaration("a", getClassifier("Integer"), init1);

            OclExpression       init2 = factory1.createRealLiteralExp("100.38", getClassifier("Real"));
            VariableDeclaration part2 = factory1.createVariableDeclaration("b", getClassifier("Real"), init2);

            OclExpression       init3 = factory1.createBooleanLiteralExp(true, getClassifier("Boolean"));
            VariableDeclaration part3 = factory1.createVariableDeclaration("c", getClassifier("Boolean"), init3);

            List <object> parts = new List <object> ();

            parts.Add(part1);
            parts.Add(part2);
            parts.Add(part3);

            TupleTypeImpl tupleType = (TupleTypeImpl)factory1.createTupleType();

            tupleType.addElement("a", getClassifier("Integer"));
            tupleType.addElement("b", getClassifier("Real"));
            tupleType.addElement("c", getClassifier("Boolean"));
            Assert.AreEqual("Tuple(a : Integer, b : Real, c : Boolean)", tupleType.getName());

            //		TuplePartType part1Type = factory1.createTuplePartType(tupleType, "a", getClassifier("Integer"));
            //		TuplePartType part2Type = factory1.createTuplePartType(tupleType, "b", getClassifier("Real"));
            //		TuplePartType part3Type = factory1.createTuplePartType(tupleType, "c", getClassifier("Boolean"));

            OclExpression exp = factory1.createTupleLiteralExp(parts, tupleType);

            Assert.AreEqual("Tuple{ a : Integer = 100, b : Real = 100.38, c : Boolean = True }", exp.ToString());

            Assert.AreEqual("Tuple(a : Integer, b : Real, c : Boolean)", exp.getType().getName());

            Assert.IsNotNull(exp.getType().lookupAttribute("a"));
            Assert.IsNull(exp.getType().lookupAttribute("d"));
        }