View Javadoc

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.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   * @author a.mueller
42   * @created 20.03.2008
43   * @version 1.0
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  	/* (non-Javadoc)
59  	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IImportConfigurator)
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  		//result &= checkRank(config);
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 		//TODO
129 		//CultivarGroupName
130 		//NameSourceRefFk
131 		//     ,[Source_ACC]
132 		
133 		//publicationYear
134 		//originalPublicationYear
135 		//breed
136 		NonViralName<?> n = null;
137 		//n.getNomenclaturalMicroReference()
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 				//TODO rank = null or rank < genus and genusOrUninomial != null
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 		//RelPTaxon
197 		sql = "DELETE FROM RelPTaxon";
198 		destination.setQuery(sql);
199 		destination.update(sql);
200 		//Fact
201 		sql = "DELETE FROM Fact";
202 		destination.setQuery(sql);
203 		destination.update(sql);
204 		//PTaxon
205 		sql = "DELETE FROM PTaxon";
206 		destination.setQuery(sql);
207 		destination.update(sql);
208 		
209 		//NameHistory
210 		sql = "DELETE FROM NameHistory";
211 		destination.setQuery(sql);
212 		destination.update(sql);
213 		//RelName
214 		sql = "DELETE FROM RelName";
215 		destination.setQuery(sql);
216 		destination.update(sql);
217 		//NomStatusRel
218 		sql = "DELETE FROM NomStatusRel";
219 		destination.setQuery(sql);
220 		destination.update(sql);
221 		//Name
222 		sql = "DELETE FROM Name";
223 		destination.setQuery(sql);
224 		destination.update(sql);
225 		return true;
226 	}
227 		
228 	
229 	/* (non-Javadoc)
230 	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
231 	 */
232 	protected boolean isIgnore(BerlinModelExportState state){
233 		return ! state.getConfig().isDoTaxonNames();
234 	}
235 	
236 	//called by MethodMapper
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 	//called by MethodMapper
248 	@SuppressWarnings("unused")
249 	private static Integer getNomStatusFk(NomenclaturalStatus status){
250 		return BerlinModelTransformer.nomStatus2nomStatusFk(status.getType());
251 	}
252 	
253 	//called by MethodMapper
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 	//called by MethodMapper
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 	//called by MethodMapper
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 	//called by MethodMapper
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 	//called by MethodMapper
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 	/* (non-Javadoc)
309 	 * @see eu.etaxonomy.cdm.io.berlinModel.out.BerlinModelExportBase#getStandardMethodParameter()
310 	 */
311 	@Override
312 	public Class<? extends CdmBase> getStandardMethodParameter() {
313 		return standardMethodParameter;
314 	}
315 	
316 }