use of org.osate.ba.aadlba.DispatchCondition in project osate2 by osate.
the class AadlBaConsistencyRulesChecker method D_3_C4_Check.
/**
* Document: AADL Behavior Annex draft
* Version : 0.94
* Type : Consistency rule
* Section : D.3 Behavior Specification
* Object : Check consistency rule D.3.(C4)
* Keys : complete state mode behavior condition mode transition triggers
*/
public boolean D_3_C4_Check(BehaviorTransition btOwner, Identifier srcState) {
// [OPTIM] -------------------------------------------------------------
// these checking can be moved to the rules driver in order to optimize.
BehaviorState bs = (BehaviorState) srcState.getBaRef();
BehaviorState declaredState = null;
if (bs.getName().equalsIgnoreCase(srcState.getId())) {
declaredState = bs;
}
// with true.
if (declaredState.getBindedMode() == null) {
return true;
}
// ---------------------------------------------------------------------
// At this point, one of the current behavior transtion's src states
// represent a mode.
DispatchTriggerLogicalExpression dtle;
Mode mode = declaredState.getBindedMode();
// trigger logical expression is analyzed.
if (btOwner.getCondition() instanceof DispatchCondition) {
DispatchCondition dc = (DispatchCondition) btOwner.getCondition();
if (dc.getDispatchTriggerCondition() instanceof DispatchTriggerLogicalExpression) {
dtle = (DispatchTriggerLogicalExpression) dc.getDispatchTriggerCondition();
} else {
// At least, there is one mode transition trigger in a mode
// transition. So this transition is not consistency.
reportConsistencyError(srcState, "The behavior transition tries " + "to refine a transition mode but it hasn't got any dispatch " + "trigger logical expression: Behavior Annex D.3.(C4) " + "consistency rule failed");
return false;
}
} else {
// exit with false result.
return false;
}
EList<ModeTransition> lModeTrans = Aadl2Visitors.getElementsInNamespace(_baParentContainer, ModeTransition.class);
// any transition mode.
if (lModeTrans.isEmpty()) {
reportConsistencyError(srcState, "The behavior transition tries to " + "refine a transition mode while " + _baParentContainer.getQualifiedName() + " component hasn't got any transition mode: " + "Behavior Annex D.3.(C4) consistency rule failed");
return false;
}
// At this point preliminary checking has been passed.
List<String> lModeTriggs = new ArrayList<String>();
// Fetches dispatch trigger names in the given behavior transition.
List<String> ldispTriggs = new ArrayList<String>();
for (DispatchTrigger trigg : AadlBaVisitors.getDispatchTriggers(dtle)) {
ActualPortHolder portHolder = (ActualPortHolder) trigg;
ldispTriggs.add(portHolder.getPort().getName());
}
// Otherwise reports an error.
for (ModeTransition mTrans : lModeTrans) {
// If the transition mode contains the considered mode:
if (mTrans.getSource().getName().equalsIgnoreCase(mode.getName())) {
// Fetches mode transition trigger names.
for (ModeTransitionTrigger mtt : mTrans.getOwnedTriggers()) {
lModeTriggs.add(AadlBaUtils.getName(mtt));
}
// considering their order.
if (Aadl2Utils.compareStringList(ldispTriggs, lModeTriggs)) {
return true;
} else {
lModeTriggs.clear();
continue;
}
}
// Else continue to the next transition mode.
}
// Error case : the given behavior transition which is out of a mode
// is not consisting with any transition mode which involves the considered
// mode.
reportConsistencyError(srcState, "The behavior transition tries to " + "refine a transition mode but it is not consisting with any " + "transition mode of " + _baParentContainer.getQualifiedName() + " component: Behavior Annex D.3.(C4) consistency rule failed");
return false;
}
use of org.osate.ba.aadlba.DispatchCondition 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;
}
};
}
use of org.osate.ba.aadlba.DispatchCondition in project osate2 by osate.
the class AadlBaNameResolver method behaviorTransitionResolver.
/**
* Document: AADL Behavior Annex draft
* Version : 0.94
* Type : Naming rule
* Section : D.3 Behavior Specification
* Object : Check naming rule D.3.(N2)
* Keys : empty execution condition
*
* Resolves the names in behavior annex's transitions.
*
* @return {@code true} if all names are resolved. {@code false} otherwise.
*/
private boolean behaviorTransitionResolver() {
boolean result = true;
for (BehaviorTransition tmp : _ba.getTransitions()) {
DeclarativeBehaviorTransition trans = (DeclarativeBehaviorTransition) tmp;
result &= transDestStateResolver(trans);
result &= transSrcStateResolver(trans);
BehaviorCondition cond = trans.getCondition();
// as no condition means always true.
if (cond != null) {
// Case of a dispatch condition
if (cond instanceof DispatchCondition) {
result &= dispatchConditionResolver((DispatchCondition) cond);
} else // Case of mode switch condition
if (cond instanceof ModeSwitchTriggerLogicalExpression) {
result &= modeSwitchTriggerLogicalExpression((ModeSwitchTriggerLogicalExpression) cond);
} else // ModeSwitchTriggerLogicalExpression
// Case of a execute condition
{
if (cond instanceof ValueExpression) {
result &= valueExpressionResolver((ValueExpression) cond);
}
}
}
BehaviorActionBlock block = trans.getActionBlock();
// Behavior actions of an behavior transition may not exist.
if (block != null) {
result &= behaviorActionBlockResolver(block);
}
}
return result;
}
Aggregations