Project

General

Profile

Download (11.8 KB) Statistics
| Branch: | Revision:
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
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.RefDetailMapper;
22
import eu.etaxonomy.cdm.io.berlinModel.out.mapper.TeamOrPersonMapper;
23
import eu.etaxonomy.cdm.io.common.Source;
24
import eu.etaxonomy.cdm.io.common.mapping.out.CdmDbExportMapping;
25
import eu.etaxonomy.cdm.io.common.mapping.out.CollectionExportMapping;
26
import eu.etaxonomy.cdm.io.common.mapping.out.CreatedAndNotesMapper;
27
import eu.etaxonomy.cdm.io.common.mapping.out.DbBooleanMapper;
28
import eu.etaxonomy.cdm.io.common.mapping.out.DbExtensionMapper;
29
import eu.etaxonomy.cdm.io.common.mapping.out.DbMarkerMapper;
30
import eu.etaxonomy.cdm.io.common.mapping.out.DbObjectMapper;
31
import eu.etaxonomy.cdm.io.common.mapping.out.DbStringMapper;
32
import eu.etaxonomy.cdm.io.common.mapping.out.IExportTransformer;
33
import eu.etaxonomy.cdm.io.common.mapping.out.IdMapper;
34
import eu.etaxonomy.cdm.io.common.mapping.out.MethodMapper;
35
import eu.etaxonomy.cdm.model.common.CdmBase;
36
import eu.etaxonomy.cdm.model.common.ExtensionType;
37
import eu.etaxonomy.cdm.model.common.MarkerType;
38
import eu.etaxonomy.cdm.model.name.INonViralName;
39
import eu.etaxonomy.cdm.model.name.NomenclaturalStatus;
40
import eu.etaxonomy.cdm.model.name.TaxonName;
41

    
42

    
43
/**
44
 * @author a.mueller
45
 * @created 20.03.2008
46
 */
47
@Component
48
public class BerlinModelTaxonNameExport extends BerlinModelExportBase<TaxonName> {
49

    
50
    private static final long serialVersionUID = 4478799976310317219L;
51
    private static final Logger logger = Logger.getLogger(BerlinModelTaxonNameExport.class);
52

    
53
	private static int modCount = 2500;
54
	private static final String dbTableName = "Name";
55
	private static final String pluralString = "TaxonNames";
56
	private static final Class<? extends CdmBase> standardMethodParameter = TaxonName.class;
57

    
58
	public BerlinModelTaxonNameExport(){
59
		super();
60
	}
61

    
62
	/* (non-Javadoc)
63
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IImportConfigurator)
64
	 */
65
	@Override
66
	protected boolean doCheck(BerlinModelExportState state){
67
		boolean result = true;
68
		logger.warn("Checking for " + pluralString + " not yet fully implemented");
69
		List<TaxonName> list = getObjectList();
70
		checkRank(list);
71

    
72
		//result &= checkRank(config);
73

    
74
		return result;
75
	}
76

    
77
	private boolean checkRank(List<TaxonName> list){
78
		List<TaxonName> errorNames = new ArrayList<>();
79
		for (TaxonName<?,?> name : list){
80
			if (name.getRank() == null) {
81
                ;
82
            }
83
			errorNames.add(name);
84
		}
85
		if (errorNames.size() >0){
86
			System.out.println("The following names have no Rank:\n=======================");
87
			for (TaxonName<?,?> name : errorNames){
88
				System.out.println("  " + name.toString());
89
				System.out.println("  " + name.getUuid());
90
				System.out.println("  " + name.getTitleCache());
91
			}
92
			return false;
93
		}else{
94
			return true;
95
		}
96
	}
97

    
98
	private CdmDbExportMapping<BerlinModelExportState, BerlinModelExportConfigurator, IExportTransformer> getMapping(){
99
		String tableName = dbTableName;
100
		CdmDbExportMapping<BerlinModelExportState, BerlinModelExportConfigurator, IExportTransformer> mapping = new CdmDbExportMapping<BerlinModelExportState, BerlinModelExportConfigurator, IExportTransformer>(tableName);
101
		mapping.addMapper(IdMapper.NewInstance("NameId"));
102
		mapping.addMapper(MethodMapper.NewInstance("RankFk", this));
103
		mapping.addMapper(MethodMapper.NewInstance("SupraGenericName", this));
104
		mapping.addMapper(MethodMapper.NewInstance("Genus", this));
105
		mapping.addMapper(MethodMapper.NewInstance("NameCache", this));
106
		mapping.addMapper(MethodMapper.NewInstance("FullNameCache", this));
107
		mapping.addMapper(MethodMapper.NewInstance("PreliminaryFlag", this));
108
		mapping.addMapper(DbStringMapper.NewInstance("infraGenericEpithet", "GenusSubDivisionEpi"));
109
		mapping.addMapper(DbStringMapper.NewInstance("SpecificEpithet", "SpeciesEpi"));
110
		mapping.addMapper(DbStringMapper.NewInstance("infraSpecificEpithet", "InfraSpeciesEpi"));
111
		mapping.addMapper(DbStringMapper.NewInstance("appendedPhrase", "UnnamedNamePhrase"));
112
		mapping.addMapper(DbBooleanMapper.NewInstance("isHybridFormula", "HybridFormulaFlag", false, false));
113
		mapping.addMapper(DbBooleanMapper.NewInstance("isMonomHybrid", "MonomHybFlag", false, false));
114
		mapping.addMapper(DbBooleanMapper.NewInstance("isBinomHybrid", "BinomHybFlag", false, false));
115
		mapping.addMapper(DbBooleanMapper.NewInstance("isTrinomHybrid", "TrinomHybFlag", false, false));
116
		mapping.addMapper(DbStringMapper.NewFacultativeInstance("cultivarName", "CultivarName"));
117

    
118
		mapping.addMapper(TeamOrPersonMapper.NewInstance("combinationAuthorship", "AuthorTeamFk"));
119
		mapping.addMapper(TeamOrPersonMapper.NewInstance("exCombinationAuthorship", "ExAuthorTeamFk"));
120
		mapping.addMapper(TeamOrPersonMapper.NewInstance("basionymAuthorship", "BasAuthorTeamFk"));
121
		mapping.addMapper(TeamOrPersonMapper.NewInstance("exBasionymAuthorship", "ExBasAuthorTeamFk"));
122

    
123
		mapping.addMapper(DbObjectMapper.NewInstance("nomenclaturalReference", "NomRefFk"));
124
		mapping.addMapper(RefDetailMapper.NewInstance("nomenclaturalMicroReference","nomenclaturalReference", "NomRefDetailFk"));
125
		mapping.addMapper(CreatedAndNotesMapper.NewInstance(false));
126
		ExtensionType sourceAccExtensionType = (ExtensionType)getTermService().find(BerlinModelTaxonNameImport.SOURCE_ACC_UUID);
127
		if (sourceAccExtensionType != null){
128
			mapping.addMapper(DbExtensionMapper.NewInstance(sourceAccExtensionType, "Source_Acc"));
129
		}
130
		mapping.addCollectionMapping(getNomStatusMapping());
131

    
132

    
133

    
134
		//TODO
135
		//CultivarGroupName
136
		//NameSourceRefFk
137
		//     ,[Source_ACC]
138

    
139
		//publicationYear
140
		//originalPublicationYear
141
		//breed
142
//		INonViralName n = null;
143
		//n.getNomenclaturalMicroReference()
144
		return mapping;
145
	}
146

    
147
	private CollectionExportMapping getNomStatusMapping(){
148
		String tableName = "NomStatusRel";
149
		String collectionAttribute = "status";
150
		IdMapper parentMapper = IdMapper.NewInstance("NameFk");
151
		CollectionExportMapping mapping = CollectionExportMapping.NewInstance(tableName, collectionAttribute, parentMapper);
152
		mapping.addMapper(MethodMapper.NewInstance("NomStatusFk", this.getClass(), "getNomStatusFk", NomenclaturalStatus.class));
153
		mapping.addMapper(DbObjectMapper.NewInstance("citation", "NomStatusRefFk"));
154
		mapping.addMapper(RefDetailMapper.NewInstance("citationMicroReference","citation", "NomStatusRefDetailFk"));
155
		mapping.addMapper(DbMarkerMapper.NewInstance(MarkerType.IS_DOUBTFUL(), "DoubtfulFlag", false));
156
		mapping.addMapper(CreatedAndNotesMapper.NewInstance());
157

    
158
		return mapping;
159
	}
160

    
161
	@Override
162
    protected void doInvoke(BerlinModelExportState state){
163
		try{
164
			logger.info("start make "+pluralString+" ...");
165
			boolean success = true ;
166
			doDelete(state);
167

    
168
			TransactionStatus txStatus = startTransaction(true);
169
			logger.info("load "+pluralString+" ...");
170
			List<TaxonName> names = getObjectList();
171

    
172
			CdmDbExportMapping<BerlinModelExportState, BerlinModelExportConfigurator, IExportTransformer> mapping = getMapping();
173
			mapping.initialize(state);
174
			logger.info("save "+pluralString+" ...");
175
			int count = 0;
176
			for (TaxonName<?,?> name : names){
177
				doCount(count++, modCount, pluralString);
178
				success &= mapping.invoke(name);
179
				//TODO rank = null or rank < genus and genusOrUninomial != null
180
			}
181
			commitTransaction(txStatus);
182
			logger.info("end make " + pluralString+ " ..." + getSuccessString(success));
183

    
184
			if (!success){
185
                String message = "An undefined error occurred during Taxonname export";
186
                state.getResult().addError(message);
187
			}
188
			return;
189
		}catch(SQLException e){
190
			e.printStackTrace();
191
			logger.error(e.getMessage());
192
			state.getResult().addException(e);
193
			return;
194
		}
195
	}
196

    
197
	protected List<TaxonName> getObjectList(){
198
		List<TaxonName> list = getNameService().list(null,100000000, null,null,null);
199
		return list;
200
	}
201

    
202

    
203
	protected boolean doDelete(BerlinModelExportState state){
204
		BerlinModelExportConfigurator bmeConfig = state.getConfig();
205

    
206
		String sql;
207
		Source destination =  bmeConfig.getDestination();
208
		//RelPTaxon
209
		sql = "DELETE FROM RelPTaxon";
210
		destination.setQuery(sql);
211
		destination.update(sql);
212
		//Fact
213
		sql = "DELETE FROM Fact";
214
		destination.setQuery(sql);
215
		destination.update(sql);
216
		//PTaxon
217
		sql = "DELETE FROM PTaxon";
218
		destination.setQuery(sql);
219
		destination.update(sql);
220

    
221
		//NameHistory
222
		sql = "DELETE FROM NameHistory";
223
		destination.setQuery(sql);
224
		destination.update(sql);
225
		//RelName
226
		sql = "DELETE FROM RelName";
227
		destination.setQuery(sql);
228
		destination.update(sql);
229
		//NomStatusRel
230
		sql = "DELETE FROM NomStatusRel";
231
		destination.setQuery(sql);
232
		destination.update(sql);
233
		//Name
234
		sql = "DELETE FROM Name";
235
		destination.setQuery(sql);
236
		destination.update(sql);
237
		return true;
238
	}
239

    
240

    
241
	/* (non-Javadoc)
242
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
243
	 */
244
	@Override
245
    protected boolean isIgnore(BerlinModelExportState state){
246
		return ! state.getConfig().isDoTaxonNames();
247
	}
248

    
249
	//called by MethodMapper
250
	@SuppressWarnings("unused")
251
	private static Integer getRankFk(INonViralName name){
252
		Integer result = BerlinModelTransformer.rank2RankId(name.getRank());
253
		if (result == null){
254
			logger.warn ("Rank = null is not allowed in Berlin Model. Rank was changed to KINGDOM: " + name);
255
			result = 1;
256
		}
257
		return result;
258
	}
259

    
260
	//called by MethodMapper
261
	@SuppressWarnings("unused")
262
	private static Integer getNomStatusFk(NomenclaturalStatus status){
263
		return BerlinModelTransformer.nomStatus2nomStatusFk(status.getType());
264
	}
265

    
266
	//called by MethodMapper
267
	@SuppressWarnings("unused")
268
	private static String getSupraGenericName(INonViralName name){
269
		if (name.isSupraGeneric()){
270
			return name.getGenusOrUninomial();
271
		}else{
272
			return null;
273
		}
274
	}
275

    
276
	//called by MethodMapper
277
	@SuppressWarnings("unused")
278
	private static String getGenus(INonViralName name){
279
		if (! name.isSupraGeneric()){
280
			return name.getGenusOrUninomial();
281
		}else{
282
			return null;
283
		}
284
	}
285

    
286
	//called by MethodMapper
287
	@SuppressWarnings("unused")
288
	private static String getNameCache(INonViralName name){
289
		if (name.isProtectedNameCache()){
290
			return name.getNameCache();
291
		}else{
292
			return null;
293
		}
294
	}
295

    
296
	//called by MethodMapper
297
	@SuppressWarnings("unused")
298
	private static String getFullNameCache(INonViralName name){
299
		if (name.isProtectedTitleCache()){
300
			return name.getTitleCache();
301
		}else{
302
			return null;
303
		}
304
	}
305

    
306
	//called by MethodMapper
307
	@SuppressWarnings("unused")
308
	private static Boolean getPreliminaryFlag(INonViralName name){
309
		if (name.isProtectedTitleCache() || name.isProtectedNameCache()){
310
			if (name.isProtectedTitleCache() && name.isProtectedNameCache()){
311
				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 ");
312
			}
313
			return true;
314
		}else{
315
			return false;
316
		}
317
	}
318

    
319

    
320

    
321
	/* (non-Javadoc)
322
	 * @see eu.etaxonomy.cdm.io.berlinModel.out.BerlinModelExportBase#getStandardMethodParameter()
323
	 */
324
	@Override
325
	public Class<? extends CdmBase> getStandardMethodParameter() {
326
		return standardMethodParameter;
327
	}
328

    
329
}
(11-11/12)