Project

General

Profile

Download (8.1 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.io.algaterra.validation.AlgaTerraCollectionImportValidator;
23
import eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase;
24
import eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator;
25
import eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportState;
26
import eu.etaxonomy.cdm.io.common.IOValidator;
27
import eu.etaxonomy.cdm.io.common.ResultSetPartitioner;
28
import eu.etaxonomy.cdm.model.common.CdmBase;
29
import eu.etaxonomy.cdm.model.common.OriginalSourceType;
30
import eu.etaxonomy.cdm.model.occurrence.Collection;
31
import eu.etaxonomy.cdm.model.reference.Reference;
32

    
33

    
34
/**
35
 * @author a.mueller
36
 * @created 01.09.2012
37
 */
38
@Component
39
public class AlgaTerraCollectionImport  extends BerlinModelImportBase {
40
	private static final Logger logger = Logger.getLogger(AlgaTerraCollectionImport.class);
41

    
42
	
43
	private static int modCount = 5000;
44
	private static final String pluralString = "collections";
45
	private static final String dbTableName = "Collection";  //??  
46
	
47
	public static final String NAMESPACE_COLLECTION = "Collection"; 
48
	public static final String NAMESPACE_SUBCOLLECTION = "Collection (Subcollection)"; 
49

    
50

    
51
	public AlgaTerraCollectionImport(){
52
		super(dbTableName, pluralString);
53
	}
54

    
55
	
56
	/* (non-Javadoc)
57
	 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getIdQuery()
58
	 */
59
	@Override
60
	protected String getIdQuery(BerlinModelImportState state) {
61
		String result = " SELECT CollectionId " + 
62
				" FROM Collection c "
63
				+ " ORDER BY partOfFk, c.CollectionId ";
64
		return result;
65
	}
66

    
67
	/* (non-Javadoc)
68
	 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getRecordQuery(eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator)
69
	 */
70
	@Override
71
	protected String getRecordQuery(BerlinModelImportConfigurator config) {
72
			String strQuery =   
73
            " SELECT CollectionId, Name, Town, IHCode, Subcollection, partOfFk, TDWGGazetteerFk, Address, CultCollFlag, " +
74
            		" Created_When, Updated_When, Created_Who, Updated_Who, Notes " +
75
            " FROM Collection c " + 
76
            " WHERE c.CollectionId IN (" + ID_LIST_TOKEN + ") "  
77
            + " ORDER BY partOfFk, c.CollectionId "
78
            ;
79
		return strQuery;
80
	}
81

    
82
	/* (non-Javadoc)
83
	 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#doPartition(eu.etaxonomy.cdm.io.berlinModel.in.ResultSetPartitioner, eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportState)
84
	 */
85
	public boolean doPartition(ResultSetPartitioner partitioner, BerlinModelImportState bmState) {
86
		boolean success = true;
87
		
88
		AlgaTerraImportState state = (AlgaTerraImportState)bmState;
89
		Set<Collection> collectionsToSave = new HashSet<Collection>();
90

    
91
		
92
		Map<String, Collection> collectionMap = (Map<String, Collection>) partitioner.getObjectMap(NAMESPACE_COLLECTION);
93
		
94
		
95
		ResultSet rs = partitioner.getResultSet();
96

    
97
		try {
98
			
99
			int i = 0;
100

    
101
			//for each reference
102
            while (rs.next()){
103
                
104
        		if ((i++ % modCount) == 0 && i!= 1 ){ logger.info(pluralString + " handled: " + (i-1));}
105
				
106
        		int collectionId = rs.getInt("CollectionId");
107
        		String name = rs.getString("Name");
108
        		String town = rs.getString("Town");
109
        		String ihCode = rs.getString("IHCode");
110
        		String subCollectionStr = rs.getString("Subcollection");
111
        		Integer partOfFk = nullSafeInt(rs, "PartOfFk");
112
        		
113
//        		Integer tdwgArea = nullSafeInt(rs, "TDWGGazetteerFk");  //somehow redundant with town
114
//        		String address = rs.getString("Address");           //only available for BGBM
115
//        		Boolean cultCollFlag = rs.getBoolean("CultCollFlag");  //?? not really needed according to Henning
116
        		
117
        		//TODO createdUpdates, NOtes		
118
      
119
        		try {
120
					
121
					//source ref
122
					Reference<?> sourceRef = state.getTransactionalSourceReference();
123
				
124
					
125
					//collection
126
					Collection collection;
127
					if (partOfFk == null){
128
						collection = makeCollection(collectionsToSave,
129
								collectionId, name, town, ihCode, sourceRef, NAMESPACE_COLLECTION, collectionMap);
130
					}else{
131
						collection = collectionMap.get(String.valueOf(partOfFk));
132
						if (collection == null){
133
							logger.warn("PartOf collection not found");
134
						}
135
					}
136
					
137

    
138
					//subcollection
139
					if (isNotBlank(subCollectionStr)){
140
						Collection subCollection = makeCollection(collectionsToSave, collectionId, subCollectionStr, town, ihCode, sourceRef, NAMESPACE_SUBCOLLECTION, collectionMap);
141
						subCollection.setSuperCollection(collection);
142
					}
143
					
144
					
145
					//TODO movedToFk (extension ??)
146
					
147

    
148
				} catch (Exception e) {
149
					logger.warn("Exception in collection: CollectionId " + collectionId + ". " + e.getMessage());
150
//					e.printStackTrace();
151
				} 
152
                
153
            }
154
           
155
			logger.warn(pluralString + " to save: " + collectionsToSave.size());
156
			getCollectionService().save(collectionsToSave);	
157
			
158
			return success;
159
		} catch (SQLException e) {
160
			logger.error("SQLException:" +  e);
161
			return false;
162
		}
163
	}
164

    
165

    
166

    
167
	/**
168
	 * @param collectionsToSave
169
	 * @param collectionId
170
	 * @param name
171
	 * @param town
172
	 * @param ihCode
173
	 * @param sourceRef
174
	 * @param collectionMap 
175
	 * @return
176
	 */
177
	private Collection makeCollection(Set<Collection> collectionsToSave, int collectionId, 
178
			String name, String town, String ihCode, Reference<?> sourceRef, String namespace, Map<String, Collection> collectionMap) {
179
		Collection collection = Collection.NewInstance();
180
		collection.setName(name);
181
		if (isNotBlank(ihCode) && ! "--".equals(ihCode)){
182
			collection.setCode(ihCode);
183
			collection.setCodeStandard("Index Herbariorum");
184
		}
185
		
186
		collection.setTownOrLocation(town);
187
		collection.addSource(OriginalSourceType.Import, String.valueOf(collectionId), namespace, sourceRef, null);
188
		
189
		collectionMap.put(String.valueOf(collectionId), collection);
190
		collectionsToSave.add(collection);  //or subcollection ? 
191
		return collection;
192
	}
193

    
194

    
195

    
196

    
197
	@Override
198
	public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs, BerlinModelImportState state) {
199
		String nameSpace;
200
		Class cdmClass;
201
		Set<String> idSet;
202
		Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<Object, Map<String, ? extends CdmBase>>();
203

    
204
		try{
205
			Set<String> collectionIdSet = new HashSet<String>();
206
			
207
			while (rs.next()){
208
				handleForeignKey(rs, collectionIdSet, "partOfFk");
209
			}
210
			
211
			//type specimen map
212
			nameSpace = NAMESPACE_COLLECTION;
213
			cdmClass = Collection.class;
214
			idSet = collectionIdSet;
215
			Map<String, Collection> collectionMap = (Map<String, Collection>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
216
			result.put(nameSpace, collectionMap);
217

    
218
			
219
		} catch (SQLException e) {
220
			throw new RuntimeException(e);
221
		}
222
		return result;
223
		
224
	}
225

    
226

    
227
	/* (non-Javadoc)
228
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IoStateBase)
229
	 */
230
	@Override
231
	protected boolean doCheck(BerlinModelImportState state){
232
		IOValidator<BerlinModelImportState> validator = new AlgaTerraCollectionImportValidator();
233
		return validator.validate(state);
234
	}
235

    
236
	/* (non-Javadoc)
237
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
238
	 */
239
	protected boolean isIgnore(BerlinModelImportState bmState){
240
		AlgaTerraImportState state = (AlgaTerraImportState)bmState;
241
		return ! ( state.getAlgaTerraConfigurator().isDoEcoFacts() ||  state.getAlgaTerraConfigurator().isDoTypes() );
242
	}
243
	
244
}
(1-1/15)