1
2
3
4
5
6
7
8
9 package eu.etaxonomy.cdm.io.berlinModel.out;
10
11 import java.sql.SQLException;
12 import java.util.ArrayList;
13 import java.util.List;
14
15 import org.apache.log4j.Logger;
16 import org.springframework.stereotype.Component;
17 import org.springframework.transaction.TransactionStatus;
18
19 import eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer;
20 import eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelTaxonNameImport;
21 import eu.etaxonomy.cdm.io.berlinModel.out.mapper.CreatedAndNotesMapper;
22 import eu.etaxonomy.cdm.io.berlinModel.out.mapper.DbBooleanMapper;
23 import eu.etaxonomy.cdm.io.berlinModel.out.mapper.DbExtensionMapper;
24 import eu.etaxonomy.cdm.io.berlinModel.out.mapper.DbMarkerMapper;
25 import eu.etaxonomy.cdm.io.berlinModel.out.mapper.DbObjectMapper;
26 import eu.etaxonomy.cdm.io.berlinModel.out.mapper.DbStringMapper;
27 import eu.etaxonomy.cdm.io.berlinModel.out.mapper.IdMapper;
28 import eu.etaxonomy.cdm.io.berlinModel.out.mapper.MethodMapper;
29 import eu.etaxonomy.cdm.io.berlinModel.out.mapper.RefDetailMapper;
30 import eu.etaxonomy.cdm.io.berlinModel.out.mapper.TeamOrPersonMapper;
31 import eu.etaxonomy.cdm.io.common.Source;
32 import eu.etaxonomy.cdm.model.common.CdmBase;
33 import eu.etaxonomy.cdm.model.common.ExtensionType;
34 import eu.etaxonomy.cdm.model.common.MarkerType;
35 import eu.etaxonomy.cdm.model.name.NomenclaturalStatus;
36 import eu.etaxonomy.cdm.model.name.NonViralName;
37 import eu.etaxonomy.cdm.model.name.TaxonNameBase;
38
39
40
41
42
43
44
45 @Component
46 public class BerlinModelTaxonNameExport extends BerlinModelExportBase<TaxonNameBase> {
47 private static final Logger logger = Logger.getLogger(BerlinModelTaxonNameExport.class);
48
49 private static int modCount = 2500;
50 private static final String dbTableName = "Name";
51 private static final String pluralString = "TaxonNames";
52 private static final Class<? extends CdmBase> standardMethodParameter = NonViralName.class;
53
54 public BerlinModelTaxonNameExport(){
55 super();
56 }
57
58
59
60
61 @Override
62 protected boolean doCheck(BerlinModelExportState state){
63 boolean result = true;
64 logger.warn("Checking for " + pluralString + " not yet fully implemented");
65 List<TaxonNameBase> list = getObjectList();
66 checkRank(list);
67
68
69
70 return result;
71 }
72
73 private boolean checkRank(List<TaxonNameBase> list){
74 List<TaxonNameBase> errorNames = new ArrayList<TaxonNameBase>();
75 for (TaxonNameBase<?,?> name : list){
76 if (name.getRank() == null);
77 errorNames.add(name);
78 }
79 if (errorNames.size() >0){
80 System.out.println("The following names have no Rank:\n=======================");
81 for (TaxonNameBase<?,?> name : errorNames){
82 System.out.println(" " + name.toString());
83 System.out.println(" " + name.getUuid());
84 System.out.println(" " + name.getTitleCache());
85 }
86 return false;
87 }else{
88 return true;
89 }
90 }
91
92 private BerlinModelExportMapping getMapping(){
93 String tableName = dbTableName;
94 BerlinModelExportMapping mapping = new BerlinModelExportMapping(tableName);
95 mapping.addMapper(IdMapper.NewInstance("NameId"));
96 mapping.addMapper(MethodMapper.NewInstance("RankFk", this));
97 mapping.addMapper(MethodMapper.NewInstance("SupraGenericName", this));
98 mapping.addMapper(MethodMapper.NewInstance("Genus", this));
99 mapping.addMapper(MethodMapper.NewInstance("NameCache", this));
100 mapping.addMapper(MethodMapper.NewInstance("FullNameCache", this));
101 mapping.addMapper(MethodMapper.NewInstance("PreliminaryFlag", this));
102 mapping.addMapper(DbStringMapper.NewInstance("infraGenericEpithet", "GenusSubDivisionEpi"));
103 mapping.addMapper(DbStringMapper.NewInstance("SpecificEpithet", "SpeciesEpi"));
104 mapping.addMapper(DbStringMapper.NewInstance("infraSpecificEpithet", "InfraSpeciesEpi"));
105 mapping.addMapper(DbStringMapper.NewInstance("appendedPhrase", "UnnamedNamePhrase"));
106 mapping.addMapper(DbBooleanMapper.NewInstance("isHybridFormula", "HybridFormulaFlag", false, false));
107 mapping.addMapper(DbBooleanMapper.NewInstance("isMonomHybrid", "MonomHybFlag", false, false));
108 mapping.addMapper(DbBooleanMapper.NewInstance("isBinomHybrid", "BinomHybFlag", false, false));
109 mapping.addMapper(DbBooleanMapper.NewInstance("isTrinomHybrid", "TrinomHybFlag", false, false));
110 mapping.addMapper(DbStringMapper.NewFacultativeInstance("cultivarName", "CultivarName"));
111
112 mapping.addMapper(TeamOrPersonMapper.NewInstance("combinationAuthorTeam", "AuthorTeamFk"));
113 mapping.addMapper(TeamOrPersonMapper.NewInstance("exCombinationAuthorTeam", "ExAuthorTeamFk"));
114 mapping.addMapper(TeamOrPersonMapper.NewInstance("basionymAuthorTeam", "BasAuthorTeamFk"));
115 mapping.addMapper(TeamOrPersonMapper.NewInstance("exBasionymAuthorTeam", "ExBasAuthorTeamFk"));
116
117 mapping.addMapper(DbObjectMapper.NewInstance("nomenclaturalReference", "NomRefFk"));
118 mapping.addMapper(RefDetailMapper.NewInstance("nomenclaturalMicroReference","nomenclaturalReference", "NomRefDetailFk"));
119 mapping.addMapper(CreatedAndNotesMapper.NewInstance(false));
120 ExtensionType sourceAccExtensionType = (ExtensionType)getTermService().find(BerlinModelTaxonNameImport.SOURCE_ACC_UUID);
121 if (sourceAccExtensionType != null){
122 mapping.addMapper(DbExtensionMapper.NewInstance(sourceAccExtensionType, "Source_Acc"));
123 }
124 mapping.addCollectionMapping(getNomStatusMapping());
125
126
127
128
129
130
131
132
133
134
135
136 NonViralName<?> n = null;
137
138 return mapping;
139 }
140
141 private CollectionExportMapping getNomStatusMapping(){
142 String tableName = "NomStatusRel";
143 String collectionAttribute = "status";
144 IdMapper parentMapper = IdMapper.NewInstance("NameFk");
145 CollectionExportMapping mapping = CollectionExportMapping.NewInstance(tableName, collectionAttribute, parentMapper);
146 mapping.addMapper(MethodMapper.NewInstance("NomStatusFk", this.getClass(), "getNomStatusFk", NomenclaturalStatus.class));
147 mapping.addMapper(DbObjectMapper.NewInstance("citation", "NomStatusRefFk"));
148 mapping.addMapper(RefDetailMapper.NewInstance("citationMicroReference","citation", "NomStatusRefDetailFk"));
149 mapping.addMapper(DbMarkerMapper.NewInstance(MarkerType.IS_DOUBTFUL(), "DoubtfulFlag", false));
150 mapping.addMapper(CreatedAndNotesMapper.NewInstance());
151
152 return mapping;
153 }
154
155 protected boolean doInvoke(BerlinModelExportState state){
156 try{
157 logger.info("start make "+pluralString+" ...");
158 boolean success = true ;
159 doDelete(state);
160
161 TransactionStatus txStatus = startTransaction(true);
162 logger.info("load "+pluralString+" ...");
163 List<TaxonNameBase> names = getObjectList();
164
165 BerlinModelExportMapping mapping = getMapping();
166 mapping.initialize(state);
167 logger.info("save "+pluralString+" ...");
168 int count = 0;
169 for (TaxonNameBase<?,?> name : names){
170 doCount(count++, modCount, pluralString);
171 success &= mapping.invoke(name);
172
173 }
174 commitTransaction(txStatus);
175 logger.info("end make " + pluralString+ " ..." + getSuccessString(success));
176
177 return success;
178 }catch(SQLException e){
179 e.printStackTrace();
180 logger.error(e.getMessage());
181 return false;
182 }
183 }
184
185 protected List<TaxonNameBase> getObjectList(){
186 List<TaxonNameBase> list = getNameService().list(null,100000000, null,null,null);
187 return list;
188 }
189
190
191 protected boolean doDelete(BerlinModelExportState state){
192 BerlinModelExportConfigurator bmeConfig = state.getConfig();
193
194 String sql;
195 Source destination = bmeConfig.getDestination();
196
197 sql = "DELETE FROM RelPTaxon";
198 destination.setQuery(sql);
199 destination.update(sql);
200
201 sql = "DELETE FROM Fact";
202 destination.setQuery(sql);
203 destination.update(sql);
204
205 sql = "DELETE FROM PTaxon";
206 destination.setQuery(sql);
207 destination.update(sql);
208
209
210 sql = "DELETE FROM NameHistory";
211 destination.setQuery(sql);
212 destination.update(sql);
213
214 sql = "DELETE FROM RelName";
215 destination.setQuery(sql);
216 destination.update(sql);
217
218 sql = "DELETE FROM NomStatusRel";
219 destination.setQuery(sql);
220 destination.update(sql);
221
222 sql = "DELETE FROM Name";
223 destination.setQuery(sql);
224 destination.update(sql);
225 return true;
226 }
227
228
229
230
231
232 protected boolean isIgnore(BerlinModelExportState state){
233 return ! state.getConfig().isDoTaxonNames();
234 }
235
236
237 @SuppressWarnings("unused")
238 private static Integer getRankFk(NonViralName<?> name){
239 Integer result = BerlinModelTransformer.rank2RankId(name.getRank());
240 if (result == null){
241 logger.warn ("Rank = null is not allowed in Berlin Model. Rank was changed to KINGDOM: " + name);
242 result = 1;
243 }
244 return result;
245 }
246
247
248 @SuppressWarnings("unused")
249 private static Integer getNomStatusFk(NomenclaturalStatus status){
250 return BerlinModelTransformer.nomStatus2nomStatusFk(status.getType());
251 }
252
253
254 @SuppressWarnings("unused")
255 private static String getSupraGenericName(NonViralName<?> name){
256 if (name.isSupraGeneric()){
257 return name.getGenusOrUninomial();
258 }else{
259 return null;
260 }
261 }
262
263
264 @SuppressWarnings("unused")
265 private static String getGenus(NonViralName<?> name){
266 if (! name.isSupraGeneric()){
267 return name.getGenusOrUninomial();
268 }else{
269 return null;
270 }
271 }
272
273
274 @SuppressWarnings("unused")
275 private static String getNameCache(NonViralName<?> name){
276 if (name.isProtectedNameCache()){
277 return name.getNameCache();
278 }else{
279 return null;
280 }
281 }
282
283
284 @SuppressWarnings("unused")
285 private static String getFullNameCache(NonViralName<?> name){
286 if (name.isProtectedTitleCache()){
287 return name.getTitleCache();
288 }else{
289 return null;
290 }
291 }
292
293
294 @SuppressWarnings("unused")
295 private static Boolean getPreliminaryFlag(NonViralName<?> name){
296 if (name.isProtectedTitleCache() || name.isProtectedNameCache()){
297 if (name.isProtectedTitleCache() && name.isProtectedNameCache()){
298 logger.warn("protectedTitleCache and protectedNameCache do not have the same value for name " + name.getTitleCache() + ". This can not be mapped appropriately to the Berlin Model ");
299 }
300 return true;
301 }else{
302 return false;
303 }
304 }
305
306
307
308
309
310
311 @Override
312 public Class<? extends CdmBase> getStandardMethodParameter() {
313 return standardMethodParameter;
314 }
315
316 }