blob: c195c0725a53c8f3f45694ac240b5ead989c6676 [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="generator" content="Asciidoctor 2.0.15">
<link rel="icon" type="image/png" href="/favicon.png">
<title>Eclipse CommaSuite</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700">
<style>
/* Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */
/* Uncomment @import statement to use as custom stylesheet */
/*@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700";*/
article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}
audio,video{display:inline-block}
audio:not([controls]){display:none;height:0}
html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}
a{background:none}
a:focus{outline:thin dotted}
a:active,a:hover{outline:0}
h1{font-size:2em;margin:.67em 0}
abbr[title]{border-bottom:1px dotted}
b,strong{font-weight:bold}
dfn{font-style:italic}
hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}
mark{background:#ff0;color:#000}
code,kbd,pre,samp{font-family:monospace;font-size:1em}
pre{white-space:pre-wrap}
q{quotes:"\201C" "\201D" "\2018" "\2019"}
small{font-size:80%}
sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
sup{top:-.5em}
sub{bottom:-.25em}
img{border:0}
svg:not(:root){overflow:hidden}
figure{margin:0}
fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
legend{border:0;padding:0}
button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
button,input{line-height:normal}
button,select{text-transform:none}
button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}
button[disabled],html input[disabled]{cursor:default}
input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}
button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
textarea{overflow:auto;vertical-align:top}
table{border-collapse:collapse;border-spacing:0}
*,*::before,*::after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
html,body{font-size:100%}
body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;font-weight:400;font-style:normal;line-height:1;position:relative;cursor:auto;tab-size:4;word-wrap:anywhere;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}
a:hover{cursor:pointer}
img,object,embed{max-width:100%;height:auto}
object,embed{height:100%}
img{-ms-interpolation-mode:bicubic}
.left{float:left!important}
.right{float:right!important}
.text-left{text-align:left!important}
.text-right{text-align:right!important}
.text-center{text-align:center!important}
.text-justify{text-align:justify!important}
.hide{display:none}
img,object,svg{display:inline-block;vertical-align:middle}
textarea{height:auto;min-height:50px}
select{width:100%}
.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0}
a{color:#2156a5;text-decoration:underline;line-height:inherit}
a:hover,a:focus{color:#1d4b8f}
a img{border:0}
p{font-family:inherit;font-weight:400;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
p aside{font-size:.875em;line-height:1.35;font-style:italic}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
h1{font-size:2.125em}
h2{font-size:1.6875em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
h4,h5{font-size:1.125em}
h6{font-size:1em}
hr{border:solid #dddddf;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0}
em,i{font-style:italic;line-height:inherit}
strong,b{font-weight:bold;line-height:inherit}
small{font-size:60%;line-height:inherit}
code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
ul,ol{margin-left:1.5em}
ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em}
ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}
ul.square{list-style-type:square}
ul.circle{list-style-type:circle}
ul.disc{list-style-type:disc}
ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
dl dt{margin-bottom:.3125em;font-weight:bold}
dl dd{margin-bottom:1.25em}
abbr,acronym{text-transform:uppercase;font-size:90%;color:rgba(0,0,0,.8);border-bottom:1px dotted #ddd;cursor:help}
abbr{text-transform:none}
blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
@media screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
h1{font-size:2.75em}
h2{font-size:2.3125em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
h4{font-size:1.4375em}}
table{background:#fff;margin-bottom:1.25em;border:solid 1px #dedede;word-wrap:normal}
table thead,table tfoot{background:#f7f8f7}
table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
table tr.even,table tr.alt{background:#f8f8f7}
table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{line-height:1.6}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
.center{margin-left:auto;margin-right:auto}
.stretch{width:100%}
.clearfix::before,.clearfix::after,.float-group::before,.float-group::after{content:" ";display:table}
.clearfix::after,.float-group::after{clear:both}
:not(pre).nobreak{word-wrap:normal}
:not(pre).nowrap{white-space:nowrap}
:not(pre).pre-wrap{white-space:pre-wrap}
:not(pre):not([class^=L])>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background:#f7f7f8;-webkit-border-radius:4px;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed}
pre{color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;line-height:1.45;text-rendering:optimizeSpeed}
pre code,pre pre{color:inherit;font-size:inherit;line-height:inherit}
pre>code{display:block}
pre.nowrap,pre.nowrap pre{white-space:pre;word-wrap:normal}
em em{font-style:normal}
strong strong{font-weight:400}
.keyseq{color:rgba(51,51,51,.8)}
kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em white inset;box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em #fff inset;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
.keyseq kbd:first-child{margin-left:0}
.keyseq kbd:last-child{margin-right:0}
.menuseq,.menuref{color:#000}
.menuseq b:not(.caret),.menuref{font-weight:inherit}
.menuseq{word-spacing:-.02em}
.menuseq b.caret{font-size:1.25em;line-height:.8}
.menuseq i.caret{font-weight:bold;text-align:center;width:.45em}
b.button::before,b.button::after{position:relative;top:-1px;font-weight:400}
b.button::before{content:"[";padding:0 3px 0 2px}
b.button::after{content:"]";padding:0 2px 0 3px}
p a>code:hover{color:rgba(0,0,0,.9)}
#header,#content,#footnotes,#footer{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
#header::before,#header::after,#content::before,#content::after,#footnotes::before,#footnotes::after,#footer::before,#footer::after{content:" ";display:table}
#header::after,#content::after,#footnotes::after,#footer::after{clear:both}
#content{margin-top:1.25em}
#content::before{content:none}
#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf}
#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px}
#header .details{border-bottom:1px solid #dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap}
#header .details span:first-child{margin-left:-.125em}
#header .details span.email a{color:rgba(0,0,0,.85)}
#header .details br{display:none}
#header .details br+span::before{content:"\00a0\2013\00a0"}
#header .details br+span.author::before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
#header .details br+span#revremark::before{content:"\00a0|\00a0"}
#header #revnumber{text-transform:capitalize}
#header #revnumber::after{content:"\00a0"}
#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #dddddf;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
#toc{border-bottom:1px solid #e7e7e9;padding-bottom:.5em}
#toc>ul{margin-left:.125em}
#toc ul.sectlevel0>li>a{font-style:italic}
#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
#toc li{line-height:1.3334;margin-top:.3334em}
#toc a{text-decoration:none}
#toc a:active{text-decoration:underline}
#toctitle{color:#7a2518;font-size:1.2em}
@media screen and (min-width:768px){#toctitle{font-size:1.375em}
body.toc2{padding-left:15em;padding-right:0}
#toc.toc2{margin-top:0!important;background:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #e7e7e9;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
#toc.toc2>ul{font-size:.9em;margin-bottom:0}
#toc.toc2 ul ul{margin-left:0;padding-left:1em}
#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
body.toc2.toc-right{padding-left:0;padding-right:15em}
body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #e7e7e9;left:auto;right:0}}
@media screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
#toc.toc2{width:20em}
#toc.toc2 #toctitle{font-size:1.375em}
#toc.toc2>ul{font-size:.95em}
#toc.toc2 ul ul{padding-left:1.25em}
body.toc2.toc-right{padding-left:0;padding-right:20em}}
#content #toc{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
#content #toc>:first-child{margin-top:0}
#content #toc>:last-child{margin-bottom:0}
#footer{max-width:none;background:rgba(0,0,0,.8);padding:1.25em}
#footer-text{color:rgba(255,255,255,.8);line-height:1.44}
#content{margin-bottom:.625em}
.sect1{padding-bottom:.625em}
@media screen and (min-width:768px){#content{margin-bottom:1.25em}
.sect1{padding-bottom:1.25em}}
.sect1:last-child{padding-bottom:0}
.sect1+.sect1{border-top:1px solid #e7e7e9}
#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
#content h1>a.anchor::before,h2>a.anchor::before,h3>a.anchor::before,#toctitle>a.anchor::before,.sidebarblock>.content>.title>a.anchor::before,h4>a.anchor::before,h5>a.anchor::before,h6>a.anchor::before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
details,.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
details>summary:first-of-type{cursor:pointer;display:list-item;outline:none;margin-bottom:.75em}
.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
table.tableblock.fit-content>caption.title{white-space:nowrap;width:0}
.paragraph.lead>p,#preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)}
table.tableblock #preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:inherit}
.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
.admonitionblock>table td.icon{text-align:center;width:80px}
.admonitionblock>table td.icon img{max-width:none}
.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6);word-wrap:anywhere}
.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
.exampleblock>.content{border-style:solid;border-width:1px;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;-webkit-border-radius:4px;border-radius:4px}
.exampleblock>.content>:first-child{margin-top:0}
.exampleblock>.content>:last-child{margin-bottom:0}
.sidebarblock{border-style:solid;border-width:1px;border-color:#dbdbd6;margin-bottom:1.25em;padding:1.25em;background:#f3f3f2;-webkit-border-radius:4px;border-radius:4px}
.sidebarblock>:first-child{margin-top:0}
.sidebarblock>:last-child{margin-bottom:0}
.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
.literalblock pre,.listingblock>.content>pre{-webkit-border-radius:4px;border-radius:4px;overflow-x:auto;padding:1em;font-size:.8125em}
@media screen and (min-width:768px){.literalblock pre,.listingblock>.content>pre{font-size:.90625em}}
@media screen and (min-width:1280px){.literalblock pre,.listingblock>.content>pre{font-size:1em}}
.literalblock pre,.listingblock>.content>pre:not(.highlight),.listingblock>.content>pre[class="highlight"],.listingblock>.content>pre[class^="highlight "]{background:#f7f7f8}
.literalblock.output pre{color:#f7f7f8;background:rgba(0,0,0,.9)}
.listingblock>.content{position:relative}
.listingblock code[data-lang]::before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:inherit;opacity:.5}
.listingblock:hover code[data-lang]::before{display:block}
.listingblock.terminal pre .command::before{content:attr(data-prompt);padding-right:.5em;color:inherit;opacity:.5}
.listingblock.terminal pre .command:not([data-prompt])::before{content:"$"}
.listingblock pre.highlightjs{padding:0}
.listingblock pre.highlightjs>code{padding:1em;-webkit-border-radius:4px;border-radius:4px}
.listingblock pre.prettyprint{border-width:0}
.prettyprint{background:#f7f7f8}
pre.prettyprint .linenums{line-height:1.45;margin-left:2em}
pre.prettyprint li{background:none;list-style-type:inherit;padding-left:0}
pre.prettyprint li code[data-lang]::before{opacity:1}
pre.prettyprint li:not(:first-child) code[data-lang]::before{display:none}
table.linenotable{border-collapse:separate;border:0;margin-bottom:0;background:none}
table.linenotable td[class]{color:inherit;vertical-align:top;padding:0;line-height:inherit;white-space:normal}
table.linenotable td.code{padding-left:.75em}
table.linenotable td.linenos{border-right:1px solid currentColor;opacity:.35;padding-right:.5em}
pre.pygments .lineno{border-right:1px solid currentColor;opacity:.35;display:inline-block;margin-right:.75em}
pre.pygments .lineno::before{content:"";margin-right:-.125em}
.quoteblock{margin:0 1em 1.25em 1.5em;display:table}
.quoteblock:not(.excerpt)>.title{margin-left:-1.5em;margin-bottom:.75em}
.quoteblock blockquote,.quoteblock p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
.quoteblock blockquote{margin:0;padding:0;border:0}
.quoteblock blockquote::before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
.quoteblock .attribution{margin-top:.75em;margin-right:.5ex;text-align:right}
.verseblock{margin:0 1em 1.25em}
.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
.verseblock pre strong{font-weight:400}
.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
.quoteblock .attribution br,.verseblock .attribution br{display:none}
.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)}
.quoteblock.abstract blockquote::before,.quoteblock.excerpt blockquote::before,.quoteblock .quoteblock blockquote::before{display:none}
.quoteblock.abstract blockquote,.quoteblock.abstract p,.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{line-height:1.6;word-spacing:0}
.quoteblock.abstract{margin:0 1em 1.25em;display:block}
.quoteblock.abstract>.title{margin:0 0 .375em;font-size:1.15em;text-align:center}
.quoteblock.excerpt>blockquote,.quoteblock .quoteblock{padding:0 0 .25em 1em;border-left:.25em solid #dddddf}
.quoteblock.excerpt,.quoteblock .quoteblock{margin-left:0}
.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{color:inherit;font-size:1.0625rem}
.quoteblock.excerpt .attribution,.quoteblock .quoteblock .attribution{color:inherit;font-size:.85rem;text-align:left;margin-right:0}
p.tableblock:last-child{margin-bottom:0}
td.tableblock>.content{margin-bottom:1.25em;word-wrap:anywhere}
td.tableblock>.content>:last-child{margin-bottom:-1.25em}
table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
table.grid-all>*>tr>*{border-width:1px}
table.grid-cols>*>tr>*{border-width:0 1px}
table.grid-rows>*>tr>*{border-width:1px 0}
table.frame-all{border-width:1px}
table.frame-ends{border-width:1px 0}
table.frame-sides{border-width:0 1px}
table.frame-none>colgroup+*>:first-child>*,table.frame-sides>colgroup+*>:first-child>*{border-top-width:0}
table.frame-none>:last-child>:last-child>*,table.frame-sides>:last-child>:last-child>*{border-bottom-width:0}
table.frame-none>*>tr>:first-child,table.frame-ends>*>tr>:first-child{border-left-width:0}
table.frame-none>*>tr>:last-child,table.frame-ends>*>tr>:last-child{border-right-width:0}
table.stripes-all tr,table.stripes-odd tr:nth-of-type(odd),table.stripes-even tr:nth-of-type(even),table.stripes-hover tr:hover{background:#f8f8f7}
th.halign-left,td.halign-left{text-align:left}
th.halign-right,td.halign-right{text-align:right}
th.halign-center,td.halign-center{text-align:center}
th.valign-top,td.valign-top{vertical-align:top}
th.valign-bottom,td.valign-bottom{vertical-align:bottom}
th.valign-middle,td.valign-middle{vertical-align:middle}
table thead th,table tfoot th{font-weight:bold}
tbody tr th{background:#f7f8f7}
tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
p.tableblock>code:only-child{background:none;padding:0}
p.tableblock{font-size:1em}
ol{margin-left:1.75em}
ul li ol{margin-left:1.5em}
dl dd{margin-left:1.125em}
dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none}
ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em}
ul.unstyled,ol.unstyled{margin-left:0}
ul.checklist{margin-left:.625em}
ul.checklist li>p:first-child>.fa-square-o:first-child,ul.checklist li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em}
ul.checklist li>p:first-child>input[type="checkbox"]:first-child{margin-right:.25em}
ul.inline{display:-ms-flexbox;display:-webkit-box;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap;list-style:none;margin:0 0 .625em -1.25em}
ul.inline>li{margin-left:1.25em}
.unstyled dl dt{font-weight:400;font-style:normal}
ol.arabic{list-style-type:decimal}
ol.decimal{list-style-type:decimal-leading-zero}
ol.loweralpha{list-style-type:lower-alpha}
ol.upperalpha{list-style-type:upper-alpha}
ol.lowerroman{list-style-type:lower-roman}
ol.upperroman{list-style-type:upper-roman}
ol.lowergreek{list-style-type:lower-greek}
.hdlist>table,.colist>table{border:0;background:none}
.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}
td.hdlist1{font-weight:bold;padding-bottom:1.25em}
td.hdlist2{word-wrap:anywhere}
.literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
.colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top}
.colist td:not([class]):first-child img{max-width:none}
.colist td:not([class]):last-child{padding:.25em 0}
.thumb,.th{line-height:0;display:inline-block;border:solid 4px #fff;-webkit-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd}
.imageblock.left{margin:.25em .625em 1.25em 0}
.imageblock.right{margin:.25em 0 1.25em .625em}
.imageblock>.title{margin-bottom:0}
.imageblock.thumb,.imageblock.th{border-width:6px}
.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
.image.left{margin-right:.625em}
.image.right{margin-left:.625em}
a.image{text-decoration:none;display:inline-block}
a.image object{pointer-events:none}
sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
sup.footnote a,sup.footnoteref a{text-decoration:none}
sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}
#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0}
#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em}
#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none;margin-left:-1.05em}
#footnotes .footnote:last-of-type{margin-bottom:0}
#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
.gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0}
.gist .file-data>table td.line-data{width:99%}
div.unbreakable{page-break-inside:avoid}
.big{font-size:larger}
.small{font-size:smaller}
.underline{text-decoration:underline}
.overline{text-decoration:overline}
.line-through{text-decoration:line-through}
.aqua{color:#00bfbf}
.aqua-background{background:#00fafa}
.black{color:#000}
.black-background{background:#000}
.blue{color:#0000bf}
.blue-background{background:#0000fa}
.fuchsia{color:#bf00bf}
.fuchsia-background{background:#fa00fa}
.gray{color:#606060}
.gray-background{background:#7d7d7d}
.green{color:#006000}
.green-background{background:#007d00}
.lime{color:#00bf00}
.lime-background{background:#00fa00}
.maroon{color:#600000}
.maroon-background{background:#7d0000}
.navy{color:#000060}
.navy-background{background:#00007d}
.olive{color:#606000}
.olive-background{background:#7d7d00}
.purple{color:#600060}
.purple-background{background:#7d007d}
.red{color:#bf0000}
.red-background{background:#fa0000}
.silver{color:#909090}
.silver-background{background:#bcbcbc}
.teal{color:#006060}
.teal-background{background:#007d7d}
.white{color:#bfbfbf}
.white-background{background:#fafafa}
.yellow{color:#bfbf00}
.yellow-background{background:#fafa00}
span.icon>.fa{cursor:default}
a span.icon>.fa{cursor:inherit}
.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
.admonitionblock td.icon .icon-note::before{content:"\f05a";color:#19407c}
.admonitionblock td.icon .icon-tip::before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
.admonitionblock td.icon .icon-warning::before{content:"\f071";color:#bf6900}
.admonitionblock td.icon .icon-caution::before{content:"\f06d";color:#bf3400}
.admonitionblock td.icon .icon-important::before{content:"\f06a";color:#bf0000}
.conum[data-value]{display:inline-block;color:#fff!important;background:rgba(0,0,0,.8);-webkit-border-radius:50%;border-radius:50%;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
.conum[data-value] *{color:#fff!important}
.conum[data-value]+b{display:none}
.conum[data-value]::after{content:attr(data-value)}
pre .conum[data-value]{position:relative;top:-.125em}
b.conum *{color:inherit!important}
.conum:not([data-value]):empty{display:none}
dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
h1,h2,p,td.content,span.alt{letter-spacing:-.01em}
p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
p,blockquote,dt,td.content,span.alt{font-size:1.0625rem}
p{margin-bottom:1.25rem}
.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
.exampleblock>.content{background:#fffef7;border-color:#e0e0dc;-webkit-box-shadow:0 1px 4px #e0e0dc;box-shadow:0 1px 4px #e0e0dc}
.print-only{display:none!important}
@page{margin:1.25cm .75cm}
@media print{*{-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important}
html{font-size:80%}
a{color:inherit!important;text-decoration:underline!important}
a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
a[href^="http:"]:not(.bare)::after,a[href^="https:"]:not(.bare)::after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
abbr[title]::after{content:" (" attr(title) ")"}
pre,blockquote,tr,img,object,svg{page-break-inside:avoid}
thead{display:table-header-group}
svg{max-width:100%}
p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
#header,#content,#footnotes,#footer{max-width:none}
#toc,.sidebarblock,.exampleblock>.content{background:none!important}
#toc{border-bottom:1px solid #dddddf!important;padding-bottom:0!important}
body.book #header{text-align:center}
body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em}
body.book #header .details{border:0!important;display:block;padding:0!important}
body.book #header .details span:first-child{margin-left:0!important}
body.book #header .details br{display:block}
body.book #header .details br+span::before{content:none!important}
body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
.listingblock code[data-lang]::before{display:block}
#footer{padding:0 .9375em}
.hide-on-print{display:none!important}
.print-only{display:block!important}
.hide-for-print{display:none!important}
.show-for-print{display:inherit!important}}
@media print,amzn-kf8{#header>h1:first-child{margin-top:1.25rem}
.sect1{padding:0!important}
.sect1+.sect1{border:0}
#footer{background:none}
#footer-text{color:rgba(0,0,0,.6);font-size:.9em}}
@media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}}
</style>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
</head>
<body class="article toc2 toc-left">
<div id="header">
<div id="toc" class="toc2">
<div id="toctitle">Index</div>
<ul class="sectlevel1"><li><a style="" href="../index.html">Home</a></li><li><a style="" href="../site/download.html">Download</a></li><li><a style="" href="../site/developers.html">Developers</a></li><li><a style="" href="../user_guide.html">User guide</a><ul class="sectlevel2"><li><a style="" href="../overview/intro.html">Language overview</a><ul class="sectlevel3"><li><a style="" href="../overview/gettingstarted.html">Getting started</a><ul class="sectlevel4"></ul></li><li><a style="" href="../language/language.html">Language</a><ul class="sectlevel4"><li><a style="" href="../language/types.html">Types</a><ul class="sectlevel5"></ul></li><li><a style="" href="../language/interfaces.html">Interface signatures</a><ul class="sectlevel5"></ul></li><li><a style="" href="../language/statemachines.html">Interfaces</a><ul class="sectlevel5"><li><a style="" href="../language/states.html">States</a><ul class="sectlevel6"></ul></li><li><a style="" href="../language/transitions.html">Transitions</a><ul class="sectlevel6"></ul></li><li><a style="" href="../language/timing_constraints.html">Timing constraints</a><ul class="sectlevel6"></ul></li><li><a style="" href="../language/data_constraints.html">Data constraints</a><ul class="sectlevel6"></ul></li><li><a style="" href="../language/generic_constraints.html">Generic constraints</a><ul class="sectlevel6"></ul></li></ul></li><li><a style="" href="../language/components.html">Components</a><ul class="sectlevel5"></ul></li><li><a style="" href="../language/expressions.html">Statements and expressions</a><ul class="sectlevel5"></ul></li><li><a style="" href="../language/comments.html">Documenting models</a><ul class="sectlevel5"></ul></li></ul></li></ul></li><li><a style="" href="../generators/generators.html">Generator tasks</a><ul class="sectlevel3"><li><a style="" href="../generators/umlgeneration.html">Generation of UML diagrams</a><ul class="sectlevel4"></ul></li><li><a style="" href="../generators/docgeneration.html">Document generation</a><ul class="sectlevel4"></ul></li><li><a style="" href="../generators/monitoring.html">Monitoring</a><ul class="sectlevel4"></ul></li><li><a style="" href="../generators/reachabilitygraph.html">Reachability graph</a><ul class="sectlevel4"></ul></li><li><a style="" href="../generators/testgeneration.html">Test generation</a><ul class="sectlevel4"></ul></li></ul></li><li><a style="" href="intro.html">Tutorial</a><ul class="sectlevel3"><li><a style="" href="preparation.html">Preparation</a><ul class="sectlevel4"></ul></li><li><a style="" href="serviceinterface.html">Service interface</a><ul class="sectlevel4"><li><a style="" href="activity1.html">Activity 1: Get familiar with the Vending Machine</a><ul class="sectlevel5"></ul></li><li><a style="" href="activity2.html">Activity 2: Make an initial specification of the service interface</a><ul class="sectlevel5"></ul></li><li><a style="" href="activity3.html">Activity 3: Check an execution trace against the state machine</a><ul class="sectlevel5"></ul></li><li><a style="" href="activity4.html">Activity 4: Extend the specification of the service interface</a><ul class="sectlevel5"></ul></li><li><a style="" href="activity5.html">Activity 5: Add a time constraint</a><ul class="sectlevel5"></ul></li><li><a style="" href="activity6.html">Activity 6: Documentation generation</a><ul class="sectlevel5"></ul></li></ul></li><li><a style="" href="coincheckinterface.html">Coin checker interface</a><ul class="sectlevel4"><li><a style="" href="activity7.html">Activity 7: State machine of the coin checker</a><ul class="sectlevel5"></ul></li><li><a style="" href="activity8.html">Activity 8: Check the specified interfaces by monitoring</a><ul class="sectlevel5"></ul></li></ul></li><li><a style="" href="userinterface.html">User interface</a><ul class="sectlevel4"><li><a style="" href="activity9.html">Activity 9: State machine of the user interface</a><ul class="sectlevel5"></ul></li><li><a style="" href="activity10.html">Activity 10: Check the specified interfaces by monitoring</a><ul class="sectlevel5"></ul></li><li><a style="" href="activity11.html">Activity 11: Define time constraints</a><ul class="sectlevel5"></ul></li><li><a style="" href="activity12.html">Activity 12: Define a data constraint</a><ul class="sectlevel5"></ul></li></ul></li><li><a style="" href="componentmodel.html">Component model</a><ul class="sectlevel4"><li><a style="" href="activity13.html">Activity 13: Define component and add functional constraint</a><ul class="sectlevel5"></ul></li><li><a style="" href="activity14.html">Activity 14: Define additional component constraints</a><ul class="sectlevel5"></ul></li></ul></li><li><a style="" href="concludingremarks.html">Concluding remarks</a><ul class="sectlevel4"></ul></li></ul></li><li><a style="" href="../commandline/commandline.html">Command line tool</a><ul class="sectlevel3"></ul></li><li><a style="" href="../eventfiles/eventfiles.html">Event files</a><ul class="sectlevel3"></ul></li><li><a style="" href="../shortcuts/shortcuts.html">Shortcuts</a><ul class="sectlevel3"></ul></li><li><a style="" href="../problems/problemsolving.html">Problem solving</a><ul class="sectlevel3"></ul></li></ul></li></ul>
</div>
</div>
<div id="content">
<div class="sect1">
<h2 id="_tutorial"><a class="anchor" href="#_tutorial"></a>Tutorial</h2>
<div class="sectionbody">
<div class="sect2 normal">
<h3 id="_introduction"><a class="anchor" href="#_introduction"></a>Introduction</h3>
<div class="paragraph">
<p>The goal of this tutorial is to get experience with interface modeling in CommaSuite and
the use of the generator facilities of the CommaSuite tooling.
First in Section 1.1 a short overview of the CommaSuite approach is given.
As a case study we use a small vending machine example as described in Section 1.2.
Resources for support are listed in Section 1.3.
The structure of the remainder of this tutorial is described in Section 1.4.</p>
</div>
<div class="paragraph">
<p>This tutorial assumes that the tool installation has been completed
and requires a zip file <em>VendingMachine.zip</em>
which contains a project which is the starting point for the exercises.</p>
</div>
<div class="sect3">
<h4 id="_overview"><a class="anchor" href="#_overview"></a>Overview</h4>
<div class="paragraph">
<p>The lack of precise and explicit specifications of component interfaces often
leads to problems during the integration of components.
Also updates of components might lead to system issues,
e.g., caused by changes in the interaction protocol or timing behavior.
At system level, it is usually difficult to detect the source of such issues.
The challenge is to develop a set of tools which allows the precise definition and
analysis of client-server interfaces.</p>
</div>
<div class="paragraph">
<p>The CommaSuite (Component Modeling and Analysis) approach is based on a
hierarchy of Domain Specific Languages (DSLs).
Interface specifications in CommaSuite consist of three main ingredients,
as illustrated in <a href="#img_client-server">[img_client-server]</a>:</p>
</div>
<div id="img_client-server" class="paragraph">
<p><span class="image"><img src="../img/image1.png" alt="image" width="248" height="146" title="Client-server interface"></span></p>
</div>
<div class="ulist">
<ul>
<li>
<p>The interface signature, i.e., the set of commands, signals and notifications
that a server offers to its clients.</p>
<div class="ulist">
<ul>
<li>
<p>Commands: synchronous function calls from client to server;
the server sends a reply to the client</p>
</li>
<li>
<p>Signals: asynchronous function calls from client to server;
the server does not send a reply</p>
</li>
<li>
<p>Notifications: asynchronous messages from server to client;
the client does not send a reply</p>
</li>
</ul>
</div>
</li>
<li>
<p>State machine(s) that describe the interaction protocol between
client and server, i.e., the allowed sequence of commands, signals and
notifications.</p>
</li>
<li>
<p>Data and timing constraints on the client-server interaction,
such as lower and upper bounds on response times, periodicity requirements,
and constraints on parameters of subsequent events.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>For an interface, the tooling generates a large number of artefacts such as:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>UML diagrams of the state machine(s) and constraints.
Also a document according to a company template can be generated.</p>
</li>
<li>
<p>A framework to monitor whether implementations of client and
server conform to the specified interface.</p>
</li>
<li>
<p>Stubs and simulation possibilities.</p>
</li>
<li>
<p>Scenarios for test case generation.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>An important analysis tool is the monitoring framework, which allows frequent
checks on interface conformance.
For instance, during nightly tests and after components updates.
Monitoring is based on a trace of client-server interactions, e.g.,
obtained via logging or sniffing.
When a trace does not conform to the state machine behavior,
the monitoring tool generates an error and stops monitoring.
When a data or time constraint is violated, a warning is generated and
monitoring continues.
Monitoring also provides statistics about the specified time constraints,
e.g., a histogram of the observed response times.
In this tutorial, monitoring will be triggered manually,
but there command-line tooling is available such that it can be invoked
automatically during the test process.</p>
</div>
<div class="paragraph">
<p>An overview of the approach is shown in <a href="#img_overview">[img_overview]</a>.</p>
</div>
<div id="img_overview" class="paragraph">
<p><span class="image"><img src="../img/image2.png" alt="image" width="601" height="309" title="Overview of the CommaSuite approach"></span></p>
</div>
</div>
<div class="sect3">
<h4 id="_case_study"><a class="anchor" href="#_case_study"></a>Case study</h4>
<div class="paragraph">
<p>As a case study, we consider a simple <em>vending machine</em> implemented in Java.
There is a GUI that can be used to interact with the vending machine.
During the workshop, the interface <em>behavior</em> of the vending machine component
will be specified using CommaSuite.
The interaction between the GUI and the vending machine will be
recorded in a trace file and using CommaSuite it can be checked
if it conforms to the specified behavior.
In addition, the tutorial addresses the generation of other artefacts such
as UML diagrams and documentation.</p>
</div>
<div class="paragraph">
<p>The vending machine is a component with three interfaces,
as shown in <a href="#img_interfaces_vm">[img_interfaces_vm]</a>.</p>
</div>
<div class="ulist">
<ul>
<li>
<p>A provided interface for users to insert money, order products and get money back.</p>
</li>
<li>
<p>A provided service interface to switch the machine on and off, and to load products.</p>
</li>
<li>
<p>A required interface to check coins.
The coin check component which provides this interface may raise an error,
called CoinCheckerProblem, and it can be reset.</p>
</li>
</ul>
</div>
<div id="img_interfaces_vm" class="paragraph">
<p><span class="image"><img src="../img/image3.png" alt="image3" height="146" title="Interfaces of the Vending Machine component"></span></p>
</div>
<div class="paragraph">
<p><em>Note:
this manual is suitable for the Standard version and the Philips version of CommaSuite.
In <a href="#_model_and_check_the_interfaces_of_the_vending_machine">Model and check the interfaces of the vending machine</a>,
Activity 6 is different for the two versions and
Activity 7 is only for the Philips version.</em></p>
</div>
</div>
<div class="sect3">
<h4 id="_resources_for_additional_support"><a class="anchor" href="#_resources_for_additional_support"></a>Resources for additional support</h4>
<div class="paragraph">
<p>There are several resources for additional support:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Shortcuts in the user guide provides an overview of Eclipse commands and shortcuts.
Most import is <strong><em>&lt;CTRL&gt;-&lt;SPACE&gt;</em></strong> for content assist.
Also <strong><em>&lt;CTRL&gt;-&lt;SHIFT&gt;-F</em></strong> for automatic formatting might be useful.</p>
</li>
<li>
<p>Together with the tutorial, a cheat sheet is distributed which provides an
example of the grammar for state machines.</p>
</li>
<li>
<p>The CommaSuite help in Eclipse: go to menu Help &gt; Help Contents,
section CommaSuite User Guide or use F1.</p>
</li>
<li>
<p>Available example(s): File &gt; New &gt; Example ; see CommaSuite Examples.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Problem solving:</strong></p>
</div>
<div class="ulist">
<ul>
<li>
<p>Sometimes the Console view might become black as shown in <a href="#img_black-console">[img_black-console]</a>.
Then right-click in the window, select Preferences.
In Console view click on Background color,
select white from Basic colors, OK, Apply and Close.</p>
</li>
</ul>
</div>
<div id="img_black-console" class="paragraph">
<p><span class="image"><img src="../img/image4.png" alt="image" width="300" height="100" title="Black console view"></span></p>
</div>
<div class="ulist">
<ul>
<li>
<p>In case of problems, e.g. because of caching, Project &gt; Clean might help.
Otherwise try a complete restart of Eclipse.</p>
</li>
<li>
<p>Note: the Tasks view can be minimized.</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_preparation_for_the_vending_machine_interfaces"><a class="anchor" href="#_preparation_for_the_vending_machine_interfaces"></a>Preparation for the vending machine interfaces</h3>
<div class="paragraph">
<p>This section contains a number of activities to prepare the definition of
state machines for the interfaces in Section 3.</p>
</div>
<div class="paragraph">
<p>Create a folder <em>"ComMAWorkshop"</em> at a high level in your folder structure&#8201;&#8212;&#8201;a deeply nested folder leads
to avoid long path names which might create problems.
Start Eclipse with the created folder <em>ComMAWorkshop</em> as workspace.
Import the vending machine project as follows:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Go to menu File/Import&#8230;&#8203;, open folder General and
select "Existing Projects into Workspace".
Hit the Next button.</p>
</li>
<li>
<p>Select the "Select archive file" option and browse to select
the <em>VendingMachine.zip</em> file.
The project should be selected (otherwise select it manually) and click Finish</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>The imported project contains:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>A <em>src</em> folder with the Java implementation and a GUI of the vending machine.</p>
</li>
<li>
<p>File <em>VendingMachine.types</em> which defines a number of types,
in addition to the predefined types such as bool, int, real, and string.</p>
</li>
<li>
<p>Folder <em>IService</em> which contains:</p>
<div class="ulist">
<ul>
<li>
<p>File <em>IService.signature</em> which defines the signature of the IService interface.
Note that the files imports the .types file.
In general, the names of imported .types files must be different from the signature
file name (to avoid potential name clashes in generated code).
The doxygen-style tags in the comments will be used for document generation,
as explained later.</p>
</li>
<li>
<p>File <em>IService.interface</em> with a dummy state machine.
Note that there are warnings about unused messages from the signature.
By means of the activities below, the state machine will gradually be completed
for these messages.
In general, a state machine describes the interface protocol from the viewpoint of
server, i.e. which commands and signals can it receive in any state and
which notifications it is allowed to send.
Messages that are not specified are not allowed.</p>
</li>
</ul>
</div>
</li>
<li>
<p>File <em>VendingMachine.prj</em> in which generator tasks will be specified.
Files with this extension should always be placed in the main project folder.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_model_and_check_the_interfaces_of_the_vending_machine"><a class="anchor" href="#_model_and_check_the_interfaces_of_the_vending_machine"></a>Model and check the interfaces of the vending machine</h3>
<div class="paragraph">
<p>The section contains activities to specify the three interfaces of the vending machine
such that they conform to the implementation.
Conformance is checked by the generated monitoring.
Moreover a few other artifacts are generated.</p>
</div>
<div class="sect3">
<h4 id="_specify_the_service_interface"><a class="anchor" href="#_specify_the_service_interface"></a>Specify the service interface</h4>
<div class="paragraph">
<p>The behavioral specification in the file <em>IService.interface</em> is extended by a
number of activities.</p>
</div>
<div class="sect4">
<h5 id="_activity_1_get_familiar_with_the_vending_machine"><a class="anchor" href="#_activity_1_get_familiar_with_the_vending_machine"></a>Activity 1: Get familiar with the Vending Machine</h5>
<div class="ulist">
<ul>
<li>
<p>Navigate to folder <em>src/vendingMachine.</em> It contains file <em>TestUI.java</em>.
Run this file as a Java application (right click and then <em>Run as/Java Application</em>).</p>
</li>
<li>
<p>This leads to a GUI where buttons are commands that the machine can execute.
Some commands require the selection of the result, indicated in red.</p>
</li>
<li>
<p>Use the <em>Start</em> button and experiment with the machine, with a focus on
the service interface.</p>
</li>
<li>
<p>After pushing the <em>Save</em> button, the sequence of the executed commands and
the responses is stored as an execution trace in the file <em>VendingMachine.events</em>.
This file will be used later to check if the trace conforms to a behavioral specification.
If the file <em>VendingMachine.events</em> is not visible in the project,
right-click on the project and choose "Refresh" or F5.</p>
</li>
</ul>
</div>
</div>
<div class="sect4">
<h5 id="_activity_2_make_an_initial_specification_of_the_service_interface"><a class="anchor" href="#_activity_2_make_an_initial_specification_of_the_service_interface"></a>Activity 2: Make an initial specification of the service interface</h5>
<div class="paragraph">
<p>The goal of this activity is to create an initial version of
a state machine model for the service interface.
Open file <em>IService.interface</em> and modify the dummy state machine such that
it matches the following description:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Initially the vending machine only accepts the <em>SwitchOn</em> command,
which leads to result OK and the machine becomes operational.</p>
</li>
<li>
<p>When the machine is operational, it accepts command <em>LoadProduct</em>.
Moreover it can be switched off by the <em>SwitchOff</em> signal.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Hints:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Ctrl-space provides templates for various types of transitions.</p>
</li>
<li>
<p>Use <span class="purple"><strong>reply</strong></span> for a void command such as <em>LoadProduct</em>.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>When ready with the state machine,
extend the project file with a generator for UML diagrams as follows.
Open file <em>VendingMachine.prj</em>,
place the cursor between the two brackets and
use Ctrl-space to inspect the possible generators;
select "Generate UML Block" by double clicking.</p>
</div>
<div class="paragraph">
<p>Next right-click on file <em>VendingMachine.prj</em>
(or somewhere in the editor of the file) and choose
"Execute CommaSuite Workflow".</p>
</div>
<div class="ulist">
<ul>
<li>
<p>In the lower right corner there is an indication in green while the workflow is
being executed.</p>
</li>
<li>
<p>When finished, the result can be inspected in folder <em>src-gen/uml</em>.</p>
</li>
<li>
<p>Since the project file contains a task to generate UML, the CommaSuite tool
generates UML state machine diagrams in the form of</p>
<div class="ulist">
<ul>
<li>
<p><em>.png</em> files; note that there are reduced version of the state machine
which is convenient for large state machines</p>
</li>
<li>
<p><em>.plantUML</em> files; to show the diagram,</p>
<div class="ulist">
<ul>
<li>
<p>open the file (in case a pop-up occurs, select "Associate '*.plantuml' files
with the current editor &#8230;&#8203; ")</p>
</li>
<li>
<p>open the PlantUML view; go to menu Window/Show View/Other&#8230;&#8203; ,
expand the <em>PlantUML</em> folder and choose <em>PlantUML</em>.<br>
PlantUML files are displayed using Graphviz. If this does not work correctly,
first restart Eclipse and try again; if this is not sufficient,
add the path to the <em>bin</em> folder of Graphviz to the <em>path</em> environment variable.</p>
</li>
</ul>
</div>
</li>
<li>
<p><em>.graphml</em>; these files can be edited with, for instance, yEd.
This is outside the scope of this tutorial; guidelines can be found on <a href="http://comma.esi.nl/" class="bare">http://comma.esi.nl/</a>.</p>
</li>
</ul>
</div>
</li>
</ul>
</div>
</div>
<div class="sect4">
<h5 id="_activity_3_check_an_execution_trace_against_the_state_machine"><a class="anchor" href="#_activity_3_check_an_execution_trace_against_the_state_machine"></a>Activity 3: Check an Execution Trace against the State Machine</h5>
<div class="paragraph">
<p>Once the initial state machine model is defined,
an execution trace like <em>VendingMachine.events</em> can be checked for
conformance against this model.
First create in the main project directory
a folder <em>VendingMachineEventsFiles</em>.
Next extend <em>VendingMachine.prj</em> with a task
to generate the monitoring (you may copy the text below):</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>Generate Monitors {
monitoringIService for interface IService {
trace directories "VendingMachineEventsFiles"
}
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>The lay-out can be improved by means of <em>&lt;CTRL&gt;-&lt;SHIFT&gt;-F</em>.
Next perform the following steps:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Execute again the steps from Activity 1 by just switching on and off
the machine a couple of times and performing <em>LoadProducts</em>.
Do not perform any other actions!
These actions are recorded in file <em>VendingMachine.events</em>.</p>
</li>
<li>
<p>Rename <em>VendingMachine.events</em> to <em>VendingMachine1.events</em>
(use right-click on the files &gt; Refactor) and
move it to folder <em>VendingMachineEventsFiles</em>.</p>
</li>
<li>
<p>Construct a few more .event files, including a few that
do not conform to the specification, and move them also
to folder <em>VendingMachineEventsFiles</em> after renaming.</p>
</li>
<li>
<p>Right-click on file <em>VendingMachine.prj</em> and
choose "Run As &gt; CommaSuite Generation and Monitoring"<em>.</em>
The check is executed and results are produced.</p>
<div class="ulist">
<ul>
<li>
<p>In order to view the results of monitoring,
see folder <em>comma-gen/monitoringIService.</em>
If there are no errors, coverage info can be found in file <em>CoverageInfo.txt</em>.
In each state the transitions are numbered in the order of
occurrence and the file describes for each transition
how often it was used during monitoring.
If a transition contains multiple clauses (by mean of the "OR" construct)
then also the clauses are numbered.
The file also report the percentage of covered transitions and states.</p>
</li>
<li>
<p>In case of errors, an overview is giving in file <em>ErrorSummary.txt</em>
with an indication where to find the errors.</p>
</li>
<li>
<p>Folder <em>Statistics</em> is related to time constraints and
will be explained later.</p>
</li>
</ul>
</div>
</li>
<li>
<p>In case of errors, a sequence diagram of the error trace is
written in a file with extension <em>.plantuml</em>.
Show the content using the PlantUML view as described in Activity 2.</p>
</li>
</ol>
</div>
</div>
<div class="sect4">
<h5 id="_activity_4_extend_specification_of_service_interface"><a class="anchor" href="#_activity_4_extend_specification_of_service_interface"></a>Activity 4: Extend specification of service interface</h5>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Extend the specification in <em>IService.interface</em> with the remaining part
of the signature according to the following informal description:</p>
<div class="ulist">
<ul>
<li>
<p>At any point in time, the vending machine may send an <em>OutOfOrder</em> notification
(indicating some internal problem), going into error mode.
Note that such an autonomous action of the server can be modelled as
a transition without trigger and a notification in the "do"-part.</p>
</li>
<li>
<p>In error mode, the <em>SwitchOn</em> command fails and the commands to switch
off and load product have no effect.</p>
</li>
<li>
<p>In error mode, the <em>Reset</em> command may bring the vending machine
to the initial state where it is off.
There is also a possibility that the <em>Reset</em> command fails.
The <em>Reset</em> command is not allowed outside error mode.</p>
</li>
</ul>
</div>
</li>
</ol>
</div>
<div class="olist arabic">
<ol class="arabic" start="2">
<li>
<p>Use monitoring to check the correctness of the IService specification
with respect to the implementation:</p>
<div class="ulist">
<ul>
<li>
<p>To generate an <em>OutOfOrder</em> notification, click the <em>CoinChecker</em> Problem
button of the coin checker interface.</p>
</li>
<li>
<p>After a <em>Reset</em>, select the result.</p>
</li>
</ul>
</div>
</li>
</ol>
</div>
</div>
<div class="sect4">
<h5 id="_activity_5_add_a_time_constraint"><a class="anchor" href="#_activity_5_add_a_time_constraint"></a>Activity 5: Add a time constraint</h5>
<div class="paragraph">
<p>Interface specifications can be extended with constraints on time and data.</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>As example, after the state machine in <em>IService.interface</em>,
add the following time constraint with name <em>loadProduct_reply</em> :</p>
</li>
</ol>
</div>
<div class="listingblock">
<div class="content">
<pre>timing constraints
loadProduct_reply
command LoadProduct - [ 1000.0 ms .. 1100.0 ms ] -&gt; reply to command LoadProduct</pre>
</div>
</div>
<div class="paragraph">
<p>It specifies that after a command <em>LoadProduct</em>,
the reply to this command should occur in the interval [1000, 1100],
so after 1000 ms and before 1100 ms have elapsed.
Note that a real is denoted in CommaSuite with a dot, e.g. 7.0, or
exponential notation, e.g. 3.4e-5.</p>
</div>
<div class="olist arabic">
<ol class="arabic" start="2">
<li>
<p>Use the GUI to create a .event file where the command <em>LoadProduct</em>
is called a number of times,
e.g. interleaved with other events.</p>
</li>
<li>
<p>Run the monitoring and inspect the results; note that violations
to time constraints lead to warnings.</p>
</li>
<li>
<p>When a trace is checked against time constraints, statistical information is collected.
The information is located in folder <em>comma-gen/&lt;taskname&gt;/statistics</em> in a file
with extension .statistics.
You can view different charts generated from files with prefix <em>statisticsTime</em>
by right-clicking on it
and choosing menu <em>Show Statistics Charts</em>.
You can find more information about statistics in CommaSuite Help,
section <em>Generation of Statistics.</em></p>
</li>
</ol>
</div>
</div>
<div class="sect4">
<h5 id="_activity_6_documentation_generation_for_the_philips_version"><a class="anchor" href="#_activity_6_documentation_generation_for_the_philips_version"></a>Activity 6: Documentation Generation <em>for the Philips version</em></h5>
<div class="paragraph">
<p>To obtain documentation for the Philips version of the tooling, first obtain the template as follows.</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Right-click on <em>VendingMachine.prj</em> and select "Import Philips Template";
this adds a file <em>Template.docx</em>.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Next extend <em>VendingMachine.prj</em> with the following task for document generation:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>Generate Documentations {
documentationTask for interface IService {
template = "Template.docx"
DHF = 123456
author = "John Smith"
- role = "R&amp;D: SW Designer"
}
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>Execute the CommaSuite workflow and next navigate to folder <em>src-gen/doc/</em> and
open the generated <em>.docx</em> file.
It contains information from the comments in the <em>.signature</em> and <em>.interface</em> files.
In addition, the simple state machine is presented in a table form.</p>
</div>
</div>
<div class="sect4">
<h5 id="_activity_6_documentation_generation_for_the_standard_version"><a class="anchor" href="#_activity_6_documentation_generation_for_the_standard_version"></a>Activity 6: Documentation Generation <em>for the Standard version</em></h5>
<div class="paragraph">
<p>To obtain documentation for the standard version of the tool, first obtain the template as follows.</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Right-click on <em>VendingMachine.prj</em> and select "Import Documentation Template";
this adds a file <em>Template.docx</em>. (Use Refresh / F5 on the project if the file is not visible.)</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Next extend <em>VendingMachine.prj</em> with the following task for document generation:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>Generate Documentations {
documentationTask for interface IService {
template = "Template.docx"
targetFile = "Documentation.docx"
author = "John Smith"
role = "R&amp;D: SW Designer"
}
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>Execute the CommaSuite workflow and next navigate to folder <em>src-gen/doc/</em> and
open the generated <em>.docx</em> file.
It contains information from the comments in the <em>.signature</em> and <em>.interface</em> files.
In addition, the simple state machine is presented in a table form.</p>
</div>
</div>
<div class="sect4">
<h5 id="_activity_7_sscf_generation_only_for_the_philips_version"><a class="anchor" href="#_activity_7_sscf_generation_only_for_the_philips_version"></a>Activity 7: SSCF Generation <em>only for the Philips version</em></h5>
<div class="paragraph">
<p>Extend <em>VendingMachine.prj</em> with the following task for SSCF generation:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>Generate CPP {
cppTask for interface IService
}</code></pre>
</div>
</div>
<div class="ulist">
<ul>
<li>
<p>Execute the CommaSuite workflow and navigate to folder <em>src-gen/cpp11</em>.
It contains the generated C proxy code following the SSCF conventions.
Code for C 98 is generated in folder <em>src-gen/cpp98</em>.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Also CLI code can be generated. When the specification includes user defined primitive types
that are not based on a CommaSuite primitive type, or when CommaSuite primitive types
such as <em>real</em>, <em>string</em> or <em>integer</em> need to be mapped to custom implementation types,
then a type mapping task is needed. See the CommaSuite help for more information.</p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_specify_the_coin_checker_interface"><a class="anchor" href="#_specify_the_coin_checker_interface"></a>Specify the coin checker interface</h4>
<div class="paragraph">
<p>In this section the required ICoinCheck interface is specified.
To avoid long execution times, the <em>VendingMachine.prj</em> file might be simplified
such that it only contains the monitoring task for the IService interface.</p>
</div>
<div class="paragraph">
<p>Folder ICoinCheck already contains the following files:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><em>ICoinCheck.signature</em> with the signature of the coin checker.</p>
</li>
<li>
<p><em>ICoinCheck.interface</em> with a dummy state machine that will
be extended in the following activities.</p>
</li>
</ul>
</div>
<div class="sect4">
<h5 id="_activity_8_state_machine_coin_checker"><a class="anchor" href="#_activity_8_state_machine_coin_checker"></a>Activity 8: State machine coin checker</h5>
<div class="paragraph">
<p>Adapt the state machine based on the following information:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>In the initial state only command <em>CheckCoin</em> can be accepted,
which results in a reply indicating that the coin is accepted or not accepted.</p>
</li>
<li>
<p>At any moment, the coin checker may generate a <em>CoinCheckerProblem</em> notification
after which the coin checker is in error mode.</p>
</li>
<li>
<p>The <em>ResetCoinChecker</em> command is only allowed in the error mode;
it may be successful, leading to the initial state or fail
(then the coin checker stays in error mode).</p>
</li>
</ul>
</div>
</div>
<div class="sect4">
<h5 id="_activity_9_check_the_specified_interfaces_by_monitoring"><a class="anchor" href="#_activity_9_check_the_specified_interfaces_by_monitoring"></a>Activity 9: Check the specified interfaces by monitoring</h5>
<div class="ulist">
<ul>
<li>
<p>Extend the project file <em>VendingMachine.prj</em> with an import of <em>ICoinCheck.interface.</em></p>
</li>
<li>
<p>Add a monitoring task as follows:</p>
</li>
</ul>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>Generate Monitors {
monitoringIService for interface IService {
trace directories "VendingMachineEventsFiles"
}
monitoringICoinCheck for interface ICoinCheck {
trace directories "VendingMachineEventsFiles"
}
}</code></pre>
</div>
</div>
<div class="ulist">
<ul>
<li>
<p>Use the GUI to generate a few .event files using commands from the service interface
and the possibility to generate an error by the coin checker interface.
Observe that the Reset operation requires the selection of a result.</p>
</li>
<li>
<p>Apply monitoring (right-click on <em>VendingMachine.prj</em> and
choose "Run As &gt; CommaSuite Generation and Monitoring") to check all <em>.event</em> files.
Inspect the result in folder <em>comma-gen</em>. Improve the state machine when needed.</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_specify_the_user_interface"><a class="anchor" href="#_specify_the_user_interface"></a>Specify the user interface</h4>
<div class="paragraph">
<p>Next the user interface is specified.
Folder IUser contains the following files:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><em>IUser.signature</em> with the signature of the user interface</p>
</li>
<li>
<p><em>IUser.interface</em> with a dummy state machine which is adapted in the following activities.</p>
</li>
</ul>
</div>
<div class="sect4">
<h5 id="_activity_10_state_machine_user_interface"><a class="anchor" href="#_activity_10_state_machine_user_interface"></a>Activity 10: State machine user interface</h5>
<div class="paragraph">
<p>To specify the behavior of the interface, first define and initialize two variables:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>a variable of type <em>integer</em> to represent the credit of the user, initialize it to 0;</p>
</li>
<li>
<p>a variable of type <em>pricesMap</em> (see <em>VendingMachine.types</em>) to represent
the prices of the product, where cola costs 3, juice costs 2, and water costs 1.
The cheat sheet contains an example of maps and also the help might be useful, see Help &gt; Help Contents &gt; CommaSuite User Guide &gt; CommaSuite Languages &gt; CommaSuite Statements
and Expressions.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Next define the state machine of the IUser interface according to the following description:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>In the initial state, when there is no credit, only command <em>InsertCoin</em> is allowed.
This command has an output parameter representing the credit when the command
has been completed.
This is specified as the first parameter in the reply,
where the second one is of type <em>CoinResult</em>.
See the CommaSuite User Guide in Eclipse &gt; CommaSuite Languages &gt; Interfaces &gt; Transitions.
<em>InsertCoin</em> may have three possible results:</p>
<div class="ulist">
<ul>
<li>
<p>The coin is accepted and the credit is increased by one.</p>
</li>
<li>
<p>The coin is not accepted and the credit is not changed.</p>
</li>
<li>
<p>The machine is not operational; in this case the value of
the out parameter is not specified, that is, any value is allowed.</p>
</li>
</ul>
</div>
</li>
<li>
<p>When the credit is positive, <em>InsertCoin</em> is also possible, as specified above.
In addition, <em>ReturnMoney</em> is allowed, returning the total amount of credit.
Finally, the command <em>OrderProduct</em> is allowed, which may
have a number of possible responses:</p>
<div class="ulist">
<ul>
<li>
<p>NOT_OPERATIONAL to indicate the machine is not operational</p>
</li>
<li>
<p>NOT_ENOUGH_MONEY to indicate that the credit is not sufficient</p>
</li>
<li>
<p>NO_PRODUCTS_AVAILABLE to indicate that the credit is sufficient,
but no products are available</p>
</li>
<li>
<p>DELIVERED to indicate that the credit is sufficient and the product is delivered</p>
</li>
</ul>
</div>
</li>
</ul>
</div>
</div>
<div class="sect4">
<h5 id="_activity_11_check_the_specified_interfaces_by_monitoring"><a class="anchor" href="#_activity_11_check_the_specified_interfaces_by_monitoring"></a>Activity 11: Check the specified interfaces by monitoring</h5>
<div class="ulist">
<ul>
<li>
<p>Extend the project file <em>VendingMachine.prj</em> with an import of <em>IUser.interface</em>.
Add a monitoring task for the IUser interface.</p>
</li>
<li>
<p>Use the GUI to generate .event files using commands from all interfaces.</p>
</li>
<li>
<p>Apply monitoring to check all .event files.
Inspect the coverage, the monitoring results and improve models when needed.</p>
</li>
</ul>
</div>
</div>
<div class="sect4">
<h5 id="_activity_12_define_time_and_data_constraints"><a class="anchor" href="#_activity_12_define_time_and_data_constraints"></a>Activity 12: Define time and data constraints</h5>
<div class="paragraph">
<p>A few constraints on time and data are added to interface IUser.</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Write two time constraint for the following requirements:</p>
<div class="olist loweralpha">
<ol class="loweralpha" type="a">
<li>
<p>the reply of a command to return money occurs between 1000.0 ms and 5000.0 ms</p>
</li>
<li>
<p>when an <em>OrderProduct</em> leads to a delivered product, the reply occurs within 3.0 ms</p>
</li>
</ol>
</div>
</li>
<li>
<p>Use the GUI to create a .event file where a coin is inserted many times and
money is returned frequently.
Similarly, construct a .events file where products are delivered several times.</p>
</li>
<li>
<p>Run the monitoring and inspect the results; note that violations to time constraints
lead to warnings.</p>
</li>
<li>
<p>When a trace is checked against time constraints, statistical information is collected.
The information is located in folder <em>comma-gen/&lt;taskname&gt;/statistics</em>
in a file with extension .statistics.
You can view different charts by right-clicking on a file with extension .statistics
and choosing menu <em>Show Statistics Charts</em>.
You can find more information about statistics in CommaSuite Help,
section <em>Generation of Statistics.</em></p>
</li>
</ol>
</div>
</div>
<div class="sect4">
<h5 id="_activity_13_define_a_data_constraint"><a class="anchor" href="#_activity_13_define_a_data_constraint"></a>Activity 13: Define a Data Constraint</h5>
<div class="olist arabic">
<ol class="arabic" start="1">
<li>
<p>Add the following data constraint which expresses that when the return of
money is requested,
the delivered amount cannot be negative:</p>
</li>
</ol>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>data constraints
variables
int val
returnReg command ReturnMoney;reply(val) where val &gt;= 0</code></pre>
</div>
</div>
<div class="olist arabic">
<ol class="arabic" start="2">
<li>
<p>Run the monitoring and inspect the results.</p>
</li>
</ol>
</div>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_specify_a_component"><a class="anchor" href="#_specify_a_component"></a>Specify a component</h3>
<div class="paragraph">
<p>The actions in this section illustrate the specification of a
component with provided and required interfaces.
Also relations between these interfaces can be expressed.</p>
</div>
<div class="sect3">
<h4 id="_add_component_constraints"><a class="anchor" href="#_add_component_constraints"></a>Add component constraints</h4>
<div class="paragraph">
<p>Constraints on relations between events of different interfaces can be expressed
in a CommaSuite component specifications with extension .component.
As an illustration we consider a vending machine component with interfaces
as depicted in <a href="#img_interfaces_vm">[img_interfaces_vm]</a>.</p>
</div>
<div class="sect4">
<h5 id="_activity_15_define_component_and_functional_constraint"><a class="anchor" href="#_activity_15_define_component_and_functional_constraint"></a>Activity 15: Define component and functional constraint</h5>
<div class="paragraph">
<p>Create in the main project directory a file <em>VendingMachine.component</em>
using File &gt; New &gt; File, with the VendingMachine project as parent.
Insert the following text (you may copy the text below):</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>import "IUser/IUser.interface"
import "IService/IService.interface"
import "ICoinCheck/ICoinCheck.interface"
component VendingMachine
provided port IUser vmUserPort
provided port IService vmServicePort
required port ICoinCheck vmCoinPort
functional constraints
OperationalConstraintInsertCoin {
/* InsertCoin Command of IUser returns NOT_OPERATIONAL
* when IService is not in state Operational
* Otherwise it returns ACCEPTED or NOT_ACCEPTED
*/
use events
vmUserPort::reply to command InsertCoin
initial state CoinReply {
vmUserPort::reply (*,CoinResult::NOT_OPERATIONAL) to command InsertCoin
where NOT vmServicePort in Operational
next state: CoinReply
vmUserPort::reply (*,CoinResult::ACCEPTED) to command InsertCoin
where vmServicePort in Operational
next state: CoinReply
vmUserPort::reply (*,CoinResult::NOT_ACCEPTED) to command InsertCoin
where vmServicePort in Operational
next state: CoinReply
}
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>Improve the lay-out using <em>&lt;CTRL&gt;-&lt;SHIFT&gt;-F</em>.</p>
</div>
<div class="paragraph">
<p>This specification assumes that interface IService has a state called <em>Operational</em>
to represent that the machine is on and not in an error.
Replace it with the state name of your model.</p>
</div>
<div class="paragraph">
<p>The functional constraint restricts the reply to command <em>InsertCoin</em>
as indicated in the <span class="purple">use events</span> part.
The specification expresses that when a reply to <em>InsertCoin</em> occurs,
one of the following cases should hold:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>the result is NOT_OPERATIONAL and
the state machine of the vmServicePort in not in state Operational, or</p>
</li>
<li>
<p>the result is ACCEPTED and
the state machine of the vmServicePort in in state Operational, or</p>
</li>
<li>
<p>the result is NOT_ACCEPTED and
the state machine of the vmServicePort in in state Operational.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>To monitor the component constraints, change the file <em>VendingMachine.prj</em> as follows:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Import <em>VendingMachine.component</em></p>
</li>
<li>
<p>Remove the current monitoring tasks</p>
</li>
<li>
<p>Add the following monitoring task:</p>
</li>
</ul>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>Generate Monitors {
monitoring for component VendingMachine {
trace directories "VendingMachineEventsFiles"
}
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>Component monitoring checks the components constraints and all interfaces of the component.</p>
</div>
<div class="paragraph">
<p>Run monitoring and inspect the result in folder <em>comma-gen/monitoring</em>.
Note that the folder contains and a summary of all errors and warnings.
Moreover, the coverage file provides an overview of all component interfaces.</p>
</div>
</div>
<div class="sect4">
<h5 id="_activity_15_define_additional_component_constraints"><a class="anchor" href="#_activity_15_define_additional_component_constraints"></a>Activity 15: Define additional component constraints</h5>
<div class="ulist">
<ul>
<li>
<p>Define a functional constraint for the vending machine component
which expresses that each <em>Reset</em> on the service port is followed
by a <em>ResetCoinChecker</em> on the coin check port.</p>
</li>
<li>
<p>Define a time constraint (after heading <span class="purple"><strong>timing constraints</strong></span>)
which expresses that an <em>CoinCheckerProblem</em> notification on the coin check port
is followed by an <em>OutOfOrder</em> notification on the service port within 2 ms.</p>
</li>
<li>
<p>Run monitoring and inspect the results.</p>
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_concluding_remarks"><a class="anchor" href="#_concluding_remarks"></a>Concluding remarks</h3>
<div class="paragraph">
<p>As mentioned in the introduction, the CommaSuite tooling includes a
number of additional features,
such as simulation and the generation of stubs and tests.
Monitoring is supported by command-line tooling that can be integrated.
For instance, to perform monitoring after smoke tests automatically.</p>
</div>
<div class="paragraph">
<p>In the case study we started from an existing implementation and gradually
modeled its interfaces, checking conformance by manually constructing traces and
applying the generated monitoring.
An alternative is to generate test cases or a test client based on the CommaSuite model.
CommaSuite is also frequently applied for the definition of new interfaces,
for instance of third party components.
In these case, model simulation can be useful to validate the model.
Stubs might support the independent development of client and server.
Monitoring or test generation can be exploited to check if the implementations
conform to the interface models.</p>
</div>
</div>
</div>
</div>
</div>
</body>
</html>