001package org.biopax.paxtools.impl.level3;
002
003import org.biopax.paxtools.model.BioPAXElement;
004import org.biopax.paxtools.model.level3.*;
005import org.biopax.paxtools.util.BPCollections;
006import org.biopax.paxtools.util.SetEquivalenceChecker;
007import org.hibernate.annotations.*;
008import org.hibernate.search.annotations.Indexed;
009
010import javax.persistence.Entity;
011import javax.persistence.JoinTable;
012import javax.persistence.ManyToMany;
013import javax.persistence.Transient;
014import java.util.Set;
015import javax.persistence.Entity;
016
017@Entity
018@Proxy(proxyClass= Complex.class)
019@Indexed
020@DynamicUpdate @DynamicInsert
021@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
022public class ComplexImpl extends PhysicalEntityImpl implements Complex
023{
024// ------------------------------ FIELDS ------------------------------
025
026        private Set<PhysicalEntity> component;
027        private Set<Stoichiometry> componentStoichiometry;
028
029// --------------------------- CONSTRUCTORS ---------------------------
030
031        public ComplexImpl()
032        {
033                this.component = BPCollections.I.createSafeSet();
034                this.componentStoichiometry = BPCollections.I.createSafeSet();
035        }
036
037// ------------------------ INTERFACE METHODS ------------------------
038
039
040// --------------------- Interface BioPAXElement ---------------------
041
042
043        @Transient
044        public Class<? extends Complex> getModelInterface()
045        {
046                return Complex.class;
047        }
048
049// --------------------- Interface Complex ---------------------
050
051// --------------------- ACCESORS and MUTATORS---------------------
052        
053        @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
054        @ManyToMany(targetEntity = PhysicalEntityImpl.class)
055        @JoinTable(name="component")
056        public Set<PhysicalEntity> getComponent()
057        {
058                return component;
059        }
060
061        public void addComponent(PhysicalEntity component)
062        {
063                if (component != null) {
064                        this.component.add(component);
065                        component.getComponentOf().add(this);
066                }
067        }
068
069        public void removeComponent(PhysicalEntity component)
070        {
071                if (component != null) {
072                        this.component.remove(component);
073                        component.getComponentOf().remove(this);
074                }
075        }
076
077        protected void setComponent(Set<PhysicalEntity> component)
078        {
079                this.component = component;
080        }
081
082    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
083        @ManyToMany(targetEntity = StoichiometryImpl.class)
084        @JoinTable(name="complexstoichiometry")         
085        public Set<Stoichiometry> getComponentStoichiometry()
086        {
087                return componentStoichiometry;
088        }
089
090        public void addComponentStoichiometry(
091                        Stoichiometry stoichiometry)
092        {
093                if(stoichiometry != null)
094                        this.componentStoichiometry.add(stoichiometry);
095        }
096
097        public void removeComponentStoichiometry(
098                        Stoichiometry stoichiometry)
099        {
100                if(stoichiometry != null)
101                        this.componentStoichiometry.remove(stoichiometry);
102        }
103
104        protected void setComponentStoichiometry(Set<Stoichiometry> stoichiometry)
105        {
106                this.componentStoichiometry = stoichiometry;
107        }
108
109        @Transient
110        public Set<SimplePhysicalEntity> getSimpleMembers()
111        {
112                return getSimpleMembers(BPCollections.I.<SimplePhysicalEntity>createSet());
113        }
114
115        @Transient
116        protected Set<SimplePhysicalEntity> getSimpleMembers(Set<SimplePhysicalEntity> set)
117        {
118                for (PhysicalEntity pe : this.getComponent())
119                {
120                        collectSimpleMembersRecursive(pe, set);
121                }
122                return set;
123        }
124
125        protected void collectSimpleMembersRecursive(PhysicalEntity pe, Set<SimplePhysicalEntity> set)
126        {
127                if (pe instanceof ComplexImpl && pe != this)
128                {
129                        ((ComplexImpl) pe).collectSimpleMembersRecursive(pe, set);
130                }
131                else if (pe instanceof SimplePhysicalEntity)
132                {
133                        set.add((SimplePhysicalEntity) pe);
134                }
135                for (PhysicalEntity mem : pe.getMemberPhysicalEntity())
136                {
137                        collectSimpleMembersRecursive(mem, set);
138                }
139        }
140
141        @Transient
142        public Set<EntityReference> getMemberReferences()
143        {
144                Set<EntityReference> set = BPCollections.I.createSet();
145
146                for (SimplePhysicalEntity spe : getSimpleMembers())
147                {
148                        EntityReference er = spe.getEntityReference();
149                        if(er!=null) set.add(er);
150                }
151                return set;
152        }
153
154        @Transient
155        public Class<? extends PhysicalEntity> getPhysicalEntityClass()
156        {
157                return Complex.class;
158        }
159
160        @Override
161        protected boolean semanticallyEquivalent(BioPAXElement element)
162        {
163                if (!(element instanceof Complex))
164                        return false;
165                
166                return SetEquivalenceChecker
167                                .isEquivalent(this.getComponent(), ((Complex) element).getComponent())
168                                && super.semanticallyEquivalent(element);
169        }
170}