9a594758aa6f8ac4008f5f8e6f7b5c7a8fdaa06a
[cdmlib.git] / cdmlib-model / src / main / java / eu / etaxonomy / cdm / model / common / RelationshipTermBase.java
1 package eu.etaxonomy.cdm.model.common;
2
3 import java.util.HashSet;
4 import java.util.List;
5 import java.util.Set;
6
7 import javax.persistence.JoinTable;
8 import javax.persistence.MappedSuperclass;
9 import javax.persistence.OneToMany;
10 import javax.persistence.Transient;
11 import javax.xml.bind.annotation.XmlRootElement;
12
13 import org.apache.log4j.Logger;
14 import org.hibernate.annotations.Cascade;
15 import org.hibernate.annotations.CascadeType;
16
17 import au.com.bytecode.opencsv.CSVWriter;
18
19 @XmlRootElement(name = "RelationshipTermBase")
20 @MappedSuperclass
21 public abstract class RelationshipTermBase<T extends RelationshipTermBase> extends OrderedTermBase<T> {
22 static Logger logger = Logger.getLogger(RelationshipTermBase.class);
23
24 private boolean symmetric;
25 private boolean transitive;
26 private Set<Representation> inverseRepresentations = new HashSet();
27
28 public RelationshipTermBase() {
29 super();
30 }
31 public RelationshipTermBase(String term, String label, String labelAbbrev, boolean symmetric, boolean transitive) {
32 super(term, label, labelAbbrev);
33 setSymmetric(symmetric);
34 setTransitive(transitive);
35 }
36
37
38 public boolean isSymmetric() {
39 return symmetric;
40 }
41 public void setSymmetric(boolean symmetric) {
42 this.symmetric = symmetric;
43 }
44
45 public boolean isTransitive() {
46 return transitive;
47 }
48 public void setTransitive(boolean transitive) {
49 this.transitive = transitive;
50 }
51
52
53 @OneToMany
54 @JoinTable(name="RelationshipTermBase_inverseRepresentation")
55 @Cascade({CascadeType.SAVE_UPDATE, CascadeType.DELETE})
56 public Set<Representation> getInverseRepresentations() {
57 return inverseRepresentations;
58 }
59 protected void setInverseRepresentations(
60 Set<Representation> inverseRepresentations) {
61 this.inverseRepresentations = inverseRepresentations;
62 }
63 public void addInverseRepresentation(Representation inverseRepresentation) {
64 this.inverseRepresentations.add(inverseRepresentation);
65 }
66 public void removeInverseRepresentation(Representation inverseRepresentation) {
67 this.inverseRepresentations.remove(inverseRepresentation);
68 }
69 public void addRepresentation(Representation representation, Representation inverseRepresentation) {
70 this.addRepresentation(representation);
71 this.addInverseRepresentation(inverseRepresentation);
72 }
73
74 @Transient
75 public Representation getInverseRepresentation(Language lang) {
76 Representation result = null;
77 if (this.isSymmetric()){
78 for (Representation repr : this.getRepresentations()){
79 if (repr.getLanguage() == lang){
80 result = repr;
81 }
82 }
83 }else{
84 for (Representation repr : this.getInverseRepresentations()){
85 if (repr.getLanguage() == lang){
86 result = repr;
87 }
88 }
89 }
90 return result;
91 }
92
93 /*
94 * Inverse representation convenience methods similar to TermBase.xxx
95 * @see eu.etaxonomy.cdm.model.common.TermBase#getLabel()
96 */
97 @Transient
98 public String getInverseLabel() {
99 if(getInverseLabel(Language.DEFAULT())!=null){
100 return this.getInverseRepresentation(Language.DEFAULT()).getLabel();
101 }else{
102 for (Representation r : inverseRepresentations){
103 return r.getLabel();
104 }
105 }
106 return super.getUuid().toString();
107 }
108
109 @Transient
110 public String getInverseLabel(Language lang) {
111 Representation r = this.getInverseRepresentation(lang);
112 if(r==null){
113 return null;
114 }else{
115 return r.getLabel();
116 }
117 }
118
119 @Transient
120 public String getInverseDescription() {
121 return this.getInverseRepresentation(Language.DEFAULT()).getDescription();
122 }
123
124 @Transient
125 public String getInverseDescription(Language lang) {
126 return this.getInverseRepresentation(lang).getDescription();
127 }
128
129 public ILoadableTerm readCsvLine(List csvLine) {
130 RelationshipTermBase result;
131 // read UUID, URI, english label+description
132 List<String> csvLineString = (List<String>)csvLine;
133 result = (RelationshipTermBase)super.readCsvLine(csvLineString);
134 // inverse label + 2 booleans
135 String inverseText = csvLineString.get(5).trim();
136 String inverseLabel = csvLineString.get(4).trim();
137 String inverseLabelAbbrev = null;
138 result.addInverseRepresentation(new Representation(inverseText, inverseLabel, inverseLabelAbbrev, Language.ENGLISH()) );
139 result.setSymmetric(Boolean.parseBoolean(csvLineString.get(6)));
140 result.setTransitive(Boolean.parseBoolean(csvLineString.get(7)));
141 return result;
142 }
143
144 public void writeCsvLine(CSVWriter writer) {
145 String [] line = new String[8];
146 line[0] = getUuid().toString();
147 line[1] = getUri();
148 line[2] = getLabel();
149 line[3] = getDescription();
150 line[4] = getInverseLabel();
151 line[5] = getInverseDescription();
152 line[6] = String.valueOf(this.isSymmetric());
153 line[7] = String.valueOf(this.isTransitive());
154 writer.writeNext(line);
155 }
156
157 }