refactored and fixed some issues concerning the import of Media for BerlinModel NameFacts
[cdmlib.git] / cdmlib-io / src / main / java / eu / etaxonomy / cdm / io / berlinModel / BerlinModelTaxonIO.java
1 /**
2 *
3 */
4 package eu.etaxonomy.cdm.io.berlinModel;
5
6 import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.T_STATUS_ACCEPTED;
7 import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.T_STATUS_SYNONYM;
8 import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.T_STATUS_PRO_PARTE_SYN;
9 import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.T_STATUS_PARTIAL_SYN;
10
11
12 import java.sql.ResultSet;
13 import java.sql.SQLException;
14 import java.util.Map;
15
16 import org.apache.log4j.Logger;
17
18 import eu.etaxonomy.cdm.api.application.CdmApplicationController;
19 import eu.etaxonomy.cdm.api.service.ITaxonService;
20 import eu.etaxonomy.cdm.io.common.ICdmIO;
21 import eu.etaxonomy.cdm.io.common.IImportConfigurator;
22 import eu.etaxonomy.cdm.io.common.ImportHelper;
23 import eu.etaxonomy.cdm.io.common.MapWrapper;
24 import eu.etaxonomy.cdm.io.common.Source;
25 import eu.etaxonomy.cdm.model.common.CdmBase;
26 import eu.etaxonomy.cdm.model.name.TaxonNameBase;
27 import eu.etaxonomy.cdm.model.reference.ReferenceBase;
28 import eu.etaxonomy.cdm.model.taxon.Synonym;
29 import eu.etaxonomy.cdm.model.taxon.Taxon;
30 import eu.etaxonomy.cdm.model.taxon.TaxonBase;
31
32
33 /**
34 * @author a.mueller
35 *
36 */
37 public class BerlinModelTaxonIO extends BerlinModelIOBase {
38 private static final Logger logger = Logger.getLogger(BerlinModelTaxonIO.class);
39
40 private int modCount = 30000;
41
42 public BerlinModelTaxonIO(){
43 super();
44 }
45
46 /* (non-Javadoc)
47 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IImportConfigurator)
48 */
49 @Override
50 protected boolean doCheck(IImportConfigurator config){
51 boolean result = true;
52 BerlinModelImportConfigurator bmiConfig = (BerlinModelImportConfigurator)config;
53 logger.warn("Checking for Taxa not yet fully implemented");
54 result &= checkTaxonStatus(bmiConfig);
55 //result &= checkArticlesWithoutJournal(bmiConfig);
56
57 return result;
58 }
59
60 private boolean checkTaxonStatus(BerlinModelImportConfigurator bmiConfig){
61 try {
62 boolean result = true;
63 Source source = bmiConfig.getSource();
64 String strSQL = " SELECT RelPTaxon.RelQualifierFk, RelPTaxon.relPTaxonId, PTaxon.PTNameFk, PTaxon.PTRefFk, PTaxon_1.PTNameFk AS Expr1, PTaxon.RIdentifier, PTaxon_1.RIdentifier AS Expr3, Name.FullNameCache " +
65 " FROM RelPTaxon " +
66 " INNER JOIN PTaxon ON RelPTaxon.PTNameFk1 = PTaxon.PTNameFk AND RelPTaxon.PTRefFk1 = PTaxon.PTRefFk " +
67 " INNER JOIN PTaxon AS PTaxon_1 ON RelPTaxon.PTNameFk2 = PTaxon_1.PTNameFk AND RelPTaxon.PTRefFk2 = PTaxon_1.PTRefFk " +
68 " INNER JOIN Name ON PTaxon.PTNameFk = Name.NameId " +
69 " WHERE (dbo.PTaxon.StatusFk = 1) AND ((RelPTaxon.RelQualifierFk = 7) OR (RelPTaxon.RelQualifierFk = 6) OR (RelPTaxon.RelQualifierFk = 2)) ";
70 ResultSet rs = source.getResultSet(strSQL);
71 boolean firstRow = true;
72 int i = 0;
73 while (rs.next()){
74 i++;
75 if (firstRow){
76 System.out.println("========================================================");
77 logger.warn("There are taxa that have a 'is synonym of' - relationship but having taxon status 'accepted'!");
78 System.out.println("========================================================");
79 }
80 int rIdentifier = rs.getInt("RIdentifier");
81 int nameFk = rs.getInt("PTNameFk");
82 int refFk = rs.getInt("PTRefFk");
83 int relPTaxonId = rs.getInt("relPTaxonId");
84 String taxonName = rs.getString("FullNameCache");
85
86 System.out.println("RIdentifier:" + rIdentifier + "\n name: " + nameFk +
87 "\n taxonName: " + taxonName + "\n refId: " + refFk + "\n RelPTaxonId: " + relPTaxonId );
88 result = firstRow = false;
89 }
90 if (i > 0){
91 System.out.println(" ");
92 }
93
94 return result;
95 } catch (SQLException e) {
96 e.printStackTrace();
97 return false;
98 }
99 }
100
101 /* (non-Javadoc)
102 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doInvoke(eu.etaxonomy.cdm.io.common.IImportConfigurator, eu.etaxonomy.cdm.api.application.CdmApplicationController, java.util.Map)
103 */
104 @Override
105 protected boolean doInvoke(IImportConfigurator config, CdmApplicationController cdmApp,
106 Map<String, MapWrapper<? extends CdmBase>> stores){
107
108 MapWrapper<TaxonNameBase> taxonNameMap = (MapWrapper<TaxonNameBase>)stores.get(ICdmIO.TAXONNAME_STORE);
109 MapWrapper<ReferenceBase> referenceMap = (MapWrapper<ReferenceBase>)stores.get(ICdmIO.REFERENCE_STORE);
110 MapWrapper<ReferenceBase> nomRefMap = (MapWrapper<ReferenceBase>)stores.get(ICdmIO.NOMREF_STORE);
111 MapWrapper<TaxonBase> taxonMap = (MapWrapper<TaxonBase>)stores.get(ICdmIO.TAXON_STORE);
112
113 BerlinModelImportConfigurator bmiConfig = (BerlinModelImportConfigurator)config;
114 Source source = bmiConfig.getSource();
115 String dbAttrName;
116 String cdmAttrName;
117
118 logger.info("start makeTaxa ...");
119
120 ITaxonService taxonService = cdmApp.getTaxonService();
121
122 try {
123 //get data from database
124 String strQuery =
125 " SELECT * " +
126 " FROM PTaxon " +
127 " WHERE (1=1)";
128
129 ResultSet rs = source.getResultSet(strQuery) ;
130
131 int i = 0;
132 //for each reference
133 while (rs.next()){
134
135 if ((i++ % modCount) == 0 && i!= 1 ){ logger.info("PTaxa handled: " + (i-1));}
136
137 //create TaxonName element
138 int taxonId = rs.getInt("RIdentifier");
139 int statusFk = rs.getInt("statusFk");
140
141 int nameFk = rs.getInt("PTNameFk");
142 int refFk = rs.getInt("PTRefFk");
143 String doubtful = rs.getString("DoubtfulFlag");
144
145 TaxonNameBase taxonName = null;
146 if (taxonNameMap != null){
147 taxonName = taxonNameMap.get(nameFk);
148 }
149
150 ReferenceBase reference = null;
151 if (referenceMap != null){
152 reference = referenceMap.get(refFk);
153 if (reference == null){
154 reference = nomRefMap.get(refFk);
155 }
156 }
157
158 if(! config.isIgnoreNull()){
159 if (taxonName == null ){
160 logger.warn("TaxonName belonging to taxon (RIdentifier = " + taxonId + ") could not be found in store. Taxon will not be transported");
161 continue; //next taxon
162 }else if (reference == null ){
163 logger.warn("Reference belonging to taxon could not be found in store. Taxon will not be imported");
164 continue; //next taxon
165 }
166 }
167 TaxonBase taxonBase;
168 Synonym synonym;
169 Taxon taxon;
170 try {
171 logger.debug(statusFk);
172 if (statusFk == T_STATUS_ACCEPTED){
173 taxon = Taxon.NewInstance(taxonName, reference);
174 taxonBase = taxon;
175 }else if (statusFk == T_STATUS_SYNONYM || statusFk == T_STATUS_PRO_PARTE_SYN || statusFk == T_STATUS_PARTIAL_SYN){
176 synonym = Synonym.NewInstance(taxonName, reference);
177 taxonBase = synonym;
178 if (statusFk == T_STATUS_PRO_PARTE_SYN){
179 bmiConfig.addProParteSynonym(synonym);
180 }
181 if (statusFk == T_STATUS_PARTIAL_SYN){
182 bmiConfig.addPartialSynonym(synonym);
183 }
184 }else{
185 logger.warn("TaxonStatus " + statusFk + " not yet implemented. Taxon (RIdentifier = " + taxonId + ") left out.");
186 continue;
187 }
188
189 //TODO
190 // dbAttrName = "Detail";
191 // cdmAttrName = "Micro";
192 // ImportHelper.addStringValue(rs, taxonBase, dbAttrName, cdmAttrName);
193
194 if (doubtful.equals("a")){
195 taxonBase.setDoubtful(false);
196 }else if(doubtful.equals("d")){
197 taxonBase.setDoubtful(true);
198 }else if(doubtful.equals("i")){
199 //TODO
200 logger.warn("Doubtful = i (inactivated) not yet implemented. Doubtful set to false");
201 }
202
203 //nameId
204 ImportHelper.setOriginalSource(taxonBase, bmiConfig.getSourceReference(), taxonId);
205
206
207 //TODO
208 //
209 //Created
210 //Note
211 //ALL
212
213 taxonMap.put(taxonId, taxonBase);
214 } catch (Exception e) {
215 logger.warn("An exception occurred when creating taxon with id " + taxonId + ". Taxon could not be saved.");
216 }
217 }
218 //invokeRelations(source, cdmApp, deleteAll, taxonMap, referenceMap);
219 logger.info("saving taxa ...");
220 taxonService.saveTaxonAll(taxonMap.objects());
221
222 logger.info("end makeTaxa ...");
223
224 return true;
225 } catch (SQLException e) {
226 logger.error("SQLException:" + e);
227 return false;
228 }
229
230 }
231
232 /* (non-Javadoc)
233 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
234 */
235 protected boolean isIgnore(IImportConfigurator config){
236 return ! config.isDoTaxa();
237 }
238
239 }