/* * Copyright (c) 2012 Data Harmonisation Panel * * All rights reserved. This program and the accompanying materials are made * available under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the License, * or (at your option) any later version. * * You should have received a copy of the GNU Lesser General Public License * along with this distribution. If not, see <http://www.gnu.org/licenses/>. * * Contributors: * Data Harmonisation Panel <http://www.dhpanel.eu> */ package eu.esdihumboldt.hale.common.headless.transform; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import de.fhg.igd.slf4jplus.ALogger; import de.fhg.igd.slf4jplus.ALoggerFactory; import de.fhg.igd.slf4jplus.ATransaction; import eu.esdihumboldt.hale.common.core.io.IOAdvisor; import eu.esdihumboldt.hale.common.core.io.ProgressMonitorIndicator; import eu.esdihumboldt.hale.common.core.io.report.IOReport; import eu.esdihumboldt.hale.common.core.io.report.IOReporter; import eu.esdihumboldt.hale.common.core.io.report.impl.IOMessageImpl; import eu.esdihumboldt.hale.common.core.report.ReportHandler; import eu.esdihumboldt.hale.common.instance.io.InstanceWriter; /** * Job for exporting transformed data supplied in a {@link TransformationSink}. * * @author Kai Schwierczek * @author Simon Templer */ public class ExportJob extends AbstractTransformationJob { private static final ALogger log = ALoggerFactory.getLogger(ExportJob.class); private TransformationSink targetSink; private InstanceWriter writer; private IOAdvisor<InstanceWriter> advisor; private ReportHandler reportHandler; /** * Create a job for exporting transformed data supplied in the given target * sink. * * @param targetSink the target sink * @param writer the instance writer * @param advisor the advisor, to handle the results * @param reportHandler the report handler */ public ExportJob(TransformationSink targetSink, InstanceWriter writer, IOAdvisor<InstanceWriter> advisor, ReportHandler reportHandler) { super("Encoding"); this.targetSink = targetSink; this.writer = writer; this.advisor = advisor; this.reportHandler = reportHandler; } /** * @see org.eclipse.core.runtime.jobs.Job#canceling() */ @Override protected void canceling() { // must cancel sink, otherwise it may be blocking targetSink.done(true); } /** * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor) */ @Override protected IStatus run(IProgressMonitor monitor) { IOReporter defaultReporter = writer.createReporter(); defaultReporter.setSuccess(false); IOReport report = defaultReporter; try { ATransaction trans = log.begin(defaultReporter.getTaskName()); try { IOReport result = writer.execute(new ProgressMonitorIndicator(monitor)); if (result != null) { report = result; } else { defaultReporter.setSuccess(true); } } catch (Throwable e) { defaultReporter.error(new IOMessageImpl(e.getLocalizedMessage(), e)); } finally { trans.end(); } } catch (Throwable e) { defaultReporter.error(new IOMessageImpl(e.getLocalizedMessage(), e)); } if (monitor.isCanceled()) { reset(); return Status.CANCEL_STATUS; } // add report to report service reportHandler.publishReport(report); // show message to user if (report.isSuccess()) { // no message, we rely on the report being // shown/processed // let advisor handle results advisor.handleResults(writer); reset(); return Status.OK_STATUS; } else { reset(); log.error(report.getSummary()); return new Status(Status.ERROR, "eu.esdihumboldt.hale.common.headless", report.getSummary(), null); } } /** * Reset the Job so no references to other objects reside. * * Necessary as jobs are referenced by the job manager even after execution. */ private void reset() { if (targetSink != null) { targetSink.dispose(); } writer = null; targetSink = null; advisor = null; reportHandler = null; } }