diff options
Diffstat (limited to 'mdt/uml2/docs/articles/Introduction_to_UML2_Profiles/article.html')
-rw-r--r-- | mdt/uml2/docs/articles/Introduction_to_UML2_Profiles/article.html | 2155 |
1 files changed, 0 insertions, 2155 deletions
diff --git a/mdt/uml2/docs/articles/Introduction_to_UML2_Profiles/article.html b/mdt/uml2/docs/articles/Introduction_to_UML2_Profiles/article.html deleted file mode 100644 index 961779d3..00000000 --- a/mdt/uml2/docs/articles/Introduction_to_UML2_Profiles/article.html +++ /dev/null @@ -1,2155 +0,0 @@ -<html xmlns:v="urn:schemas-microsoft-com:vml" -xmlns:o="urn:schemas-microsoft-com:office:office" -xmlns:w="urn:schemas-microsoft-com:office:word" -xmlns:st1="urn:schemas-microsoft-com:office:smarttags" -xmlns="http://www.w3.org/TR/REC-html40"> - -<head> -<meta http-equiv=Content-Type content="text/html; charset=windows-1252"> -<meta name=ProgId content=Word.Document> -<meta name=Generator content="Microsoft Word 10"> -<meta name=Originator content="Microsoft Word 10"> -<link rel=File-List href="article_files/filelist.xml"> -<link rel=Edit-Time-Data href="article_files/editdata.mso"> -<!--[if !mso]> -<style> -v\:* {behavior:url(#default#VML);} -o\:* {behavior:url(#default#VML);} -w\:* {behavior:url(#default#VML);} -.shape {behavior:url(#default#VML);} -</style> -<![endif]--> -<title>Introduction to UML2 Profiles</title> -<o:SmartTagType namespaceuri="urn:schemas-microsoft-com:office:smarttags" - name="country-region"/> -<o:SmartTagType namespaceuri="urn:schemas-microsoft-com:office:smarttags" - name="place"/> -<o:SmartTagType namespaceuri="urn:schemas-microsoft-com:office:smarttags" - name="State"/> -<o:SmartTagType namespaceuri="urn:schemas-microsoft-com:office:smarttags" - name="City"/> -<o:SmartTagType namespaceuri="urn:schemas-microsoft-com:office:smarttags" - name="date"/> -<!--[if gte mso 9]><xml> - <o:DocumentProperties> - <o:Author>khussey</o:Author> - <o:Template>Normal</o:Template> - <o:LastAuthor>Kenn Hussey</o:LastAuthor> - <o:Revision>164</o:Revision> - <o:TotalTime>4670</o:TotalTime> - <o:Created>2004-10-25T17:54:00Z</o:Created> - <o:LastSaved>2006-07-18T18:25:00Z</o:LastSaved> - <o:Pages>16</o:Pages> - <o:Words>8130</o:Words> - <o:Characters>46343</o:Characters> - <o:Company>Rational Software</o:Company> - <o:Lines>386</o:Lines> - <o:Paragraphs>108</o:Paragraphs> - <o:CharactersWithSpaces>54365</o:CharactersWithSpaces> - <o:Version>10.6735</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:"\FF2D\FF33 \660E\671D"; - 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: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"; - 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 - {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;} ---> -</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="9218"/> -</xml><![endif]--><!--[if gte mso 9]><xml> - <o:shapelayout v:ext="edit"> - <o:idmap v:ext="edit" data="1"/> - </o:shapelayout></xml><![endif]--> -</head> - -<body lang=EN-US link=blue vlink=purple style='tab-interval:.5in;margin-left: -8.5pt;margin-top:14.2pt'> - -<div class=Section1> - -<p class=MsoNormal align=right style='text-align:right'><span style='font-size: -10.0pt;font-family:Arial'> </span><span style='font-size:10.0pt'>Copyright -© 2004, 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><span style='font-size:10.0pt;font-family:Arial'><o:p> </o:p></span></p> - </td> - </tr> -</table> - -</div> - -<h1><img width=120 height=86 id="_x0000_i1025" src="../../../../images/Idea.jpg" -align=CENTER></h1> - -<p> </p> - -<h1 align=center style='text-align:center'>Introduction to UML2 Profiles</h1> - -<blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'> - -<p class=MsoNormal><b><span style='font-size:10.0pt;font-family:Arial'>Summary</span></b><span -style='font-size:10.0pt;font-family:Arial'> <br> -This article describes how to work with profiles using the UML2 plug-ins for -Eclipse. In particular, it gives an overview of how to create and apply -profiles (and their contents) both programmatically and by using the sample UML -editor<o:p></o:p></span></p> - -<p><span class=SpellE><b>Kenn</b></span><b> Hussey, IBM</b><br> -<st1:date Year="2006" Day="18" Month="7">July 18, 2006</st1:date></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 work with UML2 profiles (and to follow along with the example in this -article), you must have <span class=MsoHyperlink><a -href="http://www.eclipse.org/downloads/index.php">Eclipse 3.2</a></span>, <span -class=MsoHyperlink>EMF 2.2</span>, and <span class=MsoHyperlink>UML2 2.0</span> -installed.</p> - -<h2>Introduction</h2> - -<p>This article will walk you through the basics of creating and applying -profiles using UML2. Using a subset of the <span class=SpellE>Ecore</span> -profile (see below) and the model we described in the “Getting Started with -UML2” article [1] (the ExtendedPO2 model, shamelessly “borrowed” from the EMF -“bible” [2]) as an example, we’ll look at what’s involved in creating some of -the more common elements that make up a profile. For each type of element, -we’ll first explain the creation process using the sample UML editor and -explore how to accomplish the same thing using Java code. Then we’ll look at -what’s involved in applying profiles and stereotypes to models. 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_i1142" type="#_x0000_t75" style='width:581.25pt; - height:407.25pt'> - <v:imagedata src="article_files/image001.emz" o:title=""/> -</v:shape><![endif]--><![if !vml]><img border=0 width=775 height=543 -src="article_files/image002.gif" v:shapes="_x0000_i1142"><![endif]><o:p></o:p></p> - -<p>As described in the EMF book, some of the attributes of certain <span -class=SpellE>Ecore</span> elements cannot be expressed directly in UML™. EMF -provides a Rose property file (<span class=SpellE><span style='font-family: -"Courier New"'>ecore.pty</span></span>) that defines all the non- UML™ -properties needed to completely express an EMF model using Rational Rose. The -same thing can be achieved for a UML2 model using a profile.</p> - -<p>The <span class=SpellE>Ecore</span> properties for attributes are shown -below. These properties can be expressed in UML2 as properties owned by a -stereotype that extends the <span style='font-family:"Courier New"'>Property</span> -<span class=SpellE>metaclass</span>.</p> - -<p><!--[if gte vml 1]><v:shape id="_x0000_i1027" type="#_x0000_t75" style='width:258pt; - height:306.75pt'> - <v:imagedata src="article_files/image003.png" o:title=""/> -</v:shape><![endif]--><![if !vml]><img border=0 width=344 height=409 -src="article_files/image004.jpg" v:shapes="_x0000_i1027"><![endif]></p> - -<p>The <span class=SpellE>Ecore</span> properties for association ends are -shown below. These properties can also be expressed in UML2 as properties owned -by a stereotype that extends the <span style='font-family:"Courier New"'>Property</span> -<span class=SpellE>metaclass</span>.</p> - -<p><!--[if gte vml 1]><v:shape id="_x0000_i1028" type="#_x0000_t75" style='width:258pt; - height:320.25pt'> - <v:imagedata src="article_files/image005.png" o:title=""/> -</v:shape><![endif]--><![if !vml]><img border=0 width=344 height=427 -src="article_files/image006.jpg" v:shapes="_x0000_i1028"><![endif]></p> - -<h2>Getting Started</h2> - -<p>Before getting started, you’ll need to create a simple project in your -workspace. This project will serve as the container for the profile that we’ll -create using the UML editor. To create a simple project for this article, -follow these steps:</p> - -<p style='margin-left:27.5pt'>1) Select the <b>Window > Open Perspective -> <span class=GramE>Other</span>…</b> menu item.</p> - -<p style='margin-left:27.5pt'>2) Select the <b>Resource</b> perspective and -press the <b>OK</b> button.</p> - -<p style='margin-left:27.5pt'>3) Select the <b>File > New > Project...</b> -menu item.</p> - -<p style='margin-left:27.5pt'>4) Select the <b>Project</b> wizard from the <b>General</b> -category and press the <b>Next ></b> button.</p> - -<p style='margin-left:27.5pt'>5) Enter a project name (i.e. “Introduction to -UML2 Profiles”), and press the <b>Finish</b> button.</p> - -<p>At this point your workspace should look something like this:</p> - -<p><!--[if gte vml 1]><v:shape id="_x0000_i1029" 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_i1029"><![endif]></p> - -<p>OK, that should be enough to get us going with the UML editor. Now, to -follow along with the programmatic approach to creating profiles, we’ll assume -that you’ve created a Java class (named, say, “IntroductionToUML2Profiles”) in -which you can write some code to construct our sample profile. The code -snippets we’ll show assume you’ve defined the following utility methods to give -the user information on the program’s status:</p> - -<pre style='margin-left:9.0pt'><img border=0 width=24 height=14 -id="_x0000_i1030" src="../../../../images/tag_1.gif" align=CENTER><span -style='mso-tab-count:1'> </span><span class=GramE>public</span> static <span -class=SpellE>boolean</span> DEBUG = true;</pre><pre style='margin-left:9.0pt'><o:p> </o:p></pre><pre -style='margin-left:9.0pt'><span style='mso-tab-count:1'> </span><span -class=GramE>protected</span> static void out(String output) {</pre><pre -style='margin-left:9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><span -style='mso-tab-count:2'> </span><span class=GramE>if</span> (DEBUG) {</pre><pre -style='margin-left:9.0pt'><img border=0 width=24 height=14 id="_x0000_i1031" -src="../../../../images/tag_2.gif" align=CENTER><span style='mso-tab-count:3'> </span><span -class=SpellE><span class=GramE>System.out.println</span></span><span -class=GramE>(</span>output);</pre><pre style='margin-left:9.0pt'><span -style='mso-tab-count:2'> </span>}</pre><pre style='margin-left:9.0pt'><span -style='mso-tab-count:1'> </span>}</pre><pre style='margin-left:9.0pt'><o:p> </o:p></pre><pre -style='margin-left:9.0pt'><span style='mso-tab-count:1'> </span><span -class=GramE>protected</span> static void err(String error) {</pre><pre -style='margin-left:9.0pt'><img border=0 width=24 height=14 id="_x0000_i1032" -src="../../../../images/tag_3.gif" align=CENTER><span style='mso-tab-count:2'> </span><span -class=SpellE><span class=GramE>System.err.println</span></span><span -class=GramE>(</span>error);</pre><pre style='margin-left:9.0pt'><span -style='mso-tab-count:1'> </span>}</pre> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>A -static debug flag <img border=0 width=24 height=14 id="_x0000_i1033" -src="../../../../images/tag_1.gif" align=CENTER><span -style='mso-spacerun:yes'> </span>can be used to enable or disable verbose -information printed to the system’s output <span class=GramE>stream </span><img -border=0 width=24 height=14 id="_x0000_i1034" src="../../../../images/tag_2.gif" -align=CENTER>. Errors will always be printed to the system’s error <span -class=GramE>stream </span><img border=0 width=24 height=14 id="_x0000_i1035" -src="../../../../images/tag_3.gif" align=CENTER>.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>All -<span class=SpellE>righty</span> then! In each of the following subsections, -we’ll look at how to create or manipulate a different kind of UML element, -starting with profiles.</p> - -<h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Creating -Profiles</h3> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>At -the root of every UML2 profile is a profile element. It defines limited -extensions to a reference <span class=SpellE>metamodel</span> (i.e. UML) with -the purpose of adapting the <span class=SpellE>metamodel</span> to a specific -platform or domain (e.g. EMF). <span class=SpellE>Metaclasses</span> from the -reference <span class=SpellE>metamodel</span> are extended via stereotypes, -which are defined as part of profiles. To create a profile using the UML -editor, follow these steps:</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>1) -Select a project (i.e. <b>Introduction to UML2 Profiles</b>) in the <b>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. “<span class=SpellE>Ecore.profile.uml</span>”) and -press the <b>Next ></b> button.</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>4) -Select <b>Profile</b> for the model object and press the <b>Finish</b> button.</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>5) -Select the <b>Window > Show View > Properties</b> menu item.</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>6) -Select the <b>Profile</b> element in the UML editor.</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>7) -Enter a value (i.e. “<span class=SpellE>ecore</span>”) for the <b>Name</b> -property in the <b>Properties</b> view.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img -border=0 width=62 height=13 id="_x0000_i1036" src="../../../../images/tip.gif"><span -style='mso-spacerun:yes'> </span>By convention, resources that contain profiles -end with a <code>.<span class=SpellE>profile.uml</span></code> file extension -in UML2. </p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>At -this point your workspace should look something like this:</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><!--[if gte vml 1]><v:shape - id="_x0000_i1037" 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_i1037"><![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'>Let’s -look at how to perform the same task using Java code. The code snippet below -shows a method that programmatically creates and returns a profile with a specified -name.</p> - -<pre style='margin-left:9.0pt'><span style='mso-tab-count:1'> </span><span -class=GramE>protected</span> static Profile <span class=SpellE>createProfile</span>(String name) {</pre><pre -style='margin-left:9.0pt'><img border=0 width=24 height=14 id="_x0000_i1038" -src="../../../../images/tag_1.gif" align=CENTER><span style='mso-tab-count:2'> </span>Profile <span -class=SpellE>profile</span> = <span class=SpellE><span class=GramE>UMLFactory.eINSTANCE.createProfile</span></span><span -class=GramE>(</span>);</pre><pre style='margin-left:9.0pt'><img border=0 -width=24 height=14 id="_x0000_i1039" src="../../../../images/tag_2.gif" -align=CENTER><span style='mso-tab-count:2'> </span><span class=SpellE><span -class=GramE>profile.setName</span></span><span class=GramE>(</span>name);</pre><pre -style='margin-left:9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><img -border=0 width=24 height=14 id="_x0000_i1040" src="../../../../images/tag_3.gif" -align=CENTER><span style='mso-tab-count:2'> </span><span class=GramE>out(</span>"Profile '" + <span -class=SpellE>profile.getQualifiedName</span>() + "' created.");</pre><pre -style='margin-left:9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><img -border=0 width=24 height=14 id="_x0000_i1041" src="../../../../images/tag_4.gif" -align=CENTER><span style='mso-tab-count:2'> </span><span class=GramE>return</span> profile;</pre><pre -style='margin-left:9.0pt'><span style='mso-tab-count:1'> </span>}</pre> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>First, -we ask the UML factory singleton <img border=0 width=24 height=14 -id="_x0000_i1042" src="../../../../images/tag_1.gif" align=CENTER><span -style='mso-spacerun:yes'> </span>to create a profile, and we set its <span -class=GramE>name </span><img border=0 width=24 height=14 id="_x0000_i1043" -src="../../../../images/tag_2.gif" align=CENTER>. Then, we output information <img -border=0 width=24 height=14 id="_x0000_i1044" src="../../../../images/tag_3.gif" -align=CENTER><span style='mso-spacerun:yes'> </span>to the user to let them -know that the profile has been successfully created. Finally, we return <img -border=0 width=24 height=14 id="_x0000_i1045" src="../../../../images/tag_4.gif" -align=CENTER><span style='mso-spacerun:yes'> </span>the profile. You’ll notice -most, if not all, of the code snippets in this article will follow this pattern -– create the element (and set some properties on it), inform the user, and -return it.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>OK, -let’s see this method in action. For example, we could create a profile named ‘<span -class=SpellE>ecore</span>’ as follows:</p> - -<p style='margin-left:9.0pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span -style='mso-tab-count:2'> </span>Profile <span -class=SpellE>ecoreProfile</span> = <span class=SpellE><span class=GramE>createProfile</span></span><span -class=GramE>(</span>"<span class=SpellE>ecore</span>");</p> - -<h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Importing -Primitive Types</h3> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Just -like a class, a stereotype may have properties, which may be referred to as tag -definitions. The types of these properties may be pre-defined in -(domain-specific) libraries referenced by the profile. A profile can be made to -reference primitive types from libraries (such as those provided in the <span -style='font-family:"Courier New"'>org.eclipse.uml2.uml.resources</span> -plug-in) by creating an import relationship between the profile and the -primitive type. To import a primitive type using the UML editor, follow these -steps:</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>1) -Select a package (i.e. <b style='mso-bidi-font-weight:normal'><<span -style='mso-bidi-font-weight:bold'>Profile> <span class=SpellE>ecore</span></span></b>) -in the UML editor.</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>2) -Select the <b style='mso-bidi-font-weight:normal'>UML Editor > Package > -Import Primitive Type…</b> menu item.</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>3) -Choose a primitive type (i.e. <span class=SpellE><b style='mso-bidi-font-weight: -normal'>UMLPrimitiveTypes::Boolean</b></span>)<span class=GramE>,</span> press -the <b style='mso-bidi-font-weight:normal'>Add</b> button, then press the <b -style='mso-bidi-font-weight:normal'>OK</b> button.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img -border=0 width=61 height=13 id="_x0000_i1046" src="../../../../images/tryit.gif"><span -style='mso-spacerun:yes'> </span>Import the other required primitive type (<span -class=SpellE><b style='mso-bidi-font-weight:normal'>UMLPrimitiveTypes::String</b></span>) -into the <span class=SpellE>Ecore</span> profile using the UML editor.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>At -this point your workspace should look something like this:</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><!--[if gte vml 1]><v:shape - id="_x0000_i1047" 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_i1047"><![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'>Let’s -look at how to perform the same task using Java code. The code snippet below -shows a method that programmatically imports the primitive type with a -specified name from the UML primitive <span class=GramE>types</span> library -into a specified package and returns it.</p> - -<pre style='margin-left:9.0pt'><span style='mso-tab-count:1'> </span><span -class=GramE>protected</span> static <span class=SpellE>PrimitiveType</span> <span -class=SpellE>importPrimitiveType</span>(</pre><pre style='margin-left:9.0pt'><span -style='mso-tab-count:3'> </span>org.eclipse.uml2.uml.Package package_, String name) {</pre><pre -style='margin-left:9.0pt'><img border=0 width=24 height=14 id="_x0000_i1048" -src="../../../../images/tag_1.gif" align=CENTER><span style='mso-tab-count:2'> </span>Model <span -class=SpellE>umlLibrary</span> = (Model) <span class=GramE>load(</span>URI</pre><pre -style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>.<span -class=SpellE><span class=GramE>createURI</span></span><span class=GramE>(</span><span -class=SpellE>UMLResource.UML_PRIMITIVE_TYPES_LIBRARY_URI</span>));</pre><pre -style='margin-left:9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><img -border=0 width=24 height=14 id="_x0000_i1049" src="../../../../images/tag_2.gif" -align=CENTER><span style='mso-tab-count:2'> </span><span class=SpellE>PrimitiveType</span> <span -class=SpellE>primitiveType</span> = (<span class=SpellE>PrimitiveType</span>) <span -class=SpellE>umlLibrary</span></pre><pre style='margin-left:9.0pt'><span -style='mso-tab-count:3'> </span>.<span class=SpellE><span -class=GramE>getOwnedType</span></span><span class=GramE>(</span>name);</pre><pre -style='margin-left:9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><img -border=0 width=24 height=14 id="_x0000_i1050" src="../../../../images/tag_3.gif" -align=CENTER><span style='mso-tab-count:2'> </span><span class=SpellE>package_.<span -class=GramE>createElementImport</span></span><span class=GramE>(</span><span -class=SpellE>primitiveType</span>);</pre><pre style='margin-left:9.0pt'><o:p> </o:p></pre><pre -style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span><span -class=GramE>out(</span>"Primitive type '" + <span class=SpellE>primitiveType.getQualifiedName</span>()</pre><pre -style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>+ "' imported.");</pre><pre -style='margin-left:9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><span -style='mso-tab-count:2'> </span><span class=GramE>return</span> <span -class=SpellE>primitiveType</span>;</pre><pre style='margin-left:9.0pt'><span -style='mso-tab-count:1'> </span>}</pre> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Here -we load the model library <img border=0 width=24 height=14 id="_x0000_i1051" -src="../../../../images/tag_1.gif" align=CENTER><span -style='mso-spacerun:yes'> </span>containing the UML primitive types (<span -style='font-family:"Courier New"'>Boolean</span>, <span style='font-family: -"Courier New"'>Integer</span>, <span style='font-family:"Courier New"'>String</span>, -and <span class=SpellE><span style='font-family:"Courier New"'>UnlimitedNatural</span></span>) -using a utility method (described later) and a URI defined on the <span -class=SpellE><span style='font-family:"Courier New"'>UMLResource</span></span> -interface. Next, we retrieve the desired (owned) primitive type from the model -by name <img border=0 width=24 height=14 id="_x0000_i1052" -src="../../../../images/tag_2.gif" align=CENTER><span -style='mso-spacerun:yes'> </span>using one of the convenience methods defined -in the UML2 API. Finally, we invoke another convenience method <img border=0 -width=24 height=14 id="_x0000_i1053" src="../../../../images/tag_3.gif" -align=CENTER><span style='mso-spacerun:yes'> </span>to create the element -import relationship between the package and the element (with default public -visibility), notify the user, and return the primitive type.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img -border=0 width=62 height=13 id="_x0000_i1054" src="../../../../images/tip.gif"><span -style='mso-spacerun:yes'> </span>The UML resources plug-in (<span -style='font-family:"Courier New"'>org.eclipse.uml2.uml.resources</span>) -provides several model libraries (which by convention have a <code>.<span -class=SpellE>library.uml</span></code> file extension) that contain commonly -used primitive types, such as those defined by Java and <span class=SpellE>Ecore</span> -(in addition to those defined by UML™ itself). These libraries can be accessed -using <span class=SpellE>URIs</span> defined on the <span class=SpellE><span -style='font-family:"Courier New"'>UMLResource</span></span> interface, as shown -above.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img -border=0 width=63 height=14 id="_x0000_i1055" src="../../../../images/tip.gif"><span -style='mso-spacerun:yes'> </span>In UML2, a method of the form <code>get<feature -name<span class=GramE>>(</span>String)</code> exists for every feature that -can contain or reference named elements. In this case, the package has a -feature (<span class=SpellE><code>ownedType</code></span>) that can contain -types, so we pass the unqualified name of the type we are looking for to the <span -class=SpellE><span class=GramE><code>getOwnedType</code></span></span><span -class=GramE><code>(</code></span><code>String)</code> convenience method. -Behind the scenes, the package will iterate over all of its owned types and -return the first one that it finds that has the specified (unqualified) name.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>OK, -let’s see this method in action. For example, we could import the primitive -type named ‘Boolean’ into profile ‘<span class=SpellE>ecore</span>’ as follows:</p> - -<pre style='margin-left:8.5pt'><span style='mso-tab-count:2'> </span><span -class=SpellE>PrimitiveType</span> <span class=SpellE>booleanPrimitiveType</span> = <span -class=SpellE><span class=GramE>importPrimitiveType</span></span><span -class=GramE>(</span><span class=SpellE>ecoreProfile</span>,</pre><pre -style='margin-left:8.5pt'><span style='mso-tab-count:3'> </span>"Boolean");</pre> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img -border=0 width=61 height=13 id="_x0000_i1056" src="../../../../images/tryit.gif"><span -style='mso-spacerun:yes'> </span>Write code to programmatically import the -other required primitive type (i.e. ‘String’) into the <span class=SpellE>Ecore</span> -profile.</p> - -<h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Creating -Enumerations</h3> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>As -with packages, profiles can contain enumerations. An enumeration is a kind of -data type whose instances may be any of a number of user-defined enumeration -literals. To create an enumeration using the UML editor, follow these steps:</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>1) -Select a profile (i.e. <b style='mso-bidi-font-weight:normal'><<span -style='mso-bidi-font-weight:bold'>Profile> <span class=SpellE>ecore</span></span></b>) -in the UML editor.</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>2) -Right-click and select the <b>New Child > Packaged Element Enumeration</b> -option from the context menu.</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>3) -Enter a value (i.e. “<span class=SpellE>VisibilityKind</span>”) for the <b>Name</b> -property in the <b>Properties</b> view.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img -border=0 width=61 height=13 id="_x0000_i1057" src="../../../../images/tryit.gif"><span -style='mso-spacerun:yes'> </span>Create the other enumeration (i.e. “<span -class=SpellE>FeatureKind</span>”) for the <span class=SpellE>Ecore</span> -profile using the UML editor.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>At -this point your workspace should look something like this:</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><!--[if gte vml 1]><v:shape - id="_x0000_i1058" 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_i1058"><![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'>Let’s -look at how to perform the same task using Java code. The code snippet below -(from the <span style='font-family:"Courier New"'>GettingStartedWithUML2</span> -class) shows a method that programmatically creates and returns an enumeration -with a specified name in a specified package.</p> - -<pre style='margin-left:9.0pt'><span style='mso-tab-count:1'> </span><span -class=GramE>protected</span> static Enumeration <span class=SpellE>createEnumeration</span>(</pre><pre -style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>org.eclipse.uml2.uml.Package package_, String name) {</pre><pre -style='margin-left:9.0pt'><img border=0 width=24 height=13 id="_x0000_i1059" -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_i1060" -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, -let’s see this method in action. For example, we could create an enumeration -named ‘<span class=SpellE>VisibilityKind</span>’ in profile ‘<span -class=SpellE>ecore</span>’ as follows:</p> - -<pre style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span>Enumeration <span -class=SpellE>visibilityKindEnumeration</span> = GettingStartedWithUML2</pre><pre -style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>.<span -class=SpellE><span class=GramE>createEnumeration</span></span><span -class=GramE>(</span><span class=SpellE>ecoreProfile</span>, "<span -class=SpellE>VisibilityKind</span>");</pre> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img -border=0 width=61 height=13 id="_x0000_i1061" src="../../../../images/tryit.gif"><span -style='mso-spacerun:yes'> </span>Write code to programmatically create the -other enumeration (i.e. ‘<span class=SpellE>FeatureKind</span>’) for the <span -class=SpellE>Ecore</span> profile.</p> - -<h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Creating -Enumeration Literals</h3> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>An -enumeration literal is a user-defined data value for an enumeration. To create -an enumeration literal using the UML editor, follow these steps:</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>1) -Select an enumeration (i.e. <b style='mso-bidi-font-weight:normal'><<span -style='mso-bidi-font-weight:bold'>Enumeration> <span class=SpellE>VisibilityKind</span></span></b>) -in the UML editor.</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>2) -Right-click and select the <b>New Child > Enumeration Literal</b> option -from the context menu.</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>3) -Enter a value (i.e. “Unspecified”) for the <b>Name</b> property in the <b>Properties</b> -view.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img -border=0 width=61 height=13 id="_x0000_i1062" src="../../../../images/tryit.gif"><span -style='mso-spacerun:yes'> </span>Create the remaining enumeration literals for -the <span class=SpellE>Ecore</span> profile (i.e. “None”, “<span class=SpellE>ReadOnly</span>”, -“<span class=SpellE>ReadWrite</span>”, “<span class=SpellE>ReadOnlyUnsettable</span>”, -and “<span class=SpellE>ReadWriteUnsettable</span>” for <b style='mso-bidi-font-weight: -normal'><<span style='mso-bidi-font-weight:bold'>Enumeration> <span -class=SpellE>VisibilityKind</span></span></b>; “Unspecified”, “Simple”, -“Attribute”, “Element”, “<span class=SpellE>AttributeWildcard</span>”, “<span -class=SpellE>ElementWildcard</span>”, and “Group” for <b style='mso-bidi-font-weight: -normal'><<span style='mso-bidi-font-weight:bold'>Enumeration <span -class=SpellE>FeatureKind</span>></span></b>) using the UML editor.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>At -this point your workspace should look something like this:</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><!--[if gte vml 1]><v:shape - id="_x0000_i1063" 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_i1063"><![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'>Let’s -look at how to perform the same task using Java code. The code snippet below -(from the <span style='font-family:"Courier New"'>GettingStartedWithUML2</span> -class) shows a method that programmatically creates and returns an enumeration -literal with a specified name in a specified enumeration.</p> - -<pre style='margin-left:9.0pt'><span style='mso-tab-count:1'> </span><span -class=GramE>protected</span> static <span class=SpellE>EnumerationLiteral</span> <span -class=SpellE>createEnumerationLiteral</span>(</pre><pre style='margin-left: -9.0pt'><span style='mso-tab-count:3'> </span>Enumeration <span -class=SpellE>enumeration</span>, String name) {</pre><pre style='margin-left: -9.0pt'><img border=0 width=24 height=13 id="_x0000_i1064" -src="../../../../images/tag_1.gif" align=CENTER><span style='mso-tab-count:2'> </span><span -class=SpellE>EnumerationLiteral</span> <span class=SpellE>enumerationLiteral</span> = enumeration</pre><pre -style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>.<span -class=SpellE><span class=GramE>createOwnedLiteral</span></span><span -class=GramE>(</span>name);</pre><pre style='margin-left:9.0pt'><o:p> </o:p></pre><pre -style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span><span -class=GramE>out(</span>"Enumeration literal '" + <span class=SpellE>enumerationLiteral.getQualifiedName</span>()</pre><pre -style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>+ "' created.");</pre><pre -style='margin-left:9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><span -style='mso-tab-count:2'> </span><span class=GramE>return</span> <span -class=SpellE>enumerationLiteral</span>;</pre><pre style='margin-left:9.0pt'><span -style='mso-tab-count:1'> </span>}</pre> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Here -we call the <span class=SpellE><span class=GramE><code>createOwnedLiteral</code></span></span><span -class=GramE><code>(</code></span><code>String)</code> convenience factory -method <img border=0 width=24 height=13 id="_x0000_i1065" -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, -let’s see this method in action. For example, we could create an enumeration literal -named ‘Unspecified’ in enumeration ‘<span class=SpellE>VisibilityKind</span>’ -as follows:</p> - -<pre style='margin-left:8.5pt'><span style='mso-tab-count:2'> </span><span -class=GramE>GettingStartedWithUML2.createEnumerationLiteral(</span></pre><pre -style='margin-left:8.5pt'><span style='mso-tab-count:3'> </span><span -class=SpellE><span class=GramE>visibilityKindEnumeration</span></span>, "Unspecified");<span -style='mso-tab-count:2'> </span></pre> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img -border=0 width=61 height=13 id="_x0000_i1066" src="../../../../images/tryit.gif"><span -style='mso-spacerun:yes'> </span>Write code to programmatically create the -remaining enumeration literals (i.e. ‘None’, ‘<span class=SpellE>ReadOnly</span>’, -‘<span class=SpellE>ReadWrite</span>’, ‘<span class=SpellE>ReadOnlyUnsettable</span>’, -and ‘<span class=SpellE>ReadWriteUnsettable</span>’ in enumeration ‘<span -class=SpellE>VisibilityKind</span>’; ‘Unspecified’, ‘Simple’, ‘Attribute’, -‘Element’, ‘<span class=SpellE>AttributeWildcard</span>’, ‘<span class=SpellE>ElementWildcard</span>’, -and ‘Group’ in enumeration ‘<span class=SpellE>FeatureKind</span>’) for the <span -class=SpellE>Ecore</span> profile.</p> - -<h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Creating -Stereotypes</h3> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>A -stereotype defines how an existing <span class=SpellE>metaclass</span> may be -extended, and enables the use of platform- or domain-specific terminology or -notation in place of, or in addition to, the ones used for the extended <span -class=SpellE>metaclass</span>. Each stereotype may extend one or more classes -through extensions as part of a profile. To create a stereotype using the UML -editor, follow these steps:</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>1) -Select a profile (i.e. <b style='mso-bidi-font-weight:normal'><<span -style='mso-bidi-font-weight:bold'>Profile> <span class=SpellE>ecore</span></span></b>) -in the UML editor.</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>2) -Right-click and select the <b>New Child > Packaged Element Stereotype</b> -option from the context menu.</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>3) -Enter a value (i.e. “<span class=SpellE>EStructuralFeature</span>”) for the <b>Name</b> -property in the <b>Properties</b> view.</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>4) -<span class=GramE>Select</span> a value (i.e. <b style='mso-bidi-font-weight: -normal'>true</b>) for the <b style='mso-bidi-font-weight:normal'>Is Abstract</b> -property in the <b style='mso-bidi-font-weight:normal'>Properties</b> view.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img -border=0 width=61 height=13 id="_x0000_i1067" src="../../../../images/tryit.gif"><span -style='mso-spacerun:yes'> </span>Create the remaining stereotypes for the <span -class=SpellE>Ecore</span> profile (i.e. “<span class=SpellE>EAttribute</span>” -and “<span class=SpellE>EReference</span>”) using the UML editor.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>At -this point your workspace should look something like this:</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><!--[if gte vml 1]><v:shape - id="_x0000_i1068" 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_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'>Let’s -look at how to perform the same task using Java code. The code snippet below -shows a method that programmatically creates and returns <span class=GramE>a(</span>n) -(abstract) stereotype with a specified name in a specified profile.</p> - -<pre style='margin-left:9.0pt'><span style='mso-tab-count:1'> </span><span -class=GramE>protected</span> static Stereotype <span class=SpellE>createStereotype</span>(Profile <span -class=SpellE>profile</span>, String name,</pre><pre style='margin-left:9.0pt'><span -style='mso-tab-count:3'> </span><span class=SpellE><span -class=GramE>boolean</span></span> <span class=SpellE>isAbstract</span>) {</pre><pre -style='margin-left:9.0pt'><img border=0 width=24 height=14 id="_x0000_i1069" -src="../../../../images/tag_1.gif" align=CENTER><span style='mso-tab-count:2'> </span>Stereotype <span -class=SpellE>stereotype</span> = <span class=SpellE><span class=GramE>profile.createOwnedStereotype</span></span><span -class=GramE>(</span>name, <span class=SpellE>isAbstract</span>);</pre><pre -style='margin-left:9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><span -style='mso-tab-count:2'> </span><span class=GramE>out(</span>"Stereotype '" + <span -class=SpellE>stereotype.getQualifiedName</span>() + "' created.");</pre><pre -style='margin-left:9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><span -style='mso-tab-count:2'> </span><span class=GramE>return</span> stereotype;</pre><pre -style='margin-left:9.0pt'><span style='mso-tab-count:1'> </span>}</pre> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Here -we call the <span class=SpellE><span class=GramE><code>createOwnedStereotype</code></span></span><span -class=GramE><code>(</code></span><code>String, <span class=SpellE>boolean</span>)</code> -convenience factory method <img border=0 width=24 height=13 id="_x0000_i1070" -src="../../../../images/tag_1.gif" align=CENTER><span -style='mso-spacerun:yes'> </span>to ask the profile to create a stereotype with -the specified name as one of its owned members, and set the <span class=SpellE><code>isAbstract</code></span> -attribute of the stereotype based on the specified <span class=SpellE><code>boolean</code></span> -argument.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>OK, -let’s see this method in action. For example, we could create an abstract -stereotype named ‘<span class=SpellE>EStructuralFeature</span>’ in profile ‘<span -class=SpellE>ecore</span>’ as follows:</p> - -<pre style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span>Stereotype <span -class=SpellE>eStructuralFeatureStereotype</span> = <span class=SpellE><span -class=GramE>createStereotype</span></span><span class=GramE>(</span></pre><pre -style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span><span -class=SpellE><span class=GramE>ecoreProfile</span></span>, "<span -class=SpellE>EStructuralFeature</span>", true);</pre> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img -border=0 width=61 height=13 id="_x0000_i1071" src="../../../../images/tryit.gif"><span -style='mso-spacerun:yes'> </span>Write code to programmatically create the -remaining (non-abstract) stereotypes (i.e. ‘<span class=SpellE>EAttribute</span>’ -and ‘<span class=SpellE>EReference</span>’) for the <span class=SpellE>Ecore</span> -profile.</p> - -<h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Creating -Stereotype Generalizations</h3> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Just -like classes, stereotypes may be involved in generalizations. A generalization -is a taxonomic relationship between a specific classifier and a more general classifier -whereby each instance of the specific classifier is also an indirect instance -of, and inherits the features of, the general classifier. To create a -stereotype generalization using the UML editor, follow these steps:</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>1) -Select a stereotype (i.e. <b style='mso-bidi-font-weight:normal'><<span -style='mso-bidi-font-weight:bold'>Stereotype> <span class=SpellE>EAttribute</span></span></b>) -in the UML editor.</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>2) -Right-click and select the <b>New Child > Generalization</b> option from the -context menu.</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>3) -Select a value (i.e. <span class=SpellE><b>ecore::EStructuralFeature</b></span>) -for the <b>General</b> property in the <b>Properties</b> view.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img -border=0 width=61 height=13 id="_x0000_i1072" src="../../../../images/tryit.gif"><span -style='mso-spacerun:yes'> </span>Create the other generalization (i.e. between <span -class=SpellE><b style='mso-bidi-font-weight:normal'>EReference</b></span> and <span -class=SpellE><b style='mso-bidi-font-weight:normal'>EStructuralFeature</b></span>) -for the <span class=SpellE>Ecore</span> profile using the UML editor.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img -border=0 width=62 height=13 id="_x0000_i1073" src="../../../../images/tip.gif"><span -style='mso-spacerun:yes'> </span>Be sure to pick the stereotype (the first <span -class=SpellE><b style='mso-bidi-font-weight:normal'>ecore::EStructuralFeature</b></span> -item) and not the class (it should show up in <b style='mso-bidi-font-weight: -normal'>Properties</b> view as <b style='mso-bidi-font-weight:normal'><Stereotype> -<span class=SpellE>EStructuralFeature</span></b>, not <b style='mso-bidi-font-weight: -normal'><Class> <span class=SpellE>EStructuralFeature</span></b>), which -comes from the <span class=SpellE>Ecore</span> <span class=SpellE>metamodel</span>.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>At -this point your workspace should look something like this:</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><!--[if gte vml 1]><v:shape - id="_x0000_i1074" 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_i1074"><![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'>Let’s -look at how to perform the same task using Java code. The code snippet below -(from the <span style='font-family:"Courier New"'>GettingStartedWithUML2</span> -class) shows a method that programmatically creates and returns generalization -between specified specific and general classifiers.</p> - -<pre style='margin-left:9.0pt'><span style='mso-tab-count:1'> </span><span -class=GramE>protected</span> static Generalization <span class=SpellE>createGeneralization</span>(</pre><pre -style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>Classifier <span -class=SpellE>specificClassifier</span>, Classifier <span class=SpellE>generalClassifier</span>) {</pre><pre -style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span>Generalization <span -class=SpellE>generalization</span> = <span class=SpellE>specificClassifier</span></pre><pre -style='margin-left:9.0pt'><img border=0 width=24 height=13 id="_x0000_i1075" -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:1'> </span><span -style='mso-tab-count:2'> </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_i1076" -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, -let’s see this method in action. For example, we could create a generalization -between specific stereotype ‘<span class=SpellE>EAttribute</span>’ and general -stereotype ‘<span class=SpellE>EStructuralFeature</span>’ as follows:</p> - -<pre style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span><span -class=GramE>GettingStartedWithUML2.createGeneralization(</span><span -class=SpellE>eAttributeStereotype</span>,</pre><pre style='margin-left:9.0pt'><span -style='mso-tab-count:3'> </span><span class=SpellE><span -class=GramE>eStructuralFeatureStereotype</span></span>);</pre> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img -border=0 width=61 height=13 id="_x0000_i1077" src="../../../../images/tryit.gif"><span -style='mso-spacerun:yes'> </span>Write code to programmatically create the -other generalization (i.e. between ‘<span class=SpellE>EReference</span>’ and ‘<span -class=SpellE>EStructuralFeature</span>’) for the <span class=SpellE>Ecore</span> -profile.</p> - -<h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Creating -Stereotype Properties</h3> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Again -just like classes, stereotypes may have properties (attributes). When a -stereotype is applied to a model element, the values of the properties may be -referred to as tagged values. To create a stereotype property using the UML -editor, follow these steps:</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>1) -Select a stereotype (i.e. <b style='mso-bidi-font-weight:normal'><<span -style='mso-bidi-font-weight:bold'>Stereotype> <span class=SpellE>EStructuralFeature</span></span></b>) -in the UML editor.</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>2) -Right-click and select the <b>New Child > Property</b> option from the -context menu.</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>3) -Enter a value (i.e. "<span class=SpellE>isTransient</span>”) for the <b>Name</b> -property in the <b>Properties</b> view.</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>4) -Select a value (i.e. <span class=SpellE><b>UMLPrimitiveTypes::Boolean</b></span>) -for the <b>Type</b> property in the <b>Properties</b> view.</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>5) -Enter a value (i.e. 0) for the <b>Lower</b> property in the <b>Properties</b> -view.</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>6) -Select the property (i.e. <b style='mso-bidi-font-weight:normal'><<span -style='mso-bidi-font-weight:bold'>Property> <span class=SpellE>isTransient</span></span></b>) -in the UML editor.</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>7) -Right-click and select the <b style='mso-bidi-font-weight:normal'>New Child -> Default Value Literal Boolean</b> option from the context menu.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img -border=0 width=62 height=13 id="_x0000_i1078" src="../../../../images/tip.gif"><span -style='mso-spacerun:yes'> </span>Default values for properties (and parameters) -are represented as value specifications (first-class objects) in UML™ 2.0. Here -we have selected a literal Boolean (whose default value is <span -style='font-family:"Courier New"'>false</span>) as the default value of our -property since its type is <b style='mso-bidi-font-weight:normal'>Boolean</b>. -If the type of the property were <b style='mso-bidi-font-weight:normal'>String</b>, -we’d have used a literal string instead. Once a default value specification has -been created, its value can alternatively be set with the owning property -selected via the <b style='mso-bidi-font-weight:normal'>Default</b> property in -the <b style='mso-bidi-font-weight:normal'>Properties</b> view.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img -border=0 width=61 height=13 id="_x0000_i1079" src="../../../../images/tryit.gif"><span -style='mso-spacerun:yes'> </span>Create the remaining stereotype properties for -the <span class=SpellE>Ecore</span> profile (i.e. “<span class=SpellE>isUnsettable</span>”, -“<span class=SpellE>isVolatile</span>”, “visibility”, “<span class=SpellE>xmlName</span>”, -“<span class=SpellE>xmlNamespace</span>”, and “<span class=SpellE>xmlFeatureKind</span>” -for <b style='mso-bidi-font-weight:normal'><Stereotype> <span -class=SpellE>EStructuralFeature</span></b>; “<span class=SpellE>attributeName</span>” -and “<span class=SpellE>isID</span>” for <b style='mso-bidi-font-weight:normal'><Stereotype> -<span class=SpellE>EAttribute</span></b>; “<span class=SpellE>referenceName</span>” -and “<span class=SpellE>isResolveProxies</span>” for <b style='mso-bidi-font-weight: -normal'><Stereotype> <span class=SpellE>EReference</span></b>) using the -UML editor.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img -border=0 width=62 height=13 id="_x0000_i1080" src="../../../../images/tip.gif"><span -style='mso-spacerun:yes'> </span>Be sure to set the appropriate default value for -each stereotype property so that it is consistent with the corresponding <span -class=SpellE>Ecore</span> property for Rose. In particular, the default value -for the “<span class=SpellE>isResolveProxies</span>” should be a literal -Boolean with a value of <b style='mso-bidi-font-weight:normal'>true</b> instead -of the default (!) default value of <b style='mso-bidi-font-weight:normal'>false</b>. -Note also that the types of the “visibility” and “<span class=SpellE>xmlFeatureKind</span>” -properties should be the enumerations we created earlier (i.e. <span -class=SpellE><b style='mso-bidi-font-weight:normal'>ecore::<span -style='mso-bidi-font-weight:bold'>Visibility</span></b></span> and <span -class=SpellE><b style='mso-bidi-font-weight:normal'>ecore::<span -style='mso-bidi-font-weight:bold'>FeatureKind</span></b></span>, respectively).</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>At -this point your workspace should look something like this:</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><!--[if gte vml 1]><v:shape - id="_x0000_i1081" type="#_x0000_t75" style='width:960pt;height:768pt'> - <v:imagedata src="article_files/image021.png" o:title=""/> -</v:shape><![endif]--><![if !vml]><img border=0 width=1280 height=1024 -src="article_files/image022.jpg" v:shapes="_x0000_i1081"><![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'>Let’s -look at how to perform the same task using Java code. The code snippet below -(from the <span style='font-family:"Courier New"'>GettingStartedWithUML2</span> -class) shows a method that programmatically creates and returns an attribute -with a specified upper bound, lower bound, type, and name in a specified class.</p> - -<pre style='margin-left:9.0pt'><span style='mso-tab-count:1'> </span><span -class=GramE>protected</span> static Property <span class=SpellE>createAttribute</span>(org.eclipse.uml2.uml.Class class_,</pre><pre -style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>String name, Type <span -class=SpellE>type</span>, <span class=SpellE>int</span> <span class=SpellE>lowerBound</span>, <span -class=SpellE>int</span> <span class=SpellE>upperBound</span>) {</pre><pre -style='margin-left:9.0pt'><img border=0 width=24 height=13 id="_x0000_i1082" -src="../../../../images/tag_1.gif" align=CENTER><span style='mso-tab-count:2'> </span>Property attribute = <span -class=SpellE>class_.<span class=GramE>createOwnedAttribute</span></span><span -class=GramE>(</span>name, type,</pre><pre style='margin-left:9.0pt'><span -style='mso-tab-count:3'> </span><span class=SpellE><span -class=GramE>lowerBound</span></span>, <span class=SpellE>upperBound</span>);</pre><pre -style='margin-left:9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><span -style='mso-tab-count:2'> </span><span class=SpellE>StringBuffer</span> <span -class=SpellE>sb</span> = new <span class=SpellE><span class=GramE>StringBuffer</span></span><span -class=GramE>(</span>);</pre><pre style='margin-left:9.0pt'><o:p> </o:p></pre><pre -style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span><span -class=SpellE><span class=GramE>sb.append</span></span><span class=GramE>(</span>"Attribute '");</pre><pre -style='margin-left:9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><span -style='mso-tab-count:2'> </span><span class=SpellE><span -class=GramE>sb.append</span></span><span class=GramE>(</span><span -class=SpellE>attribute.getQualifiedName</span>());</pre><pre style='margin-left: -9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><span -style='mso-tab-count:2'> </span><span class=SpellE><span -class=GramE>sb.append</span></span><span class=GramE>(</span>"' : ");</pre><pre -style='margin-left:9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><span -style='mso-tab-count:2'> </span><span class=SpellE><span -class=GramE>sb.append</span></span><span class=GramE>(</span><span -class=SpellE>type.getQualifiedName</span>());</pre><pre style='margin-left: -9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><span -style='mso-tab-count:2'> </span><span class=SpellE><span -class=GramE>sb.append</span></span><span class=GramE>(</span>" [");</pre><pre -style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span><span -class=SpellE><span class=GramE>sb.append</span></span><span class=GramE>(</span><span -class=SpellE>lowerBound</span>);</pre><pre style='margin-left:9.0pt'><span -style='mso-tab-count:2'> </span><span class=SpellE><span -class=GramE>sb.append</span></span><span class=GramE>(</span>"..");</pre><pre -style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span><span -class=SpellE><span class=GramE>sb.append</span></span><span class=GramE>(</span><span -class=SpellE>LiteralUnlimitedNatural.UNLIMITED</span> == <span class=SpellE>upperBound</span></pre><pre -style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>? "*"</pre><pre -style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>: <span -class=SpellE><span class=GramE>String.valueOf</span></span><span class=GramE>(</span><span -class=SpellE>upperBound</span>));</pre><pre style='margin-left:9.0pt'><span -style='mso-tab-count:2'> </span><span class=SpellE><span -class=GramE>sb.append</span></span><span class=GramE>(</span>"]");</pre><pre -style='margin-left:9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><span -style='mso-tab-count:2'> </span><span class=SpellE><span -class=GramE>sb.append</span></span><span class=GramE>(</span>" created.");</pre><pre -style='margin-left:9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><span -style='mso-tab-count:2'> </span><span class=GramE>out(</span><span -class=SpellE>sb.toString</span>());</pre><pre style='margin-left:9.0pt'><o:p> </o:p></pre><pre -style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span><span -class=GramE>return</span> attribute;</pre><pre style='margin-left:9.0pt'><span -style='mso-tab-count:1'> </span>}</pre> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Here -we call the <span class=SpellE><code>createOwnedAttribute</code></span><code>(String, -Type, <span class=SpellE>int</span>, <span class=SpellE>int</span>)</code> -convenience factory method <img border=0 width=24 height=13 id="_x0000_i1083" -src="../../../../images/tag_1.gif" align=CENTER><span -style='mso-spacerun:yes'> </span>to ask the class to create a property as one -of its owned attributes, set the type of the attribute to the specified type, -and set the lower and upper bounds of the attribute (the factory method creates -a literal integer and literal unlimited natural, respectively, and sets its -value to the specified integer value).</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img -border=0 width=62 height=13 id="_x0000_i1084" src="../../../../images/tip.gif"><span -style='mso-spacerun:yes'> </span>The <span class=SpellE><code>LiteralUnlimitedNatural.UNLIMITED</code></span> -constant represents the unlimited value for upper bounds (-1), as it does in -EMF.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>OK, -let’s see this method in action. For example, we could create an attribute with -multiplicity 0<span class=GramE>..1</span> of type ‘<span class=SpellE>UMLPrimitiveTypes::Boolean</span>’ -named ‘<span class=SpellE>isTransient</span>’ in stereotype ‘<span -class=SpellE>EStructuralFeature</span>’ as follows:</p> - -<pre style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span>Property <span -class=SpellE>isTransientProperty</span> = <span class=GramE>GettingStartedWithUML2.createAttribute(</span></pre><pre -style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span><span -class=SpellE><span class=GramE>eStructuralFeatureStereotype</span></span>, "<span -class=SpellE>isTransient</span>", <span class=SpellE>booleanPrimitiveType</span>,</pre><pre -style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>0, 1);</pre> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img -border=0 width=61 height=13 id="_x0000_i1085" src="../../../../images/tryit.gif"><span -style='mso-spacerun:yes'> </span>Write code to programmatically create the -remaining stereotype properties (i.e. ‘<span class=SpellE>isUnsettable</span>’, -‘<span class=SpellE>isVolatile</span>’, ‘visibility’, ‘<span class=SpellE>xmlName</span>’, -‘<span class=SpellE>xmlNamespace</span>’, and ‘<span class=SpellE>xmlFeatureKind</span>’ -in stereotype ‘<span class=SpellE>EStructuralFeature</span>’; ‘<span -class=SpellE>attributeName</span>’ and ‘<span class=SpellE>isID</span>’ in -stereotype ‘<span class=SpellE>EAttribute</span>’; ‘<span class=SpellE>referenceName</span>’ -and ‘<span class=SpellE>isResolveProxies</span>’ in stereotype ‘<span -class=SpellE>EReference</span>’) for the <span class=SpellE>Ecore</span> -profile.</p> - -<h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Referencing -<span class=SpellE>Metaclasses</span></h3> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>A -profile is a restricted form of a <span class=SpellE>metamodel</span> that must -always be related to a reference <span class=SpellE>metamodel</span> (i.e. -UML). A profile cannot be used without its reference <span class=SpellE>metamodel</span>; -it defines a limited capability to extend <span class=SpellE>metaclasses</span> -of the reference <span class=SpellE>metamodel</span> via stereotypes. Profiles -can be made to reference <span class=SpellE>metaclasses</span> from <span -class=SpellE>metamodels</span> by creating an import relationship between the -profile and the reference <span class=SpellE>metaclass</span>. To reference a <span -class=SpellE>metaclass</span> using the UML editor, follow these steps:</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>1) -Select a profile (i.e. <b style='mso-bidi-font-weight:normal'><<span -style='mso-bidi-font-weight:bold'>Profile> <span class=SpellE>ecore</span></span></b>) -in the UML editor.</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>2) -Select the <b style='mso-bidi-font-weight:normal'>UML Editor > Profile > -Reference <span class=SpellE>Metaclass</span>…</b> menu item.</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>3) -Choose a <span class=SpellE>metaclass</span> (i.e. <span class=SpellE><b -style='mso-bidi-font-weight:normal'>uml::Property</b></span>)<span class=GramE>,</span> -press the <b style='mso-bidi-font-weight:normal'>Add</b> button, then press the -<b style='mso-bidi-font-weight:normal'>OK</b> button.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>At -this point your workspace should look something like this:</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><!--[if gte vml 1]><v:shape - id="_x0000_i1086" type="#_x0000_t75" style='width:960pt;height:768pt'> - <v:imagedata src="article_files/image023.png" o:title=""/> -</v:shape><![endif]--><![if !vml]><img border=0 width=1280 height=1024 -src="article_files/image024.jpg" v:shapes="_x0000_i1086"><![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'>Let’s -look at how to perform the same task using Java code. The code snippet below -shows a method that programmatically references the <span class=SpellE>metaclass</span> -with a specified name in the UML <span class=SpellE>metamodel</span> from a specified -profile and returns it.</p> - -<pre style='margin-left:9.0pt'><span style='mso-tab-count:1'> </span><span -class=GramE>protected</span> static org.eclipse.uml2.uml.Class <span -class=SpellE>referenceMetaclass</span>(Profile <span class=SpellE>profile</span>,</pre><pre -style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>String name) {</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>Model <span -class=SpellE>umlMetamodel</span> = (Model) <span class=GramE>load(</span>URI</pre><pre -style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>.<span -class=SpellE><span class=GramE>createURI</span></span><span class=GramE>(</span>UML2Resource.UML2_METAMODEL_URI));</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_i1088" src="../../../../images/tag_2.gif" -align=CENTER><span style='mso-tab-count:2'> </span><span class=GramE>org.eclipse.uml2.Class</span> <span -class=SpellE>metaclass</span> = (org.eclipse.uml2.uml.Class) <span -class=SpellE>umlMetamodel</span></pre><pre style='margin-left:9.0pt'><span -style='mso-tab-count:2'> </span><span style='mso-tab-count:1'> </span>.<span -class=SpellE><span class=GramE>getOwnedType</span></span><span class=GramE>(</span>name);</pre><pre -style='margin-left:9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><img -border=0 width=24 height=13 id="_x0000_i1089" src="../../../../images/tag_3.gif" -align=CENTER><span style='mso-tab-count:2'> </span><span class=SpellE><span -class=GramE>profile.createMetaclassReference</span></span><span class=GramE>(</span><span -class=SpellE>metaclass</span>);</pre><pre style='margin-left:9.0pt'><o:p> </o:p></pre><pre -style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span><span -class=GramE>out(</span>"<span class=SpellE>Metaclass</span> '" + <span -class=SpellE>metaclass.getQualifiedName</span>() + "' referenced.");</pre><pre -style='margin-left:9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><span -style='mso-tab-count:2'> </span><span class=GramE>return</span> <span -class=SpellE>metaclass</span>;</pre><pre style='margin-left:9.0pt'><span -style='mso-tab-count:1'> </span>}</pre> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Here -we load the <span class=SpellE>metamodel</span> <img border=0 width=24 -height=14 id="_x0000_i1090" src="../../../../images/tag_1.gif" align=CENTER><span -style='mso-spacerun:yes'> </span>containing the UML <span class=SpellE>metaclasses</span> -using a utility method (described later) and a URI defined on the <span -class=SpellE><span style='font-family:"Courier New"'>UMLResource</span></span> -interface. Next, we retrieve the desired (owned) <span class=SpellE>metaclass</span> -from the (meta<span class=GramE>)model</span> by name <img border=0 width=24 -height=14 id="_x0000_i1091" src="../../../../images/tag_2.gif" align=CENTER><span -style='mso-spacerun:yes'> </span>using the convenience method. Finally, we -invoke another convenience method <img border=0 width=24 height=14 -id="_x0000_i1092" src="../../../../images/tag_3.gif" align=CENTER><span -style='mso-spacerun:yes'> </span>to create the element import relationship -between the profile and the <span class=SpellE>metaclass</span>, notify the -user, and return the <span class=SpellE>metaclass</span>.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img -border=0 width=62 height=13 id="_x0000_i1093" src="../../../../images/tip.gif"><span -style='mso-spacerun:yes'> </span>The UML resources plug-in (<span -style='font-family:"Courier New"'>org.eclipse.uml2.uml.resources</span>) -provides two <span class=SpellE>metamodels</span> (which by convention have a <code>.<span -class=SpellE>metamodel.uml</span></code> file extension), UML2 and <span -class=SpellE>Ecore</span>. These <span class=SpellE>metamodels</span> can be -accessed using <span class=SpellE>URIs</span> defined on the <span -class=SpellE><span style='font-family:"Courier New"'>UMLResource</span></span> -interface, as shown above.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>OK, -let’s see this method in action. For example, we could reference the <span -class=SpellE>metaclass</span> named ‘Property’ from profile ‘<span -class=SpellE>ecore</span>’ as follows:</p> - -<pre style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span><span -class=GramE>org.eclipse.uml2.uml.Class</span> <span class=SpellE>propertyMetaclass</span> = <span -class=SpellE>referenceMetaclass</span>(</pre><pre style='margin-left:9.0pt'><span -style='mso-tab-count:3'> </span><span class=SpellE><span -class=GramE>ecoreProfile</span></span>, <span class=SpellE>UMLPackage.Literals.PROPERTY.getName</span>());</pre> - -<h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Creating -Extensions</h3> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Extensions -are used to indicate that the properties of <span class=SpellE>metaclasses</span> -are extended through stereotypes, and give the ability to flexibly apply (and -later <span class=SpellE>unapply</span>) stereotypes to elements. An extension -is a kind of association, one end of which is an ordinary property, and the -other is an extension end. An extension may be required (depending on the lower -bound of the extension end), which indicates that an instance of the extending -stereotype must be created whenever an instance of the extended <span -class=SpellE>metaclass</span> is created. To create an extension using the UML -editor, follow these steps:</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>1) -Select a stereotype (i.e. <b style='mso-bidi-font-weight:normal'><<span -style='mso-bidi-font-weight:bold'>Stereotype> <span class=SpellE>EAttribute</span></span></b>) -in the UML editor.</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>2) -Select the <b style='mso-bidi-font-weight:normal'>UML Editor > Stereotype -> Create Extension…</b> menu item.</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>3) -Choose a <span class=SpellE>metaclass</span> (i.e. <span class=SpellE><b>uml::</b><b -style='mso-bidi-font-weight:normal'>Property</b></span>)<span class=GramE>,</span> -press the <b style='mso-bidi-font-weight:normal'>Add</b> button, then press the -<b style='mso-bidi-font-weight:normal'>OK</b> button.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img -border=0 width=61 height=13 id="_x0000_i1094" src="../../../../images/tryit.gif"><span -style='mso-spacerun:yes'> </span>Create the other extension (i.e. between <span -class=SpellE><b>uml::</b><b style='mso-bidi-font-weight:normal'>Property</b></span> -and <b style='mso-bidi-font-weight:normal'><Stereotype> <span -class=SpellE>EReference</span></b>) for the <span class=SpellE>Ecore</span> -profile using the UML editor.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>At -this point your workspace should look something like this:</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><!--[if gte vml 1]><v:shape - id="_x0000_i1095" type="#_x0000_t75" style='width:960pt;height:768pt'> - <v:imagedata src="article_files/image025.png" o:title=""/> -</v:shape><![endif]--><![if !vml]><img border=0 width=1280 height=1024 -src="article_files/image026.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'><img -border=0 width=62 height=13 id="_x0000_i1096" src="../../../../images/tip.gif"><span -style='mso-spacerun:yes'> </span>You’ll notice that a number of new elements -have appeared in the UML editor. In particular, you’ll see a new stereotype -property with a name of the form <span style='font-family:"Courier New"'>base_<<span -class=SpellE>metaclass</span> name></span>, an extension with a name of the -form <span style='font-family:"Courier New"'><<span class=SpellE>metaclass</span> -name>_<stereotype name></span>, and an extension end with a name of -the form <span style='font-family:"Courier New"'>extension_<stereotype -name></span>. It’s important that these elements <b style='mso-bidi-font-weight: -normal'>not</b> be modified, since the UML2 profile mechanism depends on these -constructs.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Let’s -look at how to perform the same task using Java code. The code snippet below -shows a method that programmatically creates and returns <span class=GramE>a(</span>n) -(required) extension between a specified <span class=SpellE>metaclass</span> -and a specified stereotype.</p> - -<pre style='margin-left:9.0pt'><span style='mso-tab-count:1'> </span><span -class=GramE>protected</span> static Extension <span class=SpellE>createExtension</span>(</pre><pre -style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span><span -class=GramE>org.eclipse.uml2.uml.Class</span> <span class=SpellE>metaclass</span>, Stereotype <span -class=SpellE>stereotype</span>,</pre><pre style='margin-left:9.0pt'><span -style='mso-tab-count:3'> </span><span class=SpellE><span -class=GramE>boolean</span></span> required) {</pre><pre style='margin-left: -9.0pt'><img border=0 width=24 height=13 id="_x0000_i1097" -src="../../../../images/tag_1.gif" align=CENTER><span style='mso-tab-count:2'> </span>Extension <span -class=SpellE>extension</span> = <span class=SpellE><span class=GramE>stereotype.createExtension</span></span><span -class=GramE>(</span><span class=SpellE>metaclass</span>, required);</pre><pre -style='margin-left:9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><span -style='mso-tab-count:2'> </span><span class=GramE>out(</span>(required</pre><pre -style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>? "Required extension '"</pre><pre -style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>: "Extension '") + <span -class=SpellE><span class=GramE>extension.getQualifiedName</span></span><span -class=GramE>(</span>) + "' created.");</pre><pre style='margin-left: -9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><span -style='mso-tab-count:2'> </span><span class=GramE>return</span> extension;</pre><pre -style='margin-left:9.0pt'><span style='mso-tab-count:1'> </span>}</pre> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Here -we call a convenience method on the stereotype that creates an extension (and -its ends) between it and a <span class=SpellE>metaclass</span> <img border=0 -width=24 height=13 id="_x0000_i1098" src="../../../../images/tag_1.gif" -align=CENTER><span style='mso-spacerun:yes'> </span>as one of its siblings -(i.e. as a child of its profile namespace). Behind the scenes, the stereotype -also creates the ends of the extension, resulting in a new property on the -stereotype (with a special name) and an extension end owned by the extension -(again, with a special name).</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>OK, -let’s see this method in action. For example, we could create a non-required -extension between <span class=SpellE>metaclass</span> ‘Property’ and stereotype -‘<span class=SpellE>EAttribute</span>’ in profile ‘<span class=SpellE>ecore</span>’ -as follows:</p> - -<pre style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span><span -class=SpellE><span class=GramE>createExtension</span></span><span class=GramE>(</span><span -class=SpellE>propertyMetaclass</span>, <span class=SpellE>eAttributeStereotype</span>, false);</pre> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img -border=0 width=61 height=13 id="_x0000_i1099" src="../../../../images/tryit.gif"><span -style='mso-spacerun:yes'> </span>Write code to programmatically create the -other extension (i.e. between <span class=SpellE>metaclass</span> ‘Property’ -and stereotype ‘<span class=SpellE>EReference</span>’) for the <span -class=SpellE>Ecore</span> profile.</p> - -<h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Defining -Profiles</h3> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>There. -We’re done creating (a scaled down version of) the <span class=SpellE>Ecore</span> -<span class=GramE>profile,</span> and we’re ready to start using it. But before -we can, there’s one final thing we need to do – <i style='mso-bidi-font-style: -normal'>define</i> it. Since a profile effectively represents an augmentation -of a reference <span class=SpellE>metamodel</span> (UML), in order for the -extensions we’ve defined to appear as though they’re part of the UML <span -class=SpellE>metamodel</span>, they need to be “defined” at the meta-<span -class=SpellE>metamodel</span> (i.e. <span class=SpellE>Ecore</span>) level. The -implementation of profile support in UML2 does this by converting the contents -of the profile to an equivalent <span class=SpellE>Ecore</span> representation -that is stored as an annotation on the profile. Then, when a profile and its -stereotypes are applied to a model and its elements, dynamic EMF (see the EMF -book for details) is used to store property values for the stereotypes. For the -most part, you can ignore this complexity, as long as you remember to define -your profile before using it. To define a profile using the UML editor, follow -these steps:</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>1) -Select a profile (i.e. <b style='mso-bidi-font-weight:normal'><<span -style='mso-bidi-font-weight:bold'>Profile> <span class=SpellE>ecore</span></span></b>) -in the UML editor.</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>2) -Select the <b style='mso-bidi-font-weight:normal'>UML Editor > Profile > -Define</b> menu item.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>At -this point your workspace should look something like this:</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><!--[if gte vml 1]><v:shape - id="_x0000_i1100" type="#_x0000_t75" style='width:960pt;height:768pt'> - <v:imagedata src="article_files/image027.png" o:title=""/> -</v:shape><![endif]--><![if !vml]><img border=0 width=1280 height=1024 -src="article_files/image028.jpg" v:shapes="_x0000_i1100"><![endif]></p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img -border=0 width=62 height=13 id="_x0000_i1101" src="../../../../images/tip.gif"><span -style='mso-spacerun:yes'> </span>You’ll notice that an annotation with source <b -style='mso-bidi-font-weight:normal'>http://www.eclipse.org/uml2/2.0.0/UML</b> -has been attached to the profile. It contains the generated <span class=SpellE>Ecore</span> -representation (an <span class=SpellE>Ecore</span> package with classes, -attributes, <span class=SpellE>enums</span>, etc.) of the profile. As with -extensions, it’s important that this annotation (and its contents) <b -style='mso-bidi-font-weight:normal'>not</b> be modified, since the UML2 profile -mechanism depends on these constructs.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Let’s -look at how to perform the same task using Java code. The code snippet below -shows a method that programmatically defines a specified profile.</p> - -<pre style='margin-left:9.0pt'><span style='mso-tab-count:1'> </span><span -class=GramE>protected</span> static void <span class=SpellE>defineProfile</span>(Profile <span -class=SpellE>profile</span>) {</pre><pre style='margin-left:9.0pt'><img -border=0 width=24 height=13 id="_x0000_i1102" src="../../../../images/tag_1.gif" -align=CENTER><span style='mso-tab-count:2'> </span><span class=SpellE><span -class=GramE>profile.define</span></span><span class=GramE>(</span>);</pre><pre -style='margin-left:9.0pt'><o:p> </o:p></pre><pre style='margin-left:9.0pt'><span -style='mso-tab-count:2'> </span><span class=GramE>out(</span>"Profile '" + <span -class=SpellE>profile.getQualifiedName</span>() + "' defined.");</pre><pre -style='margin-left:9.0pt'><span style='mso-tab-count:1'> </span>}</pre> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Here -we call a convenience method on the profile <img border=0 width=24 height=13 -id="_x0000_i1103" src="../../../../images/tag_1.gif" align=CENTER><span -style='mso-spacerun:yes'> </span>that generates the <span class=SpellE>Ecore</span> -representation of the profile and increments its version.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>OK, -let’s see this method in action. For example, we could define the ‘<span -class=SpellE>ecore</span>’ profile as follows:</p> - -<pre style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span><span -class=SpellE><span class=GramE>defineProfile</span></span><span class=GramE>(</span><span -class=SpellE>ecoreProfile</span>);</pre> - -<h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Saving -Profiles</h3> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Now -that we’ve spent all this time creating and defining a profile, we’d better -save our work. When we created our profile using the UML model wizard, a UML -resource was created for us, so now all that needs to be done is to serialize -the contents of our profile as XMI to a file on disk (i.e. <span class=SpellE><code>Ecore.profile.uml</code></span>). -To save a profile using the UML editor, follow these steps:</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>1) -Select the <b>File > Save</b> menu item.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>It’s -that simple. Programmatically, we have a bit more work to do because so far, -we’ve been creating our profile in a vacuum, i.e. without a containing -resource. The code snippet below shows a method that saves a specified package -to a resource with a specified URI.</p> - -<pre style='margin-left:9.0pt'><span style='mso-tab-count:1'> </span><span -class=GramE>protected</span> static void save(org.eclipse.uml2.uml.Package package_, URI <span -class=SpellE>uri</span>) {</pre><pre style='margin-left:9.0pt'><img border=0 -width=24 height=13 id="_x0000_i1104" src="../../../../images/tag_1.gif" -align=CENTER><span style='mso-tab-count:2'> </span>Resource <span -class=SpellE>resource</span> = <span class=SpellE>RESOURCE_<span class=GramE>SET.createResource</span></span><span -class=GramE>(</span><span class=SpellE>uri</span>);</pre><pre style='margin-left: -9.0pt'><img border=0 width=24 height=13 id="_x0000_i1105" -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_i1106" 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_i1107" src="../../../../images/tag_4.gif" -align=CENTER><span style='mso-tab-count:3'> </span><span -class=GramE>err(</span><span class=SpellE>ioe.getMessage</span>());</pre><pre -style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span>}</pre><pre -style='margin-left:9.0pt'><span style='mso-tab-count:1'> </span>}</pre> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Here -we use a statically initialized resource set <img border=0 width=24 height=13 -id="_x0000_i1108" src="../../../../images/tag_1.gif" align=CENTER><span -style='mso-spacerun:yes'> </span>to create a resource with the specified URI, -add the package to the resource’s contents <img border=0 width=24 height=13 -id="_x0000_i1109" src="../../../../images/tag_2.gif" align=CENTER>, and ask the -resource to save itself <img border=0 width=24 height=13 id="_x0000_i1110" -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_i1111" -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, -let’s see this method in action. For example, we could save the ‘<span -class=SpellE>ecore</span>’ profile to a resource with URI ‘<span class=SpellE>Ecore.profile.uml</span>’ -(relative to a URI passed in as an argument) as follows:</p> - -<pre style='margin-left:9.0pt'><span style='mso-tab-count:2'> </span><span -class=GramE>save(</span><span class=SpellE>ecoreProfile</span>, <span -class=SpellE>URI.createURI</span>(<span class=SpellE>args</span>[0]).<span -class=SpellE>appendSegment</span>("<span class=SpellE>Ecore</span>")</pre><pre -style='margin-left:9.0pt'><span style='mso-tab-count:3'> </span>.<span -class=SpellE><span class=GramE>appendFileExtension</span></span><span -class=GramE>(</span><span class=SpellE>UMLResource.PROFILE_FILE_EXTENSION</span>));</pre> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img -border=0 width=62 height=13 id="_x0000_i1112" src="../../../../images/tip.gif"><span -style='mso-spacerun:yes'> </span>The <span class=SpellE><code>UMLResource.PROFILE_FILE_EXTENSION</code></span> -constant represents the file extension for UML2 profiles (<code>.<span -class=SpellE>profile.uml</span></code>).</p> - -<h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Loading -Models</h3> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>In -order to make use of our profile, we’ll need to open a model and load the -profile. We’ll use the ExtendedPO2 model that was created in the “Getting -Started with UML2” article (you’ll need to copy it into your project and -refresh the workspace first).</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>To -open a model using the UML editor, follow these steps:</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>1) -Double-click on the resource (i.e. <b style='mso-bidi-font-weight:normal'>ExtendedPO2.uml</b>) -in the <b style='mso-bidi-font-weight:normal'>Navigator</b> view.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Behind -the scenes, a resource is obtained from the right kind resource factory (based -on the extension ‘<b style='mso-bidi-font-weight:normal'>.<span class=SpellE>uml</span></b>’) -and loaded, and then a new UML editor is opened and populated with the -resource’s contents.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>To -load a profile (or any resource, actually) using the UML editor, follow these -steps:</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>1) -Select the <b>UML Editor > Load Resource…</b> menu item.</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>2) -Press the <b>Browse Workspace…</b> button.</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>3) -Select a resource (i.e. <b>Introduction to UML2 Profiles/<span class=SpellE>Ecore.profile.uml</span></b>) -and press the <b>OK</b> button.</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>4) -Press the <b>OK</b> button.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>At -this point your workspace should look something like this:</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><!--[if gte vml 1]><v:shape - id="_x0000_i1113" type="#_x0000_t75" style='width:960pt;height:768pt'> - <v:imagedata src="article_files/image029.png" o:title=""/> -</v:shape><![endif]--><![if !vml]><img border=0 width=1280 height=1024 -src="article_files/image030.jpg" v:shapes="_x0000_i1113"><![endif]></p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Programmatically, -we have a bit more work to do. The code snippet below shows a method that loads -a package from a resource with a specified URI.</p> - -<pre style='margin-left:.25in'><span style='mso-tab-count:1'> </span><span -class=GramE>protected</span> static org.eclipse.uml2.uml.Package load(URI <span -class=SpellE>uri</span>) {</pre><pre style='margin-left:.25in'><span -style='mso-tab-count:2'> </span>org.eclipse.uml2.uml.Package package_ = null;</pre><pre -style='margin-left:.25in'><o:p> </o:p></pre><pre style='margin-left:.25in'><span -style='mso-tab-count:2'> </span><span class=GramE>try</span> {</pre><pre -style='margin-left:.25in'><img border=0 width=24 height=13 id="_x0000_i1114" -src="../../../../images/tag_1.gif" align=CENTER><span style='mso-tab-count:3'> </span>Resource <span -class=SpellE>resource</span> = <span class=SpellE>RESOURCE_<span class=GramE>SET.getResource</span></span><span -class=GramE>(</span><span class=SpellE>uri</span>, true);</pre><pre -style='margin-left:.25in'><o:p> </o:p></pre><pre style='margin-left:.25in'><img -border=0 width=24 height=13 id="_x0000_i1115" src="../../../../images/tag_2.gif" -align=CENTER><span style='mso-tab-count:3'> </span>package_ = (org.eclipse.uml2.uml.Package) <span -class=SpellE><span class=GramE>EcoreUtil.getObjectByType</span></span><span -class=GramE>(</span></pre><pre style='margin-left:.25in'><span -style='mso-tab-count:3'> </span><span style='mso-tab-count: -1'> </span><span class=SpellE><span class=GramE>resource.getContents</span></span><span -class=GramE>(</span>), <span class=SpellE>UMLPackage.Literals.PACKAGE</span>);</pre><pre -style='margin-left:.25in'><span style='mso-tab-count:2'> </span>} catch (<span -class=SpellE>WrappedException</span> we) {</pre><pre style='margin-left:.25in'><img -border=0 width=24 height=13 id="_x0000_i1116" src="../../../../images/tag_3.gif" -align=CENTER><span style='mso-tab-count:3'> </span><span -class=GramE>err(</span><span class=SpellE>we.getMessage</span>());</pre><pre -style='margin-left:.25in'><span style='mso-tab-count:3'> </span><span -class=SpellE><span class=GramE>System.exit</span></span><span class=GramE>(</span>1);</pre><pre -style='margin-left:.25in'><span style='mso-tab-count:2'> </span>}</pre><pre -style='margin-left:.25in'><o:p> </o:p></pre><pre style='margin-left:.25in'><img -border=0 width=24 height=13 id="_x0000_i1117" src="../../../../images/tag_4.gif" -align=CENTER><span style='mso-tab-count:2'> </span><span class=GramE>return</span> package_;</pre><pre -style='margin-left:.25in'><span style='mso-tab-count:1'> </span>}</pre> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Here -we obtain a resource with the specified URI from our statically initialized -resource <span class=GramE>set </span><img border=0 width=24 height=13 -id="_x0000_i1118" src="../../../../images/tag_1.gif" align=CENTER>, asking that it -be loaded on demand. Next, we use an EMF utility method <img border=0 width=24 -height=13 id="_x0000_i1119" src="../../../../images/tag_2.gif" align=CENTER><span -style='mso-spacerun:yes'> </span>to obtain the first object of type <span -style='font-family:"Courier New"'>Package</span> from the resource’s contents. -If an exception occurs, we notify the user <img border=0 width=24 height=13 -id="_x0000_i1120" src="../../../../images/tag_3.gif" align=CENTER><span -style='mso-spacerun:yes'> </span>via our handy utility method. Finally, if all -is well, we return <img border=0 width=24 height=13 id="_x0000_i1121" -src="../../../../images/tag_4.gif" align=CENTER><span -style='mso-spacerun:yes'> </span>the package.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img -border=0 width=62 height=13 id="_x0000_i1122" src="../../../../images/tip.gif"><span -style='mso-spacerun:yes'> </span>The <span class=SpellE><code>EcoreUtil</code></span> -class (provided by EMF) defines a number of utilities that you may find quite -useful when working with EMF-based resources.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>OK, -let’s see this method in action. For example, we could load the ‘epo2’ model -from a resource with URI ‘ExtendedPO2.uml’ (relative to a URI passed in as an -argument) as follows:</p> - -<pre style='margin-left:.25in'><span style='mso-tab-count:2'> </span>Model epo2Model = (Model) <span -class=GramE>load(</span><span class=SpellE>URI.createURI</span>(<span -class=SpellE>args</span>[0]).<span class=SpellE>appendSegment</span>(</pre><pre -style='margin-left:.25in'><span style='mso-tab-count:3'> </span>"ExtendedPO2").<span -class=SpellE><span class=GramE>appendFileExtension</span></span><span -class=GramE>(</span><span class=SpellE>UMLResource.FILE_EXTENSION</span>));</pre> - -<h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Applying -Profiles</h3> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>OK, -our profile has been created, defined, and saved, and we’re ready to apply it -to our model. Applying a profile means that it is allowed (but not necessarily -required) to apply the stereotypes that are defined in the profile to elements -in the package. A profile application is a special type of package import that -indicates that a profile has been applied to a package. To apply a profile to a -package using the UML editor, follow these steps:</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>1) -Select a package (i.e. <b style='mso-bidi-font-weight:normal'><Model> -epo2</b>) in the UML editor.</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>2) -Select the <b style='mso-bidi-font-weight:normal'>UML Editor > Package > -Apply Profile…</b> menu item.</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>3) -Choose a profile (i.e. <span class=SpellE><b style='mso-bidi-font-weight:normal'>ecore</b></span>)<span -class=GramE>,</span> press the <b style='mso-bidi-font-weight:normal'>Add</b> -button, then press the <b style='mso-bidi-font-weight:normal'>OK</b> button.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img -border=0 width=62 height=13 id="_x0000_i1123" src="../../../../images/tip.gif"><span -style='mso-spacerun:yes'> </span>Be sure to pick the profile we’ve created -instead of the built-in profile provided by the UML resources plug-in (i.e. <span -class=SpellE><b style='mso-bidi-font-weight:normal'>ecore</b></span>, not <span -class=SpellE><b style='mso-bidi-font-weight:normal'>Ecore</b></span>).</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>At -this point your workspace should look something like this:</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><!--[if gte vml 1]><v:shape - id="_x0000_i1124" type="#_x0000_t75" style='width:960pt;height:768pt'> - <v:imagedata src="article_files/image031.png" o:title=""/> -</v:shape><![endif]--><![if !vml]><img border=0 width=1280 height=1024 -src="article_files/image032.jpg" v:shapes="_x0000_i1124"><![endif]></p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img -border=0 width=62 height=13 id="_x0000_i1125" src="../../../../images/tip.gif"><span -style='mso-spacerun:yes'> </span>You’ll notice another annotation (with source <b -style='mso-bidi-font-weight:normal'>http://www.eclipse.org/uml2/2.0.0/UML</b>) -has been attached, in this case to keep track of the <span class=SpellE>Ecore</span> -representation for the definition of the profile that is currently applied to -the package. Again, it’s important that this annotation <b style='mso-bidi-font-weight: -normal'>not</b> be modified, since the UML2 profile mechanism depends on this -construct. Note that a newer definition of the profile can be applied using the -same menu item, and a profile (along with all of its stereotypes) can be -unapplied using the <b style='mso-bidi-font-weight:normal'>UML Editor > -Package > <span class=SpellE>Unapply</span> Profile…</b> menu item.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Let’s -look at how to perform the same task using Java code. The code snippet below -shows a method that programmatically applies a specified profile to a specified -package.</p> - -<pre style='margin-left:8.5pt'><span style='mso-tab-count:1'> </span><span -class=GramE>protected</span> static void <span class=SpellE>applyProfile</span>(org.eclipse.uml2.uml.Package package_,</pre><pre -style='margin-left:8.5pt'><span style='mso-tab-count:3'> </span>Profile <span -class=SpellE>profile</span>) {</pre><pre style='margin-left:8.5pt'><img -border=0 width=24 height=13 id="_x0000_i1126" src="../../../../images/tag_1.gif" -align=CENTER><span style='mso-tab-count:2'> </span><span class=SpellE>package_.<span -class=GramE>applyProfile</span></span><span class=GramE>(</span>profile);</pre><pre -style='margin-left:8.5pt'><o:p> </o:p></pre><pre style='margin-left:8.5pt'><span -style='mso-tab-count:2'> </span><span class=GramE>out(</span>"Profile '" + <span -class=SpellE>profile.getQualifiedName</span>() + "' applied to package '"</pre><pre -style='margin-left:8.5pt'><span style='mso-tab-count:3'> </span>+ <span -class=SpellE>package_.<span class=GramE>getQualifiedName</span></span><span -class=GramE>(</span>) + "'.");</pre><pre style='margin-left:8.5pt'><span -style='mso-tab-count:1'> </span>}</pre> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Here -we call a convenience method on the package <img border=0 width=24 height=13 -id="_x0000_i1127" src="../../../../images/tag_1.gif" align=CENTER><span -style='mso-spacerun:yes'> </span>that creates a profile application on the -package and sets the profile as the imported profile.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>OK, -let’s see this method in action. For example, we could apply the ‘<span -class=SpellE>ecore</span>’ profile to the ‘epo2’ model as follows:</p> - -<pre><span style='mso-tab-count:2'> </span><span class=SpellE><span -class=GramE>applyProfile</span></span><span class=GramE>(</span>epo2Model, <span -class=SpellE>ecoreProfile</span>);</pre> - -<h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Applying -Stereotypes</h3> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>We’re -on the home stretch now… Once a profile has been applied to a package, -stereotypes defined in the profile can be applied to instances of the -appropriate <span class=SpellE>metaclasses</span> (as per the defined -extensions). When a stereotype is applied to an element, that element is -effectively extended with the properties that are defined as part of the -stereotype. To apply a stereotype to an element using the UML editor, follow -these steps:</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>1) -Select an element (i.e. <b style='mso-bidi-font-weight:normal'><Property> -<span class=SpellE><span class=GramE>pendingOrders</span></span><span -class=GramE> :</span> <span class=SpellE>PurchaseOrder</span> [0..*]</b> in <b -style='mso-bidi-font-weight:normal'><Class> Supplier</b>) in the UML -editor.</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>2) -Select the <b style='mso-bidi-font-weight:normal'>UML Editor > Element > -Apply Stereotype…</b> menu item.</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>3) -Choose a stereotype (i.e. <span class=SpellE><b style='mso-bidi-font-weight: -normal'>ecore::EReference</b></span>)<span class=GramE>,</span> press the <b -style='mso-bidi-font-weight:normal'>Add</b> button, then press the <b -style='mso-bidi-font-weight:normal'>OK</b> button.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img -border=0 width=61 height=13 id="_x0000_i1128" src="../../../../images/tryit.gif"><span -style='mso-spacerun:yes'> </span>Apply the appropriate stereotypes to other -properties (<b style='mso-bidi-font-weight:normal'><Property> <span -class=SpellE>shippedOrders</span> : <span class=SpellE>PurchaseOrder</span> -[0..*]</b> in <b style='mso-bidi-font-weight:normal'><Class> Supplier</b>; -<b style='mso-bidi-font-weight:normal'><Property> <span class=SpellE>totalAmount</span> -: <span class=SpellE>int</span> [0..1]</b>, <b style='mso-bidi-font-weight: -normal'><Property> <span class=SpellE>previousOrder</span> : <span -class=SpellE>PurchaseOrder</span> [0..1]</b>, and <b style='mso-bidi-font-weight: -normal'><Property> customer : Customer</b> in <b style='mso-bidi-font-weight: -normal'><Class> <span class=SpellE>PurchaseOrder</span></b>; <b -style='mso-bidi-font-weight:normal'><Property> orders : <span -class=SpellE>PurchaseOrder</span> [0..*]</b> in <b style='mso-bidi-font-weight: -normal'><Class> Customer</b>) in the ExtendedPO2 model using the UML -editor.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>At -this point your workspace should look something like this:</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><!--[if gte vml 1]><v:shape - id="_x0000_i1129" type="#_x0000_t75" style='width:960pt;height:768pt'> - <v:imagedata src="article_files/image033.png" o:title=""/> -</v:shape><![endif]--><![if !vml]><img border=0 width=1280 height=1024 -src="article_files/image034.jpg" v:shapes="_x0000_i1129"><![endif]></p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img -border=0 width=62 height=13 id="_x0000_i1130" src="../../../../images/tip.gif"><span -style='mso-spacerun:yes'> </span>A stereotype (and its tagged values) can be -unapplied using the <b style='mso-bidi-font-weight:normal'>UML Editor > -Element > <span class=SpellE>Unapply</span> Stereotype…</b> menu item.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Let’s -look at how to perform the same task using Java code. The code snippet below -shows a method that programmatically applies a specified stereotype to a -specified (named) element.</p> - -<pre style='margin-left:.25in'><span style='mso-tab-count:1'> </span><span -class=GramE>protected</span> static void <span class=SpellE>applyStereotype</span>(<span -class=SpellE>NamedElement</span> <span class=SpellE>namedElement</span>,</pre><pre -style='margin-left:.25in'><span style='mso-tab-count:3'> </span>Stereotype <span -class=SpellE>stereotype</span>) {</pre><pre style='margin-left:.25in'><img -border=0 width=24 height=13 id="_x0000_i1131" src="../../../../images/tag_1.gif" -align=CENTER><span style='mso-tab-count:2'> </span><span class=SpellE><span -class=GramE>namedElement.applyStereotype</span></span><span class=GramE>(</span>stereotype);</pre><pre -style='margin-left:.25in'><o:p> </o:p></pre><pre style='margin-left:.25in'><span -style='mso-tab-count:2'> </span><span class=GramE>out(</span>"Stereotype '" + <span -class=SpellE>stereotype.getQualifiedName</span>()</pre><pre style='margin-left: -.25in'><span style='mso-tab-count:3'> </span>+ "' applied to element '" + <span -class=SpellE><span class=GramE>namedElement.getQualifiedName</span></span><span -class=GramE>(</span>) + "'.");</pre><pre style='margin-left:.25in'><span -style='mso-tab-count:1'> </span>}</pre> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Here -we call a convenience method on the element <img border=0 width=24 height=13 -id="_x0000_i1132" src="../../../../images/tag_1.gif" align=CENTER><span -style='mso-spacerun:yes'> </span>that creates an instance of the <span -class=SpellE>Ecore</span> class representing the specified stereotype (using -dynamic EMF) and attaches it to the element using an annotation.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>OK, -let’s see this method in action. For example, we could apply the ‘<span -class=SpellE>EReference</span>’ stereotype to the ‘<span class=SpellE>pendingOrders</span>’ -property of the ‘Supplier’ class in the ‘epo2’ model as follows:</p> - -<pre style='margin-left:.25in'><span style='mso-tab-count:2'> </span><span -class=GramE>org.eclipse.uml2.uml.Class</span> <span class=SpellE>supplierClass</span> = (org.eclipse.uml2.uml.Class) epo2Model</pre><pre -style='margin-left:.25in'><span style='mso-tab-count:3'> </span>.<span -class=SpellE><span class=GramE>getOwnedType</span></span><span class=GramE>(</span>"Supplier");</pre><pre -style='margin-left:.25in'><o:p> </o:p></pre><pre style='margin-left:.25in'><span -style='mso-tab-count:2'> </span>Property <span class=SpellE>pendingOrdersProperty</span> = <span -class=SpellE>supplierClass</span></pre><pre style='margin-left:.25in'><span -style='mso-tab-count:3'> </span>.<span class=SpellE><span -class=GramE>getOwnedAttribute</span></span><span class=GramE>(</span>"<span -class=SpellE>pendingOrders</span>", null);</pre><pre style='margin-left: -.25in'><span style='mso-tab-count:2'> </span><span class=SpellE><span -class=GramE>applyStereotype</span></span><span class=GramE>(</span><span -class=SpellE>pendingOrdersProperty</span>, <span class=SpellE>eReferenceStereotype</span>);</pre> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img -border=0 width=61 height=13 id="_x0000_i1133" src="../../../../images/tryit.gif"><span -style='mso-spacerun:yes'> </span>Write code to programmatically apply the -appropriate stereotypes to other properties (i.e. -‘epo2::Supplier::shippedOrders’, ‘epo2::PurchaseOrder::totalAmount’, -‘epo2::PurchaseOrder::previousOrder’, ‘epo2::PurchaseOrder::customer’, and -‘epo2::Customer::orders’) in the ExtendedPO2 model.</p> - -<h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Accessing -Stereotype Property Values</h3> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>At -long last, we’re ready to get and set values for the properties (tagged values) -defined in our extensions. To get and set the value for a stereotype property -using the UML editor, follow these steps:</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>1) -Select the element to which the stereotyped has been applied (i.e. <b -style='mso-bidi-font-weight:normal'><<<span class=SpellE>eReference</span>>> -<Property> <span class=SpellE><span class=GramE>pendingOrders</span></span><span -class=GramE> :</span> <span class=SpellE>PurchaseOrder</span> [0..*]</b> in <b -style='mso-bidi-font-weight:normal'><Class> Supplier</b>) in the UML -editor.</p> - -<p style='margin-left:27.5pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>2) -Enter or select a value (i.e. <b>true</b>) for the property (i.e. <b -style='mso-bidi-font-weight:normal'>Is Volatile</b>) under the category named for -the stereotype (i.e. <span class=SpellE><b style='mso-bidi-font-weight:normal'>EReference</b></span>) -in the <b>Properties</b> view.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img -border=0 width=61 height=13 id="_x0000_i1134" src="../../../../images/tryit.gif"><span -style='mso-spacerun:yes'> </span>Get and set values for other stereotype -properties (i.e. <b style='mso-bidi-font-weight:normal'>Is Transient</b> and <b -style='mso-bidi-font-weight:normal'>Is Resolve Proxies</b> under <span -class=SpellE><b style='mso-bidi-font-weight:normal'>EReference</b></span> for <b -style='mso-bidi-font-weight:normal'><<<span class=SpellE>eReference</span>>> -<Property> <span class=SpellE>pendingOrders</span> : <span class=SpellE>PurchaseOrder</span> -[0..*]</b> in <b style='mso-bidi-font-weight:normal'><Class> Supplier</b>; -<b style='mso-bidi-font-weight:normal'>Is Volatile</b>, <b style='mso-bidi-font-weight: -normal'>Is Transient</b>, and <b style='mso-bidi-font-weight:normal'>Is Resolve -Proxies</b> under <span class=SpellE><b style='mso-bidi-font-weight:normal'>EReference</b></span> -for <b style='mso-bidi-font-weight:normal'><<<span class=SpellE>eReference</span>>> -<Property> <span class=SpellE>shippedOrders</span> : <span class=SpellE>PurchaseOrder</span> -[0..*]</b> in <b style='mso-bidi-font-weight:normal'><Class> Supplier</b>; -<b style='mso-bidi-font-weight:normal'>Is Volatile</b> and <b style='mso-bidi-font-weight: -normal'>Is Transient</b> under <span class=SpellE><b style='mso-bidi-font-weight: -normal'>EAttribute</b></span> for <b style='mso-bidi-font-weight:normal'><<<span -class=SpellE>eAttribute</span>>> <Property> <span class=SpellE>totalAmount</span> -: <span class=SpellE>int</span> [0..1]</b> in <b style='mso-bidi-font-weight: -normal'><Class> <span class=SpellE>PurchaseOrder</span></b>; <b -style='mso-bidi-font-weight:normal'>Is Resolve Proxies</b> under <span -class=SpellE><b style='mso-bidi-font-weight:normal'>EReference</b></span> for <b -style='mso-bidi-font-weight:normal'><<<span class=SpellE>eReference</span>>> -<Property> <span class=SpellE>previousOrder</span> : <span class=SpellE>PurchaseOrder</span> -[0..1]</b> in <b style='mso-bidi-font-weight:normal'><Class> <span -class=SpellE>PurchaseOrder</span></b>; <b style='mso-bidi-font-weight:normal'>Is -Resolve Proxies</b> under <span class=SpellE><b style='mso-bidi-font-weight: -normal'>EReference</b></span> for <b style='mso-bidi-font-weight:normal'><<<span -class=SpellE>eReference</span>>> <Property> customer : Customer</b> -in <b style='mso-bidi-font-weight:normal'><Class> <span class=SpellE>PurchaseOrder</span></b>; -<b style='mso-bidi-font-weight:normal'>Is Resolve Proxies</b> under <span -class=SpellE><b style='mso-bidi-font-weight:normal'>EReference</b></span> for <b -style='mso-bidi-font-weight:normal'><<<span class=SpellE>eReference</span>>> -<Property> orders : <span class=SpellE>PurchaseOrder</span> [0..*]</b> in -<b style='mso-bidi-font-weight:normal'><Class> Customer</b>) in the -ExtendedPO2 model using the UML editor.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>At -this point your workspace should look something like this:</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><!--[if gte vml 1]><v:shape - id="_x0000_i1135" type="#_x0000_t75" style='width:960pt;height:768pt'> - <v:imagedata src="article_files/image035.png" o:title=""/> -</v:shape><![endif]--><![if !vml]><img border=0 width=1280 height=1024 -src="article_files/image036.jpg" v:shapes="_x0000_i1135"><![endif]></p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Let’s -look at how to perform the same task using Java code. The code snippet below -shows a method that programmatically gets and returns the value of a specified property -of a specified stereotype for a specified element.</p> - -<pre style='margin-left:.25in'><span style='mso-tab-count:1'> </span><span -class=GramE>protected</span> static Object <span class=SpellE>getStereotypePropertyValue</span>(</pre><pre -style='margin-left:.25in'><span style='mso-tab-count:3'> </span><span -class=SpellE>NamedElement</span> <span class=SpellE>namedElement</span>, Stereotype <span -class=SpellE>stereotype</span>, Property <span class=SpellE>property</span>) {</pre><pre -style='margin-left:.25in'><img border=0 width=24 height=13 id="_x0000_i1136" -src="../../../../images/tag_1.gif" align=CENTER><span style='mso-tab-count:2'> </span>Object value = <span -class=SpellE><span class=GramE>namedElement.getValue</span></span><span -class=GramE>(</span>stereotype, <span class=SpellE>property.getName</span>());</pre><pre -style='margin-left:.25in'><o:p> </o:p></pre><pre style='margin-left:.25in'><span -style='mso-tab-count:2'> </span><span class=GramE>out(</span>"Value of stereotype property '" + <span -class=SpellE>property.getQualifiedName</span>()</pre><pre style='margin-left: -.25in'><span style='mso-tab-count:3'> </span>+ "' on element '" + <span -class=SpellE><span class=GramE>namedElement.getQualifiedName</span></span><span -class=GramE>(</span>) + "' is "</pre><pre style='margin-left:.25in'><span -style='mso-tab-count:3'> </span>+ <span class=SpellE><span -class=GramE>String.valueOf</span></span><span class=GramE>(</span>value) + ".");</pre><pre -style='margin-left:.25in'><o:p> </o:p></pre><pre style='margin-left:.25in'><span -style='mso-tab-count:2'> </span><span class=GramE>return</span> value;</pre><pre -style='margin-left:.25in'><span style='mso-tab-count:1'> </span>}</pre> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Here -we call a convenience method on the (named) element <img border=0 width=24 -height=13 id="_x0000_i1137" src="../../../../images/tag_1.gif" align=CENTER><span -style='mso-spacerun:yes'> </span>that retrieves the value of a property with a -specified name from the dynamically created <span class=SpellE>Ecore</span> -object instance corresponding to the specified applied stereotype, notifies the -user, and returns it.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>OK, -let’s see this method in action. For example, we could get the value of the ‘<span -class=SpellE>isVolatile</span>’ property of the ‘<span class=SpellE>EReference</span>’ -stereotype for the ‘<span class=SpellE>pendingOrders</span>’ property of the -‘Supplier’ class in the ‘epo2’ model as follows:</p> - -<pre style='margin-left:.25in'><span style='mso-tab-count:2'> </span><span -class=SpellE><span class=GramE>getStereotypePropertyValue</span></span><span -class=GramE>(</span><span class=SpellE>pendingOrdersProperty</span>, <span -class=SpellE>eReferenceStereotype</span>,</pre><pre style='margin-left:.25in'><span -style='mso-tab-count:3'> </span><span class=SpellE><span -class=GramE>isVolatileProperty</span></span>);</pre> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img -border=0 width=61 height=13 id="_x0000_i1138" src="../../../../images/tryit.gif"><span -style='mso-spacerun:yes'> </span>Write code to programmatically get the values -of the other stereotype properties for elements in the ExtendedPO2 model.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>The -code snippet below shows a method that programmatically sets the value of a -specified property of a specified stereotype for a specified element to a -specified value.</p> - -<pre style='margin-left:.25in'><span style='mso-tab-count:1'> </span><span -class=GramE>protected</span> static void <span class=SpellE>setStereotypePropertyValue</span>(<span -class=SpellE>NamedElement</span> <span class=SpellE>namedElement</span>,</pre><pre -style='margin-left:.25in'><span style='mso-tab-count:3'> </span>Stereotype <span -class=SpellE>stereotype</span>, Property <span class=SpellE>property</span>, Object value) {</pre><pre -style='margin-left:.25in'><img border=0 width=24 height=13 id="_x0000_i1139" -src="../../../../images/tag_1.gif" align=CENTER><span style='mso-tab-count:2'> </span><span -class=SpellE><span class=GramE>namedElement.setValue</span></span><span -class=GramE>(</span>stereotype, <span class=SpellE>property.getName</span>(), value);</pre><pre -style='margin-left:.25in'><o:p> </o:p></pre><pre style='margin-left:.25in'><span -style='mso-tab-count:2'> </span><span class=GramE>out(</span>"Value of stereotype property '" + <span -class=SpellE>property.getQualifiedName</span>()</pre><pre style='margin-left: -.25in'><span style='mso-tab-count:3'> </span>+ "' on element '" + <span -class=SpellE><span class=GramE>namedElement.getQualifiedName</span></span><span -class=GramE>(</span>) + "' set to "</pre><pre style='margin-left: -.25in'><span style='mso-tab-count:3'> </span>+ <span -class=SpellE><span class=GramE>String.valueOf</span></span><span class=GramE>(</span>value) + ".");</pre><pre -style='margin-left:.25in'><span style='mso-tab-count:1'> </span>}</pre> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Here -we call a convenience method on the (named) element <img border=0 width=24 -height=13 id="_x0000_i1140" src="../../../../images/tag_1.gif" align=CENTER><span -style='mso-spacerun:yes'> </span>that sets the value of a property with a -specified name in the dynamically created <span class=SpellE>Ecore</span> -object instance corresponding to the specified applied stereotype and notifies -the user.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>OK, -let’s see this method in action. For example, we could set the value of the ‘<span -class=SpellE>isVolatile</span>’ property of the ‘<span class=SpellE>EReference</span>’ -stereotype for the ‘<span class=SpellE>pendingOrders</span>’ property of the -‘Supplier’ class in the ‘epo2’ model to <span class=SpellE><span -style='font-family:"Courier New"'>Boolean.TRUE</span></span> as follows:</p> - -<pre style='margin-left:.25in'><span style='mso-tab-count:2'> </span><span -class=SpellE><span class=GramE>setStereotypePropertyValue</span></span><span -class=GramE>(</span><span class=SpellE>pendingOrdersProperty</span>, <span -class=SpellE>eReferenceStereotype</span>,</pre><pre style='margin-left:.25in'><span -style='mso-tab-count:3'> </span><span class=SpellE><span -class=GramE>isVolatileProperty</span></span>, <span class=SpellE>Boolean.TRUE</span>);</pre> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><img -border=0 width=61 height=13 id="_x0000_i1141" src="../../../../images/tryit.gif"><span -style='mso-spacerun:yes'> </span>Write code to programmatically set the values -of the other stereotype properties for elements in the ExtendedPO2 model.</p> - -<h2 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Conclusion</h2> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Congratulations! -If you’ve made it this far, you’ve successfully created and applied a simple -profile programmatically and/or using the UML editor. There’s a whole lot more -that could be said, but the purpose of this article was just to introduce you -to the concepts. Stay tuned for more articles on how to develop tools with -UML2.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>For -more information on UML2, visit the <a href="http://www.eclipse.org/modeling/mdt/?project=uml2#uml2">home -page</a> or join the <a href="news://news.eclipse.org/eclipse.modeling.mdt.uml2">newsgroup</a>.</p> - -<h2 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>References</h2> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>[1] -K. Hussey. <span class=GramE>“Getting Started with UML2”.</span> International -Business Machines Corp., 2004, 2006.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span -class=GramE>[2] F. <span class=SpellE>Budinsky</span>, D. Steinberg, E. <span -class=SpellE>Merks</span>, R. <span class=SpellE>Ellersick</span>, and T. J. <span -class=SpellE>Grose</span>.</span> <i style='mso-bidi-font-style:normal'>Eclipse -Modeling Framework</i>. Pearson Education, Inc., <st1:place><st1:City>Boston</st1:City>, - <st1:State>MA</st1:State></st1:place>, 2003.</p> - -<h2 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Source -Code</h2> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>To -run the example or view the source code for this article, unzip <a -href="http://download.eclipse.org/modeling/mdt/uml2/downloads/articles/uml2.articles_200607181325.zip">uml2.articles_200607181325.zip</a> -into your Eclipse home directory and import the <code>com.ibm.uml2.articles</code> -plug-in into your workspace as a binary project with linked content (<b>File -> Import… > External Plug-ins and Fragments</b>). You can run the <code>IntroductionToUML2Profiles</code> -class as a Java application with two file <span class=SpellE>URIs</span> (e.g. -“file:/C:/Introduction to UML2 Profiles” “<span class=SpellE>jar<span -class=GramE>:file</span></span>:/C:/Eclipse 3.2/eclipse/plugins/org.eclipse.uml2.uml.resources_2.0.0.v200606221411.jar!/”) as program -arguments. The first URI should refer to a folder that contains the ExtendedPO2 -model described in the “Getting Started with UML2” article. The second URI -should use the JAR scheme (since the UML resources plug-in is <span -class=SpellE>JAR’d</span> as of UML2 1.1) and refer to the location of the <span -style='font-family:"Courier New"'>org.eclipse.uml2.uml.resources</span> plug-<span -class=SpellE>in’s</span> JAR archive.</p> - -<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span -style='font-size:7.5pt'>Java and all Java-based trademarks and logos are -trademarks or registered trademarks of Sun Microsystems, Inc. in the </span><st1:country-region><st1:place><span - style='font-size:7.5pt'>United States</span></st1:place></st1:country-region><span -style='font-size:7.5pt'>, other countries, or both.<o:p></o:p></span></p> - -</div> - -</body> - -</html> |