Project

General

Profile

Download (19.8 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.apache.commons.lang.StringUtils;
22
import org.eclipse.core.runtime.Assert;
23
import org.eclipse.core.runtime.IProgressMonitor;
24
import org.eclipse.core.runtime.IStatus;
25
import org.eclipse.core.runtime.Status;
26
import org.eclipse.core.runtime.jobs.Job;
27
import org.eclipse.swt.widgets.Display;
28
import org.eclipse.ui.PlatformUI;
29

    
30
import eu.etaxonomy.cdm.api.application.CdmApplicationState;
31
import eu.etaxonomy.cdm.api.application.ICdmRepository;
32
import eu.etaxonomy.cdm.common.monitor.IRemotingProgressMonitor;
33
import eu.etaxonomy.cdm.io.common.CacheUpdaterConfigurator;
34
import eu.etaxonomy.cdm.io.common.CdmDefaultImport;
35
import eu.etaxonomy.cdm.io.common.IImportConfigurator;
36
import eu.etaxonomy.cdm.io.common.IImportConfigurator.SOURCE_TYPE;
37
import eu.etaxonomy.cdm.io.common.ImportConfiguratorBase;
38
import eu.etaxonomy.cdm.io.common.ImportResult;
39
import eu.etaxonomy.cdm.io.common.SortIndexUpdaterConfigurator;
40
import eu.etaxonomy.cdm.io.distribution.excelupdate.ExcelDistributionUpdateConfigurator;
41
import eu.etaxonomy.cdm.io.dwca.in.DwcaImportConfigurator;
42
import eu.etaxonomy.cdm.io.excel.taxa.NormalExplicitImportConfigurator;
43
import eu.etaxonomy.cdm.io.jaxb.JaxbImportConfigurator;
44
import eu.etaxonomy.cdm.io.reference.endnote.in.EndnoteImportConfigurator;
45
import eu.etaxonomy.cdm.io.sdd.in.SDDImportConfigurator;
46
import eu.etaxonomy.cdm.io.service.IIOService;
47
import eu.etaxonomy.cdm.io.specimen.abcd206.in.Abcd206ImportConfigurator;
48
import eu.etaxonomy.cdm.io.specimen.excel.in.SpecimenCdmExcelImportConfigurator;
49
import eu.etaxonomy.cdm.io.specimen.gbif.in.GbifImportConfigurator;
50
import eu.etaxonomy.cdm.io.specimen.gbif.in.GbifImportState;
51
import eu.etaxonomy.cdm.io.tcsxml.in.TcsXmlImportConfigurator;
52
import eu.etaxonomy.taxeditor.model.AbstractUtility;
53
import eu.etaxonomy.taxeditor.model.CdmProgressMonitorAdapter;
54
import eu.etaxonomy.taxeditor.model.MessagingUtils;
55
import eu.etaxonomy.taxeditor.operation.IPostMoniteredOperationEnabled;
56
import eu.etaxonomy.taxeditor.store.CdmStore;
57
import eu.etaxonomy.taxeditor.store.internal.TaxeditorStorePlugin;
58
import eu.etaxonomy.taxeditor.ui.dialog.ReportTextDialog;
59

    
60
/**
61
 * <p>
62
 * ImportHandler class.
63
 * </p>
64
 *
65
 * @author n.hoffmann
66
 * @created Sep 11, 2009
67
 * @version 1.0
68
 */
69
public class ImportManager extends AbstractIOManager<IImportConfigurator> implements IPostMoniteredOperationEnabled {
70

    
71
	/**
72
	 * @param applicationConfiguration
73
	 */
74
	private ImportManager(ICdmRepository applicationConfiguration) {
75
		super(applicationConfiguration);
76
	}
77

    
78
	/**
79
	 * <p>
80
	 * NewInstance
81
	 * </p>
82
	 *
83
	 * @param applicationConfiguration
84
	 *            a
85
	 *            {@link eu.etaxonomy.cdm.api.application.CdmApplicationController}
86
	 *            object.
87
	 * @return a {@link eu.etaxonomy.taxeditor.io.ImportManager} object.
88
	 */
89
	public static ImportManager NewInstance(
90
			ICdmRepository applicationConfiguration) {
91
		return new ImportManager(applicationConfiguration);
92
	}
93

    
94
	/**
95
	 * Use when importing data into the current application context
96
	 *
97
	 * @param configurator
98
	 *            a {@link eu.etaxonomy.cdm.io.common.IImportConfigurator}
99
	 *            object.
100
	 * @return a {@link org.eclipse.core.runtime.jobs.Job} object.
101
	 */
102
	@Override
103
	protected Job createIOJob(final IImportConfigurator configurator) {
104
		Assert.isNotNull(configurator, "Configuration may not be null");
105

    
106
		final Display display = Display.getDefault();
107

    
108
		Job job = new Job("Import: " + configurator.getClass().getSimpleName()) {
109

    
110
			@Override
111
			protected IStatus run(IProgressMonitor monitor) {
112
				monitor.beginTask("Importing data", 100);
113
				configurator.setProgressMonitor(CdmProgressMonitorAdapter
114
						.CreateSubMonitor(monitor, 70));
115

    
116
				monitor.worked(5);
117

    
118
				CdmDefaultImport<IImportConfigurator> importer = new CdmDefaultImport<IImportConfigurator>();
119
				importer.setCdmAppController(applicationConfiguration);
120
				monitor.worked(5);
121
				ImportResult importResult = null;
122
				try {
123
					importResult = importer.invoke(configurator);
124

    
125
					monitor.worked(80);
126
				} catch (RuntimeException e) {
127
					MessagingUtils.messageDialog(
128
							"Error importing data",
129
							this,
130
							"An error occured while"
131
									+ "importing from source '"
132
									+ configurator.getSourceNameString()
133
									+ "'.\n"
134
									+ "Please check error log for details.", e);
135
				}
136

    
137
				monitor.worked(5);
138
				monitor.done();
139

    
140

    
141
				final StringBuilder reportText = new StringBuilder();
142
				if(importResult!=null){
143
				    List<byte[]> reports = importResult.getReports();
144
				    for (byte[] bs : reports) {
145
                        reportText.append(new String(bs));
146
                    }
147
				}
148
				display.asyncExec(new Runnable() {
149

    
150
					@Override
151
					public void run() {
152
                        // display reports with possibility to save
153
                        ReportTextDialog dialog = new ReportTextDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());
154
                        dialog.setTitle(configurator.getClass().getSimpleName()+" Report");
155
                        dialog.setReportText(reportText.toString());
156
                        dialog.open();
157
						CdmStore.getContextManager().notifyContextRefresh();
158
					}
159
				});
160

    
161
				return Status.OK_STATUS;
162
			}
163
		};
164

    
165
		return job;
166

    
167
	}
168

    
169
	public Job createIOServiceJob(IImportConfigurator configurator, InputStream is, SOURCE_TYPE type) {
170

    
171
	    try {
172
	        return createIOServiceJob(configurator, IOUtils.toByteArray(is), type);
173
	    } catch (Exception e) {
174
	        MessagingUtils.errorDialog("Error importing input stream",
175
	                this,
176
	                e.getMessage(),
177
	                TaxeditorStorePlugin.PLUGIN_ID,
178
	                e,
179
	                true);
180
	    }
181
	    return null;
182
	}
183

    
184
	public Job createIOServiceJob(IImportConfigurator configurator, File importFile, SOURCE_TYPE type) {
185
	    Path path = Paths.get(importFile.toURI());
186
	    try {
187
	        return createIOServiceJob(configurator, Files.readAllBytes(path), type);
188
	    } catch (Exception e) {
189
	        MessagingUtils.errorDialog("Error importing file",
190
	                this,
191
	                e.getMessage(),
192
	                TaxeditorStorePlugin.PLUGIN_ID,
193
	                e,
194
	                true);
195
	    }
196
	    return null;
197
	}
198

    
199
    public Job createIOServiceJob(final IImportConfigurator configurator, final byte[] data, final SOURCE_TYPE type) {
200
        Assert.isNotNull(configurator, "Configuration may not be null");
201
        final Display display = Display.getDefault();
202
        Job job = new Job("Import: " + configurator.getClass().getSimpleName()) {
203

    
204
            @Override
205
            protected IStatus run(IProgressMonitor monitor) {
206
                monitor.beginTask("Importing data", IProgressMonitor.UNKNOWN);
207
                IIOService ioService = CdmApplicationState.getIOService();
208

    
209
                ImportResult result = ioService.importData(configurator, data, type);
210

    
211
                monitor.done();
212

    
213
                display.asyncExec(new Runnable() {
214

    
215
                    @Override
216
                    public void run() {
217
                        CdmStore.getContextManager().notifyContextRefresh();
218
                    }
219
                });
220
                showResult(configurator.getClass().getSimpleName(), display, result);
221
                return Status.OK_STATUS;
222
            }
223
        };
224

    
225
        return job;
226

    
227
    }
228

    
229
    public void runMoniteredOperation(IImportConfigurator configurator, InputStream is, SOURCE_TYPE type) {
230

    
231
        try {
232
            runMoniteredOperation(configurator, IOUtils.toByteArray(is), 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, SOURCE_TYPE type) {
245
        byte[] data = new byte[1];
246
        try {
247
            runMoniteredOperation(configurator, data, type);
248
        } catch (Exception e) {
249
            MessagingUtils.errorDialog("Error importing input stream",
250
                    this,
251
                    e.getMessage(),
252
                    TaxeditorStorePlugin.PLUGIN_ID,
253
                    e,
254
                    true);
255
        }
256

    
257
    }
258

    
259
    public void runMoniteredOperation(IImportConfigurator configurator, File importFile, SOURCE_TYPE type) {
260
        Path path = Paths.get(importFile.toURI());
261
        try {
262
            runMoniteredOperation(configurator, Files.readAllBytes(path), type);
263

    
264
        } catch (Exception e) {
265
            MessagingUtils.errorDialog("Error importing input stream",
266
                    this,
267
                    e.getMessage(),
268
                    TaxeditorStorePlugin.PLUGIN_ID,
269
                    e,
270
                    true);
271
        }
272

    
273
    }
274

    
275
    public void runMoniteredOperation(final IImportConfigurator configurator, final byte[] data, final SOURCE_TYPE type) {
276
        IIOService ioService = CdmApplicationState.getIOService();
277
        final UUID uuid = ioService.monitImportData(configurator, data, type);
278
        Display.getDefault().asyncExec(new Runnable() {
279
            @Override
280
            public void run() {
281
                AbstractUtility.executeMoniteredOperation("Import: " + configurator.getClass().getSimpleName(),
282
                        uuid,
283
                        1000,
284
                        false,
285
                        ImportManager.this,
286
                        null);
287
            }
288
        });
289

    
290
    }
291

    
292
	private IImportConfigurator getConfigurator(TYPE type) {
293
		Assert.isNotNull(type, "Type should not be null");
294

    
295
		switch (type) {
296
		case Jaxb:
297
			return JaxbImportConfigurator.NewInstance(null, null);
298
		case Tcs:
299
			return TcsXmlImportConfigurator.NewInstance(null, null);
300
		case Endnote:
301
			return EndnoteImportConfigurator.NewInstance(null, null);
302
		case Excel_Taxa:
303
			return NormalExplicitImportConfigurator.NewInstance(null, null,
304
					null, null);
305
		case Abcd:
306
			return Abcd206ImportConfigurator.NewInstance(null, null);
307
		case Sdd:
308
			return SDDImportConfigurator.NewInstance(null, null);
309
		case SpecimenCdmExcel:
310
			return SpecimenCdmExcelImportConfigurator.NewInstance(null, null);
311
		case SpecimenSearch:
312
		    return Abcd206ImportConfigurator.NewInstance(null, null);
313
		case Gbif:
314
		    return DwcaImportConfigurator.NewInstance(null, null);
315
		case Excel_Distribution:
316
            return ExcelDistributionUpdateConfigurator.NewInstance(null, null, null);
317

    
318
		default:
319
			MessagingUtils.notImplementedMessage(this);
320
			throw new IllegalArgumentException("Import not supported yet");
321
		}
322
	}
323

    
324

    
325
	/**
326
	 * <p>
327
	 * JaxbConfigurator
328
	 * </p>
329
	 *
330
	 * @return a {@link eu.etaxonomy.cdm.io.jaxb.JaxbImportConfigurator} object.
331
	 */
332
	public final JaxbImportConfigurator JaxbConfigurator() {
333
		return (JaxbImportConfigurator) getConfigurator(TYPE.Jaxb);
334
	}
335

    
336
	/**
337
	 * <p>
338
	 * TcsConfigurator
339
	 * </p>
340
	 *
341
	 * @return a {@link eu.etaxonomy.cdm.io.tcsxml.in.TcsXmlImportConfigurator}
342
	 *         object.
343
	 */
344
	public final TcsXmlImportConfigurator TcsConfigurator() {
345
		return (TcsXmlImportConfigurator) getConfigurator(TYPE.Tcs);
346
	}
347

    
348
	/**
349
	 * <p>
350
	 * EndnoteConfigurator
351
	 * </p>
352
	 *
353
	 * @return a
354
	 *         {@link eu.etaxonomy.cdm.io.reference.endnote.in.EndnoteImportConfigurator}
355
	 *         object.
356
	 */
357
	public final EndnoteImportConfigurator EndnoteConfigurator() {
358
		return (EndnoteImportConfigurator) getConfigurator(TYPE.Endnote);
359
	}
360

    
361
	/**
362
	 * <p>
363
	 * NormalExplicitConfigurator
364
	 * </p>
365
	 *
366
	 * @return a
367
	 *         {@link eu.etaxonomy.cdm.io.excel.taxa.NormalExplicitImportConfigurator}
368
	 *         object.
369
	 */
370
	public final NormalExplicitImportConfigurator NormalExplicitConfigurator() {
371
		return (NormalExplicitImportConfigurator) getConfigurator(TYPE.Excel_Taxa);
372
	}
373

    
374
	/**
375
	 * <p>
376
	 * SddConfigurator
377
	 * </p>
378
	 *
379
	 * @return a {@link eu.etaxonomy.cdm.io.sdd.in.SDDImportConfigurator}
380
	 *         object.
381
	 */
382
	public final SDDImportConfigurator SddConfigurator() {
383
		return (SDDImportConfigurator) getConfigurator(TYPE.Sdd);
384
	}
385

    
386
	/**
387
	 * <p>
388
	 * AbcdConfigurator
389
	 * </p>
390
	 *
391
	 * @return a
392
	 *         {@link eu.etaxonomy.cdm.io.specimen.abcd206.in.Abcd206ImportConfigurator}
393
	 *         object.
394
	 */
395
	public final Abcd206ImportConfigurator AbcdConfigurator() {
396
		return (Abcd206ImportConfigurator) getConfigurator(TYPE.Abcd);
397
	}
398

    
399
	public SpecimenCdmExcelImportConfigurator SpecimenCdmExcelImportConfigurator() {
400
		return (SpecimenCdmExcelImportConfigurator) getConfigurator(TYPE.SpecimenCdmExcel);
401
	}
402

    
403
	public DwcaImportConfigurator DwcaImportConfigurator() {
404
		return (DwcaImportConfigurator) getConfigurator(TYPE.Gbif);
405
	}
406

    
407

    
408
    /**
409
     * {@inheritDoc}
410
     */
411
    @Override
412
    public void postOperation(IRemotingProgressMonitor monitor) {
413
        Display.getDefault().asyncExec(new Runnable() {
414

    
415
            @Override
416
            public void run() {
417
                CdmStore.getContextManager().notifyContextRefresh();
418
            }
419
        });
420

    
421
    }
422

    
423
	public Job createIOServiceJob(final GbifImportConfigurator<GbifImportState, InputStream> configurator) {
424
		 Assert.isNotNull(configurator, "Configuration may not be null");
425
	        final Display display = Display.getDefault();
426
	        Job job = new Job("Import: " + " Dwca") {
427

    
428
	            @Override
429
	            protected IStatus run(IProgressMonitor monitor) {
430
	                monitor.beginTask("Importing data", IProgressMonitor.UNKNOWN);
431
	                IIOService ioService = CdmApplicationState.getIOService();
432

    
433
	                ImportResult result = ioService.importDataFromStream(configurator);
434
	                monitor.done();
435

    
436
//	                display.asyncExec(new Runnable() {
437
//
438
//	                    @Override
439
//	                    public void run() {
440
//	                        CdmStore.getContextManager().notifyContextRefresh();
441
//	                    }
442
//	                });
443
	                showResult("Gbif Import", display, result);
444
	                return Status.OK_STATUS;
445
	            }
446
	        };
447

    
448
	        return job;
449

    
450
	}
451

    
452
	public Job createIOServiceJob(final Abcd206ImportConfigurator configurator) {
453
		 Assert.isNotNull(configurator, "Configuration may not be null");
454
	        final Display display = Display.getDefault();
455
	        Job job = new Job("Import: " + " Dwca") {
456

    
457
	            @Override
458
	            protected IStatus run(IProgressMonitor monitor) {
459
	                monitor.beginTask("Importing data", IProgressMonitor.UNKNOWN);
460
	                IIOService ioService = CdmApplicationState.getIOService();
461

    
462
	                ImportResult result = ioService.importDataFromStream(configurator);
463
	                monitor.done();
464

    
465
	                display.asyncExec(new Runnable() {
466

    
467
	                    @Override
468
	                    public void run() {
469
	                        CdmStore.getContextManager().notifyContextRefresh();
470
	                    }
471
	                });
472
	                showResult("Abcd Import", display, result);
473
	                return Status.OK_STATUS;
474
	            }
475
	        };
476

    
477
	        return job;
478

    
479
	}
480

    
481
	public Job createIOServiceJob(
482
			final List<Abcd206ImportConfigurator> abcdConfigurators) {
483
		 Assert.isNotNull(abcdConfigurators, "Configuration may not be null");
484
	        final Display display = Display.getDefault();
485
	        Job job = new Job("Import: " + " Abcd") {
486

    
487
	            @Override
488
	            protected IStatus run(IProgressMonitor monitor) {
489
	                monitor.beginTask("Importing data", IProgressMonitor.UNKNOWN);
490
	                IIOService ioService = CdmApplicationState.getIOService();
491

    
492
	                ImportResult result = ioService.importDataFromStream(abcdConfigurators);
493
	                monitor.done();
494

    
495
	                display.asyncExec(new Runnable() {
496

    
497
	                    @Override
498
	                    public void run() {
499
	                        CdmStore.getContextManager().notifyContextRefresh();
500
	                    }
501
	                });
502
	                showResult("Abcd Import", display, result);
503

    
504

    
505

    
506
	                return Status.OK_STATUS;
507
	            }
508
	        };
509

    
510
	        return job;
511
	}
512

    
513
    public Job createIOServiceJob(final ImportConfiguratorBase configurator) {
514
        Assert.isNotNull(configurator, "Configuration may not be null");
515
        final Display display = Display.getDefault();
516

    
517
        Job job = new Job("Update: " + configurator.getClass().getSimpleName()) {
518

    
519
            @Override
520
            protected IStatus run(IProgressMonitor monitor) {
521
                monitor.beginTask("Updating data", IProgressMonitor.UNKNOWN);
522
                IIOService ioService = CdmApplicationState.getIOService();
523
                ImportResult importResult = null;
524
                if (configurator instanceof SortIndexUpdaterConfigurator){
525
                    SortIndexUpdaterConfigurator config = (SortIndexUpdaterConfigurator)configurator;
526
                    importResult =ioService.updateSortIndex(config);
527
                } else if (configurator instanceof CacheUpdaterConfigurator){
528
                    CacheUpdaterConfigurator config = (CacheUpdaterConfigurator) configurator;
529
                    importResult = ioService.updateCaches(config);
530
                } else if (configurator instanceof ExcelDistributionUpdateConfigurator){
531
                    ExcelDistributionUpdateConfigurator config = (ExcelDistributionUpdateConfigurator) configurator;
532
                    importResult =ioService.updateDistributionData(config);
533
                }
534

    
535
                monitor.done();
536
//                display.asyncExec(new Runnable() {
537
//
538
//                    @Override
539
//                    public void run() {
540
//                        CdmStore.getContextManager().notifyContextRefresh();
541
//                    }
542
//                });
543
                showResult(configurator.getClass().getSimpleName(), display, importResult);
544

    
545

    
546
                return Status.OK_STATUS;
547
            }
548

    
549

    
550
        };
551

    
552
        return job;
553

    
554
    }
555

    
556
    /**
557
     * @return
558
     */
559
    public ExcelDistributionUpdateConfigurator ExcelDistributionUpdateConfigurator() {
560
        return (ExcelDistributionUpdateConfigurator) getConfigurator(TYPE.Excel_Distribution);
561
    }
562

    
563

    
564

    
565
    /**
566
     * @param configurator
567
     * @param display
568
     * @param importResult
569
     */
570
    private void showResult(String importName, final Display display,
571
            ImportResult importResult) {
572
        StringBuffer reportTextTemp = importResult.createReport();
573
        final StringBuffer reportText;
574
        if (StringUtils.isBlank(reportTextTemp.toString())){
575
            reportTextTemp.append("No update result available");
576
            //TODO: this is a workaround because the abcd import writes the report in the report part...
577
            if (!importResult.getReports().isEmpty() && importResult.getReports().get(0) != null){
578
                reportTextTemp = new StringBuffer();
579
                if(importResult!=null){
580
                    List<byte[]> reports = importResult.getReports();
581
                    for (byte[] bs : reports) {
582
                        if (bs != null){ reportTextTemp.append(new String(bs));}
583
                    }
584
                }
585
            }
586
        }
587
        reportText = reportTextTemp;
588
        display.asyncExec(new Runnable() {
589

    
590
            @Override
591
            public void run() {
592
                // display reports with possibility to save
593
                ReportTextDialog dialog = new ReportTextDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());
594
                dialog.setTitle(importName+" Report");
595
                dialog.setReportText(reportText.toString());
596
                dialog.open();
597
                CdmStore.getContextManager().notifyContextRefresh();
598
            }
599
        });
600
    }
601

    
602

    
603

    
604
}
(3-3/3)