1
2
3
4
5
6
7
8
9 package eu.etaxonomy.cdm.io.berlinModel.in;
10
11 import java.sql.ResultSet;
12 import java.sql.SQLException;
13 import java.util.Collection;
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.common.CdmUtils;
23 import eu.etaxonomy.cdm.io.berlinModel.in.validation.BerlinModelAuthorTeamImportValidator;
24 import eu.etaxonomy.cdm.io.common.IOValidator;
25 import eu.etaxonomy.cdm.io.common.ResultSetPartitioner;
26 import eu.etaxonomy.cdm.io.common.Source;
27 import eu.etaxonomy.cdm.model.agent.Person;
28 import eu.etaxonomy.cdm.model.agent.Team;
29 import eu.etaxonomy.cdm.model.common.CdmBase;
30
31
32
33
34
35
36
37 @Component
38 public class BerlinModelAuthorTeamImport extends BerlinModelImportBase {
39 private static final Logger logger = Logger.getLogger(BerlinModelAuthorTeamImport.class);
40
41 public static final String NAMESPACE = "AuthorTeam";
42
43 private static int modCount = 1000;
44 private static final String pluralString = "AuthorTeams";
45 private static final String dbTableName = "AuthorTeam";
46
47
48 private ResultSet rsSequence;
49 private Source source;
50
51 public BerlinModelAuthorTeamImport(){
52 super();
53 }
54
55
56 protected boolean doInvoke(BerlinModelImportState state){
57 BerlinModelImportConfigurator config = state.getConfig();
58 source = config.getSource();
59
60 logger.info("start make " + pluralString + " ...");
61 boolean success = true ;
62
63
64
65 String strIdQuery = getIdQuery();
66
67 String strRecordQuery = getRecordQuery(config);
68 String strQuerySequence =
69 " SELECT * " +
70 " FROM AuthorTeamSequence " +
71 " ORDER By authorTeamFk, Sequence ";
72 rsSequence = source.getResultSet(strQuerySequence) ;
73
74 int recordsPerTransaction = config.getRecordsPerTransaction();
75 try{
76 ResultSetPartitioner partitioner = ResultSetPartitioner.NewInstance(source, strIdQuery, strRecordQuery, recordsPerTransaction);
77 while (partitioner.nextPartition()){
78 partitioner.doPartition(this, state);
79 }
80 } catch (SQLException e) {
81 logger.error("SQLException:" + e);
82 return false;
83 }
84
85
86 logger.info("end make " + pluralString + " ... " + getSuccessString(success));
87 return success;
88 }
89
90 protected String getIdQuery(){
91 String idQuery =
92 " SELECT authorTeamId " +
93 " FROM AuthorTeam " +
94 " ORDER BY authorTeamId ";
95 return idQuery;
96 }
97
98
99
100
101
102 @Override
103 protected String getRecordQuery(BerlinModelImportConfigurator config) {
104 String strRecordQuery =
105 " SELECT * " +
106 " FROM AuthorTeam " +
107 " WHERE authorTeamId IN ( " + ID_LIST_TOKEN + " )" +
108 " ORDER By authorTeamId ";
109 return strRecordQuery;
110 }
111
112
113
114
115
116 public boolean doPartition(ResultSetPartitioner partitioner, BerlinModelImportState state) {
117 boolean success = true ;
118 BerlinModelImportConfigurator config = state.getConfig();
119 Set<Team> teamsToSave = new HashSet<Team>();
120 Map<String, Person> personMap = (Map<String, Person>) partitioner.getObjectMap(BerlinModelAuthorImport.NAMESPACE);
121
122 ResultSet rs = partitioner.getResultSet();
123
124 try{
125 while (rs.next()){
126 try{
127
128
129
130 int teamId = rs.getInt("AuthorTeamId");
131 if (teamId == 0 && config.isIgnore0AuthorTeam()){
132 continue;
133 }
134
135 Team team = Team.NewInstance();
136
137 Boolean preliminaryFlag = rs.getBoolean("PreliminaryFlag");
138 String authorTeamCache = rs.getString("AuthorTeamCache");
139 String fullAuthorTeamCache = rs.getString("FullAuthorTeamCache");
140 if (CdmUtils.isEmpty(fullAuthorTeamCache)){
141 fullAuthorTeamCache = authorTeamCache;
142 }
143 team.setTitleCache(fullAuthorTeamCache, preliminaryFlag);
144 team.setNomenclaturalTitle(authorTeamCache, preliminaryFlag);
145
146 success &= makeSequence(team, teamId, rsSequence, personMap);
147 if (team.getTeamMembers().size()== 0 && preliminaryFlag == false){
148 team.setProtectedTitleCache(true);
149 team.setProtectedNomenclaturalTitleCache(true);
150 }
151
152
153 doIdCreatedUpdatedNotes(state, team, rs, teamId, NAMESPACE);
154
155 teamsToSave.add(team);
156 }catch(Exception ex){
157 logger.error(ex.getMessage());
158 ex.printStackTrace();
159 success = false;
160 }
161 }
162 } catch (SQLException e) {
163 logger.error("SQLException:" + e);
164 return false;
165 }
166
167
168 getAgentService().save((Collection)teamsToSave);
169
170 return success;
171 }
172
173
174
175
176 public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs) {
177 String nameSpace;
178 Class cdmClass;
179 Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<Object, Map<String, ? extends CdmBase>>();
180
181
182 Set<String> idInSourceList = makeAuthorIdList(rs);
183 nameSpace = BerlinModelAuthorImport.NAMESPACE;
184 cdmClass = Person.class;
185 Map<String, Person> personMap = (Map<String, Person>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idInSourceList, nameSpace);
186 result.put(nameSpace, personMap);
187
188 return result;
189 }
190
191
192
193
194
195
196
197 private Set<String> makeAuthorIdList(ResultSet rs) {
198 Set<String> result = new HashSet<String>();
199
200 String authorTeamIdList = "";
201 try {
202 while (rs.next()){
203 int id = rs.getInt("AuthorTeamId");
204 authorTeamIdList = CdmUtils.concat(",", authorTeamIdList, String.valueOf(id));
205 }
206
207 String strQuerySequence =
208 " SELECT DISTINCT authorFk " +
209 " FROM AuthorTeamSequence " +
210 " WHERE authorTeamFk IN (@) ";
211 strQuerySequence = strQuerySequence.replace("@", authorTeamIdList);
212
213 rs = source.getResultSet(strQuerySequence) ;
214 while (rs.next()){
215 int authorFk = rs.getInt("authorFk");
216 result.add(String.valueOf(authorFk));
217 }
218 } catch (SQLException e) {
219 throw new RuntimeException(e);
220 }
221 return result;
222 }
223
224 private boolean makeSequence(Team team, int teamId, ResultSet rsSequence, Map<String, Person> personMap){
225 try {
226 if (rsSequence.isBeforeFirst()){
227 rsSequence.next();
228 }
229 if (rsSequence.isAfterLast()){
230 return true;
231 }
232 int sequenceTeamFk;
233 try {
234 sequenceTeamFk = rsSequence.getInt("AuthorTeamFk");
235 } catch (SQLException e) {
236 if (rsSequence.next() == false){
237 return true;
238 }else{
239 throw e;
240 }
241 }
242 while (sequenceTeamFk < teamId){
243 logger.warn("Sequence team FK is smaller then team ID. Some teams for a sequence may not be available");
244 rsSequence.next();
245 sequenceTeamFk = rsSequence.getInt("AuthorTeamFk");
246 }
247 while (sequenceTeamFk == teamId){
248 int authorFk = rsSequence.getInt("AuthorFk");
249 Person author = personMap.get(String.valueOf(authorFk));
250 if (author != null){
251 team.addTeamMember(author);
252 }else{
253 logger.error("Author " + authorFk + " was not found for team " + teamId);
254 }
255 if (rsSequence.next()){
256 sequenceTeamFk = rsSequence.getInt("AuthorTeamFk");
257 }else{
258 break;
259 }
260 }
261 return true;
262 } catch (SQLException e) {
263 e.printStackTrace();
264 return false;
265 }
266 }
267
268
269
270
271
272 @Override
273 protected boolean doCheck(BerlinModelImportState state){
274 IOValidator<BerlinModelImportState> validator = new BerlinModelAuthorTeamImportValidator();
275 return validator.validate(state);
276 }
277
278
279
280
281
282 @Override
283 protected String getTableName() {
284 return dbTableName;
285 }
286
287
288
289
290 @Override
291 public String getPluralString() {
292 return pluralString;
293 }
294
295
296
297
298
299 protected boolean isIgnore(BerlinModelImportState state){
300 return ! state.getConfig().isDoAuthors();
301 }
302
303
304
305 }