001package org.biopax.paxtools.impl.level3;
002
003import org.biopax.paxtools.model.BioPAXElement;
004import org.biopax.paxtools.model.level3.ChemicalStructure;
005import org.biopax.paxtools.model.level3.SmallMoleculeReference;
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.Boost;
012import org.hibernate.search.annotations.Field;
013import org.hibernate.search.annotations.Analyze;
014import org.hibernate.search.annotations.Indexed;
015import org.hibernate.search.annotations.Store;
016
017import javax.persistence.Entity;
018import javax.persistence.ManyToOne;
019import javax.persistence.Transient;
020
021@Entity
022@Proxy(proxyClass= SmallMoleculeReference.class)
023@Indexed
024@DynamicUpdate @DynamicInsert
025@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
026public class SmallMoleculeReferenceImpl extends EntityReferenceImpl implements SmallMoleculeReference
027{
028        private String chemicalFormula;
029        private float molecularWeight = UNKNOWN_FLOAT;
030        private ChemicalStructure structure;
031
032        
033        public SmallMoleculeReferenceImpl() {
034        }
035
036        //
037        // utilityClass interface implementation
038        //
039        ////////////////////////////////////////////////////////////////////////////
040
041    @Override  @Transient
042        public Class<? extends SmallMoleculeReference> getModelInterface()
043        {
044                return SmallMoleculeReference.class;
045        }
046
047    
048    
049    @Field(name=FIELD_KEYWORD, store=Store.YES, analyze=Analyze.YES)
050    @Boost(1.1f)
051    public String getChemicalFormula()
052        {
053                return chemicalFormula;
054        }
055
056    public void setChemicalFormula(String formula)
057        {
058                chemicalFormula = formula;
059        }
060
061    // Property MOLECULAR-WEIGHT
062    
063    public float getMolecularWeight()
064        {
065                return molecularWeight;
066        }
067
068    public void setMolecularWeight(float molecularWeight)
069        {
070                this.molecularWeight = molecularWeight;
071        }
072
073    // Property structure
074    @ManyToOne(targetEntity = ChemicalStructureImpl.class)//, cascade={CascadeType.ALL})
075    public ChemicalStructure getStructure()
076        {
077                return structure;
078        }
079
080    public void setStructure(ChemicalStructure structure)
081        {
082                this.structure = structure;
083        }
084    
085    @Override
086    protected boolean semanticallyEquivalent(BioPAXElement element) {
087        if(!(element instanceof SmallMoleculeReference)) return false;
088        SmallMoleculeReference that = (SmallMoleculeReference) element;
089        return (getChemicalFormula() != null 
090                        ? getChemicalFormula().equalsIgnoreCase(that.getChemicalFormula()) 
091                        : that.getChemicalFormula() == null)
092                && (getMolecularWeight() == that.getMolecularWeight())
093                && (getStructure() != null 
094                                ? getStructure().isEquivalent(that.getStructure()) 
095                        : that.getStructure() == null)
096                && super.semanticallyEquivalent(element);
097    }
098}