package com.jzsec.rtc.bean;

import net.sf.json.JSONObject;
import org.apache.storm.spout.Scheme;
import org.apache.storm.tuple.Fields;
import org.apache.storm.tuple.Values;
import org.apache.storm.utils.Utils;


import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.List;

/**
 * Created by caodaoxi on 16-6-21.
 */
public class JSONScheme implements Scheme {

    private static final Charset UTF8_CHARSET = StandardCharsets.UTF_8;
    public List<String> outputFields = null;
    public JSONScheme(List<String> outputFields) {
        this.outputFields = outputFields;
    }

    @Override
    public List<Object> deserialize(ByteBuffer ser) {
        String jsonStr = null;
        if (ser.hasArray()) {
            int base = ser.arrayOffset();
            jsonStr = new String(ser.array(), base + ser.position(), ser.remaining());
        } else {
            jsonStr = new String(Utils.toByteArray(ser), UTF8_CHARSET);
        }
        JSONObject jsonObject = JSONObject.fromObject(jsonStr);
        Values values = new Values();
        for (String outputField : outputFields) {
            if("jsonBody".equals(outputField)) {
                values.add(jsonStr);
            } else {
                if(!jsonObject.containsKey(outputField)) {
                    JSONObject rcMsgpara = JSONObject.fromObject(jsonObject.get("rc_msg_para"));
                    values.add(rcMsgpara.get(outputField));
                } else {
                    values.add(jsonObject.get(outputField));
                }
            }
        }
        return values;
    }

    @Override
    public Fields getOutputFields() {
        if(outputFields.size() == 0) return null;
        return new Fields(outputFields);
    }
}