1
2
3
4
5
6
7
8
9 package eu.etaxonomy.cdm.io.berlinModel.out;
10
11 import java.sql.ResultSet;
12 import java.sql.SQLException;
13 import java.util.HashMap;
14 import java.util.List;
15 import java.util.Map;
16
17 import org.apache.log4j.Logger;
18 import org.springframework.stereotype.Component;
19 import org.springframework.transaction.TransactionStatus;
20
21 import eu.etaxonomy.cdm.common.CdmUtils;
22 import eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer;
23 import eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelFactsImport;
24 import eu.etaxonomy.cdm.io.berlinModel.out.mapper.CreatedAndNotesMapper;
25 import eu.etaxonomy.cdm.io.berlinModel.out.mapper.DbIntegerAnnotationMapper;
26 import eu.etaxonomy.cdm.io.berlinModel.out.mapper.DbMarkerMapper;
27 import eu.etaxonomy.cdm.io.berlinModel.out.mapper.DbObjectMapper;
28 import eu.etaxonomy.cdm.io.berlinModel.out.mapper.IdMapper;
29 import eu.etaxonomy.cdm.io.berlinModel.out.mapper.MethodMapper;
30 import eu.etaxonomy.cdm.io.berlinModel.out.mapper.RefDetailMapper;
31 import eu.etaxonomy.cdm.io.common.DbExportStateBase;
32 import eu.etaxonomy.cdm.io.common.Source;
33 import eu.etaxonomy.cdm.model.common.CdmBase;
34 import eu.etaxonomy.cdm.model.common.Language;
35 import eu.etaxonomy.cdm.model.common.LanguageString;
36 import eu.etaxonomy.cdm.model.common.MarkerType;
37 import eu.etaxonomy.cdm.model.description.DescriptionBase;
38 import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
39 import eu.etaxonomy.cdm.model.description.Feature;
40 import eu.etaxonomy.cdm.model.description.TaxonDescription;
41 import eu.etaxonomy.cdm.model.description.TextData;
42 import eu.etaxonomy.cdm.model.taxon.Taxon;
43
44
45
46
47
48
49
50 @Component
51 public class BerlinModelFactExport extends BerlinModelExportBase<TextData> {
52 private static final Logger logger = Logger.getLogger(BerlinModelFactExport.class);
53
54 private static int modCount = 2500;
55 private static final String dbTableName = "Fact";
56 private static final String pluralString = "Facts";
57 private static final Class<? extends CdmBase> standardMethodParameter = TextData.class;
58 @Deprecated
59 private static Source source;
60
61 public BerlinModelFactExport(){
62 super();
63 }
64
65
66
67
68 @Override
69 protected boolean doCheck(BerlinModelExportState state){
70 boolean result = true;
71 logger.warn("Checking for " + pluralString + " not yet implemented");
72
73
74
75 return result;
76 }
77
78 private BerlinModelExportMapping getMapping(){
79 String tableName = dbTableName;
80 BerlinModelExportMapping mapping = new BerlinModelExportMapping(tableName);
81 mapping.addMapper(IdMapper.NewInstance("FactId"));
82 mapping.addMapper(MethodMapper.NewInstance("PTNameFk", this.getClass(), "getPTNameFk", TextData.class, DbExportStateBase.class));
83 mapping.addMapper(MethodMapper.NewInstance("PTRefFk", this.getClass(), "getPTRefFk", TextData.class, DbExportStateBase.class));
84 mapping.addMapper(MethodMapper.NewInstance("Fact", this));
85 mapping.addMapper(MethodMapper.NewInstance("FactCategoryFk", this));
86
87 mapping.addMapper(DbObjectMapper.NewInstance("citation", "FactRefFk"));
88 mapping.addMapper(RefDetailMapper.NewInstance("citationMicroReference","citation", "FactRefDetailFk"));
89 mapping.addMapper(DbObjectMapper.NewInstance("citation", "PTDesignationRefFk"));
90 mapping.addMapper(RefDetailMapper.NewInstance("citationMicroReference","citation", "PTDesignationRefDetailFk"));
91 mapping.addMapper(DbMarkerMapper.NewInstance(MarkerType.IS_DOUBTFUL(), "DoubtfulFlag", false));
92 mapping.addMapper(DbMarkerMapper.NewInstance(MarkerType.IS_DOUBTFUL(), "PublishFlag", true));
93 mapping.addMapper(DbIntegerAnnotationMapper.NewInstance(BerlinModelFactsImport.SEQUENCE_PREFIX, "Sequence", 999));
94 mapping.addMapper(CreatedAndNotesMapper.NewInstance());
95
96
97
98 return mapping;
99 }
100
101 protected boolean doInvoke(BerlinModelExportState state){
102 try{
103 logger.info("start make " + pluralString + " ...");
104 boolean success = true ;
105 doDelete(state);
106
107 TransactionStatus txStatus = startTransaction(true);
108
109 List<DescriptionBase> list = getDescriptionService().list(null,1000000000, 0,null,null);
110
111 BerlinModelExportMapping mapping = getMapping();
112 mapping.initialize(state);
113
114 this.source = state.getConfig().getDestination();
115 int count = 0;
116 for (DescriptionBase<?> desc : list){
117 for (DescriptionElementBase descEl : desc.getElements()){
118 doCount(count++, modCount, pluralString);
119 if (descEl.isInstanceOf(TextData.class)){
120 success &= mapping.invoke(descEl);
121 }else{
122 logger.warn (descEl.getClass().getSimpleName() + " not yet supported for Fact Export.");
123 }
124 }
125 }
126 commitTransaction(txStatus);
127 logger.info("end make " + pluralString + " ..." + getSuccessString(success));
128
129 return success;
130 }catch(SQLException e){
131 e.printStackTrace();
132 logger.error(e.getMessage());
133 return false;
134 }
135 }
136
137
138
139
140 protected boolean doDelete(BerlinModelExportState state){
141 BerlinModelExportConfigurator bmeConfig = state.getConfig();
142
143 String sql;
144 Source destination = bmeConfig.getDestination();
145
146 sql = "DELETE FROM Fact";
147 destination.setQuery(sql);
148 destination.update(sql);
149
150 return true;
151 }
152
153
154
155
156
157 protected boolean isIgnore(BerlinModelExportState state){
158 return ! state.getConfig().isDoFacts();
159 }
160
161
162 @SuppressWarnings("unused")
163 private static Integer getFactCategoryFk(TextData textData){
164 Feature feature = textData.getFeature();
165 Integer catFk = BerlinModelTransformer.textData2FactCategoryFk(feature);
166
167 if (catFk == null){
168 catFk = findCategory(feature);
169 }
170 if (catFk == null){
171
172 }
173 return catFk;
174 }
175
176
177
178 @SuppressWarnings("unused")
179 private static Integer getPTNameFk(TextData textData, DbExportStateBase<?> state){
180 return getObjectFk(textData, state, true);
181 }
182
183
184 @SuppressWarnings("unused")
185 private static Integer getPTRefFk(TextData textData, DbExportStateBase<?> state){
186 return getObjectFk(textData, state, false);
187 }
188
189 private static Integer getObjectFk(TextData textData, DbExportStateBase<?> state, boolean isName){
190 DescriptionBase<?> desc = textData.getInDescription();
191 if (desc.isInstanceOf(TaxonDescription.class)){
192 TaxonDescription taxonDesc = (TaxonDescription)desc;
193 Taxon taxon = taxonDesc.getTaxon();
194 if (taxon != null){
195 CdmBase cdmBase = (isName) ? taxon.getName(): taxon.getSec();
196 return state.getDbId(cdmBase);
197 }
198 }
199 logger.warn("No taxon found for description: " + textData.toString());
200 return null;
201 }
202
203
204 @SuppressWarnings("unused")
205 private static String getFact(TextData textData){
206
207 Language preferredLanguage = null;
208
209 String result = textData.getText(Language.DEFAULT());
210 if (result == null){
211 Map<Language, LanguageString> map = textData.getMultilanguageText();
212 for (Language language : map.keySet()){
213 String tmp = textData.getText(language);
214 if (! CdmUtils.Nz(tmp).trim().equals("")){
215 result = tmp;
216 break;
217 }
218 }
219 }
220 return result;
221 }
222
223 private static Map<Feature, Integer> featureMap = new HashMap<Feature, Integer>();
224
225 @Deprecated
226 private static Integer findCategory(Feature feature){
227 if (featureMap.get(feature) != null){
228 return featureMap.get(feature);
229 }
230 Integer result = null;
231 String label = feature.getLabel();
232 ResultSet rs = source.getResultSet("SELECT FactCategoryId FROM FactCategory WHERE FactCategory = '"+label+"'");
233 try {
234 while (rs.next()){
235 if (result != null){
236 logger.warn("FactCategory is not distinct: " + label);
237 }else{
238 result = rs.getInt(1) ;
239 }
240 }
241 } catch (SQLException e) {
242 logger.error(e.getMessage());
243 e.printStackTrace();
244 return null;
245 }
246 featureMap.put(feature, result);
247 return result;
248 }
249
250
251
252
253
254 @Override
255 public Class<? extends CdmBase> getStandardMethodParameter() {
256 return standardMethodParameter;
257 }
258 }