com.srotya.sidewinder.core.ingress.binary.SeriesDataPointDecoder.java Source code

Java tutorial

Introduction

Here is the source code for com.srotya.sidewinder.core.ingress.binary.SeriesDataPointDecoder.java

Source

/**
 * Copyright 2017 Ambud Sharma
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *       http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.srotya.sidewinder.core.ingress.binary;

import java.util.List;

import com.srotya.sidewinder.core.storage.DataPoint;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ReplayingDecoder;

/**
 * @author ambud
 */
public class SeriesDataPointDecoder extends ReplayingDecoder<Void> {

    @Override
    protected void decode(ChannelHandlerContext arg0, ByteBuf buf, List<Object> output) throws Exception {
        int dpCount = buf.readInt();
        for (int i = 0; i < dpCount; i++) {
            DataPoint d = decodeBufToDPoint(buf);
            if (d == null) {
                System.out.println("Bad data point");
                return;
            } else {
                output.add(d);
            }
        }
    }

    public static DataPoint decodeBufToDPoint(ByteBuf buf) {
        int dbNameLength = buf.readInt();
        if (dbNameLength < 0) {
            return null;
        }
        byte[] dbBytes = new byte[dbNameLength];
        buf.readBytes(dbBytes);
        String dbName = new String(dbBytes);
        int measurementNameLength = buf.readInt();
        if (measurementNameLength < 0) {
            return null;
        }
        byte[] measurementNameBytes = new byte[measurementNameLength];
        buf.readBytes(measurementNameBytes);
        String measurementName = new String(measurementNameBytes);

        int valueNameLength = buf.readInt();
        if (valueNameLength < 0) {
            return null;
        }
        byte[] valueNameBytes = new byte[valueNameLength];
        buf.readBytes(valueNameBytes);
        String valueFieldName = new String(valueNameBytes);
        long timestamp = buf.readLong();
        byte flag = buf.readByte();
        DataPoint dp;
        if (flag == '0') {
            double value = buf.readDouble();
            dp = new DataPoint(dbName, measurementName, valueFieldName, null, timestamp, value);
            dp.setFp(true);
        } else {
            long value = buf.readLong();
            dp = new DataPoint(dbName, measurementName, valueFieldName, null, timestamp, value);
        }
        return dp;
    }

}