Intensive model change for referenceBase and subclass, smaller model changes for...
[cdmlib.git] / cdmlib-io / src / main / java / eu / etaxonomy / cdm / io / faunaEuropaea / FaunaEuropaeaDistributionImport.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.faunaEuropaea;
11
12 import java.sql.ResultSet;
13 import java.sql.SQLException;
14 import java.util.HashMap;
15 import java.util.HashSet;
16 import java.util.List;
17 import java.util.Map;
18 import java.util.Set;
19 import java.util.UUID;
20
21 import org.apache.log4j.Logger;
22 import org.springframework.stereotype.Component;
23 import org.springframework.transaction.TransactionStatus;
24
25 import eu.etaxonomy.cdm.io.common.Source;
26 import eu.etaxonomy.cdm.model.description.Distribution;
27 import eu.etaxonomy.cdm.model.description.Feature;
28 import eu.etaxonomy.cdm.model.description.PresenceAbsenceTermBase;
29 import eu.etaxonomy.cdm.model.description.TaxonDescription;
30 import eu.etaxonomy.cdm.model.location.NamedArea;
31 import eu.etaxonomy.cdm.model.taxon.Taxon;
32 import eu.etaxonomy.cdm.model.taxon.TaxonBase;
33
34
35 /**
36 * @author a.babadshanjan
37 * @created 12.05.2009
38 * @version 1.0
39 */
40 @Component
41 public class FaunaEuropaeaDistributionImport extends FaunaEuropaeaImportBase {
42 private static final Logger logger = Logger.getLogger(FaunaEuropaeaDistributionImport.class);
43
44
45 /* (non-Javadoc)
46 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IImportConfigurator)
47 */
48 @Override
49 protected boolean doCheck(FaunaEuropaeaImportState state) {
50 boolean result = true;
51 FaunaEuropaeaImportConfigurator fauEuConfig = state.getConfig();
52 logger.warn("Checking for Distributions not yet fully implemented");
53 result &= checkReferenceStatus(fauEuConfig);
54
55 return result;
56 }
57
58 private boolean checkReferenceStatus(FaunaEuropaeaImportConfigurator fauEuConfig) {
59 boolean result = true;
60 // try {
61 Source source = fauEuConfig.getSource();
62 String sqlStr = "";
63 // ResultSet rs = source.getResultSet(sqlStr);
64 return result;
65 // } catch (SQLException e) {
66 // e.printStackTrace();
67 // return false;
68 // }
69 }
70
71 /* (non-Javadoc)
72 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doInvoke(eu.etaxonomy.cdm.io.common.IImportConfigurator, eu.etaxonomy.cdm.api.application.CdmApplicationController, java.util.Map)
73 */
74 @Override
75 protected boolean doInvoke(FaunaEuropaeaImportState state) {
76
77 int limit = state.getConfig().getLimitSave();
78
79 /* Taxon store for retrieving taxa from and saving taxa to CDM */
80 List<TaxonBase> taxonList = null;
81 /* UUID store as input for retrieving taxa from CDM */
82 Set<UUID> taxonUuids = null;
83 /* Store to hold helper objects */
84 Map<UUID, FaunaEuropaeaDistributionTaxon> fauEuTaxonMap = null;
85
86 // Map<UUID, TaxonBase<?>> taxonMap = null;
87 // Set<TaxonBase<?>> taxonSet = null;
88
89 TransactionStatus txStatus = null;
90
91 FaunaEuropaeaImportConfigurator fauEuConfig = state.getConfig();
92 Source source = fauEuConfig.getSource();
93
94 String namespace = "Distribution";
95 boolean success = true;
96
97
98 //make not needed maps empty
99 // Map<String, MapWrapper<? extends CdmBase>> stores = state.getStores();
100 // MapWrapper<TeamOrPersonBase<?>> authorStore = (MapWrapper<TeamOrPersonBase<?>>)stores.get(ICdmIO.TEAM_STORE);
101 // authorStore.makeEmpty();
102
103 if(logger.isInfoEnabled()) { logger.info("Start making distributions..."); }
104
105 try {
106 String strQuery =
107 " SELECT distribution.*, Area.*, Taxon.UUID " +
108 " FROM distribution INNER JOIN " +
109 " Area ON distribution.dis_ara_id = Area.ara_id INNER JOIN " +
110 " Taxon ON distribution.dis_tax_id = Taxon.TAX_ID ";
111
112 ResultSet rs = source.getResultSet(strQuery) ;
113
114 int i = 0;
115 while (rs.next()) {
116
117 if ((i++ % limit) == 0) {
118
119 txStatus = startTransaction();
120 taxonUuids = new HashSet<UUID>(limit);
121 fauEuTaxonMap = new HashMap<UUID, FaunaEuropaeaDistributionTaxon>(limit);
122 // taxonSet = new HashSet<TaxonBase<?>>(limit);
123
124 if(logger.isInfoEnabled()) {
125 logger.info("i = " + i + " - Distribution import transaction started");
126 }
127 }
128
129 int taxonId = rs.getInt("dis_tax_id");
130 int disId = rs.getInt("dis_id");
131 int occStatusId = rs.getInt("dis_present");
132 int areaId = rs.getInt("ara_id");
133 String areaName = rs.getString("ara_name");
134 String areaCode = rs.getString("ara_code");
135 int extraLimital = rs.getInt("ara_extralimital");
136 UUID currentTaxonUuid = null;
137 if (resultSetHasColumn(rs,"UUID")){
138 currentTaxonUuid = UUID.fromString(rs.getString("UUID"));
139 } else {
140 currentTaxonUuid = UUID.randomUUID();
141 }
142
143 FaunaEuropaeaDistribution fauEuDistribution = new FaunaEuropaeaDistribution();
144 // fauEuDistribution.setTaxonUuid(currentTaxonUuid);
145 // fauEuDistribution.setTaxonId(taxonId);
146 fauEuDistribution.setDistributionId(disId);
147 fauEuDistribution.setOccurrenceStatusId(occStatusId);
148 fauEuDistribution.setAreaId(areaId);
149 fauEuDistribution.setAreaName(areaName);
150 fauEuDistribution.setAreaCode(areaCode);
151 fauEuDistribution.setExtraLimital(extraLimital);
152
153 if (!taxonUuids.contains(currentTaxonUuid)) {
154 taxonUuids.add(currentTaxonUuid);
155 FaunaEuropaeaDistributionTaxon fauEuDistributionTaxon =
156 new FaunaEuropaeaDistributionTaxon(currentTaxonUuid);
157 fauEuTaxonMap.put(currentTaxonUuid, fauEuDistributionTaxon);
158 } else {
159 if (logger.isTraceEnabled()) {
160 logger.trace("Taxon (" + currentTaxonUuid + ") already stored.");
161 continue;
162 }
163 }
164
165 fauEuTaxonMap.get(currentTaxonUuid).addDistribution(fauEuDistribution);
166
167 if ((i % limit) == 0 && i != 1 ) {
168
169 try {
170
171 taxonList = getTaxonService().findByUuid(taxonUuids);
172
173 for (TaxonBase taxonBase : taxonList) {
174
175 if (taxonBase != null) {
176 Taxon taxon;
177 if (taxonBase instanceof Taxon) {
178 taxon = taxonBase.deproxy(taxonBase, Taxon.class);
179 } else {
180 logger.warn("TaxonBase (" + taxonId + " is not of type Taxon but: "
181 + taxonBase.getClass().getSimpleName());
182 continue;
183 }
184
185 TaxonDescription taxonDescription;
186 Set<TaxonDescription> descriptionSet = taxon.getDescriptions();
187 if (descriptionSet.size() > 0) {
188 taxonDescription = descriptionSet.iterator().next();
189 } else {
190 taxonDescription = TaxonDescription.NewInstance();
191 taxon.addDescription(taxonDescription);
192 }
193
194 UUID taxonUuid = taxonBase.getUuid();
195 FaunaEuropaeaDistributionTaxon fauEuHelperTaxon = fauEuTaxonMap.get(taxonUuid);
196
197 for (FaunaEuropaeaDistribution fauEuHelperDistribution : fauEuHelperTaxon.getDistributions()) {
198
199 PresenceAbsenceTermBase<?> presenceAbsenceStatus
200 = FaunaEuropaeaTransformer.occStatus2PresenceAbsence(fauEuHelperDistribution.getOccurrenceStatusId());
201 NamedArea namedArea =
202 FaunaEuropaeaTransformer.areaId2TdwgArea(fauEuHelperDistribution);
203
204 Distribution newDistribution = Distribution.NewInstance(namedArea, presenceAbsenceStatus);
205 newDistribution.setType(Feature.DISTRIBUTION());
206 taxonDescription.addElement(newDistribution);
207 }
208 }
209 }
210 if(logger.isInfoEnabled()) { logger.info("Saving taxa..."); }
211
212 getTaxonService().saveTaxonAll(taxonList);
213
214 taxonUuids = null;
215 taxonList = null;
216 fauEuTaxonMap = null;
217 commitTransaction(txStatus);
218
219 } catch (Exception e) {
220 logger.warn("An exception occurred when creating distribution with id " + disId);
221 e.printStackTrace();
222 }
223 }
224 }
225 } catch (SQLException e) {
226 logger.error("SQLException:" + e);
227 return false;
228 }
229 if(logger.isInfoEnabled()) { logger.info("End making distributions..."); }
230
231 return true;
232 }
233
234
235 /* (non-Javadoc)
236 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
237 */
238 protected boolean isIgnore(FaunaEuropaeaImportState state){
239 return !state.getConfig().isDoOccurrence();
240 }
241 }