Merge branch 'release/5.42.0'
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / io / ExportManager.java
1 /**
2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
5 *
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
8 */
9 package eu.etaxonomy.taxeditor.io;
10
11 import java.io.BufferedWriter;
12 import java.io.File;
13 import java.io.FileOutputStream;
14 import java.io.OutputStreamWriter;
15 import java.io.Writer;
16 import java.text.SimpleDateFormat;
17 import java.util.ArrayList;
18 import java.util.Calendar;
19 import java.util.List;
20 import java.util.Map;
21 import java.util.Set;
22 import java.util.UUID;
23 import java.util.zip.ZipEntry;
24 import java.util.zip.ZipOutputStream;
25
26 import org.apache.logging.log4j.LogManager;
27 import org.apache.logging.log4j.Logger;
28 import org.eclipse.core.runtime.Assert;
29 import org.eclipse.core.runtime.IProgressMonitor;
30 import org.eclipse.core.runtime.IStatus;
31 import org.eclipse.core.runtime.Status;
32 import org.eclipse.core.runtime.SubMonitor;
33 import org.eclipse.core.runtime.jobs.Job;
34 import org.eclipse.swt.widgets.Display;
35
36 import eu.etaxonomy.cdm.api.application.CdmApplicationState;
37 import eu.etaxonomy.cdm.api.application.ICdmRepository;
38 import eu.etaxonomy.cdm.common.monitor.IRemotingProgressMonitor;
39 import eu.etaxonomy.cdm.io.cdmLight.CdmLightExportConfigurator;
40 import eu.etaxonomy.cdm.io.coldp.ColDpExportConfigurator;
41 import eu.etaxonomy.cdm.io.common.ExportDataWrapper;
42 import eu.etaxonomy.cdm.io.common.ExportResult;
43 import eu.etaxonomy.cdm.io.common.ExportResultType;
44 import eu.etaxonomy.cdm.io.common.IExportConfigurator;
45 import eu.etaxonomy.cdm.io.common.IIoConfigurator;
46 import eu.etaxonomy.cdm.io.dwca.out.DwcaTaxExportConfigurator;
47 import eu.etaxonomy.cdm.io.jaxb.JaxbExportConfigurator;
48 import eu.etaxonomy.cdm.io.sdd.out.SDDExportConfigurator;
49 import eu.etaxonomy.cdm.io.service.IIOService;
50 import eu.etaxonomy.cdm.io.wfo.out.WfoBackboneExportConfigurator;
51 import eu.etaxonomy.taxeditor.model.AbstractUtility;
52 import eu.etaxonomy.taxeditor.model.CdmProgressMonitorAdapter;
53 import eu.etaxonomy.taxeditor.model.MessagingUtils;
54 import eu.etaxonomy.taxeditor.operation.IFeedbackGenerator;
55 import eu.etaxonomy.taxeditor.operation.IPostMoniteredOperationEnabled;
56 import eu.etaxonomy.taxeditor.store.CdmStore;
57 import eu.etaxonomy.taxeditor.store.internal.TaxeditorStorePlugin;
58
59 /**
60 * @author n.hoffmann
61 * @created Sep 11, 2009
62 */
63 public class ExportManager
64 extends AbstractIOManager<IExportConfigurator>
65 implements IPostMoniteredOperationEnabled {
66
67 private static final Logger logger = LogManager.getLogger();
68
69 /** Constant <code>DATE_FORMAT_NOW="yyyyMMddHHmm"</code> */
70 public static final String DATE_FORMAT_NOW = "yyyyMMddHHmm";
71
72 private final String successMessage = "The export was successful";
73
74 private ExportManager(ICdmRepository applicationConfiguration) {
75 super(applicationConfiguration);
76 }
77
78 public static ExportManager NewInstance(
79 ICdmRepository applicationConfiguration) {
80 return new ExportManager(applicationConfiguration);
81 }
82
83 public Job createIOServiceJob(final IExportConfigurator configurator, final File exportFile) {
84 Assert.isNotNull(configurator, "Configuration may not be null");
85
86 final Display display = Display.getCurrent();
87
88 Job job = new Job("Export: " + configurator.getClass().getSimpleName()) { //$NON-NLS-1$
89 @Override
90 protected IStatus run(IProgressMonitor monitor) {
91 SubMonitor subMonitor = SubMonitor.convert(monitor, 100);
92 subMonitor.beginTask("Exporting database. This will take some time.", IProgressMonitor.UNKNOWN);
93 try {
94 IIOService ioService = CdmApplicationState.getIOService();
95 UUID uuid = ioService.monitExportData(configurator);
96 IRemotingProgressMonitor remotingMonitor;
97 List<IFeedbackGenerator> feedBackGeneratorList = new ArrayList<>();
98 try {
99 remotingMonitor = CdmStore.getProgressMonitorClientManager().pollMonitor("Export Data",
100 uuid,
101 1000,
102 ExportManager.this,
103 feedBackGeneratorList,
104 subMonitor);
105
106 } catch (Exception ex) {
107 return new Status(IStatus.ERROR, TaxeditorStorePlugin.PLUGIN_ID, "Operation Interrupted", ex);
108 }
109
110 ExportResult result = (ExportResult)remotingMonitor.getResult();
111 ExportDataWrapper<?> data = result.getExportData();
112 try{
113 if (result.getExportData().getType().equals(ExportResultType.BYTE_ARRAY) || result.getExportData().getType().equals(ExportResultType.LIST_BYTE_ARRAY)){
114 if (data.getExportData() instanceof byte[]){
115 byte[] exportData = (byte[])data.getExportData();
116 if(exportData != null){
117 FileOutputStream stream = new FileOutputStream(exportFile);
118 Writer out = new BufferedWriter(new OutputStreamWriter(
119 stream, "UTF8"));
120
121 stream.write(exportData);
122 out.flush();
123 stream.close();
124 }
125 }else if (data.getExportData() instanceof List<?>){
126 //TODO:This needs to be improved
127 @SuppressWarnings("unchecked")
128 List<byte[]> exportData = (List<byte[]>)data.getExportData();
129 if(exportData != null){
130 FileOutputStream stream = new FileOutputStream(exportFile);
131 Writer out = new BufferedWriter(new OutputStreamWriter(
132 stream, "UTF8"));
133
134 stream.write(exportData.get(0));
135 out.flush();
136 stream.close();
137 }
138 }
139
140 } else if (result.getExportData().getType().equals(ExportResultType.MAP_BYTE_ARRAY)){
141 @SuppressWarnings("unchecked")
142 Map<String, byte[]> resultMap = (Map<String, byte[]>)data.getExportData();
143 Set<String> keySet = resultMap.keySet();
144 String fileEnding = ".zip";
145 if (configurator instanceof DwcaTaxExportConfigurator){
146 DwcaTaxExportConfigurator dwcaConfig = (DwcaTaxExportConfigurator)configurator;
147
148 File file = new File(dwcaConfig.getDestination().toURI());
149 FileOutputStream stream = new FileOutputStream(file);
150 ZipOutputStream zos = new ZipOutputStream(stream);
151 for (String key: keySet){
152 byte[] fileData = resultMap.get(key);
153 ZipEntry entry = new ZipEntry( key + fileEnding);
154 zos.putNextEntry(entry);
155 zos.write(fileData);
156 zos.closeEntry();
157 }
158 zos.close();
159 }
160 } else{
161 logger.error("This kind of result data is not supported yet." + result.getExportData().getType().toString());
162 }
163
164 } catch(Exception e){
165 logger.error(e.getStackTrace());
166 }
167
168 showResult(configurator.getClass().getSimpleName(), display, result, successMessage);
169
170
171 } catch (Exception e) {
172 MessagingUtils.errorDialog("Error exporting data",
173 this,
174 e.getMessage(),
175 TaxeditorStorePlugin.PLUGIN_ID,
176 e,
177 true);
178 }
179 return Status.OK_STATUS;
180 }
181 };
182 return job;
183 }
184
185 private IIoConfigurator getConfigurator(TYPE type) {
186 Assert.isNotNull(type, "Type should not be null");
187
188 switch (type) {
189 case Jaxb:
190 return JaxbExportConfigurator.NewInstance(null, null);
191 case Sdd:
192 return SDDExportConfigurator.NewInstance(null, null, null);
193 default:
194 MessagingUtils.notImplementedMessage(this);
195 throw new IllegalArgumentException("Export not supported yet");
196 }
197 }
198
199 public final JaxbExportConfigurator JaxbConfigurator() {
200 return (JaxbExportConfigurator) getConfigurator(TYPE.Jaxb);
201 }
202
203 public final SDDExportConfigurator SddConfigurator() {
204 return (SDDExportConfigurator) getConfigurator(TYPE.Sdd);
205 }
206
207 public Job createIOServiceJob(CdmLightExportConfigurator configurator, String urlString) {
208 Assert.isNotNull(configurator, "Configuration may not be null");
209 final Display display = Display.getDefault();
210
211 Job job = new Job("Export: " + configurator.getClass().getSimpleName()) { //$NON-NLS-1$
212 @Override
213 protected IStatus run(IProgressMonitor monitor) {
214 monitor.beginTask("Exporting database. This will take some time.", IProgressMonitor.UNKNOWN);
215 try {
216 IIOService ioService = CdmApplicationState.getIOService();
217 monitor.beginTask(
218 "Exporting database. This will take some time.", 100);
219 monitor.worked(10);
220 configurator.setProgressMonitor(CdmProgressMonitorAdapter
221 .CreateSubMonitor(monitor, 80));
222 ExportResult result = ioService.export(configurator);
223 ExportDataWrapper<?> data = result.getExportData();
224 try{
225 if (result.getExportData().getType().equals(ExportResultType.BYTE_ARRAY) || result.getExportData().getType().equals(ExportResultType.LIST_BYTE_ARRAY)){
226 byte[] exportData = (byte[])data.getExportData();
227 if(exportData != null){
228 File file = new File(urlString);
229 FileOutputStream stream = new FileOutputStream(file);
230 Writer out = new BufferedWriter(new OutputStreamWriter(
231 stream, "UTF8"));
232
233 stream.write(exportData);
234 out.flush();
235 stream.close();
236 }
237 } else if (result.getExportData().getType().equals(ExportResultType.MAP_BYTE_ARRAY)){
238 @SuppressWarnings("unchecked")
239 Map<String, byte[]> resultMap = (Map<String, byte[]>)data.getExportData();
240 Set<String> keySet = resultMap.keySet();
241 SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW);
242 Calendar cal = Calendar.getInstance();
243 String fileEnding = ".csv";
244
245 if (configurator.isCreateZipFile()){
246 File file = new File(urlString+File.separator + "csv_light_" + sdf.format(cal.getTime())+ ".zip");
247 FileOutputStream stream = new FileOutputStream(file);
248 ZipOutputStream zos = new ZipOutputStream(stream);
249 for (String key: keySet){
250 byte[] fileData = resultMap.get(key);
251 ZipEntry entry = new ZipEntry( key + fileEnding);
252 zos.putNextEntry(entry);
253 zos.write(fileData);
254 zos.closeEntry();
255 }
256 zos.close();
257 }else{
258 for (String key: keySet){
259 byte[] fileData = resultMap.get(key);
260 File file = new File(urlString+File.separator + key + fileEnding);
261 FileOutputStream stream = new FileOutputStream(file);
262 Writer out = new BufferedWriter(new OutputStreamWriter(
263 stream, "UTF8"));
264 stream.write(fileData);
265 out.flush();
266 stream.close();
267
268 }
269 }
270 }else{
271 logger.error("This kind of result data is not supported yet." + result.getExportData().getType().toString());
272 }
273 } catch(Exception e){
274 logger.error(e.getStackTrace());
275 }
276 showResult(configurator.getClass().getSimpleName(), display, result, successMessage);
277
278
279 } catch (Exception e) {
280 MessagingUtils.errorDialog("Error exporting data",
281 this,
282 e.getMessage(),
283 TaxeditorStorePlugin.PLUGIN_ID,
284 e,
285 true);
286 }
287
288 return Status.OK_STATUS;
289 }
290 };
291 return job;
292 }
293
294 public void runMoniteredOperation(final IExportConfigurator configurator, String urlString) {
295 IIOService ioService = CdmApplicationState.getIOService();
296 final UUID uuid = ioService.monitExportData(configurator);
297
298 Display.getDefault().asyncExec(new Runnable() {
299 @Override
300 public void run() {
301 boolean isZip = false;
302 String urlAddition = "";
303 if (configurator instanceof CdmLightExportConfigurator
304 || configurator instanceof ColDpExportConfigurator
305 || configurator instanceof WfoBackboneExportConfigurator){
306
307 if (configurator instanceof CdmLightExportConfigurator) {
308 isZip = ((CdmLightExportConfigurator)configurator).isCreateZipFile();
309 }else if (configurator instanceof ColDpExportConfigurator){
310 isZip = ((ColDpExportConfigurator)configurator).isCreateZipFile();
311 }else if (configurator instanceof WfoBackboneExportConfigurator){
312 isZip = ((WfoBackboneExportConfigurator)configurator).isCreateZipFile();
313 if (isZip) {
314 SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW);
315 Calendar cal = Calendar.getInstance();
316 urlAddition = File.separator + ((WfoBackboneExportConfigurator)configurator).getFamilyStr() + "_WFO_" + sdf.format(cal.getTime());
317 }
318 }
319 }
320 AbstractUtility.executeMoniteredExport(
321 configurator.getUserFriendlyIOName() != null? configurator.getUserFriendlyIOName(): "Export",
322 uuid,
323 1000,
324 true,
325 ExportManager.this,
326 null,
327 urlString+urlAddition,
328 isZip);
329 }
330 });
331 }
332
333 @Override
334 public void postOperation(IRemotingProgressMonitor monitor) {
335 Display.getDefault().asyncExec(()-> {
336 CdmStore.getContextManager().notifyContextRefresh();
337 });
338 }
339 }