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}