Search in sources :

Example 1 with BehaviorActionSequence

use of org.osate.ba.aadlba.BehaviorActionSequence in project osate2 by osate.

the class AadlBaUnparser method initSwitches.

/**
 * Specific aadlba switch to unparse components
 */
protected void initSwitches() {
    aadlbaSwitch = new AadlBaSwitch<String>() {

        /**
         * Top-level method to unparse "behavior_specification"
         * annexsubclause
         */
        // public String caseAnnexSubclause(AnnexSubclause object) {
        // //FIXME : TODO : update location reference
        // 
        // process((BehaviorAnnex) object);
        // 
        // return DONE;
        // }
        /**
         * Unparse behaviorannex
         */
        @Override
        public String caseBehaviorAnnex(BehaviorAnnex object) {
            // DB: Improve code formatting
            aadlbaText.addOutputNewline("");
            // FIXME : TODO : update location reference
            if (object.isSetVariables()) {
                aadlbaText.addOutputNewline("variables");
                aadlbaText.incrementIndent();
                processEList(object.getVariables());
                aadlbaText.decrementIndent();
            }
            if (object.isSetStates()) {
                aadlbaText.addOutputNewline("states");
                aadlbaText.incrementIndent();
                processEList(object.getStates());
                aadlbaText.decrementIndent();
            }
            if (object.isSetTransitions()) {
                aadlbaText.addOutputNewline("transitions");
                aadlbaText.incrementIndent();
                processEList(object.getTransitions());
                aadlbaText.decrementIndent();
            }
            return DONE;
        }

        /**
         * Unparse behaviorvariable
         */
        @Override
        public String caseBehaviorVariable(BehaviorVariable object) {
            // FIXME : TODO : update location reference
            aadlbaText.addOutput(object.getName());
            for (ArrayDimension ad : object.getArrayDimensions()) {
                aadlbaText.addOutput("[");
                if (ad instanceof DeclarativeArrayDimension) {
                    DeclarativeArrayDimension dad = (DeclarativeArrayDimension) ad;
                    process(dad.getDimension());
                } else if (ad instanceof ArrayDimension) {
                    aadlbaText.addOutput(Long.toString(ad.getSize().getSize()));
                }
                aadlbaText.addOutput("]");
            }
            aadlbaText.addOutput(" : ");
            if (object.getDataClassifier() instanceof QualifiedNamedElement) {
                QualifiedNamedElement qn = (QualifiedNamedElement) object.getDataClassifier();
                aadlbaText.addOutput(getNamespace(qn));
                process(qn);
            } else if (object.getDataClassifier() instanceof DataClassifier) {
                aadlbaText.addOutput(object.getDataClassifier().getQualifiedName());
            }
            aadlbaText.addOutputNewline(";");
            return DONE;
        }

        private String getNamespace(final QualifiedNamedElement qn) {
            final Identifier baNameSpace = qn.getBaNamespace();
            final StringBuilder nameSpace = new StringBuilder();
            if (baNameSpace != null && !Strings.isNullOrEmpty(baNameSpace.getId())) {
                nameSpace.append(baNameSpace.getId()).append("::");
            }
            return nameSpace.toString();
        }

        /**
         * Unparse behaviorstate
         */
        @Override
        public String caseBehaviorState(BehaviorState object) {
            // FIXME : TODO : update location reference
            aadlbaText.addOutput(object.getName());
            aadlbaText.addOutput(" : ");
            if (object.isInitial()) {
                aadlbaText.addOutput("initial ");
            }
            if (object.isComplete()) {
                aadlbaText.addOutput("complete ");
            }
            if (object.isFinal()) {
                aadlbaText.addOutput("final ");
            }
            aadlbaText.addOutputNewline("state;");
            return DONE;
        }

        /**
         * Unparse behaviortransition
         */
        @Override
        public String caseBehaviorTransition(BehaviorTransition object) {
            // FIXME : TODO : update location reference
            String tid = object.getName();
            Long num = object.getPriority();
            if (tid != null) {
                aadlbaText.addOutput(tid);
                if (num != AadlBaVisitors.DEFAULT_TRANSITION_PRIORITY) {
                    // numeral
                    aadlbaText.addOutput(" [");
                    aadlbaText.addOutput(String.valueOf(num));
                    aadlbaText.addOutput("]");
                }
                aadlbaText.addOutput(" : ");
            }
            if (object.getSourceState() != null) {
                aadlbaText.addOutput(object.getSourceState().getName());
            } else if (object instanceof DeclarativeBehaviorTransition) {
                DeclarativeBehaviorTransition dbt = (DeclarativeBehaviorTransition) object;
                for (Identifier id : dbt.getSrcStates()) {
                    aadlbaText.addOutput(id.getId());
                    if (dbt.getSrcStates().get(dbt.getSrcStates().size() - 1) != id) {
                        aadlbaText.addOutput(",");
                    }
                }
            }
            aadlbaText.addOutput(" -[");
            process(object.getCondition());
            aadlbaText.addOutput("]-> ");
            if (object.getDestinationState() != null) {
                aadlbaText.addOutput(object.getDestinationState().getName());
            } else if (object instanceof DeclarativeBehaviorTransition) {
                DeclarativeBehaviorTransition dbt = (DeclarativeBehaviorTransition) object;
                aadlbaText.addOutput(dbt.getDestState().getId());
            }
            if (object.getActionBlock() != null) {
                aadlbaText.addOutput(" ");
                process(object.getActionBlock());
            }
            aadlbaText.addOutputNewline(";");
            return DONE;
        }

        @Override
        public String caseExecutionTimeoutCatch(ExecutionTimeoutCatch object) {
            aadlbaText.addOutput("timeout");
            return DONE;
        }

        @Override
        public String caseOtherwise(Otherwise object) {
            aadlbaText.addOutput("otherwise");
            return DONE;
        }

        /**
         * Unparse dispatchcondition
         */
        @Override
        public String caseDispatchCondition(DispatchCondition object) {
            // FIXME : TODO : update location reference
            aadlbaText.addOutput("on dispatch");
            if (object.getDispatchTriggerCondition() != null) {
                aadlbaText.addOutput(" ");
                process(object.getDispatchTriggerCondition());
            }
            if (object.isSetFrozenPorts()) {
                aadlbaText.addOutput(" frozen ");
                processEList(object.getFrozenPorts(), ", ");
            }
            return DONE;
        }

        @Override
        public String caseDispatchTriggerConditionStop(DispatchTriggerConditionStop object) {
            aadlbaText.addOutput("stop");
            return DONE;
        }

        @Override
        public String caseDispatchRelativeTimeout(DispatchRelativeTimeout object) {
            aadlbaText.addOutput("timeout ");
            return DONE;
        }

        @Override
        public String caseCompletionRelativeTimeout(CompletionRelativeTimeout object) {
            aadlbaText.addOutput("timeout ");
            caseBehaviorTime(object);
            return DONE;
        }

        @Override
        public String caseDispatchTriggerLogicalExpression(DispatchTriggerLogicalExpression object) {
            processEList(object.getDispatchConjunctions(), " or ");
            return DONE;
        }

        @Override
        public String caseDispatchConjunction(DispatchConjunction object) {
            processEList(object.getDispatchTriggers(), " and ");
            return DONE;
        }

        @Override
        public String caseBehaviorActionBlock(BehaviorActionBlock object) {
            aadlbaText.addOutputNewline("{");
            aadlbaText.incrementIndent();
            // aadlbaText.addOutput("{");
            process(object.getContent());
            aadlbaText.decrementIndent();
            aadlbaText.addOutputNewline("");
            aadlbaText.addOutput("}");
            if (object.getTimeout() != null) {
                aadlbaText.addOutput(" timeout ");
                process(object.getTimeout());
            }
            return DONE;
        }

        @Override
        public String caseBehaviorActionSequence(BehaviorActionSequence object) {
            // DB: Indentation problem when using \n direcly
            processEList(object.getActions(), ";", true);
            // processEList(object.getActions(), ";\n");
            return DONE;
        }

        @Override
        public String caseBehaviorActionSet(BehaviorActionSet object) {
            // DB: Indentation problem when using \n direcly
            processEList(object.getActions(), " &", true);
            // processEList(object.getActions(), " &\n");
            return DONE;
        }

        /**
         * Unparse ifstatement
         */
        @Override
        public String caseIfStatement(IfStatement object) {
            // FIXME : TODO : update location reference
            boolean hasToOutputTerminator = true;
            if (object.isElif()) {
                aadlbaText.addOutputNewline("");
                aadlbaText.addOutput("elsif (");
                hasToOutputTerminator = false;
            } else {
                aadlbaText.addOutput("if (");
                hasToOutputTerminator = true;
            }
            process(object.getLogicalValueExpression());
            aadlbaText.addOutputNewline(")");
            aadlbaText.incrementIndent();
            process(object.getBehaviorActions());
            aadlbaText.decrementIndent();
            if (object.getElseStatement() != null) {
                process(object.getElseStatement());
            }
            if (hasToOutputTerminator) {
                aadlbaText.addOutputNewline("");
                aadlbaText.addOutput("end if");
            }
            return DONE;
        }

        @Override
        public String caseElseStatement(ElseStatement object) {
            aadlbaText.addOutputNewline("");
            aadlbaText.addOutputNewline("else");
            aadlbaText.incrementIndent();
            process(object.getBehaviorActions());
            aadlbaText.decrementIndent();
            return DONE;
        }

        /**
         * Unparse fororforallstatement
         */
        @Override
        public String caseForOrForAllStatement(ForOrForAllStatement object) {
            // FIXME : TODO : update location reference
            if (object.isForAll()) {
                aadlbaText.addOutput("forall (");
            } else {
                aadlbaText.addOutput("for (");
            }
            process(object.getIterativeVariable());
            aadlbaText.addOutput(" in ");
            process(object.getIteratedValues());
            aadlbaText.addOutputNewline(") {");
            // aadlbaText.addOutputNewline("{");
            aadlbaText.incrementIndent();
            process(object.getBehaviorActions());
            aadlbaText.decrementIndent();
            aadlbaText.addOutputNewline("");
            aadlbaText.addOutput("}");
            return DONE;
        }

        @Override
        public String caseIterativeVariable(IterativeVariable iv) {
            aadlbaText.addOutput(iv.getName());
            aadlbaText.addOutput(" : ");
            // DB: Use qualified name when classifier is declared outside the package
            final DataClassifier dataClass = iv.getDataClassifier();
            final String dataClassName;
            if (dataClass.getElementRoot() == iv.getElementRoot()) {
                dataClassName = dataClass.getName();
            } else {
                dataClassName = dataClass.getQualifiedName();
            }
            aadlbaText.addOutput(dataClassName);
            return DONE;
        }

        @Override
        public String caseWhileOrDoUntilStatement(WhileOrDoUntilStatement object) {
            if (object.isDoUntil()) {
                return caseDoUntilStatement(object);
            } else {
                return caseWhileStatement(object);
            }
        }

        /**
         * Unparse whilestatement
         */
        public String caseWhileStatement(WhileOrDoUntilStatement object) {
            // FIXME : TODO : update location reference
            aadlbaText.addOutput("while (");
            process(object.getLogicalValueExpression());
            aadlbaText.addOutputNewline(") {");
            // aadlbaText.addOutputNewline("{");
            aadlbaText.incrementIndent();
            process(object.getBehaviorActions());
            aadlbaText.decrementIndent();
            aadlbaText.addOutputNewline("");
            aadlbaText.addOutputNewline("}");
            return DONE;
        }

        /**
         * Unparse dountilstatement
         */
        public String caseDoUntilStatement(WhileOrDoUntilStatement object) {
            // FIXME : TODO : update location reference
            aadlbaText.addOutputNewline("do");
            process(object.getBehaviorActions());
            aadlbaText.addOutputNewline("");
            aadlbaText.addOutput("until (");
            process(object.getLogicalValueExpression());
            aadlbaText.addOutputNewline(")");
            return DONE;
        }

        /**
         * Unparse integerrange
         */
        @Override
        public String caseIntegerRange(IntegerRange object) {
            // FIXME : TODO : update location reference
            process(object.getLowerIntegerValue());
            aadlbaText.addOutput(" .. ");
            process(object.getUpperIntegerValue());
            return DONE;
        }

        /**
         * Unparse timedaction
         */
        @Override
        public String caseTimedAction(TimedAction object) {
            aadlbaText.addOutput("computation (");
            process(object.getLowerTime());
            if (object.getUpperTime() != null) {
                aadlbaText.addOutput(" .. ");
                process(object.getUpperTime());
            }
            aadlbaText.addOutput(")");
            if (object.isSetProcessorClassifier()) {
                aadlbaText.addOutput(" in binding (");
                processEList(object.getProcessorClassifier(), ", ", object, false);
                aadlbaText.addOutput(")");
            }
            return DONE;
        }

        /**
         * Unparse assignmentaction
         */
        @Override
        public String caseAssignmentAction(AssignmentAction object) {
            // FIXME : TODO : update location reference
            process(object.getTarget());
            aadlbaText.addOutput(" := ");
            process(object.getValueExpression());
            return DONE;
        }

        @Override
        public String caseAny(Any object) {
            aadlbaText.addOutput("any");
            return DONE;
        }

        @Override
        public String caseElementHolder(ElementHolder el) {
            if (el instanceof Reference) {
                return processReference((Reference) el);
            }
            Element refContainer = Aadl2Visitors.getContainingPackageSection(el.getElement());
            Element holderPackageOrPropertySet = Aadl2Visitors.getContainingPackageSection(el);
            if (refContainer != null && holderPackageOrPropertySet != null && false == holderPackageOrPropertySet.equals(refContainer) && false == (el instanceof DataSubcomponentHolder)) {
                StringBuilder sb = new StringBuilder(el.getElement().getQualifiedName());
                String prefix = sb.substring(0, sb.lastIndexOf("::") + 2);
                aadlbaText.addOutput(prefix);
            }
            if (el instanceof GroupableElement) {
                GroupableElement ge = (GroupableElement) el;
                if (ge.isSetGroupHolders()) {
                    processEList(ge.getGroupHolders(), ".");
                    aadlbaText.addOutput(".");
                }
            }
            aadlbaText.addOutput(el.getElement().getName());
            if (el instanceof IndexableElement) {
                IndexableElement ie = (IndexableElement) el;
                if (ie.isSetArrayIndexes()) {
                    caseArrayIndex(ie.getArrayIndexes());
                }
            }
            return DONE;
        }

        private String processReference(Reference ref) {
            for (ArrayableIdentifier id : ref.getIds()) {
                aadlbaText.addOutput(id.getId());
                caseArrayIndex(id.getArrayIndexes());
                if (id != ref.getIds().get(ref.getIds().size() - 1)) {
                    aadlbaText.addOutput(".");
                }
            }
            return DONE;
        }

        private String processCommAction(CommAction object) {
            process(object.getReference());
            if (object.isLock()) {
                aadlbaText.addOutput("!<");
            } else if (object.isUnlock()) {
                aadlbaText.addOutput("!>");
            } else if (object.isPortDequeue()) {
                aadlbaText.addOutput(" ?");
            } else {
                aadlbaText.addOutput(" !");
            }
            if (object.isSetParameters() == true) {
                aadlbaText.addOutput(" (");
                processEList(object.getParameters(), ",");
                aadlbaText.addOutput(")");
                return DONE;
            } else if (object.getTarget() != null) {
                aadlbaText.addOutput(" (");
                process(object.getTarget());
                aadlbaText.addOutput(")");
                return DONE;
            }
            return DONE;
        }

        /**
         * Unparse arrayindex
         */
        public String caseArrayIndex(EList<IntegerValue> object) {
            // FIXME : TODO : update location reference
            for (IntegerValue iv : object) {
                aadlbaText.addOutput("[");
                process(iv);
                aadlbaText.addOutput("]");
            }
            return DONE;
        }

        /**
         * Unparse datacomponentreference
         */
        @Override
        public String caseDataComponentReference(DataComponentReference object) {
            // FIXME : TODO : update location reference
            processEList(object.getData(), ".");
            return DONE;
        }

        @Override
        public String defaultCase(EObject object) {
            if (object instanceof CommAction) {
                return processCommAction((CommAction) object);
            } else if (object instanceof Reference) {
                return processReference((Reference) object);
            } else if (object instanceof QualifiedNamedElement) {
                QualifiedNamedElement qn = (QualifiedNamedElement) object;
                aadlbaText.addOutput(qn.getBaName().getId());
            } else if (object instanceof org.osate.ba.declarative.NamedValue) {
                org.osate.ba.declarative.NamedValue nv = (org.osate.ba.declarative.NamedValue) object;
                process(nv.getReference());
                if (nv.isCount()) {
                    aadlbaText.addOutput("' count");
                }
                if (nv.isFresh()) {
                    aadlbaText.addOutput("' fresh");
                }
                if (nv.isDequeue()) {
                    aadlbaText.addOutput(" ?");
                }
            } else if (object instanceof DeclarativePropertyReference) {
                DeclarativePropertyReference dpr = (DeclarativePropertyReference) object;
                if (dpr.getQualifiedName().getBaName().getId().isEmpty()) {
                    aadlbaText.addOutput("#");
                }
                aadlbaText.addOutput(dpr.getQualifiedName().getBaNamespace().getId());
                aadlbaText.addOutput("::");
                if (false == dpr.getQualifiedName().getBaName().getId().isEmpty()) {
                    aadlbaText.addOutput(dpr.getQualifiedName().getBaName().getId());
                    aadlbaText.addOutput("#");
                }
                processEList(dpr.getPropertyNames(), ".");
            } else if (object instanceof DeclarativePropertyName) {
                DeclarativePropertyName dpn = (DeclarativePropertyName) object;
                aadlbaText.addOutput(dpn.getPropertyName().getId());
                // field
                process(dpn.getField());
                // indexes
                caseArrayIndex(dpn.getIndexes());
            }
            return DONE;
        }

        @Override
        public String caseSubprogramCallAction(SubprogramCallAction object) {
            if (object.getProxy() != null) {
                process(object.getProxy());
                aadlbaText.addOutput(".");
            }
            process(object.getSubprogram());
            aadlbaText.addOutput(" !");
            if (object.isSetParameterLabels()) {
                aadlbaText.addOutput(" (");
                processEList(object.getParameterLabels(), ", ");
                aadlbaText.addOutput(")");
            }
            return DONE;
        }

        @Override
        public String casePortSendAction(PortSendAction object) {
            process(object.getPort());
            aadlbaText.addOutput(" !");
            if (object.getValueExpression() != null) {
                aadlbaText.addOutput(" (");
                process(object.getValueExpression());
                aadlbaText.addOutput(")");
            }
            return DONE;
        }

        @Override
        public String casePortFreezeAction(PortFreezeAction object) {
            return casePortActionOrValue(object, " >>");
        }

        @Override
        public String casePortDequeueAction(PortDequeueAction object) {
            process(object.getPort());
            aadlbaText.addOutput(" ?");
            if (object.getTarget() != null) {
                aadlbaText.addOutput(" (");
                process(object.getTarget());
                aadlbaText.addOutput(")");
            }
            return DONE;
        }

        @Override
        public String caseLockAction(LockAction object) {
            return caseSharedDataAction(object, "!<");
        }

        @Override
        public String caseUnlockAction(UnlockAction object) {
            return caseSharedDataAction(object, "!>");
        }

        public String caseSharedDataAction(SharedDataAction object, String token) {
            if (object.getDataAccess() != null) {
                process(object.getDataAccess());
                aadlbaText.addOutput(" ");
            } else {
                aadlbaText.addOutput("*");
            }
            aadlbaText.addOutput(token);
            return DONE;
        }

        /**
         * Unparse behaviortime
         */
        @Override
        public String caseBehaviorTime(BehaviorTime object) {
            // FIXME : TODO : update location reference
            process(object.getIntegerValue());
            aadlbaText.addOutput(" ");
            if (object.getUnit() != null) {
                aadlbaText.addOutput(object.getUnit().getName());
            } else {
                if (object instanceof DeclarativeTime) {
                    DeclarativeTime dt = (DeclarativeTime) object;
                    aadlbaText.addOutput(dt.getUnitId().getId());
                }
            }
            return DONE;
        }

        @Override
        public String casePortDequeueValue(PortDequeueValue object) {
            return casePortActionOrValue(object, " ?");
        }

        @Override
        public String casePortCountValue(PortCountValue object) {
            return casePortActionOrValue(object, "' count");
        }

        @Override
        public String casePortFreshValue(PortFreshValue object) {
            return casePortActionOrValue(object, "' fresh");
        }

        public String casePortActionOrValue(PortHolder object, String token) {
            caseElementHolder(object);
            aadlbaText.addOutput(token);
            return DONE;
        }

        /**
         * Unparse booleanliteral
         */
        @Override
        public String caseBehaviorBooleanLiteral(BehaviorBooleanLiteral object) {
            // FIXME : TODO : update location reference
            if (object.isValue()) {
                aadlbaText.addOutput("true");
            } else {
                aadlbaText.addOutput("false");
            }
            return DONE;
        }

        /**
         * Unparse stringliteral
         */
        @Override
        public String caseBehaviorStringLiteral(BehaviorStringLiteral object) {
            // FIXME : TODO : update location reference
            // DB: Manage adding double quotes
            aadlbaText.addOutput(doubleQuoteString(object.getValue()));
            return DONE;
        }

        @Override
        public String caseBehaviorRealLiteral(BehaviorRealLiteral object) {
            aadlbaText.addOutput(String.valueOf(object.getValue()));
            return DONE;
        }

        @Override
        public String caseBehaviorIntegerLiteral(BehaviorIntegerLiteral object) {
            aadlbaText.addOutput(Long.toString(object.getValue()));
            return DONE;
        }

        /**
         * Unparse valueexpression
         */
        @Override
        public String caseValueExpression(ValueExpression object) {
            // FIXME : TODO : update location reference
            Iterator<Relation> itRel = object.getRelations().iterator();
            process(itRel.next());
            if (object.isSetLogicalOperators()) {
                Iterator<LogicalOperator> itOp = object.getLogicalOperators().iterator();
                while (itRel.hasNext()) {
                    LogicalOperator lo = itOp.next();
                    if (lo != LogicalOperator.NONE) {
                        aadlbaText.addOutput(" " + lo.getLiteral() + " ");
                    }
                    process(itRel.next());
                }
            }
            return DONE;
        }

        /**
         * Unparse relation
         */
        @Override
        public String caseRelation(Relation object) {
            // FIXME : TODO : update location reference
            process(object.getFirstExpression());
            if (object.getSecondExpression() != null) {
                if (object.getRelationalOperator() != RelationalOperator.NONE) {
                    aadlbaText.addOutput(" " + object.getRelationalOperator().getLiteral() + " ");
                }
                process(object.getSecondExpression());
            }
            return DONE;
        }

        /**
         * Unparse simpleexpression
         */
        @Override
        public String caseSimpleExpression(SimpleExpression object) {
            // FIXME : TODO : update location reference
            if (object.isSetUnaryAddingOperator() && object.getUnaryAddingOperator() != UnaryAddingOperator.NONE) {
                aadlbaText.addOutput(object.getUnaryAddingOperator().getLiteral());
            }
            Iterator<Term> itTerm = object.getTerms().iterator();
            process(itTerm.next());
            if (object.isSetBinaryAddingOperators()) {
                Iterator<BinaryAddingOperator> itOp = object.getBinaryAddingOperators().iterator();
                while (itTerm.hasNext()) {
                    BinaryAddingOperator bao = itOp.next();
                    if (bao != BinaryAddingOperator.NONE) {
                        aadlbaText.addOutput(" " + bao.getLiteral() + " ");
                    }
                    process(itTerm.next());
                }
            }
            return DONE;
        }

        /**
         * Unparse term
         */
        @Override
        public String caseTerm(Term object) {
            // FIXME : TODO : update location reference
            Iterator<Factor> itFact = object.getFactors().iterator();
            process(itFact.next());
            if (object.isSetMultiplyingOperators()) {
                Iterator<MultiplyingOperator> itOp = object.getMultiplyingOperators().iterator();
                while (itFact.hasNext()) {
                    MultiplyingOperator mo = itOp.next();
                    if (mo != MultiplyingOperator.NONE) {
                        aadlbaText.addOutput(" " + mo.getLiteral() + " ");
                    }
                    process(itFact.next());
                }
            }
            return DONE;
        }

        /**
         * Unparse factor
         */
        @Override
        public String caseFactor(Factor object) {
            // FIXME : TODO : update location reference
            if (object.isSetUnaryNumericOperator() || object.isSetUnaryBooleanOperator()) {
                Enumerator e = null;
                if (object.isSetUnaryNumericOperator()) {
                    e = object.getUnaryNumericOperator();
                    if (e != UnaryNumericOperator.NONE) {
                        aadlbaText.addOutput(e.getLiteral() + " ");
                    }
                } else if (object.isSetUnaryBooleanOperator()) {
                    e = object.getUnaryBooleanOperator();
                    if (e != UnaryBooleanOperator.NONE) {
                        aadlbaText.addOutput(e.getLiteral() + " ");
                    }
                }
            }
            if (object.getFirstValue() instanceof ValueExpression) {
                aadlbaText.addOutput("(");
                process(object.getFirstValue());
                aadlbaText.addOutput(")");
            } else {
                process(object.getFirstValue());
            }
            if (object.isSetBinaryNumericOperator()) {
                BinaryNumericOperator bno = object.getBinaryNumericOperator();
                if (bno != BinaryNumericOperator.NONE) {
                    aadlbaText.addOutput(" " + bno.getLiteral() + " ");
                }
                if (object.getSecondValue() instanceof ValueExpression) {
                    aadlbaText.addOutput("(");
                    process(object.getSecondValue());
                    aadlbaText.addOutput(")");
                } else {
                    process(object.getSecondValue());
                }
            }
            return DONE;
        }

        @Override
        public String caseBehaviorPropertyConstant(BehaviorPropertyConstant object) {
            aadlbaText.addOutput("#");
            if (object.getPropertySet() != null) {
                aadlbaText.addOutput(object.getPropertySet().getQualifiedName());
                aadlbaText.addOutput("::");
            }
            aadlbaText.addOutput(object.getProperty().getName());
            return DONE;
        }

        @Override
        public String casePropertySetPropertyReference(PropertySetPropertyReference object) {
            aadlbaText.addOutput("#");
            if (object.getPropertySet() != null) {
                aadlbaText.addOutput(object.getPropertySet().getQualifiedName());
                aadlbaText.addOutput("::");
            }
            processEList(object.getProperties(), ".");
            return DONE;
        }

        @Override
        public String caseClassifierPropertyReference(ClassifierPropertyReference object) {
            org.osate.aadl2.Classifier c = object.getClassifier();
            process(c, object);
            aadlbaText.addOutput("#");
            processEList(object.getProperties(), ".");
            return DONE;
        }

        @Override
        public String caseClassifierFeaturePropertyReference(ClassifierFeaturePropertyReference object) {
            process(object.getComponent());
            aadlbaText.addOutput("#");
            processEList(object.getProperties(), ".");
            return DONE;
        }

        @Override
        public String casePropertyNameHolder(PropertyNameHolder pnh) {
            PropertyElementHolder peh = pnh.getProperty();
            Element el = peh.getElement();
            if (el instanceof NamedElement) {
                aadlbaText.addOutput(((NamedElement) el).getName());
            } else if (el instanceof PropertyAssociation) {
                aadlbaText.addOutput(((PropertyAssociation) el).getProperty().getName());
            } else {
                String tmp = unparse((PropertyExpression) el);
                aadlbaText.addOutput(tmp);
            }
            if (pnh.getField() != null) {
                aadlbaText.addOutput(".");
                process(pnh.getField());
            } else if (peh.isSetArrayIndexes()) {
                caseArrayIndex(peh.getArrayIndexes());
            }
            return DONE;
        }

        @Override
        public String caseUpperBound(UpperBound object) {
            aadlbaText.addOutput("upper_bound");
            return DONE;
        }

        @Override
        public String caseLowerBound(LowerBound object) {
            aadlbaText.addOutput("lower_bound");
            return DONE;
        }
    };
}
Also used : ExecutionTimeoutCatch(org.osate.ba.aadlba.ExecutionTimeoutCatch) SubprogramCallAction(org.osate.ba.aadlba.SubprogramCallAction) BehaviorTime(org.osate.ba.aadlba.BehaviorTime) ClassifierPropertyReference(org.osate.ba.aadlba.ClassifierPropertyReference) DeclarativeBehaviorTransition(org.osate.ba.declarative.DeclarativeBehaviorTransition) DispatchTriggerLogicalExpression(org.osate.ba.aadlba.DispatchTriggerLogicalExpression) GroupableElement(org.osate.ba.aadlba.GroupableElement) TimedAction(org.osate.ba.aadlba.TimedAction) BehaviorIntegerLiteral(org.osate.ba.aadlba.BehaviorIntegerLiteral) BehaviorTransition(org.osate.ba.aadlba.BehaviorTransition) DeclarativeBehaviorTransition(org.osate.ba.declarative.DeclarativeBehaviorTransition) ArrayableIdentifier(org.osate.ba.declarative.ArrayableIdentifier) DataComponentReference(org.osate.ba.aadlba.DataComponentReference) SimpleExpression(org.osate.ba.aadlba.SimpleExpression) DispatchTriggerConditionStop(org.osate.ba.aadlba.DispatchTriggerConditionStop) IfStatement(org.osate.ba.aadlba.IfStatement) DataSubcomponentHolder(org.osate.ba.aadlba.DataSubcomponentHolder) QualifiedNamedElement(org.osate.ba.declarative.QualifiedNamedElement) Otherwise(org.osate.ba.aadlba.Otherwise) Identifier(org.osate.ba.declarative.Identifier) ArrayableIdentifier(org.osate.ba.declarative.ArrayableIdentifier) AbstractEnumerator(org.eclipse.emf.common.util.AbstractEnumerator) Enumerator(org.eclipse.emf.common.util.Enumerator) PortFreezeAction(org.osate.ba.aadlba.PortFreezeAction) UpperBound(org.osate.ba.aadlba.UpperBound) EObject(org.eclipse.emf.ecore.EObject) Factor(org.osate.ba.aadlba.Factor) PropertySetPropertyReference(org.osate.ba.aadlba.PropertySetPropertyReference) BehaviorState(org.osate.ba.aadlba.BehaviorState) BehaviorActionSet(org.osate.ba.aadlba.BehaviorActionSet) BinaryNumericOperator(org.osate.ba.aadlba.BinaryNumericOperator) ForOrForAllStatement(org.osate.ba.aadlba.ForOrForAllStatement) PropertyElementHolder(org.osate.ba.aadlba.PropertyElementHolder) IterativeVariable(org.osate.ba.aadlba.IterativeVariable) BehaviorAnnex(org.osate.ba.aadlba.BehaviorAnnex) AssignmentAction(org.osate.ba.aadlba.AssignmentAction) PortDequeueAction(org.osate.ba.aadlba.PortDequeueAction) LogicalOperator(org.osate.ba.aadlba.LogicalOperator) PortDequeueValue(org.osate.ba.aadlba.PortDequeueValue) ElementHolder(org.osate.ba.aadlba.ElementHolder) PropertyElementHolder(org.osate.ba.aadlba.PropertyElementHolder) Term(org.osate.ba.aadlba.Term) DeclarativeTime(org.osate.ba.declarative.DeclarativeTime) PortSendAction(org.osate.ba.aadlba.PortSendAction) DispatchCondition(org.osate.ba.aadlba.DispatchCondition) ElseStatement(org.osate.ba.aadlba.ElseStatement) BehaviorBooleanLiteral(org.osate.ba.aadlba.BehaviorBooleanLiteral) MultiplyingOperator(org.osate.ba.aadlba.MultiplyingOperator) LockAction(org.osate.ba.aadlba.LockAction) QualifiedNamedElement(org.osate.ba.declarative.QualifiedNamedElement) NamedElement(org.osate.aadl2.NamedElement) CompletionRelativeTimeout(org.osate.ba.aadlba.CompletionRelativeTimeout) IndexableElement(org.osate.ba.aadlba.IndexableElement) DispatchConjunction(org.osate.ba.aadlba.DispatchConjunction) LowerBound(org.osate.ba.aadlba.LowerBound) BehaviorVariable(org.osate.ba.aadlba.BehaviorVariable) PropertyAssociation(org.osate.aadl2.PropertyAssociation) QualifiedNamedElement(org.osate.ba.declarative.QualifiedNamedElement) NamedElement(org.osate.aadl2.NamedElement) Element(org.osate.aadl2.Element) BehaviorElement(org.osate.ba.aadlba.BehaviorElement) IndexableElement(org.osate.ba.aadlba.IndexableElement) GroupableElement(org.osate.ba.aadlba.GroupableElement) WhileOrDoUntilStatement(org.osate.ba.aadlba.WhileOrDoUntilStatement) PortHolder(org.osate.ba.aadlba.PortHolder) AbstractNamedValue(org.osate.aadl2.AbstractNamedValue) NamedValue(org.osate.aadl2.NamedValue) DataClassifier(org.osate.aadl2.DataClassifier) DataClassifier(org.osate.aadl2.DataClassifier) Any(org.osate.ba.aadlba.Any) DeclarativePropertyName(org.osate.ba.declarative.DeclarativePropertyName) PortCountValue(org.osate.ba.aadlba.PortCountValue) Relation(org.osate.ba.aadlba.Relation) BehaviorPropertyConstant(org.osate.ba.aadlba.BehaviorPropertyConstant) DeclarativeArrayDimension(org.osate.ba.declarative.DeclarativeArrayDimension) ClassifierFeaturePropertyReference(org.osate.ba.aadlba.ClassifierFeaturePropertyReference) BehaviorStringLiteral(org.osate.ba.aadlba.BehaviorStringLiteral) BehaviorRealLiteral(org.osate.ba.aadlba.BehaviorRealLiteral) Iterator(java.util.Iterator) BehaviorActionBlock(org.osate.ba.aadlba.BehaviorActionBlock) DeclarativePropertyReference(org.osate.ba.declarative.DeclarativePropertyReference) SharedDataAction(org.osate.ba.aadlba.SharedDataAction) CommAction(org.osate.ba.declarative.CommAction) IntegerRange(org.osate.ba.aadlba.IntegerRange) DeclarativePropertyReference(org.osate.ba.declarative.DeclarativePropertyReference) PropertySetPropertyReference(org.osate.ba.aadlba.PropertySetPropertyReference) ClassifierFeaturePropertyReference(org.osate.ba.aadlba.ClassifierFeaturePropertyReference) ClassifierPropertyReference(org.osate.ba.aadlba.ClassifierPropertyReference) Reference(org.osate.ba.declarative.Reference) DataComponentReference(org.osate.ba.aadlba.DataComponentReference) IntegerValue(org.osate.ba.aadlba.IntegerValue) PortFreshValue(org.osate.ba.aadlba.PortFreshValue) DispatchRelativeTimeout(org.osate.ba.aadlba.DispatchRelativeTimeout) PropertyNameHolder(org.osate.ba.aadlba.PropertyNameHolder) UnlockAction(org.osate.ba.aadlba.UnlockAction) ValueExpression(org.osate.ba.aadlba.ValueExpression) BinaryAddingOperator(org.osate.ba.aadlba.BinaryAddingOperator) BehaviorActionSequence(org.osate.ba.aadlba.BehaviorActionSequence) ArrayDimension(org.osate.aadl2.ArrayDimension) DeclarativeArrayDimension(org.osate.ba.declarative.DeclarativeArrayDimension)

Example 2 with BehaviorActionSequence

use of org.osate.ba.aadlba.BehaviorActionSequence in project osate2 by osate.

the class AadlBaLegalityRulesChecker method buildActionSetAssignedTargetLists.

/**
 * Recursively builds a list of assigned target contained
 * in a given BehaviorActions tree and checks for duplicated targets every time
 * it meet a Behavior Action Set node. It populates the given set with
 * duplicated targets.<BR><BR>
 *
 * A special attention is given to report legality rules D.6.(L3) and (L4)
 * failures : in order to help the user to correct his errors, the duplicates
 * list contains all instances of duplicated assigned targets.
 *
 * @param beActions The given BehaviorActions tree.
 * @param lActionSetDcr The list of assigned targets
 * @param lDuplicates The set of duplicated assigned targets.
 */
// As Java 1.6 can't create generic array.
@SuppressWarnings("unchecked")
private void buildActionSetAssignedTargetLists(BehaviorActions beActions, List<Target> lActionSetTar, Set<Target> lDuplicates) {
    // Basic action cases.
    if (beActions instanceof BasicAction) {
        if (beActions instanceof AssignmentAction) {
            lActionSetTar.add(((AssignmentAction) beActions).getTarget());
        }
        return;
    }
    // Behavior Action Block case.
    if (beActions instanceof BehaviorActionBlock) {
        BehaviorActionBlock tmp = (BehaviorActionBlock) beActions;
        buildActionSetAssignedTargetLists(tmp.getContent(), lActionSetTar, lDuplicates);
        return;
    }
    // If Statement case.
    if (beActions instanceof IfStatement) {
        IfStatement ifStat = (IfStatement) beActions;
        BehaviorActions tmp = ifStat.getBehaviorActions();
        buildActionSetAssignedTargetLists(tmp, lActionSetTar, lDuplicates);
        if (ifStat.getElseStatement() != null) {
            tmp = ifStat.getElseStatement();
            buildActionSetAssignedTargetLists(tmp, lActionSetTar, lDuplicates);
        }
        return;
    }
    if (beActions instanceof ElseStatement) {
        ElseStatement elseStat = (ElseStatement) beActions;
        BehaviorActions tmp = elseStat.getBehaviorActions();
        buildActionSetAssignedTargetLists(tmp, lActionSetTar, lDuplicates);
        return;
    }
    // Loop Statement case.
    if (beActions instanceof LoopStatement) {
        LoopStatement tmp = (LoopStatement) beActions;
        buildActionSetAssignedTargetLists(tmp.getBehaviorActions(), lActionSetTar, lDuplicates);
        return;
    }
    // ***** Processing containers:
    // List of BehaviorAction objects contained in the given BehaviorActions
    // tree.
    List<BehaviorAction> lbeActs = ((BehaviorActionCollection) beActions).getActions();
    // Behavior Action Sequence case:
    if (beActions instanceof BehaviorActionSequence) {
        for (BehaviorAction tmp : lbeActs) {
            buildActionSetAssignedTargetLists(tmp, lActionSetTar, lDuplicates);
        }
        return;
    }
    // Behavior Action Set case:
    // Current BehaviorAction object.
    BehaviorAction behAct;
    // Creates an array which will handle the lists of assigned targets. One
    // list for each behavior action of the action set.
    List<Target>[] llActionSetTar = null;
    llActionSetTar = new List[lbeActs.size()];
    // For each BehaviorAction of the given BehaviorActionCollection.
    for (int i = 0; i < lbeActs.size(); i++) {
        behAct = lbeActs.get(i);
        llActionSetTar[i] = new ArrayList<Target>();
        buildActionSetAssignedTargetLists(behAct, llActionSetTar[i], lDuplicates);
    }
    // Check for duplicated assigned targets in the lists of the
    // action set. Complexity is O(n^2) as the lists are not sorted.
    List<Target> lCurrent = null;
    List<Target> lOther = null;
    // Optimization flag to avoid adding the same target to the duplicates
    // set.
    boolean hasToAdd = true;
    // Compare the lists between them.
    for (int i = 0; i < llActionSetTar.length - 1; i++) {
        lCurrent = llActionSetTar[i];
        for (Target currentTar : lCurrent) {
            // Compare current list with the others.
            for (int j = i + 1; j < llActionSetTar.length; j++) {
                lOther = llActionSetTar[j];
                for (Target otherTar : lOther) {
                    // Case of duplicated assigned target.
                    if (AadlBaUtils.isSameTarget(currentTar, otherTar)) {
                        // Add the current target if it hasn't be done yet.
                        if (hasToAdd) {
                            lDuplicates.add(currentTar);
                            hasToAdd = false;
                        }
                        // Add the other target to help the user finding his errors.
                        lDuplicates.add(otherTar);
                    }
                }
            }
            // Reset the flag for the next target.
            hasToAdd = true;
        }
    }
    // higher level action set checking.
    for (List<Target> l : llActionSetTar) {
        lActionSetTar.addAll(l);
    }
}
Also used : BasicAction(org.osate.ba.aadlba.BasicAction) AssignmentAction(org.osate.ba.aadlba.AssignmentAction) LoopStatement(org.osate.ba.aadlba.LoopStatement) IfStatement(org.osate.ba.aadlba.IfStatement) Target(org.osate.ba.aadlba.Target) BehaviorAction(org.osate.ba.aadlba.BehaviorAction) BehaviorActionCollection(org.osate.ba.aadlba.BehaviorActionCollection) ElseStatement(org.osate.ba.aadlba.ElseStatement) BehaviorActionBlock(org.osate.ba.aadlba.BehaviorActionBlock) BehaviorActions(org.osate.ba.aadlba.BehaviorActions) List(java.util.List) ArrayList(java.util.ArrayList) EList(org.eclipse.emf.common.util.EList) BehaviorActionSequence(org.osate.ba.aadlba.BehaviorActionSequence)

Aggregations

AssignmentAction (org.osate.ba.aadlba.AssignmentAction)2 BehaviorActionBlock (org.osate.ba.aadlba.BehaviorActionBlock)2 BehaviorActionSequence (org.osate.ba.aadlba.BehaviorActionSequence)2 ElseStatement (org.osate.ba.aadlba.ElseStatement)2 IfStatement (org.osate.ba.aadlba.IfStatement)2 ArrayList (java.util.ArrayList)1 Iterator (java.util.Iterator)1 List (java.util.List)1 AbstractEnumerator (org.eclipse.emf.common.util.AbstractEnumerator)1 EList (org.eclipse.emf.common.util.EList)1 Enumerator (org.eclipse.emf.common.util.Enumerator)1 EObject (org.eclipse.emf.ecore.EObject)1 AbstractNamedValue (org.osate.aadl2.AbstractNamedValue)1 ArrayDimension (org.osate.aadl2.ArrayDimension)1 DataClassifier (org.osate.aadl2.DataClassifier)1 Element (org.osate.aadl2.Element)1 NamedElement (org.osate.aadl2.NamedElement)1 NamedValue (org.osate.aadl2.NamedValue)1 PropertyAssociation (org.osate.aadl2.PropertyAssociation)1 Any (org.osate.ba.aadlba.Any)1