/**
* Copyright (c) Acroquest Technology Co, Ltd. All Rights Reserved.
* Please read the associated COPYRIGHTS file for more details.
*
* THE SOFTWARE IS PROVIDED BY Acroquest Technolog Co., Ltd.,
* WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDER BE LIABLE FOR ANY
* CLAIM, DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
* OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
*/
package acromusashi.stream.example.bolt;

import java.text.MessageFormat;
import java.util.Map;
import java.util.TreeMap;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import acromusashi.stream.bolt.BaseConfigurationBolt;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.tuple.Tuple;

/**
 * 受信した単語の出現回数をカウントするBolt
 * <ul>
 * <li>インプット 単語 例)「How」</li>
 * <li>Boltの処理 単語の出現回数をカウントする</li>
 * <li>アウトプット 単語と出現回数 例）「How 5」</li>
 * </ul>
 *
 * @author kimura
 */
public class WordCountBolt extends BaseConfigurationBolt
{
    /** serialVersionUID */
    private static final long    serialVersionUID = 9080948772140456741L;

    /** logger */
    private static final Logger  logger           = LoggerFactory.getLogger(WordCountBolt.class);

    /** 単語出現回数カウンタ */
    private Map<String, Integer> counts           = new TreeMap<String, Integer>();

    /** 結果出力インターバルデフォルト値 */
    private static final long    DEFAULT_INTERVAL = 100;

    /** 結果出力インターバル */
    private long                 interval         = DEFAULT_INTERVAL;

    /** 受信メッセージ数 */
    private long                 receiveCount;

    /**
     * {@inheritDoc}
     */
    @Override
    public void execute(Tuple input)
    {
        // 単語出現回数カウンタからカウンタを取得
        String word = input.getStringByField("word");
        word = word.toLowerCase();
        Integer count = this.counts.get(word);

        // カウンタ値が存在しない場合は値を0で初期化
        if (count == null)
        {
            count = 0;
        }

        count++;

        // 結果を単語出現回数カウンタに反映
        this.counts.put(word, count);

        this.receiveCount++;

        if (this.receiveCount % this.interval == 0)
        {
            String logFormat = "WordCount Result. : CountResult={0}";
            logger.info(MessageFormat.format(logFormat, this.counts.toString()));
        }
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void declareOutputFields(OutputFieldsDeclarer arg0)
    {
        // 下流Boltは存在しないため設定しない。
    }

    /**
     * @param interval セットする interval
     */
    public void setInterval(long interval)
    {
        this.interval = interval;
    }

}

@@ -1689,16 +1689,97 @@
 Count;%0A%0A
+    /**%0A     * %E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%9B%E3%81%9A%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%E3%80%82%0A     */%0A    public WordCountBolt()%0A    %7B%7D%0A%0A
     /**%0A

Add default constructor