blob: 5b5f0c9438c4537f781c0ef3eb13c5a541ace080 [file] [log] [blame]
<title>OTSample-FlightBonus Intro</title>
<style type="text/css">
code { background-color:lightgray; }
img { border:0px; }
</style>
<body>
<h1>Overview of the Flight Bonus example</h1>
This is a simple flight booking program, which exists in different versions.
<h2>Flight booking - bare application</h2>
Package <img src="images/package.gif" /><code>flightbooking</code>
is available only as jar file (<img src="images/jar_src_obj.gif"/><code>Referenced Libraries/booking.jar</code>).<br />
<img src="images/run_exc.gif" /><strong>Running:</strong>
This regular Java application can be invoked like a regular Java program
(e.g., by click the link <u><font color="blue">run the sample</font></u> on the welcome sheet at the right).
The main method is in <img src="images/class_public.gif" /><code>flightbooking.Main</code>.
It has a simple GUI which will direct you through the relevant transactions.
Note that this variant does not include collecting bonus points.
<h2>Bonus and FlightBonus</h2>
The first scenario of adaptation concerns the definition of a bonus
programme for frequent flyers. Two team classes are involved.
The purpose of each team class is:
<dl>
<dt><img src="images/team_obj.gif" /><code>bonussystem/Bonus</code>:</dt>
<dd>Define an abstract, re-usable concept of
<img src="images/role_obj.gif"/>Subscriber</code>s that may collect credits,
and <img src="images/role_obj.gif"/>BonusItems</code> that are acquired by a Subscriber
and give a specific amount of credits.</dd>
<dt><img src="images/team_obj.gif" /><code>fbappication/FlightBonus</code>:</dt>
<dd>Bind the abstract team Bonus to the flightbooking package. Other
than class and method bindings, this team only adds one method
implementation for calculating the credit for booking a flight segment.</dd>
</dl>
<h2>Integrating the application</h2>
In order to integrate the new functionality into the GUI, even another
team class exists: <img src="images/team_obj.gif" /><code>GUIConnector</code>.
It adapts the original GUI in <code>booking.jar</code>.<br />
<img src="images/run_exc.gif" /><strong>Running:</strong>
To invoke the variant with bonus apply the supplied launch configuration <img src="images/file_obj.gif" /><code>FlightbookingWithBonus.launch</code>.
Looking at this launch configuration you will find these relevant settings:
<ul>
<li>On tab "JRE" two options are checked: <code>Enable OTRE</code> and <code>Java 5 JPLIS Launching</code></li>
<li>On the tab "<img src="images/team_obj.gif"> Team Activation" the team <code>GUIConnector</code> is selected for instantiation and activation.<br>
<strong>Optional:</strong><br>
<ol type="a">
<li>You may additionally select the team <code>WindowPlacer</code> which ensures that
new windows are always centered with respect to the desktop/their parent.<br>
<i>Note,</i> that this team requires the "Java 5 JPLIS Launching" option (see above),
because it adapts class <code>java.awt.Window</code>
which is not adaptable using the old launch mode.
</ol></li>
</ul>
The most important step is to add a method binding to <code>flightbooking.PassengerList.add()</code>.<br />
The following line in
<code><img src="images/role_obj.gif"/>&nbsp;fbapplication.GUIConnector.Controller</code>
is responsible for this (it's a callin binding):<br />
<img src="images/callinbinding_obj.gif" />&nbsp;&nbsp;&nbsp;&nbsp;<code> queryRegisterForBonus &lt;- <strong>after</strong> add;</code><br />
<p>
Whenever a passenger is added to that list (an internal "repository"),
the user is asked, whether the passenger wants to participate in the bonus programme.
If so, a new <img src="images/team_obj.gif" /><code>FlightBonus</code> instance is created
and the passenger is implicitly registered
(cf. the implementation of <code>fbapplication.BonusGUI.Controller.queryRegisterForBonus</code>).
After that all bookings for this passenger will also give bonus credits
to the passenger.
</p>
<p>
Collecting credits will be reported by a new dialog box &mdash; the nested team
<code><img src="images/team_role_obj.gif" />&nbsp;fbapplication.GUIConnector.FlightBonusDialog</code>.
This team defines another layer over the team FlightBonus, observing the behaviour of its roles.
</p>
<h2>OT/J concepts used</h2>
The following concepts are demonstrated and documented in the source code (<a href="guide/otjld/def/index.html"><img src="images/ot_paragraph.gif" /> numbers refer to paragraphs in the language definition</a>):
<dl>
<dt><strong>team inheritance and implicit inheritance of roles</strong> (<a href="guide/otjld/def/team.html"><img src="images/ot_paragraph.gif" /> 1</a>)</dt>
<dd>There are two team inheritance relations: <code>FlightBonus extends Bonus</code>
and <code>GUIConnector extends BonusGUI</code>.
In both cases the contained roles are further specialized in the sub-team.<br />
Implicit inheritance works accross levels (<a href="guide/otjld/def/team.html#s1.5"><img src="images/ot_paragraph.gif" /> 1.5</a>):
the nested team <code>FlightBonusDialog</code>
implicitly inherits all roles from its implicit super team of the same name.
The inner most roles recursively inherit from their implicit super roles.<br />
You may want to try the special hierarchy view (F4) for exploring this implicit inheritance.
</dd>
<dt><strong>callin method bindinds</strong> (<a href="guide/otjld/def/callin.html"><img src="images/ot_paragraph.gif" /> 4</a>)</dt>
<dd>The <code>FlightBonus</code> and the <code>GUIConnector</code> teams are both triggered
via callin bindings, by which they hook into the underlying system.
In the case of the <code>FlightBonusDialog</code> the base classes are roles, too.
This means roles are used to intercept events at some other roles.</dd>
<dt><strong>callout method bindinds</strong> (<a href="guide/otjld/def/callout.html"><img src="images/ot_paragraph.gif" /> 3</a>)</dt>
<dd>Most roles access features of their base class using callout bindings.</dd>
<dt><strong>role files</strong> (<a href="guide/otjld/def/team.html#s1.2.5"><img src="images/ot_paragraph.gif" /> 1.2.5</a>)</dt>
<dd><code>fbapplication.BonusGUI.FlightBonusDialog</code> and
<code>fbapplication.GUIConnector.FlightBonusDialog</code>.
Each role file resides in a <strong><code>team package</code></strong>
that has the same name as the enclosing team (i.e., a team is a class and a package).</dd>
<dt><strong>team activation</strong> (<a href="guide/otjld/def/activation.html"><img src="images/ot_paragraph.gif" /> 5</a>)</dt>
<dd>The 'bootstrap' team <code>GUIConnector</code> is activated via the <strong>launch configuration</strong>
(<a href="guide/otjld/def/activation.html#s5.5"><img src="images/ot_paragraph.gif" /> 5.5</a>).
By this technique it is possible to adapt the flight booking application without changing
a single line of source code.
In the sequel the <code>GUIConnector</code> creates instances of <code>FlightBonus</code>
and <code>FlightBonusDialog</code>, both of which invoke <strong><code>activate()</code></strong>
(<a href="guide/otjld/def/activation.html#s5.2.b"><img src="images/ot_paragraph.gif" /> 5.2(b)</a>) from their constructor in order to enable all callins of contained roles.<br />
Roles <code>FlightBonus.Subscriber</code> and <code>BonusGUI.Collector</code> restrict
activation to specific instances using a <strong>guard predicate</strong> (<a href="guide/otjld/def/activation.html#s5.4"><img src="images/ot_paragraph.gif" /> 5.4</a>).
<dt><strong>lifting</strong> (<a href="guide/otjld/def/rolebinding.html#s2.3"><img src="images/ot_paragraph.gif" /> 2.3</a>)</dt>
<dd>The constructor <code>FlightBonus(Passenger as Subscriber s)</code> uses declared lifting
(<a href="guide/otjld/def/rolebinding.html#s2.3.2"><img src="images/ot_paragraph.gif" /> 2.3.2</a>)
to force creation of a subscriber role for each passenger to be registered.<br />
The constructor <code>FlightBonusDialog(FlightBonus fb)</code> is a lifting constructor,
which means it will implicitly be used by the lifting operation, but it can also be
invoked explicitly, to create a new role for a given base instance
(cf. method <code>queryRegisterForBonus</code>).
</dd>
</dl>
</body>
</html>