Package org.ryu22e.nico2cal.controller

Source Code of org.ryu22e.nico2cal.controller.GenerateNicoliveController

package org.ryu22e.nico2cal.controller;

import java.util.List;
import java.util.logging.Logger;

import org.ryu22e.nico2cal.service.NicoliveRssService;
import org.ryu22e.nico2cal.service.NicoliveService;
import org.slim3.controller.Controller;
import org.slim3.controller.Navigation;
import org.slim3.datastore.Datastore;
import org.slim3.memcache.Memcache;

import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.taskqueue.QueueFactory;
import com.google.appengine.api.taskqueue.TaskOptions;
import com.google.appengine.api.taskqueue.TaskOptions.Method;
import com.sun.syndication.feed.synd.SyndFeed;

/**
* ニコニコ生放送RSSからデータストアのデータを生成するコントローラー。
* @author ryu22e
*
*/
public final class GenerateNicoliveController extends Controller {

    /**
     *
     */
    private static final Logger LOGGER = Logger
        .getLogger(GenerateNicoliveController.class.getName());

    /**
     *
     */
    private static final int SUBLIST_SIZE = 10;

    /**
     * @see NicoliveRssService
     */
    private NicoliveRssService nicoliveRssService = new NicoliveRssService();

    /**
     * @see NicoliveService
     */
    private NicoliveService nicoliveService = new NicoliveService();

    /**
     * 全文検索用インデックスを作成するTaskQueueを追加する。
     * @param keys NicoliveのキーのList
     */
    private void addTaskQueue(List<Key> keys) {
        if (0 < keys.size()) {
            TaskOptions options =
                    TaskOptions.Builder
                        .withUrl("/GenerateNicoliveIndex")
                        .method(Method.POST);
            for (Key key : keys) {
                options = options.param("keys[]", Datastore.keyToString(key));
            }

            QueueFactory.getQueue("generate-nicoliveindex").add(options);
        }
    }

    /*
     * (non-Javadoc) {@inheritDoc}
     */
    @Override
    public Navigation run() throws Exception {
        LOGGER.info("BEGIN: " + this.getClass().getName());

        SyndFeed feed = nicoliveRssService.getFeed();
        List<Key> keys = nicoliveService.put(feed);
        if (0 < keys.size()) {
            // Memcacheのキャッシュをクリアする。
            Memcache.cleanAll();
            LOGGER.info("Generated " + keys.size() + " entities.");
            // 全文検索用インデックスを作成する。
            if (SUBLIST_SIZE < keys.size()) {
                int fromIndex = 0;
                // 全てのデータを一つのTaskQueueに渡すと時間がかかりすぎるので、幾つかに分割する。
                while (fromIndex < keys.size()) {
                    int toIndex = fromIndex + SUBLIST_SIZE;
                    if (toIndex < keys.size()) {
                        toIndex = keys.size() - fromIndex;
                    }
                    List<Key> subList = keys.subList(fromIndex, toIndex);
                    addTaskQueue(subList);

                    fromIndex = toIndex + 1;
                }
            } else {
                addTaskQueue(keys);
            }
        }

        LOGGER.info("END: " + this.getClass().getName());
        return null;
    }
}
TOP

Related Classes of org.ryu22e.nico2cal.controller.GenerateNicoliveController

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.