package org.esa.beam.smos.ee2netcdf.visat; import com.bc.ceres.core.ProgressMonitor; import com.bc.ceres.swing.progress.ProgressMonitorSwingWorker; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.Polygon; import com.vividsolutions.jts.io.WKTWriter; import org.esa.beam.framework.datamodel.Product; import org.esa.beam.framework.gpf.GPF; import org.esa.beam.framework.ui.AppContext; import org.esa.beam.smos.ee2netcdf.EEToNetCDFExporterOp; import org.esa.beam.smos.ee2netcdf.ExportParameter; import org.esa.beam.smos.gui.BindingConstants; import java.io.File; import java.text.MessageFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.concurrent.ExecutionException; class ConverterSwingWorker extends ProgressMonitorSwingWorker<List<Exception>, File> { private AppContext appContext; private ExportParameter exportParameter; ConverterSwingWorker(AppContext appContext, ExportParameter exportParameter) { super(appContext.getApplicationWindow(), "Converting EE to NetCDF"); this.appContext = appContext; this.exportParameter = exportParameter; } @Override protected List<Exception> doInBackground(ProgressMonitor pm) throws Exception { pm.beginTask("Converting product(s)", ProgressMonitor.UNKNOWN); final ArrayList<Exception> exceptions = new ArrayList<>(); final HashMap<String, Object> parameterMap = createParameterMap(exportParameter); try { if (exportParameter.isUseSelectedProduct()) { final Product selectedProduct = appContext.getSelectedProduct(); GPF.createProduct(EEToNetCDFExporterOp.ALIAS, parameterMap, new Product[]{selectedProduct}); } else { GPF.createProduct(EEToNetCDFExporterOp.ALIAS, parameterMap); } } catch (Exception e) { exceptions.add(e); } pm.done(); return exceptions; } @Override protected void done() { // @todo 3 tb/tb duplicated code - extract common swing worker for SMOS stuff tb 2013-04-05 try { final List<Exception> problemList = get(); if (!problemList.isEmpty()) { final StringBuilder message = new StringBuilder(); message.append("The following problem(s) have occurred:\n"); for (final Exception problem : problemList) { problem.printStackTrace(); message.append(" "); message.append(problem.getMessage()); message.append("\n"); } appContext.handleError(message.toString(), null); } } catch (InterruptedException e) { appContext.handleError(MessageFormat.format( "An error occurred: {0}", e.getMessage()), e); } catch (ExecutionException e) { appContext.handleError(MessageFormat.format( "An error occurred: {0}", e.getCause().getMessage()), e.getCause()); } } // package access for testing only tb 2013-04-05 static HashMap<String, Object> createParameterMap(ExportParameter exportParameter) { final HashMap<String, Object> parameterMap = new HashMap<>(); final File targetDirectory = exportParameter.getTargetDirectory(); if (targetDirectory != null) { parameterMap.put("targetDirectory", targetDirectory); } final File sourceDirectory = exportParameter.getSourceDirectory(); if (sourceDirectory != null && !exportParameter.isUseSelectedProduct()) { final String sourcePath = createInputPathWildcards(sourceDirectory); parameterMap.put("sourceProductPaths", sourcePath); } final int roiType = exportParameter.getRoiType(); if (roiType == BindingConstants.ROI_TYPE_AREA) { parameterMap.put("region", exportParameter.toAreaWKT()); } else if (roiType == BindingConstants.ROI_TYPE_GEOMETRY) { addSelectedProductGeometry(exportParameter.getRegion(), parameterMap); } else if (roiType == BindingConstants.ROI_TYPE_PRODUCT) { parameterMap.remove("region"); } if (exportParameter.isOverwriteTarget()) { parameterMap.put("overwriteTarget", "true"); } else { parameterMap.put("overwriteTarget", "false"); } return parameterMap; } // package access for testing only tb 2013-04-10 static String createInputPathWildcards(File sourceDirectory) { final StringBuilder sourcePath = new StringBuilder(); final String absolutePath = sourceDirectory.getAbsolutePath(); sourcePath.append(absolutePath); sourcePath.append(File.separator); sourcePath.append("*.zip,"); sourcePath.append(absolutePath); sourcePath.append(File.separator); sourcePath.append("*.dbl"); return sourcePath.toString(); } // package access for testing only tb 2013-07-21 static void addSelectedProductGeometry(Geometry geometry, HashMap<String, Object> parameterMap) { if (geometry instanceof Polygon) { final WKTWriter wktWriter = new WKTWriter(); final String multiPolygonWkt = wktWriter.write(geometry); parameterMap.put("region", multiPolygonWkt); } } }