//============================================================================== // RepositoryWriter.java //============================================================================== package tribble.repository; import java.io.Closeable; import java.io.IOException; import java.lang.Exception; import java.lang.String; import java.lang.UnsupportedOperationException; /******************************************************************************* * Generic document repository storage writer. * *

* This interface contains the basic methods for implementing a * document repository writer application. Such an application is * responsible for managing a document storage system (or repository) that * allows clients to store documents into it. How the repository system * is implemented and what exactly constitutes a document is determined by each * particular subclass that implements this interface. * *

* A document consists of content data (such as an image, text, or other * kind of user data) and zero or more properties. Typically, the * properties comprise the keys used to store the document in the repository * system. * *

* First, note that the documents that are retrieved from this repository system * are of a subclass which extends the {@link StorableDocument} class: *

*    class MyStorableDocument
*        extends {@link StorableDocument}
*    { ... }
* *

* To create and store documents into a repository system, first a repository * writer object is created. The type of this object is a subclass which extends * the {@link RepositoryWriter} class: *

*    class MyRepositoryWriter
*        extends {@link RepositoryWriter}<MyStorableDocument>
*    { ... }
* *

* Finally, the documents that are stored into this repository system are * done so from a subclass which extends the {@link StorableFolder} class: *

*    class MyStorableFolder
*        extends {@link StorableFolder}<MyStorableDocument>
*    { ... }
* *

* A repository writer is created and initialized: *

*    MyRepositoryWriter  repos;
*    Properties          props;
*
*    repos = new MyRepositoryWriter(...);
*    props = ...;
*    repos.{@link #initialize initialize}(props);
* *

* Next, a connection to the repository system must be established and attached * to the repository writer: *

*    try
*    {
*        repos.{@link #open open}();
*    }
*    catch (IOException ex)
*    { ... }
* *

* The next step in the process of storing documents into the repository is to * locate and open the folder containing the documents we are interested in: *

*    MyStorableFolder    folder;
*    try
*    {
*        String      folderID;
*
*        folderID = ...;
*        folder = repos.{@link #getFolder getFolder}(folderID);
*    }
*    catch (IOException ex)
*    { ... }
* *

* Alternatively, if the folder does not yet exist within the repository, we * must create it: *

*    MyStorableFolder    folder;
*    try
*    {
*        String      folderID;
*
*        folderID = ...;
*        folder = repos.{@link #createFolder createFolder}(folderID);
*    }
*    catch (IOException ex)
*    { ... }
* *

* Either way, we now have a writable folder in which to store new documents. * *

* Next, a new document is created and its properties are established: *

*    MyStorableDocument  doc;
*    {@link WritableProperty}    prop;
*
*    doc = repos.{@link #createDocument createDocument}();
*
*    prop = new WritableProperty(...);
*    prop.{@link WritableProperty#setType setType}(...);
*    prop.{@link WritableProperty#setLength setLength}(...);
*    ...other attributes of the property can be set...
*
*    doc.{@link StorableDocument#addProperty addProperty}(prop);
*
*    ...repeat for each document property...
* *

* Next, the contents of the document are established, by setting the input * stream from which the contents are to be read: *

*    InputStream     ds;
*
*    ds = new InputStream(...);
*    doc.{@link StorableDocument#setDataStream setDataStream}(ds);
* *

* At this point, the document is fully initialized and ready to be stored into * the repository system: *

*    try
*    {
*        String  id;
*
*        id = folder.{@link WritableFolder#storeDocument storeDocument}(doc);
*        ...store the document ID somewhere...
*        ...note that doc.{@link StorableDocument#getDataStream getDataStream}().close() is called...
*        ...note that doc.{@link StorableDocument#doneReading doneReading}() is called...
*        doc.{@link StorableDocument#close close}();
*    }
*    catch (IOException ex)
*    { ... }
* *

* This is repeated for each document to be stored in the repository system. * *

* Repository system implementations may optionally allow documents to be removed * from the repository. This is done by specifying a specific document ID to be * deleted. Implementations that allow this operation must ensure that the * document ID uniquely identifies a single document within the repository: *

*    try
*    {
*        String  id;
*
*        id = ...;
*        folder.{@link WritableFolder#removeDocument removeDocument}(id);
*    }
*    catch (IOException ex)
*    { ... }
* *

* Once all documents have been stored or removed, the repository writer must be * closed, breaking the connection and detaching it from the repository system: *

*    folder.{@link WritableFolder#close close}();
*    repos.{@link #close close}();
* *

* Exceptions (IOException) are thrown if any errors occur during * processing. * *

* Note: This requires Java 1.5 or later. * * *

*
Source code:
*
* http://david.tribble.com/src/java/tribble/repository/RepositoryWriter.java *
*
Documentation:
*
* http://david.tribble.com/docs/tribble/repository/RepositoryWriter.html *
*
* * * @version API 3.0, $Revision: 1.3 $ $Date: 2012/03/17 22:58:54 $ * @since 2008-04-04 * @author David R. Tribble (david@tribble.com)
* Copyright ©2008-2012 by David R. Tribble, all rights reserved.
* Permission is granted to any person or entity except those designated * by the United States Department of State as a terrorist or terrorist * government or agency, to use and distribute this source code provided * that the original copyright notice remains present and unaltered. * * @see Folder * @see StorableDocument * @see WritableProperty * @see RepositoryReader */ public interface RepositoryWriter extends Repository, java.io.Closeable { static final String REV = "@(#)tribble/repository/RepositoryWriter.java $Revision: 1.3 $ $Date: 2012/03/17 22:58:54 $\n"; // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ // Methods /*************************************************************************** * Establish the default properties for documents created by this repository * writer. * *

* Note that implementations are not required to support default document * properties, in which case this method can throw an * UnsupportedOperationException or simply do nothing. * * @throws IllegalStateException (unchecked) * Thrown if {@link #initialize initialize()} has not been called yet. * * @throws UnsupportedOperationException (unchecked) * This operation is not supported, i.e., the implementation does not support * default document properties. * * @since API 2.0, 2008-04-04 */ public abstract void setDefaultProperties(DocumentProperty[] defs) throws IOException; /*************************************************************************** * Create a new empty document folder in the repository attached to this * repository writer. * * @param id * Name of the new document folder. * The format and meaning of this name is determined by the implementation. * Some implementations amy allow this to be empty ("") or null. * * @return * A newly created folder for the repository system. * The folder contains no documents, and has only the default document * properties as established by a previous call to * {@link #setDefaultProperties setDefaultProperties()}. * After the contents and properties are established for a new document, * it can be stored in the folder by calling * {@link WritableFolder#storeDocument WritableFolder.storeDocument()}. * * @throws IOException * Thrown if an error occurs while creating the folder. * * @throws IllegalStateException (unchecked) * Thrown if {@link #initialize initialize()} has not been called yet. * * @since API 3.0, 2012-03-05 */ public abstract WritableFolder createFolder(String id) throws IOException; } // End RepositoryWriter.java