Domainmodel:
(elements+= (Component | Facet | InstanceOf | ServiceECA ))*
;
Domainmodel:
(elements+= (Component | Facet | InstanceOf | ServiceECA ))*
;
Component:
COMMENT*
name = ID '{' EOL+
(COMMENT* (installer += InstallerComp | alias += AliasComp | icon +=
IconComp|exports += ExportComp|imports += ImportComp|children +=
ChildrenComp | facets += FacetChild))*
'}' EOL+
;
Domainmodel:
(elements+= (Component | Facet | InstanceOf | ServiceECA ))*
;
Component:
COMMENT*
name = ID '{' EOL+
(COMMENT* (installer += InstallerComp | alias += AliasComp | icon +=
IconComp|exports += ExportComp|imports += ImportComp|children +=
ChildrenComp | facets += FacetChild))*
'}' EOL+
;
Domainmodel:
(elements+= (Component | Facet | InstanceOf | ServiceECA ))*
;
Facet:
COMMENT*
'facet' ':' name = ID '{' EOL+
(COMMENT* (installer += InstallerComp | icon += IconComp|exports
+= ExportComp| children += ChildrenComp | extends += ExtendComp))*
'}' EOL+
;
Domainmodel:
(elements+= (Component | Facet | InstanceOf | ServiceECA ))*
;
InstanceOf:
COMMENT*
'instanceof' ':' name = [Component] '{' EOL+
( instanceOfs += InstanceOf | (COMMENT* (nameChild += NameChildComp |
count += CountComp|channel += ChannelComp| instanceData +=
InstanceDataComp | instanceState+= InstanceStateComp)))*
'}' EOL+
;
• checkMandatoryFields
• checkRedifinitionFields
• checkComponentNotChildOfSelf
• checkUniqueNaming
• checkImportVariableCompatibleWithComponentType
and more..
• checkComponentNotChildOfSelf
for (childComponent : childComp.childs) {
if (childComponent.name == parentComponentName) {
error("A component can't be child of self");
return;
}
}
Apache0{
//…
}
Apache0{
//…
children:Apache0;
}
• checkUniqueNaming
exportComp.exports.forEach [ str |
if (exportComp.exports.filter[item|item.equals(str)].size > 1)
error("Redifinition of variables in exports.");
];
Apache0{
//…
exports: ip1;
}
Apache0{
//…
exports: ip1, ip2, ip1;
}
• checkImportVariableCompatibleWithComponentType
for (var i = 0; i < comps.size; i++) {
for (export : comps.get(i).exports.get(0).exports) {
if (export == import) {
componentFound = true;
}
}
}
Tomcat{
//…
imports:Apache0.foo;
}
Apache0{
//…
exports:ip,port;
}
• checkImportVariableCompatibleWithComponentType
for (var i = 0; i < comps.size; i++) {
for (export : comps.get(i).exports.get(0).exports) {
if (export == import) {
componentFound = true;
}
}
}
Tomcat{
//…
imports:Apache0.foo;
}
Tomcat{
//…
imports:Apache0.port;
}
Apache0{
//…
exports:ip,port;
}
facet:f2{
//…
exports: foo=50;
}
Apache0{
//…
exports:ip,port;
facets: f2;
}
Tomcat{
//…
imports:Apache0.foo;
}
facet:f2{
//…
exports: foo=50;
}
Apache0{
//…
exports:ip,port;
facets: f2;
}
Tomcat{
//…
imports:Apache0.foo;
}
ServiceECA:
COMMENT*
'serviceECA' '{' EOL+
(COMMENT* (
serviceECANameComp += ServiceECANameComp
|numInstancesComp += NumInstancesComp
| minAllowedInstancesComp += MinAllowedInstancesComp
| maxAllowedInstancesComp += MaxAllowedInstancesComp
| scaleCooldownInSec += ScaleCooldownInSec
| samplingPeriodInSec+= SamplingPeriodInSec
))*
scalingRule = ScalingRule
'}' EOL+
;
ScalingRule:
COMMENT*
'scalingRule' '{' EOL+
'serviceStats' '{' EOL+
(COMMENT* (serviceECANameComp += ServiceECANameComp | metric += MetricComp |
movingTimeRangeInSec += MovingTimeRangeInSecComp))*
'}' EOL+
'highThreshold' '{' EOL+
(COMMENT* (hTValueComp += HTValueComp | hTInstancesIncrease += HTInstancesIncrease))*
'}' EOL+
'lowThreshold' '{' EOL+
(COMMENT* (lTValueComp += LTValueComp | hTInstancesDecrease += HTInstancesDecrease))*
'}' EOL+
'}' EOL+
;
Roboconf DSL Advanced Software Engineering

Roboconf DSL Advanced Software Engineering