| MediaEntityLocal.java |
/*
* JBoss, the OpenSource J2EE webOS
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
package javax.emb;
import java.io.InputStream;
import java.net.URL;
import javax.ejb.EJBLocalObject;
/**
* This basic interface extends the {@link javax.emb.Media}interface with
* behavior common to all kinds of media objects that are persistent and can be
* altered. It also extends <code>EJBLocalObject</code> and therefore
* represents the local interface of a media entity EJB.
*
* <p>Media Entity EJBs consist of the five basic alterable properties:
*
* <ul><li>The content property models the byte content of a media entity
* EJB. As such content can become rather large, additional streaming I/O
* accessors are provided in addition to the standard set of get/set methods.
* The content length of a single media entity EJB is not limited to 2GB; it
* can theoretically be up to about 9 hexabytes (2^63) in size. Note that the
* presence of the content property does not mean an implementation has to load
* the media content into memory; as most implementations will avoid this to
* keep memory consumption at bay. Also note that the content property is
* correlated to the location property, i.e. the content property cannot be set
* if the location property is set and vice versa. The default value for this
* property is <code>null</code>.</li>
*
* <li>The location property allows a media entity to gain read access to
* externally managed content, as opposed to the content property which models
* internally managed content. For example, a location URL can point to an HTTP
* site that hosts an image. If the location property is set, read access to
* the content is possible, but all operations requiring write access to the
* content will fail. The location property is correlated to the content
* property, i.e. the location property cannot be set if the content property
* is set and vice versa. The default value for this property is <code>null</code>.
* </li>
*
* <li>The description property allows a textual description to be associated
* with a media entity EJB, for example to be displayed in conjunction with
* some thumbnail in an image list for orientation. The default value for this
* property is <code>null</code>.</li>
*
* <li>The name property models a file name that is used as a default in case
* the content has to be exported to a file. The media format of a media entity
* EJB is derived from the file name extension. The default value for this
* property is <code>null</code>.</li>
*
* <li>The mimeType property is used to hint web application programmers of
* which mime type to use when transferring content directly over HTTP. The
* default value for this property is <code>null</code>, but unless both the
* mimeType and name properties are <code>null</code> the mimeType accessor
* will provide a format specific default mime type.</li></ul>
*
* @version <tt>$Revision: 1.3 $</tt>
* @author <a href="mailto:ricardoarguello@users.sourceforge.net">Ricardo
* Argüello</a>
*/
public interface MediaEntityLocal extends EJBLocalObject, Media
{
/**
* Adds the given listener to the list of persistent observers that are
* notified of important state changes or activities inside the receiver. If
* the given listener is already part of the receiver's list of persistent
* observers, no action is performed. Note that listeners are distinguished
* using checks for content equality, not content identity.
*
* @param listener the listener.
* @throws java.lang.NullPointerException if the value passed is <code>null</code>.
*/
void addListener(MediaListener listener) throws MediaException;
/**
* Adds the given metadata to the receiver's list of associated metadata.
* Metadata consists of XML content that has been stored in separate
* MetaDataEntity EJBs. Several applications can associate XML metadata with
* a single media entity. If the given metadata EJB is already part of the
* receiver's list of metadata entities, no action is performed.
*
* @param metaData metadata.
* @throws java.lang.NullPointerException if the value passed is <code>null</code>.
*/
void addMetaData(MetaDataEntityLocal metaData) throws MediaException;
/**
* This operation updates the receiver's content after performing a series
* of transformations on the original content, as defined in the given
* specifications array. The order of the specifications array defines the
* order of the transformations being performed. This allows modification of
* the receiver without transferring the content over machine boundaries.
* Note that the receiver's format can change due to this operation, and
* that it implicitly updates the receiver's lastModified property. Also
* note that this operation will fail if the location property is set.
*
* @param specifications array of <code>MediaConverterSpec</code>s.
* @throws java.lang.NullPointerException if the value passed is <code>null</code>.
* @throws javax.emb.ContentAccessException if the content cannot be
* accessed.
* @throws javax.emb.ContentUnmutableException if the <code>location</code>
* property is not <code>null</code>.
* @throws javax.emb.MediaFormatException if a problem occurs handling the
* different media formats involved.
* @throws javax.emb.ConversionException if one of the conversions fails.
* @throws javax.emb.ListenerVetoException if a media listener vetoes the
* change.
* @throws javax.emb.ContentTooLargeException if the content generated is
* larger than supported by the implementation.
*/
void convert(MediaConverterSpec[] specifications) throws MediaException;
/**
* Copies the receiver's content to the given target directory location, a
* URL pointing to a directory. If <code>null</code> is passed, the
* content is exported to a default directory. The URL must be of protocol
* type "file" or any additional protocol supported by the implementation.
* In case of non-embedded media formats, the content of related children is
* also recursively copied into the same directory or one of its
* subdirectories. Implementations must guarantee that no existing files are
* overwritten during execution, i.e. they must resolve naming conflicts by
* generating file names and adjusting parent content if necessary.
*
* <p>The location returned points to the file exported for the receiver,
* which is necessary to know in case a directory location was given, or the
* location given pointed to an existing file.
*
* @param targetDirectoryLocation a URL pointing to a directory. Must be of
* protocol type "file".
* @return URL
* @throws javax.emb.ContentAccessException if the content cannot be stored
* at the given target location, or if the content transfer fails.
* @throws javax.emb.MalformedLocationException if the given target location
* is malformed or the given protocol is not supported.
* @throws javax.emb.MediaFormatException is thrown if there is a problem
* dealing with one of the media formats involved.
*/
URL exportMedia(URL targetDirectoryLocation) throws MediaException;
/**
* Returns the receiver's children as an array of media entities. Children
* are media entities being referenced from within the receiver's content,
* and the array is therefore guaranteed to be empty in case of embedded
* media formats.
*
* <p>Note that in case of non-embedded media formats a change of the media
* content can implicitly alter the set of children. Also note that altering
* the resulting array content will not alter the persisted set of children,
* i.e. no persistent relationship collection is exposed. The reason for
* this is that the number of children depends on the content.
*
* @return the receiver's children as an array of media entities.
*/
MediaEntityLocal[] getChildren() throws MediaException;
/**
* Returns the receiver's description as a String or <code>null</code>.
* The string is not guaranteed to have any structure, and is primarily
* designed to allow storing a descriptive label without the need to model
* an EJB relation to another entity bean describing the receiver.
*
* @return the receiver's description.
*/
String getDescription() throws MediaException;
/**
* Returns a timestamp stating when the receiver's persistent state was last
* modified. Note that relationships are not considered part of the
* persistent state and therefore don't affect the value of this property.
*
* @return the receiver's persistent state last modification date.
*/
long getLastModified() throws MediaException;
/**
* Returns an array containing the media listeners associated with the
* receiver. If no listeners are associated with the receiver, an empty
* array is returned. Note that listeners are distinguished using checks for
* content equality, not content identity.
*
* @return the persistent listeners observing to the receiver.
*/
MediaListener[] getListeners() throws MediaException;
/**
* Returns the location of the media content as an instance of
* {@link java.net.URL}or <code>null</code> if no location has been set.
*/
URL getLocation() throws MediaException;
/**
* Returns the receiver's associated metadata as an array of MetaDataEntity
* EJBs. Metadata consists of XML content that has been stored in separate
* MetaDataEntity EJBs. Several applications can associate their metadata
* with a single MetaDataEntity EJB. An empty array is returned if no
* metadata has been set.
*
* @return metadata
*/
MetaDataEntityLocal[] getMetaData() throws MediaException;
/**
* Returns the succeeding version of the receiver, which allows querying and
* a history chain of media objects that represent the same thing. The value
* <code>null</code> is returned if no next version exists.
*/
MediaEntityLocal getNextVersion() throws MediaException;
/**
* Returns the receiver's parents as an array of media entities. Parents are
* media entities that reference the receiver as their child, and the
* collection is therefore guaranteed to consist entirely of non-embedded
* media entities. Note that changing parents' content can alter a child
* media entitie's set of parents implicitly. An empty array is returned if
* no parents are available.
*/
MediaEntityLocal[] getParents() throws MediaException;
/**
* Returns the previous version of the receiver, which allows querying a
* history of media objects that represent the same logical thing. The value
* <code>null</code> is returned if no previous version exists.
*
* @return @throws MediaException
*/
MediaEntityLocal getPreviousVersion() throws MediaException;
/**
* Alters the content of the receiver with the one read from the given
* source location, a URL of type "file" or any other protocol type
* supported by the implementation pointing to a piece of content. If the
* given name is not <code>null</code>, the name property is also set to
* match the given name. It may only contain characters that are valid in
* file names. If both the name property and the name given are <code>null</code>
* the name property is updated with a generated name, possibly based on the
* given source location.
*
* <p>In case the media content is non-embedded, the operation recursively
* creates media entity EJBs for the children, with their respective names
* being derived from the child links within the content. Note that the
* operation identifies children that are referenced from multiple parents
* in the operation's context and avoids creating multiple media entity EJBs
* in this case.
*
* <p>Please note that passing a sourceLocation that is equal to the
* receiver's current location is allowed and can trigger the recursive
* recreation of all children. Additionally the receiver's format can change
* due to this operation if the file extension passed with the given name
* differs from the one set for the receiver. Also note that this operation
* implicitly updates the receiver's lastModified property, and it will fail
* if the location property is set.
*
* @param sourceLocation
* @param name
* @throws java.lang.NullPointerException if the value passed is <code>null</code>.
* @throws java.lang.IllegalArgumentException if the name argument passed
* contains invalid characters.
* @throws javax.emb.ContentAccessException if the content cannot be
* accessed at the given source location, or if the content transfer
* fails.
* @throws javax.emb.ContentUnmutableException is thrown if the location
* property is not <code>null</code>.
* @throws javax.ejb.CreateException if the creation of a child EJB fails.
* @throws javax.emb.MediaFormatException if a format related problem
* occurs.
* @throws javax.emb.MalformedLocationException if the given source location
* is malformed.
* @throws javax.emb.ListenerVetoException if a media listener vetoes the
* change.
* @throws javax.emb.ContentTooLargeException if the content given is larger
* than supported by the implementation.
*/
void importMedia(URL sourceLocation, String name) throws MediaException;
/**
* Removes the given listener from the list of persistent observers that are
* notified of important state changes or activities inside the receiver. If
* the listener is not part of the receiver's list of persistent observers,
* no action is performed. Note that listeners are distinguished using
* checks for content equality, not content identity.
*
* @param listener the listener.
* @throws java.lang.NullPointerException if the value passed is <code>null</code>.
*/
void removeListener(MediaListener listener) throws MediaException;
/**
* Removes the given metadata from the receiver's list of associated
* metadata. Metadata consists of XML content that has been stored in
* MetaDataEntity EJBs. Several applications can associate XML metadata with
* a single media entity. If the given metadata EJB is not part of the
* receiver's list of metadata entities, no action is performed.
*
* <p>Note that this operation will not remove the MetaDataEntity EJB from
* the persistent store, but rather disassociate the metadata from the Media
* Entity on which the method was invoked.
*
* @param metaData metadata
* @throws java.lang.NullPointerException if the value passed is <code>null</code>.
*/
void removeMetaData(MetaDataEntityLocal metaData) throws MediaException;
/**
* This operation sets the children of the receiver to an array of media
* entity EJBs. Note that the number of children passed must match the
* number of existing children. Also note that this operation is only
* allowed if the content property is set because it might require updating
* said content.
*
* @param children children
* @throws java.lang.NullPointerException if the value passed or one of its
* elements is <code>null</code>.
* @throws java.lang.IllegalArgumentException if the value passed has more
* or fewer elements than the receiver's existing number of
* children.
* @throws javax.emb.ContentUnmutableException if the <code>location</code>
* property is set.
* @throws javax.emb.ContentAccessException if the <code>content</code>
* has not been set.
*/
void setChildren(MediaEntityLocal[] children) throws MediaException;
/**
* This operation offers a convenient way to alter the content of the
* receiver for small and embedded media content. In case the content is
* non-embedded, the <code>importMedia(URL, String)</code> operation
* should be used instead, as this method only modifies the receiver's
* content and no child content is affected. The same is true if the content
* is rather large.
*
* <p>If both the value passed and the receiver's existing content property
* are not <code>null</code>, no format change may occur during this
* operation. If the location property is not <code>null</code> then this
* operation is not permitted. Note that the location property may not be
* set while the content property contains a value different from <code>null</code>.
* Note that this operation implicitly updates the receive's <code>lastModified</code>
* property. Also note that this operation will fail if the <code>location</code>
* property is set.
*
* @param content content.
* @throws javax.emb.ContentAccessException if content transfer fails.
* @throws javax.emb.FormatNotFoundException if the name property is <code>null</code>.
* @throws javax.emb.FormatSyntaxException if the system notices a format
* change.
* @throws javax.emb.ContentUnmutableException if the location property is
* not <code>null</code>.
* @throws javax.emb.ContentTooLargeException if the content given is larger
* than supported by the implementation.
*/
void setContent(byte[] content) throws MediaException;
/**
* This operation offers a convenient way to alter the content of the
* receiver for all kinds of embedded media formats. If the content is
* non-embedded, the <code>importMedia(URL, String)</code> operation
* should be used instead, as this method only modifies the receiver's
* content and no child content is affected. The same is true if the content
* is rather large.
*
* <p>If both the value passed and the receiver's existing content property
* are not <code>null</code>, no format change may occur during this
* operation. If the location property is not <code>null</code>, this
* operation is not permitted. The location property may not be set while
* the content property contains a value different from <code>null</code>.
* Note that this operation implicitly updates the receiver's lastModified
* property. Also note that this operation will fail if the <code>location</code>
* property is set.
*
* @param content content.
* @throws java.lang.NullPointerException if the value passed is <code>null</code>.
* @throws javax.emb.ContentAccessException if content transfer fails.
* @throws javax.emb.FormatNotFoundException if the name property is <code>null</code>.
* @throws javax.emb.FormatSyntaxException if the system notices a format
* change.
* @throws javax.emb.ContentUnmutableException if the location property is
* not <code>null</code>.
* @throws javax.emb.ListenerVetoException if a media listener vetoes the
* change.
* @throws javax.emb.ContentTooLargeException if the content given is larger
* than supported by the implementation.
*/
void setContent(InputStream content) throws MediaException;
/**
* Alters the receiver's description. The description string is primarily
* designed to allow storing a descriptive label without the need to model
* an EJB relation to another entity bean describing the receiver. Passing
* <code>null</code> causes the description field to be reset to <code>null</code>.
* Note that this operation implicitly updates the receiver's <code>lastModified</code>
* property.
*
* @param description description.
* @throws javax.emb.ListenerVetoException if a media listener vetoes the
* change.
*/
void setDescription(String description) throws MediaException;
/**
* Sets the location of the receiver to the given location URL or <code>null</code>.
* The purpose of this method is to provide a mechanism for read access to
* externally managed content. For example, content that is hosted by an
* external content provider.
*
* <p>Note that if the content property is not <code>null</code>, this
* operation is not permitted. Note that the content property may not be set
* while the <code>location</code> property contains a value different
* from <code>null</code>. Also note that this operation implicitly
* updates the receiver's <code>lastModified</code> property.
*
* @param location location URL.
* @throws javax.emb.ContentAccessException if the media content cannot be
* accessed under the new location, or if the given location URL
* points to a directory.
* @throws javax.emb.LocationUnmutableException if the content property is
* not <code>null</code>.
* @throws javax.emb.ListenerVetoException if a media listener vetoes the
* change.
*/
void setLocation(URL location) throws MediaException;
/**
* Alters the receiver's MIME type that allows media content to be written
* directly to a Servlet output stream. Note that this operation implicitly
* updates the receiver's <code>lastModified</code> property. Note that
* passing <code>null</code> will cause the <code>getMimeType()</code>
* method to return a format specific default. Also note that this operation
* implicitly updates the receiver's <code>lastModified</code> property.
*
* @param mimeType MIME type.
* @throws javax.emb.ListenerVetoException if a media listener vetoes the
* change.
*/
void setMimeType(String mimeType) throws MediaException;
/**
* Sets the receiver's non-unique name as a <code>String</code>. The name
* is used as a file name hint in case the media content is to be stored or
* published in a file system and therefore may only contain characters that
* are valid in file names. Also, it must contain a file extension that
* represents the receiver's media format. Note that this operation
* implicitly updates the receiver's <code>lastModified</code> property.
*
* @param name name.
* @throws java.lang.NullPointerException if the value passed is <code>null</code>.
* @throws java.lang.IllegalArgumentException if the name argument passed
* contains invalid characters.
* @throws javax.emb.FormatNotFoundException if the format cannot be
* determined from the file extension.
* @throws javax.emb.ListenerVetoException is thrown if a media listener
* vetoes the change.
*/
void setName(String name) throws MediaException;
/**
* Defines the given media entity to be the preceding version of the
* receiver, which allows querying a history chain of media objects that
* represent the same logical thing. In return, the operation causes the
* receiver to be the given media entity's next version. Passing the value
* <code>null</code> causes the receiver not to have a previous version
* anymore. The operation is only allowed if version chain integrity is
* preserved:
*
* <ul><li>If the given media entity is the receiver itself: A
* javax.emb.VersionChainIntegrityException is thrown.</li>
*
* <li>If the given media entity is already the previous version of the
* receiver: No action is performed.</li>
*
* <li>If the given media entity is <code>null</code>: A
* javax.emb.VersionChainIntegrityException is thrown if the receiver has a
* successor.</li>
*
* <li>Otherwise: A javax.emb.VersionChainIntegrityException is thrown if
* the given media entity has a successor, or if the receiver has a
* predecessor, a successor, or both.</li></ul>
*
*/
void setPreviousVersion(MediaEntityLocal mediaEntity) throws MediaException;
/**
* Sets the given media entity as the receiver's persistent proxy, e.g. a
* thumbnail, an icon, a short video or audio clip of any format. Proxies
* represent media objects to give people interested an up front impression
* of the latter. If there is already a proxy relation for the receiver, the
* old relation is discarded and the old persistent proxy is not deleted. In
* case <code>null</code> is passed, the relation to any existing
* persistent proxy is broken up and <code>getProxy()</code> will return a
* generated transient proxy.
*
* @param mediaEntity media entity.
*/
void setProxy(MediaEntityLocal mediaEntity) throws MediaException;
}| MediaEntityLocal.java |