| <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="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> |
| <!--[if gte mso 9]><xml> |
| <o:DocumentProperties> |
| <o:Author>khussey</o:Author> |
| <o:Template>Normal</o:Template> |
| <o:LastAuthor>Kenn Hussey</o:LastAuthor> |
| <o:Revision>114</o:Revision> |
| <o:TotalTime>5197</o:TotalTime> |
| <o:Created>2004-07-06T14:17:00Z</o:Created> |
| <o:LastSaved>2006-07-18T14:42:00Z</o:LastSaved> |
| <o:Pages>1</o:Pages> |
| <o:Words>5032</o:Words> |
| <o:Characters>28686</o:Characters> |
| <o:Company>Rational Software</o:Company> |
| <o:Lines>239</o:Lines> |
| <o:Paragraphs>67</o:Paragraphs> |
| <o:CharactersWithSpaces>33651</o:CharactersWithSpaces> |
| <o:Version>10.6804</o:Version> |
| </o:DocumentProperties> |
| </xml><![endif]--><!--[if gte mso 9]><xml> |
| <w:WordDocument> |
| <w:GrammarState>Clean</w:GrammarState> |
| <w:Compatibility> |
| <w:ApplyBreakingRules/> |
| </w:Compatibility> |
| <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> |
| </w:WordDocument> |
| </xml><![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:"\FF2D\FF33 \660E\671D"; |
| mso-font-charset:128; |
| mso-generic-font-family:roman; |
| mso-font-format:other; |
| mso-font-pitch:fixed; |
| mso-font-signature:1 134676480 16 0 131072 0;} |
| @font-face |
| {font-family:Verdana; |
| panose-1:2 11 6 4 3 5 4 4 2 4; |
| mso-font-charset:0; |
| mso-generic-font-family:swiss; |
| mso-font-pitch:variable; |
| mso-font-signature:536871559 0 0 0 415 0;} |
| @font-face |
| {font-family:"\@MS Mincho"; |
| 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 |
| {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.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;} |
| --> |
| </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="15362"/> |
| </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, 2006 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 Kenn Hussey, IBM</b><br> |
| July 18, 2006 </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/downloads/">Eclipse 3.2</a></span>, <span |
| class=MsoHyperlink><a |
| href="http://www.eclipse.org/modeling/emf/downloads/?project=emf">EMF 2.2</a></span>, |
| and <span class=MsoHyperlink><a |
| href="http://www.eclipse.org/modeling/mdt/downloads/?project=uml2">UML2 2.0</a></span> |
| installed.</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: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_i1027" type="#_x0000_t75" style='width:554.25pt; |
| height:406.5pt'> |
| <v:imagedata src="article_files/image001.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_i1028" type="#_x0000_t75" style='width:960pt; |
| height:768pt'> |
| <v:imagedata src="article_files/image003.png" o:title=""/> |
| </v:shape><![endif]--><![if !vml]><img border=0 width=1280 height=1024 |
| src="article_files/image004.jpg" v:shapes="_x0000_i1028"><![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_i1029" src="../../../../images/tag_1.gif" align=CENTER><span |
| style='mso-tab-count:1'> </span><span class=GramE>public</span> static boolean 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_i1030" |
| src="../../../../images/tag_2.gif" align=CENTER><span style='mso-tab-count:3'> </span><span |
| class=GramE>System.out.println(</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_i1031" |
| src="../../../../images/tag_3.gif" align=CENTER><span style='mso-tab-count:2'> </span><span |
| class=GramE>System.err.println(</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_i1032" |
| 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_i1033" 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_i1034" |
| 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 |
| righty 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>Navigator</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_i1035" type="#_x0000_t75" style='width:960pt;height:768pt'> |
| <v:imagedata src="article_files/image005.png" o:title=""/> |
| </v:shape><![endif]--><![if !vml]><img border=0 width=1280 height=1024 |
| src="article_files/image006.jpg" v:shapes="_x0000_i1035"><![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 createModel(String name) {</pre><pre |
| style='margin-left:9.0pt'><img border=0 width=24 height=14 id="_x0000_i1036" |
| src="../../../../images/tag_1.gif" align=CENTER><span style='mso-tab-count:2'> </span>Model model = <span |
| class=GramE>UMLFactory.eINSTANCE.createModel(</span>);</pre><pre |
| style='margin-left:9.0pt'><img border=0 width=24 height=14 id="_x0000_i1037" |
| src="../../../../images/tag_2.gif" align=CENTER><span style='mso-tab-count:2'> </span><span |
| class=GramE>model.setName(</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_i1038" |
| src="../../../../images/tag_3.gif" align=CENTER><span style='mso-tab-count:2'> </span><span |
| class=GramE>out(</span>"Model '" + model.getQualifiedName() + "' 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_i1039" 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_i1040" 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_i1041" |
| src="../../../../images/tag_2.gif" align=CENTER>. Then, we output information <img |
| border=0 width=24 height=14 id="_x0000_i1042" 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_i1043" 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_i1044" 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=GramE>createModel(</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 (<i style='mso-bidi-font-style:normal'>packageable |
| 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> foo</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 createPackage(</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span><span |
| class=GramE>org.eclipse.uml2.uml.Package</span> nestingPackage, String name) {</pre><pre |
| style='margin-left:9.0pt'><img border=0 width=24 height=14 id="_x0000_i1045" |
| src="../../../../images/tag_1.gif" align=CENTER><span style='mso-tab-count:2'> </span>org.eclipse.uml2.uml.Package package_ = nestingPackage</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>.<span |
| class=GramE>createNestedPackage(</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 '" + package_.getQualifiedName() + "' 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_i1046" |
| 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_i1047" 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 (<code>packagedElement</code>) |
| that can contain packageable elements, so we could obtain the Ecore class of |
| the type of (packageable) element we want to create (i.e. <code>Package</code>) |
| from the UML Ecore package singleton, and pass it to the <span class=GramE><code>createPackagedElement(</code></span><code>String, |
| EClass)</code> factory method. Instead, we use the more convenient <span |
| class=GramE><code>createNestedPackage(</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 foo 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> barPackage = createPackage(fooPackage, "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>, <code>UnlimitedNatural</code>, 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. int) 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_i1048" 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_i1049" type="#_x0000_t75" style='width:960pt;height:768pt'> |
| <v:imagedata src="article_files/image007.png" o:title=""/> |
| </v:shape><![endif]--><![if !vml]><img border=0 width=1280 height=1024 |
| src="article_files/image008.jpg" v:shapes="_x0000_i1049"><![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 PrimitiveType createPrimitiveType(</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>PrimitiveType primitiveType = (PrimitiveType) package_</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>.<span |
| class=GramE>createOwnedPrimitiveType(</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 '" + primitiveType.getQualifiedName()</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> primitiveType;</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=GramE><code>createOwnedPrimitiveType(</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 a primitive type |
| named int in model epo2 as follows:</p> |
| |
| <pre style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span>PrimitiveType intPrimitiveType = <span |
| class=GramE>createPrimitiveType(</span>epo2Model, "int");</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_i1052" 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. OrderStatus) 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_i1053" type="#_x0000_t75" style='width:960pt;height:768pt'> |
| <v:imagedata src="article_files/image009.png" o:title=""/> |
| </v:shape><![endif]--><![if !vml]><img border=0 width=1280 height=1024 |
| src="article_files/image010.jpg" v:shapes="_x0000_i1053"><![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 createEnumeration(</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_i1054" |
| src="../../../../images/tag_1.gif" align=CENTER><span style='mso-tab-count:2'> </span>Enumeration enumeration = (Enumeration) package_</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>.<span |
| class=GramE>createOwnedEnumeraton(</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 '" + enumeration.getQualifiedName() + "' 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=GramE><code>createOwnedEnumeration(</code></span><code>String)</code> |
| convenience factory method <img border=0 width=24 height=13 id="_x0000_i1055" |
| 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 OrderStatus in model epo2 as follows:</p> |
| |
| <pre style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span>Enumeration orderStatusEnumeration = <span |
| class=GramE>createEnumeration(</span>epo2Model,</pre><pre style='margin-left: |
| 9.0pt'><span style='mso-tab-count:3'> </span>"OrderStatus");</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> OrderStatus</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 > 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_i1056" 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_i1057" type="#_x0000_t75" style='width:960pt;height:768pt'> |
| <v:imagedata src="article_files/image011.png" o:title=""/> |
| </v:shape><![endif]--><![if !vml]><img border=0 width=1280 height=1024 |
| src="article_files/image012.jpg" v:shapes="_x0000_i1057"><![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 EnumerationLiteral createEnumerationLiteral(</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>Enumeration enumeration, String name) {</pre><pre |
| style='margin-left:9.0pt'><img border=0 width=24 height=13 id="_x0000_i1058" |
| src="../../../../images/tag_1.gif" align=CENTER><span style='mso-tab-count:2'> </span>EnumerationLiteral enumerationLiteral = enumeration</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>.<span |
| class=GramE>createOwnedLiteral(</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 '" + enumerationLiteral.getQualifiedName()</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> enumerationLiteral;</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=GramE><code>createOwnedLiteral(</code></span><code>String)</code> |
| convenience factory method <img border=0 width=24 height=13 id="_x0000_i1059" |
| 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 OrderStatus as follows:</p> |
| |
| <pre style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span><span |
| class=GramE>createEnumerationLiteral(</span>orderStatusEnumeration, "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_i1060" 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_i1061" 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_i1062" type="#_x0000_t75" style='width:960pt;height:768pt'> |
| <v:imagedata src="article_files/image013.png" o:title=""/> |
| </v:shape><![endif]--><![if !vml]><img border=0 width=1280 height=1024 |
| src="article_files/image014.jpg" v:shapes="_x0000_i1062"><![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 createClass(</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>org.eclipse.uml2.uml.Package package_, String name, <span |
| class=GramE>boolean</span> isAbstract) {</pre><pre style='margin-left:9.0pt'><img |
| border=0 width=24 height=13 id="_x0000_i1063" src="../../../../images/tag_1.gif" |
| align=CENTER><span style='mso-tab-count:2'> </span>org.eclipse.uml2.uml.Class class_ = package_.<span |
| class=GramE>createOwnedClass(</span>name,</pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:3'> </span><span class=GramE>isAbstract</span>);</pre><pre |
| style='margin-left:9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:2'> </span><span class=GramE>out(</span>"Class '" + class_.getQualifiedName() + "' 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=GramE><code>createOwnedClass(</code></span><code>String, |
| boolean)</code> convenience factory method <img border=0 width=24 height=13 |
| id="_x0000_i1064" 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 <code>isAbstract</code> |
| attribute of the class based on the specified <code>boolean</code> 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_i1065" 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 <code>java.lang.Class</code> |
| and <code>java.lang.Package</code>, 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> supplierClass = createClass(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_i1066" 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> USAddress</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</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_i1067" 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_i1068" type="#_x0000_t75" style='width:960pt;height:768pt'> |
| <v:imagedata src="article_files/image015.png" o:title=""/> |
| </v:shape><![endif]--><![if !vml]><img border=0 width=1280 height=1024 |
| src="article_files/image016.jpg" v:shapes="_x0000_i1068"><![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 createGeneralization(</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>Classifier specificClassifier, Classifier generalClassifier) {</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span>Generalization generalization = specificClassifier</pre><pre |
| style='margin-left:9.0pt'><img border=0 width=24 height=13 id="_x0000_i1069" |
| src="../../../../images/tag_1.gif" align=CENTER><span style='mso-tab-count:3'> </span>.<span |
| class=GramE>createGeneralization(</span>generalClassifier);</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 " + specificClassifier.getQualifiedName() + " ->> "</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>+ <span |
| class=GramE>generalClassifier.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> generalization;</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:1'> </span>}</pre> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Here |
| we call a convenience factory method on the specific classifier that creates a |
| generalization <img border=0 width=24 height=13 id="_x0000_i1070" |
| src="../../../../images/tag_1.gif" align=CENTER><span |
| style='mso-spacerun:yes'> </span>as one of its children and sets the general |
| classifier to the specified argument.</p> |
| |
| <p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>OK, |
| lets see this method in action. For example, we could create a generalization |
| between specific class USAddress and general class Address as follows:</p> |
| |
| <pre style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span><span |
| class=GramE>createGeneralization(</span>usAddressClass, addressClass);</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 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_i1072" 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>, <code>DataType</code>, <code>Interface</code>, |
| <code>Signal</code>, and <code>StructuredClassifier</code> (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> Supplier</b>) in the UML editor.</p> |
| |
| <p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>2) |
| Right-click and select the <b>New Child > 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_i1073" 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_i1074" 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_i1075" type="#_x0000_t75" style='width:960pt;height:768pt'> |
| <v:imagedata src="article_files/image017.png" o:title=""/> |
| </v:shape><![endif]--><![if !vml]><img border=0 width=1280 height=1024 |
| src="article_files/image018.jpg" v:shapes="_x0000_i1075"><![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 createAttribute(org.eclipse.uml2.uml.Class class_,</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>String name, Type type, int lowerBound, int upperBound) {</pre><pre |
| style='margin-left:9.0pt'><img border=0 width=24 height=13 id="_x0000_i1076" |
| src="../../../../images/tag_1.gif" align=CENTER><span style='mso-tab-count:2'> </span>Property attribute = class_.<span |
| class=GramE>createOwnedAttribute(</span>name, type,</pre><pre style='margin-left: |
| 9.0pt'><span style='mso-tab-count:3'> </span><span |
| class=GramE>lowerBound</span>, upperBound);</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>StringBuffer sb = new <span |
| class=GramE>StringBuffer(</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>sb.append(</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=GramE>sb.append(</span>attribute.getQualifiedName());</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>sb.append(</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>sb.append(</span>type.getQualifiedName());</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>sb.append(</span>" [");</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span><span |
| class=GramE>sb.append(</span>lowerBound);</pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:2'> </span><span class=GramE>sb.append(</span>"..");</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span><span |
| class=GramE>sb.append(</span>LiteralUnlimitedNatural.UNLIMITED == upperBound</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=GramE>String.valueOf(</span>upperBound));</pre><pre style='margin-left: |
| 9.0pt'><span style='mso-tab-count:2'> </span><span class=GramE>sb.append(</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>sb.append(</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>sb.toString());</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 <code>createOwnedAttribute(String, Type, int, int)</code> convenience |
| factory method <img border=0 width=24 height=13 id="_x0000_i1077" |
| 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_i1078" src="../../../../images/tip.gif"><span |
| style='mso-spacerun:yes'> </span>The <code>LiteralUnlimitedNatural.UNLIMITED</code> |
| 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=GramE>createAttribute(</span>supplierClass, "name", stringPrimitiveType, 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_i1079" 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_i1080" 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. A_supplier_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'>4) |
| <span class=GramE>Select</span> the association (i.e. <<b>Association> |
| A_supplier_orders</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 > 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 > 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_supplier_orders</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_i1081" 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_i1082" type="#_x0000_t75" style='width:960pt;height:768pt'> |
| <v:imagedata src="article_files/image019.png" o:title=""/> |
| </v:shape><![endif]--><![if !vml]><img border=0 width=1280 height=1024 |
| src="article_files/image020.jpg" v:shapes="_x0000_i1082"><![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 navigabilities.</p> |
| |
| <pre style='margin-left:9.0pt'><span style='mso-tab-count:1'> </span><span |
| class=GramE>protected</span> static Association createAssociation(Type type1,</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span><span |
| class=GramE>boolean</span> end1IsNavigable, AggregationKind end1Aggregation,</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:1'> </span><span |
| style='mso-tab-count:2'> </span>String end1Name, int end1LowerBound, int end1UpperBound,</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>Type type2, <span |
| class=GramE>boolean</span> end2IsNavigable,</pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:3'> </span>AggregationKind end2Aggregation, String end2Name,</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span><span |
| class=GramE>int</span> end2LowerBound, int 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_i1083" src="../../../../images/tag_1.gif" |
| align=CENTER><span style='mso-tab-count:2'> </span>Association association = <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>StringBuffer sb = new <span |
| class=GramE>StringBuffer(</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>sb.append(</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=GramE>sb.append(</span>'{');</pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:3'> </span><span class=GramE>sb.append(</span>type1.getQualifiedName());</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span><span |
| class=GramE>sb.append(</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=GramE>sb.append(</span>"'");</pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:3'> </span><span class=GramE>sb.append(</span>type1.getQualifiedName());</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span><span |
| class=GramE>sb.append(</span>NamedElement.SEPARATOR);</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span><span |
| class=GramE>sb.append(</span>end1Name);</pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:3'> </span><span class=GramE>sb.append(</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=GramE>sb.append(</span>" [");</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span><span |
| class=GramE>sb.append(</span>end1LowerBound);</pre><pre style='margin-left: |
| 9.0pt'><span style='mso-tab-count:2'> </span><span class=GramE>sb.append(</span>"..");</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span><span |
| class=GramE>sb.append(</span>LiteralUnlimitedNatural.UNLIMITED == 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:1'> </span><span |
| style='mso-tab-count:2'> </span>: <span class=GramE>String.valueOf(</span>end1UpperBound));</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span><span |
| class=GramE>sb.append(</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>sb.append(</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=GramE>sb.append(</span>'-');</pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:2'> </span><span class=GramE>sb.append(</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=GramE>sb.append(</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=GramE>sb.append(</span>'{');</pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:3'> </span><span class=GramE>sb.append(</span>type2.getQualifiedName());</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span><span |
| class=GramE>sb.append(</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=GramE>sb.append(</span>"'");</pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:3'> </span><span class=GramE>sb.append(</span>type2.getQualifiedName());</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span><span |
| class=GramE>sb.append(</span>NamedElement.SEPARATOR);</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span><span |
| class=GramE>sb.append(</span>end2Name);</pre><pre style='margin-left:9.0pt'><span |
| style='mso-tab-count:3'> </span><span class=GramE>sb.append(</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=GramE>sb.append(</span>" [");</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span><span |
| class=GramE>sb.append(</span>end2LowerBound);</pre><pre style='margin-left: |
| 9.0pt'><span style='mso-tab-count:2'> </span><span class=GramE>sb.append(</span>"..");</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span><span |
| class=GramE>sb.append(</span>LiteralUnlimitedNatural.UNLIMITED == 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=GramE>String.valueOf(</span>end2UpperBound));</pre><pre style='margin-left: |
| 9.0pt'><span style='mso-tab-count:2'> </span><span class=GramE>sb.append(</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>sb.append(</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>sb.toString());</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_i1084" 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 navigabilities. The owners of the association |
| ends (properties) are based on the specified navigabilities 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_i1085" src="../../../../images/tip.gif"><span |
| style='mso-spacerun:yes'> </span>The <code>NamedElement.SEPARATOR</code> 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 |
| PurchaseOrder in model epo2 as follows:</p> |
| |
| <pre style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span><span |
| class=GramE>createAssociation(</span>supplierClass, true,</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>AggregationKind.COMPOSITE_LITERAL, "orders", 0,</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>LiteralUnlimitedNatural.UNLIMITED, purchaseOrderClass,</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>false, AggregationKind.NONE_LITERAL, "", 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_i1086" 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 uri) {</pre><pre |
| style='margin-left:9.0pt'><img border=0 width=24 height=13 id="_x0000_i1087" |
| src="../../../../images/tag_1.gif" align=CENTER><span style='mso-tab-count:2'> </span>Resource resource = new <span |
| class=GramE>ResourceSetImpl(</span>).createResource(uri);</pre><pre |
| style='margin-left:9.0pt'><img border=0 width=24 height=13 id="_x0000_i1088" |
| src="../../../../images/tag_2.gif" align=CENTER><span style='mso-tab-count:2'> </span><span |
| class=GramE>resource.getContents(</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_i1089" |
| src="../../../../images/tag_3.gif" align=CENTER><span style='mso-tab-count:3'> </span><span |
| class=GramE>resource.save(</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 (IOException ioe) {</pre><pre |
| style='margin-left:9.0pt'><img border=0 width=24 height=13 id="_x0000_i1090" |
| src="../../../../images/tag_4.gif" align=CENTER><span style='mso-tab-count:3'> </span><span |
| class=GramE>err(</span>ioe.getMessage());</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_i1091" |
| 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_i1092" src="../../../../images/tag_2.gif" align=CENTER>, and ask the |
| resource to save itself <img border=0 width=24 height=13 id="_x0000_i1093" |
| 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_i1094" |
| 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, URI.createURI(args[0]).appendSegment("ExtendedPO2")</pre><pre |
| style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>.<span |
| class=GramE>appendFileExtension(</span>UMLResource.FILE_EXTENSION));</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_i1095" src="../../../../images/tip.gif"><span |
| style='mso-spacerun:yes'> </span>The <code>UMLResource.FILE_EXTENSION</code> |
| constant represents the file extension for UML resources (<code>.uml</code>). |
| Note that the <code>UMLResource</code> 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. Budinsky, D. Steinberg, E. Merks, R. Ellersick, and T. J. |
| Grose.</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> |