Project

General

Profile

Download (12.4 KB) Statistics
| Branch: | Tag: | Revision:
1
// $Id$
2
/**
3
 * Copyright (C) 2007 EDIT
4
 * European Distributed Institute of Taxonomy
5
 * http://www.e-taxonomy.eu
6
 *
7
 * The contents of this file are subject to the Mozilla Public License Version 1.1
8
 * See LICENSE.TXT at the top of this package for the full license terms.
9
 */
10

    
11
package eu.etaxonomy.taxeditor.io;
12

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

    
21
import org.apache.commons.io.IOUtils;
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.ICdmApplicationConfiguration;
32
import eu.etaxonomy.cdm.common.monitor.IRemotingProgressMonitor;
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.ImportResult;
37
import eu.etaxonomy.cdm.io.excel.taxa.NormalExplicitImportConfigurator;
38
import eu.etaxonomy.cdm.io.jaxb.JaxbImportConfigurator;
39
import eu.etaxonomy.cdm.io.reference.endnote.in.EndnoteImportConfigurator;
40
import eu.etaxonomy.cdm.io.sdd.in.SDDImportConfigurator;
41
import eu.etaxonomy.cdm.io.service.IIOService;
42
import eu.etaxonomy.cdm.io.specimen.abcd206.in.Abcd206ImportConfigurator;
43
import eu.etaxonomy.cdm.io.specimen.excel.in.SpecimenCdmExcelImportConfigurator;
44
import eu.etaxonomy.cdm.io.tcsxml.in.TcsXmlImportConfigurator;
45
import eu.etaxonomy.taxeditor.model.AbstractUtility;
46
import eu.etaxonomy.taxeditor.model.CdmProgressMonitorAdapter;
47
import eu.etaxonomy.taxeditor.model.MessagingUtils;
48
import eu.etaxonomy.taxeditor.operation.IPostMoniteredOperationEnabled;
49
import eu.etaxonomy.taxeditor.store.CdmStore;
50
import eu.etaxonomy.taxeditor.store.internal.TaxeditorStorePlugin;
51
import eu.etaxonomy.taxeditor.ui.dialog.ReportTextDialog;
52

    
53
/**
54
 * <p>
55
 * ImportHandler class.
56
 * </p>
57
 *
58
 * @author n.hoffmann
59
 * @created Sep 11, 2009
60
 * @version 1.0
61
 */
62
public class ImportManager extends AbstractIOManager<IImportConfigurator> implements IPostMoniteredOperationEnabled {
63

    
64
	/**
65
	 * @param applicationConfiguration
66
	 */
67
	private ImportManager(ICdmApplicationConfiguration applicationConfiguration) {
68
		super(applicationConfiguration);
69
	}
70

    
71
	/**
72
	 * <p>
73
	 * NewInstance
74
	 * </p>
75
	 *
76
	 * @param applicationConfiguration
77
	 *            a
78
	 *            {@link eu.etaxonomy.cdm.api.application.CdmApplicationController}
79
	 *            object.
80
	 * @return a {@link eu.etaxonomy.taxeditor.io.ImportManager} object.
81
	 */
82
	public static ImportManager NewInstance(
83
			ICdmApplicationConfiguration applicationConfiguration) {
84
		return new ImportManager(applicationConfiguration);
85
	}
86

    
87
	/**
88
	 * Use when importing data into the current application context
89
	 *
90
	 * @param configurator
91
	 *            a {@link eu.etaxonomy.cdm.io.common.IImportConfigurator}
92
	 *            object.
93
	 * @return a {@link org.eclipse.core.runtime.jobs.Job} object.
94
	 */
95
	@Override
96
	protected Job createIOJob(final IImportConfigurator configurator) {
97
		Assert.isNotNull(configurator, "Configuration may not be null");
98

    
99
		final Display display = Display.getDefault();
100

    
101
		Job job = new Job("Import: " + configurator.getClass().getSimpleName()) {
102

    
103
			@Override
104
			protected IStatus run(IProgressMonitor monitor) {
105
				monitor.beginTask("Importing data", 100);
106
				configurator.setProgressMonitor(CdmProgressMonitorAdapter
107
						.CreateSubMonitor(monitor, 70));
108

    
109
				monitor.worked(5);
110

    
111
				CdmDefaultImport<IImportConfigurator> importer = new CdmDefaultImport<IImportConfigurator>();
112
				importer.setCdmAppController(applicationConfiguration);
113
				monitor.worked(5);
114
				ImportResult importResult = null;
115
				try {
116
					importResult = importer.invoke(configurator);
117

    
118
					monitor.worked(80);
119
				} catch (RuntimeException e) {
120
					MessagingUtils.messageDialog(
121
							"Error importing data",
122
							this,
123
							"An error occured while"
124
									+ "importing from source '"
125
									+ configurator.getSourceNameString()
126
									+ "'.\n"
127
									+ "Please check error log for details.", e);
128
				}
129

    
130
				monitor.worked(5);
131
				monitor.done();
132

    
133

    
134
				final StringBuilder reportText = new StringBuilder();
135
				if(importResult!=null){
136
				    List<byte[]> reports = importResult.getReports();
137
				    for (byte[] bs : reports) {
138
                        reportText.append(new String(bs));
139
                    }
140
				}
141
				display.asyncExec(new Runnable() {
142

    
143
					@Override
144
					public void run() {
145
                        // display reports with possibility to save
146
                        ReportTextDialog dialog = new ReportTextDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());
147
                        dialog.setTitle(configurator.getClass().getSimpleName()+" Report");
148
                        dialog.setReportText(reportText.toString());
149
                        dialog.open();
150
						CdmStore.getContextManager().notifyContextRefresh();
151
					}
152
				});
153

    
154
				return Status.OK_STATUS;
155
			}
156
		};
157

    
158
		return job;
159

    
160
	}
161

    
162
	public Job createIOServiceJob(IImportConfigurator configurator, InputStream is, SOURCE_TYPE type) {
163

    
164
	    try {
165
	        return createIOServiceJob(configurator, IOUtils.toByteArray(is), type);
166
	    } catch (Exception e) {
167
	        MessagingUtils.errorDialog("Error importing input stream",
168
	                this,
169
	                e.getMessage(),
170
	                TaxeditorStorePlugin.PLUGIN_ID,
171
	                e,
172
	                true);
173
	    }
174
	    return null;
175
	}
176

    
177
	public Job createIOServiceJob(IImportConfigurator configurator, File importFile, SOURCE_TYPE type) {
178
	    Path path = Paths.get(importFile.toURI());
179
	    try {
180
	        return createIOServiceJob(configurator, Files.readAllBytes(path), type);
181
	    } catch (Exception e) {
182
	        MessagingUtils.errorDialog("Error importing file",
183
	                this,
184
	                e.getMessage(),
185
	                TaxeditorStorePlugin.PLUGIN_ID,
186
	                e,
187
	                true);
188
	    }
189
	    return null;
190
	}
191

    
192
    public Job createIOServiceJob(final IImportConfigurator configurator, final byte[] data, final SOURCE_TYPE type) {
193
        Assert.isNotNull(configurator, "Configuration may not be null");
194
        final Display display = Display.getDefault();
195
        Job job = new Job("Import: " + configurator.getClass().getSimpleName()) {
196

    
197
            @Override
198
            protected IStatus run(IProgressMonitor monitor) {
199
                monitor.beginTask("Importing data", IProgressMonitor.UNKNOWN);
200
                IIOService ioService = CdmApplicationState.getIOService();
201

    
202
                ioService.importData(configurator, data, type);
203

    
204
                monitor.done();
205

    
206
                display.asyncExec(new Runnable() {
207

    
208
                    @Override
209
                    public void run() {
210
                        CdmStore.getContextManager().notifyContextRefresh();
211
                    }
212
                });
213

    
214
                return Status.OK_STATUS;
215
            }
216
        };
217

    
218
        return job;
219

    
220
    }
221

    
222
    public void runMoniteredOperation(IImportConfigurator configurator, InputStream is, SOURCE_TYPE type) {
223

    
224
        try {
225
            runMoniteredOperation(configurator, IOUtils.toByteArray(is), type);
226
        } catch (Exception e) {
227
            MessagingUtils.errorDialog("Error importing input stream",
228
                    this,
229
                    e.getMessage(),
230
                    TaxeditorStorePlugin.PLUGIN_ID,
231
                    e,
232
                    true);
233
        }
234

    
235
    }
236

    
237
    public void runMoniteredOperation(IImportConfigurator configurator, SOURCE_TYPE type) {
238
        byte[] data = new byte[1];
239
        try {
240
            runMoniteredOperation(configurator, data, type);
241
        } catch (Exception e) {
242
            MessagingUtils.errorDialog("Error importing input stream",
243
                    this,
244
                    e.getMessage(),
245
                    TaxeditorStorePlugin.PLUGIN_ID,
246
                    e,
247
                    true);
248
        }
249

    
250
    }
251

    
252
    public void runMoniteredOperation(IImportConfigurator configurator, File importFile, SOURCE_TYPE type) {
253
        Path path = Paths.get(importFile.toURI());
254
        try {
255
            runMoniteredOperation(configurator, Files.readAllBytes(path), type);
256
        } catch (Exception e) {
257
            MessagingUtils.errorDialog("Error importing input stream",
258
                    this,
259
                    e.getMessage(),
260
                    TaxeditorStorePlugin.PLUGIN_ID,
261
                    e,
262
                    true);
263
        }
264

    
265
    }
266

    
267
    public void runMoniteredOperation(final IImportConfigurator configurator, final byte[] data, final SOURCE_TYPE type) {
268
        IIOService ioService = CdmApplicationState.getIOService();
269
        final UUID uuid = ioService.monitImportData(configurator, data, type);
270
        Display.getDefault().asyncExec(new Runnable() {
271
            @Override
272
            public void run() {
273
                AbstractUtility.executeMoniteredOperation("Import: " + configurator.getClass().getSimpleName(),
274
                        uuid,
275
                        1000,
276
                        false,
277
                        ImportManager.this,
278
                        null);
279
            }
280
        });
281

    
282
    }
283

    
284
	private IImportConfigurator getConfigurator(TYPE type) {
285
		Assert.isNotNull(type, "Type should not be null");
286

    
287
		switch (type) {
288
		case Jaxb:
289
			return JaxbImportConfigurator.NewInstance(null, null);
290
		case Tcs:
291
			return TcsXmlImportConfigurator.NewInstance(null, null);
292
		case Endnote:
293
			return EndnoteImportConfigurator.NewInstance(null, null);
294
		case Excel_Taxa:
295
			return NormalExplicitImportConfigurator.NewInstance(null, null,
296
					null, null);
297
		case Abcd:
298
			return Abcd206ImportConfigurator.NewInstance(null, null);
299
		case Sdd:
300
			return SDDImportConfigurator.NewInstance(null, null);
301
		case SpecimenCdmExcel:
302
			return SpecimenCdmExcelImportConfigurator.NewInstance(null, null);
303
		case SpecimenSearch:
304
		    return Abcd206ImportConfigurator.NewInstance(null, null);
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
    /**
391
     * {@inheritDoc}
392
     */
393
    @Override
394
    public void postOperation(IRemotingProgressMonitor monitor) {
395
        Display.getDefault().asyncExec(new Runnable() {
396

    
397
            @Override
398
            public void run() {
399
                CdmStore.getContextManager().notifyContextRefresh();
400
            }
401
        });
402

    
403
    }
404

    
405

    
406
}
(3-3/3)