// $HeadURL$
// $Id$
//
// Copyright © 2006, 2010, 2011, 2012 by the President and Fellows of Harvard College.
//
// Screensaver is an open-source project developed by the ICCB-L and NSRB labs
// at Harvard Medical School. This software is distributed under the terms of
// the GNU General Public License.
package edu.harvard.med.screensaver.model.libraries;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import com.google.common.base.Function;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import org.hibernate.annotations.Immutable;
import org.hibernate.annotations.IndexColumn;
import edu.harvard.med.screensaver.model.AbstractEntity;
import edu.harvard.med.screensaver.model.AbstractEntityVisitor;
import edu.harvard.med.screensaver.model.annotations.ContainedEntity;
import edu.harvard.med.screensaver.model.meta.PropertyPath;
import edu.harvard.med.screensaver.model.meta.RelationshipPath;
/**
* Information about a gene (or what is or was considered to be a gene) at a
* particular point in time, by a particular authority.
*
* @author <a mailto="andrew_tolopko@hms.harvard.edu">Andrew Tolopko</a>
*/
@Entity
@Immutable
@org.hibernate.annotations.Proxy
@ContainedEntity(containingEntityClass = SilencingReagent.class, autoCreated = true)
public class Gene extends AbstractEntity<Integer>
{
private static final long serialVersionUID = 0L;
public static final PropertyPath<Gene> genbankAccessionNumbers = RelationshipPath.from(Gene.class).toCollectionOfValues("genbankAccessionNumbers");
public static final PropertyPath<Gene> entrezgeneSymbols = RelationshipPath.from(Gene.class).toCollectionOfValues("entrezgeneSymbols");
public static final Function<Gene,String> ToGeneName = new Function<Gene,String>() { public String apply(Gene g) { return g.getGeneName(); } };
public static final Function<Gene,String> ToSpeciesName = new Function<Gene,String>() { public String apply(Gene g) { return g.getSpeciesName(); } };
public static final Function<Gene,Integer> ToEntrezgeneId = new Function<Gene,Integer>() { public Integer apply(Gene g) { return g.getEntrezgeneId(); } };
public static final Function<Gene,List<String>> ToEntrezgeneSymbols = new Function<Gene,List<String>>() { public List<String> apply(Gene g) { return g.getEntrezgeneSymbols(); } };
public static final Function<Gene,Collection<String>> ToGenbankAccessionNumbers = new Function<Gene,Collection<String>>() { public Collection<String> apply(Gene g) { return g.getGenbankAccessionNumbers(); } };
public static final Gene NullGene = new Gene();
private String _geneName;
private Integer _entrezgeneId;
private List<String> _entrezgeneSymbols = Lists.newArrayList();
private Set<String> _genbankAccessionNumbers = Sets.newHashSet();
private String _speciesName;
/**
* @motivation for SilencingReagent, which instantiates empty, related Gene entities
* @motivation for hibernate and proxy/concrete subclass constructors
*/
public Gene() {}
@Override
public Object acceptVisitor(AbstractEntityVisitor visitor)
{
return visitor.visit(this);
}
@Id
@org.hibernate.annotations.GenericGenerator(name="gene_id_seq",
strategy="sequence",
parameters = { @org.hibernate.annotations.Parameter(name="sequence", value="gene_id_seq")})
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="gene_id_seq")
public Integer getGeneId()
{
return getEntityId();
}
private void setGeneId(Integer geneId)
{
setEntityId(geneId);
}
@Column
@edu.harvard.med.screensaver.model.annotations.Column(hasNonconventionalSetterMethod=true)
public Integer getEntrezgeneId()
{
return _entrezgeneId;
}
private void setEntrezgeneId(Integer entrezgeneId)
{
_entrezgeneId = entrezgeneId;
}
/**
* Builder method to set entrez gene ID before entity is persisted
* @motivation builder method
* @return this Gene
*/
public Gene withEntrezgeneId(Integer entrezgeneId)
{
validateImmutablePropertyInitialization();
setEntrezgeneId(entrezgeneId);
return this;
}
@Column
@org.hibernate.annotations.Type(type="text")
@edu.harvard.med.screensaver.model.annotations.Column(hasNonconventionalSetterMethod=true)
public String getGeneName()
{
return _geneName;
}
private void setGeneName(String geneName)
{
_geneName = geneName;
}
/**
* Builder method to set gene name before entity is persisted
* @motivation builder method
* @return this Gene
*/
public Gene withGeneName(String geneName)
{
validateImmutablePropertyInitialization();
setGeneName(geneName);
return this;
}
@ElementCollection
@edu.harvard.med.screensaver.model.annotations.ElementCollection(hasNonconventionalMutation = true)
@Column(name="entrezgeneSymbol", nullable=false, unique = false)
@JoinTable(name="geneSymbol", joinColumns=@JoinColumn(name="geneId"))
@IndexColumn(name = "ordinal")
@org.hibernate.annotations.Type(type="text")
@org.hibernate.annotations.ForeignKey(name="fk_gene_symbol_to_gene")
public List<String> getEntrezgeneSymbols()
{
return _entrezgeneSymbols;
}
private void setEntrezgeneSymbols(List<String> entrezgeneSymbols)
{
_entrezgeneSymbols = entrezgeneSymbols;
}
/**
* Builder method to add entrezgene symbol before entity is persisted
* @motivation builder method
* @return this Gene
*/
public Gene withEntrezgeneSymbol(String entrezgeneSymbol)
{
validateImmutablePropertyInitialization();
_entrezgeneSymbols.add(entrezgeneSymbol);
return this;
}
@ElementCollection
@edu.harvard.med.screensaver.model.annotations.ElementCollection(hasNonconventionalMutation = true)
@Column(name="genbankAccessionNumber", nullable=false)
@JoinTable(name="geneGenbankAccessionNumber", joinColumns=@JoinColumn(name="geneId"))
@org.hibernate.annotations.Type(type="text")
@org.hibernate.annotations.ForeignKey(name="fk_gene_genbank_accession_number_to_gene")
public Set<String> getGenbankAccessionNumbers()
{
return _genbankAccessionNumbers;
}
private void setGenbankAccessionNumbers(Set<String> genbankAccessionNumbers)
{
_genbankAccessionNumbers = genbankAccessionNumbers;
}
/**
* Builder method to add entrezgene symbol before entity is persisted
* @motivation builder method
* @return this Gene
*/
public Gene withGenbankAccessionNumber(String genbankAccessionNumber)
{
validateImmutablePropertyInitialization();
_genbankAccessionNumbers.add(genbankAccessionNumber);
return this;
}
@Column
@org.hibernate.annotations.Type(type="text")
@edu.harvard.med.screensaver.model.annotations.Column(hasNonconventionalSetterMethod=true)
public String getSpeciesName()
{
return _speciesName;
}
private void setSpeciesName(String speciesName)
{
_speciesName = speciesName;
}
/**
* Builder method to set species name before entity is persisted
* @motivation builder method
* @return this Gene
*/
public Gene withSpeciesName(String speciesName)
{
validateImmutablePropertyInitialization();
setSpeciesName(speciesName);
return this;
}
}