ref #6369 adapt existing occurrences of interface to removed generics
[cdmlib.git] / cdmlib-io / src / main / java / eu / etaxonomy / cdm / io / dwca / out / DwcaResourceRelationExport.java
1 /**
2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
5 *
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
8 */
9
10 package eu.etaxonomy.cdm.io.dwca.out;
11
12 import java.io.FileNotFoundException;
13 import java.io.IOException;
14 import java.io.PrintWriter;
15 import java.io.UnsupportedEncodingException;
16 import java.util.List;
17 import java.util.Map;
18 import java.util.Set;
19
20 import org.apache.log4j.Logger;
21 import org.springframework.stereotype.Component;
22 import org.springframework.transaction.TransactionStatus;
23
24 import eu.etaxonomy.cdm.model.common.CdmBase;
25 import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
26 import eu.etaxonomy.cdm.model.common.Language;
27 import eu.etaxonomy.cdm.model.common.LanguageString;
28 import eu.etaxonomy.cdm.model.common.RelationshipBase;
29 import eu.etaxonomy.cdm.model.common.RelationshipTermBase;
30 import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
31 import eu.etaxonomy.cdm.model.description.TaxonDescription;
32 import eu.etaxonomy.cdm.model.description.TaxonInteraction;
33 import eu.etaxonomy.cdm.model.name.INonViralName;
34 import eu.etaxonomy.cdm.model.name.NameRelationship;
35 import eu.etaxonomy.cdm.model.name.TaxonNameBase;
36 import eu.etaxonomy.cdm.model.taxon.Taxon;
37 import eu.etaxonomy.cdm.model.taxon.TaxonBase;
38 import eu.etaxonomy.cdm.model.taxon.TaxonNode;
39 import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;
40 import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;
41
42 /**
43 * Mapps taxon concept relationships, taxon name relationships and taxon interactions
44 * @author a.mueller
45 * @created 20.04.2011
46 */
47 @Component
48 public class DwcaResourceRelationExport extends DwcaExportBase {
49 private static final Logger logger = Logger.getLogger(DwcaResourceRelationExport.class);
50
51 private static final String ROW_TYPE = "http://rs.tdwg.org/dwc/terms/ResourceRelationship";
52 private static final String fileName = "resourceRelationship.txt";
53
54 /**
55 * Constructor
56 */
57 public DwcaResourceRelationExport() {
58 super();
59 this.ioName = this.getClass().getSimpleName();
60 }
61
62 /** Retrieves data from a CDM DB and serializes them CDM to XML.
63 * Starts with root taxa and traverses the classification to retrieve children taxa, synonyms and relationships.
64 * Taxa that are not part of the classification are not found.
65 *
66 * @param exImpConfig
67 * @param dbname
68 * @param filename
69 */
70 @Override
71 protected void doInvoke(DwcaTaxExportState state){
72 DwcaTaxExportConfigurator config = state.getConfig();
73 TransactionStatus txStatus = startTransaction(true);
74
75 PrintWriter writer = null;
76 try {
77
78 writer = createPrintWriter(fileName, state);
79
80 DwcaMetaDataRecord metaRecord = new DwcaMetaDataRecord(! IS_CORE, fileName, ROW_TYPE);
81 state.addMetaRecord(metaRecord);
82
83 List<TaxonNode> allNodes = getAllNodes(null);
84
85 for (TaxonNode node : allNodes){
86 Taxon taxon = CdmBase.deproxy(node.getTaxon(), Taxon.class);
87
88 //taxon interactions
89 Set<TaxonDescription> descriptions = taxon.getDescriptions();
90 for (TaxonDescription description : descriptions){
91 for (DescriptionElementBase el : description.getElements()){
92 if (el.isInstanceOf(TaxonInteraction.class)){
93 DwcaResourceRelationRecord record = new DwcaResourceRelationRecord(metaRecord, config);
94 TaxonInteraction taxonInteraction = CdmBase.deproxy(el,TaxonInteraction.class);
95 if (! this.recordExistsUuid(taxonInteraction)){
96 handleInteraction(record, taxon, taxonInteraction);
97 record.write(writer);
98 this.addExistingRecordUuid(taxonInteraction);
99 }
100 }
101 }
102 }
103
104 //concept relationships
105 for (TaxonRelationship rel : taxon.getTaxonRelations()){
106 DwcaResourceRelationRecord record = new DwcaResourceRelationRecord(metaRecord, config);
107 IdentifiableEntity<?> subject = rel.getFromTaxon();
108 IdentifiableEntity<?> object = rel.getToTaxon();
109
110 if (rel.getType().equals(TaxonRelationshipType.MISAPPLIED_NAME_FOR()) ){
111 //misapplied names are handled in core (tax)
112 continue;
113 }
114 if (! this.recordExistsUuid(rel)){
115 handleRelationship(record, subject, object, rel, false);
116 record.write(writer);
117 this.addExistingRecordUuid(rel);
118 }
119
120 }
121
122 //Name relationship
123 //TODO
124 INonViralName name = taxon.getName();
125 if (name == null){
126 String message = "There is a taxon node without taxon: " + node.getId();
127 logger.warn(message);
128 continue;
129 }
130 Set<NameRelationship> rels = name.getNameRelations();
131 for (NameRelationship rel : rels){
132 DwcaResourceRelationRecord record = new DwcaResourceRelationRecord(metaRecord, config);
133 IdentifiableEntity<?> subject = CdmBase.deproxy(rel.getFromName(), TaxonNameBase.class);
134 IdentifiableEntity<?> object = CdmBase.deproxy(rel.getToName(), TaxonNameBase.class);
135 boolean isInverse = false;
136 if(subject == name){
137 subject = taxon;
138 }else if(object == name){
139 object= subject;
140 subject = taxon;
141 isInverse = true;
142 }else{
143 String message = "Both, subject and object, are not part of the relationship for " + name.getTitleCache();
144 logger.warn(message);
145 }
146
147 if (! this.recordExistsUuid(rel)){
148 //????
149 handleRelationship(record, subject, object, rel, isInverse);
150 record.write(writer);
151 this.addExistingRecordUuid(rel);
152 }
153
154 }
155
156
157 writer.flush();
158
159 }
160 } catch (FileNotFoundException e) {
161 e.printStackTrace();
162 } catch (UnsupportedEncodingException e) {
163 e.printStackTrace();
164 } catch (ClassCastException e) {
165 e.printStackTrace();
166 } catch (IOException e) {
167 e.printStackTrace();
168 } finally{
169 closeWriter(writer, state);
170 }
171 commitTransaction(txStatus);
172 return;
173 }
174
175 private void handleRelationship(DwcaResourceRelationRecord record, IdentifiableEntity<?> subject, IdentifiableEntity<?> object,
176 RelationshipBase<?,?,?> rel, boolean isInverse) {
177 RelationshipTermBase<?> type = rel.getType();
178
179 record.setId(subject.getId());
180 record.setUuid(subject.getUuid());
181
182
183 record.setResourceRelationshipId(rel.getId());
184 record.setResourceRelationshipId(rel.getUuid());
185 //TODO id / uuid / names ??
186 if (object.isInstanceOf(TaxonBase.class)){
187 record.setRelatedResourceId(object.getUuid());
188 }
189 //TODO transform to controlled voc
190 String relTypeLabel;
191 if (isInverse){
192 relTypeLabel = type.getInverseLabel();
193 }else{
194 relTypeLabel = type.getLabel();
195 }
196 record.setRelationshipOfResource(relTypeLabel);
197 record.setRelationshipAccordingTo(rel.getCitation()== null? null : rel.getCitation().getTitleCache());
198 //TODO missing
199 record.setRelatioshipEstablishedDate(null);
200 record.setRelationshipRemarks(rel.getAnnotations());
201 if (object.isInstanceOf(TaxonNameBase.class)){
202 record.setScientificName(object.getTitleCache());
203 }
204
205
206 }
207
208 private void handleInteraction(DwcaResourceRelationRecord record, IdentifiableEntity<?> subject, TaxonInteraction interaction) {
209 Taxon object = interaction.getTaxon2();
210 Map<Language, LanguageString> description = interaction.getDescription();
211
212 record.setId(subject.getId());
213 record.setUuid(subject.getUuid());
214
215 record.setRelatedResourceId(object.getUuid());
216 //TODO transform to controlled voc
217 if (description != null && description.get(Language.DEFAULT()) != null){
218 record.setRelationshipOfResource(description.get(Language.DEFAULT()).getText());
219 }else{
220 record.setRelationshipOfResource(interaction.getFeature().getLabel());
221 }
222 //TODO uuid
223 record.setResourceRelationshipId(interaction.getId());
224 record.setResourceRelationshipId(interaction.getUuid());
225
226 //FIXME multiple sources
227 record.setRelationshipAccordingTo(null);
228 //TODO missing
229 record.setRelatioshipEstablishedDate(null);
230 record.setRelationshipRemarks(interaction.getAnnotations());
231 //TODO does this need to be filled?
232 record.setScientificName(null);
233
234 }
235
236
237 @Override
238 protected boolean doCheck(DwcaTaxExportState state) {
239 boolean result = true;
240 logger.warn("No check implemented for " + this.ioName);
241 return result;
242 }
243
244
245 @Override
246 protected boolean isIgnore(DwcaTaxExportState state) {
247 return ! state.getConfig().isDoResourceRelation();
248 }
249
250 }