package jp.gr.java_conf.hhayakawa_jp.linguistics.resources;

import java.util.Properties;

import javax.annotation.Resource;
import javax.batch.operations.JobOperator;
import javax.batch.runtime.BatchRuntime;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.transaction.UserTransaction;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.QueryParam;

import jp.gr.java_conf.hhayakawa_jp.linguistics.Constants;
import jp.gr.java_conf.hhayakawa_jp.linguistics.Constants.ExecutionParameter;

/**
 * ジョブの起動等の制御を行うための、RESTfulサービス インターフェースを提供します
 *
 * @author hhayakaw
 */
@Path("/LinguisticsJobController")
public class Controller {

    @Resource
    private UserTransaction utx;

    @PersistenceContext(unitName = Constants.PERSISTENCE_UNIT_NAME)
    private EntityManager em;
    /**
     * バッチジョブのジョブID
     */
    private static final String JOB_ID = "linguistics-job";

    /**
     * デフォルト コンストラクター
     */
    public Controller() {}

    /**
     * ジョブを実行します
     *
     * @return ジョブを開始した旨のメッセージと、ジョブIDを含む文字列
     */
    @GET
    @Path("/Start")
    public String start(@QueryParam("p") int partitions,
            @QueryParam("t") int threads) {
        // TODO Bad Parameterレスポンスなど
        if (partitions <= 0) {
            partitions = 1;
        }
        if (threads <= 0) {
            threads = 1;
        }
        Properties exec_parameters = new Properties();
        exec_parameters.put(
                ExecutionParameter.PROPKEY_PARTITION_NUMBER, String.valueOf(partitions));
        exec_parameters.put(
                ExecutionParameter.PROPKEY_THREAD_NUMBER, String.valueOf(threads));
        JobOperator operator = BatchRuntime.getJobOperator();
        long id = operator.start(JOB_ID, exec_parameters);
        return "Started: " + id;
    }

    /**
     * ジョブの実行結果（DBに保存されたデータ）を削除して、再度実行できる状態にします
     * 
     * @return "ジョブの結果がクリアされた旨を示す文字列"
     */
    @DELETE
    @Path("/Clear")
    public String clear() {
        em.createNamedQuery("line.deleteAll");
        // TODO: トランザクションの扱いを正しく実装する
        return "cleared.";
    }

    /**
     * シンプルな文字列を返します<br>
     * アプリケーションが起動していることを確認するために利用することを想定しています。
     *
     * @return メソッドが正しく実行されたことを示す文字列
     */
    @GET
    @Path("/Ping")
    public String ping() {
        return "I'm working...";
    }

}

@@ -287,16 +287,253 @@
 ontext;%0A
+import javax.transaction.HeuristicMixedException;%0Aimport javax.transaction.HeuristicRollbackException;%0Aimport javax.transaction.NotSupportedException;%0Aimport javax.transaction.RollbackException;%0Aimport javax.transaction.SystemException;%0A
 import j
@@ -2274,110 +2274,944 @@
     
-em.createNamedQuery(%22line.deleteAll%22);%0A        // TODO: %E3%83%88%E3%83%A9%E3%83%B3%E3%82%B6%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E6%89%B1%E3%81%84%E3%82%92%E6%AD%A3%E3%81%97%E3%81%8F%E5%AE%9F%E8%A3%85%E3%81%99%E3%82%8B%0A        return %22cleared.%22;
+int result = 0;%0A        try %7B%0A            utx.begin();%0A            result = em.createNamedQuery(%22line.deleteAll%22).executeUpdate();%0A            if (result == 0) %7B%0A                utx.rollback();%0A                return %22failed to clear data.%22;%0A            %7D else %7B%0A                utx.commit();%0A                return result + %22 entries cleared.%22;%0A            %7D%0A        %7D catch (NotSupportedException %7C SecurityException%0A                %7C IllegalStateException%7C RollbackException%0A                %7C HeuristicMixedException %7C HeuristicRollbackException%0A                %7C SystemException e) %7B%0A            try %7B%0A                utx.rollback();%0A            %7D catch (IllegalStateException %7C SecurityException%0A                    %7C SystemException e2) %7B%0A                e2.printStackTrace();%0A                throw new IllegalStateException(e2);%0A            %7D%0A            e.printStackTrace();%0A            return %22failed to clear data.%22;%0A        %7D
 %0A   

Add clear result feature.