/*
* BioJava development code
*
* This code may be freely distributed and modified under the
* terms of the GNU Lesser General Public Licence. This should
* be distributed with the code. If you do not have a copy,
* see:
*
* http://www.gnu.org/copyleft/lesser.html
*
* Copyright for this code is held jointly by the individual
* authors. These should be listed in @author doc comments.
*
* For more information on the BioJava project and its aims,
* or to join the biojava-l mailing list, visit the home page
* at:
*
* http://www.biojava.org/
*
*/
package org.biojavax.bio;
import java.util.Set;
import java.util.TreeSet;
import org.biojava.bio.Annotation;
import org.biojava.utils.AbstractChangeable;
import org.biojava.utils.ChangeEvent;
import org.biojava.utils.ChangeSupport;
import org.biojava.utils.ChangeVetoException;
import org.biojavax.Comment;
import org.biojavax.Namespace;
import org.biojavax.RankedCrossRef;
import org.biojavax.RankedDocRef;
import org.biojavax.RichAnnotation;
import org.biojavax.SimpleRichAnnotation;
import org.biojavax.bio.taxa.NCBITaxon;
/**
* Reference implementation of a BioEntry object which has no features or sequence.
* Equality is the combination of namespace, name, accession and version.
* @author Richard Holland
* @author Mark Schreiber
* @author George Waldon
* @since 1.5
*/
public class SimpleBioEntry extends AbstractChangeable implements BioEntry {
private Set comments = new TreeSet();
private Set rankedcrossrefs = new TreeSet();
private Set rankeddocrefs = new TreeSet();
private Set relationships = new TreeSet();
private String description;
private String division;
private String identifier;
private String name;
private String accession;
private int version;
private NCBITaxon taxon;
private Namespace ns;
private RichAnnotation notes = new SimpleRichAnnotation();
/**
* Creates a new bioentry representing the sequence in the given namespace
* with the given name, accession and version. These properties are all
* immutable and non-nullable.
* @param ns The namespace for this new bioentry (not null).
* @param name The name for this new bioentry (not null).
* @param accession The accession for this new bioentry (not null).
* @param version The version for this new bioentry.
*/
public SimpleBioEntry(Namespace ns, String name, String accession, int version) {
if (name==null) throw new IllegalArgumentException("Name cannot be null");
if (accession==null) throw new IllegalArgumentException("Accession cannot be null");
if (ns==null) throw new IllegalArgumentException("Namespace cannot be null");
this.description = null;
this.division = null;
this.identifier = null;
this.name = name;
this.accession = accession;
this.version = version;
this.taxon = null;
this.ns = ns;
}
// Hibernate requirement - not for public use.
protected SimpleBioEntry() {} // protected so SimpleRichSequence can extend us
/**
* {@inheritDoc}
* Warning this method gives access to the original
* Collection not a copy. This is required by Hibernate. If you
* modify the object directly the behaviour may be unpredictable.
*/
public Set getRankedCrossRefs() { return this.rankedcrossrefs; } // original for Hibernate
/**
* {@inheritDoc}
*/
public void setTaxon(NCBITaxon taxon) throws ChangeVetoException {
if(!this.hasListeners(BioEntry.TAXON)) {
this.taxon = taxon;
} else {
ChangeEvent ce = new ChangeEvent(
this,
BioEntry.TAXON,
taxon,
this.taxon
);
ChangeSupport cs = this.getChangeSupport(BioEntry.TAXON);
synchronized(cs) {
cs.firePreChangeEvent(ce);
this.taxon = taxon;
cs.firePostChangeEvent(ce);
}
}
}
/**
* {@inheritDoc}
*/
public Annotation getAnnotation() { return getRichAnnotation(); }
/**
* {@inheritDoc}
*/
public RichAnnotation getRichAnnotation() { return this.notes; }
/**
* {@inheritDoc}
* Warning this method gives access to the original
* Collection not a copy. This is required by Hibernate. If you
* modify the object directly the behaviour may be unpredictable.
*/
public Set getNoteSet() { return this.notes.getNoteSet(); }
/**
* {@inheritDoc}
* Warning this method gives access to the original
* Collection not a copy. This is required by Hibernate. If you
* modify the object directly the behaviour may be unpredictable.
*/
public void setNoteSet(Set notes) throws ChangeVetoException { this.notes.setNoteSet(notes); }
/**
* {@inheritDoc}
* Warning this method gives access to the original
* Collection not a copy. This is required by Hibernate. If you
* modify the object directly the behaviour may be unpredictable.
*/
public Set getComments() { return this.comments; } // must be original for Hibernate
/**
* {@inheritDoc}
* Warning this method gives access to the original
* Collection not a copy. This is required by Hibernate. If you
* modify the object directly the behaviour may be unpredictable.
*/
public Set getRankedDocRefs() { return this.rankeddocrefs; } // must be original for Hibernate
/**
* {@inheritDoc}
* Warning this method gives access to the original
* Collection not a copy. This is required by Hibernate. If you
* modify the object directly the behaviour may be unpredictable.
*/
public Set getRelationships() { return this.relationships; } // must be original for Hibernate
/**
* {@inheritDoc}
*/
public void setIdentifier(String identifier) throws ChangeVetoException {
if(!this.hasListeners(BioEntry.IDENTIFIER)) {
this.identifier = identifier;
} else {
ChangeEvent ce = new ChangeEvent(
this,
BioEntry.IDENTIFIER,
identifier,
this.identifier
);
ChangeSupport cs = this.getChangeSupport(BioEntry.IDENTIFIER);
synchronized(cs) {
cs.firePreChangeEvent(ce);
this.identifier = identifier;
cs.firePostChangeEvent(ce);
}
}
}
/**
* {@inheritDoc}
*/
public void setDivision(String division) throws ChangeVetoException {
if(!this.hasListeners(BioEntry.DIVISION)) {
this.division = division;
} else {
ChangeEvent ce = new ChangeEvent(
this,
BioEntry.DIVISION,
division,
this.division
);
ChangeSupport cs = this.getChangeSupport(BioEntry.DIVISION);
synchronized(cs) {
cs.firePreChangeEvent(ce);
this.division = division;
cs.firePostChangeEvent(ce);
}
}
}
/**
* {@inheritDoc}
*/
public void setDescription(String description) throws ChangeVetoException {
if(!this.hasListeners(BioEntry.DESCRIPTION)) {
this.description = description;
} else {
ChangeEvent ce = new ChangeEvent(
this,
BioEntry.DESCRIPTION,
description,
this.description
);
ChangeSupport cs = this.getChangeSupport(BioEntry.DESCRIPTION);
synchronized(cs) {
cs.firePreChangeEvent(ce);
this.description = description;
cs.firePostChangeEvent(ce);
}
}
}
/**
* {@inheritDoc}
*/
public String getAccession() { return this.accession; }
/**
* {@inheritDoc}
*/
public String getDescription() { return this.description; }
/**
* {@inheritDoc}
*/
public String getDivision() { return this.division; }
/**
* {@inheritDoc}
*/
public String getIdentifier() { return this.identifier; }
/**
* {@inheritDoc}
*/
public String getName() { return this.name; }
/**
* {@inheritDoc}
*/
public Namespace getNamespace() { return this.ns; }
/**
* {@inheritDoc}
*/
public NCBITaxon getTaxon() { return this.taxon; }
/**
* {@inheritDoc}
*/
public int getVersion() { return this.version; }
/**
* {@inheritDoc}
* Two bioentries are equal if they share the same namespace, name,
* accession and version.
*/
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj==null || !(obj instanceof BioEntry)) return false;
// Hibernate comparison - we haven't been populated yet
if (this.ns==null) return false;
// Normal comparison
BioEntry them = (BioEntry)obj;
return (this.ns.equals(them.getNamespace()) &&
this.name.equals(them.getName()) &&
this.accession.equals(them.getAccession()) &&
this.version==them.getVersion());
}
/**
* {@inheritDoc}
* Bioentries are ordered first by namespace, then name, accession, and
* finally version.
*/
public int compareTo(Object o) {
if (o==this) return 0;
// Hibernate comparison - we haven't been populated yet
if (this.ns==null) return -1;
// Normal comparison
BioEntry them = (BioEntry)o;
if (!this.ns.equals(them.getNamespace())) return this.ns.compareTo(them.getNamespace());
if (!this.name.equals(them.getName())) return this.name.compareTo(them.getName());
if (!this.accession.equals(them.getAccession())) return this.accession.compareTo(them.getAccession());
return this.version-them.getVersion();
}
/**
* {@inheritDoc}
*/
public int hashCode() {
int code = 17;
// Hibernate comparison - we haven't been populated yet
if (this.ns==null) return code;
// Normal comparison
code = 37*code + this.ns.hashCode();
code = 37*code + this.name.hashCode();
code = 37*code + this.accession.hashCode();
code = 37*code + this.version;
return code;
}
/**
* {@inheritDoc}
* Form: namespace:name/accession.version
*/
public String toString() {
return this.getNamespace()+":"+this.getName()+"/"+this.getAccession()+"."+this.getVersion();
}
/**
* {@inheritDoc}
*/
public void addRankedCrossRef(RankedCrossRef crossref) throws ChangeVetoException {
if (crossref==null) throw new IllegalArgumentException("Crossref cannot be null");
if(!this.hasListeners(BioEntry.RANKEDCROSSREF)) {
this.rankedcrossrefs.add(crossref);
} else {
ChangeEvent ce = new ChangeEvent(
this,
BioEntry.RANKEDCROSSREF,
crossref,
null
);
ChangeSupport cs = this.getChangeSupport(BioEntry.RANKEDCROSSREF);
synchronized(cs) {
cs.firePreChangeEvent(ce);
this.rankedcrossrefs.add(crossref);
cs.firePostChangeEvent(ce);
}
}
}
/**
* {@inheritDoc}
*/
public void removeRankedCrossRef(RankedCrossRef crossref) throws ChangeVetoException {
if (crossref==null) throw new IllegalArgumentException("Crossref cannot be null");
if(!this.hasListeners(BioEntry.RANKEDCROSSREF)) {
this.rankedcrossrefs.remove(crossref);
} else {
ChangeEvent ce = new ChangeEvent(
this,
BioEntry.RANKEDCROSSREF,
null,
crossref
);
ChangeSupport cs = this.getChangeSupport(BioEntry.RANKEDCROSSREF);
synchronized(cs) {
cs.firePreChangeEvent(ce);
this.rankedcrossrefs.remove(crossref);
cs.firePostChangeEvent(ce);
}
}
}
/**
* {@inheritDoc}
*/
public void addRankedDocRef(RankedDocRef docref) throws ChangeVetoException {
if (docref==null) throw new IllegalArgumentException("Docref cannot be null");
if(!this.hasListeners(BioEntry.RANKEDDOCREF)) {
this.rankeddocrefs.add(docref);
} else {
ChangeEvent ce = new ChangeEvent(
this,
BioEntry.RANKEDDOCREF,
docref,
null
);
ChangeSupport cs = this.getChangeSupport(BioEntry.RANKEDDOCREF);
synchronized(cs) {
cs.firePreChangeEvent(ce);
this.rankeddocrefs.add(docref);
cs.firePostChangeEvent(ce);
}
}
}
/**
* {@inheritDoc}
*/
public void removeRankedDocRef(RankedDocRef docref) throws ChangeVetoException {
if (docref==null) throw new IllegalArgumentException("Docref cannot be null");
if(!this.hasListeners(BioEntry.RANKEDDOCREF)) {
this.rankeddocrefs.remove(docref);
} else {
ChangeEvent ce = new ChangeEvent(
this,
BioEntry.RANKEDDOCREF,
null,
docref
);
ChangeSupport cs = this.getChangeSupport(BioEntry.RANKEDDOCREF);
synchronized(cs) {
cs.firePreChangeEvent(ce);
this.rankeddocrefs.remove(docref);
cs.firePostChangeEvent(ce);
}
}
}
/**
* {@inheritDoc}
*/
public void addComment(Comment comment) throws ChangeVetoException {
if (comment==null) throw new IllegalArgumentException("Comment cannot be null");
if(!this.hasListeners(BioEntry.COMMENT)) {
this.comments.add(comment);
} else {
ChangeEvent ce = new ChangeEvent(
this,
BioEntry.COMMENT,
comment,
null
);
ChangeSupport cs = this.getChangeSupport(BioEntry.COMMENT);
synchronized(cs) {
cs.firePreChangeEvent(ce);
this.comments.add(comment);
cs.firePostChangeEvent(ce);
}
}
}
/**
* {@inheritDoc}
*/
public void removeComment(Comment comment) throws ChangeVetoException {
if (comment==null) throw new IllegalArgumentException("Comment cannot be null");
if(!this.hasListeners(BioEntry.COMMENT)) {
this.comments.remove(comment);
} else {
ChangeEvent ce = new ChangeEvent(
this,
BioEntry.COMMENT,
null,
comment
);
ChangeSupport cs = this.getChangeSupport(BioEntry.COMMENT);
synchronized(cs) {
cs.firePreChangeEvent(ce);
this.comments.remove(comment);
cs.firePostChangeEvent(ce);
}
}
}
/**
* {@inheritDoc}
*/
public void addRelationship(BioEntryRelationship relation) throws ChangeVetoException {
if (relation==null) throw new IllegalArgumentException("Relationship cannot be null");
if(!this.hasListeners(BioEntry.RELATIONS)) {
this.relationships.add(relation);
} else {
ChangeEvent ce = new ChangeEvent(
this,
BioEntry.RELATIONS,
relation,
null
);
ChangeSupport cs = this.getChangeSupport(BioEntry.RELATIONS);
synchronized(cs) {
cs.firePreChangeEvent(ce);
this.relationships.add(relation);
cs.firePostChangeEvent(ce);
}
}
}
/**
* {@inheritDoc}
*/
public void removeRelationship(BioEntryRelationship relation) throws ChangeVetoException {
if (relation==null) throw new IllegalArgumentException("Relationship cannot be null");
if(!this.hasListeners(BioEntry.RELATIONS)) {
this.relationships.remove(relation);
} else {
ChangeEvent ce = new ChangeEvent(
this,
BioEntry.RELATIONS,
null,
relation
);
ChangeSupport cs = this.getChangeSupport(BioEntry.RELATIONS);
synchronized(cs) {
cs.firePreChangeEvent(ce);
this.relationships.remove(relation);
cs.firePostChangeEvent(ce);
}
}
}
// Hibernate requirement - not for public use.
void setRelationships(Set relationships) { this.relationships = relationships; } // must be original for Hibernate
// Hibernate requirement - not for public use.
void setNamespace(Namespace ns) { this.ns = ns; }
// Hibernate requirement - not for public use.
void setName(String name) { this.name = name; }
// Hibernate requirement - not for public use.
void setAccession(String acc) { this.accession = acc; }
// Hibernate requirement - not for public use.
void setVersion(int v) { this.version = v; }
// Hibernate requirement - not for public use.
void setRankedDocRefs(Set docrefs) { this.rankeddocrefs = docrefs; } // must be original for Hibernate
// Hibernate requirement - not for public use.
void setComments(Set comments) { this.comments = comments; } // must be original for Hibernate
// Hibernate requirement - not for public use.
public void setRankedCrossRefs(Set rankedcrossrefs) { this.rankedcrossrefs = rankedcrossrefs; } // original for Hibernate
// Hibernate requirement - not for public use.
private Integer id;
/**
* Gets the Hibernate ID. Should be used with caution.
* @return the Hibernate ID, if using Hibernate.
*/
public Integer getId() { return this.id; }
/**
* Sets the Hibernate ID. Should be used with caution.
* @param id the Hibernate ID, if using Hibernate.
*/
public void setId(Integer id) { this.id = id;}
}