| <html xmlns:v="urn:schemas-microsoft-com:vml" |
| xmlns:o="urn:schemas-microsoft-com:office:office" |
| xmlns:w="urn:schemas-microsoft-com:office:word" |
| xmlns:st1="urn:schemas-microsoft-com:office:smarttags" |
| xmlns="http://www.w3.org/TR/REC-html40"> |
| |
| <head> |
| <meta http-equiv=Content-Type content="text/html; charset=windows-1252"> |
| <meta name=ProgId content=Word.Document> |
| <meta name=Generator content="Microsoft Word 10"> |
| <meta name=Originator content="Microsoft Word 10"> |
| <link rel=File-List href="article_files/filelist.xml"> |
| <link rel=Edit-Time-Data href="article_files/editdata.mso"> |
| <!--[if !mso]> |
| <style> |
| v\:* {behavior:url(#default#VML);} |
| o\:* {behavior:url(#default#VML);} |
| w\:* {behavior:url(#default#VML);} |
| .shape {behavior:url(#default#VML);} |
| </style> |
| <![endif]--> |
| <title>Introduction to UML2 Profiles</title> |
| <o:SmartTagType namespaceuri="urn:schemas-microsoft-com:office:smarttags" |
| name="country-region"/> |
| <o:SmartTagType namespaceuri="urn:schemas-microsoft-com:office:smarttags" |
| name="place"/> |
| <o:SmartTagType namespaceuri="urn:schemas-microsoft-com:office:smarttags" |
| name="State"/> |
| <o:SmartTagType namespaceuri="urn:schemas-microsoft-com:office:smarttags" |
| name="City"/> |
| <o:SmartTagType namespaceuri="urn:schemas-microsoft-com:office:smarttags" |
| name="date"/> |
| <!--[if gte mso 9]><xml> |
| <o:DocumentProperties> |
| <o:Author>khussey</o:Author> |
| <o:Template>Normal</o:Template> |
| <o:LastAuthor>jbruck</o:LastAuthor> |
| <o:Revision>179</o:Revision> |
| <o:TotalTime>4753</o:TotalTime> |
| <o:Created>2004-10-25T17:54:00Z</o:Created> |
| <o:LastSaved>2008-07-11T19:41:00Z</o:LastSaved> |
| <o:Pages>1</o:Pages> |
| <o:Words>8775</o:Words> |
| <o:Characters>50024</o:Characters> |
| <o:Company>Rational Software</o:Company> |
| <o:Lines>416</o:Lines> |
| <o:Paragraphs>117</o:Paragraphs> |
| <o:CharactersWithSpaces>58682</o:CharactersWithSpaces> |
| <o:Version>10.6830</o:Version> |
| </o:DocumentProperties> |
| </xml><![endif]--><!--[if gte mso 9]><xml> |
| <w:WordDocument> |
| <w:SpellingState>Clean</w:SpellingState> |
| <w:GrammarState>Clean</w:GrammarState> |
| <w:Compatibility> |
| <w:ApplyBreakingRules/> |
| </w:Compatibility> |
| <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> |
| </w:WordDocument> |
| </xml><![endif]--><!--[if !mso]><object |
| classid="clsid:38481807-CA0E-42D2-BF39-B33AF135CC4D" id=ieooui></object> |
| <style> |
| st1\:*{behavior:url(#ieooui) } |
| </style> |
| <![endif]--> |
| <link rel=Stylesheet type="text/css" media=all href="default_style.css"> |
| <style> |
| <!-- |
| /* Font Definitions */ |
| @font-face |
| {font-family:"MS Mincho"; |
| panose-1:2 2 6 9 4 2 5 8 3 4; |
| mso-font-alt:"MS Mincho"; |
| mso-font-charset:128; |
| mso-generic-font-family:modern; |
| mso-font-pitch:fixed; |
| mso-font-signature:-1610612033 1757936891 16 0 131231 0;} |
| @font-face |
| {font-family:Tahoma; |
| panose-1:2 11 6 4 3 5 4 4 2 4; |
| mso-font-charset:238; |
| mso-generic-font-family:swiss; |
| mso-font-pitch:variable; |
| mso-font-signature:1627421319 -2147483648 8 0 66047 0;} |
| @font-face |
| {font-family:Verdana; |
| panose-1:2 11 6 4 3 5 4 4 2 4; |
| mso-font-charset:238; |
| mso-generic-font-family:swiss; |
| mso-font-pitch:variable; |
| mso-font-signature:536871559 0 0 0 415 0;} |
| @font-face |
| {font-family:"\@MS Mincho"; |
| panose-1:2 2 6 9 4 2 5 8 3 4; |
| mso-font-charset:128; |
| mso-generic-font-family:modern; |
| mso-font-pitch:fixed; |
| mso-font-signature:-1610612033 1757936891 16 0 131231 0;} |
| /* Style Definitions */ |
| p.MsoNormal, li.MsoNormal, div.MsoNormal |
| {mso-style-parent:""; |
| margin:0in; |
| margin-bottom:.0001pt; |
| mso-pagination:widow-orphan; |
| font-size:12.0pt; |
| font-family:"Times New Roman"; |
| mso-fareast-font-family:"Times New Roman"; |
| mso-believe-normal-left:yes;} |
| h1 |
| {mso-margin-top-alt:auto; |
| margin-right:0in; |
| mso-margin-bottom-alt:auto; |
| margin-left:0in; |
| mso-pagination:widow-orphan; |
| mso-outline-level:1; |
| font-size:21.0pt; |
| mso-fareast-font-family:"MS Mincho"; |
| font-weight:bold;} |
| h2 |
| {mso-margin-top-alt:auto; |
| margin-right:0in; |
| mso-margin-bottom-alt:auto; |
| margin-left:0in; |
| mso-line-height-alt:10.5pt; |
| mso-pagination:widow-orphan; |
| mso-outline-level:2; |
| font-size:18.0pt; |
| mso-fareast-font-family:"MS Mincho"; |
| font-weight:bold;} |
| h3 |
| {mso-margin-top-alt:auto; |
| margin-right:0in; |
| mso-margin-bottom-alt:auto; |
| margin-left:0in; |
| mso-pagination:widow-orphan; |
| mso-outline-level:3; |
| font-size:14.0pt; |
| mso-fareast-font-family:"MS Mincho"; |
| font-weight:bold;} |
| a:link, span.MsoHyperlink |
| {color:blue; |
| text-decoration:underline; |
| text-underline:single;} |
| a:visited, span.MsoHyperlinkFollowed |
| {color:purple; |
| text-decoration:underline; |
| text-underline:single;} |
| p.MsoDocumentMap, li.MsoDocumentMap, div.MsoDocumentMap |
| {mso-style-noshow:yes; |
| margin:0in; |
| margin-bottom:.0001pt; |
| mso-pagination:widow-orphan; |
| background:navy; |
| font-size:12.0pt; |
| font-family:Tahoma; |
| mso-fareast-font-family:"Times New Roman";} |
| p |
| {mso-margin-top-alt:auto; |
| margin-right:0in; |
| mso-margin-bottom-alt:auto; |
| margin-left:0in; |
| mso-pagination:widow-orphan; |
| font-size:10.0pt; |
| mso-fareast-font-family:"Times New Roman";} |
| code |
| {mso-fareast-font-family:"Times New Roman";} |
| pre |
| {margin:0in; |
| margin-bottom:.0001pt; |
| mso-pagination:widow-orphan; |
| tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt; |
| font-size:10.0pt; |
| mso-fareast-font-family:"Times New Roman";} |
| p.indextop, li.indextop, div.indextop |
| {mso-style-name:indextop; |
| mso-margin-top-alt:auto; |
| margin-right:0in; |
| mso-margin-bottom-alt:auto; |
| margin-left:0in; |
| mso-pagination:widow-orphan; |
| font-size:24.0pt; |
| mso-fareast-font-family:"Times New Roman"; |
| font-weight:bold;} |
| p.indexsub, li.indexsub, div.indexsub |
| {mso-style-name:indexsub; |
| mso-margin-top-alt:auto; |
| margin-right:0in; |
| mso-margin-bottom-alt:auto; |
| margin-left:0in; |
| mso-pagination:widow-orphan; |
| font-size:7.5pt; |
| mso-fareast-font-family:"Times New Roman";} |
| span.SpellE |
| {mso-style-name:""; |
| mso-spl-e:yes;} |
| span.GramE |
| {mso-style-name:""; |
| mso-gram-e:yes;} |
| @page Section1 |
| {size:8.5in 11.0in; |
| margin:1.0in 1.25in 1.0in 1.25in; |
| mso-header-margin:.5in; |
| mso-footer-margin:.5in; |
| mso-paper-source:0;} |
| div.Section1 |
| {page:Section1;} |
| /* List Definitions */ |
| @list l0 |
| {mso-list-id:2098360590; |
| mso-list-type:hybrid; |
| mso-list-template-ids:-501428010 67698705 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} |
| @list l0:level1 |
| {mso-level-text:"%1\)"; |
| mso-level-tab-stop:.5in; |
| mso-level-number-position:left; |
| text-indent:-.25in;} |
| @list l0:level2 |
| {mso-level-tab-stop:1.0in; |
| mso-level-number-position:left; |
| text-indent:-.25in;} |
| @list l0:level3 |
| {mso-level-tab-stop:1.5in; |
| mso-level-number-position:left; |
| text-indent:-.25in;} |
| @list l0:level4 |
| {mso-level-tab-stop:2.0in; |
| mso-level-number-position:left; |
| text-indent:-.25in;} |
| @list l0:level5 |
| {mso-level-tab-stop:2.5in; |
| mso-level-number-position:left; |
| text-indent:-.25in;} |
| @list l0:level6 |
| {mso-level-tab-stop:3.0in; |
| mso-level-number-position:left; |
| text-indent:-.25in;} |
| @list l0:level7 |
| {mso-level-tab-stop:3.5in; |
| mso-level-number-position:left; |
| text-indent:-.25in;} |
| @list l0:level8 |
| {mso-level-tab-stop:4.0in; |
| mso-level-number-position:left; |
| text-indent:-.25in;} |
| @list l0:level9 |
| {mso-level-tab-stop:4.5in; |
| mso-level-number-position:left; |
| text-indent:-.25in;} |
| ol |
| {margin-bottom:0in;} |
| ul |
| {margin-bottom:0in;} |
| --> |
| </style> |
| <!--[if gte mso 10]> |
| <style> |
| /* Style Definitions */ |
| table.MsoNormalTable |
| {mso-style-name:"Table Normal"; |
| mso-tstyle-rowband-size:0; |
| mso-tstyle-colband-size:0; |
| mso-style-noshow:yes; |
| mso-style-parent:""; |
| mso-padding-alt:0in 5.4pt 0in 5.4pt; |
| mso-para-margin:0in; |
| mso-para-margin-bottom:.0001pt; |
| mso-pagination:widow-orphan; |
| font-size:10.0pt; |
| font-family:"Times New Roman";} |
| </style> |
| <![endif]--><![if mso 9]> |
| <style> |
| p.MsoNormal |
| {margin-left:8.5pt;} |
| </style> |
| <![endif]><!--[if gte mso 9]><xml> |
| <o:shapedefaults v:ext="edit" spidmax="10242"/> |
| </xml><![endif]--><!--[if gte mso 9]><xml> |
| <o:shapelayout v:ext="edit"> |
| <o:idmap v:ext="edit" data="1"/> |
| </o:shapelayout></xml><![endif]--> |
| </head> |
| |
| <body lang=EN-US link=blue vlink=purple style='tab-interval:.5in;margin-left: |
| 8.5pt;margin-top:14.2pt'> |
| |
| <div class=Section1> |
| |
| <p class=MsoNormal align=right style='text-align:right'><span style='font-size: |
| 10.0pt;font-family:Arial'> </span><span style='font-size:10.0pt'>Copyright |
| © 2004, 2008 International Business Machines Corp.</span><span |
| style='font-size:10.0pt;font-family:Arial'> <o:p></o:p></span></p> |
| |
| <div align=right> |
| |
| <table class=MsoNormalTable border=0 cellspacing=0 cellpadding=0 width="100%" |
| style='width:100.0%;mso-cellspacing:0in;mso-padding-alt:1.5pt 1.5pt 1.5pt 1.5pt'> |
| <tr style='mso-yfti-irow:0;mso-yfti-lastrow:yes'> |
| <td valign=top style='background:#0080C0;padding:1.5pt 1.5pt 1.5pt 1.5pt'> |
| <p class=MsoNormal><span style='font-size:10.0pt;font-family:Arial'><o:p> </o:p></span></p> |
| </td> |
| </tr> |
| </table> |
| |
| </div> |
| |
| <h1><img width=120 height=86 id="_x0000_i1025" src="../../../../images/Idea.jpg" |
| align=CENTER></h1> |
| |
| <p> </p> |
| |
| <h1 align=center style='text-align:center'>Introduction to UML2 Profiles</h1> |
| |
| <blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'> |
| |
| <p class=MsoNormal><b><span style='font-size:10.0pt;font-family:Arial'>Summary</span></b><span |
| style='font-size:10.0pt;font-family:Arial'> <br> |
| This article describes how to work with profiles using the UML2 plug-ins for |
| Eclipse. In particular, it gives an overview of how to create and apply |
| profiles (and their contents) both programmatically and by using the sample UML |
| editor<o:p></o:p></span></p> |
| |
| <p><span class=SpellE><b>Kenn</b></span><b> Hussey, IBM</b><br> |
| <st1:date Year="2006" Day="18" Month="7">July 18, 2006</st1:date> (Updated: <st1:date |
| Year="2008" Day="11" Month="7">July 11, 2008</st1:date> for Eclipse 3.4; James <span |
| class=SpellE>Bruck</span>)</p> |
| |
| </blockquote> |
| |
| <div class=MsoNormal align=center style='text-align:center'><span |
| style='font-size:10.0pt;font-family:Arial'> |
| |
| <hr size=2 width="100%" align=center> |
| |
| </span></div> |
| |
| <h2>Prerequisites</h2> |
| |
| <p>To start using UML2 (and to follow along with the example in this article), |
| you must have <span class=MsoHyperlink><a |
| href="http://download.eclipse.org/eclipse/downloads/">Eclipse 3.4</a></span>, <span |
| class=MsoHyperlink><a |
| href="http://www.eclipse.org/modeling/emf/downloads/?project=emf">EMF 2.4</a></span>, |
| and <span class=MsoHyperlink><a |
| href="http://www.eclipse.org/modeling/mdt/downloads/?project=uml2">UML2 2.2</a></span> |
| installed.<span style='mso-spacerun:yes'> </span></p> |
| |
| <p>You can either download the zips individually and expand them out or follow |
| the steps below:<span style='mso-spacerun:yes'> </span></p> |
| |
| <p style='margin-left:.5in;text-indent:-.25in;mso-list:l0 level1 lfo1; |
| tab-stops:list .5in'><![if !supportLists]><span style='mso-fareast-font-family: |
| Arial'><span style='mso-list:Ignore'>1)<span style='font:7.0pt "Times New Roman"'> |
| </span></span></span><![endif]><span dir=LTR><span |
| style='mso-spacerun:yes'> </span>Download and run Eclipse 3.4</span></p> |
| |
| <p style='margin-left:.5in;text-indent:-.25in;mso-list:l0 level1 lfo1; |
| tab-stops:list .5in'><![if !supportLists]><span style='mso-fareast-font-family: |
| Arial'><span style='mso-list:Ignore'>2)<span style='font:7.0pt "Times New Roman"'> |
| </span></span></span><![endif]><span dir=LTR><span |
| style='mso-spacerun:yes'> </span>Select the <b>Help</b> > <b>Software |
| Updates
</b>menu</span></p> |
| |
| <p style='margin-left:.5in;text-indent:-.25in;mso-list:l0 level1 lfo1; |
| tab-stops:list .5in'><![if !supportLists]><span style='mso-fareast-font-family: |
| Arial'><span style='mso-list:Ignore'>3)<span style='font:7.0pt "Times New Roman"'> |
| </span></span></span><![endif]><span dir=LTR><span |
| style='mso-spacerun:yes'> </span>Select the <b>Available Software</b> tab and |
| expand the <b>Ganymede\Model and Model Development</b> tree item.</span></p> |
| |
| <p style='margin-left:.25in'><!--[if gte vml 1]><v:shapetype id="_x0000_t75" |
| coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" |
| filled="f" stroked="f"> |
| <v:stroke joinstyle="miter"/> |
| <v:formulas> |
| <v:f eqn="if lineDrawn pixelLineWidth 0"/> |
| <v:f eqn="sum @0 1 0"/> |
| <v:f eqn="sum 0 0 @1"/> |
| <v:f eqn="prod @2 1 2"/> |
| <v:f eqn="prod @3 21600 pixelWidth"/> |
| <v:f eqn="prod @3 21600 pixelHeight"/> |
| <v:f eqn="sum @0 0 1"/> |
| <v:f eqn="prod @6 1 2"/> |
| <v:f eqn="prod @7 21600 pixelWidth"/> |
| <v:f eqn="sum @8 21600 0"/> |
| <v:f eqn="prod @7 21600 pixelHeight"/> |
| <v:f eqn="sum @10 21600 0"/> |
| </v:formulas> |
| <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/> |
| <o:lock v:ext="edit" aspectratio="t"/> |
| </v:shapetype><v:shape id="_x0000_i1128" type="#_x0000_t75" style='width:581.25pt; |
| height:408.75pt'> |
| <v:imagedata src="article_files/image037.png" o:title=""/> |
| </v:shape><![endif]--><![if !vml]><img border=0 width=775 height=545 |
| src="article_files/image038.jpg" v:shapes="_x0000_i1128"><![endif]></p> |
| |
| <p style='margin-left:.5in;text-indent:-.25in;mso-list:l0 level1 lfo1; |
| tab-stops:list .5in'><![if !supportLists]><span style='mso-fareast-font-family: |
| Arial'><span style='mso-list:Ignore'>4)<span style='font:7.0pt "Times New Roman"'> |
| </span></span></span><![endif]><span dir=LTR><span |
| style='mso-spacerun:yes'> </span>Select <b>UML2 End-User Features</b> and <b>UML2 |
| Extender SDK</b>.<span style='mso-spacerun:yes'> </span>The version should |
| indicate 2.2.0 (or later).</span></p> |
| |
| <p style='margin-left:.5in;text-indent:-.25in;mso-list:l0 level1 lfo1; |
| tab-stops:list .5in'><![if !supportLists]><span style='mso-fareast-font-family: |
| Arial'><span style='mso-list:Ignore'>5)<span style='font:7.0pt "Times New Roman"'> |
| </span></span></span><![endif]><span dir=LTR><span |
| style='mso-spacerun:yes'> </span>Click <b>Install<span class=GramE>
<span |
| style='font-weight:normal'>.</span></span></b></span></p> |
| |
| <p>At this stage, UML2 2.2 and all dependencies should be installed.</p> |
| |
| <h2>Introduction</h2> |
| |
| <p>This article will walk you through the basics of creating and applying |
| profiles using UML2. Using a subset of the <span class=SpellE>Ecore</span> |
| profile (see below) and the model we described in the Getting Started with |
| UML2 article [1] (the ExtendedPO2 model, shamelessly borrowed from the EMF |
| bible [2]) as an example, well look at whats involved in creating some of |
| the more common elements that make up a profile. For each type of element, |
| well first explain the creation process using the sample UML editor and |
| explore how to accomplish the same thing using Java code. Then well look at |
| whats involved in applying profiles and stereotypes to models. The ExtendedPO2 |
| model is shown below.</p> |
| |
| <p><!--[if gte vml 1]><v:shape id="_x0000_i1027" type="#_x0000_t75" style='width:581.25pt; |
| height:407.25pt'> |
| <v:imagedata src="article_files/image039.emz" o:title=""/> |
| </v:shape><![endif]--><![if !vml]><img border=0 width=775 height=543 |
| src="article_files/image002.gif" v:shapes="_x0000_i1027"><![endif]></p> |
| |
| <p>As described in the EMF book, some of the attributes of certain <span |
| class=SpellE>Ecore</span> elements cannot be expressed directly in UML. EMF |
| provides a Rose property file (<span class=SpellE><span style='font-family: |
| "Courier New"'>ecore.pty</span></span>) that defines all the non- UML |
| properties needed to completely express an EMF model using Rational Rose. The |
| same thing can be achieved for a UML2 model using a profile.</p> |
| |
| <p>The <span class=SpellE>Ecore</span> properties for attributes are shown |
| below. These properties can be expressed in UML2 as properties owned by a |
| stereotype that extends the <span style='font-family:"Courier New"'>Property</span> |
| <span class=SpellE>metaclass</span>.</p> |
| |
| <p><!--[if gte vml 1]><v:shape id="_x0000_i1028" type="#_x0000_t75" style='width:258pt; |
| height:306.75pt'> |
| <v:imagedata src="article_files/image003.png" o:title=""/> |
| </v:shape><![endif]--><![if !vml]><img border=0 width=344 height=409 |
| src="article_files/image004.jpg" v:shapes="_x0000_i1028"><![endif]></p> |
| |
| <p>The <span class=SpellE>Ecore</span> properties for association ends are |
| shown below. These properties can also be expressed in UML2 as properties owned |
| by a stereotype that extends the <span style='font-family:"Courier New"'>Property</span> |
| <span class=SpellE>metaclass</span>.</p> |
| |
| <p><!--[if gte vml 1]><v:shape id="_x0000_i1029" type="#_x0000_t75" style='width:258pt; |
| height:320.25pt'> |
| <v:imagedata src="article_files/image005.png" o:title=""/> |
| </v:shape><![endif]--><![if !vml]><img border=0 width=344 height=427 |
| src="article_files/image006.jpg" v:shapes="_x0000_i1029"><![endif]></p> |
| |
| <h2>Getting Started</h2> |
| |
| <p>Before getting started, youll need to create a simple project in your |
| workspace. This project will serve as the container for the profile that well |
| create using the UML editor. To create a simple project for this article, |
| follow these steps:</p> |
| |
| <p style='margin-left:27.5pt'>1) Select the <b>Window > Open Perspective |
| > <span class=GramE>Other</span>
</b> menu item.</p> |
| |
| <p style='margin-left:27.5pt'>2) Select the <b>Resource</b> perspective and |
| press the <b>OK</b> button.</p> |
| |
| <p style='margin-left:27.5pt'>3) Select the <b>File > New > Project...</b> |
| menu item.</p> |
| |
| <p style='margin-left:27.5pt'>4) Select the <b>Project</b> wizard from the <b>General</b> |
| category and press the <b>Next ></b> button.</p> |
| |
| <p style='margin-left:27.5pt'>5) Enter a project name (i.e. Introduction to |
| UML2 Profiles), and press the <b>Finish</b> button.</p> |
| |
| <p>At this point your workspace should look something like this:</p> |
| |
| <p><!--[if gte vml 1]><v:shape id="_x0000_i1129" type="#_x0000_t75" style='width:624pt; |
| height:405.75pt'> |
| <v:imagedata src="article_files/image001.png" o:title=""/> |
| </v:shape><![endif]--><![if !vml]><img border=0 width=832 height=541 |
| src="article_files/image040.jpg" v:shapes="_x0000_i1129"><![endif]></p> |
| |
| <p>OK, that should be enough to get us going with the UML editor. Now, to |
| follow along with the programmatic approach to creating profiles, well assume |
| that youve created a Java class (named, say, IntroductionToUML2Profiles) in |
| which you can write some code to construct our sample profile. The code |
| snippets well show assume youve defined the following utility methods to give |
| the user information on the programs status:</p> |
| |
| <pre style='margin-left:9.0pt'><img border=0 width=24 height=14 |
| id="_x0000_i1030" src="../../../../images/tag_1.gif" align=CENTER><span |
| style='mso-tab-count:1'> </span><span class=GramE>public</span> static <span |
| class=SpellE>boolean</span> DEBUG = true;</pre><pre style='margin-left:9.0pt'><o:p> </o:p></pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:1'> </span><span |
| class=GramE>protected</span> static void out(String output) {</pre><pre |
| style='margin-left:9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:2'> </span><span class=GramE>if</span> (DEBUG) {</pre><pre |
| style='margin-left:9.0pt'><img border=0 width=24 height=14 id="_x0000_i1031" |
| src="../../../../images/tag_2.gif" align=CENTER><span style='mso-tab-count: |
| 3'> </span><span class=SpellE><span class=GramE>System.out.println</span></span><span |
| class=GramE>(</span>output);</pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:2'> </span>}</pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:1'> </span>}</pre><pre style='margin-left:9.0pt'><o:p> </o:p></pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:1'> </span><span |
| class=GramE>protected</span> static void err(String error) {</pre><pre |
| style='margin-left:9.0pt'><img border=0 width=24 height=14 id="_x0000_i1032" |
| src="../../../../images/tag_3.gif" align=CENTER><span style='mso-tab-count: |
| 2'> </span><span class=SpellE><span class=GramE>System.err.println</span></span><span |
| class=GramE>(</span>error);</pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:1'> </span>}</pre> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>A |
| static debug flag <img border=0 width=24 height=14 id="_x0000_i1033" |
| src="../../../../images/tag_1.gif" align=CENTER><span |
| style='mso-spacerun:yes'> </span>can be used to enable or disable verbose information |
| printed to the systems output <span class=GramE>stream </span><img border=0 |
| width=24 height=14 id="_x0000_i1034" src="../../../../images/tag_2.gif" |
| align=CENTER>. Errors will always be printed to the systems error <span |
| class=GramE>stream </span><img border=0 width=24 height=14 id="_x0000_i1035" |
| src="../../../../images/tag_3.gif" align=CENTER>.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>All |
| <span class=SpellE>righty</span> then! In each of the following subsections, |
| well look at how to create or manipulate a different kind of UML element, |
| starting with profiles.</p> |
| |
| <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Creating |
| Profiles</h3> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>At |
| the root of every UML2 profile is a profile element. It defines limited |
| extensions to a reference <span class=SpellE>metamodel</span> (i.e. UML) with |
| the purpose of adapting the <span class=SpellE>metamodel</span> to a specific |
| platform or domain (e.g. EMF). <span class=SpellE>Metaclasses</span> from the |
| reference <span class=SpellE>metamodel</span> are extended via stereotypes, |
| which are defined as part of profiles. To create a profile using the UML |
| editor, follow these steps:</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>1) |
| Select a project (i.e. <b>Introduction to UML2 Profiles</b>) in the <b>Project |
| Explorer</b> view and select the <b>File > New > <span class=GramE>Other</span>...</b> |
| menu item.</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>2) |
| Select the <b>UML Model</b> wizard from the <b>Example EMF Model Creation |
| Wizards</b> category and press the <b>Next ></b> button.</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>3) |
| Enter a file name (i.e. <span class=SpellE>Ecore.profile.uml</span>) and |
| press the <b>Next ></b> button.</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>4) |
| Select <b>Profile</b> for the model object and press the <b>Finish</b> button.</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>5) |
| Select the <b>Window > Show View > Properties</b> menu item.</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>6) |
| Select the <b>Profile</b> element in the UML editor.</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>7) |
| Enter a value (i.e. <span class=SpellE>ecore</span>) for the <b>Name</b> |
| property in the <b>Properties</b> view.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img |
| border=0 width=62 height=13 id="_x0000_i1036" src="../../../../images/tip.gif"><span |
| style='mso-spacerun:yes'> </span>By convention, resources that contain profiles |
| end with a <code>.<span class=SpellE>profile.uml</span></code> file extension |
| in UML2. </p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>At |
| this point your workspace should look something like this:</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><!--[if gte vml 1]><v:shape |
| id="_x0000_i1130" type="#_x0000_t75" style='width:624pt;height:405.75pt'> |
| <v:imagedata src="article_files/image041.png" o:title=""/> |
| </v:shape><![endif]--><![if !vml]><img border=0 width=832 height=541 |
| src="article_files/image042.jpg" v:shapes="_x0000_i1130"><![endif]></p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Lets |
| look at how to perform the same task using Java code. The code snippet below |
| shows a method that programmatically creates and returns a profile with a |
| specified name.</p> |
| |
| <pre style='margin-left:9.0pt'><span style='mso-tab-count:1'> </span><span |
| class=GramE>protected</span> static Profile <span class=SpellE>createProfile</span>(String name) {</pre><pre |
| style='margin-left:9.0pt'><img border=0 width=24 height=14 id="_x0000_i1037" |
| src="../../../../images/tag_1.gif" align=CENTER><span style='mso-tab-count: |
| 2'> </span>Profile <span class=SpellE>profile</span> = <span |
| class=SpellE><span class=GramE>UMLFactory.eINSTANCE.createProfile</span></span><span |
| class=GramE>(</span>);</pre><pre style='margin-left:9.0pt'><img border=0 |
| width=24 height=14 id="_x0000_i1038" src="../../../../images/tag_2.gif" |
| align=CENTER><span style='mso-tab-count:2'> </span><span class=SpellE><span |
| class=GramE>profile.setName</span></span><span class=GramE>(</span>name);</pre><pre |
| style='margin-left:9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><img |
| border=0 width=24 height=14 id="_x0000_i1039" src="../../../../images/tag_3.gif" |
| align=CENTER><span style='mso-tab-count:2'> </span><span class=GramE>out(</span>"Profile '" + <span |
| class=SpellE>profile.getQualifiedName</span>() + "' created.");</pre><pre |
| style='margin-left:9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><img |
| border=0 width=24 height=14 id="_x0000_i1040" src="../../../../images/tag_4.gif" |
| align=CENTER><span style='mso-tab-count:1'> </span><span style='mso-tab-count: |
| 1'> </span><span class=GramE>return</span> profile;</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:1'> </span>}</pre> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>First, |
| we ask the UML factory singleton <img border=0 width=24 height=14 |
| id="_x0000_i1041" src="../../../../images/tag_1.gif" align=CENTER><span |
| style='mso-spacerun:yes'> </span>to create a profile, and we set its <span |
| class=GramE>name </span><img border=0 width=24 height=14 id="_x0000_i1042" |
| src="../../../../images/tag_2.gif" align=CENTER>. Then, we output information <img |
| border=0 width=24 height=14 id="_x0000_i1043" src="../../../../images/tag_3.gif" |
| align=CENTER><span style='mso-spacerun:yes'> </span>to the user to let them |
| know that the profile has been successfully created. Finally, we return <img |
| border=0 width=24 height=14 id="_x0000_i1044" src="../../../../images/tag_4.gif" |
| align=CENTER><span style='mso-spacerun:yes'> </span>the profile. Youll notice |
| most, if not all, of the code snippets in this article will follow this pattern |
| create the element (and set some properties on it), inform the user, and |
| return it.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>OK, |
| lets see this method in action. For example, we could create a profile named <span |
| class=SpellE>ecore</span> as follows:</p> |
| |
| <p style='margin-left:9.0pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span |
| style='mso-tab-count:2'> </span>Profile <span |
| class=SpellE>ecoreProfile</span> = <span class=SpellE><span class=GramE>createProfile</span></span><span |
| class=GramE>(</span>"<span class=SpellE>ecore</span>");</p> |
| |
| <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Importing |
| Primitive Types</h3> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Just |
| like a class, a stereotype may have properties, which may be referred to as tag |
| definitions. The types of these properties may be pre-defined in |
| (domain-specific) libraries referenced by the profile. A profile can be made to |
| reference primitive types from libraries (such as those provided in the <span |
| style='font-family:"Courier New"'>org.eclipse.uml2.uml.resources</span> |
| plug-in) by creating an import relationship between the profile and the |
| primitive type. To import a primitive type using the UML editor, follow these |
| steps:</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>1) |
| Select a package (i.e. <b style='mso-bidi-font-weight:normal'><<span |
| style='mso-bidi-font-weight:bold'>Profile> <span class=SpellE>ecore</span></span></b>) |
| in the UML editor.</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>2) |
| Select the <b style='mso-bidi-font-weight:normal'>UML Editor > Package > |
| Import Type
</b> menu item.</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>3) |
| Choose a primitive type (i.e. <span class=SpellE><b style='mso-bidi-font-weight: |
| normal'>UMLPrimitiveTypes::Boolean</b></span>)<span class=GramE>,</span> press |
| the <b style='mso-bidi-font-weight:normal'>Add</b> button, then press the <b |
| style='mso-bidi-font-weight:normal'>OK</b> button.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img |
| border=0 width=61 height=13 id="_x0000_i1045" src="../../../../images/tryit.gif"><span |
| style='mso-spacerun:yes'> </span>Import the other required primitive type (<span |
| class=SpellE><b style='mso-bidi-font-weight:normal'>UMLPrimitiveTypes::String</b></span>) |
| into the <span class=SpellE>Ecore</span> profile using the UML editor.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>At |
| this point your workspace should look something like this:</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><!--[if gte vml 1]><v:shape |
| id="_x0000_i1131" type="#_x0000_t75" style='width:624pt;height:405.75pt'> |
| <v:imagedata src="article_files/image007.png" o:title=""/> |
| </v:shape><![endif]--><![if !vml]><img border=0 width=832 height=541 |
| src="article_files/image008.jpg" v:shapes="_x0000_i1131"><![endif]></p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Lets |
| look at how to perform the same task using Java code. The code snippet below |
| shows a method that programmatically imports the primitive type with a |
| specified name from the UML primitive <span class=GramE>types</span> library |
| into a specified package and returns it.</p> |
| |
| <pre style='margin-left:9.0pt'><span style='mso-tab-count:1'> </span><span |
| class=GramE>protected</span> static <span class=SpellE>PrimitiveType</span> <span |
| class=SpellE>importPrimitiveType</span>(</pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:3'> </span>org.eclipse.uml2.uml.Package package_, String name) {</pre><pre |
| style='margin-left:9.0pt'><img border=0 width=24 height=14 id="_x0000_i1046" |
| src="../../../../images/tag_1.gif" align=CENTER><span style='mso-tab-count: |
| 2'> </span>Model <span class=SpellE>umlLibrary</span> = (Model) <span |
| class=GramE>load(</span>URI</pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:3'> </span>.<span class=SpellE><span |
| class=GramE>createURI</span></span><span class=GramE>(</span><span |
| class=SpellE>UMLResource.UML_PRIMITIVE_TYPES_LIBRARY_URI</span>));</pre><pre |
| style='margin-left:9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><img |
| border=0 width=24 height=14 id="_x0000_i1047" src="../../../../images/tag_2.gif" |
| align=CENTER><span style='mso-tab-count:2'> </span><span class=SpellE>PrimitiveType</span> <span |
| class=SpellE>primitiveType</span> = (<span class=SpellE>PrimitiveType</span>) <span |
| class=SpellE>umlLibrary</span></pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:3'> </span>.<span class=SpellE><span |
| class=GramE>getOwnedType</span></span><span class=GramE>(</span>name);</pre><pre |
| style='margin-left:9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><img |
| border=0 width=24 height=14 id="_x0000_i1048" src="../../../../images/tag_3.gif" |
| align=CENTER><span style='mso-tab-count:2'> </span><span class=SpellE>package_.<span |
| class=GramE>createElementImport</span></span><span class=GramE>(</span><span |
| class=SpellE>primitiveType</span>);</pre><pre style='margin-left:9.0pt'><o:p> </o:p></pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span><span |
| class=GramE>out(</span>"Primitive type '" + <span class=SpellE>primitiveType.getQualifiedName</span>()</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>+ "' imported.");</pre><pre |
| style='margin-left:9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:2'> </span><span class=GramE>return</span> <span |
| class=SpellE>primitiveType</span>;</pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:1'> </span>}</pre> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Here |
| we load the model library <img border=0 width=24 height=14 id="_x0000_i1049" |
| src="../../../../images/tag_1.gif" align=CENTER><span |
| style='mso-spacerun:yes'> </span>containing the UML primitive types (<span |
| style='font-family:"Courier New"'>Boolean</span>, <span style='font-family: |
| "Courier New"'>Integer</span>, <span style='font-family:"Courier New"'>String</span>, |
| and <span class=SpellE><span style='font-family:"Courier New"'>UnlimitedNatural</span></span>) |
| using a utility method (described later) and a URI defined on the <span |
| class=SpellE><span style='font-family:"Courier New"'>UMLResource</span></span> |
| interface. Next, we retrieve the desired (owned) primitive type from the model |
| by name <img border=0 width=24 height=14 id="_x0000_i1050" |
| src="../../../../images/tag_2.gif" align=CENTER><span |
| style='mso-spacerun:yes'> </span>using one of the convenience methods defined |
| in the UML2 API. Finally, we invoke another convenience method <img border=0 |
| width=24 height=14 id="_x0000_i1051" src="../../../../images/tag_3.gif" |
| align=CENTER><span style='mso-spacerun:yes'> </span>to create the element |
| import relationship between the package and the element (with default public |
| visibility), notify the user, and return the primitive type.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img |
| border=0 width=62 height=13 id="_x0000_i1052" src="../../../../images/tip.gif"><span |
| style='mso-spacerun:yes'> </span>The UML resources plug-in (<span |
| style='font-family:"Courier New"'>org.eclipse.uml2.uml.resources</span>) |
| provides several model libraries (which by convention have a <code>.<span |
| class=SpellE>library.uml</span></code> file extension) that contain commonly |
| used primitive types, such as those defined by Java and <span class=SpellE>Ecore</span> |
| (in addition to those defined by UML itself). These libraries can be accessed |
| using <span class=SpellE>URIs</span> defined on the <span class=SpellE><span |
| style='font-family:"Courier New"'>UMLResource</span></span> interface, as shown |
| above.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img |
| border=0 width=63 height=14 id="_x0000_i1053" src="../../../../images/tip.gif"><span |
| style='mso-spacerun:yes'> </span>In UML2, a method of the form <code>get<feature |
| name<span class=GramE>>(</span>String)</code> exists for every feature that |
| can contain or reference named elements. In this case, the package has a |
| feature (<span class=SpellE><code>ownedType</code></span>) that can contain |
| types, so we pass the unqualified name of the type we are looking for to the <span |
| class=SpellE><span class=GramE><code>getOwnedType</code></span></span><span |
| class=GramE><code>(</code></span><code>String)</code> convenience method. |
| Behind the scenes, the package will iterate over all of its owned types and |
| return the first one that it finds that has the specified (unqualified) name.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>OK, |
| lets see this method in action. For example, we could import the primitive |
| type named Boolean into profile <span class=SpellE>ecore</span> as follows:</p> |
| |
| <pre style='margin-left:8.5pt'><span style='mso-tab-count:2'> </span><span |
| class=SpellE>PrimitiveType</span> <span class=SpellE>booleanPrimitiveType</span> = <span |
| class=SpellE><span class=GramE>importPrimitiveType</span></span><span |
| class=GramE>(</span><span class=SpellE>ecoreProfile</span>,</pre><pre |
| style='margin-left:8.5pt'><span style='mso-tab-count:3'> </span>"Boolean");</pre> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img |
| border=0 width=61 height=13 id="_x0000_i1054" src="../../../../images/tryit.gif"><span |
| style='mso-spacerun:yes'> </span>Write code to programmatically import the |
| other required primitive type (i.e. String) into the <span class=SpellE>Ecore</span> |
| profile.</p> |
| |
| <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Creating |
| Enumerations</h3> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>As |
| with packages, profiles can contain enumerations. An enumeration is a kind of |
| data type whose instances may be any of a number of user-defined enumeration |
| literals. To create an enumeration using the UML editor, follow these steps:</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>1) |
| Select a profile (i.e. <b style='mso-bidi-font-weight:normal'><<span |
| style='mso-bidi-font-weight:bold'>Profile> <span class=SpellE>ecore</span></span></b>) |
| in the UML editor.</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>2) |
| Right-click and select the <b>New Child > Packaged Element > Enumeration</b> |
| option from the context menu.</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>3) |
| Enter a value (i.e. <span class=SpellE>VisibilityKind</span>) for the <b>Name</b> |
| property in the <b>Properties</b> view.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img |
| border=0 width=61 height=13 id="_x0000_i1055" src="../../../../images/tryit.gif"><span |
| style='mso-spacerun:yes'> </span>Create the other enumeration (i.e. <span |
| class=SpellE>FeatureKind</span>) for the <span class=SpellE>Ecore</span> |
| profile using the UML editor.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>At |
| this point your workspace should look something like this:</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><!--[if gte vml 1]><v:shape |
| id="_x0000_i1132" type="#_x0000_t75" style='width:624pt;height:405.75pt'> |
| <v:imagedata src="article_files/image009.png" o:title=""/> |
| </v:shape><![endif]--><![if !vml]><img border=0 width=832 height=541 |
| src="article_files/image010.jpg" v:shapes="_x0000_i1132"><![endif]></p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Lets |
| look at how to perform the same task using Java code. The code snippet below |
| (from the <span style='font-family:"Courier New"'>GettingStartedWithUML2</span> |
| class) shows a method that programmatically creates and returns an enumeration |
| with a specified name in a specified package.</p> |
| |
| <pre style='margin-left:9.0pt'><span style='mso-tab-count:1'> </span><span |
| class=GramE>protected</span> static Enumeration <span class=SpellE>createEnumeration</span>(</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>org.eclipse.uml2.uml.Package package_, String name) {</pre><pre |
| style='margin-left:9.0pt'><img border=0 width=24 height=13 id="_x0000_i1056" |
| src="../../../../images/tag_1.gif" align=CENTER><span style='mso-tab-count: |
| 2'> </span>Enumeration <span class=SpellE>enumeration</span> = (Enumeration) package_</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>.<span |
| class=SpellE><span class=GramE>createOwnedEnumeraton</span></span><span |
| class=GramE>(</span>name);</pre><pre style='margin-left:9.0pt'><o:p> </o:p></pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span><span |
| class=GramE>out(</span>"Enumeration '" + <span class=SpellE>enumeration.getQualifiedName</span>() + "' created.");</pre><pre |
| style='margin-left:9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:2'> </span><span class=GramE>return</span> enumeration;</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:1'> </span>}</pre> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Here |
| we call the <span class=SpellE><span class=GramE><code>createOwnedEnumeration</code></span></span><span |
| class=GramE><code>(</code></span><code>String)</code> convenience factory |
| method <img border=0 width=24 height=13 id="_x0000_i1057" |
| src="../../../../images/tag_1.gif" align=CENTER><span |
| style='mso-spacerun:yes'> </span>to ask the package to create a primitive type with |
| the specified name as one of its packaged elements.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>OK, |
| lets see this method in action. For example, we could create an enumeration |
| named <span class=SpellE>VisibilityKind</span> in profile <span |
| class=SpellE>ecore</span> as follows:</p> |
| |
| <pre style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span>Enumeration <span |
| class=SpellE>visibilityKindEnumeration</span> = GettingStartedWithUML2</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>.<span |
| class=SpellE><span class=GramE>createEnumeration</span></span><span |
| class=GramE>(</span><span class=SpellE>ecoreProfile</span>, "<span |
| class=SpellE>VisibilityKind</span>");</pre> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img |
| border=0 width=61 height=13 id="_x0000_i1058" src="../../../../images/tryit.gif"><span |
| style='mso-spacerun:yes'> </span>Write code to programmatically create the |
| other enumeration (i.e. <span class=SpellE>FeatureKind</span>) for the <span |
| class=SpellE>Ecore</span> profile.</p> |
| |
| <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Creating |
| Enumeration Literals</h3> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>An |
| enumeration literal is a user-defined data value for an enumeration. To create |
| an enumeration literal using the UML editor, follow these steps:</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>1) |
| Select an enumeration (i.e. <b style='mso-bidi-font-weight:normal'><<span |
| style='mso-bidi-font-weight:bold'>Enumeration> <span class=SpellE>VisibilityKind</span></span></b>) |
| in the UML editor.</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>2) |
| Right-click and select the <b>New Child > Owned Literal > Enumeration |
| Literal</b> option from the context menu.</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>3) |
| Enter a value (i.e. Unspecified) for the <b>Name</b> property in the <b>Properties</b> |
| view.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img |
| border=0 width=61 height=13 id="_x0000_i1059" src="../../../../images/tryit.gif"><span |
| style='mso-spacerun:yes'> </span>Create the remaining enumeration literals for |
| the <span class=SpellE>Ecore</span> profile (i.e. None, <span class=SpellE>ReadOnly</span>, |
| <span class=SpellE>ReadWrite</span>, <span class=SpellE>ReadOnlyUnsettable</span>, |
| and <span class=SpellE>ReadWriteUnsettable</span> for <b style='mso-bidi-font-weight: |
| normal'><<span style='mso-bidi-font-weight:bold'>Enumeration> <span |
| class=SpellE>VisibilityKind</span></span></b>; Unspecified, Simple, |
| Attribute, Element, <span class=SpellE>AttributeWildcard</span>, <span |
| class=SpellE>ElementWildcard</span>, and Group for <b style='mso-bidi-font-weight: |
| normal'><<span style='mso-bidi-font-weight:bold'>Enumeration <span |
| class=SpellE>FeatureKind</span>></span></b>) using the UML editor.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>At |
| this point your workspace should look something like this:</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><!--[if gte vml 1]><v:shape |
| id="_x0000_i1133" type="#_x0000_t75" style='width:696pt;height:607.5pt'> |
| <v:imagedata src="article_files/image011.png" o:title=""/> |
| </v:shape><![endif]--><![if !vml]><img border=0 width=928 height=810 |
| src="article_files/image012.jpg" v:shapes="_x0000_i1133"><![endif]></p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Lets |
| look at how to perform the same task using Java code. The code snippet below |
| (from the <span style='font-family:"Courier New"'>GettingStartedWithUML2</span> |
| class) shows a method that programmatically creates and returns an enumeration |
| literal with a specified name in a specified enumeration.</p> |
| |
| <pre style='margin-left:9.0pt'><span style='mso-tab-count:1'> </span><span |
| class=GramE>protected</span> static <span class=SpellE>EnumerationLiteral</span> <span |
| class=SpellE>createEnumerationLiteral</span>(</pre><pre style='margin-left: |
| 9.0pt'><span style='mso-tab-count:3'> </span>Enumeration <span |
| class=SpellE>enumeration</span>, String name) {</pre><pre style='margin-left: |
| 9.0pt'><img border=0 width=24 height=13 id="_x0000_i1060" |
| src="../../../../images/tag_1.gif" align=CENTER><span style='mso-tab-count: |
| 2'> </span><span class=SpellE>EnumerationLiteral</span> <span |
| class=SpellE>enumerationLiteral</span> = enumeration</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>.<span |
| class=SpellE><span class=GramE>createOwnedLiteral</span></span><span |
| class=GramE>(</span>name);</pre><pre style='margin-left:9.0pt'><o:p> </o:p></pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span><span |
| class=GramE>out(</span>"Enumeration literal '" + <span class=SpellE>enumerationLiteral.getQualifiedName</span>()</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>+ "' created.");</pre><pre |
| style='margin-left:9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:2'> </span><span class=GramE>return</span> <span |
| class=SpellE>enumerationLiteral</span>;</pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:1'> </span>}</pre> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Here |
| we call the <span class=SpellE><span class=GramE><code>createOwnedLiteral</code></span></span><span |
| class=GramE><code>(</code></span><code>String)</code> convenience factory |
| method <img border=0 width=24 height=13 id="_x0000_i1061" |
| src="../../../../images/tag_1.gif" align=CENTER><span |
| style='mso-spacerun:yes'> </span>to ask the enumeration to create an |
| enumeration literal with the specified name as one of its owned literals.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>OK, |
| lets see this method in action. For example, we could create an enumeration |
| literal named Unspecified in enumeration <span class=SpellE>VisibilityKind</span> |
| as follows:</p> |
| |
| <pre style='margin-left:8.5pt'><span style='mso-tab-count:2'> </span><span |
| class=GramE>GettingStartedWithUML2.createEnumerationLiteral(</span></pre><pre |
| style='margin-left:8.5pt'><span style='mso-tab-count:3'> </span><span |
| class=SpellE><span class=GramE>visibilityKindEnumeration</span></span>, "Unspecified");<span |
| style='mso-tab-count:2'> </span></pre> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img |
| border=0 width=61 height=13 id="_x0000_i1062" src="../../../../images/tryit.gif"><span |
| style='mso-spacerun:yes'> </span>Write code to programmatically create the |
| remaining enumeration literals (i.e. None, <span class=SpellE>ReadOnly</span>, |
| <span class=SpellE>ReadWrite</span>, <span class=SpellE>ReadOnlyUnsettable</span>, |
| and <span class=SpellE>ReadWriteUnsettable</span> in enumeration <span |
| class=SpellE>VisibilityKind</span>; Unspecified, Simple, Attribute, |
| Element, <span class=SpellE>AttributeWildcard</span>, <span class=SpellE>ElementWildcard</span>, |
| and Group in enumeration <span class=SpellE>FeatureKind</span>) for the <span |
| class=SpellE>Ecore</span> profile.</p> |
| |
| <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Creating |
| Stereotypes</h3> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>A |
| stereotype defines how an existing <span class=SpellE>metaclass</span> may be |
| extended, and enables the use of platform- or domain-specific terminology or |
| notation in place of, or in addition to, the ones used for the extended <span |
| class=SpellE>metaclass</span>. Each stereotype may extend one or more classes |
| through extensions as part of a profile. To create a stereotype using the UML |
| editor, follow these steps:</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>1) |
| Select a profile (i.e. <b style='mso-bidi-font-weight:normal'><<span |
| style='mso-bidi-font-weight:bold'>Profile> <span class=SpellE>ecore</span></span></b>) |
| in the UML editor.</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>2) |
| Right-click and select the <b>New Child > Packaged Element > Stereotype</b> |
| option from the context menu.</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>3) |
| Enter a value (i.e. <span class=SpellE>EStructuralFeature</span>) for the <b>Name</b> |
| property in the <b>Properties</b> view.</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>4) |
| <span class=GramE>Select</span> a value (i.e. <b style='mso-bidi-font-weight: |
| normal'>true</b>) for the <b style='mso-bidi-font-weight:normal'>Is Abstract</b> |
| property in the <b style='mso-bidi-font-weight:normal'>Properties</b> view.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img |
| border=0 width=61 height=13 id="_x0000_i1063" src="../../../../images/tryit.gif"><span |
| style='mso-spacerun:yes'> </span>Create the remaining stereotypes for the <span |
| class=SpellE>Ecore</span> profile (i.e. <span class=SpellE>EAttribute</span> |
| and <span class=SpellE>EReference</span>) using the UML editor.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>At |
| this point your workspace should look something like this:</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><!--[if gte vml 1]><v:shape |
| id="_x0000_i1134" type="#_x0000_t75" style='width:696pt;height:607.5pt'> |
| <v:imagedata src="article_files/image013.png" o:title=""/> |
| </v:shape><![endif]--><![if !vml]><img border=0 width=928 height=810 |
| src="article_files/image014.jpg" v:shapes="_x0000_i1134"><![endif]></p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Lets |
| look at how to perform the same task using Java code. The code snippet below |
| shows a method that programmatically creates and returns <span class=GramE>a(</span>n) |
| (abstract) stereotype with a specified name in a specified profile.</p> |
| |
| <pre style='margin-left:9.0pt'><span style='mso-tab-count:1'> </span><span |
| class=GramE>protected</span> static Stereotype <span class=SpellE>createStereotype</span>(Profile <span |
| class=SpellE>profile</span>, String name,</pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:3'> </span><span class=SpellE><span |
| class=GramE>boolean</span></span> <span class=SpellE>isAbstract</span>) {</pre><pre |
| style='margin-left:9.0pt'><img border=0 width=24 height=14 id="_x0000_i1064" |
| src="../../../../images/tag_1.gif" align=CENTER><span style='mso-tab-count: |
| 2'> </span>Stereotype <span class=SpellE>stereotype</span> = <span |
| class=SpellE><span class=GramE>profile.createOwnedStereotype</span></span><span |
| class=GramE>(</span>name, <span class=SpellE>isAbstract</span>);</pre><pre |
| style='margin-left:9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:2'> </span><span class=GramE>out(</span>"Stereotype '" + <span |
| class=SpellE>stereotype.getQualifiedName</span>() + "' created.");</pre><pre |
| style='margin-left:9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:2'> </span><span class=GramE>return</span> stereotype;</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:1'> </span>}</pre> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Here |
| we call the <span class=SpellE><span class=GramE><code>createOwnedStereotype</code></span></span><span |
| class=GramE><code>(</code></span><code>String, <span class=SpellE>boolean</span>)</code> |
| convenience factory method <img border=0 width=24 height=13 id="_x0000_i1065" |
| src="../../../../images/tag_1.gif" align=CENTER><span |
| style='mso-spacerun:yes'> </span>to ask the profile to create a stereotype with |
| the specified name as one of its owned members, and set the <span class=SpellE><code>isAbstract</code></span> |
| attribute of the stereotype based on the specified <span class=SpellE><code>boolean</code></span> |
| argument.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>OK, |
| lets see this method in action. For example, we could create an abstract |
| stereotype named <span class=SpellE>EStructuralFeature</span> in profile <span |
| class=SpellE>ecore</span> as follows:</p> |
| |
| <pre style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span>Stereotype <span |
| class=SpellE>eStructuralFeatureStereotype</span> = <span class=SpellE><span |
| class=GramE>createStereotype</span></span><span class=GramE>(</span></pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span><span |
| class=SpellE><span class=GramE>ecoreProfile</span></span>, "<span |
| class=SpellE>EStructuralFeature</span>", true);</pre> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img |
| border=0 width=61 height=13 id="_x0000_i1066" src="../../../../images/tryit.gif"><span |
| style='mso-spacerun:yes'> </span>Write code to programmatically create the |
| remaining (non-abstract) stereotypes (i.e. <span class=SpellE>EAttribute</span> |
| and <span class=SpellE>EReference</span>) for the <span class=SpellE>Ecore</span> |
| profile.</p> |
| |
| <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Creating |
| Stereotype Generalizations</h3> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Just |
| like classes, stereotypes may be involved in generalizations. A generalization |
| is a taxonomic relationship between a specific classifier and a more general |
| classifier whereby each instance of the specific classifier is also an indirect |
| instance of, and inherits the features of, the general classifier. To create a |
| stereotype generalization using the UML editor, follow these steps:</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>1) |
| Select a stereotype (i.e. <b style='mso-bidi-font-weight:normal'><<span |
| style='mso-bidi-font-weight:bold'>Stereotype> <span class=SpellE>EAttribute</span></span></b>) |
| in the UML editor.</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>2) |
| Right-click and select the <b>New Child > Generalization > Generalization</b> |
| option from the context menu.</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>3) |
| Select a value (i.e. <span class=SpellE><b>ecore::EStructuralFeature</b></span>) |
| for the <b>General</b> property in the <b>Properties</b> view.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img |
| border=0 width=61 height=13 id="_x0000_i1067" src="../../../../images/tryit.gif"><span |
| style='mso-spacerun:yes'> </span>Create the other generalization (i.e. between <span |
| class=SpellE><b style='mso-bidi-font-weight:normal'>EReference</b></span> and <span |
| class=SpellE><b style='mso-bidi-font-weight:normal'>EStructuralFeature</b></span>) |
| for the <span class=SpellE>Ecore</span> profile using the UML editor.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img |
| border=0 width=62 height=13 id="_x0000_i1068" src="../../../../images/tip.gif"><span |
| style='mso-spacerun:yes'> </span>Be sure to pick the stereotype (the first <span |
| class=SpellE><b style='mso-bidi-font-weight:normal'>ecore::EStructuralFeature</b></span> |
| item) and not the class (it should show up in <b style='mso-bidi-font-weight: |
| normal'>Properties</b> view as <b style='mso-bidi-font-weight:normal'><Stereotype> |
| <span class=SpellE>EStructuralFeature</span></b>, not <b style='mso-bidi-font-weight: |
| normal'><Class> <span class=SpellE>EStructuralFeature</span></b>), which |
| comes from the <span class=SpellE>Ecore</span> <span class=SpellE>metamodel</span>.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>At |
| this point your workspace should look something like this:</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><!--[if gte vml 1]><v:shape |
| id="_x0000_i1135" type="#_x0000_t75" style='width:696pt;height:607.5pt'> |
| <v:imagedata src="article_files/image015.png" o:title=""/> |
| </v:shape><![endif]--><![if !vml]><img border=0 width=928 height=810 |
| src="article_files/image016.jpg" v:shapes="_x0000_i1135"><![endif]></p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Lets |
| look at how to perform the same task using Java code. The code snippet below |
| (from the <span style='font-family:"Courier New"'>GettingStartedWithUML2</span> |
| class) shows a method that programmatically creates and returns generalization |
| between specified specific and general classifiers.</p> |
| |
| <pre style='margin-left:9.0pt'><span style='mso-tab-count:1'> </span><span |
| class=GramE>protected</span> static Generalization <span class=SpellE>createGeneralization</span>(</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>Classifier <span |
| class=SpellE>specificClassifier</span>, Classifier <span class=SpellE>generalClassifier</span>) {</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span>Generalization <span |
| class=SpellE>generalization</span> = <span class=SpellE>specificClassifier</span></pre><pre |
| style='margin-left:9.0pt'><img border=0 width=24 height=13 id="_x0000_i1069" |
| src="../../../../images/tag_1.gif" align=CENTER><span style='mso-tab-count: |
| 3'> </span>.<span class=SpellE><span class=GramE>createGeneralization</span></span><span |
| class=GramE>(</span><span class=SpellE>generalClassifier</span>);</pre><pre |
| style='margin-left:9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:2'> </span><span class=GramE>out(</span>"Generalization " + <span |
| class=SpellE>specificClassifier.getQualifiedName</span>() + " ->> "</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>+ <span |
| class=SpellE><span class=GramE>generalClassifier.getQualifiedName</span></span><span |
| class=GramE>(</span>) + " created.");</pre><pre style='margin-left: |
| 9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:2'> </span><span class=GramE>return</span> generalization;</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:1'> </span>}</pre> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Here |
| we call a convenience factory method on the specific classifier that creates a |
| generalization <img border=0 width=24 height=13 id="_x0000_i1070" |
| src="../../../../images/tag_1.gif" align=CENTER><span |
| style='mso-spacerun:yes'> </span>as one of its children and sets the general |
| classifier to the specified argument.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>OK, |
| lets see this method in action. For example, we could create a generalization |
| between specific stereotype <span class=SpellE>EAttribute</span> and general |
| stereotype <span class=SpellE>EStructuralFeature</span> as follows:</p> |
| |
| <pre style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span><span |
| class=GramE>GettingStartedWithUML2.createGeneralization(</span><span |
| class=SpellE>eAttributeStereotype</span>,</pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:3'> </span><span class=SpellE><span |
| class=GramE>eStructuralFeatureStereotype</span></span>);</pre> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img |
| border=0 width=61 height=13 id="_x0000_i1071" src="../../../../images/tryit.gif"><span |
| style='mso-spacerun:yes'> </span>Write code to programmatically create the |
| other generalization (i.e. between <span class=SpellE>EReference</span> and <span |
| class=SpellE>EStructuralFeature</span>) for the <span class=SpellE>Ecore</span> |
| profile.</p> |
| |
| <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Creating |
| Stereotype Properties</h3> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Again |
| just like classes, stereotypes may have properties (attributes). When a |
| stereotype is applied to a model element, the values of the properties may be |
| referred to as tagged values. To create a stereotype property using the UML |
| editor, follow these steps:</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>1) |
| Select a stereotype (i.e. <b style='mso-bidi-font-weight:normal'><<span |
| style='mso-bidi-font-weight:bold'>Stereotype> <span class=SpellE>EStructuralFeature</span></span></b>) |
| in the UML editor.</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>2) |
| Right-click and select the <b>New Child > Owned Attribute > Property</b> |
| option from the context menu.</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>3) |
| Enter a value (i.e. "<span class=SpellE>isTransient</span>) for the <b>Name</b> |
| property in the <b>Properties</b> view.</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>4) |
| Select a value (i.e. <span class=SpellE><b>UMLPrimitiveTypes::Boolean</b></span>) |
| for the <b>Type</b> property in the <b>Properties</b> view.</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>5) |
| Enter a value (i.e. 0) for the <b>Lower</b> property in the <b>Properties</b> |
| view.</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>6) |
| Select the property (i.e. <b style='mso-bidi-font-weight:normal'><<span |
| style='mso-bidi-font-weight:bold'>Property> <span class=SpellE>isTransient</span></span></b>) |
| in the UML editor.</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>7) |
| Right-click and select the <b style='mso-bidi-font-weight:normal'>New Child |
| > Default Value Literal Boolean</b> option from the context menu.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img |
| border=0 width=62 height=13 id="_x0000_i1072" src="../../../../images/tip.gif"><span |
| style='mso-spacerun:yes'> </span>Default values for properties (and parameters) |
| are represented as value specifications (first-class objects) in UML 2.0. Here |
| we have selected a literal Boolean (whose default value is <span |
| style='font-family:"Courier New"'>false</span>) as the default value of our |
| property since its type is <b style='mso-bidi-font-weight:normal'>Boolean</b>. |
| If the type of the property were <b style='mso-bidi-font-weight:normal'>String</b>, |
| wed have used a literal string instead. Once a default value specification has |
| been created, its value can alternatively be set with the owning property |
| selected via the <b style='mso-bidi-font-weight:normal'>Default</b> property in |
| the <b style='mso-bidi-font-weight:normal'>Properties</b> view.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img |
| border=0 width=61 height=13 id="_x0000_i1073" src="../../../../images/tryit.gif"><span |
| style='mso-spacerun:yes'> </span>Create the remaining stereotype properties for |
| the <span class=SpellE>Ecore</span> profile (i.e. <span class=SpellE>isUnsettable</span>, |
| <span class=SpellE>isVolatile</span>, visibility, <span class=SpellE>xmlName</span>, |
| <span class=SpellE>xmlNamespace</span>, and <span class=SpellE>xmlFeatureKind</span> |
| for <b style='mso-bidi-font-weight:normal'><Stereotype> <span |
| class=SpellE>EStructuralFeature</span></b>; <span class=SpellE>attributeName</span> |
| and <span class=SpellE>isID</span> for <b style='mso-bidi-font-weight:normal'><Stereotype> |
| <span class=SpellE>EAttribute</span></b>; <span class=SpellE>referenceName</span> |
| and <span class=SpellE>isResolveProxies</span> for <b style='mso-bidi-font-weight: |
| normal'><Stereotype> <span class=SpellE>EReference</span></b>) using the |
| UML editor.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img |
| border=0 width=62 height=13 id="_x0000_i1074" src="../../../../images/tip.gif"><span |
| style='mso-spacerun:yes'> </span>Be sure to set the appropriate default value |
| for each stereotype property so that it is consistent with the corresponding <span |
| class=SpellE>Ecore</span> property for Rose. In particular, the default value |
| for the <span class=SpellE>isResolveProxies</span> should be a literal |
| Boolean with a value of <b style='mso-bidi-font-weight:normal'>true</b> instead |
| of the default (!) default value of <b style='mso-bidi-font-weight:normal'>false</b>. |
| Note also that the types of the visibility and <span class=SpellE>xmlFeatureKind</span> |
| properties should be the enumerations we created earlier (i.e. <span |
| class=SpellE><b style='mso-bidi-font-weight:normal'>ecore::<span |
| style='mso-bidi-font-weight:bold'>Visibility</span></b></span> and <span |
| class=SpellE><b style='mso-bidi-font-weight:normal'>ecore::<span |
| style='mso-bidi-font-weight:bold'>FeatureKind</span></b></span>, respectively).</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>At |
| this point your workspace should look something like this:</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><!--[if gte vml 1]><v:shape |
| id="_x0000_i1136" type="#_x0000_t75" style='width:696pt;height:607.5pt'> |
| <v:imagedata src="article_files/image017.png" o:title=""/> |
| </v:shape><![endif]--><![if !vml]><img border=0 width=928 height=810 |
| src="article_files/image018.jpg" v:shapes="_x0000_i1136"><![endif]></p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Lets |
| look at how to perform the same task using Java code. The code snippet below |
| (from the <span style='font-family:"Courier New"'>GettingStartedWithUML2</span> |
| class) shows a method that programmatically creates and returns an attribute with |
| a specified upper bound, lower bound, type, and name in a specified class.</p> |
| |
| <pre style='margin-left:9.0pt'><span style='mso-tab-count:1'> </span><span |
| class=GramE>protected</span> static Property <span class=SpellE>createAttribute</span>(org.eclipse.uml2.uml.Class class_,</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>String name, Type <span |
| class=SpellE>type</span>, <span class=SpellE>int</span> <span class=SpellE>lowerBound</span>, <span |
| class=SpellE>int</span> <span class=SpellE>upperBound</span>) {</pre><pre |
| style='margin-left:9.0pt'><img border=0 width=24 height=13 id="_x0000_i1075" |
| src="../../../../images/tag_1.gif" align=CENTER><span style='mso-tab-count: |
| 2'> </span>Property attribute = <span class=SpellE>class_.<span |
| class=GramE>createOwnedAttribute</span></span><span class=GramE>(</span>name, type,</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span><span |
| class=SpellE><span class=GramE>lowerBound</span></span>, <span class=SpellE>upperBound</span>);</pre><pre |
| style='margin-left:9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:2'> </span><span class=SpellE>StringBuffer</span> <span |
| class=SpellE>sb</span> = new <span class=SpellE><span class=GramE>StringBuffer</span></span><span |
| class=GramE>(</span>);</pre><pre style='margin-left:9.0pt'><o:p> </o:p></pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span><span |
| class=SpellE><span class=GramE>sb.append</span></span><span class=GramE>(</span>"Attribute '");</pre><pre |
| style='margin-left:9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:2'> </span><span class=SpellE><span |
| class=GramE>sb.append</span></span><span class=GramE>(</span><span |
| class=SpellE>attribute.getQualifiedName</span>());</pre><pre style='margin-left: |
| 9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:2'> </span><span class=SpellE><span |
| class=GramE>sb.append</span></span><span class=GramE>(</span>"' : ");</pre><pre |
| style='margin-left:9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:2'> </span><span class=SpellE><span |
| class=GramE>sb.append</span></span><span class=GramE>(</span><span |
| class=SpellE>type.getQualifiedName</span>());</pre><pre style='margin-left: |
| 9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:2'> </span><span class=SpellE><span |
| class=GramE>sb.append</span></span><span class=GramE>(</span>" [");</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span><span |
| class=SpellE><span class=GramE>sb.append</span></span><span class=GramE>(</span><span |
| class=SpellE>lowerBound</span>);</pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:2'> </span><span class=SpellE><span |
| class=GramE>sb.append</span></span><span class=GramE>(</span>"..");</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span><span |
| class=SpellE><span class=GramE>sb.append</span></span><span class=GramE>(</span><span |
| class=SpellE>LiteralUnlimitedNatural.UNLIMITED</span> == <span class=SpellE>upperBound</span></pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>? "*"</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>: <span |
| class=SpellE><span class=GramE>String.valueOf</span></span><span class=GramE>(</span><span |
| class=SpellE>upperBound</span>));</pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:2'> </span><span class=SpellE><span |
| class=GramE>sb.append</span></span><span class=GramE>(</span>"]");</pre><pre |
| style='margin-left:9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:2'> </span><span class=SpellE><span |
| class=GramE>sb.append</span></span><span class=GramE>(</span>" created.");</pre><pre |
| style='margin-left:9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:2'> </span><span class=GramE>out(</span><span |
| class=SpellE>sb.toString</span>());</pre><pre style='margin-left:9.0pt'><o:p> </o:p></pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span><span |
| class=GramE>return</span> attribute;</pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:1'> </span>}</pre> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Here |
| we call the <span class=SpellE><code>createOwnedAttribute</code></span><code>(String, |
| Type, <span class=SpellE>int</span>, <span class=SpellE>int</span>)</code> |
| convenience factory method <img border=0 width=24 height=13 id="_x0000_i1076" |
| src="../../../../images/tag_1.gif" align=CENTER><span |
| style='mso-spacerun:yes'> </span>to ask the class to create a property as one |
| of its owned attributes, set the type of the attribute to the specified type, |
| and set the lower and upper bounds of the attribute (the factory method creates |
| a literal integer and literal unlimited natural, respectively, and sets its |
| value to the specified integer value).</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img |
| border=0 width=62 height=13 id="_x0000_i1077" src="../../../../images/tip.gif"><span |
| style='mso-spacerun:yes'> </span>The <span class=SpellE><code>LiteralUnlimitedNatural.UNLIMITED</code></span> |
| constant represents the unlimited value for upper bounds (-1), as it does in |
| EMF.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>OK, |
| lets see this method in action. For example, we could create an attribute with |
| multiplicity 0<span class=GramE>..1</span> of type <span class=SpellE>UMLPrimitiveTypes::Boolean</span> |
| named <span class=SpellE>isTransient</span> in stereotype <span |
| class=SpellE>EStructuralFeature</span> as follows:</p> |
| |
| <pre style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span>Property <span |
| class=SpellE>isTransientProperty</span> = <span class=GramE>GettingStartedWithUML2.createAttribute(</span></pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span><span |
| class=SpellE><span class=GramE>eStructuralFeatureStereotype</span></span>, "<span |
| class=SpellE>isTransient</span>", <span class=SpellE>booleanPrimitiveType</span>,</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>0, 1);</pre> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img |
| border=0 width=61 height=13 id="_x0000_i1078" src="../../../../images/tryit.gif"><span |
| style='mso-spacerun:yes'> </span>Write code to programmatically create the |
| remaining stereotype properties (i.e. <span class=SpellE>isUnsettable</span>, |
| <span class=SpellE>isVolatile</span>, visibility, <span class=SpellE>xmlName</span>, |
| <span class=SpellE>xmlNamespace</span>, and <span class=SpellE>xmlFeatureKind</span> |
| in stereotype <span class=SpellE>EStructuralFeature</span>; <span |
| class=SpellE>attributeName</span> and <span class=SpellE>isID</span> in |
| stereotype <span class=SpellE>EAttribute</span>; <span class=SpellE>referenceName</span> |
| and <span class=SpellE>isResolveProxies</span> in stereotype <span |
| class=SpellE>EReference</span>) for the <span class=SpellE>Ecore</span> |
| profile.</p> |
| |
| <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Referencing |
| <span class=SpellE>Metaclasses</span></h3> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>A |
| profile is a restricted form of a <span class=SpellE>metamodel</span> that must |
| always be related to a reference <span class=SpellE>metamodel</span> (i.e. |
| UML). A profile cannot be used without its reference <span class=SpellE>metamodel</span>; |
| it defines a limited capability to extend <span class=SpellE>metaclasses</span> |
| of the reference <span class=SpellE>metamodel</span> via stereotypes. Profiles |
| can be made to reference <span class=SpellE>metaclasses</span> from <span |
| class=SpellE>metamodels</span> by creating an import relationship between the |
| profile and the reference <span class=SpellE>metaclass</span>. To reference a <span |
| class=SpellE>metaclass</span> using the UML editor, follow these steps:</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>1) |
| Select a profile (i.e. <b style='mso-bidi-font-weight:normal'><<span |
| style='mso-bidi-font-weight:bold'>Profile> <span class=SpellE>ecore</span></span></b>) |
| in the UML editor.</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>2) |
| Select the <b style='mso-bidi-font-weight:normal'>UML Editor > Profile > |
| Reference <span class=SpellE>Metaclass</span>
</b> menu item.</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>3) |
| Choose a <span class=SpellE>metaclass</span> (i.e. <span class=SpellE><b |
| style='mso-bidi-font-weight:normal'>uml::Property</b></span>)<span class=GramE>,</span> |
| press the <b style='mso-bidi-font-weight:normal'>Add</b> button, then press the |
| <b style='mso-bidi-font-weight:normal'>OK</b> button.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>At |
| this point your workspace should look something like this:</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><!--[if gte vml 1]><v:shape |
| id="_x0000_i1137" type="#_x0000_t75" style='width:696pt;height:607.5pt'> |
| <v:imagedata src="article_files/image019.png" o:title=""/> |
| </v:shape><![endif]--><![if !vml]><img border=0 width=928 height=810 |
| src="article_files/image020.jpg" v:shapes="_x0000_i1137"><![endif]></p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Lets |
| look at how to perform the same task using Java code. The code snippet below |
| shows a method that programmatically references the <span class=SpellE>metaclass</span> |
| with a specified name in the UML <span class=SpellE>metamodel</span> from a specified |
| profile and returns it.</p> |
| |
| <pre style='margin-left:9.0pt'><span style='mso-tab-count:1'> </span><span |
| class=GramE>protected</span> static org.eclipse.uml2.uml.Class <span |
| class=SpellE>referenceMetaclass</span>(Profile <span class=SpellE>profile</span>,</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span><span |
| lang=IT style='mso-ansi-language:IT'>String name) {<o:p></o:p></span></pre><pre |
| style='margin-left:9.0pt'><img border=0 width=24 height=13 id="_x0000_i1079" |
| src="../../../../images/tag_1.gif" align=CENTER><span lang=IT style='mso-ansi-language: |
| IT'><span style='mso-tab-count:2'> </span>Model umlMetamodel = (Model) load(URI<o:p></o:p></span></pre><pre |
| style='margin-left:9.0pt'><span lang=IT style='mso-ansi-language:IT'><span |
| style='mso-tab-count:3'> </span>.createURI(UML2Resource.UML2_METAMODEL_URI));<o:p></o:p></span></pre><pre |
| style='margin-left:9.0pt'><span lang=IT style='mso-ansi-language:IT'><o:p> </o:p></span></pre><pre |
| style='margin-left:9.0pt'><img border=0 width=24 height=13 id="_x0000_i1080" |
| src="../../../../images/tag_2.gif" align=CENTER><span lang=IT style='mso-ansi-language: |
| IT'><span style='mso-tab-count:2'> </span>org.eclipse.uml2.Class metaclass = (org.eclipse.uml2.uml.Class) umlMetamodel<o:p></o:p></span></pre><pre |
| style='margin-left:9.0pt'><span lang=IT style='mso-ansi-language:IT'><span |
| style='mso-tab-count:3'> </span></span>.<span class=SpellE><span |
| class=GramE>getOwnedType</span></span><span class=GramE>(</span>name);</pre><pre |
| style='margin-left:9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><img |
| border=0 width=24 height=13 id="_x0000_i1081" src="../../../../images/tag_3.gif" |
| align=CENTER><span style='mso-tab-count:2'> </span><span class=SpellE><span |
| class=GramE>profile.createMetaclassReference</span></span><span class=GramE>(</span><span |
| class=SpellE>metaclass</span>);</pre><pre style='margin-left:9.0pt'><o:p> </o:p></pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span><span |
| class=GramE>out(</span>"<span class=SpellE>Metaclass</span> '" + <span |
| class=SpellE>metaclass.getQualifiedName</span>() + "' referenced.");</pre><pre |
| style='margin-left:9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:2'> </span><span class=GramE>return</span> <span |
| class=SpellE>metaclass</span>;</pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:1'> </span>}</pre> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Here |
| we load the <span class=SpellE>metamodel</span> <img border=0 width=24 |
| height=14 id="_x0000_i1082" src="../../../../images/tag_1.gif" align=CENTER><span |
| style='mso-spacerun:yes'> </span>containing the UML <span class=SpellE>metaclasses</span> |
| using a utility method (described later) and a URI defined on the <span |
| class=SpellE><span style='font-family:"Courier New"'>UMLResource</span></span> |
| interface. Next, we retrieve the desired (owned) <span class=SpellE>metaclass</span> |
| from the (meta<span class=GramE>)model</span> by name <img border=0 width=24 |
| height=14 id="_x0000_i1083" src="../../../../images/tag_2.gif" align=CENTER><span |
| style='mso-spacerun:yes'> </span>using the convenience method. Finally, we |
| invoke another convenience method <img border=0 width=24 height=14 |
| id="_x0000_i1084" src="../../../../images/tag_3.gif" align=CENTER><span |
| style='mso-spacerun:yes'> </span>to create the element import relationship |
| between the profile and the <span class=SpellE>metaclass</span>, notify the |
| user, and return the <span class=SpellE>metaclass</span>.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img |
| border=0 width=62 height=13 id="_x0000_i1085" src="../../../../images/tip.gif"><span |
| style='mso-spacerun:yes'> </span>The UML resources plug-in (<span |
| style='font-family:"Courier New"'>org.eclipse.uml2.uml.resources</span>) |
| provides two <span class=SpellE>metamodels</span> (which by convention have a <code>.<span |
| class=SpellE>metamodel.uml</span></code> file extension), UML2 and <span |
| class=SpellE>Ecore</span>. These <span class=SpellE>metamodels</span> can be |
| accessed using <span class=SpellE>URIs</span> defined on the <span |
| class=SpellE><span style='font-family:"Courier New"'>UMLResource</span></span> |
| interface, as shown above.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>OK, |
| lets see this method in action. For example, we could reference the <span |
| class=SpellE>metaclass</span> named Property from profile <span |
| class=SpellE>ecore</span> as follows:</p> |
| |
| <pre style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span><span |
| class=GramE>org.eclipse.uml2.uml.Class</span> <span class=SpellE>propertyMetaclass</span> = <span |
| class=SpellE>referenceMetaclass</span>(</pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:3'> </span><span class=SpellE><span |
| class=GramE>ecoreProfile</span></span>, <span class=SpellE>UMLPackage.Literals.PROPERTY.getName</span>());</pre> |
| |
| <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Creating |
| Extensions</h3> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Extensions |
| are used to indicate that the properties of <span class=SpellE>metaclasses</span> |
| are extended through stereotypes, and give the ability to flexibly apply (and later |
| <span class=SpellE>unapply</span>) stereotypes to elements. An extension is a |
| kind of association, one end of which is an ordinary property, and the other is |
| an extension end. An extension may be required (depending on the lower bound of |
| the extension end), which indicates that an instance of the extending |
| stereotype must be created whenever an instance of the extended <span |
| class=SpellE>metaclass</span> is created. To create an extension using the UML |
| editor, follow these steps:</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>1) |
| Select a stereotype (i.e. <b style='mso-bidi-font-weight:normal'><<span |
| style='mso-bidi-font-weight:bold'>Stereotype> <span class=SpellE>EAttribute</span></span></b>) |
| in the UML editor.</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>2) |
| Select the <b style='mso-bidi-font-weight:normal'>UML Editor > Stereotype |
| > Create Extension
</b> menu item.</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>3) |
| Choose a <span class=SpellE>metaclass</span> (i.e. <span class=SpellE><b>uml::</b><b |
| style='mso-bidi-font-weight:normal'>Property</b></span>)<span class=GramE>,</span> |
| press the <b style='mso-bidi-font-weight:normal'>Add</b> button, then press the |
| <b style='mso-bidi-font-weight:normal'>OK</b> button.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img |
| border=0 width=61 height=13 id="_x0000_i1086" src="../../../../images/tryit.gif"><span |
| style='mso-spacerun:yes'> </span>Create the other extension (i.e. between <span |
| class=SpellE><b>uml::</b><b style='mso-bidi-font-weight:normal'>Property</b></span> |
| and <b style='mso-bidi-font-weight:normal'><Stereotype> <span |
| class=SpellE>EReference</span></b>) for the <span class=SpellE>Ecore</span> |
| profile using the UML editor.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>At |
| this point your workspace should look something like this:</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><!--[if gte vml 1]><v:shape |
| id="_x0000_i1138" type="#_x0000_t75" style='width:696pt;height:607.5pt'> |
| <v:imagedata src="article_files/image021.png" o:title=""/> |
| </v:shape><![endif]--><![if !vml]><img border=0 width=928 height=810 |
| src="article_files/image022.jpg" v:shapes="_x0000_i1138"><![endif]></p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img |
| border=0 width=62 height=13 id="_x0000_i1087" src="../../../../images/tip.gif"><span |
| style='mso-spacerun:yes'> </span>Youll notice that a number of new elements |
| have appeared in the UML editor. In particular, youll see a new stereotype |
| property with a name of the form <span style='font-family:"Courier New"'>base_<<span |
| class=SpellE>metaclass</span> name></span>, an extension with a name of the |
| form <span style='font-family:"Courier New"'><<span class=SpellE>metaclass</span> |
| name>_<stereotype name></span>, and an extension end with a name of |
| the form <span style='font-family:"Courier New"'>extension_<stereotype |
| name></span>. Its important that these elements <b style='mso-bidi-font-weight: |
| normal'>not</b> be modified, since the UML2 profile mechanism depends on these |
| constructs.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Lets |
| look at how to perform the same task using Java code. The code snippet below |
| shows a method that programmatically creates and returns <span class=GramE>a(</span>n) |
| (required) extension between a specified <span class=SpellE>metaclass</span> |
| and a specified stereotype.</p> |
| |
| <pre style='margin-left:9.0pt'><span style='mso-tab-count:1'> </span><span |
| class=GramE>protected</span> static Extension <span class=SpellE>createExtension</span>(</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span><span |
| class=GramE>org.eclipse.uml2.uml.Class</span> <span class=SpellE>metaclass</span>, Stereotype <span |
| class=SpellE>stereotype</span>,</pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:3'> </span><span class=SpellE><span |
| class=GramE>boolean</span></span> required) {</pre><pre style='margin-left: |
| 9.0pt'><img border=0 width=24 height=13 id="_x0000_i1088" |
| src="../../../../images/tag_1.gif" align=CENTER><span style='mso-tab-count: |
| 2'> </span>Extension <span class=SpellE>extension</span> = <span |
| class=SpellE><span class=GramE>stereotype.createExtension</span></span><span |
| class=GramE>(</span><span class=SpellE>metaclass</span>, required);</pre><pre |
| style='margin-left:9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:2'> </span><span class=GramE>out(</span>(required</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>? "Required extension '"</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>: "Extension '") + <span |
| class=SpellE><span class=GramE>extension.getQualifiedName</span></span><span |
| class=GramE>(</span>) + "' created.");</pre><pre style='margin-left: |
| 9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:2'> </span><span class=GramE>return</span> extension;</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:1'> </span>}</pre> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Here |
| we call a convenience method on the stereotype that creates an extension (and |
| its ends) between it and a <span class=SpellE>metaclass</span> <img border=0 |
| width=24 height=13 id="_x0000_i1089" src="../../../../images/tag_1.gif" |
| align=CENTER><span style='mso-spacerun:yes'> </span>as one of its siblings |
| (i.e. as a child of its profile namespace). Behind the scenes, the stereotype |
| also creates the ends of the extension, resulting in a new property on the |
| stereotype (with a special name) and an extension end owned by the extension (again, |
| with a special name).</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>OK, |
| lets see this method in action. For example, we could create a non-required |
| extension between <span class=SpellE>metaclass</span> Property and stereotype |
| <span class=SpellE>EAttribute</span> in profile <span class=SpellE>ecore</span> |
| as follows:</p> |
| |
| <pre style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span><span |
| class=SpellE><span class=GramE>createExtension</span></span><span class=GramE>(</span><span |
| class=SpellE>propertyMetaclass</span>, <span class=SpellE>eAttributeStereotype</span>, false);</pre> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img |
| border=0 width=61 height=13 id="_x0000_i1090" src="../../../../images/tryit.gif"><span |
| style='mso-spacerun:yes'> </span>Write code to programmatically create the |
| other extension (i.e. between <span class=SpellE>metaclass</span> Property |
| and stereotype <span class=SpellE>EReference</span>) for the <span |
| class=SpellE>Ecore</span> profile.</p> |
| |
| <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Defining |
| Profiles</h3> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>There. |
| Were done creating (a scaled down version of) the <span class=SpellE>Ecore</span> |
| <span class=GramE>profile,</span> and were ready to start using it. But before |
| we can, theres one final thing we need to do <i style='mso-bidi-font-style: |
| normal'>define</i> it. Since a profile effectively represents an augmentation |
| of a reference <span class=SpellE>metamodel</span> (UML), in order for the |
| extensions weve defined to appear as though theyre part of the UML <span |
| class=SpellE>metamodel</span>, they need to be defined at the meta-<span |
| class=SpellE>metamodel</span> (i.e. <span class=SpellE>Ecore</span>) level. The |
| implementation of profile support in UML2 does this by converting the contents |
| of the profile to an equivalent <span class=SpellE>Ecore</span> representation |
| that is stored as an annotation on the profile. Then, when a profile and its |
| stereotypes are applied to a model and its elements, dynamic EMF (see the EMF |
| book for details) is used to store property values for the stereotypes. For the |
| most part, you can ignore this complexity, as long as you remember to define |
| your profile before using it. To define a profile using the UML editor, follow these |
| steps:</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>1) |
| Select a profile (i.e. <b style='mso-bidi-font-weight:normal'><<span |
| style='mso-bidi-font-weight:bold'>Profile> <span class=SpellE>ecore</span></span></b>) |
| in the UML editor.</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>2) |
| Select the <b style='mso-bidi-font-weight:normal'>UML Editor > Profile > |
| Define</b> menu item.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>At |
| this point your workspace should look something like this:</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><!--[if gte vml 1]><v:shape |
| id="_x0000_i1139" type="#_x0000_t75" style='width:696pt;height:709.5pt'> |
| <v:imagedata src="article_files/image023.png" o:title=""/> |
| </v:shape><![endif]--><![if !vml]><img border=0 width=928 height=946 |
| src="article_files/image024.jpg" v:shapes="_x0000_i1139"><![endif]></p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img |
| border=0 width=62 height=13 id="_x0000_i1091" src="../../../../images/tip.gif"><span |
| style='mso-spacerun:yes'> </span>Youll notice that an annotation with source <b |
| style='mso-bidi-font-weight:normal'>http://www.eclipse.org/uml2/2.0.0/UML</b> |
| has been attached to the profile. It contains the generated <span class=SpellE>Ecore</span> |
| representation (an <span class=SpellE>Ecore</span> package with classes, |
| attributes, <span class=SpellE>enums</span>, etc.) of the profile. As with |
| extensions, its important that this annotation (and its contents) <b |
| style='mso-bidi-font-weight:normal'>not</b> be modified, since the UML2 profile |
| mechanism depends on these constructs.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Lets |
| look at how to perform the same task using Java code. The code snippet below |
| shows a method that programmatically defines a specified profile.</p> |
| |
| <pre style='margin-left:9.0pt'><span style='mso-tab-count:1'> </span><span |
| class=GramE>protected</span> static void <span class=SpellE>defineProfile</span>(Profile <span |
| class=SpellE>profile</span>) {</pre><pre style='margin-left:9.0pt'><img |
| border=0 width=24 height=13 id="_x0000_i1092" src="../../../../images/tag_1.gif" |
| align=CENTER><span style='mso-tab-count:2'> </span><span class=SpellE><span |
| class=GramE>profile.define</span></span><span class=GramE>(</span>);</pre><pre |
| style='margin-left:9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:2'> </span><span class=GramE>out(</span>"Profile '" + <span |
| class=SpellE>profile.getQualifiedName</span>() + "' defined.");</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:1'> </span>}</pre> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Here |
| we call a convenience method on the profile <img border=0 width=24 height=13 |
| id="_x0000_i1093" src="../../../../images/tag_1.gif" align=CENTER><span |
| style='mso-spacerun:yes'> </span>that generates the <span class=SpellE>Ecore</span> |
| representation of the profile and increments its version.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>OK, |
| lets see this method in action. For example, we could define the <span |
| class=SpellE>ecore</span> profile as follows:</p> |
| |
| <pre style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span><span |
| class=SpellE><span class=GramE>defineProfile</span></span><span class=GramE>(</span><span |
| class=SpellE>ecoreProfile</span>);</pre> |
| |
| <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Saving |
| Profiles</h3> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Now |
| that weve spent all this time creating and defining a profile, wed better |
| save our work. When we created our profile using the UML model wizard, a UML |
| resource was created for us, so now all that needs to be done is to serialize |
| the contents of our profile as XMI to a file on disk (i.e. <span class=SpellE><code>Ecore.profile.uml</code></span>). |
| To save a profile using the UML editor, follow these steps:</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>1) |
| Select the <b>File > Save</b> menu item.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Its |
| that simple. Programmatically, we have a bit more work to do because so far, |
| weve been creating our profile in a vacuum, i.e. without a containing |
| resource. The code snippet below shows a method that saves a specified package |
| to a resource with a specified URI.</p> |
| |
| <pre style='margin-left:9.0pt'><span style='mso-tab-count:1'> </span><span |
| class=GramE>protected</span> static void save(org.eclipse.uml2.uml.Package package_, URI <span |
| class=SpellE>uri</span>) {</pre><pre style='margin-left:9.0pt'><img border=0 |
| width=24 height=13 id="_x0000_i1094" src="../../../../images/tag_1.gif" |
| align=CENTER><span style='mso-tab-count:2'> </span>Resource <span |
| class=SpellE>resource</span> = <span class=SpellE>RESOURCE_<span class=GramE>SET.createResource</span></span><span |
| class=GramE>(</span><span class=SpellE>uri</span>);</pre><pre style='margin-left: |
| 9.0pt'><img border=0 width=24 height=13 id="_x0000_i1095" |
| src="../../../../images/tag_2.gif" align=CENTER><span style='mso-tab-count: |
| 2'> </span><span class=SpellE><span class=GramE>resource.getContents</span></span><span |
| class=GramE>(</span>).add(package_);</pre><pre style='margin-left:9.0pt'><o:p> </o:p></pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span><span |
| class=GramE>try</span> {</pre><pre style='margin-left:9.0pt'><img border=0 |
| width=24 height=13 id="_x0000_i1096" src="../../../../images/tag_3.gif" |
| align=CENTER><span style='mso-tab-count:3'> </span><span |
| class=SpellE><span class=GramE>resource.save</span></span><span class=GramE>(</span>null);</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span><span |
| class=GramE>out(</span>"Done.");</pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:2'> </span>} catch (<span class=SpellE>IOException</span> <span |
| class=SpellE>ioe</span>) {</pre><pre style='margin-left:9.0pt'><img border=0 |
| width=24 height=13 id="_x0000_i1097" src="../../../../images/tag_4.gif" |
| align=CENTER><span style='mso-tab-count:3'> </span><span |
| class=GramE>err(</span><span class=SpellE>ioe.getMessage</span>());</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span>}</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:1'> </span>}</pre> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Here |
| we use a statically initialized resource set <img border=0 width=24 height=13 |
| id="_x0000_i1098" src="../../../../images/tag_1.gif" align=CENTER><span |
| style='mso-spacerun:yes'> </span>to create a resource with the specified URI, |
| add the package to the resources contents <img border=0 width=24 height=13 |
| id="_x0000_i1099" src="../../../../images/tag_2.gif" align=CENTER>, and ask the |
| resource to save itself <img border=0 width=24 height=13 id="_x0000_i1100" |
| src="../../../../images/tag_3.gif" align=CENTER><span |
| style='mso-spacerun:yes'> </span>using the default options. If an exception |
| occurs, we notify the user <img border=0 width=24 height=13 id="_x0000_i1101" |
| src="../../../../images/tag_4.gif" align=CENTER><span |
| style='mso-spacerun:yes'> </span>via our handy utility method.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>OK, |
| lets see this method in action. For example, we could save the <span |
| class=SpellE>ecore</span> profile to a resource with URI <span class=SpellE>Ecore.profile.uml</span> |
| (relative to a URI passed in as an argument) as follows:</p> |
| |
| <pre style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span><span |
| class=GramE>save(</span><span class=SpellE>ecoreProfile</span>, <span |
| class=SpellE>URI.createURI</span>(<span class=SpellE>args</span>[0]).<span |
| class=SpellE>appendSegment</span>("<span class=SpellE>Ecore</span>")</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>.<span |
| class=SpellE><span class=GramE>appendFileExtension</span></span><span |
| class=GramE>(</span><span class=SpellE>UMLResource.PROFILE_FILE_EXTENSION</span>));</pre> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img |
| border=0 width=62 height=13 id="_x0000_i1102" src="../../../../images/tip.gif"><span |
| style='mso-spacerun:yes'> </span>The <span class=SpellE><code>UMLResource.PROFILE_FILE_EXTENSION</code></span> |
| constant represents the file extension for UML2 profiles (<code>.<span |
| class=SpellE>profile.uml</span></code>).</p> |
| |
| <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Loading |
| Models</h3> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>In |
| order to make use of our profile, well need to open a model and load the |
| profile. Well use the ExtendedPO2 model that was created in the Getting |
| Started with UML2 article (youll need to copy it into your project and |
| refresh the workspace first).</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>To |
| open a model using the UML editor, follow these steps:</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>1) |
| Double-click on the resource (i.e. <b style='mso-bidi-font-weight:normal'>ExtendedPO2.uml</b>) |
| in the <b style='mso-bidi-font-weight:normal'>Navigator</b> view.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Behind |
| the scenes, a resource is obtained from the right kind resource factory (based |
| on the extension <b style='mso-bidi-font-weight:normal'>.<span class=SpellE>uml</span></b>) |
| and loaded, and then a new UML editor is opened and populated with the |
| resources contents.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>To |
| load a profile (or any resource, actually) using the UML editor, follow these |
| steps:</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>1) |
| Select the <b>UML Editor > Load Resource
</b> menu item.</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>2) |
| Press the <b>Browse Workspace
</b> button.</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>3) |
| Select a resource (i.e. <b>Introduction to UML2 Profiles/<span class=SpellE>Ecore.profile.uml</span></b>) |
| and press the <b>OK</b> button.</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>4) |
| Press the <b>OK</b> button.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>At |
| this point your workspace should look something like this:</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><!--[if gte vml 1]><v:shape |
| id="_x0000_i1140" type="#_x0000_t75" style='width:696pt;height:709.5pt'> |
| <v:imagedata src="article_files/image025.png" o:title=""/> |
| </v:shape><![endif]--><![if !vml]><img border=0 width=928 height=946 |
| src="article_files/image026.jpg" v:shapes="_x0000_i1140"><![endif]></p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Programmatically, |
| we have a bit more work to do. The code snippet below shows a method that loads |
| a package from a resource with a specified URI.</p> |
| |
| <pre style='margin-left:.25in'><span style='mso-tab-count:1'> </span><span |
| class=GramE>protected</span> static org.eclipse.uml2.uml.Package load(URI <span |
| class=SpellE>uri</span>) {</pre><pre style='margin-left:.25in'><span |
| style='mso-tab-count:2'> </span>org.eclipse.uml2.uml.Package package_ = null;</pre><pre |
| style='margin-left:.25in'><o:p> </o:p></pre><pre style='margin-left:.25in'><span |
| style='mso-tab-count:2'> </span><span class=GramE>try</span> {</pre><pre |
| style='margin-left:.25in'><img border=0 width=24 height=13 id="_x0000_i1103" |
| src="../../../../images/tag_1.gif" align=CENTER><span style='mso-tab-count: |
| 3'> </span>Resource <span class=SpellE>resource</span> = <span |
| class=SpellE>RESOURCE_<span class=GramE>SET.getResource</span></span><span |
| class=GramE>(</span><span class=SpellE>uri</span>, true);</pre><pre |
| style='margin-left:.25in'><o:p> </o:p></pre><pre style='margin-left:.25in'><img |
| border=0 width=24 height=13 id="_x0000_i1104" src="../../../../images/tag_2.gif" |
| align=CENTER><span style='mso-tab-count:3'> </span>package_ = (org.eclipse.uml2.uml.Package) <span |
| class=SpellE><span class=GramE>EcoreUtil.getObjectByType</span></span><span |
| class=GramE>(</span></pre><pre style='margin-left:.25in'><span |
| style='mso-tab-count:4'> </span><span class=SpellE><span |
| class=GramE>resource.getContents</span></span><span class=GramE>(</span>), <span |
| class=SpellE>UMLPackage.Literals.PACKAGE</span>);</pre><pre style='margin-left: |
| .25in'><span style='mso-tab-count:2'> </span>} catch (<span |
| class=SpellE>WrappedException</span> we) {</pre><pre style='margin-left:.25in'><img |
| border=0 width=24 height=13 id="_x0000_i1105" src="../../../../images/tag_3.gif" |
| align=CENTER><span style='mso-tab-count:3'> </span><span |
| class=GramE>err(</span><span class=SpellE>we.getMessage</span>());</pre><pre |
| style='margin-left:.25in'><span style='mso-tab-count:3'> </span><span |
| class=SpellE><span class=GramE>System.exit</span></span><span class=GramE>(</span>1);</pre><pre |
| style='margin-left:.25in'><span style='mso-tab-count:2'> </span>}</pre><pre |
| style='margin-left:.25in'><o:p> </o:p></pre><pre style='margin-left:.25in'><img |
| border=0 width=24 height=13 id="_x0000_i1106" src="../../../../images/tag_4.gif" |
| align=CENTER><span style='mso-tab-count:2'> </span><span class=GramE>return</span> package_;</pre><pre |
| style='margin-left:.25in'><span style='mso-tab-count:1'> </span>}</pre> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Here |
| we obtain a resource with the specified URI from our statically initialized |
| resource <span class=GramE>set </span><img border=0 width=24 height=13 |
| id="_x0000_i1107" src="../../../../images/tag_1.gif" align=CENTER>, asking that |
| it be loaded on demand. Next, we use an EMF utility method <img border=0 |
| width=24 height=13 id="_x0000_i1108" src="../../../../images/tag_2.gif" |
| align=CENTER><span style='mso-spacerun:yes'> </span>to obtain the first object |
| of type <span style='font-family:"Courier New"'>Package</span> from the |
| resources contents. If an exception occurs, we notify the user <img border=0 |
| width=24 height=13 id="_x0000_i1109" src="../../../../images/tag_3.gif" |
| align=CENTER><span style='mso-spacerun:yes'> </span>via our handy utility |
| method. Finally, if all is well, we return <img border=0 width=24 height=13 |
| id="_x0000_i1110" src="../../../../images/tag_4.gif" align=CENTER><span |
| style='mso-spacerun:yes'> </span>the package.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img |
| border=0 width=62 height=13 id="_x0000_i1111" src="../../../../images/tip.gif"><span |
| style='mso-spacerun:yes'> </span>The <span class=SpellE><code>EcoreUtil</code></span> |
| class (provided by EMF) defines a number of utilities that you may find quite |
| useful when working with EMF-based resources.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>OK, |
| lets see this method in action. For example, we could load the epo2 model |
| from a resource with URI ExtendedPO2.uml (relative to a URI passed in as an |
| argument) as follows:</p> |
| |
| <pre style='margin-left:.25in'><span style='mso-tab-count:2'> </span><span |
| lang=IT style='mso-ansi-language:IT'>Model epo2Model = (Model) load(URI.createURI(args[0]).appendSegment(<o:p></o:p></span></pre><pre |
| style='margin-left:.25in'><span lang=IT style='mso-ansi-language:IT'><span |
| style='mso-tab-count:3'> </span></span>"ExtendedPO2").<span |
| class=SpellE><span class=GramE>appendFileExtension</span></span><span |
| class=GramE>(</span><span class=SpellE>UMLResource.FILE_EXTENSION</span>));</pre> |
| |
| <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Applying |
| Profiles</h3> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>OK, |
| our profile has been created, defined, and saved, and were ready to apply it to |
| our model. Applying a profile means that it is allowed (but not necessarily |
| required) to apply the stereotypes that are defined in the profile to elements |
| in the package. A profile application is a special type of package import that |
| indicates that a profile has been applied to a package. To apply a profile to a |
| package using the UML editor, follow these steps:</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>1) |
| Select a package (i.e. <b style='mso-bidi-font-weight:normal'><Model> |
| epo2</b>) in the UML editor.</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>2) |
| Select the <b style='mso-bidi-font-weight:normal'>UML Editor > Package > |
| Apply Profile
</b> menu item.</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>3) |
| Choose a profile (i.e. <span class=SpellE><b style='mso-bidi-font-weight:normal'>ecore</b></span>)<span |
| class=GramE>,</span> press the <b style='mso-bidi-font-weight:normal'>Add</b> |
| button, then press the <b style='mso-bidi-font-weight:normal'>OK</b> button.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img |
| border=0 width=62 height=13 id="_x0000_i1112" src="../../../../images/tip.gif"><span |
| style='mso-spacerun:yes'> </span>Be sure to pick the profile weve created instead |
| of the built-in profile provided by the UML resources plug-in (i.e. <span |
| class=SpellE><b style='mso-bidi-font-weight:normal'>ecore</b></span>, not <span |
| class=SpellE><b style='mso-bidi-font-weight:normal'>Ecore</b></span>).</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>At |
| this point your workspace should look something like this:</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><!--[if gte vml 1]><v:shape |
| id="_x0000_i1141" type="#_x0000_t75" style='width:696pt;height:709.5pt'> |
| <v:imagedata src="article_files/image027.png" o:title=""/> |
| </v:shape><![endif]--><![if !vml]><img border=0 width=928 height=946 |
| src="article_files/image028.jpg" v:shapes="_x0000_i1141"><![endif]></p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img |
| border=0 width=62 height=13 id="_x0000_i1113" src="../../../../images/tip.gif"><span |
| style='mso-spacerun:yes'> </span>Youll notice another annotation (with source <b |
| style='mso-bidi-font-weight:normal'>http://www.eclipse.org/uml2/2.0.0/UML</b>) |
| has been attached, in this case to keep track of the <span class=SpellE>Ecore</span> |
| representation for the definition of the profile that is currently applied to |
| the package. Again, its important that this annotation <b style='mso-bidi-font-weight: |
| normal'>not</b> be modified, since the UML2 profile mechanism depends on this |
| construct. Note that a newer definition of the profile can be applied using the |
| same menu item, and a profile (along with all of its stereotypes) can be |
| unapplied using the <b style='mso-bidi-font-weight:normal'>UML Editor > |
| Package > <span class=SpellE>Unapply</span> Profile
</b> menu item.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Lets |
| look at how to perform the same task using Java code. The code snippet below |
| shows a method that programmatically applies a specified profile to a specified |
| package.</p> |
| |
| <pre style='margin-left:8.5pt'><span style='mso-tab-count:1'> </span><span |
| class=GramE>protected</span> static void <span class=SpellE>applyProfile</span>(org.eclipse.uml2.uml.Package package_,</pre><pre |
| style='margin-left:8.5pt'><span style='mso-tab-count:3'> </span><span |
| lang=IT style='mso-ansi-language:IT'>Profile profile) {<o:p></o:p></span></pre><pre |
| style='margin-left:8.5pt'><img border=0 width=24 height=13 id="_x0000_i1114" |
| src="../../../../images/tag_1.gif" align=CENTER><span lang=IT style='mso-ansi-language: |
| IT'><span style='mso-tab-count:2'> </span>package_.applyProfile(profile);<o:p></o:p></span></pre><pre |
| style='margin-left:8.5pt'><span lang=IT style='mso-ansi-language:IT'><o:p> </o:p></span></pre><pre |
| style='margin-left:8.5pt'><span lang=IT style='mso-ansi-language:IT'><span |
| style='mso-tab-count:2'> </span></span><span class=GramE>out(</span>"Profile '" + <span |
| class=SpellE>profile.getQualifiedName</span>() + "' applied to package '"</pre><pre |
| style='margin-left:8.5pt'><span style='mso-tab-count:3'> </span>+ <span |
| class=SpellE>package_.<span class=GramE>getQualifiedName</span></span><span |
| class=GramE>(</span>) + "'.");</pre><pre style='margin-left:8.5pt'><span |
| style='mso-tab-count:1'> </span>}</pre> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Here |
| we call a convenience method on the package <img border=0 width=24 height=13 |
| id="_x0000_i1115" src="../../../../images/tag_1.gif" align=CENTER><span |
| style='mso-spacerun:yes'> </span>that creates a profile application on the |
| package and sets the profile as the imported profile.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>OK, |
| lets see this method in action. For example, we could apply the <span |
| class=SpellE>ecore</span> profile to the epo2 model as follows:</p> |
| |
| <pre><span style='mso-tab-count:2'> </span><span class=SpellE><span |
| class=GramE>applyProfile</span></span><span class=GramE>(</span>epo2Model, <span |
| class=SpellE>ecoreProfile</span>);</pre> |
| |
| <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Applying |
| Stereotypes</h3> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Were |
| on the home stretch now
Once a profile has been applied to a package, |
| stereotypes defined in the profile can be applied to instances of the |
| appropriate <span class=SpellE>metaclasses</span> (as per the defined |
| extensions). When a stereotype is applied to an element, that element is |
| effectively extended with the properties that are defined as part of the |
| stereotype. To apply a stereotype to an element using the UML editor, follow |
| these steps:</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>1) |
| Select an element (i.e. <b style='mso-bidi-font-weight:normal'><Property> |
| <span class=SpellE><span class=GramE>pendingOrders</span></span><span |
| class=GramE> :</span> <span class=SpellE>PurchaseOrder</span> [0..*]</b> in <b |
| style='mso-bidi-font-weight:normal'><Class> Supplier</b>) in the UML |
| editor.</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>2) |
| Select the <b style='mso-bidi-font-weight:normal'>UML Editor > Element > |
| Apply Stereotype
</b> menu item.</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>3) |
| Choose a stereotype (i.e. <span class=SpellE><b style='mso-bidi-font-weight: |
| normal'>ecore::EReference</b></span>)<span class=GramE>,</span> press the <b |
| style='mso-bidi-font-weight:normal'>Add</b> button, then press the <b |
| style='mso-bidi-font-weight:normal'>OK</b> button.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img |
| border=0 width=61 height=13 id="_x0000_i1116" src="../../../../images/tryit.gif"><span |
| style='mso-spacerun:yes'> </span>Apply the appropriate stereotypes to other |
| properties (<b style='mso-bidi-font-weight:normal'><Property> <span |
| class=SpellE>shippedOrders</span> : <span class=SpellE>PurchaseOrder</span> |
| [0..*]</b> in <b style='mso-bidi-font-weight:normal'><Class> Supplier</b>; |
| <b style='mso-bidi-font-weight:normal'><Property> <span class=SpellE>totalAmount</span> |
| : <span class=SpellE>int</span> [0..1]</b>, <b style='mso-bidi-font-weight: |
| normal'><Property> <span class=SpellE>previousOrder</span> : <span |
| class=SpellE>PurchaseOrder</span> [0..1]</b>, and <b style='mso-bidi-font-weight: |
| normal'><Property> customer : Customer</b> in <b style='mso-bidi-font-weight: |
| normal'><Class> <span class=SpellE>PurchaseOrder</span></b>; <b |
| style='mso-bidi-font-weight:normal'><Property> orders : <span |
| class=SpellE>PurchaseOrder</span> [0..*]</b> in <b style='mso-bidi-font-weight: |
| normal'><Class> Customer</b>) in the ExtendedPO2 model using the UML |
| editor.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>At |
| this point your workspace should look something like this:</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><!--[if gte vml 1]><v:shape |
| id="_x0000_i1142" type="#_x0000_t75" style='width:696pt;height:709.5pt'> |
| <v:imagedata src="article_files/image029.png" o:title=""/> |
| </v:shape><![endif]--><![if !vml]><img border=0 width=928 height=946 |
| src="article_files/image030.jpg" v:shapes="_x0000_i1142"><![endif]></p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img |
| border=0 width=62 height=13 id="_x0000_i1117" src="../../../../images/tip.gif"><span |
| style='mso-spacerun:yes'> </span>A stereotype (and its tagged values) can be |
| unapplied using the <b style='mso-bidi-font-weight:normal'>UML Editor > |
| Element > <span class=SpellE>Unapply</span> Stereotype
</b> menu item.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Lets |
| look at how to perform the same task using Java code. The code snippet below shows |
| a method that programmatically applies a specified stereotype to a specified |
| (named) element.</p> |
| |
| <pre style='margin-left:.25in'><span style='mso-tab-count:1'> </span><span |
| class=GramE>protected</span> static void <span class=SpellE>applyStereotype</span>(<span |
| class=SpellE>NamedElement</span> <span class=SpellE>namedElement</span>,</pre><pre |
| style='margin-left:.25in'><span style='mso-tab-count:3'> </span>Stereotype <span |
| class=SpellE>stereotype</span>) {</pre><pre style='margin-left:.25in'><img |
| border=0 width=24 height=13 id="_x0000_i1118" src="../../../../images/tag_1.gif" |
| align=CENTER><span style='mso-tab-count:2'> </span><span class=SpellE><span |
| class=GramE>namedElement.applyStereotype</span></span><span class=GramE>(</span>stereotype);</pre><pre |
| style='margin-left:.25in'><o:p> </o:p></pre><pre style='margin-left:.25in'><span |
| style='mso-tab-count:2'> </span><span class=GramE>out(</span>"Stereotype '" + <span |
| class=SpellE>stereotype.getQualifiedName</span>()</pre><pre style='margin-left: |
| .25in'><span style='mso-tab-count:3'> </span>+ "' applied to element '" + <span |
| class=SpellE><span class=GramE>namedElement.getQualifiedName</span></span><span |
| class=GramE>(</span>) + "'.");</pre><pre style='margin-left:.25in'><span |
| style='mso-tab-count:1'> </span>}</pre> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Here |
| we call a convenience method on the element <img border=0 width=24 height=13 |
| id="_x0000_i1119" src="../../../../images/tag_1.gif" align=CENTER><span |
| style='mso-spacerun:yes'> </span>that creates an instance of the <span |
| class=SpellE>Ecore</span> class representing the specified stereotype (using |
| dynamic EMF) and attaches it to the element using an annotation.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>OK, |
| lets see this method in action. For example, we could apply the <span |
| class=SpellE>EReference</span> stereotype to the <span class=SpellE>pendingOrders</span> |
| property of the Supplier class in the epo2 model as follows:</p> |
| |
| <pre style='margin-left:.25in'><span style='mso-tab-count:2'> </span><span |
| class=GramE>org.eclipse.uml2.uml.Class</span> <span class=SpellE>supplierClass</span> = (org.eclipse.uml2.uml.Class) epo2Model</pre><pre |
| style='margin-left:.25in'><span style='mso-tab-count:3'> </span>.<span |
| class=SpellE><span class=GramE>getOwnedType</span></span><span class=GramE>(</span>"Supplier");</pre><pre |
| style='margin-left:.25in'><o:p> </o:p></pre><pre style='margin-left:.25in'><span |
| style='mso-tab-count:2'> </span>Property <span class=SpellE>pendingOrdersProperty</span> = <span |
| class=SpellE>supplierClass</span></pre><pre style='margin-left:.25in'><span |
| style='mso-tab-count:3'> </span>.<span class=SpellE><span |
| class=GramE>getOwnedAttribute</span></span><span class=GramE>(</span>"<span |
| class=SpellE>pendingOrders</span>", null);</pre><pre style='margin-left: |
| .25in'><span style='mso-tab-count:2'> </span><span class=SpellE><span |
| class=GramE>applyStereotype</span></span><span class=GramE>(</span><span |
| class=SpellE>pendingOrdersProperty</span>, <span class=SpellE>eReferenceStereotype</span>);</pre> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img |
| border=0 width=61 height=13 id="_x0000_i1120" src="../../../../images/tryit.gif"><span |
| style='mso-spacerun:yes'> </span>Write code to programmatically apply the |
| appropriate stereotypes to other properties (i.e. |
| epo2::Supplier::shippedOrders, epo2::PurchaseOrder::totalAmount, |
| epo2::PurchaseOrder::previousOrder, epo2::PurchaseOrder::customer, and |
| epo2::Customer::orders) in the ExtendedPO2 model.</p> |
| |
| <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Accessing |
| Stereotype Property Values</h3> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>At |
| long last, were ready to get and set values for the properties (tagged values) |
| defined in our extensions. To get and set the value for a stereotype property |
| using the UML editor, follow these steps:</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>1) |
| Select the element to which the stereotyped has been applied (i.e. <b |
| style='mso-bidi-font-weight:normal'><<<span class=SpellE>eReference</span>>> |
| <Property> <span class=SpellE><span class=GramE>pendingOrders</span></span><span |
| class=GramE> :</span> <span class=SpellE>PurchaseOrder</span> [0..*]</b> in <b |
| style='mso-bidi-font-weight:normal'><Class> Supplier</b>) in the UML |
| editor.</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>2) |
| Enter or select a value (i.e. <b>false</b>) for the property (i.e. <b |
| style='mso-bidi-font-weight:normal'>Is Resolve Proxies</b>) under the category |
| named for the stereotype (i.e. <span class=SpellE><b style='mso-bidi-font-weight: |
| normal'>EReference</b></span>) in the <b>Properties</b> view.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img |
| border=0 width=61 height=13 id="_x0000_i1121" src="../../../../images/tryit.gif"><span |
| style='mso-spacerun:yes'> </span>Get and set values for other stereotype |
| properties (i.e. <b style='mso-bidi-font-weight:normal'>Is Transient</b> and <b |
| style='mso-bidi-font-weight:normal'>Is Resolve Proxies</b> under <span |
| class=SpellE><b style='mso-bidi-font-weight:normal'>EReference</b></span> for <b |
| style='mso-bidi-font-weight:normal'><<<span class=SpellE>eReference</span>>> |
| <Property> <span class=SpellE>pendingOrders</span> : <span class=SpellE>PurchaseOrder</span> |
| [0..*]</b> in <b style='mso-bidi-font-weight:normal'><Class> Supplier</b>; |
| <b style='mso-bidi-font-weight:normal'>Is Volatile</b>, <b style='mso-bidi-font-weight: |
| normal'>Is Transient</b>, and <b style='mso-bidi-font-weight:normal'>Is Resolve |
| Proxies</b> under <span class=SpellE><b style='mso-bidi-font-weight:normal'>EReference</b></span> |
| for <b style='mso-bidi-font-weight:normal'><<<span class=SpellE>eReference</span>>> |
| <Property> <span class=SpellE>shippedOrders</span> : <span class=SpellE>PurchaseOrder</span> |
| [0..*]</b> in <b style='mso-bidi-font-weight:normal'><Class> Supplier</b>; |
| <b style='mso-bidi-font-weight:normal'>Is Volatile</b> and <b style='mso-bidi-font-weight: |
| normal'>Is Transient</b> under <span class=SpellE><b style='mso-bidi-font-weight: |
| normal'>EAttribute</b></span> for <b style='mso-bidi-font-weight:normal'><<<span |
| class=SpellE>eAttribute</span>>> <Property> <span class=SpellE>totalAmount</span> |
| : <span class=SpellE>int</span> [0..1]</b> in <b style='mso-bidi-font-weight: |
| normal'><Class> <span class=SpellE>PurchaseOrder</span></b>; <b |
| style='mso-bidi-font-weight:normal'>Is Resolve Proxies</b> under <span |
| class=SpellE><b style='mso-bidi-font-weight:normal'>EReference</b></span> for <b |
| style='mso-bidi-font-weight:normal'><<<span class=SpellE>eReference</span>>> |
| <Property> <span class=SpellE>previousOrder</span> : <span class=SpellE>PurchaseOrder</span> |
| [0..1]</b> in <b style='mso-bidi-font-weight:normal'><Class> <span |
| class=SpellE>PurchaseOrder</span></b>; <b style='mso-bidi-font-weight:normal'>Is |
| Resolve Proxies</b> under <span class=SpellE><b style='mso-bidi-font-weight: |
| normal'>EReference</b></span> for <b style='mso-bidi-font-weight:normal'><<<span |
| class=SpellE>eReference</span>>> <Property> customer : Customer</b> |
| in <b style='mso-bidi-font-weight:normal'><Class> <span class=SpellE>PurchaseOrder</span></b>; |
| <b style='mso-bidi-font-weight:normal'>Is Resolve Proxies</b> under <span |
| class=SpellE><b style='mso-bidi-font-weight:normal'>EReference</b></span> for <b |
| style='mso-bidi-font-weight:normal'><<<span class=SpellE>eReference</span>>> |
| <Property> orders : <span class=SpellE>PurchaseOrder</span> [0..*]</b> in |
| <b style='mso-bidi-font-weight:normal'><Class> Customer</b>) in the |
| ExtendedPO2 model using the UML editor.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>At |
| this point your workspace should look something like this:</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><!--[if gte vml 1]><v:shape |
| id="_x0000_i1143" type="#_x0000_t75" style='width:696pt;height:709.5pt'> |
| <v:imagedata src="article_files/image031.png" o:title=""/> |
| </v:shape><![endif]--><![if !vml]><img border=0 width=928 height=946 |
| src="article_files/image032.jpg" v:shapes="_x0000_i1143"><![endif]></p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Lets |
| look at how to perform the same task using Java code. The code snippet below |
| shows a method that programmatically gets and returns the value of a specified |
| property of a specified stereotype for a specified element.</p> |
| |
| <pre style='margin-left:.25in'><span style='mso-tab-count:1'> </span><span |
| class=GramE>protected</span> static Object <span class=SpellE>getStereotypePropertyValue</span>(</pre><pre |
| style='margin-left:.25in'><span style='mso-tab-count:3'> </span><span |
| class=SpellE>NamedElement</span> <span class=SpellE>namedElement</span>, Stereotype <span |
| class=SpellE>stereotype</span>, Property <span class=SpellE>property</span>) {</pre><pre |
| style='margin-left:.25in'><img border=0 width=24 height=13 id="_x0000_i1122" |
| src="../../../../images/tag_1.gif" align=CENTER><span style='mso-tab-count: |
| 2'> </span>Object value = <span class=SpellE><span class=GramE>namedElement.getValue</span></span><span |
| class=GramE>(</span>stereotype, <span class=SpellE>property.getName</span>());</pre><pre |
| style='margin-left:.25in'><o:p> </o:p></pre><pre style='margin-left:.25in'><span |
| style='mso-tab-count:2'> </span><span class=GramE>out(</span>"Value of stereotype property '" + <span |
| class=SpellE>property.getQualifiedName</span>()</pre><pre style='margin-left: |
| .25in'><span style='mso-tab-count:3'> </span>+ "' on element '" + <span |
| class=SpellE><span class=GramE>namedElement.getQualifiedName</span></span><span |
| class=GramE>(</span>) + "' is "</pre><pre style='margin-left:.25in'><span |
| style='mso-tab-count:3'> </span>+ <span class=SpellE><span |
| class=GramE>String.valueOf</span></span><span class=GramE>(</span>value) + ".");</pre><pre |
| style='margin-left:.25in'><o:p> </o:p></pre><pre style='margin-left:.25in'><span |
| style='mso-tab-count:2'> </span><span class=GramE>return</span> value;</pre><pre |
| style='margin-left:.25in'><span style='mso-tab-count:1'> </span>}</pre> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Here |
| we call a convenience method on the (named) element <img border=0 width=24 |
| height=13 id="_x0000_i1123" src="../../../../images/tag_1.gif" align=CENTER><span |
| style='mso-spacerun:yes'> </span>that retrieves the value of a property with a |
| specified name from the dynamically created <span class=SpellE>Ecore</span> |
| object instance corresponding to the specified applied stereotype, notifies the |
| user, and returns it.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>OK, |
| lets see this method in action. For example, we could get the value of the <span |
| class=SpellE>isVolatile</span> property of the <span class=SpellE>EReference</span> |
| stereotype for the <span class=SpellE>pendingOrders</span> property of the |
| Supplier class in the epo2 model as follows:</p> |
| |
| <pre style='margin-left:.25in'><span style='mso-tab-count:2'> </span><span |
| class=SpellE><span class=GramE>getStereotypePropertyValue</span></span><span |
| class=GramE>(</span><span class=SpellE>pendingOrdersProperty</span>, <span |
| class=SpellE>eReferenceStereotype</span>,</pre><pre style='margin-left:.25in'><span |
| style='mso-tab-count:3'> </span><span class=SpellE><span |
| class=GramE>isVolatileProperty</span></span>);</pre> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img |
| border=0 width=61 height=13 id="_x0000_i1124" src="../../../../images/tryit.gif"><span |
| style='mso-spacerun:yes'> </span>Write code to programmatically get the values |
| of the other stereotype properties for elements in the ExtendedPO2 model.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>The |
| code snippet below shows a method that programmatically sets the value of a |
| specified property of a specified stereotype for a specified element to a |
| specified value.</p> |
| |
| <pre style='margin-left:.25in'><span style='mso-tab-count:1'> </span><span |
| class=GramE>protected</span> static void <span class=SpellE>setStereotypePropertyValue</span>(<span |
| class=SpellE>NamedElement</span> <span class=SpellE>namedElement</span>,</pre><pre |
| style='margin-left:.25in'><span style='mso-tab-count:3'> </span>Stereotype <span |
| class=SpellE>stereotype</span>, Property <span class=SpellE>property</span>, Object value) {</pre><pre |
| style='margin-left:.25in'><img border=0 width=24 height=13 id="_x0000_i1125" |
| src="../../../../images/tag_1.gif" align=CENTER><span style='mso-tab-count: |
| 2'> </span><span class=SpellE><span class=GramE>namedElement.setValue</span></span><span |
| class=GramE>(</span>stereotype, <span class=SpellE>property.getName</span>(), value);</pre><pre |
| style='margin-left:.25in'><o:p> </o:p></pre><pre style='margin-left:.25in'><span |
| style='mso-tab-count:2'> </span><span class=GramE>out(</span>"Value of stereotype property '" + <span |
| class=SpellE>property.getQualifiedName</span>()</pre><pre style='margin-left: |
| .25in'><span style='mso-tab-count:3'> </span>+ "' on element '" + <span |
| class=SpellE><span class=GramE>namedElement.getQualifiedName</span></span><span |
| class=GramE>(</span>) + "' set to "</pre><pre style='margin-left: |
| .25in'><span style='mso-tab-count:3'> </span>+ <span |
| class=SpellE><span class=GramE>String.valueOf</span></span><span class=GramE>(</span>value) + ".");</pre><pre |
| style='margin-left:.25in'><span style='mso-tab-count:1'> </span>}</pre> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Here |
| we call a convenience method on the (named) element <img border=0 width=24 |
| height=13 id="_x0000_i1126" src="../../../../images/tag_1.gif" align=CENTER><span |
| style='mso-spacerun:yes'> </span>that sets the value of a property with a |
| specified name in the dynamically created <span class=SpellE>Ecore</span> |
| object instance corresponding to the specified applied stereotype and notifies |
| the user.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>OK, |
| lets see this method in action. For example, we could set the value of the <span |
| class=SpellE>isVolatile</span> property of the <span class=SpellE>EReference</span> |
| stereotype for the <span class=SpellE>pendingOrders</span> property of the |
| Supplier class in the epo2 model to <span class=SpellE><span |
| style='font-family:"Courier New"'>Boolean.TRUE</span></span> as follows:</p> |
| |
| <pre style='margin-left:.25in'><span style='mso-tab-count:2'> </span><span |
| class=SpellE><span class=GramE>setStereotypePropertyValue</span></span><span |
| class=GramE>(</span><span class=SpellE>pendingOrdersProperty</span>, <span |
| class=SpellE>eReferenceStereotype</span>,</pre><pre style='margin-left:.25in'><span |
| style='mso-tab-count:3'> </span><span class=SpellE><span |
| class=GramE>isVolatileProperty</span></span>, <span class=SpellE>Boolean.TRUE</span>);</pre> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img |
| border=0 width=61 height=13 id="_x0000_i1127" src="../../../../images/tryit.gif"><span |
| style='mso-spacerun:yes'> </span>Write code to programmatically set the values |
| of the other stereotype properties for elements in the ExtendedPO2 model.</p> |
| |
| <h2 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Conclusion</h2> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Congratulations! |
| If youve made it this far, youve successfully created and applied a simple |
| profile programmatically and/or using the UML editor. Theres a whole lot more |
| that could be said, but the purpose of this article was just to introduce you |
| to the concepts. Stay tuned for more articles on how to develop tools with |
| UML2.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>For |
| more information on UML2, visit the <a |
| href="http://www.eclipse.org/modeling/mdt/?project=uml2#uml2">home page</a> or |
| join the <a href="news://news.eclipse.org/eclipse.modeling.mdt.uml2">newsgroup</a>.</p> |
| |
| <h2 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>References</h2> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>[1] |
| K. Hussey. <span class=GramE>Getting Started with UML2.</span> International |
| Business Machines Corp., 2004, 2006.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span |
| class=GramE>[2] F. <span class=SpellE>Budinsky</span>, D. Steinberg, E. <span |
| class=SpellE>Merks</span>, R. <span class=SpellE>Ellersick</span>, and T. J. <span |
| class=SpellE>Grose</span>.</span> <i style='mso-bidi-font-style:normal'>Eclipse |
| Modeling Framework</i>. Pearson Education, Inc., <st1:place><st1:City>Boston</st1:City>, |
| <st1:State>MA</st1:State></st1:place>, 2003.</p> |
| |
| <h2 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Source |
| Code</h2> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>To |
| run the example or view the source code for this article, unzip <a |
| href="http://download.eclipse.org/modeling/mdt/uml2/downloads/articles/uml2.articles_200607181325.zip">uml2.articles_200607181325.zip</a> |
| into your Eclipse home directory and import the <code>com.ibm.uml2.articles</code> |
| plug-in into your workspace as a binary project with linked content (<b>File |
| > Import
> External Plug-ins and Fragments</b>). You can run the <code>IntroductionToUML2Profiles</code> |
| class as a Java application with two file <span class=SpellE>URIs</span> (e.g. |
| file:/C:/Introduction to UML2 Profiles <span class=SpellE>jar<span |
| class=GramE>:file</span></span>:/C:/Eclipse |
| 3.2/eclipse/plugins/org.eclipse.uml2.uml.resources_2.0.0.v200606221411.jar!/) |
| as program arguments. The first URI should refer to a folder that contains the |
| ExtendedPO2 model described in the Getting Started with UML2 article. The |
| second URI should use the JAR scheme (since the UML resources plug-in is <span |
| class=SpellE>JARd</span> as of UML2 1.1) and refer to the location of the <span |
| style='font-family:"Courier New"'>org.eclipse.uml2.uml.resources</span> plug-<span |
| class=SpellE>ins</span> JAR archive.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span |
| style='font-size:7.5pt'>Java and all Java-based trademarks and logos are |
| trademarks or registered trademarks of Sun Microsystems, Inc. in the </span><st1:country-region><st1:place><span |
| style='font-size:7.5pt'>United States</span></st1:place></st1:country-region><span |
| style='font-size:7.5pt'>, other countries, or both.<o:p></o:p></span></p> |
| |
| </div> |
| |
| </body> |
| |
| </html> |