/* * ARX: Powerful Data Anonymization * Copyright 2012 - 2017 Fabian Prasser, Florian Kohlmayer and contributors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.deidentifier.arx.gui.worker; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.lang.reflect.InvocationTargetException; import org.apache.commons.io.output.CountingOutputStream; import org.deidentifier.arx.ARXConfiguration; import org.deidentifier.arx.DataHandle; import org.deidentifier.arx.gui.resources.Resources; import org.deidentifier.arx.io.CSVDataOutput; import org.deidentifier.arx.io.CSVSyntax; import org.eclipse.core.runtime.IProgressMonitor; /** * This worker exports data to disk. * * @author Fabian Prasser */ public class WorkerExport extends Worker<DataHandle> { /** The stop flag. */ private volatile boolean stop = false; /** The path. */ private final String path; /** The CSVConfig. */ private final CSVSyntax csvSyntax; /** The byte count. */ private final long bytes; /** The data. */ private final DataHandle handle; /** * Creates a new instance. * * @param path * @param separator * @param handle * @param config * @param bytes */ public WorkerExport(final String path, final CSVSyntax csvConfig, final DataHandle handle, final ARXConfiguration config, final long bytes) { this.path = path; this.bytes = bytes; this.csvSyntax = csvConfig; this.handle = handle; } @Override public void run(final IProgressMonitor arg0) throws InvocationTargetException, InterruptedException { arg0.beginTask(Resources.getMessage("WorkerExport.0"), 100); //$NON-NLS-1$ // Create output stream final File file = new File(path); FileOutputStream out = null; try { out = new FileOutputStream(file); } catch (final FileNotFoundException e) { error = e; arg0.done(); return; } // Track progress final CountingOutputStream cout = new CountingOutputStream(out); final Thread t = new Thread(new Runnable() { @Override public void run() { int previous = 0; while ((cout.getByteCount() != bytes) && !stop) { int progress = (int) ((double) cout.getByteCount() / (double) bytes * 100d); if (progress != previous) { arg0.worked(progress - previous); previous = progress; } try { Thread.sleep(100); } catch (final InterruptedException e) {/* Ignore*/} } } }); t.setDaemon(true); t.start(); // Export the data try { final CSVDataOutput csvout = new CSVDataOutput(cout, csvSyntax); csvout.write(handle.getView().iterator()); cout.close(); result = handle; stop = true; arg0.done(); } catch (final Exception e) { error = e; stop = true; arg0.done(); return; } } }