809e19efa068a89ddf1c4d3f5d74ccfa71f1711d
[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.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 }