org.biojava.bio
Class MergeAnnotation

java.lang.Object
  extended by org.biojava.utils.AbstractChangeable
      extended by org.biojava.bio.MergeAnnotation
All Implemented Interfaces:
java.io.Serializable, Annotation, Changeable

public class MergeAnnotation
extends AbstractChangeable
implements Annotation, java.io.Serializable

Merged view onto a list of underlying Annotation objects. Currently immutable (but reflects changes to underlying objects). Annotations near the beginning of the list will have properties that take precedence. It is possible to get the ordering of the annotations, or to change it by removing and re-adding methods. This Annotation implementation is immutable.

Since:
1.2
Author:
Thomas Down, Matthew Pocock, Greg Cox, Francois Pepin
See Also:
Serialized Form
For developers:
Use these when you have a list of Annotation instances that need to be viewed as one. For example, if you have annotation for a feature from a local database, in-memory objects and a web-page, you could build three Annotation instances and merge them using a MergeAnnotation.

Nested Class Summary
protected  class MergeAnnotation.PropertyForwarder
          Listener used to forward changes for any of the underlying annotations to listeners on this annotation.
 
Field Summary
static ChangeType ANNOTATION_ADD
          ChangeType of ChangeEvent fired before and after an annotation is added to MergeAnnotation.
static ChangeType ANNOTATION_CHANGED
          ChangeType of ChangeEvent fired before and after an annotation is added to MergeAnnotation.
static ChangeType ANNOTATION_REMOVE
          ChangeType of ChangeEvent fired before and after an annotation is added to MergeAnnotation.
 
Fields inherited from interface org.biojava.bio.Annotation
EMPTY_ANNOTATION, PROPERTY
 
Constructor Summary
MergeAnnotation()
           
 
Method Summary
 void addAnnotation(Annotation ann)
          Add a new Annotation to to the end of the list to be merged.
 java.util.Map asMap()
          Return a map that contains the same key/values as this Annotation.
 boolean containsProperty(java.lang.Object key)
          Returns whether there the property is defined.
 java.util.List getAnnotations()
          Gets an unmodifiable view of the list of Annotations that are part of the MergeAnnotation.
protected  ChangeSupport getChangeSupport(ChangeType changeType)
          Called to retrieve the ChangeSupport for this object.
 java.lang.Object getProperty(java.lang.Object key)
           Retrieve the value of a property by key.
 java.util.Set keys()
          Get a set of key objects.
 void removeAnnotation(Annotation ann)
          Remove an Annotation from the list.
 void removeProperty(java.lang.Object key)
          Delete a property.
 void setProperty(java.lang.Object key, java.lang.Object value)
           Set the value of a property.
 
Methods inherited from class org.biojava.utils.AbstractChangeable
addChangeListener, addChangeListener, generateChangeSupport, hasListeners, hasListeners, isUnchanging, removeChangeListener, removeChangeListener
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 
Methods inherited from interface org.biojava.utils.Changeable
addChangeListener, addChangeListener, isUnchanging, removeChangeListener, removeChangeListener
 

Field Detail

ANNOTATION_CHANGED

public static final ChangeType ANNOTATION_CHANGED
ChangeType of ChangeEvent fired before and after an annotation is added to MergeAnnotation.


ANNOTATION_ADD

public static final ChangeType ANNOTATION_ADD
ChangeType of ChangeEvent fired before and after an annotation is added to MergeAnnotation.


ANNOTATION_REMOVE

public static final ChangeType ANNOTATION_REMOVE
ChangeType of ChangeEvent fired before and after an annotation is added to MergeAnnotation.

Constructor Detail

MergeAnnotation

public MergeAnnotation()
Method Detail

addAnnotation

public void addAnnotation(Annotation ann)
                   throws ChangeVetoException
Add a new Annotation to to the end of the list to be merged.

Parameters:
ann - the Annotation to add
Throws:
ChangeVetoException - if the annotation could not be added
For advanced users:
Use this to alter the Annotations being merged

getAnnotations

public java.util.List getAnnotations()
Gets an unmodifiable view of the list of Annotations that are part of the MergeAnnotation. Lower indices Annotation have precedence if 2 Annotations share the same property.

Returns:
an unmodifiable List of the Annotations that form this MergeAnnotation.

removeAnnotation

public void removeAnnotation(Annotation ann)
                      throws ChangeVetoException
Remove an Annotation from the list. This can be used to change the ordering of the Annotations by re-adding it later.

Parameters:
ann - an Annotation to be removed.
Throws:
ChangeVetoException - if an error occurs

getChangeSupport

protected ChangeSupport getChangeSupport(ChangeType changeType)
Description copied from class: AbstractChangeable
Called to retrieve the ChangeSupport for this object.

Your implementation of this method should have the following structure:

 ChangeSupport cs = super.getChangeSupport(ct);

 if(someForwarder == null && ct.isMatching(SomeInterface.SomeChangeType)) {
   someForwarder = new ChangeForwarder(...

   this.stateVariable.addChangeListener(someForwarder, VariableInterface.AChange);
 }

 return cs;
 
It is usual for the forwarding listeners (someForwarder in this example) to be transient and lazily instantiated. Be sure to register & unregister the forwarder in the code that does the ChangeEvent handling in setter methods.

Overrides:
getChangeSupport in class AbstractChangeable

setProperty

public void setProperty(java.lang.Object key,
                        java.lang.Object value)
                 throws ChangeVetoException
Description copied from interface: Annotation

Set the value of a property.

This method throws an exception if either properties can not be added to this object, or that this particular property is immutable or illegal within the implementation.

Specified by:
setProperty in interface Annotation
Parameters:
key - the key object
value - the new value for this key
Throws:
ChangeVetoException - if this annotation object can't be changed, or if the change was vetoed

removeProperty

public void removeProperty(java.lang.Object key)
                    throws ChangeVetoException
Description copied from interface: Annotation
Delete a property.

Specified by:
removeProperty in interface Annotation
Parameters:
key - the key object
Throws:
ChangeVetoException - if the change is vetoed

getProperty

public java.lang.Object getProperty(java.lang.Object key)
Description copied from interface: Annotation

Retrieve the value of a property by key.

Unlike the Map collections, it will complain if the key does not exist. It will only return null if the key is defined and has value null.

Specified by:
getProperty in interface Annotation
Parameters:
key - the key of the property to retrieve
Returns:
the object associated with that key

containsProperty

public boolean containsProperty(java.lang.Object key)
Description copied from interface: Annotation
Returns whether there the property is defined.

Specified by:
containsProperty in interface Annotation
Parameters:
key - the key Object to search for
Returns:
true if this Annotation knows about the key, false otherwise

keys

public java.util.Set keys()
Description copied from interface: Annotation
Get a set of key objects.

Specified by:
keys in interface Annotation
Returns:
a Set of key objects

asMap

public java.util.Map asMap()
Description copied from interface: Annotation
Return a map that contains the same key/values as this Annotation.

If the annotation changes, the map may not reflect this. The Map may be unmodifiable.

Specified by:
asMap in interface Annotation
Returns:
a Map