sintonia/livesupport/doc/model/Scheduler/index.html

4212 lines
105 KiB
HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html; charset=ISO-8859-2"
http-equiv="content-type">
<title>LiveSupport Scheduler specifications</title>
<meta content="Ákos Maróy" name="author">
</head>
<body>
<h1>Preface</h1>
This document is part of the <a href="http://livesupport.campware.org/">LiveSupport</a>
project, Copyright &#169; 2004 <a href="http://www.mdlf.org/">Media
Development Loan Fund</a>, under the GNU <a
href="http://www.gnu.org/licenses/gpl.html">GPL</a>.<br>
<ul>
<li>Author: $Author: fgerlits $</li>
<li>Version: $Revision: 1.3 $</li>
<li>Location: $Source:
/home/cvs/livesupport/doc/model/Scheduler/index.html,v $</li>
</ul>
<h1>Scope</h1>
This document contains the specification of the LiveSupport Scheduler
daemon.<br>
<br>
This document contains embedded <a
href="http://www.w3.org/Graphics/SVG/">SVG</a> figures, thus an SVG
capable browser is needed to view it, or an SVG plugin like <a
href="http://www.adobe.com/svg/">Adobe's SVG Viewer</a>.<br>
<h1>Requirements</h1>
<h2>Overview<br>
</h2>
The purpose of the LiveSupport Scheduler daemon is to execute
playlists.<br>
<h2>Goals<br>
</h2>
The scheduler daemon is a remotely accessible service accepting
playlists on a local audio interface. Specific goals include:<br>
<ul>
<li>remote manageability</li>
<li>handling remote audio clips referenced by playlists</li>
<li>low-latency playback</li>
</ul>
<h2>System functions</h2>
The main system functions are described below. There are three
categories for these functions:<br>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<th valign="top">function category<br>
</th>
<th valign="top">meaning<br>
</th>
</tr>
<tr>
<td valign="top">evident<br>
</td>
<td valign="top">Should perform, and the user should be cognizant
that it is performed<br>
</td>
</tr>
<tr>
<td valign="top">hidden<br>
</td>
<td valign="top">Should perform, but not visible to the users.<br>
</td>
</tr>
<tr>
<td valign="top">frill<br>
</td>
<td valign="top">Optional<br>
</td>
</tr>
</tbody>
</table>
<br>
<br>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<th valign="top">ref#<br>
</th>
<th valign="top">function<br>
</th>
<th valign="top">category<br>
</th>
</tr>
<tr>
<td valign="top">F1.1<br>
</td>
<td valign="top">Accept uploaded playlists<br>
</td>
<td valign="top">evident<br>
</td>
</tr>
<tr>
<td valign="top">F1.2<br>
</td>
<td valign="top">Retrieve remote files referenced by playlists<br>
</td>
<td valign="top">hidden<br>
</td>
</tr>
<tr>
<td valign="top">F1.3<br>
</td>
<td valign="top">Access local files<br>
</td>
<td valign="top">hidden<br>
</td>
</tr>
<tr>
<td valign="top">F1.4<br>
</td>
<td valign="top">Provide status information<br>
</td>
<td valign="top">evident<br>
</td>
</tr>
<tr>
<td valign="top">F1.5<br>
</td>
<td valign="top">Log playlist execution for proof of broadcast
reasons<br>
</td>
<td valign="top">evident<br>
</td>
</tr>
<tr>
<td valign="top">F1.6<br>
</td>
<td valign="top">Purge local file storage of unused audio clips<br>
</td>
<td valign="top">hidden<br>
</td>
</tr>
<tr>
<td valign="top">F1.7<br>
</td>
<td valign="top">Execute playlists<br>
</td>
<td valign="top">evident<br>
</td>
</tr>
<tr>
<td valign="top">F1.8<br>
</td>
<td valign="top">Play live streams as part of the playlist<br>
</td>
<td valign="top">hidden<br>
</td>
</tr>
<tr>
<td valign="top">F1.9<br>
</td>
<td valign="top">Remove playists from the schedule<br>
</td>
<td valign="top">evident<br>
</td>
</tr>
<tr>
<td valign="top">F1.10<br>
</td>
<td valign="top">Re-schedule playlsits<br>
</td>
<td valign="top">evident<br>
</td>
</tr>
<tr>
<td valign="top">F1.11<br>
</td>
<td valign="top">Delete playlists<br>
</td>
<td valign="top">evident<br>
</td>
</tr>
<tr>
<td valign="top">F1.12<br>
</td>
<td valign="top">Create playlists<br>
</td>
<td valign="top">evident<br>
</td>
</tr>
<tr>
<td valign="top">F1.13<br>
</td>
<td valign="top">Edit playlists<br>
</td>
<td valign="top">evident<br>
</td>
</tr>
<tr>
<td valign="top">F1.14<br>
</td>
<td valign="top">Start the scheduler daemon<br>
</td>
<td valign="top">evident<br>
</td>
</tr>
<tr>
<td valign="top">F1.15<br>
</td>
<td valign="top">Stop the scheduler daemon<br>
</td>
<td valign="top">evident<br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
</tr>
</tbody>
</table>
<br>
<h2>System attributes</h2>
Generic attributes<br>
<br>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<th valign="top">ref#<br>
</th>
<th valign="top">attribute<br>
</th>
<th valign="top">details and constraints<br>
</th>
<th valign="top">category<br>
</th>
</tr>
<tr>
<td valign="top">A1.1<br>
</td>
<td valign="top">operating system platform<br>
</td>
<td valign="top">Linux<br>
</td>
<td valign="top">must<br>
</td>
</tr>
<tr>
<td valign="top">A1.2<br>
</td>
<td valign="top">supported audio interfaces<br>
</td>
<td valign="top">ALSA (maybe also OSS?)<br>
</td>
<td valign="top">must<br>
</td>
</tr>
<tr>
<td valign="top">A1.3<br>
</td>
<td valign="top">supported playlist format<br>
</td>
<td valign="top">SMIL 2.0. only partial support is required,
which focuses only on audio aspects of SMIL.<br>
</td>
<td valign="top">must<br>
</td>
</tr>
<tr>
<td valign="top">A1.4<br>
</td>
<td valign="top">supported audio clip formats<br>
</td>
<td valign="top">Ogg Vorbis, mp3, wav<br>
</td>
<td valign="top">must<br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
</tr>
</tbody>
</table>
<br>
Attributes related to system functions<br>
<br>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<th valign="top">ref#<br>
</th>
<th valign="top">function<br>
</th>
<th valign="top">ref#<br>
</th>
<th valign="top">attribute<br>
</th>
<th valign="top">details and constraints<br>
</th>
<th valign="top">category<br>
</th>
</tr>
<tr>
<td valign="top">F1.7<br>
</td>
<td valign="top">Execute playlists<br>
</td>
<td valign="top">A1.5<br>
</td>
<td valign="top">low latency<br>
</td>
<td valign="top">when executing playlists, very low latency
should be achieved<br>
</td>
<td valign="top">must<br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top">A1.6<br>
</td>
<td valign="top">handle time skew<br>
</td>
<td valign="top">the
daemon has to take into account that the system's clock is not
accurate. the clock is synchronized to an external regularly, but the
resulting time-jump must be handled.<br>
</td>
<td valign="top">must<br>
</td>
</tr>
<tr>
<td valign="top">F1.8<br>
</td>
<td valign="top">Play live streams as part of the playlist </td>
<td valign="top">A1.7<br>
</td>
<td valign="top">supported audio stream formats<br>
</td>
<td valign="top">Ogg Vorbis via HTTP, mp3 via HTTP<br>
</td>
<td valign="top">must<br>
</td>
</tr>
<tr>
<td valign="top">F1.14<br>
F1.15<br>
</td>
<td valign="top">Start / stop the scheduler daemon<br>
</td>
<td valign="top">A1.8<br>
</td>
<td valign="top">provide System V init style services<br>
</td>
<td valign="top">Provide a System V init interface to starting
and stopping the scheduler daemon<br>
</td>
<td valign="top">must<br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
</tr>
</tbody>
</table>
<br>
<h2>Essential use cases</h2>
This section lists generic (essential) uses cases, that do not contain
architecture-specific considerations.<br>
<br>
<object type="image/svg+xml" name="essential use cases"
data="EssentialUseCases.svg" height="800" width="700"></object>
<h3>UC-1 Upload playlist</h3>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>ref#</b> </td>
<td valign="top">UC-1 </td>
</tr>
<tr>
<td valign="top"><b>use case</b> </td>
<td valign="top">Upload playlist </td>
</tr>
<tr>
<td valign="top"><b>type</b> </td>
<td valign="top">primary, essential </td>
</tr>
<tr>
<td valign="top"><b>actors</b> </td>
<td valign="top">Playlist editor </td>
</tr>
<tr>
<td valign="top"><b>purpose</b> </td>
<td valign="top">Upload a playlist </td>
</tr>
<tr>
<td valign="top"><b>overview</b> </td>
<td valign="top">The Playlist editor uploads a new playlist. </td>
</tr>
<tr>
<td valign="top"><b>references</b> </td>
<td valign="top">F1.1 </td>
</tr>
</tbody>
</table>
<h4>Typical course of events</h4>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<th colspan="2" valign="top">actor action <br>
</th>
<th colspan="2" valign="top">system response <br>
</th>
</tr>
<tr>
<td valign="top"><b>1.</b> </td>
<td valign="top">Playlist editor connects to the scheduler daemon
with the intent of uploading a new playlist. <br>
</td>
<td valign="top"> <br>
</td>
<td valign="top"> <br>
</td>
</tr>
<tr>
<td valign="top"><b>2.</b> </td>
<td valign="top">The Playlist editor provides authentication
information </td>
<td valign="top"><b>3.</b> </td>
<td valign="top">The system authenticates the Playlist editor and
grants access. </td>
</tr>
<tr>
<td valign="top"><b>4.</b> </td>
<td valign="top">The Playlist editor presents the new playlist
and the intended schedule for the playlist.<br>
</td>
<td valign="top"><b>5.</b> </td>
<td valign="top">The system validates the new playlist, and sees
that it does not conflict with existing schedule. </td>
</tr>
<tr>
<td valign="top"> <br>
</td>
<td valign="top"> <br>
</td>
<td valign="top"><b>6.</b> </td>
<td valign="top">The system stores the new playlist, adds it to
the schedule, and sends confirmation to the Playlist editor. </td>
</tr>
<tr>
<td valign="top"><b>7.</b> </td>
<td valign="top">The Playlist editor receives confirmation and
disconnects. </td>
<td valign="top"> <br>
</td>
<td valign="top"> <br>
</td>
</tr>
<tr>
<td valign="top"> <br>
</td>
<td valign="top"> <br>
</td>
<td valign="top"> <br>
</td>
<td valign="top"> <br>
</td>
</tr>
</tbody>
</table>
<br>
<h4>Alternate courses</h4>
<ul>
<li><b>action 3:</b> the system finds that the user can not be
authenticated. the user is notified and the use case ends.<br>
</li>
<li><b>action 5:</b> the system finds that the uploaded playlist is
invalid, or it conflicts the existing schedule. the user is
notified and the use case ends.<br>
<br>
</li>
</ul>
<h3>UC-2 Manage schedule<br>
</h3>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>ref#</b><br>
</td>
<td valign="top">UC-2 </td>
</tr>
<tr>
<td valign="top"><b>use case</b> </td>
<td valign="top">Manage schedule </td>
</tr>
<tr>
<td valign="top"><b>type</b><br>
</td>
<td valign="top">primary, essential </td>
</tr>
<tr>
<td valign="top"><b>actors</b><br>
</td>
<td valign="top">Playlist editor </td>
</tr>
<tr>
<td valign="top"><b>purpose</b><br>
</td>
<td valign="top">View the schedule and remove or re-schedule
playlists<br>
</td>
</tr>
<tr>
<td valign="top"><b>overview</b><br>
</td>
<td valign="top">The Playlist editor reviews the schedule. If he
decides to, he might remove or re-schedule some of these playlists. </td>
</tr>
<tr>
<td valign="top"><b>references</b><br>
</td>
<td valign="top">F1.4, F1.9, F1.10<br>
</td>
</tr>
</tbody>
</table>
<br>
<h4>Typical course of events<br>
</h4>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<th colspan="2" valign="top">actor action <br>
</th>
<th colspan="2" valign="top">system response <br>
</th>
</tr>
<tr>
<td valign="top"><b>1.</b> </td>
<td valign="top">Playlist editor connects to the scheduler daemon
with the intent of viewing and editing the schedule.<br>
</td>
<td valign="top"> <br>
</td>
<td valign="top"> <br>
</td>
</tr>
<tr>
<td valign="top"><b>2.</b> </td>
<td valign="top">The Playlist editor provides authentication
information </td>
<td valign="top"><b>3.</b> </td>
<td valign="top">The system authenticates the Playlist editor and
grants access. </td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><b>4.</b><br>
</td>
<td valign="top">The system shows the Schedule to the Playlist
editor<br>
</td>
</tr>
<tr>
<td valign="top"><b>5.</b><br>
</td>
<td valign="top">The Playlist editor browses the Schedule,
selects a playlist for detailed viewing.<br>
</td>
<td valign="top"><b>6.</b><br>
</td>
<td valign="top">The system shows the details of the selected
Playlist.<br>
</td>
</tr>
<tr>
<td valign="top"><b>7.</b><br>
</td>
<td valign="top">The playlist editor removes a playlist from the
schedule.<br>
</td>
<td valign="top"><b>8.</b><br>
</td>
<td valign="top">The system removes the playlist from the
schedule, than re-displays the updated schedle.<br>
</td>
</tr>
<tr>
<td valign="top"><b>9.</b><br>
</td>
<td valign="top">The Playlist editor re-schedules a playlist<br>
</td>
<td valign="top"><b>10.</b><br>
</td>
<td valign="top">The system removes the selected playlist from
the schedule, and re-enters it at a new timepoint<br>
</td>
</tr>
<tr>
<td valign="top"> <b>11.</b><br>
</td>
<td valign="top"> The Playlist editor browses the Schedule<br>
</td>
<td valign="top"> <b>12.</b><br>
</td>
<td valign="top"> The system shows the Schedule to the playlist
editor<br>
</td>
</tr>
<tr>
<td valign="top"><b>13.</b><br>
</td>
<td valign="top">The Playlist editor disconnects.<br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
</tr>
</tbody>
</table>
<br>
<h4>Alternate courses</h4>
<ul>
<li><b>action 3:</b> the system finds that the user can not be
authenticated. the user is notified and the use case ends.</li>
<li><b>action 8:</b>
the user tries to remove a non-existent playlist from the schedule. the
user is notified, and the schedule is displayed to the user.</li>
<li><b>action 10:</b>
the new playtime for the schedule conflicts with already scheduled
playlist playtimes. the user is notified, and the schedule is displayed
again<br>
</li>
</ul>
<h3>UC-3 Manage playlists<br>
</h3>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>ref#</b><br>
</td>
<td valign="top">UC-3 </td>
</tr>
<tr>
<td valign="top"><b>use case</b> </td>
<td valign="top">Manage playlists </td>
</tr>
<tr>
<td valign="top"><b>type</b><br>
</td>
<td valign="top">primary, essential </td>
</tr>
<tr>
<td valign="top"><b>actors</b><br>
</td>
<td valign="top">Playlist editor </td>
</tr>
<tr>
<td valign="top"><b>purpose</b><br>
</td>
<td valign="top">View and delete playlists </td>
</tr>
<tr>
<td valign="top"><b>overview</b><br>
</td>
<td valign="top">The Playlist editor reviews the uploaded
playlists. If he decides so, he might delete some of these playlists. </td>
</tr>
<tr>
<td valign="top"><b>references</b><br>
</td>
<td valign="top">F1.4, F1.11<br>
</td>
</tr>
</tbody>
</table>
<br>
<h4>Typical course of events<br>
</h4>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<th colspan="2" valign="top">actor action <br>
</th>
<th colspan="2" valign="top">system response <br>
</th>
</tr>
<tr>
<td valign="top"><b>1.</b> </td>
<td valign="top">Playlist editor connects to the scheduler daemon
with the intent of viewing and deleting playlists.<br>
</td>
<td valign="top"> <br>
</td>
<td valign="top"> <br>
</td>
</tr>
<tr>
<td valign="top"><b>2.</b> </td>
<td valign="top">The Playlist editor provides authentication
information </td>
<td valign="top"><b>3.</b> </td>
<td valign="top">The system authenticates the Playlist editor and
grants access. </td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><b>4.</b><br>
</td>
<td valign="top">The system lists the available Playlists<br>
</td>
</tr>
<tr>
<td valign="top"><b>5.</b><br>
</td>
<td valign="top">The Playlist editor browses the playlists, and
selects one for detailed viewing.<br>
</td>
<td valign="top"><b>6.</b><br>
</td>
<td valign="top">The system shows the details of the selected
Playlist.<br>
</td>
</tr>
<tr>
<td valign="top"><b>7.</b><br>
</td>
<td valign="top">The playlist editor deletes a playlist.<br>
</td>
<td valign="top"><b>8.</b><br>
</td>
<td valign="top">The system deletes the playlist, than
re-displays the list of available Playlists.<br>
</td>
</tr>
<tr>
<td valign="top"><b>9.</b><br>
</td>
<td valign="top">The Playlist editor disconnects.<br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
</tr>
</tbody>
</table>
<br>
<h4>Alternate courses</h4>
<ul>
<li><b>action 3:</b> the system finds that the user can not be
authenticated. the user is notified and the use case ends.</li>
<li><b>action 8:</b>
the user tries to delete a non-existent or a scheduled playlist. the
user is notified, and the list of playlists is displayed to the user.<br>
</li>
</ul>
<h3>UC-4 Retrieve remote files<br>
</h3>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>ref#</b> </td>
<td valign="top">UC-4 </td>
</tr>
<tr>
<td valign="top"><b>use case</b> </td>
<td valign="top">Retrieve remote files </td>
</tr>
<tr>
<td valign="top"><b>type</b><br>
</td>
<td valign="top">primary, essential </td>
</tr>
<tr>
<td valign="top"><b>actors</b><br>
</td>
<td valign="top">(internal actor, initiator), Media archive,
Local storage<br>
</td>
</tr>
<tr>
<td valign="top"><b>purpose</b><br>
</td>
<td valign="top">Retrieve remote files referenced by active
playlists and store them in the local storage<br>
</td>
</tr>
<tr>
<td valign="top"><b>overview</b><br>
</td>
<td valign="top">The
daemon contacts the remote media archive and retrieves audio clips
referenced by active playlists. The clips are stored locally for
playing. </td>
</tr>
<tr>
<td valign="top"><b>references</b><br>
</td>
<td valign="top">F1.2 </td>
</tr>
</tbody>
</table>
<br>
Note that this use case is somewhat reversed, as it is initiated by the
system (not an actor), and the main tasks are done by an external actor
(the Media archive).<br>
<h4>Typical course of events</h4>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<th colspan="2" valign="top">actor action <br>
</th>
<th colspan="2" valign="top">system response <br>
</th>
</tr>
<tr>
<td valign="top"><b>1.</b> </td>
<td valign="top">An Internal actor triggers the retrieval of some
remote files. <br>
</td>
<td valign="top"><b>2.</b> </td>
<td valign="top">The system looks up the URN of the remote file,
and determines the Media archive to contact regarding the file. </td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><b>3.</b><br>
</td>
<td valign="top">The system contacts the Local storage and sends
authorization information<br>
</td>
</tr>
<tr>
<td valign="top"><b>4.</b><br>
</td>
<td valign="top">Local storage authenticates the system and
grants access<br>
</td>
<td valign="top"><b>5.</b><br>
</td>
<td valign="top">The system iniquires the local storage about the
availability of the file to download in the Local storage by presenting
its unique ID<br>
</td>
</tr>
<tr>
<td valign="top"><b>6.</b><br>
</td>
<td valign="top">Local storage tells if the required file is
already stored or not.<br>
</td>
<td valign="top"><b>7.</b><br>
</td>
<td valign="top">If the file is available in the local storage,
the use case ends. Otherwise, it continues.<br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top"> <br>
</td>
<td valign="top"><b>8.</b><br>
</td>
<td valign="top">The system contacts the Media archive and sends
authorization information </td>
</tr>
<tr>
<td valign="top"><b>9.</b> </td>
<td valign="top">Media archive authenticates the system and
grants access </td>
<td valign="top"><b>10.</b> </td>
<td valign="top">The system requests an audio clip by presenting
its unique ID </td>
</tr>
<tr>
<td valign="top"><b>11.</b> </td>
<td valign="top">Media archive looks up the file, and presents it
to the system </td>
<td valign="top"><b>12.</b> </td>
<td valign="top">The system retrieves the file and closes the
connection to the Media archive<br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><b>13.</b><br>
</td>
<td valign="top">The system presents the file to Local storage<br>
</td>
</tr>
<tr>
<td valign="top"><b>14.</b><br>
</td>
<td valign="top">Local storage stores the file under the
specified unique ID<br>
</td>
<td valign="top"><b>15.</b><br>
</td>
<td valign="top">The system closes the connection to Local
storage.<br>
</td>
</tr>
<tr>
<td valign="top"> <br>
</td>
<td valign="top"> <br>
</td>
<td valign="top"> <br>
</td>
<td valign="top"> <br>
</td>
</tr>
</tbody>
</table>
<br>
<h4>Alternate courses</h4>
<ul>
<li><b>action 4:</b> the Local storage finds that the system can not
be authenticated. the system is notified and the use case ends.</li>
<li><b>action 9:</b> the Media archive finds that the system can not
be authenticated. the system is notified and the use case ends.</li>
<li><b>action 11:</b> the Media archive does not hold the requested
audio clip. the system is notified and the use case ends.<br>
<br>
</li>
</ul>
<h3>UC-5 Review play log<br>
</h3>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>ref#</b> </td>
<td valign="top">UC-5 </td>
</tr>
<tr>
<td valign="top"><b>use case</b> </td>
<td valign="top">Review play log </td>
</tr>
<tr>
<td valign="top"><b>type</b> </td>
<td valign="top">secondary, essential </td>
</tr>
<tr>
<td valign="top"><b>actors</b> </td>
<td valign="top">Broadcast auditor </td>
</tr>
<tr>
<td valign="top"><b>purpose</b> </td>
<td valign="top">Review what has been played </td>
</tr>
<tr>
<td valign="top"><b>overview</b> </td>
<td valign="top">The
Broadcast auditor reviews the audio clips that have been played in a
selected time interval. He may generate reports for proof of broadcast
reasons. </td>
</tr>
<tr>
<td valign="top"><b>references</b> </td>
<td valign="top">F1.4 </td>
</tr>
</tbody>
</table>
<h4>Typical course of events<br>
</h4>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<th colspan="2" valign="top">actor action <br>
</th>
<th colspan="2" valign="top">system response <br>
</th>
</tr>
<tr>
<td valign="top"><b>1.</b> </td>
<td valign="top">Broadcast auditor connects to the scheduler
daemon with the intent of reviewing what has been played.<br>
</td>
<td valign="top"> <br>
</td>
<td valign="top"> <br>
</td>
</tr>
<tr>
<td valign="top"><b>2.</b> </td>
<td valign="top">The Broadcast auditor provides authentication
information </td>
<td valign="top"><b>3.</b> </td>
<td valign="top">The system authenticates the Broadcast auditor
and grants access. </td>
</tr>
<tr>
<td valign="top"><b>3.</b><br>
</td>
<td valign="top">The Broadcast auditor browses through the play
log in a time-ordered manner.<br>
</td>
<td valign="top"><b>4.</b><br>
</td>
<td valign="top">The system displays the play log entries.<br>
</td>
</tr>
<tr>
<td valign="top"><b>5.</b><br>
</td>
<td valign="top">The Broadcast auditor requests a play report for
a given time period.<br>
</td>
<td valign="top"><b>6.</b><br>
</td>
<td valign="top">The system displays the requested report.<br>
</td>
</tr>
<tr>
<td valign="top"><b>7.</b><br>
</td>
<td valign="top">The Broadcast auditor disconnects.<br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
</tr>
</tbody>
</table>
<br>
<h4>Alternate courses</h4>
<ul>
<li><b>action 3:</b> the system finds that the user can not be
authenticated. the user is notified and the use case ends.</li>
</ul>
<br>
<h3>UC-6 Create playlist<br>
</h3>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>ref#</b> </td>
<td valign="top">UC-6 </td>
</tr>
<tr>
<td valign="top"><b>use case</b> </td>
<td valign="top">Create playlist<br>
</td>
</tr>
<tr>
<td valign="top"><b>type</b> </td>
<td valign="top">secondary, essential </td>
</tr>
<tr>
<td valign="top"><b>actors</b> </td>
<td valign="top">Playlist editor<br>
</td>
</tr>
<tr>
<td valign="top"><b>purpose</b> </td>
<td valign="top">Create a new playlist, and then edit it.<br>
</td>
</tr>
<tr>
<td valign="top"><b>overview</b> </td>
<td valign="top">The Playlist editor connects to the Scheduler
with the aim of creating a new playlist. A basic user interface is
provided, which allows professionals to create and edit the playlsits
on the system.<br>
</td>
</tr>
<tr>
<td valign="top"><b>references</b> </td>
<td valign="top">F1.12, F1.13<br>
</td>
</tr>
</tbody>
</table>
<h4>Typical course of events<br>
</h4>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<th colspan="2" valign="top">actor action <br>
</th>
<th colspan="2" valign="top">system response <br>
</th>
</tr>
<tr>
<td valign="top"><b>1.</b> </td>
<td valign="top">Playlist editor connects to the scheduler with
the intent of creating a new playlist.<br>
</td>
<td valign="top"> <br>
</td>
<td valign="top"> <br>
</td>
</tr>
<tr>
<td valign="top"><b>2.</b> </td>
<td valign="top">The Playlist editor provides authentication
information </td>
<td valign="top"><b>3.</b> </td>
<td valign="top">The system authenticates the Playlist editor and
grants access. </td>
</tr>
<tr>
<td valign="top"><b>4.</b><br>
</td>
<td valign="top">The Playlist editor signals that he whishes for
a new playlist<br>
</td>
<td valign="top"><b>5.</b><br>
</td>
<td valign="top">The system creates a new, empty playlist, and
opens it for editing.<br>
</td>
</tr>
<tr>
<td valign="top"><b>6.</b><br>
</td>
<td valign="top">The Playlist editor edits the new playlist. See
UC-7 actions 7-15 for details.<br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
</tr>
<tr>
<td valign="top"><b>7.</b><br>
</td>
<td valign="top">The Playlist editor disconnects.<br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
</tr>
</tbody>
</table>
<br>
<h4>Alternate courses</h4>
<ul>
<li><b>action 3:</b> the system finds that the user can not be
authenticated. the user is notified and the use case ends.</li>
</ul>
<br>
<h3>UC-7 Edit playlist<br>
</h3>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>ref#</b> </td>
<td valign="top">UC-7 </td>
</tr>
<tr>
<td valign="top"><b>use case</b> </td>
<td valign="top">Edit playlist<br>
</td>
</tr>
<tr>
<td valign="top"><b>type</b> </td>
<td valign="top">secondary, essential </td>
</tr>
<tr>
<td valign="top"><b>actors</b> </td>
<td valign="top">Playlist editor<br>
</td>
</tr>
<tr>
<td valign="top"><b>purpose</b> </td>
<td valign="top">Edit a previoulsy uploaded playlist<br>
</td>
</tr>
<tr>
<td valign="top"><b>overview</b> </td>
<td valign="top">The Playlist editor connects to the
Scheduler with the aim of either editing an existing playlist. A basic
user interface is provided, which allows
professionals to edit the playlsits on the system.<br>
</td>
</tr>
<tr>
<td valign="top"><b>references</b> </td>
<td valign="top">F1.12 </td>
</tr>
</tbody>
</table>
<h4>Typical course of events<br>
</h4>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<th colspan="2" valign="top">actor action <br>
</th>
<th colspan="2" valign="top">system response <br>
</th>
</tr>
<tr>
<td valign="top"><b>1.</b> </td>
<td valign="top">Playlist editor connects to the scheduler with
the intent of editing a playlist.<br>
</td>
<td valign="top"> <br>
</td>
<td valign="top"> <br>
</td>
</tr>
<tr>
<td valign="top"><b>2.</b> </td>
<td valign="top">The Playlist editor provides authentication
information </td>
<td valign="top"><b>3.</b> </td>
<td valign="top">The system authenticates the Playlist editor and
grants access. </td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><b>4.</b><br>
</td>
<td valign="top">The system lists the available playlists.<br>
</td>
</tr>
<tr>
<td valign="top"><b>5.</b><br>
</td>
<td valign="top">The Playlist editor selects a playlist for
editing.<br>
</td>
<td valign="top"><b>6.</b><br>
</td>
<td valign="top">The system opens the playlist in editing mode.<br>
</td>
</tr>
<tr>
<td valign="top"><b>7.</b><br>
</td>
<td valign="top">The Playlist editor browses the available Audio
clips<br>
</td>
<td valign="top"><b>8.</b><br>
</td>
<td valign="top">The system shows the list of available audio
clips<br>
</td>
</tr>
<tr>
<td valign="top"><b>9.</b><br>
</td>
<td valign="top">The Playlist editor selects an Audio clip<br>
</td>
<td valign="top"><b>10.</b><br>
</td>
<td valign="top">The system displays details on the audio clip.<br>
</td>
</tr>
<tr>
<td valign="top"><b>11.</b><br>
</td>
<td valign="top">The Playlist editor ads a new audio clip to the
playlist, at a certain timepoint in the playlist.<br>
</td>
<td valign="top"><b>12.</b><br>
</td>
<td valign="top">The new audio clip is added to the playlist.<br>
</td>
</tr>
<tr>
<td valign="top"><b>13.</b><br>
</td>
<td valign="top">The Playlist editor removes an audio clip from
the playlist.<br>
</td>
<td valign="top"><b>14.</b><br>
</td>
<td valign="top">The audio clip is removed from the playlist.<br>
</td>
</tr>
<tr>
<td valign="top"><b>15.</b><br>
</td>
<td valign="top">The Playlist editor edits the fade-in or
fade-out of a clip in the playlist.<br>
</td>
<td valign="top"><b>16.</b><br>
</td>
<td valign="top">The fade-in or fade-out is edited.<br>
</td>
</tr>
<tr>
<td valign="top"><b>17.</b><br>
</td>
<td valign="top">The Playlist editor saves the playlist.<br>
</td>
<td valign="top"><b>18.</b><br>
</td>
<td valign="top">The playlist is validated.<br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><b>19.</b><br>
</td>
<td valign="top">The playlist is saved.<br>
</td>
</tr>
<tr>
<td valign="top"><b>20.</b><br>
</td>
<td valign="top">The Playlist editor disconnects.<br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
</tr>
</tbody>
</table>
<br>
<h4>Alternate courses</h4>
<ul>
<li><b>action 3:</b> the system finds that the user can not be
authenticated. the user is notified and the use case ends.</li>
<li><b>action 6:</b> the selected playlist is currently being
executed. the user is notified that executing playlists can not be
edited and the use case ends.</li>
<li><b>action 17:</b> the user decides not to save the playlist, but
to revert to the version prior to editing. the playlist is reverted,
and is shown to the user in non-edit mode.<br>
</li>
<li><b>action 18:</b> the playlist turns out not be valid. the user
is notified that such a playlist can not be saved, and is given an
opportunity to further edit the playlist. validation errors are also
shown.</li>
</ul>
<br>
<h3>UC-8 Start/stop scheduler<br>
</h3>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>ref#</b> </td>
<td valign="top">UC-8 </td>
</tr>
<tr>
<td valign="top"><b>use case</b> </td>
<td valign="top">Start/stop scheduler<br>
</td>
</tr>
<tr>
<td valign="top"><b>type</b> </td>
<td valign="top">primary, essential </td>
</tr>
<tr>
<td valign="top"><b>actors</b> </td>
<td valign="top">Administrator<br>
</td>
</tr>
<tr>
<td valign="top"><b>purpose</b> </td>
<td valign="top">Start and stop the scheduler daemon<br>
</td>
</tr>
<tr>
<td valign="top"><b>overview</b> </td>
<td valign="top">The adminisitrator starts the scheduler deamon
by invoking a System V init-style startup script. He may also stop the
deamon with the same script.<br>
</td>
</tr>
<tr>
<td valign="top"><b>references</b> </td>
<td valign="top">F1.14, F1.15, A1.8<br>
</td>
</tr>
</tbody>
</table>
<h4>Typical course of events<br>
</h4>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<th colspan="2" valign="top">actor action <br>
</th>
<th colspan="2" valign="top">system response <br>
</th>
</tr>
<tr>
<td valign="top"><b>1.</b> </td>
<td valign="top">The Administrator invokes the scheduler's System
V init script with the start parameter<br>
</td>
<td valign="top"> <br>
</td>
<td valign="top"> <br>
</td>
</tr>
<tr>
<td valign="top"> <br>
</td>
<td valign="top"> <br>
</td>
<td valign="top"><b>2.</b> </td>
<td valign="top">The scheduler daemon starts up.<br>
</td>
</tr>
<tr>
<td valign="top"><b>3.</b><br>
</td>
<td valign="top">The Administrator checks to see if the scheduler
daemon is running<br>
</td>
<td valign="top"><b>4.</b><br>
</td>
<td valign="top">The scheduler daemon reports that it is running.<br>
</td>
</tr>
<tr>
<td valign="top"><b>5.</b><br>
</td>
<td valign="top">The Administrator stops the scheduler deamon.<br>
</td>
<td valign="top"><b>6.</b><br>
</td>
<td valign="top">The scheduler daemon stops.<br>
</td>
</tr>
</tbody>
</table>
<br>
<h4>Alternate courses</h4>
<ul>
<li><b>action 2:</b> if the scheduler is already running, indicate
the starting attempt as an error.<br>
</li>
<li><b>action 4:</b> if the scheduler daemon is not running, it is
reported that it is not running.<br>
</li>
<li><b>action 6:</b> if the scheduler daemon is not running, it is
not stopped.<br>
</li>
</ul>
<h2>Conceptual model</h2>
The following figure displays the semantic concepts identified for the
Scheduler daemon, and the main associations between the concepts.<br>
<br>
<object type="image/svg+xml" name="essential use cases"
data="Concepts.svg" height="1000" width="950"></object>
<br>
<h3>Concepts</h3>
<br>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<th valign="top">concept<br>
</th>
<th valign="top">description<br>
</th>
</tr>
<tr>
<td valign="top"><b>Media archive</b><br>
</td>
<td valign="top">An archive external to the system, which holds
Audio clips. The archive offers its clips for download by requesting
clips based on their unique ids.<br>
</td>
</tr>
<tr>
<td valign="top"><b>Clip retriever</b><br>
</td>
<td valign="top">Retrieves Audio clips from the Media archive and
stores them in local storage.<br>
</td>
</tr>
<tr>
<td valign="top"><b>Local storage</b><br>
</td>
<td valign="top">A local store of Audio clips. Provides access to
each clip based on the clips' unique id. Allows random access to the
clip files.<br>
</td>
</tr>
<tr>
<td valign="top"><b>Audio clip</b><br>
</td>
<td valign="top">A uniquely identified audio file.<br>
</td>
</tr>
<tr>
<td valign="top"><b>Playlist</b><br>
</td>
<td valign="top">A metafile, containing references to Audio
clips, and information on how the clips should be played.<br>
</td>
</tr>
<tr>
<td valign="top"><b>PlaylistElement</b><br>
</td>
<td valign="top">An association class describing the specifics of
an instance of an Audio clip in a playlist.<br>
</td>
</tr>
<tr>
<td valign="top"><b>FadeInfo</b><br>
</td>
<td valign="top">A class describing fade in or fade out
characteristics for an Audio clip in a Playlist<br>
</td>
</tr>
<tr>
<td valign="top"><b>Playlist store</b><br>
</td>
<td valign="top">A container holding a range of playlists.<br>
</td>
</tr>
<tr>
<td valign="top"><b>Schedule</b><br>
</td>
<td valign="top">Contains Schedule entries<br>
</td>
</tr>
<tr>
<td valign="top"><b>Schedule entry</b><br>
</td>
<td valign="top">Contains the time and details of when a playlist
should be played.<br>
</td>
</tr>
<tr>
<td valign="top"><b>Scheduler daemon</b><br>
</td>
<td valign="top">Executes playlists at timepoints specified by
the schedule.<br>
</td>
</tr>
<tr>
<td valign="top"><b>Play log</b><br>
</td>
<td valign="top">A logging facility, holding Play log entries.<br>
</td>
</tr>
<tr>
<td valign="top"><b>Play log entry</b><br>
</td>
<td valign="top">A record of when an Audio clip was played.<br>
</td>
</tr>
<tr>
<td valign="top"><b>Play report</b><br>
</td>
<td valign="top">An audit report of what Audio clips have been
played in a certain time period<br>
</td>
</tr>
<tr>
<td valign="top"><b>Authentication</b><br>
</td>
<td valign="top">Provides authentication services<br>
</td>
</tr>
<tr>
<td valign="top"><b>Playlist editor</b><br>
</td>
<td valign="top">An external editor, managing playlists.<br>
</td>
</tr>
<tr>
<td valign="top"><b>Broadcast auditor</b><br>
</td>
<td valign="top">An external auditor, browsing the Play log.<br>
</td>
</tr>
<tr>
<td valign="top"><b>Administrator</b><br>
</td>
<td valign="top">The administrator responsible for starting and
stopping the scheduler daemon.<br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
</tr>
</tbody>
</table>
<br>
<h3>Associations</h3>
<br>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<th valign="top">source<br>
</th>
<th valign="top">association<br>
</th>
<th valign="top">target<br>
</th>
<th valign="top">description<br>
</th>
</tr>
<tr>
<td valign="top">Clip retriever<br>
</td>
<td valign="top">Retrieves clips from<br>
</td>
<td valign="top">Media archive<br>
</td>
<td valign="top"><br>
</td>
</tr>
<tr>
<td valign="top">Media archive<br>
</td>
<td valign="top">Contains<br>
</td>
<td valign="top">Audio clip<br>
</td>
<td valign="top"><br>
</td>
</tr>
<tr>
<td valign="top">Clip retriever<br>
</td>
<td valign="top">Stores clips in<br>
</td>
<td valign="top">Local storage<br>
</td>
<td valign="top"><br>
</td>
</tr>
<tr>
<td valign="top">Local storage<br>
</td>
<td valign="top">Contains<br>
</td>
<td valign="top">Audio clip<br>
</td>
<td valign="top"><br>
</td>
</tr>
<tr>
<td valign="top">Playlist<br>
</td>
<td valign="top">References by PlaylistElement<br>
</td>
<td valign="top">Audio clip<br>
</td>
<td valign="top"><br>
</td>
</tr>
<tr>
<td valign="top">PlaylistElement<br>
</td>
<td valign="top">Fades in with<br>
</td>
<td valign="top">FadeInfo<br>
</td>
<td valign="top"><br>
</td>
</tr>
<tr>
<td valign="top">PlaylistElement<br>
</td>
<td valign="top">Fades out with<br>
</td>
<td valign="top">FadeInfo<br>
</td>
<td valign="top"><br>
</td>
</tr>
<tr>
<td valign="top">Playlist store<br>
</td>
<td valign="top">Contains<br>
</td>
<td valign="top">Play list<br>
</td>
<td valign="top"><br>
</td>
</tr>
<tr>
<td valign="top">Playlist editor<br>
</td>
<td valign="top">Uploads playlist to<br>
</td>
<td valign="top">Playlist store<br>
</td>
<td valign="top"><br>
</td>
</tr>
<tr>
<td valign="top">Playlist editor<br>
</td>
<td valign="top">Manages schedule in<br>
</td>
<td valign="top">Schedule<br>
</td>
<td valign="top">The Playlist editor schedules playlists.<br>
</td>
</tr>
<tr>
<td valign="top">Schedule<br>
</td>
<td valign="top">Contains<br>
</td>
<td valign="top">Schedule entry<br>
</td>
<td valign="top"><br>
</td>
</tr>
<tr>
<td valign="top">Schedule entry<br>
</td>
<td valign="top">References<br>
</td>
<td valign="top">Playlist<br>
</td>
<td valign="top"><br>
</td>
</tr>
<tr>
<td valign="top">Scheduler daemon<br>
</td>
<td valign="top">Executes<br>
</td>
<td valign="top">Schedule<br>
</td>
<td valign="top">The Scheduler daemon plays the scheduled
playlists.<br>
</td>
</tr>
<tr>
<td valign="top">Scheduler daemon<br>
</td>
<td valign="top">Logs into<br>
</td>
<td valign="top">Play log<br>
</td>
<td valign="top">The Scheduler daemon logs all the played audio
clips into the Play log for proof of broadcast purposes.<br>
</td>
</tr>
<tr>
<td valign="top">Play log<br>
</td>
<td valign="top">Contains<br>
</td>
<td valign="top">Play log entry<br>
</td>
<td valign="top"><br>
</td>
</tr>
<tr>
<td valign="top">Play log<br>
</td>
<td valign="top">Generated<br>
</td>
<td valign="top">Play report<br>
</td>
<td valign="top">The play log generates reports based on Play log
entries.<br>
</td>
</tr>
<tr>
<td valign="top">Play log entry<br>
</td>
<td valign="top">References<br>
</td>
<td valign="top">Audio clip<br>
</td>
<td valign="top"><br>
</td>
</tr>
<tr>
<td valign="top">Broadcast auditor<br>
</td>
<td valign="top">Browses entries from<br>
</td>
<td valign="top">Play log<br>
</td>
<td valign="top"><br>
</td>
</tr>
<tr>
<td valign="top">Broadcast auditor<br>
</td>
<td valign="top">Requests<br>
</td>
<td valign="top">Play report<br>
</td>
<td valign="top"><br>
</td>
</tr>
<tr>
<td valign="top">Playlist editor<br>
</td>
<td valign="top">Is authenticated by<br>
</td>
<td valign="top">Authentication<br>
</td>
<td valign="top"><br>
</td>
</tr>
<tr>
<td valign="top">Broadcast auditor<br>
</td>
<td valign="top">Is authenticated by<br>
</td>
<td valign="top">Authentication<br>
</td>
<td valign="top"><br>
</td>
</tr>
<tr>
<td valign="top">Administrator<br>
</td>
<td valign="top">Manages<br>
</td>
<td valign="top">Scheduler daemon<br>
</td>
<td valign="top"><br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
</tr>
</tbody>
</table>
<br>
<h2>System behavior</h2>
The behavior of the system as a whole as experienced from the outside
is discussed in this section.<br>
<h3>System sequence diagrams</h3>
System diagrams are presented for each use case below.<br>
<h4>UC-1 Upload playlists</h4>
<object type="image/svg+xml" name="upload playlists sequence diagram"
data="Uploadplaylists_SequenceDiagram.svg" height="200" width="550"></object>
<br>
<h4>UC-2 Manage schedule</h4>
<object type="image/svg+xml" name="manage playlists sequence diagram"
data="Manageschedule_SequenceDiagram.svg" height="350" width="650"></object>
<br>
<h4>UC-3 Manage playlists</h4>
<object type="image/svg+xml" name="manage playlists sequence diagram"
data="Manageplaylists_SequenceDiagram.svg" height="300" width="650"></object>
<br>
<h4>UC-4 Retrieve remote files<br>
</h4>
<object type="image/svg+xml"
name="retrieve remote files sequence diagram"
data="Retrieveremotefiles_SequenceDiagram.svg" height="300" width="750"></object>
<br>
<h4>UC-5 Review play log</h4>
<object type="image/svg+xml" name="review play log sequence diagram"
data="Reviewplaylog_SequenceDiagram.svg" height="250" width="650"></object>
<h4>UC-6 Create playlist</h4>
<object type="image/svg+xml" name="create playlist sequence diagram"
data="Createplaylist_SequenceDiagram.svg" height="250" width="650"></object>
<h4>UC-7 Edit playlist<br>
<object type="image/svg+xml" name="edit playlist sequence diagram"
data="Editplaylist_SequenceDiagram.svg" height="500" width="800"></object>
</h4>
<h4>UC-8 Start/stop scheduler</h4>
<object type="image/svg+xml"
name="start/stop scheduler sequence diagram"
data="Startstopscheduler_SequenceDiagram.svg" height="200" width="600"></object>
<br>
<br>
<h3>System objects</h3>
The following figures shows the system objects and their functions, as
derived from the system sequence diagrams.<br>
<object type="image/svg+xml" name="system behaviour"
data="Systembehaviour.svg" height="450" width="550"></object>
<h3>Contracts</h3>
For all operations exposed in the system sequence diagrams, the
following contracts are defined.<br>
<h4>Contract for Scheduler : authenticate</h4>
See Authentication : authenticate<br>
<br>
<h4>Contract for Scheduler : uploadPlaylist</h4>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">uploadPlaylist<br>
(playlist : Playlist,<br>
playtime: Schedule)<br>
: UniqueId<br>
</td>
</tr>
<tr>
<td valign="top"><b>Responsibilities</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">Upload a playlist and
put it into the schedule.<br>
</td>
</tr>
<tr>
<td valign="top"><b>Type</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">system<br>
</td>
</tr>
<tr>
<td valign="top"><b>Cross-reference</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">F1.1, UC-1<br>
</td>
</tr>
<tr>
<td valign="top"><b>Notes</b><br>
</td>
<td colspan="2" rowspan="1" valign="top"><br>
</td>
</tr>
<tr>
<td valign="top"><b>Exceptions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">If the uploaded playlist
is not valid, indicate as an error<br>
If the proposed schedule conflicts with existing schedules, indicate as
an error<br>
</td>
</tr>
<tr>
<td valign="top"><b>Output</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">the unique id of the
ScheduleEntry created with this upload<br>
</td>
</tr>
<tr>
<td valign="top"><b>Pre-conditions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none</td>
</tr>
<tr>
<td valign="top"><b>Post-conditions</b><br>
</td>
<td align="center" valign="top"><b>condition</b><br>
</td>
<td align="center" valign="top"><b>type</b><br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top">A new Playlist is created, storing the uploaded
playlist<br>
</td>
<td valign="top">instance creation </td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top">Playlist is entered into the Playlist store<br>
</td>
<td valign="top">association formed<br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top">A new Schedule is created, according to the
supplied schedule<br>
</td>
<td valign="top">instance creation<br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top">Schedule is associated with the Playlist<br>
</td>
<td valign="top">association formed<br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
</tr>
</tbody>
</table>
<br>
<h4>Contract for Scheduler : displaySchedule</h4>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">displaySchedule<br>
(from : TimeStamp,<br>
to : TimeStamp)<br>
: Schedule<br>
</td>
</tr>
<tr>
<td valign="top"><b>Responsibilities</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">Display Schedule entries
for a time period.<br>
</td>
</tr>
<tr>
<td valign="top"><b>Type</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">system<br>
</td>
</tr>
<tr>
<td valign="top"><b>Cross-reference</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">F1.4, UC-2<br>
</td>
</tr>
<tr>
<td valign="top"><b>Notes</b><br>
</td>
<td colspan="2" rowspan="1" valign="top"><br>
</td>
</tr>
<tr>
<td valign="top"><b>Exceptions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none<br>
</td>
</tr>
<tr>
<td valign="top"><b>Output</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">The Schedule entries for
the specified time period.<br>
</td>
</tr>
<tr>
<td valign="top"><b>Pre-conditions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none</td>
</tr>
<tr>
<td valign="top"><b>Post-conditions</b><br>
</td>
<td align="left" valign="top">none<br>
</td>
<td align="center" valign="top"><br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
</tr>
</tbody>
</table>
<br>
<h4>Contract for Scheduler : displayPlaylist</h4>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">displayPlaylist<br>
(playlistId : UniqueId)<br>
: Playlist<br>
</td>
</tr>
<tr>
<td valign="top"><b>Responsibilities</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">Display a specific
playlist<br>
</td>
</tr>
<tr>
<td valign="top"><b>Type</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">system<br>
</td>
</tr>
<tr>
<td valign="top"><b>Cross-reference</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">F1.4, UC-3<br>
</td>
</tr>
<tr>
<td valign="top"><b>Notes</b><br>
</td>
<td colspan="2" rowspan="1" valign="top"><br>
</td>
</tr>
<tr>
<td valign="top"><b>Exceptions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">If no playlist exists
for the specified playlistId, indicate as an error.<br>
</td>
</tr>
<tr>
<td valign="top"><b>Output</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">The requested playlist.<br>
</td>
</tr>
<tr>
<td valign="top"><b>Pre-conditions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none</td>
</tr>
<tr>
<td valign="top"><b>Post-conditions</b><br>
</td>
<td align="left" valign="top">none<br>
</td>
<td align="center" valign="top"><br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
</tr>
</tbody>
</table>
<br>
<h4>Contract for Scheduler : deletePlaylist</h4>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">deletePlaylist<br>
(playlist : Playlist)<br>
: void<br>
</td>
</tr>
<tr>
<td valign="top"><b>Responsibilities</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">Delete a specific
playlist<br>
</td>
</tr>
<tr>
<td valign="top"><b>Type</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">system<br>
</td>
</tr>
<tr>
<td valign="top"><b>Cross-reference</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">F1.11, UC-3<br>
</td>
</tr>
<tr>
<td valign="top"><b>Notes</b><br>
</td>
<td colspan="2" rowspan="1" valign="top"><br>
</td>
</tr>
<tr>
<td valign="top"><b>Exceptions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">If no playlist exists
for the specified playlistId, indicate as an error.<br>
If the playlist is referenced by any Schedule entry, indicate as an
error.<br>
</td>
</tr>
<tr>
<td valign="top"><b>Output</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none<br>
</td>
</tr>
<tr>
<td valign="top"><b>Pre-conditions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none</td>
</tr>
<tr>
<td valign="top"><b>Post-conditions</b><br>
</td>
<td align="center" valign="top"><b>condition</b><br>
</td>
<td align="center" valign="top"><b>type</b><br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top">The playlist is removed from the Playlist store.<br>
</td>
<td valign="top">association broken<br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top">References by the playlist to Audio clips removed<br>
</td>
<td valign="top">association broken<br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top">The playlist is deleted<br>
</td>
<td valign="top">instance deletion<br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
</tr>
</tbody>
</table>
<br>
<h4>Contract for Scheduler : removeFromSchedule<br>
</h4>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">removeFromSchedule<br>
(scheduleEntryId : UniqueId)<br>
: bool<br>
</td>
</tr>
<tr>
<td valign="top"><b>Responsibilities</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">Remove a specific
playlist from a schedule entry<br>
</td>
</tr>
<tr>
<td valign="top"><b>Type</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">system<br>
</td>
</tr>
<tr>
<td valign="top"><b>Cross-reference</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">F1.9, UC-2<br>
</td>
</tr>
<tr>
<td valign="top"><b>Notes</b><br>
</td>
<td colspan="2" rowspan="1" valign="top"><br>
</td>
</tr>
<tr>
<td valign="top"><b>Exceptions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">If no ScheduleEntry by
the specified
scheduleEntryId exist, indicate as an error.<br>
</td>
</tr>
<tr>
<td valign="top"><b>Output</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">true if the specified
entry was removed, false if it did not exist.<br>
</td>
</tr>
<tr>
<td valign="top"><b>Pre-conditions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none</td>
</tr>
<tr>
<td valign="top"><b>Post-conditions</b><br>
</td>
<td align="center" valign="top"><b>condition</b><br>
</td>
<td align="center" valign="top"><b>type</b><br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top">Reference to the playlist by the scheduleEntry
is removed.<br>
</td>
<td valign="top">association broken<br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top">The ScheduleEntry specified by the
scheduleEntryId is deleted<br>
</td>
<td valign="top">instance deletion<br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
</tr>
</tbody>
</table>
<br>
<h4>Contract for Scheduler : reschedule<br>
</h4>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">reschedule<br>
(scheduleEntryId : UniqueId,<br>
playtime : TimeStamp)<br>
: bool<br>
</td>
</tr>
<tr>
<td valign="top"><b>Responsibilities</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">Change when a certain
playlist is scheduled to play.<br>
</td>
</tr>
<tr>
<td valign="top"><b>Type</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">system<br>
</td>
</tr>
<tr>
<td valign="top"><b>Cross-reference</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">F1.10, UC-2<br>
</td>
</tr>
<tr>
<td valign="top"><b>Notes</b><br>
</td>
<td colspan="2" rowspan="1" valign="top"><br>
</td>
</tr>
<tr>
<td valign="top"><b>Exceptions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">If no ScheduleEntry by
the specified
scheduleEntryId exist, indicate as an error.<br>
If the new playtime conflicts with other schedule entries, indicate as
an error.<br>
</td>
</tr>
<tr>
<td valign="top"><b>Output</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">false on errors<br>
</td>
</tr>
<tr>
<td valign="top"><b>Pre-conditions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none</td>
</tr>
<tr>
<td valign="top"><b>Post-conditions</b><br>
</td>
<td align="center" valign="top"><b>condition</b><br>
</td>
<td align="center" valign="top"><b>type</b><br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top">The time attribute of scheduleEntry is updated
to the supplied playtime.<br>
</td>
<td valign="top">attribute modification<br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
</tr>
</tbody>
</table>
<br>
<h4>Contract for Scheduler : displayPlaylists</h4>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">displayPlaylists<br>
()<br>
: Playlist<br>
</td>
</tr>
<tr>
<td valign="top"><b>Responsibilities</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">Display Playlists
contained in the Playlist store<br>
</td>
</tr>
<tr>
<td valign="top"><b>Type</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">system<br>
</td>
</tr>
<tr>
<td valign="top"><b>Cross-reference</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">F1.4, UC-3<br>
</td>
</tr>
<tr>
<td valign="top"><b>Notes</b><br>
</td>
<td colspan="2" rowspan="1" valign="top"><br>
</td>
</tr>
<tr>
<td valign="top"><b>Exceptions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none<br>
</td>
</tr>
<tr>
<td valign="top"><b>Output</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">The playlists contained
in the Playlist store.<br>
</td>
</tr>
<tr>
<td valign="top"><b>Pre-conditions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none</td>
</tr>
<tr>
<td valign="top"><b>Post-conditions</b><br>
</td>
<td align="left" valign="top">none<br>
</td>
<td align="center" valign="top"><br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
</tr>
</tbody>
</table>
<br>
<h4>Contract for Scheduler : displayPlayLog</h4>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">displayPlayLog<br>
()<br>
: Play log<br>
</td>
</tr>
<tr>
<td valign="top"><b>Responsibilities</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">Display Play log entries
contained in the Play log<br>
</td>
</tr>
<tr>
<td valign="top"><b>Type</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">system<br>
</td>
</tr>
<tr>
<td valign="top"><b>Cross-reference</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">F1.4, UC-5<br>
</td>
</tr>
<tr>
<td valign="top"><b>Notes</b><br>
</td>
<td colspan="2" rowspan="1" valign="top"><br>
</td>
</tr>
<tr>
<td valign="top"><b>Exceptions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none<br>
</td>
</tr>
<tr>
<td valign="top"><b>Output</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">The play log entries
contained in the Play log.<br>
</td>
</tr>
<tr>
<td valign="top"><b>Pre-conditions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none</td>
</tr>
<tr>
<td valign="top"><b>Post-conditions</b><br>
</td>
<td align="left" valign="top">none<br>
</td>
<td align="center" valign="top"><br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
</tr>
</tbody>
</table>
<br>
<h4>Contract for Scheduler : generatePlayReport<br>
</h4>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">generatePlayReport<br>
(from : TimeStamp,<br>
to : TimeStamp)<br>
: Play report<br>
</td>
</tr>
<tr>
<td valign="top"><b>Responsibilities</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">Present a report on what
Audio clips have been played to the Broadcast auditor.<br>
</td>
</tr>
<tr>
<td valign="top"><b>Type</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">system<br>
</td>
</tr>
<tr>
<td valign="top"><b>Cross-reference</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">F1.4, UC-5<br>
</td>
</tr>
<tr>
<td valign="top"><b>Notes</b><br>
</td>
<td colspan="2" rowspan="1" valign="top"><br>
</td>
</tr>
<tr>
<td valign="top"><b>Exceptions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none<br>
</td>
</tr>
<tr>
<td valign="top"><b>Output</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">A report on the played
Audio clips played in the specified time period.<br>
</td>
</tr>
<tr>
<td valign="top"><b>Pre-conditions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none</td>
</tr>
<tr>
<td valign="top"><b>Post-conditions</b><br>
</td>
<td align="left" valign="top">none<br>
</td>
<td align="center" valign="top"><br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
</tr>
</tbody>
</table>
<br>
<h4>Contract for Scheduler : createPlaylist<br>
</h4>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">createPlaylist<br>
()<br>
: Playlist<br>
</td>
</tr>
<tr>
<td valign="top"><b>Responsibilities</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">Create a new playlist<br>
</td>
</tr>
<tr>
<td valign="top"><b>Type</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">system<br>
</td>
</tr>
<tr>
<td valign="top"><b>Cross-reference</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">F1.12, UC-6<br>
</td>
</tr>
<tr>
<td valign="top"><b>Notes</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">A new playlist is
created, and is immediately locked for editing.<br>
</td>
</tr>
<tr>
<td valign="top"><b>Exceptions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none<br>
</td>
</tr>
<tr>
<td valign="top"><b>Output</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none<br>
</td>
</tr>
<tr>
<td valign="top"><b>Pre-conditions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none</td>
</tr>
<tr>
<td valign="top"><b>Post-conditions</b><br>
</td>
<td align="center" valign="top"><b>condition</b><br>
</td>
<td align="center" valign="top"><b>type</b><br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top">A new Playlist is created<br>
</td>
<td valign="top">instance creation<br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top">The lockedForEditing attribute is set to true
for the playlist<br>
</td>
<td valign="top">attribute modification<br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top">The playlist is added to the Playlist store<br>
</td>
<td valign="top">association formed<br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
</tr>
</tbody>
</table>
<br>
<h4>Contract for Scheduler : openPlaylistForEditing<br>
</h4>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">openPlaylistForEditing<br>
(playlist : Playlist)<br>
: void<br>
</td>
</tr>
<tr>
<td valign="top"><b>Responsibilities</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">Open a playlist for
editing<br>
</td>
</tr>
<tr>
<td valign="top"><b>Type</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">system<br>
</td>
</tr>
<tr>
<td valign="top"><b>Cross-reference</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">F1.13, UC-7<br>
</td>
</tr>
<tr>
<td valign="top"><b>Notes</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">A playlist is opened for
editing. The playlist may not be played when being edited. Also, active
(currently executing) playlists may not be opened for editing. This is
in effect a lock, which is released by saving the playlist.<br>
</td>
</tr>
<tr>
<td valign="top"><b>Exceptions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">if the playlist is
currently being executed, indicate as an error.<br>
</td>
</tr>
<tr>
<td valign="top"><b>Output</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none<br>
</td>
</tr>
<tr>
<td valign="top"><b>Pre-conditions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none</td>
</tr>
<tr>
<td valign="top"><b>Post-conditions</b><br>
</td>
<td align="center" valign="top"><b>condition</b><br>
</td>
<td align="center" valign="top"><b>type</b><br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top">The current version of the playlist is stored,
in case the user wants to revert to the last saved version (see
revertEditedPlaylist)<br>
</td>
<td valign="top">instance creation<br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top">The lockedForEditing attribute is set to true
for the playlist<br>
</td>
<td valign="top">attribute modification<br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
</tr>
</tbody>
</table>
<br>
<h4>Contract for Scheduler : addAudioClipToPlaylist<br>
</h4>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">addAutioClipToPlaylist<br>
(playlist : Playlist,<br>
audioClip : AudioClip,<br>
relativeOffset : Time)<br>
: void<br>
</td>
</tr>
<tr>
<td valign="top"><b>Responsibilities</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">Add an Audio clip to a
Playlist<br>
</td>
</tr>
<tr>
<td valign="top"><b>Type</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">system<br>
</td>
</tr>
<tr>
<td valign="top"><b>Cross-reference</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">F1.13, UC-7<br>
</td>
</tr>
<tr>
<td valign="top"><b>Notes</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">The Audio clip is added
to the playlist with the specified relativeOffset from the beginning of
the Playlist.<br>
</td>
</tr>
<tr>
<td valign="top"><b>Exceptions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none<br>
</td>
</tr>
<tr>
<td valign="top"><b>Output</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none<br>
</td>
</tr>
<tr>
<td valign="top"><b>Pre-conditions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">the Playlist is
currently opened for editing<br>
</td>
</tr>
<tr>
<td valign="top"><b>Post-conditions</b><br>
</td>
<td align="center" valign="top"><b>condition</b><br>
</td>
<td align="center" valign="top"><b>type</b><br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top">The new PlaylistElement is created associating
the playlist with the audio clip, with the specified relativeOffset<br>
</td>
<td valign="top">association formed, instnace creation<br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
</tr>
</tbody>
</table>
<br>
<h4>Contract for Scheduler : displayAudioClips<br>
</h4>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">displayAudioClips<br>
()<br>
: AudioClip<br>
</td>
</tr>
<tr>
<td valign="top"><b>Responsibilities</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">Display the audio clips
known to the Scheduler<br>
</td>
</tr>
<tr>
<td valign="top"><b>Type</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">system<br>
</td>
</tr>
<tr>
<td valign="top"><b>Cross-reference</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">F1.13, UC-7<br>
</td>
</tr>
<tr>
<td valign="top"><b>Notes</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none<br>
</td>
</tr>
<tr>
<td valign="top"><b>Exceptions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none<br>
</td>
</tr>
<tr>
<td valign="top"><b>Output</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">The Audio clips kown to
the Scheduler<br>
</td>
</tr>
<tr>
<td valign="top"><b>Pre-conditions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none<br>
</td>
</tr>
<tr>
<td valign="top"><b>Post-conditions</b><br>
</td>
<td align="left" valign="top">none<br>
</td>
<td align="center" valign="top"><br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
</tr>
</tbody>
</table>
<br>
<h4>Contract for Scheduler : displayAudioClip<br>
</h4>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">displayAudioClip<br>
(audioClipId : UniqueId)<br>
: AudioClip<br>
</td>
</tr>
<tr>
<td valign="top"><b>Responsibilities</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">Display the audio clip
specified by the audioClipId<br>
</td>
</tr>
<tr>
<td valign="top"><b>Type</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">system<br>
</td>
</tr>
<tr>
<td valign="top"><b>Cross-reference</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">F1.13, UC-7<br>
</td>
</tr>
<tr>
<td valign="top"><b>Notes</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none<br>
</td>
</tr>
<tr>
<td valign="top"><b>Exceptions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">if no audio clip by the
specified id exists, indicate as an error<br>
</td>
</tr>
<tr>
<td valign="top"><b>Output</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">The Audio clip specified
by the audioClipId<br>
</td>
</tr>
<tr>
<td valign="top"><b>Pre-conditions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none<br>
</td>
</tr>
<tr>
<td valign="top"><b>Post-conditions</b><br>
</td>
<td align="left" valign="top">none<br>
</td>
<td align="center" valign="top"><br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
</tr>
</tbody>
</table>
<br>
<h4>Contract for Scheduler : removeAudioClipFromPlaylist<br>
</h4>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">removeAutioClipFromPlaylist<br>
(playlist : Playlist,<br>
audioClip : AudioClip)<br>
: void<br>
</td>
</tr>
<tr>
<td valign="top"><b>Responsibilities</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">Remove an Audio clip
from a Playlist<br>
</td>
</tr>
<tr>
<td valign="top"><b>Type</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">system<br>
</td>
</tr>
<tr>
<td valign="top"><b>Cross-reference</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">F1.13, UC-7<br>
</td>
</tr>
<tr>
<td valign="top"><b>Notes</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">The Audio clip is
removed from the Playlist.<br>
</td>
</tr>
<tr>
<td valign="top"><b>Exceptions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">If the Audio clip is not
in the playlist, indicate as an error.<br>
</td>
</tr>
<tr>
<td valign="top"><b>Output</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none<br>
</td>
</tr>
<tr>
<td valign="top"><b>Pre-conditions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">the Playlist is
currently opened for editing<br>
</td>
</tr>
<tr>
<td valign="top"><b>Post-conditions</b><br>
</td>
<td align="center" valign="top"><b>condition</b><br>
</td>
<td align="center" valign="top"><b>type</b><br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top">The PlaylistElement associating the AudioClip
with the Playlist is removed, with the related FadeInfo instances<br>
</td>
<td valign="top">instance deletion, association broken<br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
</tr>
</tbody>
</table>
<br>
<h4>Contract for Scheduler : updateFadeInFadeOut<br>
</h4>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">updateFadeInFadeOut<br>
(audioClip : AudioClip,<br>
playlist : Playlist)<br>
: void<br>
</td>
</tr>
<tr>
<td valign="top"><b>Responsibilities</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">Update the fade-in and
fade-out parameters for an audio clip playing in a playlist.<br>
</td>
</tr>
<tr>
<td valign="top"><b>Type</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">system<br>
</td>
</tr>
<tr>
<td valign="top"><b>Cross-reference</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">F1.13, UC-7<br>
</td>
</tr>
<tr>
<td valign="top"><b>Notes</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none<br>
</td>
</tr>
<tr>
<td valign="top"><b>Exceptions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">If the Audio clip is not
in the playlist, indicate as an error.<br>
</td>
</tr>
<tr>
<td valign="top"><b>Output</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none<br>
</td>
</tr>
<tr>
<td valign="top"><b>Pre-conditions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">the Playlist is
currently opened for editing<br>
</td>
</tr>
<tr>
<td valign="top"><b>Post-conditions</b><br>
</td>
<td align="center" valign="top"><b>condition</b><br>
</td>
<td align="center" valign="top"><b>type</b><br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top">The fade-in and fade-out parameters for the
audio clip in the playlist are updated<br>
</td>
<td valign="top">attribute modification<br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
</tr>
</tbody>
</table>
<br>
<h4>Contract for Scheduler : validatePlaylist<br>
</h4>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">validatePlaylist<br>
(playlist : Playlist)<br>
: boolean<br>
</td>
</tr>
<tr>
<td valign="top"><b>Responsibilities</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">Validate a playlist for
being complete.<br>
</td>
</tr>
<tr>
<td valign="top"><b>Type</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">system<br>
</td>
</tr>
<tr>
<td valign="top"><b>Cross-reference</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">F1.13, UC-7<br>
</td>
</tr>
<tr>
<td valign="top"><b>Notes</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">The playlist is checked
for being complete (not containing silence) and other sanity criteria.<br>
</td>
</tr>
<tr>
<td valign="top"><b>Exceptions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none<br>
</td>
</tr>
<tr>
<td valign="top"><b>Output</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none<br>
</td>
</tr>
<tr>
<td valign="top"><b>Pre-conditions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none<br>
</td>
</tr>
<tr>
<td valign="top"><b>Post-conditions</b><br>
</td>
<td align="left" valign="top">none<br>
</td>
<td align="center" valign="top"><br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
</tr>
</tbody>
</table>
<br>
<h4>Contract for Scheduler : savePlaylist<br>
</h4>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">savePlaylist<br>
(playlist : Playlist)<br>
: void<br>
</td>
</tr>
<tr>
<td valign="top"><b>Responsibilities</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">The playlist is saved.<br>
</td>
</tr>
<tr>
<td valign="top"><b>Type</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">system<br>
</td>
</tr>
<tr>
<td valign="top"><b>Cross-reference</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">F1.13, UC-7<br>
</td>
</tr>
<tr>
<td valign="top"><b>Notes</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none<br>
</td>
</tr>
<tr>
<td valign="top"><b>Exceptions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">If the playlist is not
valid, indicate as an error.<br>
</td>
</tr>
<tr>
<td valign="top"><b>Output</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none<br>
</td>
</tr>
<tr>
<td valign="top"><b>Pre-conditions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">the Playlist is
currently opened for editing<br>
</td>
</tr>
<tr>
<td valign="top"><b>Post-conditions</b><br>
</td>
<td align="center" valign="top"><b>condition</b><br>
</td>
<td align="center" valign="top"><b>type</b><br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top">The lockedForEditing attriubute is set to false
for the playlist<br>
</td>
<td valign="top">attribute modification<br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top">The old version of the Playlist that could have
been used for reverting is deleted (see revertEditedPlaylist)<br>
</td>
<td valign="top">instance deletion<br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
</tr>
</tbody>
</table>
<br>
<h4>Contract for Scheduler : revertEditedPlaylist<br>
</h4>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">revertEditedPlaylist<br>
(playlist : Playlist)<br>
: void<br>
</td>
</tr>
<tr>
<td valign="top"><b>Responsibilities</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">Changes are discarded
for a Playlist that is being edited.<br>
</td>
</tr>
<tr>
<td valign="top"><b>Type</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">system<br>
</td>
</tr>
<tr>
<td valign="top"><b>Cross-reference</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">F1.13, UC-7<br>
</td>
</tr>
<tr>
<td valign="top"><b>Notes</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">The contents of the
playlist are reverted to the state prior to when editing began on it.<br>
</td>
</tr>
<tr>
<td valign="top"><b>Exceptions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none<br>
</td>
</tr>
<tr>
<td valign="top"><b>Output</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none<br>
</td>
</tr>
<tr>
<td valign="top"><b>Pre-conditions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">the Playlist is
currently opened for editing<br>
</td>
</tr>
<tr>
<td valign="top"><b>Post-conditions</b><br>
</td>
<td align="center" valign="top"><b>condition</b><br>
</td>
<td align="center" valign="top"><b>type</b><br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top">The contents of the Playlist are reverted to the
last saved version. This includes deleting all created PlaylistElement
and FadeInfo instances.<br>
</td>
<td valign="top">attribute modification, instance deletion<br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top">The lockedForEditing attriubute is set to false
for the playlist<br>
</td>
<td valign="top">attribute modification<br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
</tr>
</tbody>
</table>
<br>
<h4>Contract for Scheduler : start<br>
</h4>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">start<br>
()<br>
: void<br>
</td>
</tr>
<tr>
<td valign="top"><b>Responsibilities</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">Starts the scheduler
daemon<br>
</td>
</tr>
<tr>
<td valign="top"><b>Type</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">system<br>
</td>
</tr>
<tr>
<td valign="top"><b>Cross-reference</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">F1.14, UC-8<br>
</td>
</tr>
<tr>
<td valign="top"><b>Notes</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">A System V init-style
daemon starting entry point<br>
</td>
</tr>
<tr>
<td valign="top"><b>Exceptions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none<br>
</td>
</tr>
<tr>
<td valign="top"><b>Output</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none<br>
</td>
</tr>
<tr>
<td valign="top"><b>Pre-conditions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">The scheduler daemon is
currently not running<br>
</td>
</tr>
<tr>
<td valign="top"><b>Post-conditions</b><br>
</td>
<td align="center" valign="top"><b>condition</b><br>
</td>
<td align="center" valign="top"><b>type</b><br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top">The scheduler daemon object is created<br>
</td>
<td valign="top">instance creation<br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top">All the necessary structures are created for the
deamon to run<br>
</td>
<td valign="top">instance creation<br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
</tr>
</tbody>
</table>
<br>
<h4>Contract for Scheduler : isRunning<br>
</h4>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">isRunning<br>
()<br>
: boolean<br>
</td>
</tr>
<tr>
<td valign="top"><b>Responsibilities</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">Tells if the scheduler
daemon is running<br>
</td>
</tr>
<tr>
<td valign="top"><b>Type</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">system<br>
</td>
</tr>
<tr>
<td valign="top"><b>Cross-reference</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">UC-8<br>
</td>
</tr>
<tr>
<td valign="top"><b>Notes</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">A System V init-style
daemon status entry point<br>
</td>
</tr>
<tr>
<td valign="top"><b>Exceptions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none<br>
</td>
</tr>
<tr>
<td valign="top"><b>Output</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">true of the daemon is
running, false otherwise<br>
</td>
</tr>
<tr>
<td valign="top"><b>Pre-conditions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none<br>
</td>
</tr>
<tr>
<td valign="top"><b>Post-conditions</b><br>
</td>
<td align="left" valign="top">none<br>
</td>
<td align="center" valign="top"><br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
</tr>
</tbody>
</table>
<br>
<h4>Contract for Scheduler : stop<br>
</h4>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">stop<br>
()<br>
: void<br>
</td>
</tr>
<tr>
<td valign="top"><b>Responsibilities</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">Stops the scheduler
daemon<br>
</td>
</tr>
<tr>
<td valign="top"><b>Type</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">system<br>
</td>
</tr>
<tr>
<td valign="top"><b>Cross-reference</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">F1.15, UC-8<br>
</td>
</tr>
<tr>
<td valign="top"><b>Notes</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">A System V init-style
daemon stopping entry point<br>
</td>
</tr>
<tr>
<td valign="top"><b>Exceptions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none<br>
</td>
</tr>
<tr>
<td valign="top"><b>Output</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none<br>
</td>
</tr>
<tr>
<td valign="top"><b>Pre-conditions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">The scheduler daemon is
currently running<br>
</td>
</tr>
<tr>
<td valign="top"><b>Post-conditions</b><br>
</td>
<td align="center" valign="top"><b>condition</b><br>
</td>
<td align="center" valign="top"><b>type</b><br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top">The scheduler daemon object is deleted<br>
</td>
<td valign="top">instance deletion<br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
</tr>
</tbody>
</table>
<br>
<h4>Contract for Media archive : authenticate</h4>
TODO: move to Media archive spec<br>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">authenticate<br>
(authenticationInfo : AuthenticationInfo)<br>
: boolean<br>
</td>
</tr>
<tr>
<td valign="top"><b>Responsibilities</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">Check if the provided
authentication info is recognized.<br>
</td>
</tr>
<tr>
<td valign="top"><b>Type</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">interface<br>
</td>
</tr>
<tr>
<td valign="top"><b>Cross-reference</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">UC-4<br>
</td>
</tr>
<tr>
<td valign="top"><b>Notes</b><br>
</td>
<td colspan="2" rowspan="1" valign="top"><br>
</td>
</tr>
<tr>
<td valign="top"><b>Exceptions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none</td>
</tr>
<tr>
<td valign="top"><b>Output</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">true if the provided
authentication is recognized, false otherwise<br>
</td>
</tr>
<tr>
<td valign="top"><b>Pre-conditions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none</td>
</tr>
<tr>
<td valign="top"><b>Post-conditions</b><br>
</td>
<td valign="top">none<br>
</td>
<td valign="top"><br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
</tr>
</tbody>
</table>
<br>
<h4>Contract for Media archive : retrieveAudioClip</h4>
TODO: move to Media archive spec<br>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">retrieveAudioClip<br>
(clipId : UniqueId)<br>
: AudioClip<br>
</td>
</tr>
<tr>
<td valign="top"><b>Responsibilities</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">Retrieve an AudioClip
specified by the supplied audio clip id.<br>
</td>
</tr>
<tr>
<td valign="top"><b>Type</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">interface<br>
</td>
</tr>
<tr>
<td valign="top"><b>Cross-reference</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">F1.2, UC-4<br>
</td>
</tr>
<tr>
<td valign="top"><b>Notes</b><br>
</td>
<td colspan="2" rowspan="1" valign="top"><br>
</td>
</tr>
<tr>
<td valign="top"><b>Exceptions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">if no audio clip exists
with the supplied id, indicate as an error<br>
</td>
</tr>
<tr>
<td valign="top"><b>Output</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">the requested audio clip<br>
</td>
</tr>
<tr>
<td valign="top"><b>Pre-conditions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none</td>
</tr>
<tr>
<td valign="top"><b>Post-conditions</b><br>
</td>
<td align="center" valign="top"><b>condition</b><br>
</td>
<td align="center" valign="top"><b>type</b><br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top">A new Audio clip is created and filled with the
contents of the retrieved audio clip<br>
</td>
<td valign="top">instance creation </td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top">Audio clip is entered into Local storage<br>
</td>
<td valign="top">association formed<br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
</tr>
</tbody>
</table>
<br>
<h4>Contract for Local storage : authenticate</h4>
TODO: move to Local storage spec<br>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">authenticate<br>
(authenticationInfo : AuthenticationInfo)<br>
: boolean<br>
</td>
</tr>
<tr>
<td valign="top"><b>Responsibilities</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">Check if the provided
authentication info is recognized.<br>
</td>
</tr>
<tr>
<td valign="top"><b>Type</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">interface<br>
</td>
</tr>
<tr>
<td valign="top"><b>Cross-reference</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">UC-4<br>
</td>
</tr>
<tr>
<td valign="top"><b>Notes</b><br>
</td>
<td colspan="2" rowspan="1" valign="top"><br>
</td>
</tr>
<tr>
<td valign="top"><b>Exceptions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none</td>
</tr>
<tr>
<td valign="top"><b>Output</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">true if the provided
authentication is recognized, false otherwise<br>
</td>
</tr>
<tr>
<td valign="top"><b>Pre-conditions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none</td>
</tr>
<tr>
<td valign="top"><b>Post-conditions</b><br>
</td>
<td valign="top">none<br>
</td>
<td valign="top"><br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
</tr>
</tbody>
</table>
<br>
<h4>Contract for Local storage : existsAudioClip</h4>
TODO: move to Local storage spec<br>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">existsAudioClip<br>
(audioClipId : UniqueId)<br>
: boolean<br>
</td>
</tr>
<tr>
<td valign="top"><b>Responsibilities</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">Tell if an audio clip by
the provided unique id is stored in the Local storage<br>
</td>
</tr>
<tr>
<td valign="top"><b>Type</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">interface<br>
</td>
</tr>
<tr>
<td valign="top"><b>Cross-reference</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">UC-4<br>
</td>
</tr>
<tr>
<td valign="top"><b>Notes</b><br>
</td>
<td colspan="2" rowspan="1" valign="top"><br>
</td>
</tr>
<tr>
<td valign="top"><b>Exceptions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none</td>
</tr>
<tr>
<td valign="top"><b>Output</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">true if an audio clip
with the provided id exists, false otherwise<br>
</td>
</tr>
<tr>
<td valign="top"><b>Pre-conditions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none</td>
</tr>
<tr>
<td valign="top"><b>Post-conditions</b><br>
</td>
<td valign="top">none<br>
</td>
<td valign="top"><br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
</tr>
</tbody>
</table>
<br>
<h4>Contract for Local storage : storeAudioClip</h4>
TODO: move to Local storage spec<br>
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">storeAudioClip<br>
(audioClip : AudioClip)<br>
: void<br>
</td>
</tr>
<tr>
<td valign="top"><b>Responsibilities</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">Store an audio clip.<br>
</td>
</tr>
<tr>
<td valign="top"><b>Type</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">interface<br>
</td>
</tr>
<tr>
<td valign="top"><b>Cross-reference</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">UC-4<br>
</td>
</tr>
<tr>
<td valign="top"><b>Notes</b><br>
</td>
<td colspan="2" rowspan="1" valign="top"><br>
</td>
</tr>
<tr>
<td valign="top"><b>Exceptions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none</td>
</tr>
<tr>
<td valign="top"><b>Output</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none<br>
</td>
</tr>
<tr>
<td valign="top"><b>Pre-conditions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none</td>
</tr>
<tr>
<td valign="top"><b>Post-conditions</b><br>
</td>
<td valign="top">The supplied audio clip is stored in the storage.<br>
</td>
<td valign="top"><br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
<td valign="top"><br>
</td>
</tr>
</tbody>
</table>
<br>
<h1>Glossary</h1>
<b>playlist</b><br>
The playlist is a metafile, containing references to audio clips that
should be played, and details on how they should be played.<br>
<br>
</body>
</html>