Project

General

Profile

Download (18 KB) Statistics
| Branch: | Tag: | Revision:
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
package eu.etaxonomy.taxeditor.io;
10

    
11
import java.io.File;
12
import java.io.InputStream;
13
import java.nio.file.Files;
14
import java.nio.file.Path;
15
import java.nio.file.Paths;
16
import java.util.List;
17
import java.util.UUID;
18

    
19
import org.apache.commons.io.IOUtils;
20
import org.eclipse.core.runtime.Assert;
21
import org.eclipse.core.runtime.IProgressMonitor;
22
import org.eclipse.core.runtime.IStatus;
23
import org.eclipse.core.runtime.Status;
24
import org.eclipse.core.runtime.jobs.Job;
25
import org.eclipse.swt.widgets.Display;
26
import org.eclipse.ui.PlatformUI;
27

    
28
import eu.etaxonomy.cdm.api.application.CdmApplicationState;
29
import eu.etaxonomy.cdm.api.application.ICdmRepository;
30
import eu.etaxonomy.cdm.common.monitor.IRemotingProgressMonitor;
31
import eu.etaxonomy.cdm.io.common.CdmDefaultImport;
32
import eu.etaxonomy.cdm.io.common.IImportConfigurator;
33
import eu.etaxonomy.cdm.io.common.IImportConfigurator.SOURCE_TYPE;
34
import eu.etaxonomy.cdm.io.common.ImportConfiguratorBase;
35
import eu.etaxonomy.cdm.io.common.ImportResult;
36
import eu.etaxonomy.cdm.io.descriptive.owl.in.StructureTreeOwlImportConfigurator;
37
import eu.etaxonomy.cdm.io.distribution.excelupdate.ExcelDistributionUpdateConfigurator;
38
import eu.etaxonomy.cdm.io.dwca.in.DwcaImportConfigurator;
39
import eu.etaxonomy.cdm.io.excel.taxa.NormalExplicitImportConfigurator;
40
import eu.etaxonomy.cdm.io.jaxb.JaxbImportConfigurator;
41
import eu.etaxonomy.cdm.io.reference.endnote.in.EndnoteImportConfigurator;
42
import eu.etaxonomy.cdm.io.sdd.in.SDDImportConfigurator;
43
import eu.etaxonomy.cdm.io.service.IIOService;
44
import eu.etaxonomy.cdm.io.specimen.abcd206.in.Abcd206ImportConfigurator;
45
import eu.etaxonomy.cdm.io.specimen.excel.in.SpecimenCdmExcelImportConfigurator;
46
import eu.etaxonomy.cdm.io.specimen.gbif.in.GbifImportConfigurator;
47
import eu.etaxonomy.cdm.io.specimen.gbif.in.GbifImportState;
48
import eu.etaxonomy.cdm.io.tcsxml.in.TcsXmlImportConfigurator;
49
import eu.etaxonomy.taxeditor.event.EventUtility;
50
import eu.etaxonomy.taxeditor.event.WorkbenchEventConstants;
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
 * @author n.hoffmann
61
 * @created Sep 11, 2009
62
 */
63
public class ImportManager extends AbstractIOManager<IImportConfigurator> implements IPostMoniteredOperationEnabled {
64

    
65
	String importSuccessMessage = "The import was successful.";
66
	String updateSuccessMessage = "The update was successful.";
67

    
68
	private ImportManager(ICdmRepository applicationConfiguration) {
69
		super(applicationConfiguration);
70
	}
71

    
72
	public static ImportManager NewInstance(
73
			ICdmRepository applicationConfiguration) {
74
		return new ImportManager(applicationConfiguration);
75
	}
76

    
77
	/**
78
	 * Use when importing data into the current application context
79
	 *
80
	 * @param configurator
81
	 *            a {@link eu.etaxonomy.cdm.io.common.IImportConfigurator}
82
	 *            object.
83
	 * @return a {@link org.eclipse.core.runtime.jobs.Job} object.
84
	 */
85
	@Override
86
	protected Job createIOJob(final IImportConfigurator configurator) {
87
		Assert.isNotNull(configurator, "Configuration may not be null");
88

    
89
		final Display display = Display.getDefault();
90

    
91
		Job job = new Job("Import: " + configurator.getClass().getSimpleName()) {
92

    
93
			@Override
94
			protected IStatus run(IProgressMonitor monitor) {
95
				monitor.beginTask("Importing data", 100);
96
				configurator.setProgressMonitor(CdmProgressMonitorAdapter
97
						.CreateSubMonitor(monitor, 70));
98

    
99
				monitor.worked(5);
100

    
101
				CdmDefaultImport<IImportConfigurator> importer = new CdmDefaultImport<>();
102
				importer.setCdmAppController(applicationConfiguration);
103
				monitor.worked(5);
104
				ImportResult importResult = null;
105
				try {
106
					importResult = importer.invoke(configurator);
107

    
108
					monitor.worked(80);
109
				} catch (RuntimeException e) {
110
					MessagingUtils.messageDialog(
111
							"Error importing data",
112
							this,
113
							"An error occurred while"
114
									+ "importing from source '"
115
									+ configurator.getSourceNameString()
116
									+ "'.\n"
117
									+ "Please check error log for details.", e);
118
				}
119

    
120
				monitor.worked(5);
121
				monitor.done();
122

    
123

    
124
				final StringBuilder reportText = new StringBuilder();
125
				if(importResult!=null){
126
				    List<byte[]> reports = importResult.getReports();
127
				    for (byte[] bs : reports) {
128
                        reportText.append(new String(bs));
129
                    }
130
				}
131
				display.asyncExec(new Runnable() {
132

    
133
					@Override
134
					public void run() {
135
                        // display reports with possibility to save
136
                        ReportTextDialog dialog = new ReportTextDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());
137
                        dialog.setTitle(configurator.getClass().getSimpleName()+" Report");
138
                        dialog.setReportText(reportText.toString());
139
                        dialog.open();
140

    
141
						CdmStore.getContextManager().notifyContextRefresh();
142

    
143
					}
144
				});
145

    
146
				return Status.OK_STATUS;
147
			}
148
		};
149

    
150
		return job;
151

    
152
	}
153

    
154
	public Job createIOServiceJob(IImportConfigurator configurator, InputStream is, SOURCE_TYPE type) {
155

    
156
	    try {
157
	        return createIOServiceJob(configurator, IOUtils.toByteArray(is), type);
158
	    } catch (Exception e) {
159
	        MessagingUtils.errorDialog("Error importing input stream",
160
	                this,
161
	                e.getMessage(),
162
	                TaxeditorStorePlugin.PLUGIN_ID,
163
	                e,
164
	                true);
165
	    }
166
	    return null;
167
	}
168

    
169
	public Job createIOServiceJob(IImportConfigurator configurator, File importFile, SOURCE_TYPE type) {
170
	    Path path = Paths.get(importFile.toURI());
171
	    try {
172
	        return createIOServiceJob(configurator, Files.readAllBytes(path), type);
173
	    } catch (Exception e) {
174
	        MessagingUtils.errorDialog("Error importing file",
175
	                this,
176
	                e.getMessage(),
177
	                TaxeditorStorePlugin.PLUGIN_ID,
178
	                e,
179
	                true);
180
	    }
181
	    return null;
182
	}
183

    
184
    public Job createIOServiceJob(final IImportConfigurator configurator, final byte[] data, final SOURCE_TYPE type) {
185
        Assert.isNotNull(configurator, "Configuration may not be null");
186
        final Display display = Display.getDefault();
187
        Job job = new Job("Import: " + configurator.getClass().getSimpleName()) {
188

    
189
            @Override
190
            protected IStatus run(IProgressMonitor monitor) {
191
                monitor.beginTask("Importing data", IProgressMonitor.UNKNOWN);
192
                IIOService ioService = CdmApplicationState.getIOService();
193

    
194
                ImportResult result = ioService.importData(configurator, data, type);
195

    
196
                monitor.done();
197

    
198
                display.asyncExec(new Runnable() {
199

    
200
                    @Override
201
                    public void run() {
202
                        CdmStore.getContextManager().notifyContextRefresh();
203
                    }
204
                });
205
                showResult(configurator.getClass().getSimpleName(), display, result, importSuccessMessage);
206
                return Status.OK_STATUS;
207
            }
208
        };
209

    
210
        return job;
211

    
212
    }
213

    
214
    public void runMoniteredOperation(IImportConfigurator configurator, InputStream is, SOURCE_TYPE type) {
215

    
216
        try {
217
            runMoniteredOperation(configurator, IOUtils.toByteArray(is), type);
218
        } catch (Exception e) {
219
            MessagingUtils.errorDialog("Error importing input stream",
220
                    this,
221
                    e.getMessage(),
222
                    TaxeditorStorePlugin.PLUGIN_ID,
223
                    e,
224
                    true);
225
        }
226

    
227
    }
228

    
229
    public void runMoniteredOperation(IImportConfigurator configurator, SOURCE_TYPE type) {
230
        byte[] data = new byte[1];
231
        try {
232
            runMoniteredOperation(configurator, data, type);
233
        } catch (Exception e) {
234
            MessagingUtils.errorDialog("Error importing input stream",
235
                    this,
236
                    e.getMessage(),
237
                    TaxeditorStorePlugin.PLUGIN_ID,
238
                    e,
239
                    true);
240
        }
241

    
242
    }
243

    
244
    public void runMoniteredOperation(IImportConfigurator configurator, File importFile, SOURCE_TYPE type) {
245
        Path path = Paths.get(importFile.toURI());
246
        try {
247
            runMoniteredOperation(configurator, Files.readAllBytes(path), type);
248

    
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(final IImportConfigurator configurator, final byte[] data, final SOURCE_TYPE type) {
261
        IIOService ioService = CdmApplicationState.getIOService();
262
        final UUID uuid = ioService.monitImportData(configurator, data, type);
263
        Display.getDefault().asyncExec(new Runnable() {
264
            @Override
265
            public void run() {
266
                AbstractUtility.executeMoniteredOperation("Import: " + configurator.getClass().getSimpleName(),
267
                        uuid,
268
                        1000,
269
                        false,
270
                        ImportManager.this,
271
                        null, true, true);
272
            }
273
        });
274

    
275
    }
276

    
277
	private IImportConfigurator getConfigurator(TYPE type) {
278
		Assert.isNotNull(type, "Type should not be null");
279

    
280
		switch (type) {
281
		case Jaxb:
282
			return JaxbImportConfigurator.NewInstance(null, null);
283
		case Tcs:
284
			return TcsXmlImportConfigurator.NewInstance(null, null);
285
		case Endnote:
286
			return EndnoteImportConfigurator.NewInstance(null, null);
287
		case Excel_Taxa:
288
			return NormalExplicitImportConfigurator.NewInstance(null, null,
289
					null, null);
290
		case Abcd:
291
			return Abcd206ImportConfigurator.NewInstance(null, null);
292
		case Sdd:
293
			return SDDImportConfigurator.NewInstance(null, null);
294
		case SpecimenCdmExcel:
295
			return SpecimenCdmExcelImportConfigurator.NewInstance(null, null);
296
		case SpecimenSearch:
297
		    return Abcd206ImportConfigurator.NewInstance(null, null);
298
		case Gbif:
299
		    return DwcaImportConfigurator.NewInstance(null, null);
300
		case Excel_Distribution:
301
            return ExcelDistributionUpdateConfigurator.NewInstance(null, null, null);
302
        case OWL:
303
            return StructureTreeOwlImportConfigurator.NewInstance(null);
304

    
305
		default:
306
			MessagingUtils.notImplementedMessage(this);
307
			throw new IllegalArgumentException("Import not supported yet");
308
		}
309
	}
310

    
311

    
312
	/**
313
	 * <p>
314
	 * JaxbConfigurator
315
	 * </p>
316
	 *
317
	 * @return a {@link eu.etaxonomy.cdm.io.jaxb.JaxbImportConfigurator} object.
318
	 */
319
	public final JaxbImportConfigurator JaxbConfigurator() {
320
		return (JaxbImportConfigurator) getConfigurator(TYPE.Jaxb);
321
	}
322

    
323
	/**
324
	 * <p>
325
	 * TcsConfigurator
326
	 * </p>
327
	 *
328
	 * @return a {@link eu.etaxonomy.cdm.io.tcsxml.in.TcsXmlImportConfigurator}
329
	 *         object.
330
	 */
331
	public final TcsXmlImportConfigurator TcsConfigurator() {
332
		return (TcsXmlImportConfigurator) getConfigurator(TYPE.Tcs);
333
	}
334

    
335
	/**
336
	 * <p>
337
	 * EndnoteConfigurator
338
	 * </p>
339
	 *
340
	 * @return a
341
	 *         {@link eu.etaxonomy.cdm.io.reference.endnote.in.EndnoteImportConfigurator}
342
	 *         object.
343
	 */
344
	public final EndnoteImportConfigurator EndnoteConfigurator() {
345
		return (EndnoteImportConfigurator) getConfigurator(TYPE.Endnote);
346
	}
347

    
348
	/**
349
	 * <p>
350
	 * NormalExplicitConfigurator
351
	 * </p>
352
	 *
353
	 * @return a
354
	 *         {@link eu.etaxonomy.cdm.io.excel.taxa.NormalExplicitImportConfigurator}
355
	 *         object.
356
	 */
357
	public final NormalExplicitImportConfigurator NormalExplicitConfigurator() {
358
		return (NormalExplicitImportConfigurator) getConfigurator(TYPE.Excel_Taxa);
359
	}
360

    
361
	/**
362
	 * <p>
363
	 * SddConfigurator
364
	 * </p>
365
	 *
366
	 * @return a {@link eu.etaxonomy.cdm.io.sdd.in.SDDImportConfigurator}
367
	 *         object.
368
	 */
369
	public final SDDImportConfigurator SddConfigurator() {
370
		return (SDDImportConfigurator) getConfigurator(TYPE.Sdd);
371
	}
372

    
373
	/**
374
	 * <p>
375
	 * AbcdConfigurator
376
	 * </p>
377
	 *
378
	 * @return a
379
	 *         {@link eu.etaxonomy.cdm.io.specimen.abcd206.in.Abcd206ImportConfigurator}
380
	 *         object.
381
	 */
382
	public final Abcd206ImportConfigurator AbcdConfigurator() {
383
		return (Abcd206ImportConfigurator) getConfigurator(TYPE.Abcd);
384
	}
385

    
386
	public SpecimenCdmExcelImportConfigurator SpecimenCdmExcelImportConfigurator() {
387
		return (SpecimenCdmExcelImportConfigurator) getConfigurator(TYPE.SpecimenCdmExcel);
388
	}
389

    
390
	public DwcaImportConfigurator DwcaImportConfigurator() {
391
		return (DwcaImportConfigurator) getConfigurator(TYPE.Gbif);
392
	}
393

    
394
	public final StructureTreeOwlImportConfigurator OwlImportConfigurator() {
395
	    return (StructureTreeOwlImportConfigurator) getConfigurator(TYPE.OWL);
396
	}
397

    
398

    
399
    /**
400
     * {@inheritDoc}
401
     */
402
    @Override
403
    public void postOperation(IRemotingProgressMonitor monitor) {
404
        Display.getDefault().asyncExec(new Runnable() {
405

    
406
            @Override
407
            public void run() {
408
                CdmStore.getContextManager().notifyContextRefresh();
409
            }
410
        });
411

    
412
    }
413

    
414
	public Job createIOServiceJob(final GbifImportConfigurator<GbifImportState, InputStream> configurator) {
415
		 Assert.isNotNull(configurator, "Configuration may not be null");
416
	        final Display display = Display.getDefault();
417
	        Job job = new Job("Import: " + " Dwca") {
418

    
419
	            @Override
420
	            protected IStatus run(IProgressMonitor monitor) {
421
	                monitor.beginTask("Importing data", IProgressMonitor.UNKNOWN);
422
	                IIOService ioService = CdmApplicationState.getIOService();
423

    
424
	                ImportResult result = ioService.importDataFromStream(configurator);
425
	                monitor.done();
426

    
427
//	                display.asyncExec(new Runnable() {
428
//
429
//	                    @Override
430
//	                    public void run() {
431
//	                        CdmStore.getContextManager().notifyContextRefresh();
432
//	                    }
433
//	                });
434
	                showResult("Gbif Import", display, result, importSuccessMessage);
435
	                return Status.OK_STATUS;
436
	            }
437
	        };
438

    
439
	        return job;
440

    
441
	}
442

    
443
	public Job createIOServiceJob(final Abcd206ImportConfigurator configurator) {
444
		 Assert.isNotNull(configurator, "Configuration may not be null");
445
	        final Display display = Display.getDefault();
446
	        Job job = new Job("Import: " + " Dwca") {
447

    
448
	            @Override
449
	            protected IStatus run(IProgressMonitor monitor) {
450
	                monitor.beginTask("Importing data", IProgressMonitor.UNKNOWN);
451
	                IIOService ioService = CdmApplicationState.getIOService();
452

    
453
	                ImportResult result = ioService.importDataFromStream(configurator);
454
	                monitor.done();
455

    
456
	                display.asyncExec(new Runnable() {
457

    
458
	                    @Override
459
	                    public void run() {
460
	                        CdmStore.getContextManager().notifyContextRefresh();
461
	                    }
462
	                });
463
	                showResult("Abcd Import", display, result, importSuccessMessage);
464
	                return Status.OK_STATUS;
465
	            }
466
	        };
467

    
468
	        return job;
469

    
470
	}
471

    
472
	public Job createIOServiceJob(
473
			final List<Abcd206ImportConfigurator> abcdConfigurators) {
474
		 Assert.isNotNull(abcdConfigurators, "Configuration may not be null");
475
	        final Display display = Display.getDefault();
476
	        Job job = new Job("Import: " + " Abcd") {
477

    
478
	            @Override
479
	            protected IStatus run(IProgressMonitor monitor) {
480
	                monitor.beginTask("Importing data", IProgressMonitor.UNKNOWN);
481
	                IIOService ioService = CdmApplicationState.getIOService();
482

    
483
	                ImportResult result = ioService.importDataFromStream(abcdConfigurators);
484
	                monitor.done();
485

    
486
	                display.asyncExec(new Runnable() {
487

    
488
	                    @Override
489
	                    public void run() {
490
	                        CdmStore.getContextManager().notifyContextRefresh();
491
	                    }
492
	                });
493
	                showResult("Abcd Import", display, result, importSuccessMessage);
494
	                EventUtility.postEvent(WorkbenchEventConstants.REFRESH_NAVIGATOR, true);
495

    
496

    
497
	                return Status.OK_STATUS;
498
	            }
499
	        };
500

    
501
	        return job;
502
	}
503

    
504
    public Job createIOServiceJob(final ImportConfiguratorBase configurator) {
505
        Assert.isNotNull(configurator, "Configuration may not be null");
506
        final Display display = Display.getDefault();
507

    
508
        Job job = new Job("Update: " + configurator.getClass().getSimpleName()) {
509

    
510
            @Override
511
            protected IStatus run(IProgressMonitor monitor) {
512
                monitor.beginTask("Updating data", IProgressMonitor.UNKNOWN);
513
                IIOService ioService = CdmApplicationState.getIOService();
514
                ImportResult importResult = null;
515
                if (configurator instanceof ExcelDistributionUpdateConfigurator){
516
                    ExcelDistributionUpdateConfigurator config = (ExcelDistributionUpdateConfigurator) configurator;
517
                    importResult =ioService.updateDistributionData(config);
518
                }
519

    
520
                monitor.done();
521
//                display.asyncExec(new Runnable() {
522
//
523
//                    @Override
524
//                    public void run() {
525
//                        CdmStore.getContextManager().notifyContextRefresh();
526
//                    }
527
//                });
528
                showResult(configurator.getClass().getSimpleName(), display, importResult, updateSuccessMessage);
529

    
530

    
531
                return Status.OK_STATUS;
532
            }
533

    
534

    
535
        };
536

    
537
        return job;
538

    
539
    }
540

    
541
    /**
542
     * @return
543
     */
544
    public ExcelDistributionUpdateConfigurator ExcelDistributionUpdateConfigurator() {
545
        return (ExcelDistributionUpdateConfigurator) getConfigurator(TYPE.Excel_Distribution);
546
    }
547

    
548

    
549

    
550

    
551

    
552

    
553

    
554
}
(3-3/3)