Project

General

Profile

Download (8.67 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

    
10
package eu.etaxonomy.cdm.io.algaterra;
11

    
12
import java.sql.ResultSet;
13
import java.sql.SQLException;
14
import java.util.HashMap;
15
import java.util.HashSet;
16
import java.util.Map;
17
import java.util.Set;
18

    
19
import org.apache.log4j.Logger;
20
import org.springframework.stereotype.Component;
21

    
22
import eu.etaxonomy.cdm.api.facade.DerivedUnitFacade;
23
import eu.etaxonomy.cdm.api.facade.DerivedUnitFacadeNotSupportedException;
24
import eu.etaxonomy.cdm.io.algaterra.validation.AlgaTerraTypeImportValidator;
25
import eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator;
26
import eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportState;
27
import eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelTaxonImport;
28
import eu.etaxonomy.cdm.io.common.IOValidator;
29
import eu.etaxonomy.cdm.io.common.ResultSetPartitioner;
30
import eu.etaxonomy.cdm.model.common.CdmBase;
31
import eu.etaxonomy.cdm.model.media.Media;
32
import eu.etaxonomy.cdm.model.occurrence.DerivedUnitBase;
33
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
34
import eu.etaxonomy.cdm.model.taxon.Taxon;
35
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
36

    
37

    
38
/**
39
 * Import for AlgaTerra images from table 
40
 * @author a.mueller
41
 * @created 18.01.2013
42
 */
43
@Component
44
public class AlgaTerraPictureImport  extends AlgaTerraImageImportBase {
45
	private static final Logger logger = Logger.getLogger(AlgaTerraPictureImport.class);
46

    
47
	
48
	private static int modCount = 5000;
49
	private static final String pluralString = "pictures";
50
	private static final String dbTableName = "Picture";  //??  
51
	
52
	public AlgaTerraPictureImport(){
53
		super(dbTableName, pluralString);
54
	}
55
	
56
	
57
	/* (non-Javadoc)
58
	 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getIdQuery()
59
	 */
60
	@Override
61
	protected String getIdQuery(BerlinModelImportState state) {
62
		String result = " SELECT p.PictureId "  
63
				+ " FROM Picture p  INNER JOIN Fact f ON p.PictureId = f.ExtensionFk LEFT OUTER JOIN PTaxon pt ON f.PTNameFk = pt.PTNameFk AND f.PTRefFk = pt.PTRefFk " 
64
				+ " WHERE f.FactCategoryFk = 205 AND p.RestrictedFlag = 0 "
65
				+ " ORDER BY p.PictureId ";
66
		return result;
67
	}
68

    
69
	/* (non-Javadoc)
70
	 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getRecordQuery(eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator)
71
	 */
72
	@Override
73
	protected String getRecordQuery(BerlinModelImportConfigurator config) {
74
			String strQuery =    
75
						
76
				" SELECT p.*, f.*, pt.RIdentifier, p.PicturePhrase as FigurePhrase, p.PictureFile as fileName, p.PicturePath as filePath " +
77
	            " FROM Picture p INNER JOIN Fact f ON p.PictureId = f.ExtensionFk LEFT OUTER JOIN PTaxon pt ON f.PTNameFk = pt.PTNameFk AND f.PTRefFk = pt.PTRefFk " 
78
	            + 	" WHERE f.FactCategoryFk = 205 AND ( p.PictureID IN (" + ID_LIST_TOKEN + ")     )"  
79
	            + " ORDER BY p.PictureId, f.factId, pt.RIdentifier ";
80
            ;
81
		return strQuery;
82
	}
83

    
84
	/* (non-Javadoc)
85
	 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#doPartition(eu.etaxonomy.cdm.io.berlinModel.in.ResultSetPartitioner, eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportState)
86
	 */
87
	public boolean doPartition(ResultSetPartitioner partitioner, BerlinModelImportState bmState) {
88
		boolean success = true;
89
		
90
		AlgaTerraImportState state = (AlgaTerraImportState)bmState;
91
		
92
//		Set<SpecimenOrObservationBase> specimenToSave = new HashSet<SpecimenOrObservationBase>();
93
		Set<TaxonBase> taxaToSave = new HashSet<TaxonBase>();
94
		
95
//		Map<String, DerivedUnitBase> ecoFactMap = (Map<String, DerivedUnitBase>) partitioner.getObjectMap(AlgaTerraSpecimenImportBase.ECO_FACT_DERIVED_UNIT_NAMESPACE);
96
		Map<String, TaxonBase> taxonMap = (Map<String, TaxonBase>) partitioner.getObjectMap(BerlinModelTaxonImport.NAMESPACE);
97
		Map<String, DerivedUnitBase<?>> specimenMap = (Map<String, DerivedUnitBase<?>>) partitioner.getObjectMap(AlgaTerraFactEcologyImport.FACT_ECOLOGY_NAMESPACE);
98
		
99
		ResultSet rs = partitioner.getResultSet();
100

    
101
		try {
102
			
103
			int i = 0;
104

    
105
			//for each reference
106
            while (rs.next()){
107
                
108
        		if ((i++ % modCount) == 0 && i!= 1 ){ logger.info(pluralString + " handled: " + (i-1));}
109
				
110
				int pictureId = rs.getInt("PictureID");
111
				int taxonId = rs.getInt("RIdentifier");
112
				int factId = rs.getInt("FactId");
113
				
114
				
115
				//TODO etc. Created, Notes, Copyright, TermsOfUse etc.
116
				
117
				try {
118
					
119
					TaxonBase<?> taxonBase = taxonMap.get(String.valueOf(taxonId));
120
					if (taxonBase == null){
121
						logger.warn("Could not find taxon (" + taxonId +") for picture fact " +  factId);
122
					}else if (! taxonBase.isInstanceOf(Taxon.class)){
123
						logger.warn("Taxon is not of class Taxon but " + taxonBase.getClass() + ". RIdentifier: " + taxonId + " PictureId: " +  pictureId + ", FactId: "+  factId);
124
						
125
					}else{
126
						Taxon taxon = CdmBase.deproxy(taxonBase, Taxon.class);
127
						
128
						Media media = handleSingleImage(rs, taxon, state, partitioner);
129
						
130
						handlePictureSpecificFields(rs, media, state, specimenMap);
131
						
132
						taxaToSave.add(taxon); 
133
					}
134
	
135

    
136
				} catch (Exception e) {
137
					logger.warn("Exception in " + getTableName() + ": PictureId " + pictureId + ". " + e.getMessage());
138
					e.printStackTrace();
139
				} 
140
                
141
            }
142
           
143
//            logger.warn("Specimen: " + countSpecimen + ", Descriptions: " + countDescriptions );
144

    
145
			logger.warn(pluralString + " to save: " + taxaToSave.size());
146
//			getOccurrenceService().save(taxaToSave);	
147
			getTaxonService().save(taxaToSave);	
148
			
149
			return success;
150
		} catch (SQLException e) {
151
			logger.error("SQLException:" +  e);
152
			return false;
153
		}
154
	}
155

    
156

    
157

    
158
	private void handlePictureSpecificFields(ResultSet rs, Media media, AlgaTerraImportState state, Map<String, DerivedUnitBase<?>> specimenMap) throws SQLException {
159
		Integer specimenFactId = nullSafeInt(rs, "FactFk");
160
		if (specimenFactId != null){
161
			DerivedUnitBase<?> specimen = specimenMap.get(String.valueOf(specimenFactId));
162
			if (specimen == null){
163
				logger.warn("Specimen not found for FactFK: " + specimenFactId);
164
			}else{
165
				try {
166
					DerivedUnitFacade facade = DerivedUnitFacade.NewInstance(specimen);
167
					facade.addDerivedUnitMedia(media);
168
					getOccurrenceService().saveOrUpdate(specimen);
169
				} catch (DerivedUnitFacadeNotSupportedException e) {
170
					e.printStackTrace();
171
					logger.error(e.getMessage());
172
				}
173
			}
174
		}
175
		
176
	}
177

    
178
	
179
	/* (non-Javadoc)
180
	 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#getRelatedObjectsForPartition(java.sql.ResultSet)
181
	 */
182
	public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs) {
183
		String nameSpace;
184
		Class cdmClass;
185
		Set<String> idSet;
186
		Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<Object, Map<String, ? extends CdmBase>>();
187
		
188
		try{
189
			Set<String> taxonIdSet = new HashSet<String>();
190
			Set<String> specimenIdSet = new HashSet<String>();
191
			
192
			while (rs.next()){
193
				handleForeignKey(rs, taxonIdSet, "RIdentifier");
194
			}
195
			
196
			//taxon map
197
			nameSpace = BerlinModelTaxonImport.NAMESPACE;
198
			cdmClass = TaxonBase.class;
199
			idSet = taxonIdSet;
200
			Map<String, TaxonBase> taxonMap = (Map<String,TaxonBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
201
			result.put(nameSpace, taxonMap);
202

    
203
			//fact specimen map
204
			nameSpace = AlgaTerraFactEcologyImport.FACT_ECOLOGY_NAMESPACE;
205
			cdmClass = SpecimenOrObservationBase.class;
206
			idSet = specimenIdSet;
207
			Map<String, SpecimenOrObservationBase> specimenMap = (Map<String,SpecimenOrObservationBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
208
			result.put(nameSpace, specimenMap);
209

    
210
			
211
		} catch (SQLException e) {
212
			throw new RuntimeException(e);
213
		}
214
		return result;
215
	}
216

    
217

    
218
	
219

    
220
	/* (non-Javadoc)
221
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IoStateBase)
222
	 */
223
	@Override
224
	protected boolean doCheck(BerlinModelImportState state){
225
		IOValidator<BerlinModelImportState> validator = new AlgaTerraTypeImportValidator();
226
		return validator.validate(state);
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(BerlinModelImportState bmState){
233
		AlgaTerraImportConfigurator config = ((AlgaTerraImportState) bmState).getAlgaTerraConfigurator();
234
		return !  ( config.isDoTypes() && config.isDoImages()) ;
235
	}
236
	
237
}
(10-10/15)