Welcome to TiddlyWiki created by Jeremy Ruston, Copyright © 2007 UnaMesa Association
<!--{{{-->
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
<!--}}}-->
Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
/*{{{*/
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
a {color:[[ColorPalette::PrimaryMid]];}
a:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];}
a img {border:0;}
h1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}
h1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];}
h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}
.button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}
.button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}
.button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}
.header {background:[[ColorPalette::PrimaryMid]];}
.headerShadow {color:[[ColorPalette::Foreground]];}
.headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}
.headerForeground {color:[[ColorPalette::Background]];}
.headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}
.tabSelected{color:[[ColorPalette::PrimaryDark]];
background:[[ColorPalette::TertiaryPale]];
border-left:1px solid [[ColorPalette::TertiaryLight]];
border-top:1px solid [[ColorPalette::TertiaryLight]];
border-right:1px solid [[ColorPalette::TertiaryLight]];
}
.tabUnselected {color:[[ColorPalette::Background]]; background:[[ColorPalette::TertiaryMid]];}
.tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}
.tabContents .button {border:0;}
#sidebar {}
#sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}
#sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}
.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
border:1px solid [[ColorPalette::PrimaryMid]];}
.wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}
.wizard .notChanged {background:transparent;}
.wizard .changedLocally {background:#80ff80;}
.wizard .changedServer {background:#8080ff;}
.wizard .changedBoth {background:#ff8080;}
.wizard .notFound {background:#ffff80;}
.wizard .putToServer {background:#ff80ff;}
.wizard .gotFromServer {background:#80ffff;}
#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}
#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}
.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}
.popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}
.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}
.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}
.tiddler .defaultCommand {font-weight:bold;}
.shadow .title {color:[[ColorPalette::TertiaryDark]];}
.title {color:[[ColorPalette::SecondaryDark]];}
.subtitle {color:[[ColorPalette::TertiaryDark]];}
.toolbar {color:[[ColorPalette::PrimaryMid]];}
.toolbar a {color:[[ColorPalette::TertiaryLight]];}
.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}
.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}
.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}
.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}
.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}
.tagging .button, .tagged .button {border:none;}
.footer {color:[[ColorPalette::TertiaryLight]];}
.selected .footer {color:[[ColorPalette::TertiaryMid]];}
.sparkline {background:[[ColorPalette::PrimaryPale]]; border:0;}
.sparktick {background:[[ColorPalette::PrimaryDark]];}
.error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}
.warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}
.lowlight {background:[[ColorPalette::TertiaryLight]];}
.zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}
.imageLink, #displayArea .imageLink {background:transparent;}
.annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}
.viewer .listTitle {list-style-type:none; margin-left:-2em;}
.viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}
.viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}
.viewer table, table.twtable {border:2px solid [[ColorPalette::TertiaryDark]];}
.viewer th, .viewer thead td, .twtable th, .twtable thead td {background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::Background]];}
.viewer td, .viewer tr, .twtable td, .twtable tr {border:1px solid [[ColorPalette::TertiaryDark]];}
.viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}
.viewer code {color:[[ColorPalette::SecondaryDark]];}
.viewer hr {border:0; border-top:dashed 1px [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryDark]];}
.highlight, .marked {background:[[ColorPalette::SecondaryLight]];}
.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}
.editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}
.editorFooter {color:[[ColorPalette::TertiaryMid]];}
#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}
#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }
#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}
#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}
.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}
.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}
#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:'alpha(opacity=60)';}
/*}}}*/
/*{{{*/
* html .tiddler {height:1%;}
body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}
h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
h4,h5,h6 {margin-top:1em;}
h1 {font-size:1.35em;}
h2 {font-size:1.25em;}
h3 {font-size:1.1em;}
h4 {font-size:1em;}
h5 {font-size:.9em;}
hr {height:1px;}
a {text-decoration:none;}
dt {font-weight:bold;}
ol {list-style-type:decimal;}
ol ol {list-style-type:lower-alpha;}
ol ol ol {list-style-type:lower-roman;}
ol ol ol ol {list-style-type:decimal;}
ol ol ol ol ol {list-style-type:lower-alpha;}
ol ol ol ol ol ol {list-style-type:lower-roman;}
ol ol ol ol ol ol ol {list-style-type:decimal;}
.txtOptionInput {width:11em;}
#contentWrapper .chkOptionInput {border:0;}
.externalLink {text-decoration:underline;}
.indent {margin-left:3em;}
.outdent {margin-left:3em; text-indent:-3em;}
code.escaped {white-space:nowrap;}
.tiddlyLinkExisting {font-weight:bold;}
.tiddlyLinkNonExisting {font-style:italic;}
/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
a.tiddlyLinkNonExisting.shadow {font-weight:bold;}
#mainMenu .tiddlyLinkExisting,
#mainMenu .tiddlyLinkNonExisting,
#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}
.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:4.5em 0 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0 1em 1em; left:0px; top:0px;}
.siteTitle {font-size:3em;}
.siteSubtitle {font-size:1.2em;}
#mainMenu {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}
#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
#sidebarOptions {padding-top:0.3em;}
#sidebarOptions a {margin:0 0.2em; padding:0.2em 0.3em; display:block;}
#sidebarOptions input {margin:0.4em 0.5em;}
#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
#sidebarOptions .sliderPanel input {margin:0 0 0.3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}
.wizard {padding:0.1em 1em 0 2em;}
.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0; margin:0.4em 0 0.2em;}
.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0; margin:0.4em 0 0.2em;}
.wizardStep {padding:1em 1em 1em 1em;}
.wizard .button {margin:0.5em 0 0; font-size:1.2em;}
.wizardFooter {padding:0.8em 0.4em 0.8em 0;}
.wizardFooter .status {padding:0 0.4em; margin-left:1em;}
.wizard .button {padding:0.1em 0.2em;}
#messageArea {position:fixed; top:2em; right:0; margin:0.5em; padding:0.5em; z-index:2000; _position:absolute;}
.messageToolbar {display:block; text-align:right; padding:0.2em;}
#messageArea a {text-decoration:underline;}
.tiddlerPopupButton {padding:0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em; margin:0;}
.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
.popup .popupMessage {padding:0.4em;}
.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0;}
.popup li.disabled {padding:0.4em;}
.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
.listBreak {font-size:1px; line-height:1px;}
.listBreak div {margin:2px 0;}
.tabset {padding:1em 0 0 0.5em;}
.tab {margin:0 0 0 0.25em; padding:2px;}
.tabContents {padding:0.5em;}
.tabContents ul, .tabContents ol {margin:0; padding:0;}
.txtMainTab .tabContents li {list-style:none;}
.tabContents li.listLink { margin-left:.75em;}
#contentWrapper {display:block;}
#splashScreen {display:none;}
#displayArea {margin:1em 17em 0 14em;}
.toolbar {text-align:right; font-size:.9em;}
.tiddler {padding:1em 1em 0;}
.missing .viewer,.missing .title {font-style:italic;}
.title {font-size:1.6em; font-weight:bold;}
.missing .subtitle {display:none;}
.subtitle {font-size:1.1em;}
.tiddler .button {padding:0.2em 0.4em;}
.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
.isTag .tagging {display:block;}
.tagged {margin:0.5em; float:right;}
.tagging, .tagged {font-size:0.9em; padding:0.25em;}
.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
.tagClear {clear:both;}
.footer {font-size:.9em;}
.footer li {display:inline;}
.annotation {padding:0.5em; margin:0.5em;}
* html .viewer pre {width:99%; padding:0 0 1em 0;}
.viewer {line-height:1.4em; padding-top:0.5em;}
.viewer .button {margin:0 0.25em; padding:0 0.25em;}
.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}
.viewer table, table.twtable {border-collapse:collapse; margin:0.8em 1.0em;}
.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding:3px;}
table.listView {font-size:0.85em; margin:0.8em 1.0em;}
table.listView th, table.listView td, table.listView tr {padding:0px 3px 0px 3px;}
.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}
.viewer code {font-size:1.2em; line-height:1.4em;}
.editor {font-size:1.1em;}
.editor input, .editor textarea {display:block; width:100%; font:inherit;}
.editorFooter {padding:0.25em 0; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}
.fieldsetFix {border:0; padding:0; margin:1px 0px;}
.sparkline {line-height:1em;}
.sparktick {outline:0;}
.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
.zoomer div {padding:1em;}
* html #backstage {width:99%;}
* html #backstageArea {width:99%;}
#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0; right:0;}
#backstageButton a {padding:0.1em 0.4em; margin:0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; width:90%; margin-left:3em; padding:1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em;}
#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}
.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/
/***
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which need larger font sizes.
***/
/*{{{*/
body {font-size:0.8em;}
#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}
.subtitle {font-size:0.8em;}
.viewer table.listView {font-size:0.95em;}
/*}}}*/
/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none !important;}
#displayArea {margin: 1em 1em 0em;}
noscript {display:none;} /* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
}
/*}}}*/
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser excludeLists'></span></div>
<!--}}}-->
To get started with this blank [[TiddlyWiki]], you'll need to modify the following tiddlers:
* [[SiteTitle]] & [[SiteSubtitle]]: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* [[MainMenu]]: The menu (usually on the left)
* [[DefaultTiddlers]]: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
These [[InterfaceOptions]] for customising [[TiddlyWiki]] are saved in your browser
Your username for signing your edits. Write it as a [[WikiWord]] (eg [[JoeBloggs]])
<<option txtUserName>>
<<option chkSaveBackups>> [[SaveBackups]]
<<option chkAutoSave>> [[AutoSave]]
<<option chkRegExpSearch>> [[RegExpSearch]]
<<option chkCaseSensitiveSearch>> [[CaseSensitiveSearch]]
<<option chkAnimate>> [[EnableAnimations]]
----
Also see [[AdvancedOptions]]
Section 7.1.11 of the specification defines the ''Application'' package of the metamodel. The ecore model for this includes the //~ApplicationTarget// classifier as well as definitions for the //~LanguageType//, //~PlatformType//, and //~ComponentType// enumerations used as fields of the //~ApplicationTarget// classifier. This model has the following properties:
* package: org.opendds.modeling.model
* file: org.opendds.modeling.model/models/Application.ecore
* namespace: Application
* ns prefix: application
* location: //{{{http://www.opendds.org/modeling/schemas/Application/1.0}}}//
{{imgcenter{[img[images/Application.png]]}}}
Transforming the captured model into an executable application is done using the [[org.opendds.modeling.sdk]] plug-in. This plug-in provides a code generation multi-page editor and contributes actions to the SDK menus and toolbars for generating code.
Design notes for the actual code generation translations, generated code, support libraries, and usage examples are maintained in a separate [[document|codegen.html]].
Background: #fff
Foreground: #000
PrimaryPale: #eee
PrimaryLight: #ccc
PrimaryMid: #600
PrimaryDark: #600
SecondaryPale: #eee
SecondaryLight: #ccc
SecondaryMid: #999
SecondaryDark: #666
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
Section 7.1.2 of the specification defines the ''Core'' package of the metamodel. The ecore model for this includes the //Entity//, //~TypedEntity//, and //Specification// classifiers. This model has the following properties:
* package: org.opendds.modeling.model
* file: org.opendds.modeling.model/models/Core.ecore
* namespace: Core
* ns prefix: core
* location: //{{{http://www.opendds.org/modeling/schemas/Core/1.0}}}//
{{imgcenter{[img[images/Core.png]]}}}
Section 7.1.6 of the specification defines the ''DCPS'' package of the metamodel. The ecore model for this includes the //Domain//, //~DomainParticipant//, //Publisher//, //Subscriber//, //~DataWriter// and //~DataReader// classifiers corresponding to DDS Entities as well as intermediate abstract classifiers of //~PublisherSubscriber// and //~DataReaderWriter// to group properties and interfaces with. This model has the following properties:
* package: org.opendds.modeling.model
* file: org.opendds.modeling.model/models/DCPS.ecore
* namespace: DCPS
* ns prefix: dcps
* location: //{{{http://www.opendds.org/modeling/schemas/DCPS/1.0}}}//
{{imgcenter{[img[images/DCPS.png]]}}}
Section 7.2 of the specification defines the DDS Profile using the previously defined metamodel classifiers. Stereotypes are defined for each construct that can be added to a DDS model. The ecore model for this includes the definitions for all of the specified stereotypes as well as some additional
For some of the SDK implementation steps there are limited or no instructions on how to reproduce the steps. For the situations the step details are captured in this section.
*[[EMF Details]]
*[[GMF Details]]
Section 7.1.3 of the specification defines the ''Domain'' package of the metamodel. The ecore model for this includes the //~DomainEntity//, and //~QosProperty// classifiers. This model has the following properties:
* package: org.opendds.modeling.model
* file: org.opendds.modeling.model/models/Domain.ecore
* namespace: Domain
* ns prefix: domain
* location: //{{{http://www.opendds.org/modeling/schemas/Domain/1.0}}}//
{{imgcenter{[img[images/Domain.png]]}}}
! OpenDDS Generator Model adjusts
There are some slight changes in the OpenDDS.genmodel file from what is generated by the EMF Generator Model wizard. (See the EMF book section 12.3 for definitions of these properties.) These differences are given below.
Note that if there are changes to the underlying modeling it may be easier to reconstruct the file as it has been found that in some cases the properties for new modeling elements were not the same as what the wizard would have generated from scratch.
!! OpenDDS package
For the OpenDDS package that directly follows the top level element:
# In section All change Base Package to org.opendds.modeling.model
# In section All change Prefix to OpenDDS
!! Remaining packages
For the remaining packages (Core, Domain, etc.):
# In section All change Base Package to org.opendds.modeling.model
# In section All change the Prefix so it reflects the case used in the package's ecore file (e.g. change Dcps to DCPS, Qos to QoS) as needed
# In the section Editor change Generate Model Wizard to false
# In the section Tests change Generate Example Class to false
! GMF and Package Names
There is a defect in GMF, [[Code generation problems with upper case letters in metamodel package | https://bugs.eclipse.org/bugs/show_bug.cgi?id=205066]], that causes GMF to emit a Java import of a package instead of a class (eclipse will report a "Only a type can be imported" error). To work around this the top-level package in the org.opendds.modeling.model Ecore files have all lowercase characters in their name. Note that this results in packages names that differ by case from what is in the DDS Profile specification (e.g. "dcps" instead of "DCPS").
The OpenDDS Modeling SDK is based on the OMG "UML Profile for Data Distribution Specification" ([[ptc/08-07-02|http://www.omg.org/spec/UML4DDS/1.0/Beta1/PDF/]]). This specification contains metamodel definitions and a UML Profile. The SDK defines the metamodel as Eclipse ecore models. It then loads the metamodel resources into another ecore model and defines the stereotypes of the profile. This is used to create a model with an EMF editor, which can be used to provide a tree based view and editing, that can then be mapped onto a Graphical Modeling Framework (GMF) model for graphical model capture.
The Eclipse Modeling Framework (EMF) will take the captured ecore models defining the metamodel and profile and create edit support and a tree based EMF editor for the profile. The model can also be mapped into the GMF models for graphical capture and the EMF and GMF editors coordinated to show the different views of the same underlying model. The EMF Eclipse plug-in packages implementing this include:
{{centeredTable{
| ''EMF Model Packages'' |c
|[[org.opendds.modeling.model]] |Package containing the ecore model files defining the metamodel and profile stereotypes. |
|[[org.opendds.modeling.edit]] |Package generated from the ecore models containing edit support used by the editor. |
|[[org.opendds.modeling.editor]] |Package generated from the ecore models containing the EMF editor for the metamodel. |
}}}
The generated packages include some specific tailoring as well. The EMF editor generation steps will not overwrite the existing modfications.
The individual metamodels are broken into separate packages by the specification. This is mirrored by having separate ecore metamodels for each specification package. This allows the metamodels to use the same namespaces as those in the specification. The DLRL portion of the specification is not included in this SDK. The metamodel packages / ecore models are:
{{centeredTable{
| ''Specification Metamodel / Ecore model'' |c
| //Package// | //Specification Section// | //Ecore model file// |
|[[CorePackage]] | 7.1.2 |Core.ecore |
|[[DomainPackage]] | 7.1.3 |Domain.ecore |
|[[TopicsPackage]] | 7.1.4 |Topics.ecore |
|[[TypesPackage]] | 7.1.5 |Types.ecore |
|[[DCPSPackage]] | 7.1.6 |DCPS.ecore |
|[[QoSPackage]] | 7.1.7 |~QoS.ecore |
|[[EnumerationsPackage]] | 7.1.8 |Enumerations.ecore |
|[[ApplicationPackage]] | 7.1.11 |Application.ecore |
|[[DCPSProfile]] | 7.2 |~OpenDDS.ecore |
}}}
Details for settings that are different from default EMF settings can be found in [[EMF Details]].
Issues related to usage can be found in [[EMF Issues]].
Section 7.1.8 of the specification defines the ''Enumerations'' package of the metamodel. The ecore model for this includes definitions for enumerations used as field of ~QoS policies. Inexplicably, this also includes a structure definition for the //Period// classifier which is not an enumeration but a compound type used as a field type for various policies. This model has the following properties:
* package: org.opendds.modeling.model
* file: org.opendds.modeling.model/models/Enumerations.ecore
* namespace: Enumerations
* ns prefix: enumerations
* location: //{{{http://www.opendds.org/modeling/schemas/Enumerations/1.0}}}//
{{imgcenter{[img[images/Enumerations.png]]}}}
!Making sure Java has enough ~PermGen memory
It was found running SDK diagram code under Ubuntu 9.10 running eclipse 3.5.1 that the Java ~PermGen memory hit the maximum ~PermGen memory allowed causing the diagram code to crash. The ~PermGen memory is used to hold meta data about user classes.
This condition is seen the Error log as
{{{
!MESSAGE Error occurred during status handling
!STACK 0
java.lang.OutOfMemoryError: PermGen space
}}}
In the case that this was seen the ~PermGen maximum size was about 88MB.
The maximum size can be set using the -XX:~MaxPermSize argument. For example, to set the maximum ~PermGen size to 128MB, pass
{{{
-XX:MaxPermSize=128m
}}}
to the Java VM.
Note the //~PermSize// term is used for for referring to //~PermGen// space.
Also note that any such setting made in eclipse.ini does not apply to launching an eclipse application from within eclipse (Run As -> Eclipse Application). Instead it is necessary to add the ~MaxPermSize argument to the VM arguments in the Run Configuration setting.
!Sub-diagrams
GMF supports the capability to double-click on a diagram node and have it open up another diagram. GMF calls this //diagram partitioning//. Unfortunately, GMF 2.2.2 does not directly support diagram partitioning through it's views and wizards when the diagram node's domain element is not the same as the canvas mapping's domain element in the sub-diagram, which is how the SDK uses sub-diagrams. The steps given here were used to produce the sub-diagram capability of the SDK.
The starting point for these steps are the [[Diagram Partitioning wiki page|http://wiki.eclipse.org/Diagram_Partitioning]] that was extract from a [[GMF newsgroup post|http://dev.eclipse.org/newslists/news.eclipse.modeling.gmf/msg06184.html]], and the discussion in section 4.5.6 of the eclipse Modeling Project book.
!! Definitions
The terms and definitions used here are taken from the Diagram Partitioning wiki. Replace references to "My Library" below with the appropriate package the diagram is based on (e.g. "PolicyLib") in the discussion that follows.
|!Term|!SDK Example|!Definition|h
|Partitioning node|The package shown in the main diagram|The node that can be double-clicked on open the sub-diagram.|
|Super-diagram|Main Diagram|The diagram that contains the partitioning node.|
|Super-mapping|~MainDiagram.gmfmap|The GMF mapping file for the super-diagram.|
|Sub-diagram|My Library diagram|The diagram that is opened after double-clicking on the partitioning node.|
|Sub-mapping|~MyLibrary.gmfmap|The GMF mapping file for the sub-diagram.|
!! Steps
!!! 1. Define the Main Diagram tools
File used: ~MainDiagram.gmftool
Create ~MainDiagram.gmftool and have the palette only contain those elements that can show up on the main diagram. (GMF does not restrict what shows up on the palette based on the top level nodes and links that can be created on the diagram, so we want a single tooling definition for each diagram to avoid the user picking inappropriate elements.)
!!! 2. Define the Main diagram mapping
File used: ~MainDiagram.gmfmap
Use the UML Package diagram in the project org.opendds.modeling.uml2tools.mirrored for the graphics definition model in ~MainDiagram.gmfmap and use ~OpenDDSModel found in ~OpenDDS.ecore as the Canvas mapping element.
!!! 3. Define My Library diagram tools
File used: ~MyLibrary.gmftool
# Bring up the Tooling Definition wizard. From the context menu select New -> Other -> Graphical Modeling Framework -> Simple Tooling Definition Model.
# Pick ~OpenDDS.ecore as the file containing the ecore domain model. (In the case of the ~DataLib, Types.ecore was specified.)
# Pick ~MyLibrary as the diagram element.
# Unselect elements that shouldn't appear in the palette in the "Domain model elements to process" dialog.
# Note that the order of tools is based on their order in the model. You may want to edit the content and sort the tools alphabetically.
Below is a python script that help re-order the palette tools. It is first necessary to come up with file that has a tool per line that can be in any order that can be piped to the script.
{{{
#! /usr/bin/python
# Purpose: Given a list of tools in standard input to be used in a GMF palette,
# generate the XML to put in the .gmftool file sorted by tool name.
import sys
from string import Template
toolTemplate = Template(
''' <tools
xsi:type="gmftool:CreationTool"
title="$tool"
description="Create new $tool">
<smallIcon
xsi:type="gmftool:DefaultImage"/>
<largeIcon
xsi:type="gmftool:DefaultImage"/>
</tools>''')
tools = sys.stdin.readlines()
for t in sorted(tools):
print toolTemplate.substitute(tool=t.rstrip())
}}}
!!! 4. Specify unique class name qualifier for sub-diagram GMF generator model
Files used: ~OpenDDS.genmodel, ~OpenDDS_dup_MyLibrary.genmodel
In anticipation of being able to bring up a My Library subdiagram by double-clicking on a ~MyLibrary node in the main diagram, a near duplicate of ~OpenDDS.genmodel will be created here and referred to later when the EMF generator model is requested.
What needs to be done is to change qualifer that prepends generated class names. As stated in step 6 of the Diagram Partitioning wiki, this is the "hacky" part needed because of how the dependency on EMF generator model is handled. Although this step is not mentioned in the eclipse Modeling Project book, failure to do this results the error
> Unable to open editor, unknown editor ID: org.opendds.modeling.model.opendds.diagram.mylibrary.part.~OpenDDSMyLibraryDiagramEditorID
# Copy ~OpenDDS.genmodel to ~OpenDDS_dup_MyLibrary.genmodel.
# In ~OpenDDS_dup_MyLibrary.genmodel change the Model Name property to ~OpenDDSMyLibrary.
!!! 5. Define My Library diagram mapping
File used: ~MyLibrary.gmfmap
# Bring up the Mapping Definition wizard. From the context menu select New -> Other -> Graphical Modeling Framework -> Guide Mapping Model Creation.
# Pick ~OpenDDS.ecore as the file containing the ecore domain model.
# Pick ~MyLibrary as the diagram element.
# Pick ~MyLibrary.gmftool created from the previous step as the diagram palette.
# Pick the appropriate mirrored graphic file in org.opendds.modeling.uml2tools.mirrored. For the My Library this is classDiagram_classifiers.mirrored.gmfgraph.
# In the "Map domain model elements" dialog remove inappropriate links. In the case of the My Library this is all links. Verify that all the nodes used in the mapping are appropriate.
!!! 6. Create the My Library GMF generator model
File used: ~MyLibrary.gmfgen
# From the context menu for ~MyLibrary.gmfmap, select "Create generator model..." and use the defaults provided by the wizard.
!!!! 6.1 Gen Editor Generator category changes
| Copyright Text | (c) Copyright Object Computing, Incorporated. 2005,2010. All rights reserved. |
| Diagram File Extension | opendds_diagram_mylibrary |
| Package Name Prefix | org.opendds.modeling.model.opendds.diagram.mylibrary |
| Model ID | ~OpenDDS ~MyLibrary |
!!!! 6.2 Gen Plugin
| ID | org.opendds.modeling.diagram.mylibrary |
| Name | ~OpenDDS ~MyLibrary Plugin |
| Provider | Object Computing, Inc. |
| Version | (current version) |
!!! 7. (Optional) Check that the sub-diagram works
File used: ~MyLibrary.gmfgen
To verify that the sub-diagram works correctly, you can run launch the
diagram editor for the sub-diagram after creating the My Library
GMF generator model (~MyLibrary.gmfgen).
Before doing this close project org.opendds.modeling.diagram.main if
it exists. Otherwise you may see in the error log the message
> Both 'org.opendds.modeling.diagram.main' and 'org.opendds.modeling.diagram' register an extension parser for 'opendds_diagram'
After verifying the sub-diagram works re-open project
org.opendds.modeling.diagram.main.
!!! 8. Relate the sub-diagram to the super-diagram
File used: ~MainDiagram.gmfmap
# Open ~MainDiagram.gmfmap with the GMF Map Model editor
# Load as a resource ~MyLibrary.gmfmap
# Go to the Node Mapping for the My Library
# Under the Misc category edit the value for Related Diagrams
# Add the second Canvas Mapping in the list
# In a text editor verify that the relatedDiagrams element of the My Library node points to ~MyLibrary.gmfmap.
!!! 9. Update Gen Editor View for the super-diagram GMF generator model
Files used: ~MainDiagram.gmfgen, ~MyLibrary.gmfgen
# Update (context menu item "Create generator model..." for ~MainDiagram.gmfmap) the ~MainDiagram.gmfgen to account for changes made in the previous step.
# Open ~MainDiagram.gmfgen.
# Go to node Gen Diagram ~OpenDDSModelEditPart -> Gen Top Level Node ~MyLibraryEditPart -> Open Diagram Behavior
# Set property Diagram Kind to ~OpenDDS ~MyLibrary.
# Set Edit My Class Name to ~OpenDiagramEditPolicyMyLibrary.
# We need the Gen Editor View ID for the sub-diagram. Open ~MyLibrary.gmfgen and go to Gen Editor Generator -> Gen Editor View org.opendds.modeling.model.opendds.diagram.mylibrary.part and copy the value for ID into the clipboard.
# Back in ~MainDiagram.gmfgen, go to node Gen Diagram ~OpenDDSModelEditPart -> Gen Top Level Node ~MyLibraryEditPart -> Open Diagram Behavior ~OpenDiagramEditPolicy, set property Editor ID to what is in the clipboard.
!!! 10. Test sub-diagram usage
# Re-generate project org.opendds.modeling.diagram.main.
# Generate project org.opendds.modeling.diagram.mylibrary.
# Launch org.opendds.modeling.diagram.main as an eclipse application.
# Create a new ~OpenDDS diagram.
# Create a ~MyLibrary package and double-click on the package.
# Verify that the sub-diagram opens up allowing to to add elements to the package.
! UML Component figures with classes arbitrarily positioned
For the SDK DCPS diagram UML components for domain participants are used. Simple attempts to do this using the GMF layout XY Layout were tried without success. Elements in the component would be as small as possible and stack on top of each other. Attempts to follow the lead of the ~UML2Tools Component was not successful either. For figure ~ComponentFigure_Body used by the compartment the custom layout org.eclipse.gmf.runtime.draw2d.ui.figures.~OneLineBorder is used and attempts to reproduce this also resulted in stacked elements.
As a workaround an attempt was made to stack the elements on top of each other as is done with the DNC Package node as described in section 4.6, Developing the Color Modeling Diagram, in the Eclipse Modeling Project book. However, if side-affixed node was attached to an element (to represent a port) in the component it did not render properly nor was the label for the node visible. So this approach was not feasible.
Finally, it was noticed after checking out the project for the [[GMF taipan example|http://wiki.eclipse.org/index.php/GMF_Tutorial]] from the CVS repository dev.eclipse.org that the Ship cargo compartment allowed cargo to be arbitrarily placed in the compartment. After investigating how this was done it found that the undocumented compartment setting listLayout in the .gmfgen file was set to false instead of the default value of true. For some reason this setting will override any layout setting used for the compartment's figure.
Therefore, if a compartment's figure is to have XY Layout, make sure in the settings for the compartment in the .gmfgen file have listLayout set to false.
! Support for enumerations in class figures
For direct editing of Ecore attributes in figures, GMF does not support providing a list of attributes from which the user can select from (see bug entry [[Support enum based labels|https://bugs.eclipse.org/bugs/show_bug.cgi?id=158116]]). Instead, the user must type out exactly what the enumeration value is. This means, for example, that when editing a ~DestinationOrderQosPolicy the user must type in (in the correct case) either ~BY_RECEPTION_TIMESTAMP or ~BY_SOURCE_TIMESTAMP to change the kind attribute. This makes modification of ~QoS Policy enumerations error prone and tedious.
The source files that need modification are in project org.opendds.modeling.diagram.policylib's package org.opendds.modeling.model.opendds.diagram.policylib.edit.parts. The file are
* ~DestinationOrderQosPolicyKindEditPart.java
* ~DsQosPolicyHistory_kindEditPart
* ~DurabilityQosPolicyKindEditPart.java
* ~HistoryQosPolicyKindEditPart.java
* ~LivelinessQosPolicyKindEditPart.java
* ~OwnershipQosPolicyKindEditPart.java
* ~PresentationQosPolicyAccess_scopeEditPart.java
* ~ReliabilityQosPolicyKindEditPart.java
To provide a list in the form of a combo box from which the user can select enumeration literals from, a set of classes has been written that modified GMF generatored code can use. This section outlines how to do that.
!! Steps for GMF model changes
!!! 1. Graphical Definition Model
A diagram label is used for the enumeration which the GDM wizard may have already created for you. Just make sure that the Element Icon property is set to false.
!!! 2. Mapping Model
A Feature Label Mapping is used for the enumeration that is owned by the node associated with the enumerator's parent.
For the Visual representation category of the Feature Label Mapping properties use the following settings, replacing attribute-name with the name of enumeration attribute (for example, for the ~DestinationOrderQosPolicy the name for the ~DestinationOrderQosPolicyKind enumeration is "kind"):
|!Property|!Value|h
|Editor Method|{0}|
|Edit Method|{0}|
|View Method|attribute-name: {0}|
!! Steps for Java code changes
The only Java class that needs to be modified is the ~EditPart that corresponds to the attribute, so the steps that follow apply only to that file. We'll call the Java interface corresponding to the Ecore enumeration attribute is org.opendds.modeling.model.enumerations.~MyEnum.
Note that if the format of the code fragments below looks odd it is based on the format GMF applies to "@generated NOT" methods when it re-generates the code.
!!! 1. Add imports
Import the enumeration specific direct edit classes and the enumeration interface generated by EMF.
Note that after all the changes have been made there will be unused imports for ~LabelDirectEditPolicy and ~TextDirectEditManager but they will be included after GMF does code generation so there is no need to remove them.
{{{
import com.ociweb.gmf.EnumDirectEdit.EnumDirectEditManager;
import com.ociweb.gmf.EnumDirectEdit.EnumDirectEditPolicy;
import org.opendds.modeling.model.enumerations.MyEnum;
}}}
!!! 2. Specify that the ~EnumDirectEditPolicy will be used
Replace ~LabelDirectEditPolicy with ~EnumDirectEditPolicy.
{{{
/**
* @generated NOT
*/
protected void createDefaultEditPolicies() {
...
installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE,
new EnumDirectEditPolicy(MyEnum.class));
...
}}}
!!! 3. Specify that the ~EnumDirectEditManager will be used
{{{
/**
* @generated NOT
*/
protected DirectEditManager getManager() {
if (manager == null) {
setManager(new EnumDirectEditManager(this, EnumDirectEditManager
.getCellEditorClass(), MyEnum.class));
}
return manager;
}
}}}
!!! 4. Use the ~EnumDirectEditManager in the performDirectEdit() methods
{{{
/**
* @generated NOT
*/
protected void performDirectEdit(Point eventLocation) {
if (getManager().getClass() == EnumDirectEditManager.class) {
((EnumDirectEditManager) getManager()).show(eventLocation
.getSWTPoint());
}
}
/**
* @generated NOT
*/
private void performDirectEdit(char initialCharacter) {
if (getManager() instanceof EnumDirectEditManager) {
((EnumDirectEditManager) getManager()).show(initialCharacter);
} else {
performDirectEdit();
}
}
}}}
!!! 5. Verify adjusted methods will not be overwritten
Check that there the four occurrences of "@generated NOT" are the source file so that your changes
will not get overwritten the next time GMF re-generates the runtime code.
! Domain Entities and ~QoS Policies
A requirement for DCPS domain entity modeling is that a ~QoS policy associated with a domain entity
can either be custom (or "owned") by the domain entity, or referenced ("shared") from a policy library.
The metamodel or profile in the DDS profile specification does not directly support the notion of custom
verses shared policies, however the worked example shows the usage of ~QoS policy library as can be
seen in section 7.3.1 of the specification.
To support either custom or shared policies in the SDK the ~DcpsLib Ecore element contains a collection of qosPolicy references similar to the policy collection found in a ~PolicyLib. ~DcpsLib's policy collection is not intended to be manipulated directly by the user. Instead, code generated by GMF has been customized to give the appearance that
a domain entity owns its custom policies. This is needed because GMF assumes that the Ecore objects behind
the child nodes in a parent figure's compartment are owned by the Ecore object the parent figure.
This customization of GMF generated code is the largest set of changes found in the SDK diagram code. Below the details involved in supporting custom verses shared policies is given.
!! Custom policies
A custom policy has a lifecycle that is bounded by the lifecycle of its parent domain entity.
!!! Adding context menu items for domain entities
Custom policies are adding by the user using context menus for the domain entity. For each domain entity there
must be a concrete class that inherits from generic class org.opendds.modeling.diagram.dcpslib.part.~OpenDDSDcpsLibCreateQosPolicyAction. For example,
org.opendds.modeling.diagram.dcpslib.part.~OpenDDSDcpsLibCreateQosPolicyActionDataReader inherits from
~OpenDDSDcpsLibCreateQosPolicyAction to provide a concrete action for adding shared policies to ~DataReaders.
In org.opendds.modeling.diagram.dcpslib/plugin.xml the extension point org.eclipse.ui.popupMenus includes
contribution that provide the "Add ~QoS Policy" context menu item and "Add custom ~QoS Policy"
sub-menu item for the domain entities. For example, the ~DataReader has the action element:
{{{
<action
class="org.opendds.modeling.diagram.dcpslib.part.~OpenDDSDcpsLibCreateQosPolicyActionDataReader"
enablesFor="1"
id="org.opendds.modeling.popup.~DataReaderCreatePolicyActionID"
label="Add &custom ~QoS Policy"
menubarPath="~DataReaderInsert/group1">
</action>
}}}
!!! Modify policy's ~CreateCommand to add to ~DcpsLib policies and to domain element
When creating a custom policy it must be both added to it's container (the domain element's ~DcpsLib) and added as a reference to
the domain element.
See for example
org.opendds.modeling.model.opendds.diagram.dcpslib.edit.commands.~EfQosPolicyCreateCommand.doExecuteWithResult()
for an example how to do this.
!! Shared policies
A shared policy has a lifecycle that can be beyond the lifecycle of a domain entity that references it.
!!! Going from a ~QosPolicy to a label to use in dialogs
To support allowing the user to select shared policies from a dialog it is necessary when presenting a policy to
that the user knows which ~DataLib that owns the policy since candidate policies to select from may
have the same name. The capability is provided by org.opendds.modeling.diagram.dcpslib.part.~QosPolicyLabeler.
!!! Going from a ~QosPolicy to the name of the corresponding association on a domain entity
When working with domain entity policies, the user is presented with the name of the policies, not the name of the policy associations of the domain entity. For example, a ~DataWriter has an association to a ~WriterDataLifecycleQosPolicy (represented by a wdlQosPolicy stereotype). To update the domain entity we need to go from the policy stereotype name to the association name. This is handled by
org.opendds.modeling.diagram.dcpslib.edit.commands.~QosPolicyReferCommand
!!! Adding context menu items for domain entities
Shared policies are adding by the user using context menus for the domain entity. For each domain entity there
must be a concrete class that inherits from generic class org.opendds.modeling.diagram.dcpslib.part.~OpenDDSDcpsLibRefQosPolicyAction. For example,
org.opendds.modeling.diagram.dcpslib.part.~OpenDDSDcpsLibRefQosPolicyActionDataReader inherits from
~OpenDDSDcpsLibRefQosPolicyAction to provide a concrete action for adding shared policies to ~DataReaders.
In org.opendds.modeling.diagram.dcpslib/plugin.xml the extension point org.eclipse.ui.popupMenus includes
contribution that provide the "Add ~QoS Policy" context menu item and "Add reference to library ~QoS Policy"
sub-menu item for the domain entities. For example, the ~DataReader has the action element:
{{{
<action
class="org.opendds.modeling.diagram.dcpslib.part.~OpenDDSDcpsLibRefQosPolicyActionDataReader"
enablesFor="1"
id="~DataReaderRefQosPolicyAdd"
label="Add &reference to library ~QoS Policy"
menubarPath="~DataReaderInsert/group1">
</action>
}}}
!!! Customize the Semantic ~EditPolicy's getDestroyElementComment() to destroy the ''reference'' instead.
When the user deletes a shared policy from a domain entities figure, behind the scenes we really want to
remove reference to the policy and not the policy itself.
To see how this is done, take a look, for example, at
org.opendds.modeling.diagram.dcpslib.edit.policies.~DeadlineQosPolicy2ItemSemanticEditPolicy's getDestroyElementCommand()
to see how a ~DestroyReferenceCommand is used instead of a ~DestroyElementCommand.
! Diagram refresh problem
On Ubuntu 9.10, running eclipse 3.5.1 on top of GTK 2.10.0, there is a refresh problem for GMF based diagrams. When a diagram is opened, and either another editor tab is activated or another application is placed on top of the diagram, then after making the diagram visible again some of the diagram elements are partially or completely invisible. The only way to confidently make all the diagram elements visible again is to zoom and unzoom the diagram.
The symptoms of this problem seem similar to [[Eclipse bug 164623|https://bugs.eclipse.org/bugs/show_bug.cgi?id=164623]]. This bug was closed as it was determined to be a problem related to GTK usage and not specific to GMF. An attempt was made to get around this by disabled anti-aliasing as discussed in the bugzilla contents but the problem persisted.
! Unable to use Graphic Definition Models from ~UML2Tools
It was hoped that the graphic definition models from [[UML2Tools|http://wiki.eclipse.org/MDT-UML2Tools]] could be reused in the SDK. However, when trying to reuse the Component graphics several issues were encountered which are listed below. Because of these problems it was decided to work with custom graphic models instead.
* Classes inside the component stack on top of each other with each class nearly the same width as the component. By contrast, when creating a component using ~UML2Tools, they can place elements anywhere inside the component with any size. In other words, the layout for a Component using ~UML2Tools appears to be using the GMF XY Layout. However, inspecting the graphical definition model it looks like a custom border is used for the figure that corresponds to the compartment holding the component elements. This was concluded by looking in project org.eclipse.uml2.diagram.def graphical definition model found in structures/componentDiagram_classifiers.gmfgraph. For figure ~ComponentFigure_Body used by the compartment the custom layout org.eclipse.gmf.runtime.draw2d.ui.figures.~OneLineBorder is used.
* The code generated by GMF to make classDiagram_classifiers.gmfgraph using in a plug-in gives compilation errors for the ~PackageAsFrameFigure method
{{{
public WrappingLabel getPackageAsFrameFigure_name() {
return getNameLabel();
}
}}}
The error is
> Type mismatch: cannot convert from Label to ~WrappingLabel
* ~UML2Tools no longer active? A message in newsgroup eclipse.modeling.mdt.uml2 dated 07-26-2010 12:28am with subject "Re: Extend ~UML2 (EMF) and still use graphical editing" states that "the ~UML2 Tools project is no longer active" and pointed the thread originator to project [[Papyrus|http://www.papyrusuml.org/]] instead. (This may explain why a message posting on 07-22-2010 to newsgroup eclipse.modeling.mdt.uml2tools inquiring about a new release has not had any responses.) If GMF changes its underlying Ecore models for the graphic definition model, gmfgraph.ecore, in the future, it could mean that the ~UML2Tools graphics would have to be updated to work with the new core model. If such changes are non-trivial it could be a risk to future SDK development.
[[GMF Details]] contains instructions not available elsewhere to reproduce the steps needed to for model diagram support.
[[GMF Issues]] contains known issues with the SDK's usage of GMF.
[[GMF TODO]] contains skipped tasks related to GMF that still need to be done.
To get started with this blank [[TiddlyWiki]], you'll need to modify the following tiddlers:
* [[SiteTitle]] & [[SiteSubtitle]]: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* [[MainMenu]]: The menu (usually on the left)
* [[DefaultTiddlers]]: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
* [[StyleSheet]]: the ''.headerForeground'' class includes a relative path to the opendds.png logo file. Ensure that this will be reachable from the final document. As supplied, this is expected to be located internal to the //./images// directory
You'll also need to enter your username for signing your edits: <<option txtUserName>>
If you wish to publish the contents of this document as static HTML web pages, then:
* add a ''publish'' tag to each tiddler to be included in the published document
* [[PublishIndexTemplate]], [[PublishTemplateBody]], [[PublishTemplateBodySingle]]: edit to the style desired in the published document
* [[StyleSheet]]: modify the reference to the logo file in the //.publishLogo// class to be in a correct relative directory path
* use the ''publish'' selection on the right sidebar to publish all tiddlers with the ''publish'' tag to individual HTML files. They will all be located in the //./publish// directory
Issues encountered during the development of the OpenDDS Modeling SDK are captured here.
*[[EMF Issues]]
*[[GMF Issues]]
*[[Deployment Issues]]
*[[Dependency Issues]]
*[[Plug-in Issues]]
[[Plug-in Architecture]]
[[EMF Models]]
[[GMF Models]]
[[Code Generation]]
[[Issues]]
[[Details]]
[[TODO]]
OpenDDS is an open source C++ implementation of the Object Management Group (OMG) Data Distribution Service (DDS). OpenDDS also supports Java bindings through JNI and can be included with JBoss (ESB) frameworks by means of a JMS wrapper. OpenDDS leverages the ADAPTIVE Communication Environment (ACE) to provide a cross platform environment.
OpenDDS is supported by [[Object Computing, Inc.|http://www.ociweb.com/]]
<!--{{{-->
<div class='header'>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
The ~OpenDDS Modeling SDK is built from a set of Eclipse plug-in projects and distributed as a Feature that includes the set of plug-ins required. The plug-ins include:
{{centeredTable{
| ''~OpenDDS Modeling SDK Plug-ins'' |c
|[[org.opendds.modeling.model]] |Ecore metamodel and profile definition derived from the OMG UML Profile for DDS ([[ptc/08-07-02|http://www.omg.org/spec/UML4DDS/1.0/Beta1/PDF/]]). |
|[[org.opendds.modeling.model.edit]] |Edit support for the org.opendds.modeling.model ecore model. |
|[[org.opendds.modeling.model.editor]] |Generated EMF editor for the org.opendds.modeling.model ecore model. |
|[[org.opendds.modeling.gmf]] |GMF graphical modeling framework for graphical model capture based on the org.opendds.modeling.model ecore model. |
|[[org.opendds.modeling.graphics]] |GEF Graphics Figure Gallery for diagrams. |
|[[org.opendds.modeling.diagram.main]] |Main SDK model capture diagram. This is the component diagram to capture the ~OpenDDS artifacts. |
|[[org.opendds.modeling.diagram.policylib]] |~QoS Policy lib capture diagram. This captures the non-default ~QoS policy values. |
|[[org.opendds.modeling.diagram.datalib]] |Data type library capture diagram. This captures the data types and structures used by the middleware. |
|[[org.opendds.modeling.sdk]] |Top level SDK plug-in including the code generation capability from the capture models. |
|[[org.opendds.modeling.feature]] |Feature definition for the ~OpenDDS Modeling SDK. |
|[[org.opendds.modeling.help]] |Help plug-in for the SDK.|
|[[org.opendds.site]] |Plug-in distribution site. This is where Eclipse can find the plug-ins for installation. |
}}}
These eclipse projects are stored in two separate subversion repositories. Most are held in the ~OpenDDS source repository (//{{{https://svn.dre.vanderbilt.edu/DOC/DDS}}}//), while the //org.opendds.site// plug-in is held in the [[Object Computing, Inc. (OCI)|http://www.ociweb.com/]] internal repository for the http://www.opendds.org/ website. This allows updates to the site to be managed directly from the subversion sources. During development the //org.opendds.site// plug-in is located in a development repository to allow test installation and updates to be performed. The site plug-in will be moved to the opendds.org repository as the SDK is released.
The public update site is located at: http://www.opendds.org/modeling/eclipse/plugins. Until the initial version of the SDK is released, this site will not be available for installation or updates. A development site will be maintained for internal use.
The plug-in projects are being developed initially in the //'branches/~RT13927'// branch. The source and associated information is located in the //'tools/modeling'// directory, with the plug-ins located in the //'tools/modeling/org.opendds'// directory. An internal distribution site is available during development for testing the distribution mechanism.
!org.opendds.modeling.sdk
The following are things to do for this plug-in:
!!!New Wizard
This should provide the following behaviors:
#If there is a single selected container resource, populate the initial Container value with it;
#If there is a single selected file resource, populate the initial Container with its parent and the initial model source file with the selected file;
#Allow container browse for container;
#Allow resource browse for model source file;
#Allow container browse for target directory;
#Allow target directory to be empty;
#Require container to exist, be writable, and have an //'~OpenDDS'// nature;
#Allow model source file to be empty;
#Require source model file, if specified, to contain a model name (obtained via ~XPath expression);
!!!Actions
Implement Actions and Commands to allow the code generation steps to be invoked from different triggers
!!!Menus
#Create and manage an //'~OpenDDS'// top menu and context menu;
#Add the code generation actions to the menus;
#Add actions to create //'~OpenDDS'// projects, diagrams, and code generation specifications to the menus;
!!!Perspective
#Create and manage an //'~OpenDDS'// perspective.
!!!Preferences
#Create and manage an '//~OpenDDS'// preferences page.
<div class='viewer' id='contentWrapper'><small><a href="index.html">Home</a> > %1</small><h1 class='publishLogo'>%0</h1>
<div id='publishContentWrapper'>
<h2>%1</h2>
<ul>%2
</ul>
<small>Published: %6</small>
</div></div>
/***
|''Name:''|Publish Macro|
|''Version:''|2.4.1 (2 July 2008)|
|''Source''|http://jackparke.googlepages.com/jtw.html#PublishMacro ([[del.icio.us|http://del.icio.us/post?url=http://jackparke.googlepages.com/jtw.html%23PublishMacro]])|
|''Author:''|[[Jack]]|
|''Type:''|Macro|
!Description
<<doPublish>> tiddlers tagged with these tags <<option txtPublishTags>> (comma seperated) as HTML pages to the subfolder 'publish' (you must create this). Use the [[PublishTemplateHead]] and [[PublishTemplateBody]] templates to style your pages and the [[PublishIndexTemplate]] to define an index page. For publishing individual tiddlers the [[PublishTemplateBodySingle]] template is used.
!Usage
To publish all tagged tiddlers:
{{{<<doPublish>>}}} <<doPublish>>
To publish a single tiddler, use the {{{<<publishTiddler>>}}} macro or add the "publishTiddler" command to your ViewTemplate
!Template placeholders
|!Placeholder|!Meaning|
|%0|Your SiteTitle "<<tiddler SiteTitle>>"|
|%1|The current tiddler title|
|%2|The rendered tiddler HTML|
|%3|CSV list of tags|
|%4|Tiddler modifier|
|%5|Tiddler modified date|
|%6|Tiddler creation date|
|%7|Tiddler wiki text|
!Revision History
* Original by [[Jack]] 24 May 2006
* Updated 2 Jan 2007
* Refactored 4 Jan 2007
* Small improvements
* Publish single tiddlers
* Template placeholder %7 for tiddler's wiki text
!Code
***/
//{{{
version.extensions.doPublish = {
major: 2,
minor: 4,
revision: 1,
date: new Date("July 2, 2008")
};
config.macros.doPublish = {
label: "publish",
prompt: "Publish Tiddlers as HTML files"
};
if (config.options.txtPublishTags == undefined) config.options.txtPublishTags = "Publish";
config.shadowTiddlers.PublishTemplateHead = '<title>%0 - %1</title>\n<link rel="stylesheet" type="text/css" href="style.css"/>\n<meta name="keywords" content="%3"/>'
config.shadowTiddlers.PublishTemplateBody = '<div class=\'viewer\' id=\'contentWrapper\'><small><a href=\"./publish/index.html\">Home</a> > %1</small><h1>%0</h1>\n<h2>%1</h2>\n%2\n<hr>Tags: %3\n<hr>%4, %5 (created %6)\n</div>\n'
config.shadowTiddlers.PublishTemplateBodySingle = '<h1>%0</h1>\n<h2>%1</h2>\n%2\n<hr>Tags: %3\n<hr>%4, %5 (created %6)\n</div>\n'
config.shadowTiddlers.PublishIndexTemplate = '<div class=\'viewer\' id=\'contentWrapper\'><small><a href="./publish/index.html">Home</a> > %1</small><h1>%0</h1><h2>%1</h2>\n<ul>%2\n</ul>\n<small>Published: %6</small>\n</div>\n';
config.macros.doPublish.handler = function(place)
{
if (!readOnly)
createTiddlyButton(place, this.label, this.prompt,
function() {
doPublish();
return false;
},
null, null, this.accessKey);
}
config.macros.publishTiddler = {
label : 'publish',
prompt : 'Publish this tiddler as an HTML file.',
handler : function(place,macroName,params,wikifier,paramString,tiddler)
{
var btn = createTiddlyButton(place, this.label, this.prompt,
function(e) {
if(!e) var e = window.event;
publishTiddler(this.getAttribute('tiddler'))
return false;
},
null, null, this.accessKey);
btn.setAttribute('tiddler', tiddler.title);
}}
config.commands.publishTiddler = {handler : function(event,src,title) {publishTiddler(title);},text: "publish", tooltip: "Publish this tiddler as HTML"};
function publishTiddler(title) {
//debugger
var PublishFolder = getWikiPath('publish');
var place = document.getElementById(story.container)
var HTMLTemplateHead = store.getTiddlerText("PublishTemplateHead");
var HTMLTemplateBody = store.getTiddlerText("PublishTemplateBodySingle") || store.getTiddlerText("PublishTemplateBody");
HTMLTemplateBody = renderTemplate(HTMLTemplateBody)
HTMLTemplateBody = wiki2Web(HTMLTemplateBody);
var tiddler = store.getTiddler(title);
var tiddlerText = store.getValue(tiddler, 'text');
var tiddlerHTML = wikifyStatic(tiddlerText);
var HTML = '<html>\n\<head>\n' + HTMLTemplateHead + '\n</head>\n<body>\n' + HTMLTemplateBody + '\n</body>\n</html>';
HTML = HTML.format([
wikifyPlain("SiteTitle").htmlEncode(),
tiddler.title.htmlEncode(),
wiki2Web(tiddlerHTML),
tiddler.tags.join(", "),
tiddler.modifier,
tiddler.modified.toLocaleString(),
tiddler.created.toLocaleString(),
tiddlerText
]);
saveFile(PublishFolder + tiddler.title.filenameEncode() + ".html", HTML);
//story.closeTiddler(tiddler.title);
var indexWin = window.open((PublishFolder + title.filenameEncode() + ".html").replace(/\\/g, "/"), null);
indexWin.focus();
}
function doPublish() {
var savedTiddlers = [];
var tiddlers = store.getTiddlers("title");
var place = document.getElementById(story.container)
var HTMLTemplateHead = store.getTiddlerText("PublishTemplateHead");
var HTMLTemplateBody = store.getTiddlerText("PublishTemplateBody");
HTMLTemplateBody = renderTemplate(HTMLTemplateBody)
HTMLTemplateBody = wiki2Web(HTMLTemplateBody);
var PublishTags = config.options.txtPublishTags || "publish";
PublishTags = PublishTags.split(",")
var PublishFolder = getWikiPath('publish');
if (!PublishFolder) return;
var indexFile = "";
var indexFileTemplate = store.getTiddlerText("PublishIndexTemplate");
// This does not allow <<myMacro>> but wants <div macro="myMacro">
indexFileTemplate = renderTemplate(indexFileTemplate)
// This option allows WIKI-syntax but is limited in it's HTML capabilities
//indexFileTemplate = wikifyStatic(indexFileTemplate)
for (var t = 0; t < tiddlers.length; t++) {
var tiddler = tiddlers[t];
if (tiddler.tags.containsAny(PublishTags)) {
var tiddlerText = store.getValue(tiddler, 'text');
var tiddlerHTML = wikifyStatic(tiddlerText);
var HTML = '<html>\n\<head>\n' + HTMLTemplateHead + '\n</head>\n<body>\n' + HTMLTemplateBody + '\n</body>\n</html>';
HTML = HTML.format([
wikifyPlain("SiteTitle").htmlEncode(),
tiddler.title.htmlEncode(),
wiki2Web(tiddlerHTML),
tiddler.tags.join(", "),
tiddler.modifier,
tiddler.modified.toLocaleString(),
tiddler.created.toLocaleString(),
tiddlerText
]);
//saveFile(PublishFolder + tiddler.created.formatString("YYYY0MM0DD") + ".html", HTML);
saveFile(PublishFolder + tiddler.title.filenameEncode() + ".html", HTML);
indexFile += "<li><a href=\"" + tiddler.title.filenameEncode() + ".html" + "\" class=\"tiddlyLink tiddlyLinkExisting\">" + tiddler.title + "</a></li>\n";
story.closeTiddler(tiddler.title);
}
}
indexFileTemplate = '<html>\n\<head>\n' + HTMLTemplateHead + '\n</head>\n<body>\n' + indexFileTemplate + '\n</body>\n</html>';
indexFileTemplate = indexFileTemplate.format([wikifyPlain("SiteTitle").htmlEncode(), wikifyPlain("SiteSubtitle").htmlEncode(), "%2", "", "", "", (new Date()).toLocaleString()])
indexFile = indexFileTemplate.replace("%2", indexFile)
indexFile = wiki2Web(indexFile);
saveFile(PublishFolder + "index.html", indexFile)
saveFile(PublishFolder + "style.css", store.getTiddlerText("StyleSheet") + store.getTiddlerText("StyleSheetLayout") + store.getTiddlerText("StyleSheetColors"))
var indexWin = window.open("file://" + PublishFolder.replace(/\\/g, "/") + "index.html", null);
indexWin.focus();
}
function renderTemplate(html) {
var result = document.createElement("div");
result.innerHTML = html;
applyHtmlMacros(result, null);
var temp = result.innerHTML;
//result.parentNode.removeChild(result);
return temp;
}
// Convert wikified text to html
function wiki2Web(wikiHTML) {
//var regexpLinks = new RegExp("<a tiddlylink=.*?</a>", "img");
var regexpLinks = /<a[^>]+tiddlylink\s*=\s*["']?\s*?([^ "'>]*)\s*["']?[^>]*>[^<]+<\/a>/img;
var result = wikiHTML.match(regexpLinks);
if (result) {
for (i = 0; i < result.length; i++) {
var className = result[i].match(/ class="(.*?)"/i) ? result[i].match(/ class="(.*?)"/i)[1] : "";
var tiddlerName = result[i].match(/ tiddlylink="(.*?)"/i)[1];
var url = tiddlerName.htmlDecode().filenameEncode() + ".html";
var tiddlerLabel = result[i].match(/">(.*?)<\/a>/i)[1];
if (!className.match(/tiddlyLinkNonExisting/i))
wikiHTML = wikiHTML.myReplace(result[i], "<a class=\"" + className + "\" href=\"" + url + "\">" + tiddlerLabel + "</a>");
else
wikiHTML = wikiHTML.myReplace(result[i], "<a class=\"" + className + "\" title=\"Page does not exist\" href=\"#\">" + tiddlerName + "</a>");
}
wikiHTML = wikiHTML.replace(/ href="http:\/\//gi, " target=\"_blank\" href=\"http://");
}
return wikiHTML
}
function getWikiPath(folderName) {
var originalPath = document.location.toString();
if (originalPath.substr(0, 5) != 'file:') {
alert(config.messages.notFileUrlError);
if (store.tiddlerExists(config.messages.saveInstructions))
story.displayTiddler(null, config.messages.saveInstructions);
return;
}
var localPath = getLocalPath(originalPath);
var backSlash = localPath.lastIndexOf('\\') == -1 ? '/': '\\';
var dirPathPos = localPath.lastIndexOf(backSlash);
var subPath = localPath.substr(0, dirPathPos) + backSlash + (folderName ? folderName + backSlash: '');
return subPath;
}
// Replace without regex
String.prototype.myReplace = function(sea, rep) {
var t1 = this.indexOf(sea);
var t2 = parseInt(this.indexOf(sea)) + parseInt(sea.length);
var t3 = this.length;
return this.substring(0, t1) + rep + this.substring(t2, t3)
}
// Convert illegal characters to underscores
String.prototype.filenameEncode = function()
{
return (this.toLowerCase().replace(/[^a-z0-9_-]/g, "_"));
}
//}}}
<div class='viewer' id='contentWrapper'><small><a href="./publish/index.html">Home</a> > %1</small><h1>%0</h1>
<h2>%1</h2>
%2
<hr>Tags: %3
<hr>%4, %5 (created %6)
</div>
<h1>%0</h1>
<h2>%1</h2>
%2
<hr>Tags: %3
<hr>%4, %5 (created %6)
</div>
Section 7.1.7 of the specification defines the ''~QoS'' package of the metamodel. The ecore model for this includes the abstract //~QosPolicy// classifier as well as a classifier for each policy in the DDS specification. This model has the following properties:
* package: org.opendds.modeling.model
* file: org.opendds.modeling.model/models/~QoS.ecore
* namespace: ~QoS
* ns prefix: qos
* location: //{{{http://www.opendds.org/modeling/schemas/QoS/1.0}}}//
{{imgcenter{[img[images/QoS.png]]}}}
<<search>><<closeAll>><<permaview>><<newTiddler>><<saveChanges>><<doPublish>><<slider chkSliderOptionsPanel OptionsPanel "options »" "Change TiddlyWiki advanced options">>
a:hover {
text-decoration: none;
}
.publishLogo {
position: relative;
background-color:[[ColorPalette::Background]];
background-image: url(images/opendds.png);
background-position: left;
background-repeat: no-repeat;
color:[[ColorPalette::SecondaryDark]];
padding: 20px 0 5px 72px;
border-bottom: 1px solid [[ColorPalette::SecondaryLight]];
}
.headerForeground {
position: relative;
background-color:[[ColorPalette::Background]];
background-image: url(images/opendds.png);
background-position: left;
background-repeat: no-repeat;
color:[[ColorPalette::SecondaryDark]];
padding: 20px 0 5px 72px;
border-bottom: 1px solid [[ColorPalette::SecondaryLight]];
}
.headerForeground a {
color:[[ColorPalette::SecondaryDark]];
font-weight: bold;
}
.footer {
border-top: 1px solid [[ColorPalette::SecondaryLight]];
color:[[ColorPalette::SecondaryLight]];
margin-top: 20px;
font-size: 1.1em;
}
.siteTitle {
font-weight: bold;
}
#mainMenu {
padding: 25px 0 0 20px;
}
.toolbar {
float: right;
}
.viewer div.centeredTable {
text-align: center;
}
.viewer div.centeredTable table {
margin: 0 auto;
text-align: left;
}
.imgcenter {
display: block;
text-align: center;
margin-left: auto;
margin-right: auto;
}
#publishContentWrapper {margin: 0 5em 0 5em; padding: 0;}
th { border-style: inset;}
td { border-style: inset;}
/*{{{*/
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
a {color:[[ColorPalette::PrimaryMid]];}
a:hover {/*background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];*/}
a img {border:0;}
h1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}
h1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];}
h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}
.button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}
.button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}
.button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}
.header {background:[[ColorPalette::PrimaryMid]];}
.headerShadow {color:[[ColorPalette::Foreground]];}
.headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}
.headerForeground {color:[[ColorPalette::Background]];}
.headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}
.tabSelected{color:[[ColorPalette::PrimaryDark]];
background:[[ColorPalette::TertiaryPale]];
border-left:1px solid [[ColorPalette::TertiaryLight]];
border-top:1px solid [[ColorPalette::TertiaryLight]];
border-right:1px solid [[ColorPalette::TertiaryLight]];
}
.tabUnselected {color:[[ColorPalette::Background]]; background:[[ColorPalette::TertiaryMid]];}
.tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}
.tabContents .button {border:0;}
#sidebar {}
#sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}
#sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}
.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
border:1px solid [[ColorPalette::PrimaryMid]];}
.wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}
.wizard .notChanged {background:transparent;}
.wizard .changedLocally {background:#80ff80;}
.wizard .changedServer {background:#8080ff;}
.wizard .changedBoth {background:#ff8080;}
.wizard .notFound {background:#ffff80;}
.wizard .putToServer {background:#ff80ff;}
.wizard .gotFromServer {background:#80ffff;}
#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}
#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}
.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}
.popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}
.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}
.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}
.tiddler .defaultCommand {font-weight:bold;}
.shadow .title {color:[[ColorPalette::TertiaryDark]];}
.title {color:[[ColorPalette::SecondaryDark]];}
.subtitle {color:[[ColorPalette::TertiaryDark]];}
.toolbar {color:[[ColorPalette::PrimaryMid]];}
.toolbar a {color:[[ColorPalette::TertiaryLight]];}
.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}
.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}
.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}
.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}
.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}
.tagging .button, .tagged .button {border:none;}
.footer {color:[[ColorPalette::TertiaryLight]];}
.selected .footer {color:[[ColorPalette::TertiaryMid]];}
.sparkline {background:[[ColorPalette::PrimaryPale]]; border:0;}
.sparktick {background:[[ColorPalette::PrimaryDark]];}
.error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}
.warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}
.lowlight {background:[[ColorPalette::TertiaryLight]];}
.zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}
.imageLink, #displayArea .imageLink {background:transparent;}
.annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}
.viewer .listTitle {list-style-type:none; margin-left:-2em;}
.viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}
.viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}
.viewer table, table.twtable {border:2px solid [[ColorPalette::TertiaryDark]];}
.viewer th, .viewer thead td, .twtable th, .twtable thead td {background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::Background]];}
.viewer td, .viewer tr, .twtable td, .twtable tr {border:1px solid [[ColorPalette::TertiaryDark]];}
.viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}
.viewer code {color:[[ColorPalette::SecondaryDark]];}
.viewer hr {border:0; border-top:dashed 1px [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryDark]];}
.highlight, .marked {background:[[ColorPalette::SecondaryLight]];}
.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}
.editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}
.editorFooter {color:[[ColorPalette::TertiaryMid]];}
#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}
#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }
#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}
#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}
.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}
.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}
#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:'alpha(opacity=60)';}
/*}}}*/
Tasks pushed to the side that still need to be done are captured here.
*[[Plug-in TODO]]
Section 7.1.4 of the specification defines the ''Topics'' package of the metamodel. The ecore model for this includes the //~TopicDescription//, //Topic//, //~ContentFilteredTopic//, and //~MultiTopic// classifiers. This model has the following properties:
* package: org.opendds.modeling.model
* file: org.opendds.modeling.model/models/Topics.ecore
* namespace: Topics
* ns prefix: topics
* location: //{{{http://www.opendds.org/modeling/schemas/Topics/1.0}}}//
{{imgcenter{[img[images/Topics.png]]}}}
Section 7.1.5 of the specification defines the ''Types'' package of the metamodel. The ecore model for this includes many type definitions used for defining the data that can be transfered over DDS. These types include both simple and compound data types. This model has the following properties:
* package: org.opendds.modeling.model
* file: org.opendds.modeling.model/models/Types.ecore
* namespace: Types
* ns prefix: types
* location: //{{{http://www.opendds.org/modeling/schemas/Types/1.0}}}//
{{imgcenter{[img[images/Types.png]]
This plug-in package is where the components of the ~OpenDDS Modeling Software Development Kit (SDK) are defined as a feature that can be installed as a unit. It defines the information presented to the user during installation and updates, along with branding icons, web pages, and links.
The following plug-ins are included in this feature:
|[[org.opendds.modeling.model]] |Specification defined and ~OpenDDS extended meta-models and profile stereotypes. |
|[[org.opendds.modeling.model.edit]] |Ecore editor support for the metamodel and profile stereotypes. |
|[[org.opendds.modeling.model.editor]] |Ecore editors for the meta-models and Profile stereotypes. |
|[[org.opendds.modeling.diagram.main]] |GMF generated graphical editor to capture the top level packages of an ~OpenDDS model. |
|[[org.opendds.modeling.diagram.datalib]] |GMF generated graphical editor to capture the data definitions used by an ~OpenDDS model. |
|[[org.opendds.modeling.diagram.policylib]] |GMF generated graphical editor to capture the ~QoS policy definitions used by an ~OpenDDS model. |
|[[org.opendds.modeling.sdk]] |Code generation plug-in to convert an ~OpenDDS model to C++ code, DDS IDL, and MPC build files. |
This plug-in specifies that branding information can be found in the [[org.opendds.modeling.sdk]] plug-in.
This plug-in will contain the HTML based help files for the SDK.
! Running Example
The Messenger example will be used as the running example, and embellished as needed to cover concepts not present in the original example.
! Structure
The overall structure for the help content is as shown below. Note that the content will evolve over time so some details may change, but the overall structure should remain fairly intact.
{{{
Top-level (intro to the OpenDDS SDK)
Getting Started
What is OpenDDS?
Advantages of using the OpenDDS SDK.
Known Limitations
Concepts
Modeling
Main Model
Policy Model
Data Model
DCPS Model
Reusable libraries
Code generation
Generated Code
Customizations
Application Integration
Tasks
Modeling
Defining reusable libraries
Creating Policies libraries
Creating Data libraries
Creating DCPS libraries
Using libraries
Code Generation
Creating a generation specification
Customizing the generated code
Generating the code
Integrating the generated code
Reference
QosPolicies (describe policies, map stereotypes to policies (e.g. udQosPolicy to UserDataQosPolicy)
Data Types (describe data types that can be used)
Samples
Modeling
Sample Policy Library
Sample Data library
Sample DCPS library
}}}
This package is where the ~OpenDDS Modeling SDK metamodels and profile are captured. These [[EMF Models]] provide the stereotype elements that are used to capture a DCPS model using ~OpenDDS. They include the individual specification package models as well as the overall ~OpenDDS profile model.
!Code Generation
This plug-in generates local model Java source code, the //'org.opendds.modeling.model.edit'// editor support project, the //'org.opendds.modeling.model.editor'// ecore editor project, and XML schema definitions for the ecore models. This is done using the file:
{{{
models/OpenDDS.genmodel
}}}
as the code generation specification file. Properties for each Ecore model and generated output are defined within this specification.
!Extensions
This plug-in was created as an EMF project and implements several extension points from within the EMF project. These include:
!!org.eclipse.emf.ecore.generated_package
There are several extensions of of this EMF extension point implemented. They define the several different Ecore models of the profile. The models, along with the URI used for the extension point package, are:
| ''Class'' | ''Schema URI'' |
|org.opendds.modeling.model.opendds.~OpenDDSPackage |{{{http://www.opendds.org/modeling/schemas/OpenDDS/1.0}}} |
|org.opendds.modeling.model.core.Core |{{{http://www.opendds.org/modeling/schemas/Core/1.0}}} |
|org.opendds.modeling.model.domain.~DomainPackage |{{{http://www.opendds.org/modeling/schemas/Domain/1.0}}} |
|org.opendds.modeling.model.qos.~QoSPackage |{{{http://www.opendds.org/modeling/schemas/QoS/1.0}}} |
|org.opendds.modeling.model.topics.~TopicsPackage |{{{http://www.opendds.org/modeling/schemas/Topics/1.0}}} |
|org.opendds.modeling.model.dcps.~DCPSPackage |{{{http://www.opendds.org/modeling/schemas/DCPS/1.0}}} |
Each of these package extensions defines an Ecore metamodel corresponding to a Module of the profile. They are all included in the //~OpenDDS.genmodel// editor generation specification file. Only the ~OpenDDSPackage package should be generated for use by the GMF editor extensions.
!!org.eclipse.core.resources.natures
This extension point provides and explicit //'~OpenDDS'// nature for projects and files that are part of the SDK. The class implementing the nature is:
{{{
org.opendds.modeling.model.opendds.OpenDDSProjectNature
}}}
!!org.eclipse.emf.ecore.extension_parser
This extension point is required in order to define the use of XMI Id values for model elements and the use of the values as the fragment part of //'href'// attributes within the model. This removes the positional notation that is used by default. This is done in the class:
{{{
org.opendds.modeling.model.opendds.OpenDDSResourceFactory
}}}
The files for which this is done are the //'.opendds'// extension.
!Required Plug-ins
This plug-in depends on the installation of the following plug-ins:
*org.eclipse.core.runtime
*org.eclipse.core.resources
*org.eclipse.emf.ecore
This plug-in is generated by the [[org.opendds.modeling.model]] plugin using the models/~OpenDDS.genmodel generation specification file. Only the plug-in Manifest and properties are not regenerated from scratch as changes are made to the source plug-in.
This plug-in is generated by the [[org.opendds.modeling.model]] plugin using the models/~OpenDDS.genmodel generation specification file. Only the plug-in Manifest, properties, and New wizard icon are not regenerated from scratch as changes are made to the source plug-in.
This plug-in provides the code generation feature for the ~OpenDDS Modeling SDK. Branding information for the entire SDK is also provided by this package. This package is where contributions to the menus, actions, and toolbars are made as well.
!Extensions
This plug-in is a standard Eclipse plug-in and was created with a Multi-page editor. It implements extension points for several other plug-ins. These include:
!!org.eclipse.ui.editors
A single multi-page editor is implemented from this extension point named //'~OpenDDS Code Generator'// with implementing class
{{{
org.opendds.modeling.sdk.codegen.CodeGenEditor
}}}
This editor is implemented with several UI forms and using a standard text editor as the final tab. The editor tabs include:
| ''Tab'' | ''Description'' |
|Generate |This form includes the ability to specify the model source file and the target generation directory. The source file is parsed for a model name and that name is used to name the generated output files. Pushbuttons to allow generating single or all possible output files are on the form. Generated files are placed in the specified target folder with the extracted model name and appropriate extension for the generated file. |
|Customize |This form is planned to include the ability to customize any transport specification information for the generated code. The ability to specify that the transport information be included as generated API code or external configuration files is expected to be allowed. |
|<filename>.codegen |This is the text editor exposing the raw XML format of the code generation specification. |
!!org.eclipse.ui.newWizards
A file creation wizard is implemented from this extension named //'~OpenDDS Code Generator Specification'// with implementing class
{{{
org.opendds.modeling.sdk.wizards.CodeGenNewWizard
}}}
This wizard will create a single code generation specification file, with file extension //'.opendds'// and open an editor with this file. The wizard will suggest the selected container, if any, or the container of any selected single file, if any as the container for the new resource.
It is planned to implement using any single selected file as the suggested model input file for the code generation specification.
!Required Plug-ins
This plug-in depends on the installation of the following plug-ins:
*org.eclipse.core.runtime
*org.eclipse.core.resources
*org.eclipse.core.filesystem
*org.eclipse.ui
*org.eclipse.ui.editors
*org.eclipse.ui.ide
*org.eclipse.ui.forms
*org.eclipse.jface.text
*org.apache.commons.jxpath
*javax.xml
This plug-in specifies the information to allow the ~OpenDDS Modeling SDK to be installed and updated as a unit. It defines the Category: //'~OpenDDS Modeling SDK'// which is used by eclipse to group features for installation. The [[org.opendds.modeling.feature]] is included under this category.