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.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   * @author a.mueller
47   * @created 20.03.2008
48   * @version 1.0
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  	/* (non-Javadoc)
66  	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IImportConfigurator)
67  	 */
68  	@Override
69  	protected boolean doCheck(BerlinModelExportState state){
70  		boolean result = true;
71  		logger.warn("Checking for " + pluralString + " not yet implemented");
72  		//result &= checkArticlesWithoutJournal(bmiConfig);
73  		//result &= checkPartOfJournal(bmiConfig);
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  		//TODO
97  //	       designationRef
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 		//Fact
146 		sql = "DELETE FROM Fact";
147 		destination.setQuery(sql);
148 		destination.update(sql);
149 
150 		return true;
151 	}
152 		
153 	
154 	/* (non-Javadoc)
155 	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
156 	 */
157 	protected boolean isIgnore(BerlinModelExportState state){
158 		return ! state.getConfig().isDoFacts();
159 	}
160 	
161 	//called by MethodMapper
162 	@SuppressWarnings("unused")
163 	private static Integer getFactCategoryFk(TextData textData){
164 		Feature feature = textData.getFeature();
165 		Integer catFk = BerlinModelTransformer.textData2FactCategoryFk(feature);
166 		//catFk = 302;
167 		if (catFk == null){
168 			catFk = findCategory(feature);
169 		}
170 		if (catFk == null){
171 			//catFk = insertCategory(feature);
172 		}
173 		return catFk;
174 	}
175 	
176 	
177 	//called by MethodMapper
178 	@SuppressWarnings("unused")
179 	private static Integer getPTNameFk(TextData textData, DbExportStateBase<?> state){
180 		return getObjectFk(textData, state, true);
181 	}
182 	
183 	//called by MethodMapper
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 	//called by MethodMapper
204 	@SuppressWarnings("unused")
205 	private static String getFact(TextData textData){
206 //		Map<Language, LanguageString> map = textData.getMultilanguageText();
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  //TODO quick and dirty for Salvador export
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 	/* (non-Javadoc)
252 	 * @see eu.etaxonomy.cdm.io.berlinModel.out.BerlinModelExportBase#getStandardMethodParameter()
253 	 */
254 	@Override
255 	public Class<? extends CdmBase> getStandardMethodParameter() {
256 		return standardMethodParameter;
257 	}
258 }