| <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>Getting Started with UML2</title> |
| <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>128</o:Revision> |
| <o:TotalTime>5345</o:TotalTime> |
| <o:Created>2004-07-06T14:17:00Z</o:Created> |
| <o:LastSaved>2008-07-11T18:06:00Z</o:LastSaved> |
| <o:Pages>1</o:Pages> |
| <o:Words>5435</o:Words> |
| <o:Characters>30981</o:Characters> |
| <o:Company>Rational Software</o:Company> |
| <o:Lines>258</o:Lines> |
| <o:Paragraphs>72</o:Paragraphs> |
| <o:CharactersWithSpaces>36344</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;} |
| 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="16386"/> |
| </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'>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><b><span style='font-size:10.0pt;font-family:Arial; |
| color:white'> </span></b><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'>Getting Started with UML2</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 style='mso-special-character: |
| line-break'> |
| <![if !supportLineBreakNewLine]><br style='mso-special-character:line-break'> |
| <![endif]><o:p></o:p></span></p> |
| |
| <p class=MsoNormal><span style='font-size:10.0pt;font-family:Arial'>This |
| article describes how to get started with the UML2 plug-ins for Eclipse. In |
| particular, it gives an overview of how to create models (and their contents) |
| both programmatically and by using the sample UML editor.<o:p></o:p></span></p> |
| |
| <p><b>By <span class=SpellE>Kenn</span> Hussey, IBM</b><br> |
| <st1:date Year="2006" Day="18" Month="7">July 18, 2006</st1:date> <span |
| style='mso-spacerun:yes'> </span><span |
| style='mso-spacerun:yes'> </span>(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_i1087" type="#_x0000_t75" style='width:581.25pt; |
| height:408.75pt'> |
| <v:imagedata src="article_files/image001.png" o:title=""/> |
| </v:shape><![endif]--><![if !vml]><img border=0 width=775 height=545 |
| src="article_files/image022.jpg" v:shapes="_x0000_i1087"><![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> |
| |
| <p><o:p> </o:p></p> |
| |
| <h2>Introduction</h2> |
| |
| <p>This article will walk you through the basics of creating models using UML2. |
| Using a simple model (the ExtendedPO2 model, shamelessly borrowed from the EMF |
| bible [1]) as an example, well look at whats involved in creating some of |
| the more common elements that make up a model. For each type of element, well |
| first explain the creation process using the sample UML editor and then explore |
| how to accomplish the same thing using Java code. The ExtendedPO2 model is |
| shown below.</p> |
| |
| <p><!--[if gte vml 1]><v:shape id="_x0000_i1027" type="#_x0000_t75" style='width:554.25pt; |
| height:406.5pt'> |
| <v:imagedata src="article_files/image021.emz" o:title=""/> |
| </v:shape><![endif]--><![if !vml]><img border=0 width=739 height=542 |
| src="article_files/image002.gif" v:shapes="_x0000_i1027"><![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 model 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. Getting Started |
| with UML2) 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_i1088" type="#_x0000_t75" style='width:655.5pt; |
| height:447.75pt'> |
| <v:imagedata src="article_files/image023.png" o:title=""/> |
| </v:shape><![endif]--><![if !vml]><img border=0 width=874 height=597 |
| src="article_files/image024.jpg" v:shapes="_x0000_i1088"><![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 models, well assume |
| that youve created a class (named, say, GettingStartedWithUML2) in which you |
| can write some code to construct our sample model. 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_i1028" 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_i1029" |
| 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_i1030" |
| 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_i1031" |
| 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_i1032" 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_i1033" |
| 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 a different kind of UML element, starting with |
| models.</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 |
| 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'>At |
| the root of a typical UML model is a model element. It contains a |
| (hierarchical) set of elements that together describe the physical system being |
| modeled. To create 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) |
| Select a project (i.e. <b>Getting Started with UML2</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. ExtendedPO2.uml) 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>Model</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) |
| <span class=GramE>Select</span> the <<b>Model></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. epo2) 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'>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_i1089" type="#_x0000_t75" style='width:655.5pt;height:447.75pt'> |
| <v:imagedata src="article_files/image025.png" o:title=""/> |
| </v:shape><![endif]--><![if !vml]><img border=0 width=874 height=597 |
| src="article_files/image026.jpg" v:shapes="_x0000_i1089"><![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 model with a |
| specified name.</p> |
| |
| <pre style='margin-left:9.0pt'><span style='mso-tab-count:1'> </span><span |
| class=GramE>protected</span> static Model <span class=SpellE>createModel</span>(String name) {</pre><pre |
| style='margin-left:9.0pt'><img border=0 width=24 height=14 id="_x0000_i1034" |
| src="../../../../images/tag_1.gif" align=CENTER><span style='mso-tab-count: |
| 2'> </span>Model <span class=SpellE>model</span> = <span class=SpellE><span |
| class=GramE>UMLFactory.eINSTANCE.createModel</span></span><span class=GramE>(</span>);</pre><pre |
| style='margin-left:9.0pt'><img border=0 width=24 height=14 id="_x0000_i1035" |
| src="../../../../images/tag_2.gif" align=CENTER><span style='mso-tab-count: |
| 2'> </span><span class=SpellE><span class=GramE>model.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_i1036" |
| src="../../../../images/tag_3.gif" align=CENTER><span style='mso-tab-count: |
| 2'> </span><span class=GramE>out(</span>"Model '" + <span |
| class=SpellE>model.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_i1037" src="../../../../images/tag_4.gif" |
| align=CENTER><span style='mso-tab-count:2'> </span><span class=GramE>return</span> model;</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_i1038" src="../../../../images/tag_1.gif" align=CENTER><span |
| style='mso-spacerun:yes'> </span>to create a model, and we set its <span |
| class=GramE>name </span><img border=0 width=24 height=14 id="_x0000_i1039" |
| src="../../../../images/tag_2.gif" align=CENTER>. Then, we output information <img |
| border=0 width=24 height=14 id="_x0000_i1040" src="../../../../images/tag_3.gif" |
| align=CENTER><span style='mso-spacerun:yes'> </span>to the user to let them |
| know that the model has been successfully created. Finally, we return <img |
| border=0 width=24 height=14 id="_x0000_i1041" src="../../../../images/tag_4.gif" |
| align=CENTER><span style='mso-spacerun:yes'> </span>the model. 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'><img |
| border=0 width=63 height=14 id="_x0000_i1042" src="../../../../images/tip.gif"><span |
| style='mso-spacerun:yes'> </span>All named elements (a model is a type of named |
| element) have a simple name and a qualified name. The qualified name is the |
| simple name prefixed with the simple names of <span class=GramE>all of the</span> |
| named elements containing namespaces. Note that the qualified name of a named |
| element is only defined if all of its containing namespaces have non-empty |
| simple names.</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 model named |
| epo2 as follows:</p> |
| |
| <pre style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span>Model epo2Model = <span |
| class=SpellE><span class=GramE>createModel</span></span><span class=GramE>(</span>"epo2");</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 |
| Packages</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 |
| package is a namespace for its members (<span class=SpellE><i style='mso-bidi-font-style: |
| normal'>packageable</i></span><i style='mso-bidi-font-style:normal'> elements</i>), |
| and may contain other packages. A package can import either individual members |
| of other packages, or all of the members of other packages. To create 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 (e.g. <<b>Package> <span class=SpellE>foo</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 Package</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 (e.g. bar) 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'>We |
| dont actually need to create a package because our sample model doesnt |
| contain any
except of course for the root package (i.e. the model). Thats |
| right a model is a type of 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'>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 package with a |
| specified name in a specified nesting package.</p> |
| |
| <pre style='margin-left:9.0pt'><span style='mso-tab-count:1'> </span><span |
| class=GramE>protected</span> static org.eclipse.uml2.uml.Package <span |
| class=SpellE>createPackage</span>(</pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:3'> </span><span class=GramE>org.eclipse.uml2.uml.Package</span> <span |
| class=SpellE>nestingPackage</span>, String name) {</pre><pre style='margin-left: |
| 9.0pt'><img border=0 width=24 height=14 id="_x0000_i1043" |
| src="../../../../images/tag_1.gif" align=CENTER><span style='mso-tab-count: |
| 2'> </span>org.eclipse.uml2.uml.Package package_ = <span class=SpellE>nestingPackage</span></pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>.<span |
| class=SpellE><span class=GramE>createNestedPackage</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>"Package '" + <span class=SpellE>package_.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> package_;</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, |
| instead of asking the factory to create the package for us, were making use of |
| one of the factory methods <img border=0 width=24 height=14 id="_x0000_i1044" |
| src="../../../../images/tag_1.gif" align=CENTER><span |
| style='mso-spacerun:yes'> </span>in the UML2 API.</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_i1045" src="../../../../images/tip.gif"><span |
| style='mso-spacerun:yes'> </span>In UML2, a factory method exists for every feature |
| that can contain other elements (i.e. every containment feature). In addition, |
| more convenient factory methods exist for commonly created types (like |
| packages). In this case, the package has a feature (<span class=SpellE><code>packagedElement</code></span>) |
| that can contain <span class=SpellE>packageable</span> elements, so we could |
| obtain the <span class=SpellE>Ecore</span> class of the type of (<span |
| class=SpellE>packageable</span>) element we want to create (i.e. <code>Package</code>) |
| from the UML <span class=SpellE>Ecore</span> package singleton, and pass it to |
| the <span class=SpellE><span class=GramE><code>createPackagedElement</code></span></span><span |
| class=GramE><code>(</code></span><code>String, <span class=SpellE>EClass</span>)</code> |
| factory method. Instead, we use the more convenient <span class=SpellE><span |
| class=GramE><code>createNestedPackage</code></span></span><span class=GramE><code>(</code></span><code>String)</code> |
| factory method which implicitly creates a package and accepts the desired |
| package name as an argument. Behind the scenes, the package will create a |
| nested package, set its name, and add the package to its list of 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 a package named |
| bar in nesting package <span class=SpellE>foo</span> as follows:</p> |
| |
| <pre style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span><span |
| class=GramE>org.eclipse.uml2.uml.Package</span> <span class=SpellE>barPackage</span> = <span |
| class=SpellE>createPackage</span>(<span class=SpellE>fooPackage</span>, "bar");</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 |
| 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'>A |
| primitive type defines a predefined data type, without any relevant |
| substructure. Primitive types used in UML itself include <code>Boolean</code>, |
| <code>Integer</code>, <span class=SpellE><code>UnlimitedNatural</code></span>, |
| and <code>String</code>. To create 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>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) |
| Right-click and select the <b>New Child > Packaged Element > Primitive |
| Type</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>int</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_i1046" src="../../../../images/tryit.gif"><span |
| style='mso-spacerun:yes'> </span>Create the remaining primitive types from 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_i1090" type="#_x0000_t75" style='width:655.5pt;height:447.75pt'> |
| <v:imagedata src="article_files/image003.png" o:title=""/> |
| </v:shape><![endif]--><![if !vml]><img border=0 width=874 height=597 |
| src="article_files/image004.jpg" v:shapes="_x0000_i1090"><![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 primitive type 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 <span class=SpellE>PrimitiveType</span> <span |
| class=SpellE>createPrimitiveType</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_i1047" |
| src="../../../../images/tag_1.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>) package_</pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:3'> </span>.<span class=SpellE><span |
| class=GramE>createOwnedPrimitiveType</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>"Primitive type '" + <span |
| class=SpellE>primitiveType.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>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 call the <span class=SpellE><span class=GramE><code>createOwnedPrimitiveType</code></span></span><span |
| class=GramE><code>(</code></span><code>String)</code> convenience factory |
| method <img border=0 width=24 height=13 id="_x0000_i1048" |
| 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 a primitive type |
| named <span class=SpellE>int</span> in model epo2 as follows:</p> |
| |
| <pre style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span><span |
| class=SpellE>PrimitiveType</span> <span class=SpellE>intPrimitiveType</span> = <span |
| class=SpellE><span class=GramE>createPrimitiveType</span></span><span |
| class=GramE>(</span>epo2Model, "<span class=SpellE>int</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_i1049" src="../../../../images/tryit.gif"><span |
| style='mso-spacerun:yes'> </span>Write code to programmatically create the |
| remaining primitive types from 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'>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'>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 package (i.e. <<b>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) |
| 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>OrderStatus</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'>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_i1091" type="#_x0000_t75" style='width:655.5pt;height:447.75pt'> |
| <v:imagedata src="article_files/image005.png" o:title=""/> |
| </v:shape><![endif]--><![if !vml]><img border=0 width=874 height=597 |
| src="article_files/image006.jpg" v:shapes="_x0000_i1091"><![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 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_i1050" |
| 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_i1051" |
| 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>OrderStatus</span> in model epo2 as follows:</p> |
| |
| <pre style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span>Enumeration <span |
| class=SpellE>orderStatusEnumeration</span> = <span class=SpellE><span |
| class=GramE>createEnumeration</span></span><span class=GramE>(</span>epo2Model,</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>"<span |
| class=SpellE>OrderStatus</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 |
| 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>Enumeration> <span class=SpellE>OrderStatus</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. Pending) 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_i1052" src="../../../../images/tryit.gif"><span |
| style='mso-spacerun:yes'> </span>Create the remaining enumeration literals from |
| 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_i1092" type="#_x0000_t75" style='width:655.5pt;height:447.75pt'> |
| <v:imagedata src="article_files/image007.png" o:title=""/> |
| </v:shape><![endif]--><![if !vml]><img border=0 width=874 height=597 |
| src="article_files/image008.jpg" v:shapes="_x0000_i1092"><![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 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_i1053" |
| 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 a <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_i1054" |
| 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 Pending in enumeration <span class=SpellE>OrderStatus</span> |
| as follows:</p> |
| |
| <pre style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span><span |
| class=SpellE><span class=GramE>createEnumerationLiteral</span></span><span |
| class=GramE>(</span><span class=SpellE>orderStatusEnumeration</span>, "Pending");</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_i1055" src="../../../../images/tryit.gif"><span |
| style='mso-spacerun:yes'> </span>Write code to programmatically create the |
| remaining enumeration literals from 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'>Creating |
| Classes</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 |
| class is a kind of classifier whose features are attributes (some of which may |
| represent the navigable ends of associations) and operations. To create a class |
| 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>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) |
| Right-click and select the <b>New Child > Packaged Element > Class</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. Supplier) 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_i1056" src="../../../../images/tryit.gif"><span |
| style='mso-spacerun:yes'> </span>Create the remaining classes from 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_i1093" type="#_x0000_t75" style='width:655.5pt;height:509.25pt'> |
| <v:imagedata src="article_files/image009.png" o:title=""/> |
| </v:shape><![endif]--><![if !vml]><img border=0 width=874 height=679 |
| src="article_files/image010.jpg" v:shapes="_x0000_i1093"><![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) class 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 org.eclipse.uml2.uml.Class <span |
| class=SpellE>createClass</span>(</pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:3'> </span>org.eclipse.uml2.uml.Package package_, String name, <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=13 id="_x0000_i1057" |
| src="../../../../images/tag_1.gif" align=CENTER><span style='mso-tab-count: |
| 2'> </span>org.eclipse.uml2.uml.Class class_ = <span class=SpellE>package_.<span |
| class=GramE>createOwnedClass</span></span><span class=GramE>(</span>name,</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span><span |
| class=SpellE><span class=GramE>isAbstract</span></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>"Class '" + <span |
| class=SpellE>class_.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> class_;</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>createOwnedClass</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_i1058" |
| src="../../../../images/tag_1.gif" align=CENTER><span |
| style='mso-spacerun:yes'> </span>to ask the package to create a class with the |
| specified name as one of its packaged elements, and set the <span class=SpellE><code>isAbstract</code></span> |
| attribute of the class 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'><img |
| border=0 width=62 height=13 id="_x0000_i1059" src="../../../../images/tip.gif"><span |
| style='mso-spacerun:yes'> </span>You may have noticed that we have been fully |
| qualifying references to the <code>Package</code> and <code>Class</code> |
| interfaces. This is recommended so that these types are not confused with <span |
| class=SpellE><code>java.lang.Class</code></span> and <span class=SpellE><code>java.lang.Package</code></span>, |
| which are imported implicitly in Java.</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-abstract |
| class named Supplier in model epo2 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>supplierClass</span> = <span |
| class=SpellE>createClass</span>(epo2Model,</pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:3'> </span>"Supplier", 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_i1060" src="../../../../images/tryit.gif"><span |
| style='mso-spacerun:yes'> </span>Write code to programmatically create the |
| remaining classes from 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'>Creating |
| 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'>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 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 classifier (i.e. <<b>Class> <span class=SpellE>USAddress</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. <b>epo2::Address</b>) 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_i1061" src="../../../../images/tryit.gif"><span |
| style='mso-spacerun:yes'> </span>Create the remaining generalizations from 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_i1094" type="#_x0000_t75" style='width:655.5pt;height:509.25pt'> |
| <v:imagedata src="article_files/image011.png" o:title=""/> |
| </v:shape><![endif]--><![if !vml]><img border=0 width=874 height=679 |
| src="article_files/image012.jpg" v:shapes="_x0000_i1094"><![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 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_i1062" |
| 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_i1063" |
| 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 class <span class=SpellE>USAddress</span> and general class |
| Address as follows:</p> |
| |
| <pre style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span><span |
| class=SpellE><span class=GramE>createGeneralization</span></span><span |
| class=GramE>(</span><span class=SpellE>usAddressClass</span>, <span |
| class=SpellE>addressClass</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_i1064" src="../../../../images/tryit.gif"><span |
| style='mso-spacerun:yes'> </span>Write code to programmatically create the |
| remaining generalizations from 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'>Creating |
| Attributes</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'>When |
| a property is owned by a classifier it represents an attribute; in this case is |
| relates an instance of the classifier to a value or set of values of the type |
| of the attribute.</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_i1065" src="../../../../images/tip.gif"><span |
| style='mso-spacerun:yes'> </span>The types of <code>Classifier</code> that can |
| own attributes in UML2 include <code>Artifact</code>, <span class=SpellE><code>DataType</code></span>, |
| <code>Interface</code>, <code>Signal</code>, and <span class=SpellE><code>StructuredClassifier</code></span> |
| (and their subtypes).</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 |
| create an attribute 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 classifier (i.e. <<b>Class> Address</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. "name) 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. <b>epo2::String</b>) 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 style='mso-bidi-font-weight:normal'>Lower</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=62 height=13 id="_x0000_i1066" src="../../../../images/tip.gif"><span |
| style='mso-spacerun:yes'> </span>Lower and upper values for multiplicity |
| elements (like properties) are represented as value specifications (first-class |
| objects) in UML 2.x. The default value for lower and upper bounds is 1, unless |
| a child value specification exists, in which case its value is used. Specifying |
| a value for the lower or upper property will create a child value specification |
| if none exists, or update its value if one does. Note that, to be treated as a |
| bound, the lower value must be an integer and the upper value must be an |
| unlimited natural. </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 remaining attributes from 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_i1095" type="#_x0000_t75" style='width:699pt;height:643.5pt'> |
| <v:imagedata src="article_files/image013.png" o:title=""/> |
| </v:shape><![endif]--><![if !vml]><img border=0 width=932 height=858 |
| src="article_files/image014.jpg" v:shapes="_x0000_i1095"><![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 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_i1068" |
| 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 a <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_i1069" |
| 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 |
| indirectly creates a literal integer and literal unlimited natural, |
| respectively, and sets their values to the specified integer values).</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_i1070" 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; when setting this value in the <b style='mso-bidi-font-weight:normal'>Properties</b> |
| view, an asterisk (*) can alternatively be specified.</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 String named name in |
| class Supplier as follows:</p> |
| |
| <pre style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span><span |
| class=SpellE><span class=GramE>createAttribute</span></span><span class=GramE>(</span><span |
| class=SpellE>supplierClass</span>, "name", <span class=SpellE>stringPrimitiveType</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_i1071" src="../../../../images/tryit.gif"><span |
| style='mso-spacerun:yes'> </span>Write code to programmatically create the |
| remaining attributes from 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'>Creating |
| Associations</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 |
| association specifies a semantic relationship that can occur between two or |
| more typed instances; its ends are represented by properties, each of which is |
| connected to the type of the end. When a property is owned by an association it |
| represents a non-navigable end of the association, in which case the type of |
| the property is the type of the association end.</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>The notion of association end navigability was |
| separated from that of ownership in the UML 2.0 <span class=GramE>specification</span>, |
| so a property that is owned by an association isnt necessarily non-navigable |
| as of UML2 2.0.</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 |
| create an association 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>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) |
| Right-click and select the <b>New Child > Packaged Element > Association</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 (e.g. <span class=SpellE>A_orders_supplier</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> the association (i.e. <<b>Association> <span |
| class=SpellE>A_orders_supplier</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'>5) |
| Right-click and select the <b>New Child > Owned End > 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'>6) |
| Select a value (i.e. <b>epo2::Supplier</b>) 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'>7) |
| <span class=GramE>Select</span> a class (i.e. <<b>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'>8) |
| 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'>9) |
| Select a value (i.e. <b>Composite</b>) for the <b>Aggregation</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'>10) |
| Select a value (i.e. <b>epo2::A_orders_supplier</b>) for the <b>Association</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'>11) |
| Enter a value (i.e. "orders") 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'>12) |
| Select a value (i.e. <b>epo2::PurchaseOrder</b>) 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'>13) |
| Enter a value (i.e. 0) for the <b style='mso-bidi-font-weight:normal'>Lower</b> |
| property in the <b style='mso-bidi-font-weight:normal'>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'>14) |
| Enter a value (i.e. *) for the <b style='mso-bidi-font-weight:normal'>Upper</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 associations from 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_i1096" type="#_x0000_t75" style='width:699pt;height:643.5pt'> |
| <v:imagedata src="article_files/image015.png" o:title=""/> |
| </v:shape><![endif]--><![if !vml]><img border=0 width=932 height=858 |
| src="article_files/image016.jpg" v:shapes="_x0000_i1096"><![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 an association between |
| two specified types, with ends that have the specified upper bounds, lower |
| bounds, role names, aggregation kinds, and <span class=SpellE>navigabilities</span>.</p> |
| |
| <pre style='margin-left:9.0pt'><span style='mso-tab-count:1'> </span><span |
| class=GramE>protected</span> static Association <span class=SpellE>createAssociation</span>(Type type1,</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span><span |
| class=SpellE><span class=GramE>boolean</span></span> end1IsNavigable, <span |
| class=SpellE>AggregationKind</span> end1Aggregation,</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>String end1Name, <span |
| class=SpellE>int</span> end1LowerBound, <span class=SpellE>int</span> end1UpperBound,</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>Type type2, <span |
| class=SpellE><span class=GramE>boolean</span></span> end2IsNavigable,</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span><span |
| class=SpellE>AggregationKind</span> end2Aggregation, String end2Name,</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span><span |
| class=SpellE><span class=GramE>int</span></span> end2LowerBound, <span |
| class=SpellE>int</span> end2UpperBound) {</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_i1074" |
| src="../../../../images/tag_1.gif" align=CENTER><span style='mso-tab-count: |
| 2'> </span>Association <span class=SpellE>association</span> = <span |
| class=GramE>type1.createAssociation(</span>end1IsNavigable,</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>end1Aggregation, end1Name, end1LowerBound, end1UpperBound, type2,</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>end2IsNavigable, end2Aggregation, end2Name, end2LowerBound,</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>end2UpperBound);</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>"Association ");</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> (null == end1Name || 0 == end1Name.length()) {</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </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:3'> </span><span |
| class=SpellE><span class=GramE>sb.append</span></span><span class=GramE>(</span>type1.getQualifiedName());</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </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>} else {</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </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:3'> </span><span |
| class=SpellE><span class=GramE>sb.append</span></span><span class=GramE>(</span>type1.getQualifiedName());</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span><span |
| class=SpellE><span class=GramE>sb.append</span></span><span class=GramE>(</span><span |
| class=SpellE>NamedElement.SEPARATOR</span>);</pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:3'> </span><span class=SpellE><span |
| class=GramE>sb.append</span></span><span class=GramE>(</span>end1Name);</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </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>}</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>end1LowerBound);</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> == end1UpperBound</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>end1UpperBound));</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>end2IsNavigable</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>: '-');</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>end1IsNavigable</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>: '-');</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>'</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>if</span> (null == end2Name || 0 == end2Name.length()) {</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </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:3'> </span><span |
| class=SpellE><span class=GramE>sb.append</span></span><span class=GramE>(</span>type2.getQualifiedName());</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </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>} else {</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </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:3'> </span><span |
| class=SpellE><span class=GramE>sb.append</span></span><span class=GramE>(</span>type2.getQualifiedName());</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span><span |
| class=SpellE><span class=GramE>sb.append</span></span><span class=GramE>(</span><span |
| class=SpellE>NamedElement.SEPARATOR</span>);</pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:3'> </span><span class=SpellE><span |
| class=GramE>sb.append</span></span><span class=GramE>(</span>end2Name);</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </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>}</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>end2LowerBound);</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> == end2UpperBound</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>end2UpperBound));</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> association;</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 first end type that creates an |
| association (and its ends) between it and another type <img border=0 width=24 |
| height=13 id="_x0000_i1075" 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 |
| package namespace) and with the specified upper bounds, lower bounds, role |
| names, aggregation kinds, and <span class=SpellE>navigabilities</span>. The |
| owners of the association ends (properties) are based on the specified <span |
| class=SpellE>navigabilities</span> navigable ends are owned by the end type |
| if allowed, otherwise they are owned by the association; non-navigable ends are |
| owned by the association.</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_i1076" src="../../../../images/tip.gif"><span |
| style='mso-spacerun:yes'> </span>The <span class=SpellE><code>NamedElement.SEPARATOR</code></span> |
| constant represents the standard separator (<b>::</b>) used in qualified names.</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 unidirectional |
| composition (composite association) between classes Supplier and <span |
| class=SpellE>PurchaseOrder</span> in model epo2 as follows:</p> |
| |
| <pre style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span><span |
| class=SpellE><span class=GramE>createAssociation</span></span><span |
| class=GramE>(</span><span class=SpellE>supplierClass</span>, true,</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span><span |
| class=SpellE>AggregationKind.COMPOSITE_LITERAL</span>, "orders", 0,</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span><span |
| class=SpellE>LiteralUnlimitedNatural.UNLIMITED</span>, <span class=SpellE>purchaseOrderClass</span>,</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>false, <span |
| class=SpellE>AggregationKind.NONE_LITERAL</span>, "", 1, 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_i1077" src="../../../../images/tryit.gif"><span |
| style='mso-spacerun:yes'> </span>Write code to programmatically create the |
| remaining associations from 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'>Saving |
| 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'>Now |
| that weve spent all this time creating a model, wed better save our work. |
| When we created our model 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 model as XMI to our file on disk (i.e. <code>ExtendedPO2.uml</code>). To |
| save 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) |
| 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 model 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_i1078" src="../../../../images/tag_1.gif" |
| align=CENTER><span style='mso-tab-count:2'> </span>Resource <span |
| class=SpellE>resource</span> = new <span class=SpellE><span class=GramE>ResourceSetImpl</span></span><span |
| class=GramE>(</span>).<span class=SpellE>createResource</span>(<span |
| class=SpellE>uri</span>);</pre><pre style='margin-left:9.0pt'><img border=0 |
| width=24 height=13 id="_x0000_i1079" 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_i1080" |
| 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_i1081" |
| 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 create a resource set <img border=0 width=24 height=13 id="_x0000_i1082" |
| src="../../../../images/tag_1.gif" align=CENTER><span |
| style='mso-spacerun:yes'> </span>and a resource with the specified URI, add the |
| package to the resources contents <img border=0 width=24 height=13 |
| id="_x0000_i1083" src="../../../../images/tag_2.gif" align=CENTER>, and ask the |
| resource to save itself <img border=0 width=24 height=13 id="_x0000_i1084" |
| 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_i1085" |
| 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 epo2 model to |
| a resource with URI ExtendedPO2.uml (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>epo2Model, <span class=SpellE>URI.createURI</span>(<span |
| class=SpellE>args</span>[0]).<span class=SpellE>appendSegment</span>("ExtendedPO2")</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.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_i1086" src="../../../../images/tip.gif"><span |
| style='mso-spacerun:yes'> </span>The <span class=SpellE><code>UMLResource.FILE_EXTENSION</code></span> |
| constant represents the file extension for UML resources (<code>.<span |
| class=SpellE>uml</span></code>). Note that the <span class=SpellE><code>UMLResource</code></span> |
| interface contains a number of constants that you will find useful when working |
| with UML resources.</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 a simple model |
| 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 get you started. |
| 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'><span |
| class=GramE>[1] 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., Boston, MA, 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>GettingStartedWithUML2</code> |
| class as a Java application with a file URI (e.g. file:/C:/Getting <span |
| class=GramE>Started</span> with UML2) as a program 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'><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 United |
| States, other countries, or both.</span></p> |
| |
| </div> |
| |
| </body> |
| |
| </html> |