Fix taxon node creation for nodes with no parents
[cdmlib-apps.git] / app-import / src / main / java / eu / etaxonomy / cdm / io / algaterra / AlgaTerraTypeImagesImport.java
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.AlgaTerraImageImportBase.PathType;
23 import eu.etaxonomy.cdm.io.algaterra.validation.AlgaTerraTypeImportValidator;
24 import eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator;
25 import eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportState;
26 import eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelReferenceImport;
27 import eu.etaxonomy.cdm.io.common.IOValidator;
28 import eu.etaxonomy.cdm.io.common.ResultSetPartitioner;
29 import eu.etaxonomy.cdm.model.common.CdmBase;
30 import eu.etaxonomy.cdm.model.media.Media;
31 import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
32 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
33 import eu.etaxonomy.cdm.model.reference.Reference;
34
35
36 /**
37 * @author a.mueller
38 * @created 20.03.2008
39 */
40 @Component
41 public class AlgaTerraTypeImagesImport extends AlgaTerraImageImportBase {
42 private static final Logger logger = Logger.getLogger(AlgaTerraTypeImagesImport.class);
43
44
45 private static int modCount = 5000;
46 private static final String pluralString = "type images";
47 private static final String dbTableName = "SpecimenFigure"; //??
48
49 public AlgaTerraTypeImagesImport(){
50 super(dbTableName, pluralString);
51 }
52
53
54 /* (non-Javadoc)
55 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getIdQuery()
56 */
57 @Override
58 protected String getIdQuery(BerlinModelImportState state) {
59 String result = " SELECT SpecimenFigureId "
60 + " FROM SpecimenFigure "
61 + " WHERE TypeSpecimenFk is NOT NULL "
62 + " ORDER BY TypeSpecimenFk ";
63 return result;
64 }
65
66 /* (non-Javadoc)
67 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getRecordQuery(eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator)
68 */
69 @Override
70 protected String getRecordQuery(BerlinModelImportConfigurator config) {
71 String strQuery =
72
73 " SELECT sf.*, sf.SpecimenFigurePhrase as FigurePhrase, sf.SpecimenFigure as fileName, sf.PicturePath as filePath" +
74 " FROM SpecimenFigure sf "
75 + " WHERE (sf.SpecimenFigureId IN (" + ID_LIST_TOKEN + ") )"
76 + " ORDER BY TypeSpecimenFk ";
77 ;
78 return strQuery;
79 }
80
81 /* (non-Javadoc)
82 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#doPartition(eu.etaxonomy.cdm.io.berlinModel.in.ResultSetPartitioner, eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportState)
83 */
84 public boolean doPartition(ResultSetPartitioner partitioner, BerlinModelImportState bmState) {
85 boolean success = true;
86
87 AlgaTerraImportState state = (AlgaTerraImportState)bmState;
88
89 Set<SpecimenOrObservationBase> unitsToSave = new HashSet<SpecimenOrObservationBase>();
90
91 Map<String, DerivedUnit> typeSpecimenMap = (Map<String, DerivedUnit>) partitioner.getObjectMap(AlgaTerraSpecimenImportBase.TYPE_SPECIMEN_DERIVED_UNIT_NAMESPACE);
92 Map<String, Reference> referenceMap = (Map<String, Reference>) partitioner.getObjectMap(BerlinModelReferenceImport.REFERENCE_NAMESPACE);
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 figureId = rs.getInt("SpecimenFigureId");
107 int typeSpecimenFk = rs.getInt("typeSpecimenFk");
108
109
110 //TODO etc. Created, Notes, Copyright, TermsOfUse etc.
111
112 try {
113
114 //source ref
115 Reference<?> sourceRef = state.getTransactionalSourceReference();
116
117 DerivedUnit derivedUnit = typeSpecimenMap.get(String.valueOf(typeSpecimenFk));
118
119 if (derivedUnit == null){
120 logger.warn("Could not find type specimen (" + typeSpecimenFk +") for specimen figure " + figureId);
121 }else{
122
123 //field observation
124 Media media = handleSingleImage(rs, derivedUnit, state, partitioner, PathType.Image);
125
126 handleTypeImageSpecificFields(rs, media, state);
127
128 unitsToSave.add(derivedUnit);
129 }
130
131
132 } catch (Exception e) {
133 logger.warn("Exception in " + getTableName() + ": SpecimenFigureId " + figureId + ". " + e.getMessage());
134 e.printStackTrace();
135 }
136
137 }
138
139 // logger.warn("Specimen: " + countSpecimen + ", Descriptions: " + countDescriptions );
140
141 logger.warn(pluralString + " to save: " + unitsToSave.size());
142 getOccurrenceService().saveOrUpdate(unitsToSave);
143
144 return success;
145 } catch (SQLException e) {
146 logger.error("SQLException:" + e);
147 return false;
148 }
149 }
150
151
152
153 private void handleTypeImageSpecificFields(ResultSet rs, Media media, AlgaTerraImportState state) throws SQLException {
154 //TODO refFk, refDetailFk, publishFlag
155 Integer refFk = nullSafeInt(rs, "refFk");
156 Integer refDetailFk = nullSafeInt(rs, "refDetailFk");
157
158 //TODO
159
160
161 }
162
163 @Override
164 public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs, BerlinModelImportState state) {
165 String nameSpace;
166 Class<?> cdmClass;
167 Set<String> idSet;
168 Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<Object, Map<String, ? extends CdmBase>>();
169
170 try{
171 Set<String> typeSpecimenIdSet = new HashSet<String>();
172
173 while (rs.next()){
174 handleForeignKey(rs, typeSpecimenIdSet, "TypeSpecimenFk");
175 }
176
177 //type specimen map
178 nameSpace = AlgaTerraSpecimenImportBase.TYPE_SPECIMEN_DERIVED_UNIT_NAMESPACE;
179 cdmClass = SpecimenOrObservationBase.class;
180 idSet = typeSpecimenIdSet;
181 Map<String, DerivedUnit> typeSpecimenMap = (Map<String, DerivedUnit>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
182 result.put(nameSpace, typeSpecimenMap);
183
184
185 } catch (SQLException e) {
186 throw new RuntimeException(e);
187 }
188 return result;
189 }
190
191 @Override
192 protected boolean doCheck(BerlinModelImportState state){
193 IOValidator<BerlinModelImportState> validator = new AlgaTerraTypeImportValidator();
194 return validator.validate(state);
195 }
196
197
198 @Override
199 protected boolean isIgnore(BerlinModelImportState bmState){
200 AlgaTerraImportConfigurator config = ((AlgaTerraImportState) bmState).getAlgaTerraConfigurator();
201 return ! ( config.isDoTypes() && config.isDoImages()) ;
202 // return false;
203 }
204
205 }