| <!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><CTRL>-<SPACE></em></strong> for content assist. |
| Also <strong><em><CTRL>-<SHIFT>-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 > Help Contents, |
| section CommaSuite User Guide or use F1.</p> |
| </li> |
| <li> |
| <p>Available example(s): File > New > 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 > 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 — 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…​, 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 …​ ")</p> |
| </li> |
| <li> |
| <p>open the PlantUML view; go to menu Window/Show View/Other…​ , |
| 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><CTRL>-<SHIFT>-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 > 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 > 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 ] -> 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/<taskname>/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&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&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 > 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 > Help Contents > CommaSuite User Guide > CommaSuite Languages > 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 > CommaSuite Languages > Interfaces > 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/<taskname>/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 >= 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 > New > 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><CTRL>-<SHIFT>-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> |