minor
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / io / ImportManager.java
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.net.URI;
16 import java.nio.file.Files;
17 import java.nio.file.Path;
18 import java.nio.file.Paths;
19 import java.util.List;
20 import java.util.Set;
21 import java.util.UUID;
22
23 import org.apache.commons.io.IOUtils;
24 import org.eclipse.core.runtime.Assert;
25 import org.eclipse.core.runtime.IProgressMonitor;
26 import org.eclipse.core.runtime.IStatus;
27 import org.eclipse.core.runtime.Status;
28 import org.eclipse.core.runtime.jobs.Job;
29 import org.eclipse.swt.widgets.Display;
30 import org.eclipse.ui.PlatformUI;
31
32 import eu.etaxonomy.cdm.api.application.CdmApplicationState;
33 import eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration;
34 import eu.etaxonomy.cdm.common.monitor.IRemotingProgressMonitor;
35 import eu.etaxonomy.cdm.ext.occurrence.OccurenceQuery;
36 import eu.etaxonomy.cdm.io.common.CdmDefaultImport;
37 import eu.etaxonomy.cdm.io.common.IImportConfigurator;
38 import eu.etaxonomy.cdm.io.common.IImportConfigurator.SOURCE_TYPE;
39 import eu.etaxonomy.cdm.io.common.ImportResult;
40 import eu.etaxonomy.cdm.io.dwca.in.DwcaImportConfigurator;
41 import eu.etaxonomy.cdm.io.excel.taxa.NormalExplicitImportConfigurator;
42 import eu.etaxonomy.cdm.io.jaxb.JaxbImportConfigurator;
43 import eu.etaxonomy.cdm.io.reference.endnote.in.EndnoteImportConfigurator;
44 import eu.etaxonomy.cdm.io.sdd.in.SDDImportConfigurator;
45 import eu.etaxonomy.cdm.io.service.IIOService;
46 import eu.etaxonomy.cdm.io.specimen.abcd206.in.Abcd206ImportConfigurator;
47 import eu.etaxonomy.cdm.io.specimen.excel.in.SpecimenCdmExcelImportConfigurator;
48 import eu.etaxonomy.cdm.io.tcsxml.in.TcsXmlImportConfigurator;
49 import eu.etaxonomy.taxeditor.model.AbstractUtility;
50 import eu.etaxonomy.taxeditor.model.CdmProgressMonitorAdapter;
51 import eu.etaxonomy.taxeditor.model.MessagingUtils;
52 import eu.etaxonomy.taxeditor.operation.IPostMoniteredOperationEnabled;
53 import eu.etaxonomy.taxeditor.store.CdmStore;
54 import eu.etaxonomy.taxeditor.store.internal.TaxeditorStorePlugin;
55 import eu.etaxonomy.taxeditor.ui.dialog.ReportTextDialog;
56
57 /**
58 * <p>
59 * ImportHandler class.
60 * </p>
61 *
62 * @author n.hoffmann
63 * @created Sep 11, 2009
64 * @version 1.0
65 */
66 public class ImportManager extends AbstractIOManager<IImportConfigurator> implements IPostMoniteredOperationEnabled {
67
68 /**
69 * @param applicationConfiguration
70 */
71 private ImportManager(ICdmApplicationConfiguration applicationConfiguration) {
72 super(applicationConfiguration);
73 }
74
75 /**
76 * <p>
77 * NewInstance
78 * </p>
79 *
80 * @param applicationConfiguration
81 * a
82 * {@link eu.etaxonomy.cdm.api.application.CdmApplicationController}
83 * object.
84 * @return a {@link eu.etaxonomy.taxeditor.io.ImportManager} object.
85 */
86 public static ImportManager NewInstance(
87 ICdmApplicationConfiguration applicationConfiguration) {
88 return new ImportManager(applicationConfiguration);
89 }
90
91 /**
92 * Use when importing data into the current application context
93 *
94 * @param configurator
95 * a {@link eu.etaxonomy.cdm.io.common.IImportConfigurator}
96 * object.
97 * @return a {@link org.eclipse.core.runtime.jobs.Job} object.
98 */
99 @Override
100 protected Job createIOJob(final IImportConfigurator configurator) {
101 Assert.isNotNull(configurator, "Configuration may not be null");
102
103 final Display display = Display.getDefault();
104
105 Job job = new Job("Import: " + configurator.getClass().getSimpleName()) {
106
107 @Override
108 protected IStatus run(IProgressMonitor monitor) {
109 monitor.beginTask("Importing data", 100);
110 configurator.setProgressMonitor(CdmProgressMonitorAdapter
111 .CreateSubMonitor(monitor, 70));
112
113 monitor.worked(5);
114
115 CdmDefaultImport<IImportConfigurator> importer = new CdmDefaultImport<IImportConfigurator>();
116 importer.setCdmAppController(applicationConfiguration);
117 monitor.worked(5);
118 ImportResult importResult = null;
119 try {
120 importResult = importer.invoke(configurator);
121
122 monitor.worked(80);
123 } catch (RuntimeException e) {
124 MessagingUtils.messageDialog(
125 "Error importing data",
126 this,
127 "An error occured while"
128 + "importing from source '"
129 + configurator.getSourceNameString()
130 + "'.\n"
131 + "Please check error log for details.", e);
132 }
133
134 monitor.worked(5);
135 monitor.done();
136
137
138 final StringBuilder reportText = new StringBuilder();
139 if(importResult!=null){
140 List<byte[]> reports = importResult.getReports();
141 for (byte[] bs : reports) {
142 reportText.append(new String(bs));
143 }
144 }
145 display.asyncExec(new Runnable() {
146
147 @Override
148 public void run() {
149 // display reports with possibility to save
150 ReportTextDialog dialog = new ReportTextDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());
151 dialog.setTitle(configurator.getClass().getSimpleName()+" Report");
152 dialog.setReportText(reportText.toString());
153 dialog.open();
154 CdmStore.getContextManager().notifyContextRefresh();
155 }
156 });
157
158 return Status.OK_STATUS;
159 }
160 };
161
162 return job;
163
164 }
165
166 public Job createIOServiceJob(IImportConfigurator configurator, InputStream is, SOURCE_TYPE type) {
167
168 try {
169 return createIOServiceJob(configurator, IOUtils.toByteArray(is), type);
170 } catch (Exception e) {
171 MessagingUtils.errorDialog("Error importing input stream",
172 this,
173 e.getMessage(),
174 TaxeditorStorePlugin.PLUGIN_ID,
175 e,
176 true);
177 }
178 return null;
179 }
180
181 public Job createIOServiceJob(IImportConfigurator configurator, File importFile, SOURCE_TYPE type) {
182 Path path = Paths.get(importFile.toURI());
183 try {
184 return createIOServiceJob(configurator, Files.readAllBytes(path), type);
185 } catch (Exception e) {
186 MessagingUtils.errorDialog("Error importing file",
187 this,
188 e.getMessage(),
189 TaxeditorStorePlugin.PLUGIN_ID,
190 e,
191 true);
192 }
193 return null;
194 }
195
196 public Job createIOServiceJob(final IImportConfigurator configurator, final byte[] data, final SOURCE_TYPE type) {
197 Assert.isNotNull(configurator, "Configuration may not be null");
198 final Display display = Display.getDefault();
199 Job job = new Job("Import: " + configurator.getClass().getSimpleName()) {
200
201 @Override
202 protected IStatus run(IProgressMonitor monitor) {
203 monitor.beginTask("Importing data", IProgressMonitor.UNKNOWN);
204 IIOService ioService = CdmApplicationState.getIOService();
205
206 ioService.importData(configurator, data, type);
207
208 monitor.done();
209
210 display.asyncExec(new Runnable() {
211
212 @Override
213 public void run() {
214 CdmStore.getContextManager().notifyContextRefresh();
215 }
216 });
217
218 return Status.OK_STATUS;
219 }
220 };
221
222 return job;
223
224 }
225
226 public void runMoniteredOperation(IImportConfigurator configurator, InputStream is, SOURCE_TYPE type) {
227
228 try {
229 runMoniteredOperation(configurator, IOUtils.toByteArray(is), type);
230 } catch (Exception e) {
231 MessagingUtils.errorDialog("Error importing input stream",
232 this,
233 e.getMessage(),
234 TaxeditorStorePlugin.PLUGIN_ID,
235 e,
236 true);
237 }
238
239 }
240
241 public void runMoniteredOperation(IImportConfigurator configurator, SOURCE_TYPE type) {
242 byte[] data = new byte[1];
243 try {
244 runMoniteredOperation(configurator, data, type);
245 } catch (Exception e) {
246 MessagingUtils.errorDialog("Error importing input stream",
247 this,
248 e.getMessage(),
249 TaxeditorStorePlugin.PLUGIN_ID,
250 e,
251 true);
252 }
253
254 }
255
256 public void runMoniteredOperation(IImportConfigurator configurator, File importFile, SOURCE_TYPE type) {
257 Path path = Paths.get(importFile.toURI());
258 try {
259 runMoniteredOperation(configurator, Files.readAllBytes(path), type);
260 } catch (Exception e) {
261 MessagingUtils.errorDialog("Error importing input stream",
262 this,
263 e.getMessage(),
264 TaxeditorStorePlugin.PLUGIN_ID,
265 e,
266 true);
267 }
268
269 }
270
271 public void runMoniteredOperation(final IImportConfigurator configurator, final byte[] data, final SOURCE_TYPE type) {
272 IIOService ioService = CdmApplicationState.getIOService();
273 final UUID uuid = ioService.monitImportData(configurator, data, type);
274 Display.getDefault().asyncExec(new Runnable() {
275 @Override
276 public void run() {
277 AbstractUtility.executeMoniteredOperation("Import: " + configurator.getClass().getSimpleName(),
278 uuid,
279 1000,
280 false,
281 ImportManager.this,
282 null);
283 }
284 });
285
286 }
287
288 private IImportConfigurator getConfigurator(TYPE type) {
289 Assert.isNotNull(type, "Type should not be null");
290
291 switch (type) {
292 case Jaxb:
293 return JaxbImportConfigurator.NewInstance(null, null);
294 case Tcs:
295 return TcsXmlImportConfigurator.NewInstance(null, null);
296 case Endnote:
297 return EndnoteImportConfigurator.NewInstance(null, null);
298 case Excel_Taxa:
299 return NormalExplicitImportConfigurator.NewInstance(null, null,
300 null, null);
301 case Abcd:
302 return Abcd206ImportConfigurator.NewInstance(null, null);
303 case Sdd:
304 return SDDImportConfigurator.NewInstance(null, null);
305 case SpecimenCdmExcel:
306 return SpecimenCdmExcelImportConfigurator.NewInstance(null, null);
307 case SpecimenSearch:
308 return Abcd206ImportConfigurator.NewInstance(null, null);
309 case Gbif:
310 return DwcaImportConfigurator.NewInstance(null, null);
311 default:
312 MessagingUtils.notImplementedMessage(this);
313 throw new IllegalArgumentException("Import not supported yet");
314 }
315 }
316
317
318 /**
319 * <p>
320 * JaxbConfigurator
321 * </p>
322 *
323 * @return a {@link eu.etaxonomy.cdm.io.jaxb.JaxbImportConfigurator} object.
324 */
325 public final JaxbImportConfigurator JaxbConfigurator() {
326 return (JaxbImportConfigurator) getConfigurator(TYPE.Jaxb);
327 }
328
329 /**
330 * <p>
331 * TcsConfigurator
332 * </p>
333 *
334 * @return a {@link eu.etaxonomy.cdm.io.tcsxml.in.TcsXmlImportConfigurator}
335 * object.
336 */
337 public final TcsXmlImportConfigurator TcsConfigurator() {
338 return (TcsXmlImportConfigurator) getConfigurator(TYPE.Tcs);
339 }
340
341 /**
342 * <p>
343 * EndnoteConfigurator
344 * </p>
345 *
346 * @return a
347 * {@link eu.etaxonomy.cdm.io.reference.endnote.in.EndnoteImportConfigurator}
348 * object.
349 */
350 public final EndnoteImportConfigurator EndnoteConfigurator() {
351 return (EndnoteImportConfigurator) getConfigurator(TYPE.Endnote);
352 }
353
354 /**
355 * <p>
356 * NormalExplicitConfigurator
357 * </p>
358 *
359 * @return a
360 * {@link eu.etaxonomy.cdm.io.excel.taxa.NormalExplicitImportConfigurator}
361 * object.
362 */
363 public final NormalExplicitImportConfigurator NormalExplicitConfigurator() {
364 return (NormalExplicitImportConfigurator) getConfigurator(TYPE.Excel_Taxa);
365 }
366
367 /**
368 * <p>
369 * SddConfigurator
370 * </p>
371 *
372 * @return a {@link eu.etaxonomy.cdm.io.sdd.in.SDDImportConfigurator}
373 * object.
374 */
375 public final SDDImportConfigurator SddConfigurator() {
376 return (SDDImportConfigurator) getConfigurator(TYPE.Sdd);
377 }
378
379 /**
380 * <p>
381 * AbcdConfigurator
382 * </p>
383 *
384 * @return a
385 * {@link eu.etaxonomy.cdm.io.specimen.abcd206.in.Abcd206ImportConfigurator}
386 * object.
387 */
388 public final Abcd206ImportConfigurator AbcdConfigurator() {
389 return (Abcd206ImportConfigurator) getConfigurator(TYPE.Abcd);
390 }
391
392 public SpecimenCdmExcelImportConfigurator SpecimenCdmExcelImportConfigurator() {
393 return (SpecimenCdmExcelImportConfigurator) getConfigurator(TYPE.SpecimenCdmExcel);
394 }
395
396 public DwcaImportConfigurator DwcaImportConfigurator() {
397 return (DwcaImportConfigurator) getConfigurator(TYPE.Gbif);
398 }
399
400
401 /**
402 * {@inheritDoc}
403 */
404 @Override
405 public void postOperation(IRemotingProgressMonitor monitor) {
406 Display.getDefault().asyncExec(new Runnable() {
407
408 @Override
409 public void run() {
410 CdmStore.getContextManager().notifyContextRefresh();
411 }
412 });
413
414 }
415
416 public Job createIOServiceJob(final DwcaImportConfigurator configurator) {
417 Assert.isNotNull(configurator, "Configuration may not be null");
418 final Display display = Display.getDefault();
419 Job job = new Job("Import: " + " Dwca") {
420
421 @Override
422 protected IStatus run(IProgressMonitor monitor) {
423 monitor.beginTask("Importing data", IProgressMonitor.UNKNOWN);
424 IIOService ioService = CdmApplicationState.getIOService();
425
426 ImportResult result = ioService.importDataFromStream(configurator);
427 monitor.done();
428
429 display.asyncExec(new Runnable() {
430
431 @Override
432 public void run() {
433 CdmStore.getContextManager().notifyContextRefresh();
434 }
435 });
436
437 return Status.OK_STATUS;
438 }
439 };
440
441 return job;
442
443 }
444
445
446 }