1 package org.simantics.simulation.export;
\r
4 import java.io.IOException;
\r
5 import java.text.DecimalFormatSymbols;
\r
6 import java.util.Collections;
\r
7 import java.util.List;
\r
8 import java.util.Locale;
\r
10 import org.eclipse.core.runtime.preferences.InstanceScope;
\r
11 import org.eclipse.jface.preference.IPreferenceStore;
\r
12 import org.eclipse.ui.preferences.ScopedPreferenceStore;
\r
13 import org.osgi.service.prefs.Preferences;
\r
14 import org.simantics.databoard.Accessors;
\r
15 import org.simantics.databoard.Bindings;
\r
16 import org.simantics.databoard.Datatypes;
\r
17 import org.simantics.databoard.accessor.RecordAccessor;
\r
18 import org.simantics.databoard.accessor.error.AccessorConstructionException;
\r
19 import org.simantics.databoard.accessor.error.AccessorException;
\r
20 import org.simantics.databoard.accessor.reference.ChildReference;
\r
21 import org.simantics.databoard.binding.mutable.Variant;
\r
22 import org.simantics.databoard.type.Datatype;
\r
23 import org.simantics.databoard.type.DoubleType;
\r
24 import org.simantics.databoard.type.RecordType;
\r
25 import org.simantics.export.core.ExportContext;
\r
26 import org.simantics.export.core.error.ExportException;
\r
27 import org.simantics.export.core.intf.FormatClass;
\r
28 import org.simantics.export.core.manager.Content;
\r
29 import org.simantics.history.HistoryException;
\r
30 import org.simantics.history.csv.ColumnSeparator;
\r
31 import org.simantics.history.csv.DecimalSeparator;
\r
34 * This class represents the CSV (Comma Separated Value) file format.
\r
36 * @author toni.kalajainen@semantum.fi
\r
38 public class CSVFormat implements FormatClass {
\r
41 public static ChildReference P_CSV_COLUMN_SEPARATOR = ChildReference.parsePath("Comma Separated Value (CSV)/Column Separator");
\r
42 public static ChildReference P_CSV_DECIMAL_SEPARATOR = ChildReference.parsePath("Comma Separated Value (CSV)/Decimal Separator");
\r
43 public static ChildReference P_CSV_TIME_STEP = ChildReference.parsePath("Comma Separated Value (CSV)/Time Step");
\r
45 static RecordType options;
\r
46 static RecordType csvOptions;
\r
49 Datatype second = new DoubleType("s");
\r
51 csvOptions = new RecordType();
\r
52 csvOptions.addComponent("Time Step", second);
\r
53 csvOptions.addComponent("Column Separator", Datatypes.STRING);
\r
54 csvOptions.addComponent("Decimal Separator", Datatypes.STRING);
\r
56 options = new RecordType();
\r
57 options.addComponent("Comma Separated Value (CSV)", csvOptions);
\r
61 public RecordType options(ExportContext context)
\r
62 throws ExportException {
\r
67 public List<String> validate(ExportContext context, Variant options) throws ExportException {
\r
68 return Collections.emptyList();
\r
73 public void fillDefaultPrefs( ExportContext ctx, Variant options ) throws ExportException {
\r
74 // 1. Figure out suitable default values
\r
75 IPreferenceStore csvnode = new ScopedPreferenceStore( InstanceScope.INSTANCE, CSVPreferences.P_NODE );
\r
77 Double timeStep = CSVPreferences.DEFAULT_CSV_TIME_STEP;
\r
78 String decimalSeparator = ".";
\r
79 String columnSeparator = "\t";
\r
81 Locale locale = Locale.getDefault();
\r
82 DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance( locale );
\r
83 decimalSeparator = symbols.getDecimalSeparator()+"";
\r
84 columnSeparator = decimalSeparator.equals(",")?"\\t":",";
\r
86 if (csvnode != null) {
\r
87 if ( csvnode.contains(CSVPreferences.P_CSV_TIME_STEP) ) timeStep = csvnode.getDouble(CSVPreferences.P_CSV_TIME_STEP);
\r
88 if ( csvnode.contains(CSVPreferences.P_CSV_DECIMAL_SEPARATOR) ) decimalSeparator = csvnode.getString(CSVPreferences.P_CSV_DECIMAL_SEPARATOR);
\r
89 if ( csvnode.contains(CSVPreferences.P_CSV_COLUMN_SEPARATOR) ) columnSeparator = csvnode.getString(CSVPreferences.P_CSV_COLUMN_SEPARATOR);
\r
92 // 2. Write default values
\r
94 RecordAccessor ra = Accessors.getAccessor(options);
\r
95 ra.setValue(P_CSV_COLUMN_SEPARATOR, Bindings.STRING, columnSeparator);
\r
96 ra.setValue(P_CSV_DECIMAL_SEPARATOR, Bindings.STRING, decimalSeparator);
\r
97 ra.setValue(P_CSV_TIME_STEP, Bindings.DOUBLE, timeStep);
\r
99 } catch (AccessorConstructionException e) {
\r
100 throw new ExportException(e);
\r
101 } catch (AccessorException e) {
\r
102 throw new ExportException(e);
\r
107 public void savePref(Variant options, Preferences contentScopeNode, Preferences workbenchScopeNode) throws ExportException {
\r
109 RecordAccessor ra = Accessors.getAccessor(options);
\r
111 String columnSeparator = (String) ra.getValue( P_CSV_COLUMN_SEPARATOR, Bindings.STRING );
\r
112 if ( columnSeparator != null ) workbenchScopeNode.put(CSVPreferences.P_CSV_COLUMN_SEPARATOR, columnSeparator);
\r
114 String decimalSeparator = (String) ra.getValue(P_CSV_DECIMAL_SEPARATOR, Bindings.STRING );
\r
115 if ( decimalSeparator != null ) workbenchScopeNode.put(CSVPreferences.P_CSV_DECIMAL_SEPARATOR, decimalSeparator);
\r
117 Double timeStep = (Double) ra.getValue(P_CSV_TIME_STEP, Bindings.DOUBLE );
\r
118 if ( timeStep != null ) contentScopeNode.putDouble(CSVPreferences.P_CSV_TIME_STEP, timeStep);
\r
120 } catch (AccessorConstructionException e) {
\r
121 throw new ExportException(e);
\r
122 } catch (AccessorException e) {
\r
123 throw new ExportException(e);
\r
128 public void loadPref(Variant options, Preferences contentScopeNode, Preferences workbenchScopeNode) throws ExportException {
\r
130 RecordAccessor ra = Accessors.getAccessor(options);
\r
132 String columnSeparator = workbenchScopeNode.get(CSVPreferences.P_CSV_COLUMN_SEPARATOR, null);
\r
133 if ( columnSeparator != null ) ra.setValue(P_CSV_COLUMN_SEPARATOR, Bindings.STRING, columnSeparator );
\r
135 String decimalSeparator = workbenchScopeNode.get(CSVPreferences.P_CSV_DECIMAL_SEPARATOR, null);
\r
136 if ( decimalSeparator != null ) ra.setValue(P_CSV_DECIMAL_SEPARATOR, Bindings.STRING, decimalSeparator );
\r
138 Double timeStep = contentScopeNode.getDouble(CSVPreferences.P_CSV_TIME_STEP, 0);
\r
139 if ( timeStep != null ) ra.setValue(P_CSV_TIME_STEP, Bindings.DOUBLE, timeStep );
\r
141 } catch (AccessorConstructionException e) {
\r
142 throw new ExportException(e);
\r
143 } catch (AccessorException e) {
\r
144 throw new ExportException(e);
\r
149 public Object createFile(ExportContext context, File outputFile, Variant options) throws ExportException {
\r
150 CSVWriter writer = new CSVWriter();
\r
151 writer.file = outputFile;
\r
154 /// Read configurations
\r
155 RecordAccessor ra = Accessors.getAccessor(options);
\r
158 Double startTime = (Double) ra.getValue( ExperimentExportClass.P_EXPERIMENT_START, Bindings.DOUBLE );
\r
159 Double endTime = (Double) ra.getValue( ExperimentExportClass.P_EXPERIMENT_END, Bindings.DOUBLE );
\r
160 writer.setTimeRange(startTime, endTime);
\r
163 String columnSeparator = (String) ra.getValue( CSVFormat.P_CSV_COLUMN_SEPARATOR, Bindings.STRING );
\r
164 writer.setColumnSeparator(ColumnSeparator.fromPreference(columnSeparator));
\r
166 String decimalSeparator = (String) ra.getValue( CSVFormat.P_CSV_DECIMAL_SEPARATOR, Bindings.STRING );
\r
167 writer.setDecimalSeparator(DecimalSeparator.fromPreference(decimalSeparator));
\r
169 Double timeStep = (Double) ra.getValue( CSVFormat.P_CSV_TIME_STEP, Bindings.DOUBLE );
\r
170 writer.setTimeStep(timeStep);
\r
172 } catch (AccessorConstructionException e) {
\r
173 throw new ExportException(e);
\r
174 } catch (AccessorException e) {
\r
175 throw new ExportException(e);
\r
182 public Object openFile(ExportContext context, File inputFile, Variant options) throws ExportException {
\r
183 throw new ExportException("Not implemented");
\r
187 public void closeFile(ExportContext context, Object handle_) throws ExportException {
\r
188 CSVWriter handle = (CSVWriter) handle_;
\r
191 } catch (IOException e) {
\r
192 throw new ExportException(e);
\r
193 } catch (HistoryException e) {
\r
194 throw new ExportException(e);
\r
199 public void addAttachment(ExportContext context, Object handle, List<Content> attachments) throws ExportException {
\r
200 throw new ExportException( "Cannot add attachments to a CSV file." );
\r