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