Fix 43670, 44501 - Fix how HDGF deals with trailing data in the list of chunk headers
[poi.git] / src / documentation / content / xdocs / poifs / usecases.xml
blob8d2dea3ade7b40bee0d76e5d6036f0957a85afbf
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!--
3    ====================================================================
4    Licensed to the Apache Software Foundation (ASF) under one or more
5    contributor license agreements.  See the NOTICE file distributed with
6    this work for additional information regarding copyright ownership.
7    The ASF licenses this file to You under the Apache License, Version 2.0
8    (the "License"); you may not use this file except in compliance with
9    the License.  You may obtain a copy of the License at
11        http://www.apache.org/licenses/LICENSE-2.0
13    Unless required by applicable law or agreed to in writing, software
14    distributed under the License is distributed on an "AS IS" BASIS,
15    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16    See the License for the specific language governing permissions and
17    limitations under the License.
18    ====================================================================
19 -->
20 <!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V1.1//EN" "../dtd/document-v11.dtd">
21 <document>
22   <header>
23     <title>POIFS Use Cases</title>
24     <authors>
25       <person email="mjohnson@apache.org" name="Marc Johnson" id="MJ"/>
26     </authors>
27   </header>
28   <body>
29     <section><title>POIFS Use Cases</title>
30       <section><title>Use Case 1: Read existing file system</title>
31         <table>
32           <tr>
33             <td><em>Primary Actor:</em></td>
34             <td>POIFS client</td>
35           </tr>
36           <tr>
37             <td><em>Scope:</em></td>
38             <td>POIFS</td>
39           </tr>
40           <tr>
41             <td><em>Level:</em></td>
42             <td>Summary</td>
43           </tr>
44           <tr>
45             <td><em>Stakeholders and Interests:</em></td>
46             <td>
47               POIFS client- wants to read content of file
48                   system<br/>
49               POIFS - understands POIFS file system
50             </td>
51           </tr>
52           <tr>
53             <td><em>Precondition:</em></td>
54             <td>None</td>
55           </tr>
56           <tr>
57             <td><em>Minimal Guarantee:</em></td>
58             <td>None</td>
59           </tr>
60           <tr>
61             <td><em>Main Success Guarantee:</em></td>
62             <td>
63             1. POIFS client requests POIFS to read a POIFS file
64                 system, providing an
65                 <code>InputStream</code>
66                 containing POIFS file system in question.<br/>
67             2. POIFS reads from the
68                 <code>InputStream</code> in
69                 512 byte blocks.<br/>
70             3. POIFS verifies that the first block begins with
71                 the well known signature
72                 (
73                 <code>0xE11AB1A1E011CFD0</code>)<br/>
74             4. POIFS reads the Block Allocation Table from the
75                 first block and, if necessary, from the XBAT
76                 blocks.<br/>
77             5. POIFS obtains the start block of the Property
78                 Table and reads the Property Table (use case 9,
79                 read file)<br/>
80             6. POIFS reads the individual entries in the Property
81                 Table<br/>
82             7. POIFS obtains the start block of the Small Block
83                 Allocation Table and reads the Small Block
84                 Allocation Table (use case 9, read file)<br/>
85             8. POIFS obtains the start block of the Small Block
86                 store from the first entry in the Property Table
87                 and reads the Small Block Array (use case 9, read
88                 file)<br/>
89         </td>
90           </tr>
91           <tr>
92             <td><em>Extensions:</em></td>
93             <td>
94                 2a. If the last block read is not a 512 byte
95                 block, the
96                 <code>InputStream</code> is not that of
97                 a POIFS file system, and POIFS throws an
98                 appropriate exception.
99             <br/>
100                     3a. If the signature is incorrect, the
101             <code>InputStream</code> is not that of a POIFS
102             file system, and POIFS throws an appropriate
103                     exception.<br/>
104             </td>
105           </tr>
106         </table>
107       </section>
108       <section><title>Use Case 2: Write file system</title>
109         <table>
110           <tr>
111             <th>Primary Actor:</th>
112             <th>POIFS client</th>
113           </tr>
114           <tr>
115             <th>Scope:</th>
116             <td>POIFS</td>
117           </tr>
118           <tr>
119             <th>Level:</th>
120             <td>Summary</td>
121           </tr>
122           <tr>
123             <th>Stakeholders and Interests:</th>
124             <td>
125             POIFS client- wants to write file system out.<br/>
126             POIFS - knows how to write file system out.
127             </td>
128           </tr>
129           <tr>
130             <th>Precondition:</th>
131             <td>
132                 File system has been read (use case 1, read
133                     existing file system) and subsequently modified
134                     (use case 4, replace file in file system; use case
135                     5, delete file from file system; or use case 6,
136                     write new file to file system; in any
137                     combination)
138               <br/>or<br/>
139                 File system has been created (use case 3, create
140                     new file system)
141             </td>
142           </tr>
143           <tr>
144             <th>Minimal Guarantee:</th>
145             <td>None</td>
146           </tr>
147           <tr>
148             <th>Main Success Guarantee:</th>
149             <td>
150                 1. POIFS client provides an
151                     <code>OutputStream</code>
152                     to write the file system to.
153                 <br/>
154                 2. POIFS gets the sizes of the Property Table and
155                     each file in the file system.<br/>
156                 3. If any files in the file system requires storage
157                     in a Small Block Array, POIFS creates a Small
158                     Block Array of sufficient size to hold all of the
159                     small files.<br/>
160                 4. POIFS calculates the number of big blocks needed
161                     to hold all of the large files, the Property
162                     Table, and, if necessary, the Small Block Array
163                     and the Small Block Allocation Table.<br/>
164                 5. POIFS creates a set of big blocks sufficient to
165                     store the Block Allocation Table<br/>
166                 6. POIFS creates and writes the header block<br/>
167                 7. POIFS writes out the XBAT blocks, if needed.<br/>
168                 8. POIFS writes out the Small Block Array, if
169                     needed<br/>
170                 9. POIFS writes out the Small Block Allocation Table,
171                     if needed<br/>
172                 10. POIFS writes out the Property Table<br/>
173                 11. POIFS writes out the large files, if needed<br/>
174                 12. POIFS closes the <code>OutputStream</code>.
175             </td>
176           </tr>
177           <tr>
178             <th>Extensions:</th>
179             <td>
180               6a. Exceptions writing to the
181                   <code>OutputStream</code> will be propagated back
182                   to the POIFS client.
183               <br/>
184               7a. Exceptions writing to the
185                   <code>OutputStream</code> will be propagated back
186                   to the POIFS client.
187               <br/>
188               8a. Exceptions writing to the
189                   <code>OutputStream</code> will be propagated back
190                   to the POIFS client.
191               <br/>
192               9a. Exceptions writing to the
193                   <code>OutputStream</code> will be propagated back
194                   to the POIFS client.
195               <br/>
196               10a. Exceptions writing to the
197                   <code>OutputStream</code> will be propagated back
198                   to the POIFS client.
199               <br/>
200               11a. Exceptions writing to the
201                   <code>OutputStream</code> will be propagated back
202                   to the POIFS client.
203               <br/>
204               12a. Exceptions closing the
205                   <code>OutputStream</code> will be propagated back
206                   to the POIFS client.
207               <br/>
208             </td>
209           </tr>
210         </table>
211       </section>
212       <section><title>Use Case 3: Create new file system</title>
213         <table>
214           <tr>
215             <th>Primary Actor:</th>
216             <td>POIFS client</td>
217           </tr>
218           <tr>
219             <th>Scope:</th>
220             <td>POIFS</td>
221           </tr>
222           <tr>
223             <th>Level:</th>
224             <td>Summary</td>
225           </tr>
226           <tr>
227             <th>Stakeholders and Interests:</th>
228             <td>
229                 POIFS client- wants to create a new file
230                     system<br/>
231                 POIFS - knows how to create a new file system
232             </td>
233           </tr>
234           <tr>
235             <th>Precondition:</th>
236             <td>None</td>
237           </tr>
238           <tr>
239             <th>Minimal Guarantee:</th>
240             <td>None</td>
241           </tr>
242           <tr>
243             <th>Main Success Guarantee:</th>
244             <td>
245                 POIFS creates an empty Property Table.
246             </td>
247           </tr>
248           <tr>
249             <th>Extensions:</th>
250             <td>None</td>
251           </tr>
252         </table>
253       </section>
254       <section><title>Use Case 4: Replace file in file system</title>
255         <table>
256           <tr>
257             <td><em>Primary Actor:</em></td>
258             <td>POIFS client</td>
259           </tr>
260           <tr>
261             <td><em>Scope:</em></td>
262             <td>POIFS</td>
263           </tr>
264           <tr>
265             <td><em>Level:</em></td>
266             <td>Summary</td>
267           </tr>
268           <tr>
269             <td><em>Stakeholders and Interests:</em></td>
270             <td>
271                 1. POIFS client- wants to replace an existing file in
272                     the file system<br/>
273                     2. POIFS - knows how to manage the file system
274             </td>
275           </tr>
276           <tr>
277             <td><em>Precondition:</em></td>
278             <td>
279               Either
280               <br/><br/>
281                 The file system has been read (use case 1, read
282                     existing file system) and a file has been
283                     extracted from the file system (use case 7, read
284                     existing file from file system)
285               <br/><br/>or<br/><br/>
286                 The file system has been created (use case 3,
287                     create new file system) and a file has been
288                     written to the file system (use case 6, write new
289                     file to file system)
290             </td>
291           </tr>
292           <tr>
293             <td><em>Minimal Guarantee:</em></td>
294             <td>None</td>
295           </tr>
296           <tr>
297             <td><em>Main Success Guarantee:</em></td>
298             <td>
299                 1. POIFS discards storage of the existing file.<br/>
300                 2. POIFS updates the existing file's entry in the
301                     Property Table<br/>
302                 3. POIFS stores the new file's data
303             </td>
304           </tr>
305           <tr>
306             <td><em>Extensions:</em></td>
307             <td>
308                 1a. POIFS throws an exception if the file does not
309                     exist.
310             </td>
311           </tr>
312         </table>
313       </section>
314       <section><title>Use Case 5: Delete file from file system</title>
315         <table>
316           <tr>
317             <td><em>Primary Actor:</em></td>
318             <td>POIFS client</td>
319           </tr>
320           <tr>
321             <td><em>Scope:</em></td>
322             <td>POIFS</td>
323           </tr>
324           <tr>
325             <td><em>Level:</em></td>
326             <td>Summary</td>
327           </tr>
328           <tr>
329             <td><em>Stakeholders and Interests:</em></td>
330             <td>
331                 * POIFS client- wants to remove a file from a file
332                     system<br/>
333                     * POIFS - knows how to manage the file system
334             </td>
335           </tr>
336           <tr>
337             <td><em>Precondition:</em></td>
338             <td>
339               Either<br/><br/>
340                 The file system has been read (use case 1, read
341                     existing file system) and a file has been
342                     extracted from the file system (use case 7, read
343                     existing file from file system)<br/>
344               <br/>
345               or<br/>
346               <br/>
347                 The file system has been created (use case 3,
348                     create new file system) and a file has been
349                     written to the file system (use case 6, write new
350                     file to file system)
351             </td>
352           </tr>
353           <tr>
354             <td><em>Minimal Guarantee:</em></td>
355             <td>None</td>
356           </tr>
357           <tr>
358             <td><em>Main Success Guarantee:</em></td>
359             <td>
360                 1. POIFS discards the specified file's storage.<br/>
361                 2. POIFS discards the file's Property Table
362                     entry.
363             </td>
364           </tr>
365           <tr>
366             <td><em>Extensions:</em></td>
367             <td>
368                 1a. POIFS throws an exception if the file does not
369                     exist.
370             </td>
371           </tr>
372         </table>
373       </section>
374       <section><title>Use Case 6: Write new file to file system</title>
375         <table>
376           <tr>
377             <td><em>Primary Actor:</em></td>
378             <td>POIFS client</td>
379           </tr>
380           <tr>
381             <td><em>Scope:</em></td>
382             <td>POIFS</td>
383           </tr>
384           <tr>
385             <td><em>Level:</em></td>
386             <td>Summary</td>
387           </tr>
388           <tr>
389             <td><em>Stakeholders and Interests:</em></td>
390             <td>
391                 * POIFS client- wants to add a new file to the file
392                     system<br/>
393                     * POIFS - knows how to manage the file system
394             </td>
395           </tr>
396           <tr>
397             <td><em>Precondition:</em></td>
398             <td>The specified file does not yet exist in the file
399                 system</td>
400           </tr>
401           <tr>
402             <td><em>Minimal Guarantee:</em></td>
403             <td>None</td>
404           </tr>
405           <tr>
406             <td><em>Main Success Guarantee:</em></td>
407             <td>
408                 1. The POIFS client provides a file name<br/>
409                 2. POIFS creates a new Property Table entry for the
410                     new file<br/>
411                 3. POIFS provides the POIFS client with an
412                     <code>OutputStream</code> to write to.<br/>
413                 4. The POIFS client writes data to the provided
414                     <code>OutputStream</code>.<br/>
415                 5. The POIFS client closes the provided
416                     <code>OutputStream</code><br/>
417                 6. POIFS updates the Property Table entry with the
418                     new file's size
419             </td>
420           </tr>
421           <tr>
422             <td><em>Extensions:</em></td>
423             <td>
424                 1a. POIFS throws an exception if a file with the
425                     specified name already exists in the file
426                     system.<br/>
427             1b. POIFS throws an exception if the file name is
428                 too long. The limit on file name length is 31
429                 characters.
430             </td>
431           </tr>
432         </table>
433       </section>
434       <section><title>Use Case 7: Read existing file from file system</title>
435         <table>
436           <tr>
437             <td><em>Primary Actor:</em></td>
438             <td>POIFS client</td>
439           </tr>
440           <tr>
441             <td><em>Scope:</em></td>
442             <td>POIFS</td>
443           </tr>
444           <tr>
445             <td><em>Level:</em></td>
446             <td>Summary</td>
447           </tr>
448           <tr>
449             <td><em>Stakeholders and Interests:</em></td>
450             <td>
451                 * POIFS client- wants to read a file from the file
452                     system<br/>
453                     * POIFS - knows how to manage the file system
454             </td>
455           </tr>
456           <tr>
457             <td><em>Precondition:</em></td>
458             <td>
459                 * The file system has been read (use case 1, read
460                     existing file system) or has been created and
461                     written to (use case 3, create new file system;
462                     use case 6, write new file to file system).<br/>
463             * The specified file exists in the file system.
464             </td>
465           </tr>
466           <tr>
467             <td><em>Minimal Guarantee:</em></td>
468             <td>None</td>
469           </tr>
470           <tr>
471             <td><em>Main Success Guarantee:</em></td>
472             <td>
473                 * The POIFS client provides the name of a file to be read <br/>
474             * POIFS provides an <code>InputStream</code> to read from. <br/>
475             * The POIFS client reads from the <code>InputStream</code>.<br/>
476             * The POIFS client closes the <code>InputStream</code>.
477             </td>
478           </tr>
479           <tr>
480             <td><em>Extensions:</em></td>
481             <td>1a. POIFS throws an exception if no file with the
482                 specified name exists.</td>
483           </tr>
484         </table>
485       </section>
486       <section><title>Use Case 8: Read file system directory</title>
487         <table>
488           <tr>
489             <td><em>Primary Actor:</em></td>
490             <td>POIFS client</td>
491           </tr>
492           <tr>
493             <td><em>Scope:</em></td>
494             <td>POIFS</td>
495           </tr>
496           <tr>
497             <td><em>Level:</em></td>
498             <td>Summary</td>
499           </tr>
500           <tr>
501             <td><em>Stakeholders and Interests:</em></td>
502             <td>
503                 * POIFS client- wants to know what files exist in
504                     the file system<br/>
505             * POIFS - knows how to manage the file system
506             </td>
507           </tr>
508           <tr>
509             <td><em>Precondition:</em></td>
510             <td>The file system has been read (use case 1, read
511                 existing file system) or created (use case 3, create
512                 new file system)</td>
513           </tr>
514           <tr>
515             <td><em>Minimal Guarantee:</em></td>
516             <td>None</td>
517           </tr>
518           <tr>
519             <td><em>Main Success Guarantee:</em></td>
520             <td>
521                 1. The POIFS client requests the file system
522                     directory.
523                     2. POIFS returns an <code>Iterator</code>. The
524                     <code>Iterator</code> will not include the root
525                     entry in the Property Table, and may be an
526                     <code>Iterator</code> over an empty
527                     <code>Collection</code>.
528             </td>
529           </tr>
530           <tr>
531             <td><em>Extensions:</em></td>
532             <td>None</td>
533           </tr>
534         </table>
535       </section>
536       <section><title>Use Case 9: Read file</title>
537         <table>
538           <tr>
539             <td><em>Primary Actor:</em></td>
540             <td>POIFS</td>
541           </tr>
542           <tr>
543             <td><em>Scope:</em></td>
544             <td>POIFS</td>
545           </tr>
546           <tr>
547             <td><em>Level:</em></td>
548             <td>Summary</td>
549           </tr>
550           <tr>
551             <td><em>Stakeholders and Interests:</em></td>
552             <td>
553                     POIFS - POIFS needs to read a file, or something
554                     resembling a file (i.e., the Property Table, the
555                     Small Block Array, or the Small Block Allocation
556                     Table)
557             </td>
558           </tr>
559           <tr>
560             <td><em>Precondition:</em></td>
561             <td>None</td>
562           </tr>
563           <tr>
564             <td><em>Minimal Guarantee:</em></td>
565             <td>None</td>
566           </tr>
567           <tr>
568             <td><em>Main Success Guarantee:</em></td>
569             <td>
570                 1. POIFS begins with a start block, a file size, and
571                     a flag indicating whether to use the Big Block
572                     Allocation Table or the Small Block Allocation
573                     Table<br/>
574             2. POIFS returns an <code>InputStream</code>.<br/>
575             3. Reads from the <code>InputStream</code> are
576                 performed by walking the specified Block
577                 Allocation Table and reading the blocks
578                 indicated.<br/>
579             4. POIFS closes the <code>InputStream</code> when
580                 finished reading the file, or its client wants to
581                 close the <code>InputStream</code>.
582             </td>
583           </tr>
584           <tr>
585             <td><em>Extensions:</em></td>
586             <td>3a. An exception will be thrown if the specified Block
587                 Allocation Table is corrupt, as evidenced by an index
588                 pointing to a non-existent block, or by a chain
589                 extending past the known size of the file.</td>
590           </tr>
591         </table>
592       </section>
593       <section><title>Use Case 10: Rename existing file in the file system</title>
594         <table>
595           <tr>
596             <td><em>Primary Actor:</em></td>
597             <td>POIFS client</td>
598           </tr>
599           <tr>
600             <td><em>Scope:</em></td>
601             <td>POIFS</td>
602           </tr>
603           <tr>
604             <td><em>Level:</em></td>
605             <td>Summary</td>
606           </tr>
607           <tr>
608             <td><em>Stakeholders and Interests:</em></td>
609             <td>
610                 * POIFS client- wants to rename an existing file in
611                     the file system.<br/>
612             * POIFS - knows how to manage the file system.
613             </td>
614           </tr>
615           <tr>
616             <td><em>Precondition:</em></td>
617             <td>
618                 * The file system is has been read (use case 1, read
619                     existing file system) or has been created and
620                     written to (use case 3, create new file system;
621                     use case 6, write new file to file system.<br/>
622             * The specified file exists in the file system.<br/>
623             * The new name for the file does not duplicate
624                 another file in the file system.
625             </td>
626           </tr>
627           <tr>
628             <td><em>Minimal Guarantee:</em></td>
629             <td>None</td>
630           </tr>
631           <tr>
632             <td><em>Main Success Guarantee:</em></td>
633             <td>
634                 1. POIFS updates the Property Table entry for the
635                     specified file with its new name.
636             </td>
637           </tr>
638           <tr>
639             <td><em>Extensions:</em></td>
640             <td>
641                 * 1a. If the old file name is not in the file
642                     system, POIFS throws an exception.<br/>
643             * 1b. If the new file name already exists in the
644                 file system, POIFS throws an exception.<br/>
645             * 1c. If the new file name is too long (the limit is
646                 31 characters), POIFS throws an exception.
647             </td>
648           </tr>
649         </table>
650       </section>
651     </section>
652   </body>
653 </document>