// Path: src/main/java/acromusashi/stream/constants/FieldName.java
// public interface FieldName
// {
//     /** Message grouping key's field name. */
//     String MESSAGE_KEY   = "messageKey";
// 
//     /** Message value's field name. */
//     String MESSAGE_VALUE = "messageValue";
// }
// 
// Path: src/main/java/acromusashi/stream/util/JsonValueExtractor.java
// public class JsonValueExtractor
// {
//     /**
//      * インスタンス化を防止するためのコンストラクタ
//      */
//     private JsonValueExtractor()
//     {}
// 
//     /**
//      * 指定したJSONオブジェクトから「parentKey」要素中の「key」の要素を抽出する。<br>
//      * 抽出に失敗した場合は例外が発生する。
//      * 
//      * @param target JSONオブジェクト
//      * @param parentKey JSONオブジェクト中の親キー
//      * @param childKey JSONオブジェクト中の子キー
//      * @return 取得結果
//      */
//     public static String extractValue(Object target, String parentKey, String childKey)
//     {
//         JSONObject jsonObj = JSONObject.fromObject(target);
//         JSONObject parentObj = jsonObj.getJSONObject(parentKey);
//         String value = parentObj.getString(childKey);
//         return value;
//     }
// }


import backtype.storm.tuple.Fields;
import java.text.MessageFormat;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import net.sf.json.JSONException;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import acromusashi.stream.constants.FieldName;
import acromusashi.stream.util.JsonValueExtractor;
import backtype.storm.spout.Scheme;
import backtype.storm.spout.SchemeAsMultiScheme;
import backtype.storm.spout.SpoutOutputCollector;
import backtype.storm.task.TopologyContext;
        }
    }

    /**
     * {@inheritDoc}
     */
    @SuppressWarnings({"rawtypes"})
    @Override
    public void open(Map conf, TopologyContext context, SpoutOutputCollector collector)
    {
        super.open(conf, context, collector);

        Number timeout = (Number) conf.get(KESTREL_TIMEOUT);
        this.messageTimeoutMs = (int) TimeUnit.SECONDS.toMillis(timeout.intValue());

        this.restrictWatcher = new RestrictWatcher(this.restrictFilePath);

        // Spoutの番号に併せて取得対象となるQueue番号をQueue名称に設定
        int componentIndex = context.getThisTaskIndex();
        String baseQueueName = getQueueName();
        String queueName = baseQueueName + "_" + componentIndex;
        setQueueName(queueName);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public Fields getOutputFields()
    {
// Path: src/main/java/acromusashi/stream/constants/FieldName.java
// public interface FieldName
// {
//     /** Message grouping key's field name. */
//     String MESSAGE_KEY   = "messageKey";
// 
//     /** Message value's field name. */
//     String MESSAGE_VALUE = "messageValue";
// }
// 
// Path: src/main/java/acromusashi/stream/util/JsonValueExtractor.java
// public class JsonValueExtractor
// {
//     /**
//      * インスタンス化を防止するためのコンストラクタ
//      */
//     private JsonValueExtractor()
//     {}
// 
//     /**
//      * 指定したJSONオブジェクトから「parentKey」要素中の「key」の要素を抽出する。<br>
//      * 抽出に失敗した場合は例外が発生する。
//      * 
//      * @param target JSONオブジェクト
//      * @param parentKey JSONオブジェクト中の親キー
//      * @param childKey JSONオブジェクト中の子キー
//      * @return 取得結果
//      */
//     public static String extractValue(Object target, String parentKey, String childKey)
//     {
//         JSONObject jsonObj = JSONObject.fromObject(target);
//         JSONObject parentObj = jsonObj.getJSONObject(parentKey);
//         String value = parentObj.getString(childKey);
//         return value;
//     }
// }


// Path: src/main/java/acromusashi/stream/component/kestrel/spout/KestrelJsonSpout.java
import backtype.storm.tuple.Fields;
import java.text.MessageFormat;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import net.sf.json.JSONException;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import acromusashi.stream.constants.FieldName;
import acromusashi.stream.util.JsonValueExtractor;
import backtype.storm.spout.Scheme;
import backtype.storm.spout.SchemeAsMultiScheme;
import backtype.storm.spout.SpoutOutputCollector;
import backtype.storm.task.TopologyContext;

        }
    }

    /**
     * {@inheritDoc}
     */
    @SuppressWarnings({"rawtypes"})
    @Override
    public void open(Map conf, TopologyContext context, SpoutOutputCollector collector)
    {
        super.open(conf, context, collector);

        Number timeout = (Number) conf.get(KESTREL_TIMEOUT);
        this.messageTimeoutMs = (int) TimeUnit.SECONDS.toMillis(timeout.intValue());

        this.restrictWatcher = new RestrictWatcher(this.restrictFilePath);

        // Spoutの番号に併せて取得対象となるQueue番号をQueue名称に設定
        int componentIndex = context.getThisTaskIndex();
        String baseQueueName = getQueueName();
        String queueName = baseQueueName + "_" + componentIndex;
        setQueueName(queueName);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public Fields getOutputFields()
    {
        return new Fields(Arrays.asList(FieldName.MESSAGE_KEY, FieldName.MESSAGE_VALUE));