adapting to chages in CdmUtils
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / io / ImportManager.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.taxeditor.io;
11
12 import java.io.File;
13 import java.io.InputStream;
14 import java.nio.file.Files;
15 import java.nio.file.Path;
16 import java.nio.file.Paths;
17 import java.util.List;
18 import java.util.UUID;
19
20 import org.apache.commons.io.IOUtils;
21 import org.eclipse.core.runtime.Assert;
22 import org.eclipse.core.runtime.IProgressMonitor;
23 import org.eclipse.core.runtime.IStatus;
24 import org.eclipse.core.runtime.Status;
25 import org.eclipse.core.runtime.jobs.Job;
26 import org.eclipse.swt.widgets.Display;
27 import org.eclipse.ui.PlatformUI;
28
29 import eu.etaxonomy.cdm.api.application.CdmApplicationState;
30 import eu.etaxonomy.cdm.api.application.ICdmRepository;
31 import eu.etaxonomy.cdm.common.monitor.IRemotingProgressMonitor;
32 import eu.etaxonomy.cdm.io.common.CacheUpdaterConfigurator;
33 import eu.etaxonomy.cdm.io.common.CdmDefaultImport;
34 import eu.etaxonomy.cdm.io.common.IImportConfigurator;
35 import eu.etaxonomy.cdm.io.common.IImportConfigurator.SOURCE_TYPE;
36 import eu.etaxonomy.cdm.io.common.ImportConfiguratorBase;
37 import eu.etaxonomy.cdm.io.common.ImportResult;
38 import eu.etaxonomy.cdm.io.common.SortIndexUpdaterConfigurator;
39 import eu.etaxonomy.cdm.io.distribution.excelupdate.ExcelDistributionUpdateConfigurator;
40 import eu.etaxonomy.cdm.io.dwca.in.DwcaImportConfigurator;
41 import eu.etaxonomy.cdm.io.excel.taxa.NormalExplicitImportConfigurator;
42 import eu.etaxonomy.cdm.io.jaxb.JaxbImportConfigurator;
43 import eu.etaxonomy.cdm.io.reference.endnote.in.EndnoteImportConfigurator;
44 import eu.etaxonomy.cdm.io.sdd.in.SDDImportConfigurator;
45 import eu.etaxonomy.cdm.io.service.IIOService;
46 import eu.etaxonomy.cdm.io.specimen.abcd206.in.Abcd206ImportConfigurator;
47 import eu.etaxonomy.cdm.io.specimen.excel.in.SpecimenCdmExcelImportConfigurator;
48 import eu.etaxonomy.cdm.io.specimen.gbif.in.GbifImportConfigurator;
49 import eu.etaxonomy.cdm.io.specimen.gbif.in.GbifImportState;
50 import eu.etaxonomy.cdm.io.tcsxml.in.TcsXmlImportConfigurator;
51 import eu.etaxonomy.taxeditor.model.AbstractUtility;
52 import eu.etaxonomy.taxeditor.model.CdmProgressMonitorAdapter;
53 import eu.etaxonomy.taxeditor.model.MessagingUtils;
54 import eu.etaxonomy.taxeditor.operation.IPostMoniteredOperationEnabled;
55 import eu.etaxonomy.taxeditor.store.CdmStore;
56 import eu.etaxonomy.taxeditor.store.internal.TaxeditorStorePlugin;
57 import eu.etaxonomy.taxeditor.ui.dialog.ReportTextDialog;
58
59 /**
60 * <p>
61 * ImportHandler class.
62 * </p>
63 *
64 * @author n.hoffmann
65 * @created Sep 11, 2009
66 * @version 1.0
67 */
68 public class ImportManager extends AbstractIOManager<IImportConfigurator> implements IPostMoniteredOperationEnabled {
69
70 /**
71 * @param applicationConfiguration
72 */
73 private ImportManager(ICdmRepository applicationConfiguration) {
74 super(applicationConfiguration);
75 }
76
77 /**
78 * <p>
79 * NewInstance
80 * </p>
81 *
82 * @param applicationConfiguration
83 * a
84 * {@link eu.etaxonomy.cdm.api.application.CdmApplicationController}
85 * object.
86 * @return a {@link eu.etaxonomy.taxeditor.io.ImportManager} object.
87 */
88 public static ImportManager NewInstance(
89 ICdmRepository applicationConfiguration) {
90 return new ImportManager(applicationConfiguration);
91 }
92
93 /**
94 * Use when importing data into the current application context
95 *
96 * @param configurator
97 * a {@link eu.etaxonomy.cdm.io.common.IImportConfigurator}
98 * object.
99 * @return a {@link org.eclipse.core.runtime.jobs.Job} object.
100 */
101 @Override
102 protected Job createIOJob(final IImportConfigurator configurator) {
103 Assert.isNotNull(configurator, "Configuration may not be null");
104
105 final Display display = Display.getDefault();
106
107 Job job = new Job("Import: " + configurator.getClass().getSimpleName()) {
108
109 @Override
110 protected IStatus run(IProgressMonitor monitor) {
111 monitor.beginTask("Importing data", 100);
112 configurator.setProgressMonitor(CdmProgressMonitorAdapter
113 .CreateSubMonitor(monitor, 70));
114
115 monitor.worked(5);
116
117 CdmDefaultImport<IImportConfigurator> importer = new CdmDefaultImport<IImportConfigurator>();
118 importer.setCdmAppController(applicationConfiguration);
119 monitor.worked(5);
120 ImportResult importResult = null;
121 try {
122 importResult = importer.invoke(configurator);
123
124 monitor.worked(80);
125 } catch (RuntimeException e) {
126 MessagingUtils.messageDialog(
127 "Error importing data",
128 this,
129 "An error occured while"
130 + "importing from source '"
131 + configurator.getSourceNameString()
132 + "'.\n"
133 + "Please check error log for details.", e);
134 }
135
136 monitor.worked(5);
137 monitor.done();
138
139
140 final StringBuilder reportText = new StringBuilder();
141 if(importResult!=null){
142 List<byte[]> reports = importResult.getReports();
143 for (byte[] bs : reports) {
144 reportText.append(new String(bs));
145 }
146 }
147 display.asyncExec(new Runnable() {
148
149 @Override
150 public void run() {
151 // display reports with possibility to save
152 ReportTextDialog dialog = new ReportTextDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());
153 dialog.setTitle(configurator.getClass().getSimpleName()+" Report");
154 dialog.setReportText(reportText.toString());
155 dialog.open();
156 CdmStore.getContextManager().notifyContextRefresh();
157 }
158 });
159
160 return Status.OK_STATUS;
161 }
162 };
163
164 return job;
165
166 }
167
168 public Job createIOServiceJob(IImportConfigurator configurator, InputStream is, SOURCE_TYPE type) {
169
170 try {
171 return createIOServiceJob(configurator, IOUtils.toByteArray(is), type);
172 } catch (Exception e) {
173 MessagingUtils.errorDialog("Error importing input stream",
174 this,
175 e.getMessage(),
176 TaxeditorStorePlugin.PLUGIN_ID,
177 e,
178 true);
179 }
180 return null;
181 }
182
183 public Job createIOServiceJob(IImportConfigurator configurator, File importFile, SOURCE_TYPE type) {
184 Path path = Paths.get(importFile.toURI());
185 try {
186 return createIOServiceJob(configurator, Files.readAllBytes(path), type);
187 } catch (Exception e) {
188 MessagingUtils.errorDialog("Error importing file",
189 this,
190 e.getMessage(),
191 TaxeditorStorePlugin.PLUGIN_ID,
192 e,
193 true);
194 }
195 return null;
196 }
197
198 public Job createIOServiceJob(final IImportConfigurator configurator, final byte[] data, final SOURCE_TYPE type) {
199 Assert.isNotNull(configurator, "Configuration may not be null");
200 final Display display = Display.getDefault();
201 Job job = new Job("Import: " + configurator.getClass().getSimpleName()) {
202
203 @Override
204 protected IStatus run(IProgressMonitor monitor) {
205 monitor.beginTask("Importing data", IProgressMonitor.UNKNOWN);
206 IIOService ioService = CdmApplicationState.getIOService();
207
208 ioService.importData(configurator, data, type);
209
210 monitor.done();
211
212 display.asyncExec(new Runnable() {
213
214 @Override
215 public void run() {
216 CdmStore.getContextManager().notifyContextRefresh();
217 }
218 });
219
220 return Status.OK_STATUS;
221 }
222 };
223
224 return job;
225
226 }
227
228 public void runMoniteredOperation(IImportConfigurator configurator, InputStream is, SOURCE_TYPE type) {
229
230 try {
231 runMoniteredOperation(configurator, IOUtils.toByteArray(is), type);
232 } catch (Exception e) {
233 MessagingUtils.errorDialog("Error importing input stream",
234 this,
235 e.getMessage(),
236 TaxeditorStorePlugin.PLUGIN_ID,
237 e,
238 true);
239 }
240
241 }
242
243 public void runMoniteredOperation(IImportConfigurator configurator, SOURCE_TYPE type) {
244 byte[] data = new byte[1];
245 try {
246 runMoniteredOperation(configurator, data, type);
247 } catch (Exception e) {
248 MessagingUtils.errorDialog("Error importing input stream",
249 this,
250 e.getMessage(),
251 TaxeditorStorePlugin.PLUGIN_ID,
252 e,
253 true);
254 }
255
256 }
257
258 public void runMoniteredOperation(IImportConfigurator configurator, File importFile, SOURCE_TYPE type) {
259 Path path = Paths.get(importFile.toURI());
260 try {
261 runMoniteredOperation(configurator, Files.readAllBytes(path), type);
262 } catch (Exception e) {
263 MessagingUtils.errorDialog("Error importing input stream",
264 this,
265 e.getMessage(),
266 TaxeditorStorePlugin.PLUGIN_ID,
267 e,
268 true);
269 }
270
271 }
272
273 public void runMoniteredOperation(final IImportConfigurator configurator, final byte[] data, final SOURCE_TYPE type) {
274 IIOService ioService = CdmApplicationState.getIOService();
275 final UUID uuid = ioService.monitImportData(configurator, data, type);
276 Display.getDefault().asyncExec(new Runnable() {
277 @Override
278 public void run() {
279 AbstractUtility.executeMoniteredOperation("Import: " + configurator.getClass().getSimpleName(),
280 uuid,
281 1000,
282 false,
283 ImportManager.this,
284 null);
285 }
286 });
287
288 }
289
290 private IImportConfigurator getConfigurator(TYPE type) {
291 Assert.isNotNull(type, "Type should not be null");
292
293 switch (type) {
294 case Jaxb:
295 return JaxbImportConfigurator.NewInstance(null, null);
296 case Tcs:
297 return TcsXmlImportConfigurator.NewInstance(null, null);
298 case Endnote:
299 return EndnoteImportConfigurator.NewInstance(null, null);
300 case Excel_Taxa:
301 return NormalExplicitImportConfigurator.NewInstance(null, null,
302 null, null);
303 case Abcd:
304 return Abcd206ImportConfigurator.NewInstance(null, null);
305 case Sdd:
306 return SDDImportConfigurator.NewInstance(null, null);
307 case SpecimenCdmExcel:
308 return SpecimenCdmExcelImportConfigurator.NewInstance(null, null);
309 case SpecimenSearch:
310 return Abcd206ImportConfigurator.NewInstance(null, null);
311 case Gbif:
312 return DwcaImportConfigurator.NewInstance(null, null);
313 case Excel_Distribution:
314 return ExcelDistributionUpdateConfigurator.NewInstance(null, null, null);
315 default:
316 MessagingUtils.notImplementedMessage(this);
317 throw new IllegalArgumentException("Import not supported yet");
318 }
319 }
320
321
322 /**
323 * <p>
324 * JaxbConfigurator
325 * </p>
326 *
327 * @return a {@link eu.etaxonomy.cdm.io.jaxb.JaxbImportConfigurator} object.
328 */
329 public final JaxbImportConfigurator JaxbConfigurator() {
330 return (JaxbImportConfigurator) getConfigurator(TYPE.Jaxb);
331 }
332
333 /**
334 * <p>
335 * TcsConfigurator
336 * </p>
337 *
338 * @return a {@link eu.etaxonomy.cdm.io.tcsxml.in.TcsXmlImportConfigurator}
339 * object.
340 */
341 public final TcsXmlImportConfigurator TcsConfigurator() {
342 return (TcsXmlImportConfigurator) getConfigurator(TYPE.Tcs);
343 }
344
345 /**
346 * <p>
347 * EndnoteConfigurator
348 * </p>
349 *
350 * @return a
351 * {@link eu.etaxonomy.cdm.io.reference.endnote.in.EndnoteImportConfigurator}
352 * object.
353 */
354 public final EndnoteImportConfigurator EndnoteConfigurator() {
355 return (EndnoteImportConfigurator) getConfigurator(TYPE.Endnote);
356 }
357
358 /**
359 * <p>
360 * NormalExplicitConfigurator
361 * </p>
362 *
363 * @return a
364 * {@link eu.etaxonomy.cdm.io.excel.taxa.NormalExplicitImportConfigurator}
365 * object.
366 */
367 public final NormalExplicitImportConfigurator NormalExplicitConfigurator() {
368 return (NormalExplicitImportConfigurator) getConfigurator(TYPE.Excel_Taxa);
369 }
370
371 /**
372 * <p>
373 * SddConfigurator
374 * </p>
375 *
376 * @return a {@link eu.etaxonomy.cdm.io.sdd.in.SDDImportConfigurator}
377 * object.
378 */
379 public final SDDImportConfigurator SddConfigurator() {
380 return (SDDImportConfigurator) getConfigurator(TYPE.Sdd);
381 }
382
383 /**
384 * <p>
385 * AbcdConfigurator
386 * </p>
387 *
388 * @return a
389 * {@link eu.etaxonomy.cdm.io.specimen.abcd206.in.Abcd206ImportConfigurator}
390 * object.
391 */
392 public final Abcd206ImportConfigurator AbcdConfigurator() {
393 return (Abcd206ImportConfigurator) getConfigurator(TYPE.Abcd);
394 }
395
396 public SpecimenCdmExcelImportConfigurator SpecimenCdmExcelImportConfigurator() {
397 return (SpecimenCdmExcelImportConfigurator) getConfigurator(TYPE.SpecimenCdmExcel);
398 }
399
400 public DwcaImportConfigurator DwcaImportConfigurator() {
401 return (DwcaImportConfigurator) getConfigurator(TYPE.Gbif);
402 }
403
404
405 /**
406 * {@inheritDoc}
407 */
408 @Override
409 public void postOperation(IRemotingProgressMonitor monitor) {
410 Display.getDefault().asyncExec(new Runnable() {
411
412 @Override
413 public void run() {
414 CdmStore.getContextManager().notifyContextRefresh();
415 }
416 });
417
418 }
419
420 public Job createIOServiceJob(final GbifImportConfigurator<GbifImportState, InputStream> configurator) {
421 Assert.isNotNull(configurator, "Configuration may not be null");
422 final Display display = Display.getDefault();
423 Job job = new Job("Import: " + " Dwca") {
424
425 @Override
426 protected IStatus run(IProgressMonitor monitor) {
427 monitor.beginTask("Importing data", IProgressMonitor.UNKNOWN);
428 IIOService ioService = CdmApplicationState.getIOService();
429
430 ImportResult result = ioService.importDataFromStream(configurator);
431 monitor.done();
432
433 // display.asyncExec(new Runnable() {
434 //
435 // @Override
436 // public void run() {
437 // CdmStore.getContextManager().notifyContextRefresh();
438 // }
439 // });
440
441 return Status.OK_STATUS;
442 }
443 };
444
445 return job;
446
447 }
448
449 public Job createIOServiceJob(final Abcd206ImportConfigurator configurator) {
450 Assert.isNotNull(configurator, "Configuration may not be null");
451 final Display display = Display.getDefault();
452 Job job = new Job("Import: " + " Dwca") {
453
454 @Override
455 protected IStatus run(IProgressMonitor monitor) {
456 monitor.beginTask("Importing data", IProgressMonitor.UNKNOWN);
457 IIOService ioService = CdmApplicationState.getIOService();
458
459 ImportResult result = ioService.importDataFromStream(configurator);
460 monitor.done();
461
462 display.asyncExec(new Runnable() {
463
464 @Override
465 public void run() {
466 CdmStore.getContextManager().notifyContextRefresh();
467 }
468 });
469
470 return Status.OK_STATUS;
471 }
472 };
473
474 return job;
475
476 }
477
478 public Job createIOServiceJob(
479 final List<Abcd206ImportConfigurator> abcdConfigurators) {
480 Assert.isNotNull(abcdConfigurators, "Configuration may not be null");
481 final Display display = Display.getDefault();
482 Job job = new Job("Import: " + " Dwca") {
483
484 @Override
485 protected IStatus run(IProgressMonitor monitor) {
486 monitor.beginTask("Importing data", IProgressMonitor.UNKNOWN);
487 IIOService ioService = CdmApplicationState.getIOService();
488
489 ImportResult result = ioService.importDataFromStream(abcdConfigurators);
490 monitor.done();
491
492 display.asyncExec(new Runnable() {
493
494 @Override
495 public void run() {
496 CdmStore.getContextManager().notifyContextRefresh();
497 }
498 });
499
500 return Status.OK_STATUS;
501 }
502 };
503
504 return job;
505 }
506
507 public Job createIOServiceJob(final ImportConfiguratorBase configurator) {
508 Assert.isNotNull(configurator, "Configuration may not be null");
509 final Display display = Display.getDefault();
510 Job job = new Job("Update: " + configurator.getClass().getSimpleName()) {
511
512 @Override
513 protected IStatus run(IProgressMonitor monitor) {
514 monitor.beginTask("Updating data", IProgressMonitor.UNKNOWN);
515 IIOService ioService = CdmApplicationState.getIOService();
516 if (configurator instanceof SortIndexUpdaterConfigurator){
517 SortIndexUpdaterConfigurator config = (SortIndexUpdaterConfigurator)configurator;
518 ioService.updateSortIndex(config);
519 } else if (configurator instanceof CacheUpdaterConfigurator){
520 CacheUpdaterConfigurator config = (CacheUpdaterConfigurator) configurator;
521 ioService.updateCaches(config);
522 } else if (configurator instanceof ExcelDistributionUpdateConfigurator){
523 ExcelDistributionUpdateConfigurator config = (ExcelDistributionUpdateConfigurator) configurator;
524 ioService.updateDistributionData(config);
525 }
526
527 monitor.done();
528
529 display.asyncExec(new Runnable() {
530
531 @Override
532 public void run() {
533 CdmStore.getContextManager().notifyContextRefresh();
534 }
535 });
536
537 return Status.OK_STATUS;
538 }
539 };
540
541 return job;
542
543 }
544
545 /**
546 * @return
547 */
548 public ExcelDistributionUpdateConfigurator ExcelDistributionUpdateConfigurator() {
549 return (ExcelDistributionUpdateConfigurator) getConfigurator(TYPE.Excel_Distribution);
550 }
551
552
553
554
555
556 }