0b049c55cd13a3452b1c14ca90d02a4256a71065
[cdmlib.git] / cdmlib-io / src / main / java / eu / etaxonomy / cdm / io / berlinModel / in / BerlinModelRefDetailImport.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.berlinModel.in;
11
12 import java.sql.ResultSet;
13 import java.sql.SQLException;
14 import java.util.Collection;
15 import java.util.HashMap;
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.common.CdmUtils;
23 import eu.etaxonomy.cdm.io.berlinModel.in.validation.BerlinModelRefDetailImportValidator;
24 import eu.etaxonomy.cdm.io.common.IImportConfigurator;
25 import eu.etaxonomy.cdm.io.common.IOValidator;
26 import eu.etaxonomy.cdm.io.common.ImportHelper;
27 import eu.etaxonomy.cdm.io.common.ResultSetPartitioner;
28 import eu.etaxonomy.cdm.io.common.IImportConfigurator.DO_REFERENCES;
29 import eu.etaxonomy.cdm.model.common.CdmBase;
30 import eu.etaxonomy.cdm.model.reference.Reference;
31 import eu.etaxonomy.cdm.model.reference.ReferenceFactory;
32
33 /**
34 * This class imports all preliminary refdetails as generic references. Non preliminary
35 * refdetails are imported as microcitation together with the record using the refdetail
36 * and therefore left out here.
37 *
38 * @author a.mueller
39 * @created 20.03.2008
40 * @version 1.0
41 */
42 @Component
43 public class BerlinModelRefDetailImport extends BerlinModelImportBase {
44 private static final Logger logger = Logger.getLogger(BerlinModelRefDetailImport.class);
45
46 public static final String NOM_REFDETAIL_NAMESPACE = "NomRefDetail";
47 public static final String BIBLIO_REFDETAIL_NAMESPACE = "BiblioRefDetail";
48 ReferenceFactory refFactory;
49
50
51
52 private int modCount = 1000;
53 private static final String pluralString = "ref-details";
54 private static final String dbTableName = "RefDetail";
55
56
57 public BerlinModelRefDetailImport(){
58 super(dbTableName, pluralString);
59 }
60
61
62 //type to count the references nomReferences that have been created and saved
63 private class RefCounter{
64 RefCounter() {nomRefCount = 0; biblioRefCount = 0;};
65 int nomRefCount;
66 int biblioRefCount;
67 public String toString(){return String.valueOf(nomRefCount) + "," +String.valueOf(biblioRefCount);};
68 }
69
70
71
72 /* (non-Javadoc)
73 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getIdQuery()
74 */
75 @Override
76 protected String getIdQuery(BerlinModelImportState state) {
77 String strQuery = " SELECT RefDetail.RefDetailId " +
78 " FROM RefDetail " +
79 " WHERE (RefDetail.PreliminaryFlag = 1)";
80 return strQuery;
81 }
82
83
84 /* (non-Javadoc)
85 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getRecordQuery(eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator)
86 */
87 @Override
88 protected String getRecordQuery(BerlinModelImportConfigurator config) {
89 String strQuery =
90 " SELECT RefDetail.*, Reference.RefYear " +
91 " FROM RefDetail " +
92 " INNER JOIN Reference ON Reference.RefId = RefDetail.RefFk " +
93 " WHERE (RefDetail.refDetailId IN (" + ID_LIST_TOKEN + ")) AND " +
94 " (RefDetail.PreliminaryFlag = 1)";
95 return strQuery;
96 }
97
98
99 /* (non-Javadoc)
100 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#doPartition(eu.etaxonomy.cdm.io.berlinModel.in.ResultSetPartitioner, eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportState)
101 */
102 public boolean doPartition(ResultSetPartitioner partitioner, BerlinModelImportState state) {
103 boolean success = true;
104 logger.info("start make " + getPluralString() + " ...");
105
106 BerlinModelImportConfigurator config = state.getConfig();
107 Map<Integer, Reference> biblioRefDetailsToSave = new HashMap<Integer, Reference>();
108 Map<Integer, Reference> nomRefDetailsToSave = new HashMap<Integer, Reference>();
109
110 ResultSet rs = partitioner.getResultSet();
111
112 try {
113 int i = 0;
114 RefCounter refCounter = new RefCounter();
115 while (rs.next()){
116
117 if ((i++ % modCount) == 0 && i!= 1 ){ logger.info("RefDetails handled: " + (i-1) );}
118 int refDetailId = rs.getInt("refDetailId");
119 String refYear = rs.getString("RefYear");
120
121 //nomRef
122 String fullNomRefCache = rs.getString("fullNomRefCache");
123 if ( CdmUtils.isNotEmpty(fullNomRefCache) ){
124 Reference genericReference = refFactory.newGeneric();
125 genericReference.setTitleCache(fullNomRefCache, true);
126 nomRefDetailsToSave.put(refDetailId, genericReference);
127 //year
128 genericReference.setDatePublished(ImportHelper.getDatePublished(refYear));
129 //refId, created, notes
130 doIdCreatedUpdatedNotes(state, genericReference, rs, refDetailId, NOM_REFDETAIL_NAMESPACE );
131 refCounter.nomRefCount++;
132 }
133
134 //biblioRef
135 String fullRefCache = rs.getString("fullRefCache");
136 if ( CdmUtils.isNotEmpty(fullRefCache) && ! fullRefCache.equals(fullNomRefCache)){
137 Reference genericReference = refFactory.newGeneric();
138 genericReference.setTitleCache(fullRefCache, true);
139 biblioRefDetailsToSave.put(refDetailId, genericReference);
140 //year
141 genericReference.setDatePublished(ImportHelper.getDatePublished(refYear));
142 //refId, created, notes
143 doIdCreatedUpdatedNotes(state, genericReference, rs, refDetailId, BIBLIO_REFDETAIL_NAMESPACE );
144 refCounter.biblioRefCount++;
145 }
146 }
147 //save and store in map
148 logger.info("Save nomenclatural preliminary references (" + refCounter.nomRefCount + ")");
149 partitioner.startDoSave();
150 Collection<Reference> col = nomRefDetailsToSave.values();
151 getReferenceService().save(col);
152 logger.info("Save bibliographical preliminary references (" + refCounter.biblioRefCount +")");
153 getReferenceService().save(biblioRefDetailsToSave.values());
154
155 //TODO
156 //SecondarySources
157 //IdInSource
158
159 } catch (SQLException e) {
160 logger.error("SQLException:" + e);
161 return false;
162 }
163 return success;
164 }
165
166
167
168 /* (non-Javadoc)
169 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#getRelatedObjectsForPartition(java.sql.ResultSet)
170 */
171 public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs) {
172 String nameSpace;
173 Class cdmClass;
174 Set<String> idSet;
175
176 Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<Object, Map<String, ? extends CdmBase>>();
177
178 //no related objects needed
179
180 return result;
181 }
182
183 /* (non-Javadoc)
184 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IoStateBase)
185 */
186 @Override
187 protected boolean doCheck(BerlinModelImportState state){
188 IOValidator<BerlinModelImportState> validator = new BerlinModelRefDetailImportValidator();
189 return validator.validate(state);
190 }
191
192
193 /* (non-Javadoc)
194 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
195 */
196 protected boolean isIgnore(BerlinModelImportState state){
197 DO_REFERENCES doReference = state.getConfig().getDoReferences();
198 return (doReference == IImportConfigurator.DO_REFERENCES.NONE || doReference == IImportConfigurator.DO_REFERENCES.CONCEPT_REFERENCES);
199 }
200
201 }