Project

General

Profile

Download (18.2 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

    
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
}
(3-3/3)