]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.simulation/src/org/simantics/simulation/export/CSVFormat.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.simulation / src / org / simantics / simulation / export / CSVFormat.java
1 package org.simantics.simulation.export;\r
2 \r
3 import java.io.File;\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
9 \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
32 \r
33 /**\r
34  * This class represents the CSV (Comma Separated Value) file format.\r
35  *\r
36  * @author toni.kalajainen@semantum.fi\r
37  */\r
38 public class CSVFormat implements FormatClass {\r
39 \r
40         // Accessor paths\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
44         \r
45         static RecordType options;\r
46     static RecordType csvOptions;\r
47     \r
48     static {\r
49             Datatype second = new DoubleType("s");\r
50         \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
55 \r
56         options = new RecordType();\r
57         options.addComponent("Comma Separated Value (CSV)", csvOptions);\r
58     }\r
59         \r
60         @Override\r
61         public RecordType options(ExportContext context)\r
62         throws ExportException {\r
63                 return options;\r
64         }\r
65 \r
66         @Override\r
67         public List<String> validate(ExportContext context, Variant options) throws ExportException {\r
68                 return Collections.emptyList();\r
69         }\r
70         \r
71 \r
72         @Override\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
76         \r
77         Double timeStep = CSVPreferences.DEFAULT_CSV_TIME_STEP;\r
78         String decimalSeparator = ".";\r
79         String columnSeparator = "\t";\r
80         \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
85 \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
90         }\r
91                 \r
92         // 2. Write default values\r
93         try {\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
98                         \r
99                 } catch (AccessorConstructionException e) {\r
100                         throw new ExportException(e);\r
101                 } catch (AccessorException e) {\r
102                         throw new ExportException(e);\r
103                 }\r
104         }\r
105 \r
106         @Override\r
107         public void savePref(Variant options, Preferences contentScopeNode, Preferences workbenchScopeNode) throws ExportException {\r
108                 try {\r
109                         RecordAccessor ra = Accessors.getAccessor(options);\r
110                         \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
113                         \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
116                         \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
119 \r
120                 } catch (AccessorConstructionException e) {\r
121                         throw new ExportException(e);\r
122                 } catch (AccessorException e) {\r
123                         throw new ExportException(e);\r
124                 }               \r
125         }\r
126 \r
127         @Override\r
128         public void loadPref(Variant options, Preferences contentScopeNode, Preferences workbenchScopeNode) throws ExportException {\r
129                 try {\r
130                         RecordAccessor ra = Accessors.getAccessor(options);\r
131                         \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
134                         \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
137                         \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
140 \r
141                 } catch (AccessorConstructionException e) {\r
142                         throw new ExportException(e);\r
143                 } catch (AccessorException e) {\r
144                         throw new ExportException(e);\r
145                 }               \r
146         }\r
147         \r
148         @Override\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
152 \r
153                 try {\r
154                         /// Read configurations \r
155                         RecordAccessor ra = Accessors.getAccessor(options);\r
156                                 \r
157                         // Start, End time\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
161                 \r
162                 // Separators\r
163                         String columnSeparator = (String) ra.getValue( CSVFormat.P_CSV_COLUMN_SEPARATOR, Bindings.STRING );\r
164                         writer.setColumnSeparator(ColumnSeparator.fromPreference(columnSeparator));\r
165                         \r
166                         String decimalSeparator = (String) ra.getValue( CSVFormat.P_CSV_DECIMAL_SEPARATOR, Bindings.STRING );\r
167                         writer.setDecimalSeparator(DecimalSeparator.fromPreference(decimalSeparator));\r
168                         \r
169                         Double timeStep = (Double) ra.getValue( CSVFormat.P_CSV_TIME_STEP, Bindings.DOUBLE );\r
170                         writer.setTimeStep(timeStep);\r
171                         \r
172                 } catch (AccessorConstructionException e) {\r
173                         throw new ExportException(e);\r
174                 } catch (AccessorException e) {\r
175                         throw new ExportException(e);\r
176                 }               \r
177                 \r
178                 return writer;\r
179         }\r
180 \r
181         @Override\r
182         public Object openFile(ExportContext context, File inputFile, Variant options) throws ExportException {\r
183                 throw new ExportException("Not implemented");\r
184         }\r
185 \r
186         @Override\r
187         public void closeFile(ExportContext context, Object handle_) throws ExportException {\r
188                 CSVWriter handle = (CSVWriter) handle_;\r
189                 try {\r
190                         handle.write();\r
191                 } catch (IOException e) {\r
192                         throw new ExportException(e);\r
193                 } catch (HistoryException e) {\r
194                         throw new ExportException(e);\r
195                 }\r
196         }\r
197         \r
198         @Override\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
201         }\r
202 \r
203 }\r