public boolean initialize() { /** * TODO : Checking if the user provides the arguements currectly. TODO : This can now plot only * for one input stream value. */ TreeMap<String, String> params = getVirtualSensorConfiguration().getMainClassInitialParams(); ChartInfo chartInfo = new ChartInfo(); chartInfo.setInputStreamName(params.get("input-stream")); chartInfo.setPlotTitle(params.get("title")); chartInfo.setType(params.get("type")); chartInfo.setHeight(ParamParser.getInteger(params.get("height"), 480)); chartInfo.setWidth(ParamParser.getInteger(params.get("width"), 640)); chartInfo.setVerticalAxisTitle(params.get("vertical-axis")); chartInfo.setHistorySize(ParamParser.getInteger(params.get("history-size"), 10)); input_stream_name_to_ChartInfo_map.put(chartInfo.getInputStreamName(), chartInfo); chartInfo.initialize(); return true; }
public void dataAvailable(String inputStreamName, StreamElement streamElement) { if (logger.isDebugEnabled()) logger.debug( new StringBuilder("data received under the name *") .append(inputStreamName) .append("* to the ChartVS.") .toString()); /** Finding the appropriate ChartInfo object for this input stream. */ ChartInfo chartInfo = input_stream_name_to_ChartInfo_map.get(inputStreamName); /** * If there is not chartInfo configured for this input stream, the virtual sensor doesn't * produce any values. Note that if this virtual sensor is intended to produce output other than * plots (e.g., if output of this virtual sensor also container integers), then one might * comment the following line. */ if (chartInfo == null) { logger.warn( "ChartVS drops the input because there is no chart specification defined for the specific input."); return; } /** Sending the data to the chartInfo. */ chartInfo.addData(streamElement); /** counter checks to see if it's the time to do the plotting or not. */ if (++counter % GENERATE_COUNT != 0) return; /** * Creating the stream element(s) for output. For creating a stream element one need to provide * the field names (in the form of string array) and their types (in the form of integer array). * This virtual sensor just produces plots therefore the output is in the form of binary data * thus we set the type of the output stream element to Types.Binary. */ String[] fieldNames = input_stream_name_to_ChartInfo_map.keySet().toArray(new String[] {}); Byte[] fieldTypes = new Byte[fieldNames.length]; Serializable[] charts = new Serializable[fieldNames.length]; for (int i = 0; i < fieldTypes.length; i++) { /** * We set the type of the output stream element to Types.Binary because we are producing * images. */ fieldTypes[i] = DataTypes.BINARY; } /** * Creating an stream element with the specified fieldnames, fieldtypes and using the current * time as the timestamp of the stream element. */ /** * In here our stream element's relation contains just one row of data and it's filled using the * binary data which contains the plots. Note that this virtual sensor plots one diagram for * each InputStreamName. Also Note that, each InputStreamName can have one or more variables * inside it's stream elements's relation thus having one plot for several variables. */ for (int i = 0; i < fieldNames.length; i++) { ChartInfo chart = input_stream_name_to_ChartInfo_map.get(fieldNames[i]); charts[i] = chart.writePlot().toByteArray(); } StreamElement output = new StreamElement(fieldNames, fieldTypes, charts, System.currentTimeMillis()); /** Informing container about existance of a stream element. */ dataProduced(output); /** For debugging purposes. */ if (logger.isDebugEnabled()) logger.debug( new StringBuilder() .append("Data received under the name: ") .append(inputStreamName) .toString()); }