b89c7d84fe624258eafdb8f74ce2d7a6d951bfd9
[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, File importFile, SOURCE_TYPE type) {
238 Path path = Paths.get(importFile.toURI());
239 try {
240 runMoniteredOperation(configurator, Files.readAllBytes(path), 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(final IImportConfigurator configurator, final byte[] data, final SOURCE_TYPE type) {
253 IIOService ioService = CdmApplicationState.getIOService();
254 final UUID uuid = ioService.monitImportData(configurator, data, type);
255 Display.getDefault().asyncExec(new Runnable() {
256 @Override
257 public void run() {
258 AbstractUtility.executeMoniteredOperation("Import: " + configurator.getClass().getSimpleName(),
259 uuid,
260 1000,
261 false,
262 ImportManager.this,
263 null);
264 }
265 });
266
267 }
268
269 private IImportConfigurator getConfigurator(TYPE type) {
270 Assert.isNotNull(type, "Type should not be null");
271
272 switch (type) {
273 case Jaxb:
274 return JaxbImportConfigurator.NewInstance(null, null);
275 case Tcs:
276 return TcsXmlImportConfigurator.NewInstance(null, null);
277 case Endnote:
278 return EndnoteImportConfigurator.NewInstance(null, null);
279 case Excel_Taxa:
280 return NormalExplicitImportConfigurator.NewInstance(null, null,
281 null, null);
282 case Abcd:
283 return Abcd206ImportConfigurator.NewInstance(null, null);
284 case Sdd:
285 return SDDImportConfigurator.NewInstance(null, null);
286 case SpecimenCdmExcel:
287 return SpecimenCdmExcelImportConfigurator.NewInstance(null, null);
288 default:
289 MessagingUtils.notImplementedMessage(this);
290 throw new IllegalArgumentException("Import not supported yet");
291 }
292 }
293
294
295 /**
296 * <p>
297 * JaxbConfigurator
298 * </p>
299 *
300 * @return a {@link eu.etaxonomy.cdm.io.jaxb.JaxbImportConfigurator} object.
301 */
302 public final JaxbImportConfigurator JaxbConfigurator() {
303 return (JaxbImportConfigurator) getConfigurator(TYPE.Jaxb);
304 }
305
306 /**
307 * <p>
308 * TcsConfigurator
309 * </p>
310 *
311 * @return a {@link eu.etaxonomy.cdm.io.tcsxml.in.TcsXmlImportConfigurator}
312 * object.
313 */
314 public final TcsXmlImportConfigurator TcsConfigurator() {
315 return (TcsXmlImportConfigurator) getConfigurator(TYPE.Tcs);
316 }
317
318 /**
319 * <p>
320 * EndnoteConfigurator
321 * </p>
322 *
323 * @return a
324 * {@link eu.etaxonomy.cdm.io.reference.endnote.in.EndnoteImportConfigurator}
325 * object.
326 */
327 public final EndnoteImportConfigurator EndnoteConfigurator() {
328 return (EndnoteImportConfigurator) getConfigurator(TYPE.Endnote);
329 }
330
331 /**
332 * <p>
333 * NormalExplicitConfigurator
334 * </p>
335 *
336 * @return a
337 * {@link eu.etaxonomy.cdm.io.excel.taxa.NormalExplicitImportConfigurator}
338 * object.
339 */
340 public final NormalExplicitImportConfigurator NormalExplicitConfigurator() {
341 return (NormalExplicitImportConfigurator) getConfigurator(TYPE.Excel_Taxa);
342 }
343
344 /**
345 * <p>
346 * SddConfigurator
347 * </p>
348 *
349 * @return a {@link eu.etaxonomy.cdm.io.sdd.in.SDDImportConfigurator}
350 * object.
351 */
352 public final SDDImportConfigurator SddConfigurator() {
353 return (SDDImportConfigurator) getConfigurator(TYPE.Sdd);
354 }
355
356 /**
357 * <p>
358 * AbcdConfigurator
359 * </p>
360 *
361 * @return a
362 * {@link eu.etaxonomy.cdm.io.specimen.abcd206.in.Abcd206ImportConfigurator}
363 * object.
364 */
365 public final Abcd206ImportConfigurator AbcdConfigurator() {
366 return (Abcd206ImportConfigurator) getConfigurator(TYPE.Abcd);
367 }
368
369 public SpecimenCdmExcelImportConfigurator SpecimenCdmExcelImportConfigurator() {
370 return (SpecimenCdmExcelImportConfigurator) getConfigurator(TYPE.SpecimenCdmExcel);
371 }
372
373 /**
374 * {@inheritDoc}
375 */
376 @Override
377 public void postOperation(IRemotingProgressMonitor monitor) {
378 Display.getDefault().asyncExec(new Runnable() {
379
380 @Override
381 public void run() {
382 CdmStore.getContextManager().notifyContextRefresh();
383 }
384 });
385
386 }
387
388
389 }