--- /dev/null
+package org.simantics.simulation.export;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Collections;\r
+import java.util.List;\r
+\r
+import org.eclipse.core.runtime.IProgressMonitor;\r
+import org.simantics.Simantics;\r
+import org.simantics.databoard.binding.error.BindingException;\r
+import org.simantics.databoard.binding.mutable.Variant;\r
+import org.simantics.databoard.util.Bean;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.export.core.ExportContext;\r
+import org.simantics.export.core.error.ExportException;\r
+import org.simantics.export.core.intf.ExportClass;\r
+import org.simantics.export.core.manager.Content;\r
+import org.simantics.history.History;\r
+import org.simantics.history.HistoryException;\r
+import org.simantics.history.HistoryManager;\r
+import org.simantics.history.ItemManager;\r
+import org.simantics.history.util.subscription.SamplingFormat;\r
+import org.simantics.simulation.experiment.IExperiment;\r
+import org.simantics.simulation.experiment.IHistoryExperiment;\r
+import org.simantics.simulation.export.CSVItemsQuery.CSVItem;\r
+import org.simantics.simulation.project.ExperimentManager;\r
+import org.simantics.simulation.project.IExperimentManager;\r
+import org.simantics.utils.datastructures.MapList;\r
+\r
+public class ExportSubscriptionCSV extends ExperimentExportClass implements ExportClass {\r
+ \r
+ @Override\r
+ public void export(List<Content> contents, \r
+ Object writer_,\r
+ ExportContext context, \r
+ Variant options,\r
+ IProgressMonitor monitor, \r
+ MapList<Content, Content> attachmentMap\r
+ ) throws ExportException {\r
+ \r
+ // Flush all experiments, just in case.\r
+ IExperimentManager em = Simantics.getProject().getHint( ExperimentManager.KEY_EXPERIMENT_MANAGER );\r
+ if ( em != null ) {\r
+ for (IExperiment exp : em.getExperiments()) {\r
+ if ( exp instanceof IHistoryExperiment ) {\r
+ IHistoryExperiment he = (IHistoryExperiment) exp;\r
+ try {\r
+ he.flushHistory();\r
+ } catch (HistoryException e) {\r
+ }\r
+ }\r
+ }\r
+ }\r
+ \r
+ CSVWriter writer = (CSVWriter) writer_; \r
+ List<HistoryManager> historiesToClose = new ArrayList<HistoryManager>(); \r
+ try {\r
+ List<ModelRef> models = ExperimentExportClass.getResult(context, options, true);\r
+ \r
+ // Label format is the following\r
+ // "MODEL EXPERIMENT/RUN ITEM" \r
+ // MODEL is omited, if itemCount <= 1\r
+ // RUN is omited, if runCount <= 1 \r
+ int runCount = 0;\r
+ int modelCount = models.size();\r
+ for (ModelRef model : models) runCount += model.enabledRunCount();\r
+\r
+ List<CSVItem> items = new ArrayList<CSVItem>();\r
+ for (Content content : contents) {\r
+ items.addAll( context.session.syncRequest( new CSVItemsQuery( content.url ) ) );\r
+ }\r
+\r
+ // \r
+ for (ModelRef model : models) {\r
+ for (ExperimentRef experiment : model.experiments) {\r
+ if ( experiment.runs.isEmpty() ) continue; \r
+ for (RunRef run : experiment.runs) { \r
+ if ( run.historyFolder == null || !run.historyFolder.exists() ) continue;\r
+ \r
+ HistoryManager history = History.openFileHistory( run.historyFolder );\r
+ historiesToClose.add( history );\r
+ ItemManager im = new ItemManager( history.getItems() );\r
+ \r
+ for ( CSVItem item : items ) {\r
+ if ( !item.modelUri.equals( model.uri ) ) continue;\r
+ StringBuilder labelBuilder = new StringBuilder();\r
+ labelBuilder.append( item.label );\r
+ if ( modelCount>1 ) {\r
+ labelBuilder.append(" (");\r
+ labelBuilder.append(model.label);\r
+ labelBuilder.append(")");\r
+ }\r
+ if ( runCount>1 ) {\r
+ labelBuilder.append(" (");\r
+ labelBuilder.append( experiment.label );\r
+ labelBuilder.append( "\\" );\r
+ labelBuilder.append( run.label );\r
+ labelBuilder.append(")");\r
+ }\r
+ \r
+ List<Bean> historyItems = im.search("variableId", item.variableReference);\r
+ Collections.sort(historyItems, SamplingFormat.INTERVAL_COMPARATOR);\r
+ if (items.isEmpty()) continue;\r
+ Bean config = historyItems.get(0);\r
+ String historyId = (String) config.getFieldUnchecked("id");\r
+ \r
+ writer.addItem(history, historyId, labelBuilder.toString(), item.variableReference, item.unit);\r
+ }\r
+ \r
+ }\r
+ }\r
+ }\r
+ \r
+ } catch (DatabaseException e) {\r
+ throw new ExportException( e );\r
+ } catch (HistoryException e) {\r
+ throw new ExportException( e );\r
+ } catch (BindingException e) {\r
+ throw new ExportException( e );\r
+ } finally {\r
+ for (HistoryManager history : historiesToClose) history.close();\r
+ }\r
+ \r
+ }\r
+\r
+ @Override\r
+ public List<String> validate(String contentUri, ExportContext context, Variant options) {\r
+ return Collections.emptyList();\r
+ }\r
+ \r
+}\r
+\r