-/*******************************************************************************\r
- * Copyright (c) 2007, 2011 Association for Decentralized Information Management in\r
- * Industry THTH ry.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.history.test;\r
-\r
-import java.io.ByteArrayInputStream;\r
-import java.io.ByteArrayOutputStream;\r
-import java.io.File;\r
-import java.io.IOException;\r
-\r
-import org.junit.After;\r
-import org.junit.Assert;\r
-import org.junit.Before;\r
-import org.junit.Test;\r
-import org.simantics.databoard.Bindings;\r
-import org.simantics.databoard.Datatypes;\r
-import org.simantics.databoard.accessor.StreamAccessor;\r
-import org.simantics.databoard.accessor.error.AccessorException;\r
-import org.simantics.databoard.binding.Binding;\r
-import org.simantics.databoard.binding.impl.DoubleArrayBinding;\r
-import org.simantics.databoard.type.ArrayType;\r
-import org.simantics.databoard.type.RecordType;\r
-import org.simantics.databoard.util.Bean;\r
-import org.simantics.databoard.util.Limit;\r
-import org.simantics.databoard.util.Range;\r
-import org.simantics.history.Collector;\r
-import org.simantics.history.History;\r
-import org.simantics.history.HistoryException;\r
-import org.simantics.history.HistoryManager;\r
-import org.simantics.history.csv.CSVFormatter;\r
-import org.simantics.history.impl.CollectorImpl;\r
-import org.simantics.history.impl.CollectorState;\r
-import org.simantics.history.util.ProgressMonitor;\r
-import org.simantics.history.util.StreamIterator;\r
-import org.simantics.history.util.Stream;\r
-import org.simantics.history.util.ValueBand;\r
-import org.simantics.history.util.subscription.SubscriptionItem;\r
-import org.simantics.history.util.subscription.SamplingFormat;\r
-import org.simantics.utils.FileUtils;\r
-\r
-public class TestHistory {\r
- \r
- static final double NaN = Double.NaN;\r
- \r
- // Time 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4\r
- double[] data1 = { 5.0, 5.0, 5.0, 5.0, 6.0, 6.0, 6.0, 7.0, 8.0, 9.0, NaN,10.0, NaN, NaN, NaN }; \r
- double[] data2 = { 5.0, 5.0, 5.0, 5.0, 6.0, 6.0, 6.0, 7.0, 8.0, 9.0,10.0, 9.0, 5.0, 4.0, 3.0 };\r
- byte[] data3 = { 5, 6, 7, 8, 9, 10, 9, 5, 4, 3 };\r
- \r
- // Subscription formats\r
- SamplingFormat simple, allfields, vector, minmax, byteformat, string;\r
-\r
- // History\r
- HistoryManager historian;\r
- File workarea;\r
- Collector collector;\r
-\r
- @Before \r
- public void initSubscriptionFormats()\r
- {\r
- simple = new SamplingFormat();\r
- simple.formatId = "simple";\r
- RecordType format;\r
- format = (RecordType) (simple.format = new RecordType());\r
- format.addComponent("time", Datatypes.FLOAT);\r
- format.addComponent("endTime", Datatypes.FLOAT);\r
- format.addComponent("value", Datatypes.DOUBLE );\r
- format.addComponent("quality", Datatypes.BYTE );\r
- simple.interval = NaN;\r
- simple.deadband = NaN;\r
-\r
- string = new SamplingFormat();\r
- string.formatId = "string";\r
- format = (RecordType) (string.format = new RecordType());\r
- format.addComponent("time", Datatypes.FLOAT);\r
- format.addComponent("endTime", Datatypes.FLOAT);\r
- format.addComponent("value", Datatypes.STRING );\r
- format.addComponent("quality", Datatypes.BYTE );\r
- string.interval = NaN;\r
- string.deadband = NaN;\r
- \r
- allfields = new SamplingFormat();\r
- allfields.formatId = "alldata"; \r
- format = (RecordType) (allfields.format = new RecordType());\r
- format.addComponent("time", Datatypes.DOUBLE);\r
- format.addComponent("endTime", Datatypes.DOUBLE);\r
- format.addComponent("value", Datatypes.DOUBLE );\r
- format.addComponent("lastValue", Datatypes.DOUBLE); \r
- format.addComponent("min", Datatypes.DOUBLE);\r
- format.addComponent("max", Datatypes.DOUBLE);\r
- format.addComponent("avg", Datatypes.DOUBLE);\r
- format.addComponent("median", Datatypes.DOUBLE);\r
- format.addComponent("quality", Datatypes.BYTE );\r
- format.addComponent("count", Datatypes.INTEGER);\r
- allfields.interval = NaN;\r
- allfields.deadband = NaN; \r
-\r
- byteformat = new SamplingFormat();\r
- byteformat.formatId = "byte";\r
- byteformat.format = new RecordType();\r
- format = (RecordType) (byteformat.format = new RecordType());\r
- format.addComponent("time", Datatypes.DOUBLE);\r
- format.addComponent("endTime", Datatypes.DOUBLE);\r
- format.addComponent("value", Datatypes.BYTE);\r
- format.addComponent("lastValue", Datatypes.BYTE); \r
- format.addComponent("min", Datatypes.BYTE);\r
- format.addComponent("max", Datatypes.BYTE);\r
- format.addComponent("avg", Datatypes.DOUBLE);\r
- format.addComponent("median", Datatypes.BYTE);\r
- format.addComponent("quality", Datatypes.BYTE);\r
- format.addComponent("count", Datatypes.INTEGER);\r
- byteformat.interval = NaN;\r
- byteformat.deadband = NaN; \r
- \r
- vector = new SamplingFormat();\r
- vector.formatId = "vector";\r
- vector.format = new RecordType();\r
- format = (RecordType) (vector.format = new RecordType());\r
- format.addComponent("time", Datatypes.FLOAT);\r
- format.addComponent("endTime", Datatypes.FLOAT);\r
- format.addComponent("value", new ArrayType( Datatypes.DOUBLE, Range.between(Limit.inclusive(3), Limit.inclusive(3)) ));\r
- format.addComponent("count", Datatypes.INTEGER);\r
- vector.interval = NaN;\r
- vector.deadband = NaN;\r
- \r
- minmax = new SamplingFormat();\r
- minmax.formatId = "minmax";\r
- minmax.format = new RecordType();\r
- format = (RecordType) (minmax.format = new RecordType());\r
- format.addComponent("time", Datatypes.FLOAT);\r
- format.addComponent("endTime", Datatypes.FLOAT);\r
- format.addComponent("value", Datatypes.DOUBLE );\r
- format.addComponent("min", Datatypes.DOUBLE );\r
- format.addComponent("max", Datatypes.DOUBLE );\r
- minmax.interval = Double.MAX_VALUE;\r
- minmax.deadband = Double.MAX_VALUE; \r
- }\r
-\r
- @Before\r
- public void initHistory() {\r
- CollectorState cs = new CollectorState();\r
- workarea = FileUtils.createTmpDir();\r
- System.out.println(workarea);\r
- historian = History.openFileHistory( workarea );\r
-// historian = History.createMemoryHistory();\r
- collector = new CollectorImpl( historian );\r
- }\r
- \r
- @After \r
- public void uninitHistory() {\r
- if ( collector != null ) {\r
- collector.close(); \r
- }\r
- if ( historian != null ) {\r
- historian.close();\r
- }\r
- if ( workarea != null) {\r
- try {\r
- FileUtils.deleteAll(workarea);\r
- } catch (IOException e) {\r
- e.printStackTrace();\r
- }\r
- }\r
- }\r
- \r
- @Test\r
- public void testGetModifySubscription() throws Exception\r
- {\r
- // 1. Create Item and Collector\r
- SubscriptionItem hi = SubscriptionItem.createItem("NotMyVariable", "MySubscription", allfields);\r
- historian.create(hi);\r
- collector.addItem(hi);\r
- \r
- // 2. Get Item\r
- SubscriptionItem[] items = collector.getItems(); \r
- Assert.assertEquals(1, items.length);\r
- SubscriptionItem hii = new SubscriptionItem();\r
- hii.readAvailableFields( items[0] );\r
- Assert.assertTrue( hii.equalContents( hi ) );\r
- \r
- // 3. Modify Item\r
- hi.variableId = "MyVariable";\r
- collector.setItem(hi);\r
- items = collector.getItems(); \r
- Assert.assertEquals(1, items.length);\r
- hii.readAvailableFields( items[0] );\r
- Assert.assertTrue( hii.equalContents( hi ) );\r
- \r
- // 4. Remove & Add\r
- collector.removeItem(hi.id);\r
- Assert.assertEquals(0, collector.getItems().length);\r
- collector.addItem(hi);\r
- \r
- // 5. Open & Modify subscription\r
- collector.beginStep(Bindings.DOUBLE, 5.0);\r
- hi.interval = 1.2;\r
- collector.setItem(hi);\r
- collector.endStep();\r
- collector.close();\r
-\r
- // 6. Read from history\r
- Bean bean = historian.getItem(hi.id);\r
- hi.interval = 0.0;\r
- hi.readAvailableFields(bean);\r
- Assert.assertEquals(1.2, hi.interval, 0.1);\r
- }\r
-\r
- @Test\r
- public void failtestRecreateSubscription() throws HistoryException\r
- {\r
- Collector collector2;\r
- SubscriptionItem hi = SubscriptionItem.createItem("MyVariable", "MySubscription", allfields);\r
- historian.create(hi);\r
- \r
- collector.addItem( hi );\r
- collector2 = new CollectorImpl( historian );\r
- collector2.addItem( hi );\r
- \r
- try {\r
- collector.beginStep(Bindings.DOUBLE, 0.0);\r
- collector2.beginStep(Bindings.DOUBLE, 0.0);\r
- Assert.fail("Recreate subscription should have failed");\r
- } catch (HistoryException e) {\r
- // expected exception\r
- }\r
- \r
- collector2.close();\r
- }\r
-\r
- @Test\r
- public void failtestReopenStream() throws HistoryException\r
- {\r
- // 1. Create history and collector item\r
- SamplingFormat format = allfields.clone();\r
- format.deadband = 2.5;\r
- SubscriptionItem[] his = SubscriptionItem.createItems("MyVariable", "MySubscription", allfields, minmax);\r
- historian.create(his);\r
- StreamAccessor sa1=null, sa2=null;\r
- try {\r
- sa1 = historian.openStream(his[0].id, "r");\r
- sa2 = historian.openStream(his[1].id, "r");\r
- Assert.fail("HistoryManager must not allow to open two handles to same subscription");\r
- } catch (HistoryException he) {\r
- // Expected exception\r
- }\r
- try {\r
- if (sa1!=null)sa1.close();\r
- if (sa2!=null) sa2.close();\r
- } catch (AccessorException e) {\r
- throw new HistoryException(e);\r
- }\r
- \r
- historian.delete( his[0].id, his[1].id );\r
- }\r
- \r
- @Test\r
- public void testDisableItem() throws Exception {\r
- // 1. Create history and collector item\r
- SamplingFormat format = allfields.clone();\r
- format.deadband = 2.5;\r
- SubscriptionItem[] hi = SubscriptionItem.createItems("MyVariable", "MySubscription", allfields, minmax);\r
- historian.create(hi); \r
- \r
- // 2. Create collector\r
- collector.addItems(hi);\r
- \r
- // Write data\r
- try {\r
- // Simulate\r
- double[] data = data1;\r
- for (int i=0; i<4; i++) \r
- {\r
- collector.beginStep(Bindings.DOUBLE, i * 0.1);\r
- collector.setValue("MyVariable", Bindings.DOUBLE, data[i]);\r
- collector.endStep();\r
- }\r
- \r
- // Disable item\r
- hi[0].enabled = false;\r
- collector.setItem(hi[0]);\r
- for (int i=4; i<12; i++) \r
- {\r
- collector.beginStep(Bindings.DOUBLE, i * 0.1);\r
- collector.setValue("MyVariable", Bindings.DOUBLE, data[i]);\r
- collector.endStep();\r
- }\r
- \r
- // Enable item\r
- hi[0].enabled = true;\r
- collector.setItem(hi[0]);\r
- for (int i=12; i<data.length; i++) \r
- {\r
- collector.beginStep(Bindings.DOUBLE, i * 0.1);\r
- collector.setValue("MyVariable", Bindings.DOUBLE, data[i]);\r
- collector.endStep();\r
- } \r
- \r
- } finally {\r
- collector.close();\r
- }\r
- \r
- \r
- // 3. Verify data\r
- StreamAccessor aa = historian.openStream(hi[0].id, "r");\r
- try {\r
- Binding sampleBinding = Bindings.getBinding( allfields.format );\r
- \r
- // Read and assert the sample\r
- Object sample = aa.get(0, sampleBinding);\r
- ValueBand se = new ValueBand( sampleBinding, sample );\r
- if (se.supportsNullValue()) { \r
- Assert.assertEquals(0.0, (Double) se.getTime( Bindings.DOUBLE ), 0.01);\r
- Assert.assertEquals(0.3, (Double) se.getEndTime( Bindings.DOUBLE ), 0.01);\r
- Assert.assertFalse( se.isNullValue() );\r
- \r
- aa.get(1, sampleBinding, sample);\r
- Assert.assertEquals(0.4, (Double) se.getTime( Bindings.DOUBLE ), 0.01);\r
- Assert.assertEquals(1.1, (Double) se.getEndTime( Bindings.DOUBLE ), 0.01);\r
- Assert.assertTrue( se.isNullValue() );\r
- \r
- aa.get(2, sampleBinding, sample); \r
- Assert.assertEquals(1.2, (Double) se.getTime( Bindings.DOUBLE ), 0.01);\r
- }\r
- \r
- } finally {\r
- aa.close();\r
- }\r
-\r
- // 4. Verify min-max has only 1 sample\r
- aa = historian.openStream(hi[1].id, "r");\r
- try {\r
- Assert.assertEquals(1, aa.size());\r
- Binding sampleBinding = Bindings.getBinding( minmax.format );\r
- \r
- // Read and assert the sample\r
- Object sample = aa.get(0, sampleBinding);\r
- ValueBand se = new ValueBand( sampleBinding, sample );\r
- Assert.assertEquals(0.0, (Double) se.getTime( Bindings.DOUBLE ), 0.01);\r
- Assert.assertEquals(1.4, (Double) se.getEndTime( Bindings.DOUBLE ), 0.01);\r
- Assert.assertEquals(5.0, (Double) se.getMin( Bindings.DOUBLE ), 0.01);\r
- Assert.assertEquals(10.0, (Double) se.getMax( Bindings.DOUBLE ), 0.01);\r
- \r
- } finally {\r
- aa.close();\r
- }\r
- }\r
-\r
- \r
- @Test\r
- public void testDeadband() throws Exception {\r
- // 1. Create history and collector item\r
- SamplingFormat format = allfields.clone();\r
- format.deadband = 2.5;\r
- SubscriptionItem hi = SubscriptionItem.createItem("MyVariable", "MySubscription", format);\r
- historian.create(hi); \r
- \r
- // 2. Create collector\r
- collector.addItem(hi); \r
- try {\r
- // Add values, dt=0.1\r
- double[] data = data2;\r
- for (int i=0; i<data.length; i++) \r
- {\r
- collector.beginStep(Bindings.DOUBLE, i * 0.1);\r
- collector.setValue("MyVariable", Bindings.DOUBLE, data[i]);\r
- collector.endStep();\r
- } \r
- } finally {\r
- collector.close();\r
- }\r
-\r
- // 3. Verify data\r
- StreamAccessor aa = historian.openStream(hi.id, "r"); \r
- try {\r
- Binding sampleBinding = Bindings.getBinding( format.format );\r
- // Read and assert the sample\r
- Object sample = aa.get(0, sampleBinding);\r
- ValueBand se = new ValueBand( sampleBinding, sample );\r
- Assert.assertEquals(0.0, (Double) se.getTime( Bindings.DOUBLE ), 0.01);\r
- Assert.assertEquals(0.7, (Double) se.getEndTime( Bindings.DOUBLE ), 0.01);\r
- Assert.assertEquals(5.0, (Double) se.getValue( Bindings.DOUBLE ), 0.01);\r
- Assert.assertEquals(5.0, (Double) se.getMedian( Bindings.DOUBLE ), 0.01);\r
- Assert.assertEquals(5.0, (Double) se.getMin( Bindings.DOUBLE ), 0.01);\r
- Assert.assertEquals(7.0, (Double) se.getMax( Bindings.DOUBLE ), 0.01);\r
- Assert.assertEquals(8, se.getCount());\r
- \r
- aa.get(1, sampleBinding, sample);\r
- Assert.assertEquals(0.8, (Double) se.getTime( Bindings.DOUBLE ), 0.01);\r
- Assert.assertEquals(1.1, (Double) se.getEndTime( Bindings.DOUBLE ), 0.01);\r
- Assert.assertEquals(8.0, (Double) se.getValue( Bindings.DOUBLE ), 0.01);\r
- Assert.assertEquals(9.0, (Double) se.getMedian( Bindings.DOUBLE ), 0.01);\r
- Assert.assertEquals(8.0, (Double) se.getMin( Bindings.DOUBLE ), 0.01);\r
- Assert.assertEquals(10.0, (Double) se.getMax( Bindings.DOUBLE ), 0.01);\r
- Assert.assertEquals(4, se.getCount());\r
-\r
- aa.get(2, sampleBinding, sample);\r
- Assert.assertEquals(1.2, (Double) se.getTime( Bindings.DOUBLE ), 0.01);\r
- Assert.assertEquals(1.4, (Double) se.getEndTime( Bindings.DOUBLE ), 0.01); \r
- Assert.assertEquals(5.0, (Double) se.getValue( Bindings.DOUBLE ), 0.01);\r
- Assert.assertEquals(4.0, (Double) se.getMedian( Bindings.DOUBLE ), 0.01);\r
- Assert.assertEquals(3.0, (Double) se.getMin( Bindings.DOUBLE ), 0.01);\r
- Assert.assertEquals(5.0, (Double) se.getMax( Bindings.DOUBLE ), 0.01);\r
- Assert.assertEquals(3, se.getCount());\r
- } finally {\r
- aa.close();\r
- }\r
- }\r
-\r
- \r
- @Test\r
- public void testMedianAndInterval() throws Exception {\r
-\r
- // 1. Create history and collector item\r
- SamplingFormat format = allfields.clone();\r
- format.interval = 1.0;\r
- SubscriptionItem hi = SubscriptionItem.createItem("MyVariable", "MySubscription", format);\r
- historian.create(hi);\r
- // Create binding for the sample format\r
- Binding sampleBinding = Bindings.getBinding( format.format );\r
- \r
- \r
- // 2. Create collector\r
- collector.addItem( hi );\r
-\r
- // Write data\r
- try {\r
- // Add values, dt=0.1\r
- double[] data = data2;\r
- for (int i=0; i<data.length; i++) \r
- {\r
- collector.beginStep(Bindings.DOUBLE, i * 0.1);\r
- collector.setValue("MyVariable", Bindings.DOUBLE, data[i]);\r
- collector.endStep();\r
- } \r
- } finally {\r
- collector.close();\r
- }\r
- \r
- // Verify data\r
- StreamAccessor aa = historian.openStream(hi.id, "r"); \r
- try {\r
- // 10s interval. There should be only one entry\r
- Assert.assertEquals(2, aa.size());\r
- \r
- // Read and assert the sample\r
- Object sample = aa.get(0, sampleBinding);\r
- ValueBand se = new ValueBand( sampleBinding, sample );\r
- Assert.assertEquals(0.0, (Double) se.getTime( Bindings.DOUBLE ), 0.01);\r
- Assert.assertEquals(0.9, (Double) se.getEndTime( Bindings.DOUBLE ), 0.01);\r
- Assert.assertEquals(6.0, (Double) se.getMedian( Bindings.DOUBLE ), 0.01);\r
- \r
- aa.get(1, sampleBinding, sample);\r
- Assert.assertEquals(1.0, (Double) se.getTime( Bindings.DOUBLE ), 0.01);\r
- Assert.assertEquals(1.4, (Double) se.getEndTime( Bindings.DOUBLE ), 0.01);\r
- Assert.assertEquals(5.0, (Double) se.getMedian( Bindings.DOUBLE ), 0.01);\r
- \r
- } finally {\r
- aa.close();\r
- }\r
- \r
- // Reopen subscription\r
- // Write data\r
- collector = new CollectorImpl( historian ); \r
- try {\r
- // Add values, dt=0.1\r
- double[] data = data2;\r
- for (int i=0; i<data.length; i++) \r
- {\r
- collector.beginStep(Bindings.DOUBLE, (i+data.length) * 0.1);\r
- collector.setValue("MyVariable", Bindings.DOUBLE, data[i]);\r
- collector.endStep();\r
- } \r
- } finally {\r
- collector.close();\r
- }\r
- \r
- // Verify data\r
- aa = historian.openStream(hi.id, "r"); \r
- try {\r
- Assert.assertEquals(3, aa.size());\r
- \r
- // Read and assert the sample\r
- Object sample = aa.get(0, sampleBinding);\r
- ValueBand se = new ValueBand( sampleBinding, sample );\r
- Assert.assertEquals(0.0, (Double) se.getTime( Bindings.DOUBLE ), 0.01);\r
- Assert.assertEquals(0.9, (Double) se.getEndTime( Bindings.DOUBLE ), 0.01);\r
- Assert.assertEquals(6.0, (Double) se.getMedian( Bindings.DOUBLE ), 0.01);\r
- \r
- aa.get(1, sampleBinding, sample);\r
- Assert.assertEquals(1.0, (Double) se.getTime( Bindings.DOUBLE ), 0.01);\r
- Assert.assertEquals(2.1, (Double) se.getEndTime( Bindings.DOUBLE ), 0.01);\r
- Assert.assertEquals(5.0, (Double) se.getMedian( Bindings.DOUBLE ), 0.01);\r
- \r
- aa.get(2, sampleBinding, sample);\r
- Assert.assertEquals(2.2, (Double) se.getTime( Bindings.DOUBLE ), 0.01);\r
- Assert.assertEquals(2.9, (Double) se.getEndTime( Bindings.DOUBLE ), 0.01);\r
- Assert.assertEquals(7.0, (Double) se.getMedian( Bindings.DOUBLE ), 0.01);\r
- \r
- } finally {\r
- aa.close();\r
- }\r
- \r
- historian.delete(hi.id);\r
- }\r
-\r
- @Test\r
- public void testAccessor() throws Exception\r
- {\r
- // 1. Create history and collector item\r
- SamplingFormat format = allfields.clone();\r
- SubscriptionItem hi = SubscriptionItem.createItem("MyVariable", "MySubscription", format);\r
- historian.create(hi);\r
- \r
- // 2. Create collector\r
- collector.addItem(hi);\r
- StreamAccessor aa = historian.openStream(hi.id, "r"); \r
- try {\r
- // Write data\r
- double[] data = data2;\r
- for (int i=0; i<data.length; i++) \r
- {\r
- collector.beginStep(Bindings.DOUBLE, i * 0.1);\r
- collector.setValue("MyVariable", Bindings.DOUBLE, data[i]);\r
- collector.endStep();\r
- } \r
-\r
- // Assert data\r
- aa.reset();\r
- Assert.assertEquals(10, aa.size());\r
- \r
- // Write some more\r
- for (int i=0; i<data.length; i++) \r
- {\r
- collector.beginStep(Bindings.DOUBLE, (i + data.length) * 0.1);\r
- collector.setValue("MyVariable", Bindings.DOUBLE, data[i]);\r
- collector.endStep();\r
- } \r
- \r
- // Assert data\r
- aa.reset();\r
- Assert.assertEquals(20, aa.size());\r
-\r
- // Print\r
- Binding sampleBinding = Bindings.getBinding( format.format ); \r
- for (int i=0; i<aa.size(); i++) {\r
- System.out.println( i+": "+sampleBinding.toString( aa.get(i, sampleBinding) ) );\r
- }\r
- \r
- \r
- } finally {\r
- aa.close();\r
- collector.close();\r
- }\r
- \r
- }\r
-\r
- @Test\r
- public void testArrayData() throws Exception\r
- {\r
- // 1. Create history and collector item\r
- SamplingFormat format = vector.clone();\r
- SubscriptionItem hi = SubscriptionItem.createItem("MyVariable", "MySubscription", format);\r
- historian.create(hi);\r
- \r
- // 2. Create collector\r
- collector.addItem( hi );\r
- ArrayType vectorType = (ArrayType) ((RecordType)format.format).getComponent("value").type;\r
- Binding vectorBinding = DoubleArrayBinding.createFrom( vectorType );\r
- \r
- // Write data\r
- int count = 20;\r
- try {\r
- // Simulate\r
- double[] vector = new double[] { 1.0, 2.0, 3.0 };\r
- \r
- for (int i=0; i<count; i++) \r
- {\r
- collector.beginStep(Bindings.DOUBLE, i * 0.1);\r
- \r
- vector[0] = i;\r
- vector[1] = i*1.5+1;\r
- vector[2] = i*-2.4+5;\r
- \r
- collector.setValue("MyVariable", vectorBinding, vector);\r
- collector.endStep();\r
- }\r
- \r
- } finally {\r
- collector.close();\r
- }\r
- \r
- StreamAccessor aa = historian.openStream(hi.id, "r");\r
- try {\r
- Assert.assertEquals(count, aa.size());\r
- } finally {\r
- aa.close();\r
- }\r
- \r
- historian.delete(hi.id);\r
- }\r
-\r
- @Test\r
- public void testStringData() throws Exception\r
- {\r
- // 1. Create history and collector item\r
- SamplingFormat format = string.clone();\r
- SubscriptionItem hi = SubscriptionItem.createItem("MyVariable", "MySubscription", format);\r
- historian.create(hi);\r
- \r
- // 2. Create collector\r
- collector.addItem( hi );\r
- Binding lineBinding = Bindings.STRING;\r
- \r
- // Write data\r
- int count = 20;\r
- try {\r
- // Simulate\r
- for (int i=0; i<count; i++) \r
- {\r
- collector.beginStep(Bindings.DOUBLE, i * 0.1);\r
- collector.setValue("MyVariable", lineBinding, "Line: "+i);\r
- collector.endStep();\r
- }\r
- \r
- } finally {\r
- collector.close();\r
- }\r
- \r
- StreamAccessor aa = historian.openStream(hi.id, "rw");\r
- try {\r
- // Assert data ok\r
- Binding beanBinding = Bindings.getBeanBinding(hi.format);\r
- Assert.assertEquals(count, aa.size());\r
- for (int i=0; i<count; i++) {\r
- Bean bean = (Bean) aa.get(i, beanBinding);\r
- String line = (String) bean.getField("value");\r
- Assert.assertEquals("Line: "+i, line);\r
- }\r
- \r
- // Delete entries\r
- aa.remove(10, 2);\r
- Assert.assertEquals(count-2, aa.size());\r
- for (int i=0; i<10; i++) {\r
- Bean bean = (Bean) aa.get(i, beanBinding);\r
- String line = (String) bean.getField("value");\r
- Assert.assertEquals("Line: "+i, line);\r
- }\r
- for (int i=10; i<18; i++) {\r
- Bean bean = (Bean) aa.get(i, beanBinding);\r
- String line = (String) bean.getField("value");\r
- Assert.assertEquals("Line: "+(i+2), line);\r
- }\r
- \r
- } finally {\r
- aa.close();\r
- }\r
- \r
- historian.delete(hi.id);\r
- }\r
- \r
-\r
- @Test\r
- public void testMinMax() throws Exception {\r
- // 1. Create history and collector item\r
- SamplingFormat format = minmax.clone();\r
- SubscriptionItem hi = SubscriptionItem.createItem("MyVariable", "MySubscription", format);\r
- historian.create(hi);\r
- \r
- // 2. Create collector\r
- collector.addItem( hi );\r
-\r
- // 3. Write data\r
- try {\r
- // Add values, dt=0.1\r
- double[] data = data1;\r
- for (int i=0; i<data.length; i++) \r
- {\r
- collector.beginStep(Bindings.DOUBLE, i * 0.1);\r
- collector.setValue("MyVariable", Bindings.DOUBLE, data[i]);\r
- collector.endStep();\r
- } \r
- } finally {\r
- collector.close();\r
- }\r
-\r
- // 3. Verify data\r
- StreamAccessor aa = historian.openStream(hi.id, "r");\r
- try {\r
- Assert.assertEquals(1, aa.size());\r
- Binding sampleBinding = Bindings.getBinding( format.format );\r
- // Read and assert the sample\r
- Object sample = aa.get(0, sampleBinding);\r
- ValueBand se = new ValueBand( sampleBinding, sample );\r
- Assert.assertEquals(0.0, (Double) se.getTime( Bindings.DOUBLE ), 0.01);\r
- Assert.assertEquals(1.4, (Double) se.getEndTime( Bindings.DOUBLE ), 0.01);\r
- Assert.assertEquals(5.0, (Double) se.getMin( Bindings.DOUBLE ), 0.01);\r
- Assert.assertEquals(10.0, (Double) se.getMax( Bindings.DOUBLE ), 0.01);\r
- } finally {\r
- aa.close();\r
- }\r
- \r
- }\r
- \r
- \r
- public @Test void testStream() throws Exception {\r
- // 1. Create history and collector item\r
- SubscriptionItem hi = SubscriptionItem.createItem("MyVariable", "MySubscription", SamplingFormat.allfields);\r
- historian.create(hi);\r
- \r
- // 2. Create collector\r
- collector.addItem( hi );\r
-\r
- // 3. Write and assert data\r
- StreamAccessor aa = historian.openStream(hi.id, "r");\r
- try {\r
- // Write data\r
- double[] data = data2;\r
- for (int i=0; i<data.length; i++) \r
- {\r
- collector.beginStep(Bindings.DOUBLE, i * 0.1);\r
- collector.setValue("MyVariable", Bindings.DOUBLE, data[i]);\r
- collector.endStep();\r
- } \r
- \r
- // Assert data\r
- aa.reset();\r
- Stream stream = new Stream(aa);\r
- \r
- Object sample0 = aa.get(0, stream.sampleBinding);\r
- Object sample1 = aa.get(1, stream.sampleBinding);\r
- Object sample;\r
- \r
- sample = stream.getLowerSample(Bindings.DOUBLE, 0.0);\r
- Assert.assertNull(sample);\r
- \r
- sample = stream.getLowerSample(Bindings.DOUBLE, 0.05);\r
- Assert.assertTrue( stream.sampleBinding.equals(sample, sample0) );\r
-\r
- sample = stream.getFloorSample(Bindings.DOUBLE, 0.05);\r
- Assert.assertTrue( stream.sampleBinding.equals(sample, sample0) );\r
-\r
- sample = stream.getFloorSample(Bindings.DOUBLE, 0.00);\r
- Assert.assertTrue( stream.sampleBinding.equals(sample, sample0) );\r
- \r
- sample = stream.getSample(Bindings.DOUBLE, 0.05);\r
- Assert.assertNull(sample);\r
-\r
- sample = stream.getSample(Bindings.DOUBLE, 0.00);\r
- Assert.assertTrue( stream.sampleBinding.equals(sample, sample0) );\r
-\r
- sample = stream.getCeilingSample(Bindings.DOUBLE, -0.10);\r
- Assert.assertTrue( stream.sampleBinding.equals(sample, sample0) );\r
- \r
- sample = stream.getCeilingSample(Bindings.DOUBLE, 0.00);\r
- Assert.assertTrue( stream.sampleBinding.equals(sample, sample0) );\r
-\r
- sample = stream.getCeilingSample(Bindings.DOUBLE, 0.05);\r
- Assert.assertTrue( stream.sampleBinding.equals(sample, sample1) );\r
-\r
- sample = stream.getHigherSample(Bindings.DOUBLE, -0.05);\r
- Assert.assertTrue( stream.sampleBinding.equals(sample, sample0) );\r
-\r
- sample = stream.getHigherSample(Bindings.DOUBLE, 0.00);\r
- Assert.assertTrue( stream.sampleBinding.equals(sample, sample1) );\r
- \r
- sample = stream.getHigherSample(Bindings.DOUBLE, 0.05);\r
- Assert.assertTrue( stream.sampleBinding.equals(sample, sample1) );\r
- \r
- sample = stream.getHigherSample(Bindings.DOUBLE, 1.45);\r
- Assert.assertNull( sample );\r
- } finally {\r
- aa.close();\r
- collector.close();\r
- }\r
- }\r
- \r
-\r
- @Test\r
- public void testByteData() throws Exception {\r
- // 1. Create stream\r
- SamplingFormat format = byteformat.clone();\r
- format.formatId = "test";\r
- SubscriptionItem hi = SubscriptionItem.createItem("MyVariable", "MySubscription", format);\r
- historian.create( hi );\r
- \r
- // 2. Create collector\r
- collector.addItem(hi);\r
-\r
- // 3. Write and assert data\r
- try {\r
- // Write data\r
- double[] data = data2;\r
- for (int i=0; i<data.length; i++) \r
- {\r
- collector.beginStep(Bindings.DOUBLE, i * 0.1);\r
- collector.setValue("MyVariable", Bindings.DOUBLE, data[i]);\r
- collector.endStep();\r
- } \r
- \r
- // Verify data\r
- StreamAccessor aa = historian.openStream(hi.id, "r"); \r
- try {\r
- Assert.assertEquals(data3.length, aa.size());\r
- Binding sampleBinding = Bindings.getBinding( format.format );\r
- // Read and assert the sample\r
- Object sample = aa.get(0, sampleBinding);\r
- ValueBand se = new ValueBand( sampleBinding, sample );\r
- for (int i=0; i<data3.length; i++) {\r
- aa.get(i, sampleBinding, se.getSample());\r
- Assert.assertEquals(data3[i], se.getValue(Bindings.BYTE));\r
- }\r
- } finally {\r
- aa.close();\r
- } \r
- \r
- } finally {\r
- collector.close();\r
- }\r
- \r
- }\r
- \r
- @Test\r
- public void testCSVData() throws Exception {\r
- SamplingFormat format = simple.clone();\r
- SubscriptionItem hi = SubscriptionItem.createItem("MyVariable", "MySubscription", format );\r
- historian.create( hi );\r
- collector.addItem( hi );\r
- try {\r
- // Write data\r
- double[] data = data1;\r
- for (int i=0; i<data.length; i++) \r
- {\r
- collector.beginStep(Bindings.DOUBLE, i * 0.1);\r
- collector.setValue("MyVariable", Bindings.DOUBLE, data[i]);\r
- collector.endStep();\r
- } \r
- } finally {\r
- collector.close();\r
- }\r
- \r
- CSVFormatter csv = new CSVFormatter();\r
- csv.addItem(historian, hi.id, "MyVariable", "MyVariable", "m");\r
- csv.setTimeRange(0.9, 1.5);\r
- csv.setTimeStep(0.1);\r
- StringBuilder sb = new StringBuilder();\r
-// csv.formulate1(new ProgressMonitor.Stub(), sb);\r
-// sb.append("\n----\n");\r
- csv.formulate2(new ProgressMonitor.Stub(), sb);\r
- System.out.println(sb);\r
- \r
- }\r
- \r
- @Test\r
- public void testExport() throws Exception {\r
- SamplingFormat format = byteformat.clone();\r
- \r
- // 2. Write data\r
- SubscriptionItem hi = SubscriptionItem.createItem("MyVariable", "MySubscription", byteformat );\r
- historian.create( hi );\r
- collector.addItem( hi );\r
- try {\r
- // Write data\r
- double[] data = data2;\r
- for (int i=0; i<data.length; i++) \r
- {\r
- collector.beginStep(Bindings.DOUBLE, i * 0.1);\r
- collector.setValue("MyVariable", Bindings.DOUBLE, data[i]);\r
- collector.endStep();\r
- } \r
- } finally {\r
- collector.close();\r
- }\r
- \r
- // Export data\r
- ByteArrayOutputStream os = new ByteArrayOutputStream(1024);\r
- History.exportHistory(historian, Bindings.DOUBLE, -Double.MAX_VALUE, Double.MAX_VALUE, os);\r
- \r
- // Create another historian\r
- HistoryManager historian2 = History.createMemoryHistory();\r
- ByteArrayInputStream is = new ByteArrayInputStream( os.toByteArray() );\r
- History.importHistory(historian2, is);\r
- \r
- // Verify data\r
- StreamAccessor aa = historian2.openStream(hi.id, "r"); \r
- try {\r
- Assert.assertEquals(data3.length, aa.size());\r
- Binding sampleBinding = Bindings.getBinding( format.format );\r
- // Read and assert the sample\r
- Object sample = aa.get(0, sampleBinding);\r
- ValueBand se = new ValueBand( sampleBinding, sample );\r
- for (int i=0; i<data3.length; i++) {\r
- aa.get(i, sampleBinding, se.getSample());\r
- Assert.assertEquals(data3[i], se.getValue(Bindings.BYTE));\r
- }\r
- } finally {\r
- aa.close();\r
- } \r
- }\r
- \r
- \r
- @Test\r
- public void testStreamIterator() throws Exception {\r
- // 1. Create history and collector item\r
- SamplingFormat format = allfields.clone();\r
- format.deadband = 0.05;\r
- SubscriptionItem hi = SubscriptionItem.createItem("MyVariable", "MySubscription", format);\r
- historian.create(hi); \r
- \r
- // 2. Create collector\r
- collector.addItem(hi); \r
- try {\r
- // Add values, dt=0.1\r
- double[] data = data1;\r
- for (int i=0; i<data.length; i++) \r
- {\r
- collector.beginStep(Bindings.DOUBLE, i * 0.1);\r
- collector.setValue("MyVariable", Bindings.DOUBLE, data[i]);\r
- collector.endStep();\r
- } \r
- } finally {\r
- collector.close();\r
- }\r
-\r
- // 3. Verify data\r
- StreamAccessor aa = historian.openStream(hi.id, "r"); \r
- try {\r
- StreamIterator si = new StreamIterator( aa );\r
- while (si.hasNext()) {\r
- si.next();\r
- System.out.println( si );\r
- }\r
- \r
- si.gotoTime( -1 );\r
- System.out.println( si );\r
- \r
- si.gotoTime( 0.55 );\r
- System.out.println( si );\r
- \r
- si.proceedToTime( 0.6 );\r
- System.out.println( si );\r
- \r
- si.proceedToTime( 1.11 );\r
- System.out.println( si );\r
-\r
- si.gotoTime( 1.4 );\r
- System.out.println( si );\r
- \r
- si.gotoTime( 1.5 );\r
- System.out.println( si );\r
- \r
- \r
- } finally {\r
- aa.close();\r
- }\r
- }\r
- \r
-}\r
+/*******************************************************************************
+ * Copyright (c) 2007, 2011 Association for Decentralized Information Management in
+ * Industry THTH ry.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VTT Technical Research Centre of Finland - initial API and implementation
+ *******************************************************************************/
+package org.simantics.history.test;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.simantics.databoard.Bindings;
+import org.simantics.databoard.Datatypes;
+import org.simantics.databoard.accessor.StreamAccessor;
+import org.simantics.databoard.accessor.error.AccessorException;
+import org.simantics.databoard.binding.Binding;
+import org.simantics.databoard.binding.impl.DoubleArrayBinding;
+import org.simantics.databoard.type.ArrayType;
+import org.simantics.databoard.type.RecordType;
+import org.simantics.databoard.util.Bean;
+import org.simantics.databoard.util.Limit;
+import org.simantics.databoard.util.Range;
+import org.simantics.history.Collector;
+import org.simantics.history.History;
+import org.simantics.history.HistoryException;
+import org.simantics.history.HistoryManager;
+import org.simantics.history.csv.CSVFormatter;
+import org.simantics.history.impl.CollectorImpl;
+import org.simantics.history.impl.CollectorState;
+import org.simantics.history.util.ProgressMonitor;
+import org.simantics.history.util.StreamIterator;
+import org.simantics.history.util.Stream;
+import org.simantics.history.util.ValueBand;
+import org.simantics.history.util.subscription.SubscriptionItem;
+import org.simantics.history.util.subscription.SamplingFormat;
+import org.simantics.utils.FileUtils;
+
+public class TestHistory {
+
+ static final double NaN = Double.NaN;
+
+ // Time 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4
+ double[] data1 = { 5.0, 5.0, 5.0, 5.0, 6.0, 6.0, 6.0, 7.0, 8.0, 9.0, NaN,10.0, NaN, NaN, NaN };
+ double[] data2 = { 5.0, 5.0, 5.0, 5.0, 6.0, 6.0, 6.0, 7.0, 8.0, 9.0,10.0, 9.0, 5.0, 4.0, 3.0 };
+ byte[] data3 = { 5, 6, 7, 8, 9, 10, 9, 5, 4, 3 };
+
+ // Subscription formats
+ SamplingFormat simple, allfields, vector, minmax, byteformat, string;
+
+ // History
+ HistoryManager historian;
+ File workarea;
+ Collector collector;
+
+ @Before
+ public void initSubscriptionFormats()
+ {
+ simple = new SamplingFormat();
+ simple.formatId = "simple";
+ RecordType format;
+ format = (RecordType) (simple.format = new RecordType());
+ format.addComponent("time", Datatypes.FLOAT);
+ format.addComponent("endTime", Datatypes.FLOAT);
+ format.addComponent("value", Datatypes.DOUBLE );
+ format.addComponent("quality", Datatypes.BYTE );
+ simple.interval = NaN;
+ simple.deadband = NaN;
+
+ string = new SamplingFormat();
+ string.formatId = "string";
+ format = (RecordType) (string.format = new RecordType());
+ format.addComponent("time", Datatypes.FLOAT);
+ format.addComponent("endTime", Datatypes.FLOAT);
+ format.addComponent("value", Datatypes.STRING );
+ format.addComponent("quality", Datatypes.BYTE );
+ string.interval = NaN;
+ string.deadband = NaN;
+
+ allfields = new SamplingFormat();
+ allfields.formatId = "alldata";
+ format = (RecordType) (allfields.format = new RecordType());
+ format.addComponent("time", Datatypes.DOUBLE);
+ format.addComponent("endTime", Datatypes.DOUBLE);
+ format.addComponent("value", Datatypes.DOUBLE );
+ format.addComponent("lastValue", Datatypes.DOUBLE);
+ format.addComponent("min", Datatypes.DOUBLE);
+ format.addComponent("max", Datatypes.DOUBLE);
+ format.addComponent("avg", Datatypes.DOUBLE);
+ format.addComponent("median", Datatypes.DOUBLE);
+ format.addComponent("quality", Datatypes.BYTE );
+ format.addComponent("count", Datatypes.INTEGER);
+ allfields.interval = NaN;
+ allfields.deadband = NaN;
+
+ byteformat = new SamplingFormat();
+ byteformat.formatId = "byte";
+ byteformat.format = new RecordType();
+ format = (RecordType) (byteformat.format = new RecordType());
+ format.addComponent("time", Datatypes.DOUBLE);
+ format.addComponent("endTime", Datatypes.DOUBLE);
+ format.addComponent("value", Datatypes.BYTE);
+ format.addComponent("lastValue", Datatypes.BYTE);
+ format.addComponent("min", Datatypes.BYTE);
+ format.addComponent("max", Datatypes.BYTE);
+ format.addComponent("avg", Datatypes.DOUBLE);
+ format.addComponent("median", Datatypes.BYTE);
+ format.addComponent("quality", Datatypes.BYTE);
+ format.addComponent("count", Datatypes.INTEGER);
+ byteformat.interval = NaN;
+ byteformat.deadband = NaN;
+
+ vector = new SamplingFormat();
+ vector.formatId = "vector";
+ vector.format = new RecordType();
+ format = (RecordType) (vector.format = new RecordType());
+ format.addComponent("time", Datatypes.FLOAT);
+ format.addComponent("endTime", Datatypes.FLOAT);
+ format.addComponent("value", new ArrayType( Datatypes.DOUBLE, Range.between(Limit.inclusive(3), Limit.inclusive(3)) ));
+ format.addComponent("count", Datatypes.INTEGER);
+ vector.interval = NaN;
+ vector.deadband = NaN;
+
+ minmax = new SamplingFormat();
+ minmax.formatId = "minmax";
+ minmax.format = new RecordType();
+ format = (RecordType) (minmax.format = new RecordType());
+ format.addComponent("time", Datatypes.FLOAT);
+ format.addComponent("endTime", Datatypes.FLOAT);
+ format.addComponent("value", Datatypes.DOUBLE );
+ format.addComponent("min", Datatypes.DOUBLE );
+ format.addComponent("max", Datatypes.DOUBLE );
+ minmax.interval = Double.MAX_VALUE;
+ minmax.deadband = Double.MAX_VALUE;
+ }
+
+ @Before
+ public void initHistory() {
+ CollectorState cs = new CollectorState();
+ workarea = FileUtils.createTmpDir();
+ System.out.println(workarea);
+ historian = History.openFileHistory( workarea );
+// historian = History.createMemoryHistory();
+ collector = new CollectorImpl( historian );
+ }
+
+ @After
+ public void uninitHistory() {
+ if ( collector != null ) {
+ collector.close();
+ }
+ if ( historian != null ) {
+ historian.close();
+ }
+ if ( workarea != null) {
+ try {
+ FileUtils.deleteAll(workarea);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ @Test
+ public void testGetModifySubscription() throws Exception
+ {
+ // 1. Create Item and Collector
+ SubscriptionItem hi = SubscriptionItem.createItem("NotMyVariable", "MySubscription", allfields);
+ historian.create(hi);
+ collector.addItem(hi);
+
+ // 2. Get Item
+ SubscriptionItem[] items = collector.getItems();
+ Assert.assertEquals(1, items.length);
+ SubscriptionItem hii = new SubscriptionItem();
+ hii.readAvailableFields( items[0] );
+ Assert.assertTrue( hii.equalContents( hi ) );
+
+ // 3. Modify Item
+ hi.variableId = "MyVariable";
+ collector.setItem(hi);
+ items = collector.getItems();
+ Assert.assertEquals(1, items.length);
+ hii.readAvailableFields( items[0] );
+ Assert.assertTrue( hii.equalContents( hi ) );
+
+ // 4. Remove & Add
+ collector.removeItem(hi.id);
+ Assert.assertEquals(0, collector.getItems().length);
+ collector.addItem(hi);
+
+ // 5. Open & Modify subscription
+ collector.beginStep(Bindings.DOUBLE, 5.0);
+ hi.interval = 1.2;
+ collector.setItem(hi);
+ collector.endStep();
+ collector.close();
+
+ // 6. Read from history
+ Bean bean = historian.getItem(hi.id);
+ hi.interval = 0.0;
+ hi.readAvailableFields(bean);
+ Assert.assertEquals(1.2, hi.interval, 0.1);
+ }
+
+ @Test
+ public void failtestRecreateSubscription() throws HistoryException
+ {
+ Collector collector2;
+ SubscriptionItem hi = SubscriptionItem.createItem("MyVariable", "MySubscription", allfields);
+ historian.create(hi);
+
+ collector.addItem( hi );
+ collector2 = new CollectorImpl( historian );
+ collector2.addItem( hi );
+
+ try {
+ collector.beginStep(Bindings.DOUBLE, 0.0);
+ collector2.beginStep(Bindings.DOUBLE, 0.0);
+ Assert.fail("Recreate subscription should have failed");
+ } catch (HistoryException e) {
+ // expected exception
+ }
+
+ collector2.close();
+ }
+
+ @Test
+ public void failtestReopenStream() throws HistoryException
+ {
+ // 1. Create history and collector item
+ SamplingFormat format = allfields.clone();
+ format.deadband = 2.5;
+ SubscriptionItem[] his = SubscriptionItem.createItems("MyVariable", "MySubscription", allfields, minmax);
+ historian.create(his);
+ StreamAccessor sa1=null, sa2=null;
+ try {
+ sa1 = historian.openStream(his[0].id, "r");
+ sa2 = historian.openStream(his[1].id, "r");
+ Assert.fail("HistoryManager must not allow to open two handles to same subscription");
+ } catch (HistoryException he) {
+ // Expected exception
+ }
+ try {
+ if (sa1!=null)sa1.close();
+ if (sa2!=null) sa2.close();
+ } catch (AccessorException e) {
+ throw new HistoryException(e);
+ }
+
+ historian.delete( his[0].id, his[1].id );
+ }
+
+ @Test
+ public void testDisableItem() throws Exception {
+ // 1. Create history and collector item
+ SamplingFormat format = allfields.clone();
+ format.deadband = 2.5;
+ SubscriptionItem[] hi = SubscriptionItem.createItems("MyVariable", "MySubscription", allfields, minmax);
+ historian.create(hi);
+
+ // 2. Create collector
+ collector.addItems(hi);
+
+ // Write data
+ try {
+ // Simulate
+ double[] data = data1;
+ for (int i=0; i<4; i++)
+ {
+ collector.beginStep(Bindings.DOUBLE, i * 0.1);
+ collector.setValue("MyVariable", Bindings.DOUBLE, data[i]);
+ collector.endStep();
+ }
+
+ // Disable item
+ hi[0].enabled = false;
+ collector.setItem(hi[0]);
+ for (int i=4; i<12; i++)
+ {
+ collector.beginStep(Bindings.DOUBLE, i * 0.1);
+ collector.setValue("MyVariable", Bindings.DOUBLE, data[i]);
+ collector.endStep();
+ }
+
+ // Enable item
+ hi[0].enabled = true;
+ collector.setItem(hi[0]);
+ for (int i=12; i<data.length; i++)
+ {
+ collector.beginStep(Bindings.DOUBLE, i * 0.1);
+ collector.setValue("MyVariable", Bindings.DOUBLE, data[i]);
+ collector.endStep();
+ }
+
+ } finally {
+ collector.close();
+ }
+
+
+ // 3. Verify data
+ StreamAccessor aa = historian.openStream(hi[0].id, "r");
+ try {
+ Binding sampleBinding = Bindings.getBinding( allfields.format );
+
+ // Read and assert the sample
+ Object sample = aa.get(0, sampleBinding);
+ ValueBand se = new ValueBand( sampleBinding, sample );
+ if (se.supportsNullValue()) {
+ Assert.assertEquals(0.0, (Double) se.getTime( Bindings.DOUBLE ), 0.01);
+ Assert.assertEquals(0.3, (Double) se.getEndTime( Bindings.DOUBLE ), 0.01);
+ Assert.assertFalse( se.isNullValue() );
+
+ aa.get(1, sampleBinding, sample);
+ Assert.assertEquals(0.4, (Double) se.getTime( Bindings.DOUBLE ), 0.01);
+ Assert.assertEquals(1.1, (Double) se.getEndTime( Bindings.DOUBLE ), 0.01);
+ Assert.assertTrue( se.isNullValue() );
+
+ aa.get(2, sampleBinding, sample);
+ Assert.assertEquals(1.2, (Double) se.getTime( Bindings.DOUBLE ), 0.01);
+ }
+
+ } finally {
+ aa.close();
+ }
+
+ // 4. Verify min-max has only 1 sample
+ aa = historian.openStream(hi[1].id, "r");
+ try {
+ Assert.assertEquals(1, aa.size());
+ Binding sampleBinding = Bindings.getBinding( minmax.format );
+
+ // Read and assert the sample
+ Object sample = aa.get(0, sampleBinding);
+ ValueBand se = new ValueBand( sampleBinding, sample );
+ Assert.assertEquals(0.0, (Double) se.getTime( Bindings.DOUBLE ), 0.01);
+ Assert.assertEquals(1.4, (Double) se.getEndTime( Bindings.DOUBLE ), 0.01);
+ Assert.assertEquals(5.0, (Double) se.getMin( Bindings.DOUBLE ), 0.01);
+ Assert.assertEquals(10.0, (Double) se.getMax( Bindings.DOUBLE ), 0.01);
+
+ } finally {
+ aa.close();
+ }
+ }
+
+
+ @Test
+ public void testDeadband() throws Exception {
+ // 1. Create history and collector item
+ SamplingFormat format = allfields.clone();
+ format.deadband = 2.5;
+ SubscriptionItem hi = SubscriptionItem.createItem("MyVariable", "MySubscription", format);
+ historian.create(hi);
+
+ // 2. Create collector
+ collector.addItem(hi);
+ try {
+ // Add values, dt=0.1
+ double[] data = data2;
+ for (int i=0; i<data.length; i++)
+ {
+ collector.beginStep(Bindings.DOUBLE, i * 0.1);
+ collector.setValue("MyVariable", Bindings.DOUBLE, data[i]);
+ collector.endStep();
+ }
+ } finally {
+ collector.close();
+ }
+
+ // 3. Verify data
+ StreamAccessor aa = historian.openStream(hi.id, "r");
+ try {
+ Binding sampleBinding = Bindings.getBinding( format.format );
+ // Read and assert the sample
+ Object sample = aa.get(0, sampleBinding);
+ ValueBand se = new ValueBand( sampleBinding, sample );
+ Assert.assertEquals(0.0, (Double) se.getTime( Bindings.DOUBLE ), 0.01);
+ Assert.assertEquals(0.7, (Double) se.getEndTime( Bindings.DOUBLE ), 0.01);
+ Assert.assertEquals(5.0, (Double) se.getValue( Bindings.DOUBLE ), 0.01);
+ Assert.assertEquals(5.0, (Double) se.getMedian( Bindings.DOUBLE ), 0.01);
+ Assert.assertEquals(5.0, (Double) se.getMin( Bindings.DOUBLE ), 0.01);
+ Assert.assertEquals(7.0, (Double) se.getMax( Bindings.DOUBLE ), 0.01);
+ Assert.assertEquals(8, se.getCount());
+
+ aa.get(1, sampleBinding, sample);
+ Assert.assertEquals(0.8, (Double) se.getTime( Bindings.DOUBLE ), 0.01);
+ Assert.assertEquals(1.1, (Double) se.getEndTime( Bindings.DOUBLE ), 0.01);
+ Assert.assertEquals(8.0, (Double) se.getValue( Bindings.DOUBLE ), 0.01);
+ Assert.assertEquals(9.0, (Double) se.getMedian( Bindings.DOUBLE ), 0.01);
+ Assert.assertEquals(8.0, (Double) se.getMin( Bindings.DOUBLE ), 0.01);
+ Assert.assertEquals(10.0, (Double) se.getMax( Bindings.DOUBLE ), 0.01);
+ Assert.assertEquals(4, se.getCount());
+
+ aa.get(2, sampleBinding, sample);
+ Assert.assertEquals(1.2, (Double) se.getTime( Bindings.DOUBLE ), 0.01);
+ Assert.assertEquals(1.4, (Double) se.getEndTime( Bindings.DOUBLE ), 0.01);
+ Assert.assertEquals(5.0, (Double) se.getValue( Bindings.DOUBLE ), 0.01);
+ Assert.assertEquals(4.0, (Double) se.getMedian( Bindings.DOUBLE ), 0.01);
+ Assert.assertEquals(3.0, (Double) se.getMin( Bindings.DOUBLE ), 0.01);
+ Assert.assertEquals(5.0, (Double) se.getMax( Bindings.DOUBLE ), 0.01);
+ Assert.assertEquals(3, se.getCount());
+ } finally {
+ aa.close();
+ }
+ }
+
+
+ @Test
+ public void testMedianAndInterval() throws Exception {
+
+ // 1. Create history and collector item
+ SamplingFormat format = allfields.clone();
+ format.interval = 1.0;
+ SubscriptionItem hi = SubscriptionItem.createItem("MyVariable", "MySubscription", format);
+ historian.create(hi);
+ // Create binding for the sample format
+ Binding sampleBinding = Bindings.getBinding( format.format );
+
+
+ // 2. Create collector
+ collector.addItem( hi );
+
+ // Write data
+ try {
+ // Add values, dt=0.1
+ double[] data = data2;
+ for (int i=0; i<data.length; i++)
+ {
+ collector.beginStep(Bindings.DOUBLE, i * 0.1);
+ collector.setValue("MyVariable", Bindings.DOUBLE, data[i]);
+ collector.endStep();
+ }
+ } finally {
+ collector.close();
+ }
+
+ // Verify data
+ StreamAccessor aa = historian.openStream(hi.id, "r");
+ try {
+ // 10s interval. There should be only one entry
+ Assert.assertEquals(2, aa.size());
+
+ // Read and assert the sample
+ Object sample = aa.get(0, sampleBinding);
+ ValueBand se = new ValueBand( sampleBinding, sample );
+ Assert.assertEquals(0.0, (Double) se.getTime( Bindings.DOUBLE ), 0.01);
+ Assert.assertEquals(0.9, (Double) se.getEndTime( Bindings.DOUBLE ), 0.01);
+ Assert.assertEquals(6.0, (Double) se.getMedian( Bindings.DOUBLE ), 0.01);
+
+ aa.get(1, sampleBinding, sample);
+ Assert.assertEquals(1.0, (Double) se.getTime( Bindings.DOUBLE ), 0.01);
+ Assert.assertEquals(1.4, (Double) se.getEndTime( Bindings.DOUBLE ), 0.01);
+ Assert.assertEquals(5.0, (Double) se.getMedian( Bindings.DOUBLE ), 0.01);
+
+ } finally {
+ aa.close();
+ }
+
+ // Reopen subscription
+ // Write data
+ collector = new CollectorImpl( historian );
+ try {
+ // Add values, dt=0.1
+ double[] data = data2;
+ for (int i=0; i<data.length; i++)
+ {
+ collector.beginStep(Bindings.DOUBLE, (i+data.length) * 0.1);
+ collector.setValue("MyVariable", Bindings.DOUBLE, data[i]);
+ collector.endStep();
+ }
+ } finally {
+ collector.close();
+ }
+
+ // Verify data
+ aa = historian.openStream(hi.id, "r");
+ try {
+ Assert.assertEquals(3, aa.size());
+
+ // Read and assert the sample
+ Object sample = aa.get(0, sampleBinding);
+ ValueBand se = new ValueBand( sampleBinding, sample );
+ Assert.assertEquals(0.0, (Double) se.getTime( Bindings.DOUBLE ), 0.01);
+ Assert.assertEquals(0.9, (Double) se.getEndTime( Bindings.DOUBLE ), 0.01);
+ Assert.assertEquals(6.0, (Double) se.getMedian( Bindings.DOUBLE ), 0.01);
+
+ aa.get(1, sampleBinding, sample);
+ Assert.assertEquals(1.0, (Double) se.getTime( Bindings.DOUBLE ), 0.01);
+ Assert.assertEquals(2.1, (Double) se.getEndTime( Bindings.DOUBLE ), 0.01);
+ Assert.assertEquals(5.0, (Double) se.getMedian( Bindings.DOUBLE ), 0.01);
+
+ aa.get(2, sampleBinding, sample);
+ Assert.assertEquals(2.2, (Double) se.getTime( Bindings.DOUBLE ), 0.01);
+ Assert.assertEquals(2.9, (Double) se.getEndTime( Bindings.DOUBLE ), 0.01);
+ Assert.assertEquals(7.0, (Double) se.getMedian( Bindings.DOUBLE ), 0.01);
+
+ } finally {
+ aa.close();
+ }
+
+ historian.delete(hi.id);
+ }
+
+ @Test
+ public void testAccessor() throws Exception
+ {
+ // 1. Create history and collector item
+ SamplingFormat format = allfields.clone();
+ SubscriptionItem hi = SubscriptionItem.createItem("MyVariable", "MySubscription", format);
+ historian.create(hi);
+
+ // 2. Create collector
+ collector.addItem(hi);
+ StreamAccessor aa = historian.openStream(hi.id, "r");
+ try {
+ // Write data
+ double[] data = data2;
+ for (int i=0; i<data.length; i++)
+ {
+ collector.beginStep(Bindings.DOUBLE, i * 0.1);
+ collector.setValue("MyVariable", Bindings.DOUBLE, data[i]);
+ collector.endStep();
+ }
+
+ // Assert data
+ aa.reset();
+ Assert.assertEquals(10, aa.size());
+
+ // Write some more
+ for (int i=0; i<data.length; i++)
+ {
+ collector.beginStep(Bindings.DOUBLE, (i + data.length) * 0.1);
+ collector.setValue("MyVariable", Bindings.DOUBLE, data[i]);
+ collector.endStep();
+ }
+
+ // Assert data
+ aa.reset();
+ Assert.assertEquals(20, aa.size());
+
+ // Print
+ Binding sampleBinding = Bindings.getBinding( format.format );
+ for (int i=0; i<aa.size(); i++) {
+ System.out.println( i+": "+sampleBinding.toString( aa.get(i, sampleBinding) ) );
+ }
+
+
+ } finally {
+ aa.close();
+ collector.close();
+ }
+
+ }
+
+ @Test
+ public void testArrayData() throws Exception
+ {
+ // 1. Create history and collector item
+ SamplingFormat format = vector.clone();
+ SubscriptionItem hi = SubscriptionItem.createItem("MyVariable", "MySubscription", format);
+ historian.create(hi);
+
+ // 2. Create collector
+ collector.addItem( hi );
+ ArrayType vectorType = (ArrayType) ((RecordType)format.format).getComponent("value").type;
+ Binding vectorBinding = DoubleArrayBinding.createFrom( vectorType );
+
+ // Write data
+ int count = 20;
+ try {
+ // Simulate
+ double[] vector = new double[] { 1.0, 2.0, 3.0 };
+
+ for (int i=0; i<count; i++)
+ {
+ collector.beginStep(Bindings.DOUBLE, i * 0.1);
+
+ vector[0] = i;
+ vector[1] = i*1.5+1;
+ vector[2] = i*-2.4+5;
+
+ collector.setValue("MyVariable", vectorBinding, vector);
+ collector.endStep();
+ }
+
+ } finally {
+ collector.close();
+ }
+
+ StreamAccessor aa = historian.openStream(hi.id, "r");
+ try {
+ Assert.assertEquals(count, aa.size());
+ } finally {
+ aa.close();
+ }
+
+ historian.delete(hi.id);
+ }
+
+ @Test
+ public void testStringData() throws Exception
+ {
+ // 1. Create history and collector item
+ SamplingFormat format = string.clone();
+ SubscriptionItem hi = SubscriptionItem.createItem("MyVariable", "MySubscription", format);
+ historian.create(hi);
+
+ // 2. Create collector
+ collector.addItem( hi );
+ Binding lineBinding = Bindings.STRING;
+
+ // Write data
+ int count = 20;
+ try {
+ // Simulate
+ for (int i=0; i<count; i++)
+ {
+ collector.beginStep(Bindings.DOUBLE, i * 0.1);
+ collector.setValue("MyVariable", lineBinding, "Line: "+i);
+ collector.endStep();
+ }
+
+ } finally {
+ collector.close();
+ }
+
+ StreamAccessor aa = historian.openStream(hi.id, "rw");
+ try {
+ // Assert data ok
+ Binding beanBinding = Bindings.getBeanBinding(hi.format);
+ Assert.assertEquals(count, aa.size());
+ for (int i=0; i<count; i++) {
+ Bean bean = (Bean) aa.get(i, beanBinding);
+ String line = (String) bean.getField("value");
+ Assert.assertEquals("Line: "+i, line);
+ }
+
+ // Delete entries
+ aa.remove(10, 2);
+ Assert.assertEquals(count-2, aa.size());
+ for (int i=0; i<10; i++) {
+ Bean bean = (Bean) aa.get(i, beanBinding);
+ String line = (String) bean.getField("value");
+ Assert.assertEquals("Line: "+i, line);
+ }
+ for (int i=10; i<18; i++) {
+ Bean bean = (Bean) aa.get(i, beanBinding);
+ String line = (String) bean.getField("value");
+ Assert.assertEquals("Line: "+(i+2), line);
+ }
+
+ } finally {
+ aa.close();
+ }
+
+ historian.delete(hi.id);
+ }
+
+
+ @Test
+ public void testMinMax() throws Exception {
+ // 1. Create history and collector item
+ SamplingFormat format = minmax.clone();
+ SubscriptionItem hi = SubscriptionItem.createItem("MyVariable", "MySubscription", format);
+ historian.create(hi);
+
+ // 2. Create collector
+ collector.addItem( hi );
+
+ // 3. Write data
+ try {
+ // Add values, dt=0.1
+ double[] data = data1;
+ for (int i=0; i<data.length; i++)
+ {
+ collector.beginStep(Bindings.DOUBLE, i * 0.1);
+ collector.setValue("MyVariable", Bindings.DOUBLE, data[i]);
+ collector.endStep();
+ }
+ } finally {
+ collector.close();
+ }
+
+ // 3. Verify data
+ StreamAccessor aa = historian.openStream(hi.id, "r");
+ try {
+ Assert.assertEquals(1, aa.size());
+ Binding sampleBinding = Bindings.getBinding( format.format );
+ // Read and assert the sample
+ Object sample = aa.get(0, sampleBinding);
+ ValueBand se = new ValueBand( sampleBinding, sample );
+ Assert.assertEquals(0.0, (Double) se.getTime( Bindings.DOUBLE ), 0.01);
+ Assert.assertEquals(1.4, (Double) se.getEndTime( Bindings.DOUBLE ), 0.01);
+ Assert.assertEquals(5.0, (Double) se.getMin( Bindings.DOUBLE ), 0.01);
+ Assert.assertEquals(10.0, (Double) se.getMax( Bindings.DOUBLE ), 0.01);
+ } finally {
+ aa.close();
+ }
+
+ }
+
+
+ public @Test void testStream() throws Exception {
+ // 1. Create history and collector item
+ SubscriptionItem hi = SubscriptionItem.createItem("MyVariable", "MySubscription", SamplingFormat.allfields);
+ historian.create(hi);
+
+ // 2. Create collector
+ collector.addItem( hi );
+
+ // 3. Write and assert data
+ StreamAccessor aa = historian.openStream(hi.id, "r");
+ try {
+ // Write data
+ double[] data = data2;
+ for (int i=0; i<data.length; i++)
+ {
+ collector.beginStep(Bindings.DOUBLE, i * 0.1);
+ collector.setValue("MyVariable", Bindings.DOUBLE, data[i]);
+ collector.endStep();
+ }
+
+ // Assert data
+ aa.reset();
+ Stream stream = new Stream(aa);
+
+ Object sample0 = aa.get(0, stream.sampleBinding);
+ Object sample1 = aa.get(1, stream.sampleBinding);
+ Object sample;
+
+ sample = stream.getLowerSample(Bindings.DOUBLE, 0.0);
+ Assert.assertNull(sample);
+
+ sample = stream.getLowerSample(Bindings.DOUBLE, 0.05);
+ Assert.assertTrue( stream.sampleBinding.equals(sample, sample0) );
+
+ sample = stream.getFloorSample(Bindings.DOUBLE, 0.05);
+ Assert.assertTrue( stream.sampleBinding.equals(sample, sample0) );
+
+ sample = stream.getFloorSample(Bindings.DOUBLE, 0.00);
+ Assert.assertTrue( stream.sampleBinding.equals(sample, sample0) );
+
+ sample = stream.getSample(Bindings.DOUBLE, 0.05);
+ Assert.assertNull(sample);
+
+ sample = stream.getSample(Bindings.DOUBLE, 0.00);
+ Assert.assertTrue( stream.sampleBinding.equals(sample, sample0) );
+
+ sample = stream.getCeilingSample(Bindings.DOUBLE, -0.10);
+ Assert.assertTrue( stream.sampleBinding.equals(sample, sample0) );
+
+ sample = stream.getCeilingSample(Bindings.DOUBLE, 0.00);
+ Assert.assertTrue( stream.sampleBinding.equals(sample, sample0) );
+
+ sample = stream.getCeilingSample(Bindings.DOUBLE, 0.05);
+ Assert.assertTrue( stream.sampleBinding.equals(sample, sample1) );
+
+ sample = stream.getHigherSample(Bindings.DOUBLE, -0.05);
+ Assert.assertTrue( stream.sampleBinding.equals(sample, sample0) );
+
+ sample = stream.getHigherSample(Bindings.DOUBLE, 0.00);
+ Assert.assertTrue( stream.sampleBinding.equals(sample, sample1) );
+
+ sample = stream.getHigherSample(Bindings.DOUBLE, 0.05);
+ Assert.assertTrue( stream.sampleBinding.equals(sample, sample1) );
+
+ sample = stream.getHigherSample(Bindings.DOUBLE, 1.45);
+ Assert.assertNull( sample );
+ } finally {
+ aa.close();
+ collector.close();
+ }
+ }
+
+
+ @Test
+ public void testByteData() throws Exception {
+ // 1. Create stream
+ SamplingFormat format = byteformat.clone();
+ format.formatId = "test";
+ SubscriptionItem hi = SubscriptionItem.createItem("MyVariable", "MySubscription", format);
+ historian.create( hi );
+
+ // 2. Create collector
+ collector.addItem(hi);
+
+ // 3. Write and assert data
+ try {
+ // Write data
+ double[] data = data2;
+ for (int i=0; i<data.length; i++)
+ {
+ collector.beginStep(Bindings.DOUBLE, i * 0.1);
+ collector.setValue("MyVariable", Bindings.DOUBLE, data[i]);
+ collector.endStep();
+ }
+
+ // Verify data
+ StreamAccessor aa = historian.openStream(hi.id, "r");
+ try {
+ Assert.assertEquals(data3.length, aa.size());
+ Binding sampleBinding = Bindings.getBinding( format.format );
+ // Read and assert the sample
+ Object sample = aa.get(0, sampleBinding);
+ ValueBand se = new ValueBand( sampleBinding, sample );
+ for (int i=0; i<data3.length; i++) {
+ aa.get(i, sampleBinding, se.getSample());
+ Assert.assertEquals(data3[i], se.getValue(Bindings.BYTE));
+ }
+ } finally {
+ aa.close();
+ }
+
+ } finally {
+ collector.close();
+ }
+
+ }
+
+ @Test
+ public void testCSVData() throws Exception {
+ SamplingFormat format = simple.clone();
+ SubscriptionItem hi = SubscriptionItem.createItem("MyVariable", "MySubscription", format );
+ historian.create( hi );
+ collector.addItem( hi );
+ try {
+ // Write data
+ double[] data = data1;
+ for (int i=0; i<data.length; i++)
+ {
+ collector.beginStep(Bindings.DOUBLE, i * 0.1);
+ collector.setValue("MyVariable", Bindings.DOUBLE, data[i]);
+ collector.endStep();
+ }
+ } finally {
+ collector.close();
+ }
+
+ CSVFormatter csv = new CSVFormatter();
+ csv.addItem(historian, hi.id, "MyVariable", "MyVariable", "m");
+ csv.setTimeRange(0.9, 1.5);
+ csv.setTimeStep(0.1);
+ StringBuilder sb = new StringBuilder();
+// csv.formulate1(new ProgressMonitor.Stub(), sb);
+// sb.append("\n----\n");
+ csv.formulate2(new ProgressMonitor.Stub(), sb);
+ System.out.println(sb);
+
+ }
+
+ @Test
+ public void testExport() throws Exception {
+ SamplingFormat format = byteformat.clone();
+
+ // 2. Write data
+ SubscriptionItem hi = SubscriptionItem.createItem("MyVariable", "MySubscription", byteformat );
+ historian.create( hi );
+ collector.addItem( hi );
+ try {
+ // Write data
+ double[] data = data2;
+ for (int i=0; i<data.length; i++)
+ {
+ collector.beginStep(Bindings.DOUBLE, i * 0.1);
+ collector.setValue("MyVariable", Bindings.DOUBLE, data[i]);
+ collector.endStep();
+ }
+ } finally {
+ collector.close();
+ }
+
+ // Export data
+ ByteArrayOutputStream os = new ByteArrayOutputStream(1024);
+ History.exportHistory(historian, Bindings.DOUBLE, -Double.MAX_VALUE, Double.MAX_VALUE, os);
+
+ // Create another historian
+ HistoryManager historian2 = History.createMemoryHistory();
+ ByteArrayInputStream is = new ByteArrayInputStream( os.toByteArray() );
+ History.importHistory(historian2, is);
+
+ // Verify data
+ StreamAccessor aa = historian2.openStream(hi.id, "r");
+ try {
+ Assert.assertEquals(data3.length, aa.size());
+ Binding sampleBinding = Bindings.getBinding( format.format );
+ // Read and assert the sample
+ Object sample = aa.get(0, sampleBinding);
+ ValueBand se = new ValueBand( sampleBinding, sample );
+ for (int i=0; i<data3.length; i++) {
+ aa.get(i, sampleBinding, se.getSample());
+ Assert.assertEquals(data3[i], se.getValue(Bindings.BYTE));
+ }
+ } finally {
+ aa.close();
+ }
+ }
+
+
+ @Test
+ public void testStreamIterator() throws Exception {
+ // 1. Create history and collector item
+ SamplingFormat format = allfields.clone();
+ format.deadband = 0.05;
+ SubscriptionItem hi = SubscriptionItem.createItem("MyVariable", "MySubscription", format);
+ historian.create(hi);
+
+ // 2. Create collector
+ collector.addItem(hi);
+ try {
+ // Add values, dt=0.1
+ double[] data = data1;
+ for (int i=0; i<data.length; i++)
+ {
+ collector.beginStep(Bindings.DOUBLE, i * 0.1);
+ collector.setValue("MyVariable", Bindings.DOUBLE, data[i]);
+ collector.endStep();
+ }
+ } finally {
+ collector.close();
+ }
+
+ // 3. Verify data
+ StreamAccessor aa = historian.openStream(hi.id, "r");
+ try {
+ StreamIterator si = new StreamIterator( aa );
+ while (si.hasNext()) {
+ si.next();
+ System.out.println( si );
+ }
+
+ si.gotoTime( -1 );
+ System.out.println( si );
+
+ si.gotoTime( 0.55 );
+ System.out.println( si );
+
+ si.proceedToTime( 0.6 );
+ System.out.println( si );
+
+ si.proceedToTime( 1.11 );
+ System.out.println( si );
+
+ si.gotoTime( 1.4 );
+ System.out.println( si );
+
+ si.gotoTime( 1.5 );
+ System.out.println( si );
+
+
+ } finally {
+ aa.close();
+ }
+ }
+
+}