001package org.biopax.paxtools.impl.level3;
002
003import org.biopax.paxtools.model.BioPAXElement;
004import org.biopax.paxtools.model.level3.BioSource;
005import org.biopax.paxtools.model.level3.SequenceEntityReference;
006import org.hibernate.annotations.Cache;
007import org.hibernate.annotations.CacheConcurrencyStrategy;
008import org.hibernate.annotations.Proxy;
009import org.hibernate.annotations.DynamicInsert;
010import org.hibernate.annotations.DynamicUpdate; 
011import org.hibernate.search.annotations.Field;
012import org.hibernate.search.annotations.Analyze;
013
014import javax.persistence.Entity;
015import javax.persistence.Lob;
016import javax.persistence.ManyToOne;
017
018@Entity
019@Proxy(proxyClass=SequenceEntityReference.class)
020@DynamicUpdate @DynamicInsert
021@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
022public abstract class SequenceEntityReferenceImpl extends EntityReferenceImpl
023        implements SequenceEntityReference
024{
025    private BioSource organism;
026    private String sequence;
027
028    public SequenceEntityReferenceImpl() {
029        }
030
031    //
032    // referenceSequenceEntity interface implementation
033    //
034    ////////////////////////////////////////////////////////////////////////////
035
036    // Property organism
037        @ManyToOne(targetEntity = BioSourceImpl.class)
038    public BioSource getOrganism()
039    {
040        return organism;
041    }
042
043    public void setOrganism(BioSource organism)
044    {
045        this.organism = organism;
046    }
047
048    // Property sequence
049
050        @Lob
051        @Field(name=FIELD_SEQUENCE, analyze=Analyze.YES)
052        public String getSequence()
053    {
054        return sequence;
055    }
056
057    public void setSequence(String sequence)
058    {
059        this.sequence = sequence;
060    }
061    
062    @Override
063    protected boolean semanticallyEquivalent(BioPAXElement element) {
064        if(!(element instanceof SequenceEntityReference)) return false;
065        SequenceEntityReference that = (SequenceEntityReference) element;
066        
067        return  getOrganism() != null
068                && getOrganism().isEquivalent(that.getOrganism())
069                && getSequence() != null
070                && getSequence().equalsIgnoreCase(that.getSequence());
071
072    }
073
074    @Override
075    public int equivalenceCode()
076    {
077        return this.organism==null || this.sequence==null? hashCode():
078                this.organism.equivalenceCode()+17*this.sequence.hashCode();
079    }
080}