blob: e449f64c132a11f41641649acfa514c1d56b3c06 [file] [log] [blame]
[comment encoding = UTF-8 /]
[comment
/*****************************************************************************
* Copyright (c) 2013 Intecs SpA
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* Nicholas Pacini nicholas.pacini@intecs.it
* Stefano Puri stefano.puri@intecs.it
* Laura Baracchi laura.baracchi@intecs.it
* Initial API and implementation and/or initial documentation
*
*****************************************************************************/
/]
[module generateFaultExtensions('http://www.eclipse.org/uml2/5.0.0/UML')]
[template public generateFaultExtensions(model : Model, sysQN : String , sysName : String, filename : String){
ErrorModelQN : String = 'CHESS::Dependability::ThreatsPropagation::ErrorModel';
ErrorQN : String = 'CHESS::Dependability::ThreatsPropagation::ErrorState';
StuckAtQN : String = 'CHESS::Dependability::ThreatsPropagation::StuckAt';
StuckAtFixedQN : String = 'CHESS::Dependability::ThreatsPropagation::StuckAtFixed';
InvertedQN : String = 'CHESS::Dependability::ThreatsPropagation::Inverted';
RampDownQN : String = 'CHESS::Dependability::ThreatsPropagation::RampDown';
InternalFaultQN : String = 'CHESS::Dependability::ThreatsPropagation::InternalFault';
ExternalFaultQN : String = 'CHESS::Dependability::ThreatsPropagation::InternalPropagation';
}]
[comment @main/]
[file (model.name.concat('_').concat(sysName).concat('.fei'), false, 'UTF-8')]
[let system : Class = getSystem(model, sysQN)]
<fault_extension_info name="[system.name/]" desc="Generated by CHESS" smv_file="[model.name.concat('_').concat(sysName).concat('.smv')/]">
<extensions>
[let systemProps : Set(Property) = system.allOwnedElements()->filter(Property)->select(prop : Property | prop.type.oclIsTypeOf(Class))]
[let systemClasses : Set(Class) = systemProps->collect(pr : Property | pr.type.oclAsType(Class))->asSet()]
[let nominalComponents : Set(Class) = model.allOwnedElements()->filter(Class)->select(cl : Class | cl.ownedBehavior->filter(StateMachine)
->exists(sm : StateMachine | sm.getAppliedStereotype(ErrorModelQN)->notEmpty()))]
[for (cl : Class | nominalComponents)]
<nominal_component_extensions module="[cl.name/]">
<fault_models>
[for (errorModel : StateMachine | cl.ownedBehavior->filter(StateMachine)->select(sm : StateMachine | sm.getAppliedStereotype(ErrorModelQN)->notEmpty()))]
<fault_model name="[errorModel.name/]">
<fault_modes>
[for (errorState : State | errorModel.region.subvertex->filter(State)->select(error : State | error.getAppliedStereotype(ErrorQN)->notEmpty()))]
[let errorStereo : Stereotype = errorState.getAppliedStereotype(ErrorQN)]
<fault_mode enabled="yes" probability="[errorState.getValue(errorStereo, 'probability')/]">
<user_info>
<name>[errorState.name/]</name>
<desc></desc>
</user_info>
[if (errorState.getAppliedStereotype(StuckAtQN)->notEmpty())]
[let stuckAtStereo : Stereotype = errorState.getAppliedStereotype(StuckAtQN)]
<effects_model name="StuckAtByReference_D" desc="">
<values>
<input reads="term" value="[errorState.getValue(stuckAtStereo, 'value')/]"/>
[let prop : Property = errorState.getValue(stuckAtStereo, 'property').oclAsType(Property)]
<output writes="varout" reads="input" binds="[prop.name/]" type="[getTypeNameForProperty(prop)/]"/>
[/let]
</values>
</effects_model>
[/let]
[elseif (errorState.getAppliedStereotype(InvertedQN)->notEmpty())]
[let invertedStereo : Stereotype = errorState.getAppliedStereotype(InvertedQN)]
<effects_model name="Inverted" desc="">
<values>
[let prop : Property = errorState.getValue(invertedStereo, 'property').oclAsType(Property)]
<output writes="varout" reads="input" binds="[prop.name/]" type="[getType(prop.type)/]"/>
[/let]
</values>
</effects_model>
[/let]
[elseif (errorState.getAppliedStereotype(StuckAtFixedQN)->notEmpty())]
[let stuckAtFixedStereo : Stereotype = errorState.getAppliedStereotype(InvertedQN)]
<effects_model name="StuckAtFixed" desc="">
<values>
[let prop : Property = errorState.getValue(stuckAtFixedStereo, 'property').oclAsType(Property)]
<output writes="varout" reads="input" binds="[prop.name/]" type="[getType(prop.type)/]"/>
[/let]
</values>
</effects_model>
[/let]
[elseif (errorState.getAppliedStereotype(RampDownQN)->notEmpty())]
[let rampDownStereo : Stereotype = errorState.getAppliedStereotype(InvertedQN)]
<effects_model name="RampDown" desc="">
<values>
<input reads="decr" value="[errorState.getValue(rampDownStereo, 'decr')/]"/>
<input reads="end_value" value="[errorState.getValue(rampDownStereo, 'endValue')/]"/>
[let prop : Property = errorState.getValue(rampDownStereo, 'property').oclAsType(Property)]
<output writes="varout" reads="input" binds="[prop.name/]" type="[getType(prop.type)/]"/>
[/let]
</values>
</effects_model>
[/let]
[/if]
[let tr : Transition = errorState.incoming->any(fault : Transition | fault.getAppliedStereotype(InternalFaultQN)->notEmpty()
or fault.getAppliedStereotype(ExternalFaultQN)->notEmpty())]
<local_dynamics_model name="Permanent" desc="">
<events>
<event type="output" name="failure" connected="no"/>
</events>
</local_dynamics_model>
[/let]
[/let]
</fault_mode>
[/for]
</fault_modes>
</fault_model>
[/for]
</fault_models>
</nominal_component_extensions>
[/for]
</extensions>
</fault_extension_info>
[/let]
[/let]
[/let]
[/let]
[/file]
[/template]
[query public getSystem(model : Model, sysQN : String) : Class = self.allOwnedElements()->filter(NamedElement)->
select(elem : NamedElement | elem.qualifiedName->notEmpty() and elem.qualifiedName.equalsIgnoreCase(sysQN))->asSequence()->first().oclAsType(Class)/]
[query public getType(type : Type) : String =
invoke('org.polarsys.chess.contracts.transformations.service.Service', 'getType(org.eclipse.uml2.uml.Type)', Sequence{type})/]
[query public getTypeNameForProperty(prop : Property) : String =
invoke('org.polarsys.chess.contracts.transformations.service.Service','getTypeNameForProperty(org.eclipse.uml2.uml.Property)', Sequence{prop}) /]