package org.esa.snap.pixex.visat; import org.esa.snap.core.datamodel.GenericPlacemarkDescriptor; import org.esa.snap.core.datamodel.GeoPos; import org.esa.snap.core.datamodel.Placemark; import org.esa.snap.core.datamodel.ProductData; import org.esa.snap.core.util.PropertyMap; import org.esa.snap.core.util.SystemUtils; import org.esa.snap.core.util.io.SnapFileFilter; import org.esa.snap.pixex.PixExOpUtils; import org.esa.snap.ui.AppContext; import org.esa.snap.ui.SnapFileChooser; import org.opengis.feature.simple.SimpleFeature; import javax.swing.AbstractAction; import javax.swing.JFileChooser; import javax.swing.JPanel; import java.awt.event.ActionEvent; import java.io.File; import java.io.IOException; import java.text.DateFormat; import java.text.ParseException; import java.util.Date; import java.util.List; class AddCsvFileAction extends AbstractAction { private static final String LAST_OPEN_CSV_DIR = "beam.pixex.lastOpenCsvDir"; private static final String ISO8601_PATTERN = "yyyy-MM-dd'T'HH:mm:ss"; private static final DateFormat dateFormat = ProductData.UTC.createDateFormat(ISO8601_PATTERN); private final AppContext appContext; private final JPanel parent; private final CoordinateTableModel tableModel; AddCsvFileAction(AppContext appContext, CoordinateTableModel tableModel, JPanel parent) { super("Add measurements from CSV file..."); this.appContext = appContext; this.parent = parent; this.tableModel = tableModel; } @Override public void actionPerformed(ActionEvent e) { PropertyMap preferences = appContext.getPreferences(); final SnapFileChooser fileChooser = getFileChooser( preferences.getPropertyString(LAST_OPEN_CSV_DIR, SystemUtils.getUserHomeDir().getPath())); int answer = fileChooser.showDialog(parent, "Select"); if (answer == JFileChooser.APPROVE_OPTION) { File selectedFile = fileChooser.getSelectedFile(); preferences.setPropertyString(LAST_OPEN_CSV_DIR, selectedFile.getParent()); try { final List<SimpleFeature> extendedFeatures = PixExOpUtils.extractFeatures(selectedFile); for (SimpleFeature extendedFeature : extendedFeatures) { final GenericPlacemarkDescriptor placemarkDescriptor = new GenericPlacemarkDescriptor( extendedFeature.getFeatureType()); final Placemark placemark = placemarkDescriptor.createPlacemark(extendedFeature); setName(extendedFeature, placemark); setDateTime(extendedFeature, placemark); setPlacemarkGeoPos(extendedFeature, placemark); tableModel.addPlacemark(placemark); } } catch (IOException exception) { appContext.handleError(String.format("Error occurred while reading file: %s \n" + exception.getLocalizedMessage() + "\nPossible reason: Other char separator than tabulator used", selectedFile), exception); } } } private void setName(SimpleFeature extendedFeature, Placemark placemark) { if (extendedFeature.getAttribute("Name") != null) { placemark.setName(extendedFeature.getAttribute("Name").toString()); } } private void setDateTime(SimpleFeature extendedFeature, Placemark placemark) { Object dateTime = extendedFeature.getAttribute("DateTime"); if (dateTime != null && dateTime instanceof String) { try { final Date date = dateFormat.parse((String) dateTime); placemark.getFeature().setAttribute(Placemark.PROPERTY_NAME_DATETIME, date); } catch (ParseException ignored) { } } } private void setPlacemarkGeoPos(SimpleFeature extendedFeature, Placemark placemark) throws IOException { final GeoPos geoPos = PixExOpUtils.getGeoPos(extendedFeature); placemark.setGeoPos(geoPos); } private SnapFileChooser getFileChooser(String lastDir) { final SnapFileChooser fileChooser = new SnapFileChooser(); fileChooser.setFileFilter(new SnapFileFilter("CSV", new String[]{".csv", ".txt", ".ascii"}, "CSV files")); fileChooser.setCurrentDirectory(new File(lastDir)); return fileChooser; } }