summaryrefslogtreecommitdiff
path: root/CIAO/docs/tutorials/CoSMIC/02.html
blob: 8f4e7decc1118c5025401870bada6fd4753dc9f9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>

  <meta name="generator" content="HTML Tidy for Mac OS X (vers 1st December 2004), see www.w3.org" />
  <title>Building a Stock Quoter with TAO - A Tutorial</title>


<!-- $Id$ -->
  <link rel="stylesheet" type="text/css" href="style.css" />

</head>



<body style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);" link="#000fff" vlink="#ff0f0f">

<h3>Building Stock Quoter system in PICML</h3>

<br />

<p>This section describes modeling the Quoter application using
PICML. If you have trouble producing a functioning model from this
tutorial, please see the, <a href="Model/Quoter.xme">pre-built
Quoter model</a> which is provided for your reference. This model
contains all elements created as part of this tutorial.</p>

<div class="important"> <strong>Note:</strong>
To import an XML file in GME, select <em>File-&gt;Import
XML..</em> from GME and choose your XML model<br />

</div>

<p>The PICML paradigm is designed for the <a href="http://www.omg.org/cgi-bin/doc?ptc/2003-07-08">OMG
Deployment &amp; Configuration (D&amp;C) specification
(ptc/2003-07-08)</a>, so the modeling process is straightforward
if you are familiar with the specification. Please see the <a href="../../releasenotes/dance.html">DAnCE
project</a> for more information.&nbsp;For those who hate specification (including me, :-)), an <a href="http://www.cs.wustl.edu/%7Eschmidt/PDF/DAnCE.pdf">overview of D&amp;C</a> and as well as a <a href="http://www.cs.wustl.edu/%7Eschmidt/OMG-CCM-Tutorial.ppt">tutorial of D&amp;C and CCM</a> can help to reduce the learning curve.
(Thanks to Sowayan, Abdulah for pointing this out).
In addition, it is also helpful to read through Chapter 32 of TAO's
Developer's Guide 1.4a (CIAO and CCM) which thoroughly describes the
various descriptors required for a component (*.iad, *.ccd, *.cid,
etc). </p>
<h3>Table of Contents</h3>

<ul>

  <li><a href="#1">ImplementationArtifacts</a></li>

  <li><a href="#2">ComponentImplementations</a></li>

  <li><a href="#3">ComponentPackages</a></li>

  <li><a href="#4">PackageConfiguration</a></li>

  <li><a href="#5">TopLevelPackage</a></li>

  <li><a href="#6">Targets</a></li>

  <li><a href="#7">DeploymentPlan</a></li>

</ul>

<hr />
<p>The complete PICML Quoter model consists of modeling elements
distributed across various folders. If you used <em>idl_to_picml</em>
to generate the initial model, you will see that it has created all
these folders and some of the tedious boilerplate modeling for us. The
rest of the section will explain the purpose of each folder as well as
the modeling entities contained in these folders. We will also show how
to model some of the folders that have to be done by hand.</p>

<div class="important"> <strong>Important:</strong>
The interpreters that generate deployment artifacts expect very strict
constraints in the model. When you finish your model, and any time you
wish to generate anything, it is a good idea to check constraints by
clicking on <em>File-&gt;Check-&gt;Check All</em>
in GME. This will help you find many logic errors in your model. </div>

<h3><a name="1">ImplementationArtifacts</a></h3>

<p>This folder contains implementation artifacts associated with
components. <em>idl_to_picml</em> has created these
artifacts for us, with their dependency relationships correctly
captured. Figure 4 shows the Implementation Artifacts for <em>Broker</em>.</p>

<div style="text-align: center;"> <img alt="" src="Images/fig4.jpg" style="border: 1px solid ; width: 891px; height: 552px;" /><a name="1"><br />

Figure 4.<br />

</a><br />

</div>

<a name="1"></a>
<hr />
<h3><a name="2">ComponentImplementation</a></h3>

<p>This folder contains models that describe the implementations
of component interfaces. In the Quoter example, we will have two
monolithic component implementations - named <em>StockDistributorImplementation</em>
and <em>StockBrokerImplementation</em> - and an assembly
component implementation named <em>StockQuoter</em>, which
is an assembly of <em>StockDistributorImplementation</em>
and <em>StockBrokerImplementaion</em>. <em>idl_to_picml</em>
has created the monolithic component implementations for us, as shown
in figure 5 for example, but we have to specify the connections between
them in order to construct a Quoter system.</p>

<div style="text-align: center;"> <img alt="" src="Images/fig5.jpg" style="border: 1px solid ; width: 922px; height: 639px;" /><br />

Figure 5<br />

</div>

<p>Assembly components provide a boundary for the composition of
monolithic components and even other assemblies. Assembly components do
not provide actual implementations for their interface, it is a virtual
component that delegates its ports and attributes to one or more of the
entities it contains. There are slight differences between modeling an
assembly and modeling a monolithic component. Since the assembly is a
virtual component, it is not necessary to model a <code>MonolithicImplementation</code>.
Instead, <em>instances</em> of other components are placed
within the assembly and connected. Let's try to assemble the <em>StockQuoter</em>.</p>

<ol>

  <li>Right click the <em>ComponentImplementations</em>
folder, choose <strong>Insert
Model-&gt;ComponentImplementationContainer</strong>, rename
it as "StockQuoterImplementation" in the Attribute Panel. Double click
to open it.</li>

  <li>From the Part Browser, drag a
&lt;&lt;ComponentAssembly&gt;&gt; to the modeling
window, name it "StockQuoter". Double click to open it.</li>

  <li>Now we will create two instances for interfaces <em>StockBroker</em>
and <em>StockDistributor</em>. To do that, expand the
folder <code><em>InterfaceDefinitions</em></code>,
then expand the <code><em>InterfaceDefinitions/</em></code>
    <em>Broker</em>, then <code><em>InterfaceDefinitions/</em></code>
    <em>Broker/ Stock</em> until the interface definition
of <em>StockBroker</em> shows. While expanding the tree,
always keep the "StockQuoter"
&lt;&lt;ComponentAssembly&gt;&gt; window open. Then
drag <code>MyQuoter/InterfaceDefinitions/Broker/Stock/StockBroker</code>
in the browser to the "StockQuoter"
&lt;&lt;ComponentAssembly&gt;&gt; window while pressing
ALT key. Repeat the same steps for <code>MyQuoter/InterfaceDefinitions/Distributor/Stock/StockDistributor</code>,
and you will see two instances of component interfaces have been
created as shown in Figure 6 (the black line in the figure only
indicates .mapping)<br />

  </li>

</ol>

<br />

<div style="text-align: center;"> <img alt="" src="Images/fig6.jpg" style="width: 972px; height: 714px;" /><br />

<br />

Figure 6<br />

</div>

<ol>

  <li value="4">Create an
&lt;&lt;PublishConnector&gt;&gt;.<br />

  </li>

  <li>Now assemble the components together according to <a href="Images/fig1.jpg">Figure 1</a>(make sure you
change to connect mode <img alt="" src="Icons/AddConnMode.gif" style="width: 20px; height: 17px;" />
) and the resulting assembly model should look like Figure 7. Note that
to create connections between StockDistributor.notify_out and
StockBroker.notify_in, you will need the intermediate connector
&lt;&lt;PublishConnector&gt;&gt;.<br />

  </li>

</ol>

<img alt="" src="Images/fig7.jpg" style="width: 724px; height: 402px;" /><br />

<br />

Figure 7<br />

<hr /> <a name="3"></a>
<h3>ComponentPackage<br />

</h3>

This folder contains deployable component packages. Every instance in
an assembly should have a corresponding monolithic implementation and
packaged in a ComponentPackagebe To create a package for <em>StockBroker</em>.instance<br />

<ol>

  <li>Right click folder <em>ComponentPackage</em>s
, insert a &lt;&lt;PackageContainer&gt;&gt;, name it
"Broker"; Double click to open it.<br />

  </li>

  <li>From the PartBrowser, add the following:<br />

    <ul>

      <li>a &lt;&lt;ComponentPackage&gt;&gt;
named "Broker";</li>

      <li>a
&lt;&lt;ComponentImplementationReference&gt;&gt; named
"Broker";</li>

      <li>a &lt;&lt;ComponentRef&gt;&gt; named
"Broker";</li>

    </ul>

  </li>

  <li>Refer the
&lt;&lt;ComponentImplementationReference&gt;&gt; <em>Broker</em>
to <code>MyQuoter/ComponentImplementations/StockBroker</code>Implementation/StockBrokerMonolithicImpl.
Refer the &lt;&lt;ComponentRef&gt;&gt; <em>Broker</em>
to <code>MyQuoter/InterfaceDefinitions/Broker/Stock/StockBroker</code>.
To create a reference in GME, simply drag the tree node in the Browser
"into" the reference model. For example, you should drag the tree node <code>MyQuoter/ComponentImplementations/StockBroker</code>Implementation/StockBrokerMonolithicImpl
into &lt;&lt;ComponentImplementationReference&gt;&gt; <em>Broker.</em>
Check GME manual(tutorials) for more information.</li>

  <li>Switch to Connect Mode and create two connections according
to the following relationship.<br />

    <ul>

      <li>&lt;&lt;ComponentImplementationReference&gt;&gt;
        <em>Broker</em> implements
&lt;&lt;ComponentPackage&gt;&gt; <em>Broker</em>;</li>

      <li>&lt;&lt;ComponentPackage&gt;&gt; <em>Broker</em>
realizes &lt;&lt;ComponentRef&gt;&gt; <em>Broker</em>.</li>

    </ul>

    <br />

    <br />

&nbsp;&nbsp;&nbsp;&nbsp; The model you built should
resemble Figure 8.<br />

    <br />

    <div style="text-align: center;"> <img alt="" src="Images/fig8.jpg" style="width: 675px; height: 497px;" /><br />

    <br />

Figure 8<br />

    <br />

    </div>

Now create a ComponentPackage/StockDistributor following the same
steps. </li>

  <li style="list-style-type: none; list-style-image: none; list-style-position: outside;">
    <br />

We will also need to create a package for the assembly component
StockQuoter. Remember assembly component is a virtual component, it
does not "realize" a certain interface, so different from the Broker
and Distributor packages, the StockQuoter does not need a
&lt;&lt;ComponentRef&gt;&gt;. To create this model:
    <ol>

      <li>Insert a
&lt;&lt;ComponentPackage&gt;&gt; named "StockQuoter"<br />

      </li>

      <li>Add a
&lt;&lt;ComponentImplementationReference&gt;&gt; named
"StockQuoter", refer it to MyQuoter<code>/ComponentImplementations/StockQuoter/StockQuoter</code></li>

      <li>Switch to connect mode and connect
&lt;&lt;ComponentImplementationReference&gt;&gt;
StockQuoter with &lt;&lt;ComponentPackage&gt;&gt;
StockQuoter, as in Figure 9.<br />

      </li>

    </ol>

  </li>

</ol>

<div style="text-align: center;"> <img alt="" src="Images/fig9.jpg" style="width: 549px; height: 354px;" /><br />

<br />

Figure 9<br />

<br />

</div>

<hr /> <a name="4"></a>
<h3>PackageConfiguration<br />

</h3>

This folder contains just one model capturing specific configuration of
Component packages.<br />

<ol>

  <li>In the folder <em>PackageConfiguratio</em>n,
and create a
&lt;&lt;PackageConfigurationContainer&gt;&gt;, name it
"Default", click to open it.<br />

  </li>

  <li>Add a &lt;&lt;PackageConfiguration&gt;&gt;
named "default" and a
&lt;&lt;ComponentPackageReference&gt;&gt;, name it
"StockQuoter", connect "Default" to "StockQuoter"<br />

  </li>

  <li>Refer
&lt;&lt;ComponentPackageReference&gt;&gt; StockQuoter
to &lt;&lt;ComponentPackage&gt;&gt; <code>MyQuoter/ComponentPackage/StockQuoter/StockQuoter<br />

(Not &lt;&lt;ComponentImplementationReference&gt;&gt;</code>
    <code>MyQuoter/ComponentPackage/StockQuoter/StockQuoter!)&nbsp;</code></li>

</ol>

<br />

<hr /> <a name="5"></a>
<h3>ToplevelPackage<br />

</h3>

This folder contains one model capturing information about the
top-level element that will be fed to the application.<br />

<ol>

  <li>In the folder <em>ToplevelPackage</em>, and
create a &lt;&lt;ToplevelPackageContainer&gt;&gt;, name
it "Default", double click to open it.<br />

  </li>

  <li>Add a &lt;&lt;ToplevelPackage&gt;&gt; named
"ToplevelPackage" and a
&lt;&lt;PackageConfigurationReference&gt;&gt;, name it
"Default", connect "ToplevelPackage" to "Default"<br />

  </li>

  <li>Refer "Default" to My<code>Quoter/PackageConfiguration/Default/Default</code><br />

  </li>

</ol>

<br />

<hr /> <a name="6"></a>
<h3>Targets<br />

</h3>

This folder contains domain-specific models capturing information about
the target environment in which component-based application will be
deployed. In this Quoter example, we can either deploy the two
components into ONE host, or into TWO different host. We will deploy
the Quoter into two different host.<br />

<ol>

  <li>In the folder <span style="font-style: italic;">Targets</span>,
insert a new &lt;&lt;Domain&gt;&gt; named "Domain";
double click to open it.<br />

  </li>

  <li>From the Part Browser, add two
&lt;&lt;Node&gt;&gt; named "Broker" and "Distributor"
respectively.<br />

  </li>

</ol>

<br />

Now we are ready to deploy our Components to the actual physical
environment.<br />

<hr /> <a name="7"></a>
<h3>DeploymentPlan<br />

</h3>

This folder contains a plan model that captures information about the
assignment of component to nodes.<br />

<ol>

  <li>In the folder <em>DeploymentPlan</em>, insert
a model &lt;&lt;DeploymentPlan&gt;&gt;; name it "Plan",
click to open it<br />

  </li>

  <li>From the PartBrowser, add the following:<br />

    <ul>

      <li>Two &lt;&lt;CollocationGroup&gt;&gt;</li>

      <li>Two &lt;&lt;NodeReference&gt;&gt; named
"Node_Broker" and "Node_Distributor" respectively, refering to <code>MyQuoter/Targets/Domain/Broker</code>
and <code>MyQuoter/Targets/Domain/Distributor</code>
respectively</li>

      <li>Two &lt;&lt;ComponentRef&gt;&gt; named
"StockBroker" and "StockDistributor" respectively, refering to <code>MyQuoter/ComponentImplementations/StockQuoterImplementation/StockQuoter/StockBroker</code>
and <code>MyQuoter/ComponentImplementations/StockQuoterImplementation/StockQuoter/StockDistributor</code>
respectively. Note that the
&lt;&lt;ComponentRef&gt;&gt; in DeploymentPlan is not
referring to the interface, but rather the actual instance of the
implementation.</li>

    </ul>

  </li>

  <li>Switch to Connect Mode, connect one
&lt;&lt;CollocationGroup&gt;&gt; to
&lt;&lt;NodeReference&gt;&gt; <em>Node_Broker</em>,
connect another &lt;&lt;CollocationGroup&gt;&gt; to
&lt;&lt;NodeReference&gt;&gt; <em>Node_</em><em>Distributor</em>.
Now the model looks like the following.<br />

    <br />

    <div style="text-align: center;"> <img alt="" src="Images/fig10.jpg" style="width: 752px; height: 530px;" /><br />

    <br />

Figure 10.<br />

    <br />

    </div>

  </li>

  <li>Now we need to associate
&lt;&lt;ComponentRef&gt;&gt; StockBroker to the
&lt;&lt;CollocationGroup&gt;&gt; running on the
&lt;&lt;NodeReference&gt;&gt; Broker, and
&lt;&lt;ComponentRef&gt;&gt; StockDistributor to the
&lt;&lt;CollocationGroup&gt;&gt; running on the
&lt;&lt;NodeReference&gt;&gt; Distributor. To do that,
switch the Edit Mode Bar to Set Mode (<img alt="" src="Icons/SetMode.gif" style="width: 20px; height: 17px;" />),
and move the cursor to the
&lt;&lt;CollocationGroup&gt;&gt; running on
&lt;&lt;NodeReference&gt;&gt; Distributor, right-click
on it. You will find the cursor is changed to set mode cursor, and only
the &lt;&lt;CollocationGroup&gt;&gt; you clicked in is
highlighted, as shown in Figure 11.<br />

    <br />

  </li>

</ol>

<div style="text-align: center;"> <img alt="" src="Images/fig11.jpg" style="width: 672px; height: 505px;" /><br />

<br />

Figure 11<br />

<br />

</div>

<p>Now move your cursor to
&lt;&lt;ComponentRef&gt;&gt;&nbsp;
StockDistributor, and left-click it, so that it looks like Figure 12.<br />

</p>

<div style="text-align: center;"> <img alt="" src="Images/fig12.jpg" style="width: 672px; height: 505px;" /><br />

<br />

Figure 12<br />

<br />

</div>

<p>This operation associates <em>StockDistributor</em>
component to the &lt;&lt;CollocationGroup&gt;&gt;
running on <em>Distributor</em> node. To do the same with
Broker, just right-click on another
&lt;&lt;CollocationGroup&gt;&gt;, and left-click on
StockBroker &lt;&lt;CollocationGroup&gt;&gt; which is
highlighted.<br />

<br />

</p>

<hr /> <a name="8"></a>
<p>Up to this point, we are basically done with the modeling
part. Before we generate anything from this model though, please <span style="font-weight: bold;">DO</span> remember to check
the constraints of the model as we mentioned earlier.</p>

<p>After we are done with the modeling, the
flattened_deploymentplan interpreter that comes along with PICML will
help us to generate a flattened_deploymentplan.cdp file. Please make
sure you generate this file to MyQuoter/descriptors. Note that to get the example working<span style="font-family: monospace;">,</span>a Node Map file should be created to map logical<span style="font-family: monospace;"> </span>nodes to NodeManager object references,e.g:<br />
</p>
<pre wrap="">DistributorNode corbaloc:iiop:localhost:30000/NodeManager<br />BrokerNode      corbaloc:iiop:localhost:40000/NodeManager</pre>

<address> <br />

<a href="mailto:ming.xiong@vanderbilt.edu">Ming Xiong<br />

</a> </address>

<!-- Created: Sat Nov 27 15:25:06 CST 1999 --><!-- hhmts start -->
Last modified:<!-- hhmts end -->
</body>
</html>