<!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 Local storage specification</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 © 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.4 $</li> <li>Location: $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/doc/model/LocalStorage/index.html,v $</li> </ul> <h1>Scope</h1> This document contains the specification of the LiveSupport Local storage component.<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 Local storage component is to store Audio Clips locally.<br> <h2>Goals</h2> The goal of the local storage system is to store Audio Clips locally. Audio Clips contain audio data bundled with metadata describing it. Storing locally means that the binary audio data is available not just as a stream, but also as random seekable file.<br> The local storage contains Playlists also. These are metadata files containing a list of Audio Clip IDs with extra (fade in / fade out) information.</br> <h2>System functions</h2> The main system functions are described below. There are three categories for these functions:<br> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <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 width="100%" border="0" cellspacing="2" cellpadding="2"> <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">Store audio clips<br> </td> <td valign="top">evident<br> </td> </tr> <tr> <td valign="top">F1.2<br> </td> <td valign="top">Provide seekable access to audio data<br> </td> <td valign="top">evident<br> </td> </tr> <tr> <td valign="top">F1.3<br> </td> <td valign="top">Delete stored clips<br> </td> <td valign="top">evident<br> </td> </tr> <tr> <td valign="top">F1.4<br> </td> <td valign="top">Update stored clips<br> </td> <td valign="top">evident<br> </td> </tr> <tr> <td valign="top">F1.5<br> </td> <td valign="top">Search Audio clips by querying metadata<br> </td> <td valign="top">evident<br> </td> </tr> <tr> <td valign="top">F2.1<br> </td> <td valign="top">Create new playlists<br> </td> <td valign="top">evident<br> </td> </tr> <tr> <td valign="top">F2.2<br> </td> <td valign="top">Access playlists for editing<br> </td> <td valign="top">evident<br> </td> </tr> <tr> <td valign="top">F2.3<br> </td> <td valign="top">Delete playlists<br> </td> <td valign="top">evident<br> </td> </tr> <tr> <td valign="top">F2.4<br> </td> <td valign="top">Access playlists for execution<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 width="100%" border="0" cellspacing="2" cellpadding="2"> <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">local interface<br> </td> <td valign="top">locally callable API<br> </td> <td valign="top">must<br> </td> </tr> <tr> <td valign="top">A1.4<br> </td> <td valign="top">supported audio formats<br> </td> <td valign="top">Ogg Vorbis, MP3, wav<br> </td> <td valign="top">must<br> </td> </tr> <tr> <td valign="top">A1.5<br> </td> <td valign="top">file system level interface<br> </td> <td valign="top">adding, updated and delete from the local storage can be done by moving files within the file system by legacy tools<br> </td> <td valign="top">frill<br> </td> </tr> <tr> <td valign="top">A1.6<br> </td> <td valign="top">uniquely identifiable Audio clips<br> </td> <td valign="top">all audio clips should be uniquely identifiable, even when moved among Local storage systems<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 width="100%" border="0" cellspacing="2" cellpadding="2"> <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.2<br> </td> <td valign="top">Provide seekable access to audio data<br> </td> <td valign="top">A1.3<br> </td> <td valign="top">provide file handle<br> </td> <td valign="top">provide randomly seekable file level access to raw audio data<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" width="600" height="780"></object> <h3>UC-1 Store or update Audio clip<br> </h3> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <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">Store or update Audio clip<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">Storage maintainer </td> </tr> <tr> <td valign="top"><b>purpose</b> </td> <td valign="top">To store a new Audio clip in the local storage, or update (replace) an already stored Audio clip<br> </td> </tr> <tr> <td valign="top"><b>overview</b> </td> <td valign="top">The Storage maintainer contacts the Local storage with the aim of uploading and storing a new Audio Clip. If the uploaded Audio clip is already stored in Local storage (with respect of having the same unique id), the stored one is replaced with the uploaded one.<br> </td> </tr> <tr> <td valign="top"><b>references</b> </td> <td valign="top">F1.1, F1.4, A1.6<br> </td> </tr> </tbody> </table> <h4>Typical course of events</h4> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <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">Storage maintainer connects to the Local storage with the intention of storing an Audio clip<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 Storage maintainer provides authentication information </td> <td valign="top"><b>3.</b> </td> <td valign="top">The system authenticates the Storage maintainer and grants access.<br> </td> </tr> <tr> <td valign="top"><b>4.</b><br> </td> <td valign="top">The Storage maintainer presents the new Audio clip data, including raw audio data and metadata<br> </td> <td valign="top"><b>5.</b><br> </td> <td valign="top">The system verifies the received data<br> </td> </tr> <tr> <td valign="top"><br> </td> <td valign="top"><br> </td> <td valign="top"><b>6.1</b><br> </td> <td valign="top">If the presented Audio clip does not contain a unique id, one is generated.<br> </td> </tr> <tr> <td valign="top"><br> </td> <td valign="top"><br> </td> <td valign="top"><b>6.2</b><br> </td> <td valign="top">If the presented Audio clip contains a unique id, and there already is an Audio clip stored with the same id, the stored one is replaced with the uploaded Audio clip.<br> </td> </tr> <tr> <td valign="top"><br> </td> <td valign="top"><br> </td> <td valign="top"><b>7.</b><br> </td> <td valign="top">The system stores the received Audio clip and notifies the Storage maintainer of the actions taken and the unique id of the stored clip.<br> </td> </tr> <tr> <td valign="top"><b>8.</b><br> </td> <td valign="top">The Storage maintainer 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> if the Storage maintainer can not be authenticated, he is notified, and the use case ends.</li> <li><b>action 6.2:</b> if the raw audio data of the Audio clip is currently being accessed (see UC-4), it can not be deleted. the user is notified and the use case ends.</li> </ul> <br> <h3>UC-2 Delete Audio clip<br> </h3> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <tbody> <tr> <td valign="top"><b>ref#</b> </td> <td valign="top">UC-2 </td> </tr> <tr> <td valign="top"><b>use case</b> </td> <td valign="top">Delete Audio clip<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">Storage maintainer </td> </tr> <tr> <td valign="top"><b>purpose</b> </td> <td valign="top">To delete an existing Audio clip in the local storage<br> </td> </tr> <tr> <td valign="top"><b>overview</b> </td> <td valign="top">The Storage maintainer contacts the Local storage with the aim of deleting an existing Audio Clip<br> </td> </tr> <tr> <td valign="top"><b>references</b> </td> <td valign="top">F1.3 </td> </tr> </tbody> </table> <h4>Typical course of events</h4> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <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">Storage maintainer connects to the Local storage with the intention of deleting an Audio clip<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 Storage maintainer provides authentication information </td> <td valign="top"><b>3.</b> </td> <td valign="top">The system authenticates the Storage maintainer and grants access.<br> </td> </tr> <tr> <td valign="top"><b>4.</b><br> </td> <td valign="top">The Storage maintainer presents the unique id of an Audio clip stored in Local storage for deletion<br> </td> <td valign="top"><b>5.</b><br> </td> <td valign="top">The system deletes the Audio clip corresponding to the presented unique id.<br> </td> </tr> <tr> <td valign="top"><b>6.</b><br> </td> <td valign="top">The Storage maintainer 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> if the Storage maintainer can not be authenticated, he is notified, and the use case ends.</li> <li><b>action 5:</b> if no Audio clip is stored with the presented id, the Storage maintainer is notified. the use case ends.</li> <li><b>action 5:</b> if the raw audio data of the Audio clip is currently being accessed (see UC-4), it can not be deleted. the user is notified and the use case ends.<br> </li> </ul> <br> <h3>UC-3 Update Audio clip metadata<br> </h3> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <tbody> <tr> <td valign="top"><b>ref#</b> </td> <td valign="top">UC-3 </td> </tr> <tr> <td valign="top"><b>use case</b> </td> <td valign="top">Update Audio clip metadata<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">Storage maintainer </td> </tr> <tr> <td valign="top"><b>purpose</b> </td> <td valign="top">To update the metadata of an Audio clip, without uploading raw audio data again.<br> </td> </tr> <tr> <td valign="top"><b>overview</b> </td> <td valign="top">The Storage maintainer contacts the Local storage with the aim of updating the metadata for an already stored Audio clip<br> </td> </tr> <tr> <td valign="top"><b>references</b> </td> <td valign="top">F1.4 </td> </tr> </tbody> </table> <h4>Typical course of events</h4> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <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">Storage maintainer connects to the Local storage with the intention of updating the metadata for an Audio clip<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 Storage maintainer provides authentication information </td> <td valign="top"><b>3.</b> </td> <td valign="top">The system authenticates the Storage maintainer and grants access.<br> </td> </tr> <tr> <td valign="top"><b>4.</b><br> </td> <td valign="top">The Storage maintainer presents the unique id of an Audio clip stored in Local storage and the new metadata for that Audio clip<br> </td> <td valign="top"><b>5.</b><br> </td> <td valign="top">The system verifies the clip id and the metadata<br> </td> </tr> <tr> <td valign="top"><br> </td> <td valign="top"><br> </td> <td valign="top"><b>6.</b><br> </td> <td valign="top">The system replaces the metadata of the Audio clip with the presented one<br> </td> </tr> <tr> <td valign="top"><b>7.</b><br> </td> <td valign="top">The Storage maintainer 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> if the Storage maintainer can not be authenticated, he is notified, and the use case ends.</li> <li><b>action 5:</b> if no Audio clip is stored with the presented id, the Storage maintainer is notified. the use case ends.<br> </li> </ul> <br> <h3>UC-4 Access raw audio data<br> </h3> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <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">Access raw audio data<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">Audio player<br> </td> </tr> <tr> <td valign="top"><b>purpose</b> </td> <td valign="top">To access raw audio of Audio clips stored in the Local storage.<br> </td> </tr> <tr> <td valign="top"><b>overview</b> </td> <td valign="top">The Audio player accesses the raw audio data with the ability of randomly seeking in it.<br> </td> </tr> <tr> <td valign="top"><b>references</b> </td> <td valign="top">F1.2, A1.3<br> </td> </tr> </tbody> </table> <h4>Typical course of events</h4> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <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">Audio player connects to the Local storage with the intention of accessing raw audio data<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 Audio player provides authentication information </td> <td valign="top"><b>3.</b> </td> <td valign="top">The system authenticates the Audio player and grants access.<br> </td> </tr> <tr> <td valign="top"><b>4.</b><br> </td> <td valign="top">The Audio player presents the unique id of an Audio clip stored in Local storage that he wants to access<br> </td> <td valign="top"><b>5.</b><br> </td> <td valign="top">The systems looks up the Audio clip, and provides a seekable handle to the Audio player<br> </td> </tr> <tr> <td valign="top"><b>6.</b><br> </td> <td valign="top">The Audio player accesses the raw audio data, including seeking in it.<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 Audio player closes it's access and 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> if the Audio player can not be authenticated, he is notified, and the use case ends.</li> <li><b>action 5:</b> if no Audio clip is stored with the presented id, the Audio player is notified. the use case ends.</li> </ul> <br> <h3>UC-5 Search in metadata<br> </h3> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <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">Search in metadata<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">Storage maintainer<br> </td> </tr> <tr> <td valign="top"><b>purpose</b> </td> <td valign="top">To search in the metadata of audio clips<br> </td> </tr> <tr> <td valign="top"><b>overview</b> </td> <td valign="top">The Storage maintainer searches through the stored Audio clips by specifying search criteria for the metadata of the clips<br> </td> </tr> <tr> <td valign="top"><b>references</b> </td> <td valign="top">F1.5<br> </td> </tr> </tbody> </table> <h4>Typical course of events</h4> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <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">Storage maintainer connects to the Local storage with the intention of searching.<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 Storage maintainer provides authentication information </td> <td valign="top"><b>3.</b> </td> <td valign="top">The system authenticates the Storage maintainer and grants access.<br> </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 provides a way of specifying search criteria with respect to the existing metadata structures<br> </td> </tr> <tr> <td valign="top"><b>5.</b><br> </td> <td valign="top">The Storage maintainer specifies a search criteria<br> </td> <td valign="top"><b>6.</b><br> </td> <td valign="top">The system searches through the metadata of contained Audio clips, and presents a list of matches<br> </td> </tr> <tr> <td valign="top"><b>7.</b><br> </td> <td valign="top">The Storage maintainer refines his search and searches again<br> </td> <td valign="top"><b>8.</b><br> </td> <td valign="top">The system does a new search according to the refined criteria, and presents the results to the Storage maintainer<br> </td> </tr> <tr> <td valign="top"><b>9.</b><br> </td> <td valign="top">The storage maintainer reviews the results<br> </td> <td valign="top"><br> </td> <td valign="top"><br> </td> </tr> <tr> <td valign="top"><b>10.</b><br> </td> <td valign="top">The storage maintainer 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> if the Storage maintainer can not be authenticated, he is notified, and the use case ends.</li> </ul> <br> <h3>UC-6 Create playlist<br> </h3> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <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">primary, essential </td> </tr> <tr> <td valign="top"><b>actors</b> </td> <td valign="top">Storage maintainer </td> </tr> <tr> <td valign="top"><b>purpose</b> </td> <td valign="top">To store a new Playlist in the local storage<br> </td> </tr> <tr> <td valign="top"><b>overview</b> </td> <td valign="top">The Storage maintainer contacts the Local storage with the aim of uploading a new Playlist. The Local storage stores the new metafile under the new ID.<br> </td> </tr> <tr> <td valign="top"><b>references</b> </td> <td valign="top">F2.1<br> </td> </tr> </tbody> </table> <h4>Typical course of events</h4> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <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">Storage maintainer connects to the Local storage with the intention 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 Storage maintainer provides authentication information </td> <td valign="top"><b>3.</b> </td> <td valign="top">The system authenticates the Storage maintainer and grants access.<br> </td> </tr> <tr> <td valign="top"><b>4.</b><br> </td> <td valign="top">The Storage maintainer presents the new Playlist ID and the new Playlist metafile<br> </td> <td valign="top"><b>5.</b><br> </td> <td valign="top">The system verifies that there is no Playlist yet in the Local storage with the given ID<br> </td> </tr> <tr> <td valign="top"><br> </td> <td valign="top"><br> </td> <td valign="top"><b>6.</b><br> </td> <td valign="top">The system stores the received Playlist metafile and notifies the Storage maintainer of the action taken.<br> </td> </tr> <tr> <td valign="top"><b>7.</b><br> </td> <td valign="top">The Storage maintainer 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> if the Storage maintainer can not be authenticated, she is notified, and the use case ends.</li> <li><b>action 5:</b> if there is already a Playlist in the Local storage with the given ID, the user is notified and the use case ends.</li> </ul> <br> <h3>UC-7 Edit playlist<br> </h3> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <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">primary, essential </td> </tr> <tr> <td valign="top"><b>actors</b> </td> <td valign="top">Storage maintainer </td> </tr> <tr> <td valign="top"><b>purpose</b> </td> <td valign="top">To modify an existing Playlist in the local storage<br> </td> </tr> <tr> <td valign="top"><b>overview</b> </td> <td valign="top">The Storage maintainer contacts the Local storage with the aim of editing an existing Playlist. The Local storage retrieves the Playlist and marks it as being edited. The Storage maintainer modifies the Playlist. The Storage maintainer saves the modified Playlist, the Local storage stores it in place of the old Playlist and marks it as no longer being edited.<br> </td> </tr> <tr> <td valign="top"><b>references</b> </td> <td valign="top">F2.2<br> </td> </tr> </tbody> </table> <h4>Typical course of events</h4> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <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">Storage maintainer connects to the Local storage with the intention 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 Storage maintainer provides authentication information </td> <td valign="top"><b>3.</b> </td> <td valign="top">The system authenticates the Storage maintainer and grants access<br> </td> </tr> <tr> <td valign="top"><b>4.</b><br> </td> <td valign="top">The Storage maintainer presents a Playlist ID<br> </td> <td valign="top"><b>5.</b><br> </td> <td valign="top">The system verifies that there is a Playlist in the Local storage with the given ID, and it is not currently being edited<br> </td> </tr> <tr> <td valign="top"><br> </td> <td valign="top"><br> </td> <td valign="top"><b>6.</b><br> </td> <td valign="top">The system marks the Playlist with the given ID as being edited<br> </td> </tr> <tr> <td valign="top"><br> </td> <td valign="top"><br> </td> <td valign="top"><b>7.</b><br> </td> <td valign="top">The system returns the Playlist metafile with the given ID and notifies the Storage maintainer of the actions taken<br> </td> </tr> <tr> <td valign="top"><b>8.</b><br> </td> <td valign="top">The Storage maintainer modifies the Playlist<br> </td> <td valign="top"><br> </td> <td valign="top"><br> </td> </tr> <tr> <td valign="top"><b>9.</b><br> </td> <td valign="top">The Storage maintainer presents the new Playlist metafile for saving<br> </td> <td valign="top"><b>10.</b><br> </td> <td valign="top">The system verifies that the user had opened this Playlist earlier<br> </td> </tr> <tr> <td valign="top"><br> </td> <td valign="top"><br> </td> <td valign="top"><b>11.</b><br> </td> <td valign="top">The system stores the new Playlist metafile in place of the old one, marks it as no longer being edited, and notifies the Storage maintainer of the actions taken<br> </td> </tr> <tr> <td valign="top"><b>12.</b><br> </td> <td valign="top">The Storage maintainer 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> if the Storage maintainer can not be authenticated, she is notified, and the use case ends.</li> <li><b>action 5:</b> if there is no Playlist in the Local storage with the given ID, or if the Playlist is already being edited, the user is notified and the use case ends.</li> <li><b>action 10:</b> if the user cannot be identified as the same that opened the Playlist for editing, the user is notified, and the use case continues at point 8.</li></ul> <br> <h3>UC-8 Delete playlist<br> </h3> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <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">Delete playlist<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">Storage maintainer </td> </tr> <tr> <td valign="top"><b>purpose</b> </td> <td valign="top">To delete a Playlist from the local storage<br> </td> </tr> <tr> <td valign="top"><b>overview</b> </td> <td valign="top">The Storage maintainer contacts the Local storage with the aim of deleting a Playlist. The system deletes the Playlist with the given ID from the Local storage.<br> </td> </tr> <tr> <td valign="top"><b>references</b> </td> <td valign="top">F2.3<br> </td> </tr> </tbody> </table> <h4>Typical course of events</h4> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <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">Storage maintainer connects to the Local storage with the intention of deleting 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 Storage maintainer provides authentication information </td> <td valign="top"><b>3.</b> </td> <td valign="top">The system authenticates the Storage maintainer and grants access<br> </td> </tr> <tr> <td valign="top"><b>4.</b><br> </td> <td valign="top">The Storage maintainer presents the ID of the Playlist to be deleted<br> </td> <td valign="top"><b>5.</b><br> </td> <td valign="top">The system verifies that there is a Playlist in the Local storage with the given ID, and it is not currently being edited<br> </td> </tr> <tr> <td valign="top"><br> </td> <td valign="top"><br> </td> <td valign="top"><b>6.</b><br> </td> <td valign="top">The system deletes the given Playlist from the Local storage and notifies the Storage maintainer of the action taken<br> </td> </tr> <tr> <td valign="top"><b>7.</b><br> </td> <td valign="top">The Storage maintainer 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> if the Storage maintainer can not be authenticated, she is notified, and the use case ends.</li> <li><b>action 5:</b> if there is no Playlist in the Local storage with the given ID, or if the Playlist is currently being edited, the user is notified and the use case ends.</li> </ul> <br> <h3>UC-9 Access playlist<br> </h3> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <tbody> <tr> <td valign="top"><b>ref#</b> </td> <td valign="top">UC-9 </td> </tr> <tr> <td valign="top"><b>use case</b> </td> <td valign="top">Access playlist<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">Audio player </td> </tr> <tr> <td valign="top"><b>purpose</b> </td> <td valign="top">To access a Playlist metafile in order to execute (play) it<br> </td> </tr> <tr> <td valign="top"><b>overview</b> </td> <td valign="top">The Audio player contacts the Local storage with the aim of accessing a Playlist. The Local storage returns the requested Playlist metafile.<br> </td> </tr> <tr> <td valign="top"><b>references</b> </td> <td valign="top">F2.4<br> </td> </tr> </tbody> </table> <h4>Typical course of events</h4> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <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">Audio player connects to the Local storage with the intention of accessing 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 Audio player provides authentication information </td> <td valign="top"><b>3.</b> </td> <td valign="top">The system authenticates the Audio player and grants access<br> </td> </tr> <tr> <td valign="top"><b>4.</b><br> </td> <td valign="top">The Audio player presents a Playlist ID<br> </td> <td valign="top"><b>5.</b><br> </td> <td valign="top">The system verifies that there is a Playlist in the Local storage with the given ID<br> </td> </tr> <tr> <td valign="top"><br> </td> <td valign="top"><br> </td> <td valign="top"><b>6.</b><br> </td> <td valign="top">The system returns the requested Playlist metafile and notifies the Audio player of the action taken<br> </td> </tr> <tr> <td valign="top"><b>7.</b><br> </td> <td valign="top">The Audio player reads the Playlist, and saves a private copy<br> </td> <td valign="top"><br> </td> <td valign="top"><br> </td> </tr> <tr> <td valign="top"><b>8.</b><br> </td> <td valign="top">The Audio player notifies the Local storage that it no longer needs the Playlist, and 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> if the Audio player can not be authenticated, she is notified, and the use case ends.</li> <li><b>action 5:</b> if there is no Playlist in the Local storage with the given ID, the user is notified and the use case ends.</li> </ul> <br> <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" width="650" height="600"></object> <br> <h3>Concepts</h3> <br> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <tbody> <tr> <th valign="top">concept<br> </th> <th valign="top">description<br> </th> </tr> <tr> <td valign="top"><b>Authentication</b><br> </td> <td valign="top">Component responsible for doing the authentications <br> </td> </tr> <td valign="top"><b>Session ID</b><br> </td> <td valign="top">An identifier issued by Authentication, to be used by subsequent operations.<br> </td> </tr> <tr> <td valign="top"><b>Unique ID<br> </b> </td> <td valign="top">A globally unique identifier used to to differentiate between objects that might even be created on different systems. Even though the whole space of Id is not known, the Ids must be unique.<br> </td> </tr> <tr> <td valign="top"><b>MetaData</b><br> </td> <td valign="top">Data about the AudioClip<br> </td> </tr> <tr> <td valign="top"><b>SearchCriteria<br> </b></td> <td valign="top">Describes the search parameters when doing a search on the MetaData<br> </td> </tr> <tr> <td valign="top"><b>AudioClip</b><br> </td> <td valign="top">The basic unit of audio handled by Local storage<br> </td> </tr> <tr> <td valign="top"><b>RawAudioData<br> </b></td> <td valign="top">The binary audio data contained in an Audio clip<br> </td> </tr> <tr> <td valign="top"><b>Storage maintainer</b><br> </td> <td valign="top">The actor that maintains the contents of the Local storage<br> </td> </tr> <tr> <td valign="top"><b>Audio player</b><br> </td> <td valign="top">The actor that accesses the raw audio contained in the Local storage<br> </td> </tr> <tr> <td valign="top"><b>Playlist</b><br> </td> <td valign="top">A metafile containing AudioClip IDs and some extra (fade in / fade out) information<br> </td> </tr> <tr> <td valign="top"><b>URL</b><br> </td> <td valign="top">The location of a metafile (in the local filesystem)<br> </td> </tr> <tr> <td valign="top"><b>Token</b><br> </td> <td valign="top">An identifier used to match the parts of two-part operations, e.g., access--release or edit--save<br> </td> </tr> <tr> <td valign="top"><br> </td> <td valign="top"><br> </td> </tr> </tbody> </table> <br> <h3>Associations</h3> <br> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <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">AudioClip<br> </td> <td valign="top">Is identified by<br> </td> <td valign="top">UniqueId<br> </td> <td valign="top">This is a globally unique id for each Audio clip<br> </td> </tr> <tr> <td valign="top">AudioClip<br> </td> <td valign="top">Is described by<br> </td> <td valign="top">MetaData<br> </td> <td valign="top"><br> </td> </tr> <tr> <td valign="top">AudioClip<br> </td> <td valign="top">Contains<br> </td> <td valign="top">RawAudioData<br> </td> <td valign="top"><br> </td> </tr> <tr> <td valign="top">Storage maintainer<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">Storage maintainer<br> </td> <td valign="top">Searches in<br> </td> <td valign="top">MetaData<br> </td> <td valign="top"><br> </td> </tr> <tr> <td valign="top">Storage maintainer<br> </td> <td valign="top">Searches by<br> </td> <td valign="top">SearchCriteria<br> </td> <td valign="top">The storage maintainer specifies such a SearchCriteria when doing a search on MetaData<br> </td> </tr> <tr> <td valign="top">Storage maintainer<br> </td> <td valign="top">Manages<br> </td> <td valign="top">AudioClip<br> </td> <td valign="top">This includes uploading, updating and deleting AudioClips<br> </td> </tr> <tr> <td valign="top">Audio player<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">Audio player<br> </td> <td valign="top">Accesses<br> </td> <td valign="top">RawAudioData<br> </td> <td valign="top">This is a seekable access to raw audio data.<br> </td> </tr> <tr> <td valign="top">Playlist<br> </td> <td valign="top">Is identified by<br> </td> <td valign="top">UniqueId<br> </td> <td valign="top">This is a globally unique id for each Playlist<br> </td> </tr> <tr> <td valign="top">Storage maintainer<br> </td> <td valign="top">Manages<br> </td> <td valign="top">Playlist<br> </td> <td valign="top">This includes creating, editing, deleting and accessing Playlists<br> </td> </tr> <td valign="top">Playlist<br> </td> <td valign="top">Is associated with<br> </td> <td valign="top">URL<br> </td> <td valign="top">The path of (a copy of) the playlist metafile<br> </td> </tr> <td valign="top">Playlist<br> </td> <td valign="top">Is associated with<br> </td> <td valign="top">Token<br> </td> <td valign="top">An identifier issued by access operations, to be used for identification by release operations<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 Store or update Audio clip</h4> <object type="image/svg+xml" name="authenticate user sequence diagram" data="Storeorupdateaudioclip_SequenceDiagram.svg" width="650" height="200"></object> <br> <h4>UC-2 Delete Audio clip</h4> <object type="image/svg+xml" name="authenticate user sequence diagram" data="Deleteaudioclip_SequenceDiagram.svg" width="600" height="200"></object> <br> <h4>UC-3 Update Audio clip metadata</h4> <object type="image/svg+xml" name="authenticate user sequence diagram" data="UpdateAudioclipmetadata_SequenceDiagram.svg" width="650" height="200"></object> <br> <h4>UC-4 Access raw audio data</h4> <object type="image/svg+xml" name="authenticate user sequence diagram" data="Accessrawaudiodata_SequenceDiagram.svg" width="600" height="200"></object> <br> <h4>UC-5 Search in metadata</h4> <object type="image/svg+xml" name="authenticate user sequence diagram" data="Searchinmetadata_SequenceDiagram.svg" width="650" height="200"></object> <br> <h4>UC-6 Create playlist</h4> <object type="image/svg+xml" name="create playlist sequence diagram" data="Createplaylist_SequenceDiagram.svg" width="650" height="200"></object> <br> <h4>UC-7 Edit playlist</h4> <object type="image/svg+xml" name="create playlist sequence diagram" data="Editplaylist_SequenceDiagram.svg" width="650" height="200"></object> <br> <h4>UC-8 Delete playlist</h4> <object type="image/svg+xml" name="create playlist sequence diagram" data="Deleteplaylist_SequenceDiagram.svg" width="650" height="200"></object> <br> <h4>UC-9 Access playlist</h4> <object type="image/svg+xml" name="create playlist sequence diagram" data="Accessplaylist_SequenceDiagram.svg" width="650" height="200"></object> <br> <h3>System objects</h3> The following figure 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" width="450" height="320"></object> <h3>Contracts</h3> For all operations exposed in the system sequence diagrams, the following contracts are defined.<br> <h4>Contract for Local storage : authenticate</h4> see Authentication : Authenticate<br> <h4>Contract for Local storage : existsAudioClip<br> </h4> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <tbody> <tr> <td valign="top"><b>Name</b><br> </td> <td colspan="2" rowspan="1" valign="top">existsAudioClip<br> (sessionId : SessionId, <br> audioClipId : UniqueId)<br> : boolean<br> </td> </tr> <tr> <td valign="top"><b>Responsibilities</b><br> </td> <td colspan="2" rowspan="1" valign="top">Check if an Audio clip with the specified id is stored in local storage<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">none<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</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 specified id is stored in Local storage, 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<br> </h4> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <tbody> <tr> <td valign="top"><b>Name</b><br> </td> <td colspan="2" rowspan="1" valign="top">storeAudioClip<br> (sessionId : SessionId, <br> audioClip : AudioClip)<br> : UniqueId<br> </td> </tr> <tr> <td valign="top"><b>Responsibilities</b><br> </td> <td colspan="2" rowspan="1" valign="top">Store a new audio clip or replace an existing one.<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-1<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 this is an AudioClip update, and the RawAudioData of the already existing AudioClip is is being accessed (see UC-4), report 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 stored 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">if this is a new audio clip:</td> <td valign="top">an AudioClip object is created</td> <td valign="top">instance creation<br> </td> </tr> <tr> <td valign="top"><br> </td> <td valign="top">a UniqueId is generated for the new clip<br> </td> <td valign="top">instance creation<br> </td> </tr> <tr> <td valign="top"><br> </td> <td valign="top">the UniqueId is associated with the AudioClip<br> </td> <td valign="top">association formed<br> </td> </tr> <tr> <td valign="top"><br> </td> <td valign="top">a MetaData object is created and filled with the presented contents<br> </td> <td valign="top">instance creation<br> </td> </tr> <tr> <td valign="top"><br> </td> <td valign="top">the MetaData is associated with the AudioClip<br> </td> <td valign="top">association formed<br> </td> </tr> <tr> <td valign="top"><br> </td> <td valign="top">a RawAudioData object is created and filled with the presented contents<br> </td> <td valign="top">instance creation<br> </td> </tr> <tr> <td valign="top"><br> </td> <td valign="top">the RawAudioData is associated with the AudioClip<br> </td> <td valign="top">association formed<br> </td> </tr> <tr> <td valign="top">if the clip already existed:<br> </td> <td valign="top">the contents of MetaData for the AudioClip are replaced by the presented contents<br> </td> <td valign="top">attribute modification<br> </td> </tr> <tr> <td valign="top"><br> </td> <td valign="top">the contents of RawAudioData for the AudioClip are replaced by the presented contents<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 Local storage : deleteAudioClip<br> </h4> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <tbody> <tr> <td valign="top"><b>Name</b><br> </td> <td colspan="2" rowspan="1" valign="top">deleteAudioClip<br> (sessionId : SessionId, <br> audioClipId : UniqueId)<br> : void<br> </td> </tr> <tr> <td valign="top"><b>Responsibilities</b><br> </td> <td colspan="2" rowspan="1" valign="top">Delete an existing Audio clip<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-2<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 with the specified id exists, report as an error.<br> if the RawAudioData for AudioClip is being accessed (see UC-4), report 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 UniqueId for the AudioClip is deleted<br> </td> <td valign="top">instance deletion<br> </td> </tr> <tr> <td valign="top"><br> </td> <td valign="top">the MetaData for the AudioClip is deleted<br> </td> <td valign="top">instance deletion<br> </td> </tr> <tr> <td valign="top"><br> </td> <td valign="top">the RawAudioData for the AudioClip is deleted<br> </td> <td valign="top">instance deletion<br> </td> </tr> <tr> <td valign="top"><br> </td> <td valign="top">the AudioClip 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 Local storage : updateAudioClipMetadata<br> </h4> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <tbody> <tr> <td valign="top"><b>Name</b><br> </td> <td colspan="2" rowspan="1" valign="top">updateAudioClipMetadata<br> (sessionId : SessionId, <br> audioClipId : UniqueId,<br> newMetadata : MetaData)<br> : void<br> </td> </tr> <tr> <td valign="top"><b>Responsibilities</b><br> </td> <td colspan="2" rowspan="1" valign="top">Update the metadata of an Audio clip stored in Local storage<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-3<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 with the specified id exists, report 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 contents of MetaData for the AudioClip are replaced with the presented contents<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 Local storage : accessRawAudioData<br> </h4> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <tbody> <tr> <td valign="top"><b>Name</b><br> </td> <td colspan="2" rowspan="1" valign="top">accessRawAudioData<br> (sessionId : SessionId, <br> audioClipId : UniqueId)<br> : RawAudioData<br> </td> </tr> <tr> <td valign="top"><b>Responsibilities</b><br> </td> <td colspan="2" rowspan="1" valign="top">Get access to raw audio data of an AudioClip<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-4<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 with the specified id exists, report as an error.<br> </td> </tr> <tr> <td valign="top"><b>Output</b><br> </td> <td colspan="2" rowspan="1" valign="top">the RawAudioData for the AudioClip identified with the supplied UniqueId<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 currentlyAccessing attribute for RawAudioData for AudioClip is increased by one<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 Local storage : releaseRawAudioData<br> </h4> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <tbody> <tr> <td valign="top"><b>Name</b><br> </td> <td colspan="2" rowspan="1" valign="top">releaseRawAudioData<br> (sessionId : SessionId, <br> rawAudioData : RawAudioData)<br> : void<br> </td> </tr> <tr> <td valign="top"><b>Responsibilities</b><br> </td> <td colspan="2" rowspan="1" valign="top">Release access for raw audio data<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-4<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 specified RrawAudioData is not stored in Local storage, 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 currentlyAccessing attribute for RawAudioData for AudioClip is decreased by one<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 Local storage : searchMetadata<br> </h4> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <tbody> <tr> <td valign="top"><b>Name</b><br> </td> <td colspan="2" rowspan="1" valign="top">searchMetadata<br> (sessionId : SessionId, <br> criteria : SearchCriteria)<br> : UniqueId<br> </td> </tr> <tr> <td valign="top"><b>Responsibilities</b><br> </td> <td colspan="2" rowspan="1" valign="top">Search through the metadata of stored AudioClips, and return all matching clip ids<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-5<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">A range of Audio clip ids, for which MetaData matches the supplied search criteria<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 Local storage : getAudioClip<br> </h4> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <tbody> <tr> <td valign="top"><b>Name</b><br> </td> <td colspan="2" rowspan="1" valign="top">getAudioClip<br> (sessionId : SessionId, <br> audioClipId : UniqueId)<br> : AudioClip<br> </td> </tr> <tr> <td valign="top"><b>Responsibilities</b><br> </td> <td colspan="2" rowspan="1" valign="top">Return the contents of an Audio clip.<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">see Playlist editor<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, report 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 supplied id.<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 Local storage : createPlaylist<br> </h4> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <tbody> <tr> <td valign="top"><b>Name</b><br> </td> <td colspan="2" rowspan="1" valign="top">createPlaylist<br> (sessionId : SessionId, <br> playlistId : UniqueId)<br> : void<br> </td> </tr> <tr> <td valign="top"><b>Responsibilities</b><br> </td> <td colspan="2" rowspan="1" valign="top">Create a new Playlist metafile.<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-6<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 a Playlist with the given playlistId already exists, report 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"></td> <td valign="top">a Playlist object is created</td> <td valign="top">instance creation<br> </td> </tr> <tr> <td valign="top"><br> </td> <td valign="top">the new Playlist is marked as currently not being edited<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 Local storage : editPlaylist<br> </h4> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <tbody> <tr> <td valign="top"><b>Name</b><br> </td> <td colspan="2" rowspan="1" valign="top">editPlaylist<br> (sessionId : SessionId, <br> playlistId : UniqueId)<br> : { playlistURL : URL, playlistToken: Token }<br> </td> </tr> <tr> <td valign="top"><b>Responsibilities</b><br> </td> <td colspan="2" rowspan="1" valign="top">Open a Playlist metafile 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">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 Playlist with the given playlistId exists, or if the Playlist has already been marked as being edited, report as an error<br> </td> </tr> <tr> <td valign="top"><b>Output</b><br> </td> <td colspan="2" rowspan="1" valign="top">a URL of a Playlist metafile, and a token identifying it<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 marked as currently being edited<br> </td> <td valign="top">attribute modification<br> </td> </tr> <td valign="top"><br></td> <td valign="top">the Playlist metafile and the URL returned are associated with the token returned<br> </td> <td valign="top">association formed<br> </td> <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 : savePlaylist<br> </h4> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <tbody> <tr> <td valign="top"><b>Name</b><br> </td> <td colspan="2" rowspan="1" valign="top">savePlaylist<br> (sessionId : SessionId, <br> playlistToken : Token, <br> newPlaylist : Playlist)<br> : void<br> </td> </tr> <tr> <td valign="top"><b>Responsibilities</b><br> </td> <td colspan="2" rowspan="1" valign="top">Store a new Playlist metafile in place of the old one.<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-7<br> </td> </tr> <tr> <td valign="top"><b>Notes</b><br> </td> <td colspan="2" rowspan="1" valign="top">TODO: decide exactly what the newPlaylist argument looks like<br> </td> </tr> <tr> <td valign="top"><b>Exceptions</b><br> </td> <td colspan="2" rowspan="1" valign="top">if the playlistToken argument does not match a token generated earlier in this session by editPlaylist(), report 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 has been marked as being edited in the same session</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 marked as currently not being edited<br> </td> <td valign="top">attribute modification<br> </td> </tr> <tr> <td valign="top"></td> <td valign="top">the playlistToken token and the URL returned earlier by editPlaylist() together with it are no longer valid</td> <td valign="top">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 Local storage : deletePlaylist<br> </h4> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <tbody> <tr> <td valign="top"><b>Name</b><br> </td> <td colspan="2" rowspan="1" valign="top">deletePlaylist<br> (sessionId : SessionId, <br> playlistId : UniqueId)<br> : void<br> </td> </tr> <tr> <td valign="top"><b>Responsibilities</b><br> </td> <td colspan="2" rowspan="1" valign="top">Delete a Playlist metafile.<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">none<br> </td> </tr> <tr> <td valign="top"><b>Exceptions</b><br> </td> <td colspan="2" rowspan="1" valign="top">if no Playlist with the given playlistId exists, or if the Playlist is marked as currently being edited, report 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"></td> <td valign="top">a Playlist object is deleted</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 Local storage : accessPlaylist<br> </h4> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <tbody> <tr> <td valign="top"><b>Name</b><br> </td> <td colspan="2" rowspan="1" valign="top">accessPlaylist<br> (sessionId : SessionId, <br> playlistId : UniqueId)<br> : { playlistURL : URL, playlistToken : Token }<br> </td> </tr> <tr> <td valign="top"><b>Responsibilities</b><br> </td> <td colspan="2" rowspan="1" valign="top">Access (read) a Playlist metafile.<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-9<br> </td> </tr> <tr> <td valign="top"><b>Notes</b><br> </td> <td colspan="2" rowspan="1" valign="top">for this method, it does not matter whether the Playlist is being edited or not -- the latest saved state of the Playlist should be returned<br> </td> </tr> <tr> <td valign="top"><b>Exceptions</b><br> </td> <td colspan="2" rowspan="1" valign="top">if no Playlist with the given playlistId exists, report as an error<br> </td> </tr> <tr> <td valign="top"><b>Output</b><br> </td> <td colspan="2" rowspan="1" valign="top">a URL of a Playlist metafile, and a token identifying it<br> </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 and the URL returned are associated with the token returned<br> </td> <td valign="top">association formed<br> </td> <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 : releasePlaylist<br> </h4> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <tbody> <tr> <td valign="top"><b>Name</b><br> </td> <td colspan="2" rowspan="1" valign="top">releasePlaylist<br> (sessionId : SessionId, <br> playlistToken : Token)<br> : void<br> </td> </tr> <tr> <td valign="top"><b>Responsibilities</b><br> </td> <td colspan="2" rowspan="1" valign="top">Release the resources obtained earlier by accessPlaylist().<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-9<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 playlistToken argument does not match a token generated earlier in this session by accessPlaylist(), report 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"></td> <td valign="top">the playlistToken token and the URL returned earlier by accessPlaylist() together with it are no longer valid</td> <td valign="top">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 Local storage : existsPlaylist<br> </h4> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <tbody> <tr> <td valign="top"><b>Name</b><br> </td> <td colspan="2" rowspan="1" valign="top">existsPlaylist<br> (sessionId : SessionId, <br> playlistId : UniqueId)<br> : bool<br> </td> </tr> <tr> <td valign="top"><b>Responsibilities</b><br> </td> <td colspan="2" rowspan="1" valign="top">Check whether a Playlist metafile with the given playlist ID exists.<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-6, UC-7, UC-8, UC-9<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">true or false<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 colspan="2" rowspan="1" valign="top">none</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 : playlistIsAvailable<br> </h4> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <tbody> <tr> <td valign="top"><b>Name</b><br> </td> <td colspan="2" rowspan="1" valign="top">playlistIsAvailable<br> (sessionId : SessionId, <br> playlistId : UniqueId)<br> : bool<br> </td> </tr> <tr> <td valign="top"><b>Responsibilities</b><br> </td> <td colspan="2" rowspan="1" valign="top">Check whether a Playlist metafile with the given playlist ID is available for editing, i.e., exists and has not been opened for editing yet.<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-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">true if the playlist exists and is available; false if either condition fails<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 colspan="2" rowspan="1" valign="top">none</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 : accessAudioClip<br> </h4> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <tbody> <tr> <td valign="top"><b>Name</b><br> </td> <td colspan="2" rowspan="1" valign="top">accessAudioClip<br> (sessionId : SessionId, <br> audioClipId : UniqueId)<br> : { audioClipURL : URL, audioClipToken : Token }<br> </td> </tr> <tr> <td valign="top"><b>Responsibilities</b><br> </td> <td colspan="2" rowspan="1" valign="top">Access (read) an Audio Clip metafile.<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-4<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 AudioClip with the given audioClipId exists, report as an error<br> </td> </tr> <tr> <td valign="top"><b>Output</b><br> </td> <td colspan="2" rowspan="1" valign="top">a URL of an AudioClip metafile, and a token identifying it<br> </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 AudioClip and the URL returned are associated with the token returned<br> </td> <td valign="top">association formed<br> </td> <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 : releaseAudioClip<br> </h4> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <tbody> <tr> <td valign="top"><b>Name</b><br> </td> <td colspan="2" rowspan="1" valign="top">releaseAudioClip<br> (sessionId : SessionId, <br> audioClipToken : Token)<br> : void<br> </td> </tr> <tr> <td valign="top"><b>Responsibilities</b><br> </td> <td colspan="2" rowspan="1" valign="top">Release the resources obtained earlier by accessAudioClip().<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-4<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 audioClipToken argument does not match a token generated earlier in this session by accessAudioClip(), report 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"></td> <td valign="top">the audioClipToken token and the URL returned earlier by accessAudioClip() together with it are no longer valid</td> <td valign="top">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> <br> </body> </html>