2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
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.
10 package eu
.etaxonomy
.cdm
.io
.dwca
.out
;
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
;
19 import org
.apache
.log4j
.Logger
;
20 import org
.springframework
.stereotype
.Component
;
21 import org
.springframework
.transaction
.TransactionStatus
;
23 import eu
.etaxonomy
.cdm
.api
.facade
.DerivedUnitFacade
;
24 import eu
.etaxonomy
.cdm
.api
.facade
.DerivedUnitFacadeNotSupportedException
;
25 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
26 import eu
.etaxonomy
.cdm
.model
.description
.DescriptionElementBase
;
27 import eu
.etaxonomy
.cdm
.model
.description
.IndividualsAssociation
;
28 import eu
.etaxonomy
.cdm
.model
.description
.TaxonDescription
;
29 import eu
.etaxonomy
.cdm
.model
.name
.NonViralName
;
30 import eu
.etaxonomy
.cdm
.model
.name
.SpecimenTypeDesignation
;
31 import eu
.etaxonomy
.cdm
.model
.name
.TaxonNameBase
;
32 import eu
.etaxonomy
.cdm
.model
.name
.TypeDesignationBase
;
33 import eu
.etaxonomy
.cdm
.model
.name
.TypeDesignationStatusBase
;
34 import eu
.etaxonomy
.cdm
.model
.occurrence
.Collection
;
35 import eu
.etaxonomy
.cdm
.model
.occurrence
.DerivedUnitBase
;
36 import eu
.etaxonomy
.cdm
.model
.occurrence
.DeterminationEvent
;
37 import eu
.etaxonomy
.cdm
.model
.occurrence
.SpecimenOrObservationBase
;
38 import eu
.etaxonomy
.cdm
.model
.taxon
.Synonym
;
39 import eu
.etaxonomy
.cdm
.model
.taxon
.Taxon
;
40 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonBase
;
41 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonNode
;
48 public class DwcaTypesExport
extends DwcaExportBase
{
49 private static final Logger logger
= Logger
.getLogger(DwcaTypesExport
.class);
51 private static final String ROW_TYPE
= "http://rs.gbif.org/terms/1.0/TypesAndSpecimen";
52 private static final String fileName
= "typesAndSpecimen.txt";
57 public DwcaTypesExport() {
59 this.ioName
= this.getClass().getSimpleName();
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.
71 protected boolean doInvoke(DwcaTaxExportState state
){
72 DwcaTaxExportConfigurator config
= state
.getConfig();
73 TransactionStatus txStatus
= startTransaction(true);
75 PrintWriter writer
= null;
78 writer
= createPrintWriter(fileName
, state
);
79 DwcaMetaDataRecord metaRecord
= new DwcaMetaDataRecord(! IS_CORE
, fileName
, ROW_TYPE
);
80 state
.addMetaRecord(metaRecord
);
83 List
<TaxonNode
> allNodes
= getAllNodes(null);
85 for (TaxonNode node
: allNodes
){
86 Taxon taxon
= CdmBase
.deproxy(node
.getTaxon(), Taxon
.class);
88 //TODO use API methods to retrieve all related specimen
90 //individual associations
91 Set
<TaxonDescription
> descriptions
= taxon
.getDescriptions();
92 for (TaxonDescription description
: descriptions
){
93 for (DescriptionElementBase el
: description
.getElements()){
94 if (el
.isInstanceOf(IndividualsAssociation
.class)){
95 DwcaTypesRecord record
= new DwcaTypesRecord(metaRecord
, config
);
96 IndividualsAssociation individualAssociation
= CdmBase
.deproxy(el
,IndividualsAssociation
.class);
97 if (! this.recordExistsUuid(individualAssociation
) && handleSpecimen(record
, individualAssociation
, null, taxon
, config
)){
99 this.addExistingRecordUuid(individualAssociation
);
106 NonViralName
<?
> nvn
= CdmBase
.deproxy(taxon
.getName(), NonViralName
.class);
107 handleTypeName(writer
, taxon
, nvn
, metaRecord
, config
);
108 for (Synonym synonym
: taxon
.getSynonyms()){
109 handleTypeName(writer
, synonym
, nvn
, metaRecord
, config
);
119 } catch (FileNotFoundException e
) {
121 } catch (UnsupportedEncodingException e
) {
123 } catch (ClassCastException e
) {
125 } catch (IOException e
) {
128 closeWriter(writer
, state
);
130 commitTransaction(txStatus
);
141 private Set
<TypeDesignationBase
<?
>> handleTypeName(PrintWriter writer
, TaxonBase
<?
> taxonBase
, NonViralName
<?
> nvn
, DwcaMetaDataRecord metaRecord
, DwcaTaxExportConfigurator config
) {
142 Set
<TypeDesignationBase
<?
>> designations
= nvn
.getTypeDesignations();
143 for (TypeDesignationBase
<?
> designation
:designations
){
144 DwcaTypesRecord record
= new DwcaTypesRecord(metaRecord
, config
);
145 if (! this.recordExistsUuid(designation
) && handleSpecimen(record
, null, designation
, taxonBase
, config
)){
146 record
.write(writer
);
147 addExistingRecordUuid(designation
);
154 private boolean handleSpecimen(DwcaTypesRecord record
, IndividualsAssociation individualsAssociation
, TypeDesignationBase
<?
> designation
, TaxonBase
<?
> taxonBase
, DwcaTaxExportConfigurator config
) {
155 TypeDesignationStatusBase
<?
> status
= null;
156 DerivedUnitFacade facade
= null;
157 if (individualsAssociation
!= null){
158 facade
= getFacadeFromAssociation(individualsAssociation
);
159 }else if (designation
!= null){
160 facade
= getFacadeFromDesignation(designation
);
161 status
= designation
.getTypeStatus();
167 record
.setId(taxonBase
.getId());
168 record
.setUuid(taxonBase
.getUuid());
169 record
.setBibliographicCitation(facade
.getTitleCache());
170 record
.setTypeStatus(status
);
171 record
.setTypeDesignatedBy( (designation
== null || designation
.getCitation()==null)?
null: designation
.getCitation().getTitleCache());
173 TaxonNameBase
<?
,?
> scientificName
= getScientificName(facade
);
174 if (scientificName
!= null){
175 record
.setScientificName(scientificName
.getTitleCache());
176 record
.setTaxonRank(scientificName
.getRank());
179 record
.setOccurrenceId(facade
.innerDerivedUnit());
180 Collection collection
= facade
.getCollection();
181 if (collection
!= null){
182 record
.setCollectionCode(collection
.getCode());
183 if (collection
.getInstitute() != null){
184 record
.setInstitutionCode(collection
.getInstitute().getCode());
187 record
.setCatalogNumber(facade
.getCatalogNumber());
188 record
.setLocality(facade
.getLocalityText());
189 record
.setSex(facade
.getSex());
190 record
.setRecordedBy(facade
.getCollector());
192 record
.setSource(getSources(facade
.innerDerivedUnit(), config
));
193 record
.setEventDate(facade
.getGatheringPeriod());
195 record
.setVerbatimLabel(null);
196 if (facade
.getExactLocation() != null){
197 if (facade
.getExactLocation().getLongitude() != null){
198 record
.setVerbatimLongitude(facade
.getExactLocation().getLongitudeSexagesimal().toString());
200 if (facade
.getExactLocation().getLatitude() != null){
201 record
.setVerbatimLatitude(facade
.getExactLocation().getLatitudeSexagesimal().toString());
207 private TaxonNameBase
<?
,?
> getScientificName(DerivedUnitFacade facade
) {
208 Set
<DeterminationEvent
> detEvents
= facade
.getDeterminations();
209 for (DeterminationEvent detEvent
: detEvents
){
210 if (detEvent
.getPreferredFlag()== true){
211 return detEvent
.getTaxon().getName();
217 private DerivedUnitFacade
getFacadeFromDesignation(TypeDesignationBase
<?
> designation
) {
218 if (designation
.isInstanceOf(SpecimenTypeDesignation
.class)){
219 SpecimenTypeDesignation specDesig
= CdmBase
.deproxy(designation
, SpecimenTypeDesignation
.class);
221 DerivedUnitBase
<?
> derivedUnit
= specDesig
.getTypeSpecimen();
222 if (derivedUnit
== null){
225 DerivedUnitFacade facade
= DerivedUnitFacade
.NewInstance(derivedUnit
);
228 } catch (DerivedUnitFacadeNotSupportedException e
) {
229 String message
= "DerivedUnit is too complex to be handled by facade based darwin core archive export";
230 logger
.warn(message
);
231 //TODO handle empty records
239 private DerivedUnitFacade
getFacadeFromAssociation(IndividualsAssociation individualsAssociation
) {
240 SpecimenOrObservationBase
<?
> specimen
= individualsAssociation
.getAssociatedSpecimenOrObservation();
241 DerivedUnitFacade facade
;
242 if (! specimen
.isInstanceOf(DerivedUnitBase
.class)){
243 String message
= "Non DerivedUnit specimen can not yet be handled by this export";
244 logger
.warn(message
);
245 //TODO handle empty records
248 DerivedUnitBase
<?
> derivedUnit
= CdmBase
.deproxy(specimen
, DerivedUnitBase
.class);
250 facade
= DerivedUnitFacade
.NewInstance(derivedUnit
);
251 } catch (DerivedUnitFacadeNotSupportedException e
) {
252 String message
= "DerivedUnit is too complex to be handled by facade based darwin core archive export";
253 logger
.warn(message
);
254 //TODO handle empty records
263 protected boolean doCheck(DwcaTaxExportState state
) {
264 boolean result
= true;
265 logger
.warn("No check implemented for " + this.ioName
);
271 protected boolean isIgnore(DwcaTaxExportState state
) {
272 return ! state
.getConfig().isDoTypesAndSpecimen();