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