View Javadoc

1   /*
2    * Copyright (c) 2006 Stiftung Deutsches Elektronen-Synchroton,
3    * Member of the Helmholtz Association, (DESY), HAMBURG, GERMANY.
4    *
5    * THIS SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "../AS IS" BASIS.
6    * WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED
7    * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR PARTICULAR PURPOSE AND
8    * NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
9    * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
10   * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
11   * THE USE OR OTHER DEALINGS IN THE SOFTWARE. SHOULD THE SOFTWARE PROVE DEFECTIVE
12   * IN ANY RESPECT, THE USER ASSUMES THE COST OF ANY NECESSARY SERVICING, REPAIR OR
13   * CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE.
14   * NO USE OF ANY SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
15   * DESY HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
16   * OR MODIFICATIONS.
17   * THE FULL LICENSE SPECIFYING FOR THE SOFTWARE THE REDISTRIBUTION, MODIFICATION,
18   * USAGE AND OTHER RIGHTS AND OBLIGATIONS IS INCLUDED WITH THE DISTRIBUTION OF THIS
19   * PROJECT IN THE FILE LICENSE.HTML. IF THE LICENSE IS NOT INCLUDED YOU MAY FIND A COPY
20   * AT HTTP://WWW.DESY.DE/LEGAL/LICENSE.HTM
21   */
22  
23  package de.desy.acop.displayers.chart;
24  
25  import java.beans.PropertyVetoException;
26  
27  import com.cosylab.gui.adapters.Converter;
28  import com.cosylab.gui.displayers.DataSourceSupport;
29  import com.cosylab.gui.displayers.DoubleSeqConsumer;
30  import com.cosylab.gui.displayers.MinimalDataConsumer;
31  import com.cosylab.util.CommonException;
32  
33  /**
34   * @author Tilen Kusterle, Cosylab
35   *
36   */
37  class HistoryDataConverter {
38  	
39  	private HistoryDataSource historyDataSource;
40  	private TransformedDataConsumer transformedDataConsumer;
41  	private Converter converter;
42  	private double[] trensformedData;
43  	
44  	private class HistoryDataSource extends DataSourceSupport {
45  		
46  		private static final long serialVersionUID = 1L;
47  		private DoubleSeqConsumer doubleSeqConsumer;
48  		
49  		@SuppressWarnings("unchecked")
50  		public HistoryDataSource() {
51  			super(new Class[]{DoubleSeqConsumer.class});
52  		}
53  		
54  		public void setConverter(Converter c) {
55  			if (converter != null) converter.removeAllConsumers();
56  			converter = c;
57  			if (converter == null || !(converter instanceof DoubleSeqConsumer)) {
58  				resetConverter();
59  				return;
60  			}
61  			try {
62  				doubleSeqConsumer = converter.getDataConsumer(DoubleSeqConsumer.class);
63  				converter.addConsumer(transformedDataConsumer);
64  				addConsumer(converter);
65  			} catch (PropertyVetoException e) {
66  				resetConverter();
67  				e.printStackTrace();
68  			}
69  		}
70  		
71  		public void resetConverter() {
72  			converter = null;
73  			try {
74  				doubleSeqConsumer = transformedDataConsumer;
75  				addConsumer(transformedDataConsumer);
76  			} catch (PropertyVetoException e) {
77  				e.printStackTrace();
78  			}
79  		}
80  		
81  		public void transformData(long timestamp, double[] data) {
82  			try {
83  				doubleSeqConsumer.updateValue(timestamp, data);
84  			} catch (CommonException e) {
85  				e.printStackTrace();
86  			}
87  		}
88  		
89  	}
90  	
91  	private class TransformedDataConsumer extends MinimalDataConsumer implements DoubleSeqConsumer {
92  		public void updateValue(long timestamp, double[] value) throws CommonException {
93  			trensformedData = value;
94  		}
95  	}
96  	
97  	public HistoryDataConverter() {
98  		historyDataSource = new HistoryDataSource();
99  		transformedDataConsumer = new TransformedDataConsumer();
100 		historyDataSource.resetConverter();
101 	}
102 	
103 	/**
104 	 * Clones and uses the cloned corverter for converting history data. The converter
105 	 * passed as argument must be an instance of </code>DoubleSeqConsumer</code>,
106 	 * otherwise no converter is used. 
107 	 * @param c the </code>Converter</code> to be cloned and used for converting history
108 	 * data
109 	 */
110 	public void useConverter(Converter c) {
111 		if (c == null) {
112 			historyDataSource.resetConverter();
113 			return;
114 		}
115 		try {
116 			historyDataSource.setConverter((Converter) c.clone());
117 		} catch (CloneNotSupportedException e) {
118 			historyDataSource.resetConverter();
119 			e.printStackTrace();
120 		}
121 	}
122 	
123 	/**
124 	 * Converts history data by using the </code>Converter</code> set by 
125 	 * </code>useConverter</code> method.
126 	 * @param inputData raw history data
127 	 * @return converted history data
128 	 */
129 	public double[] convertHistoryData(double[] inputData) {
130 		historyDataSource.transformData(System.currentTimeMillis(), inputData);
131 		return trensformedData;
132 	}
133 	
134 }