2014年1月12日日曜日

backlog4jでプロジェクト一覧を取得してみる

Backlogというプロジェクト管理ツールのAPIを使用して、自分が参加しているプロジェクト一覧を取得してみました。

Perl、PHP、Pythonからでも取得できますが、今回はJavaで取得することにします。

JavaでBacklog APIにアクセスする為のクライアントライブラリが用意されていますので、
hakuraiさまのbacklog4jをプロジェクトに取り込んで使用します。


まず、一般ユーザのクライアントを生成します。
BacklogConfigureBuilder builder = new BacklogConfigureBuilder();
BacklogConfigure config = builder.buildBacklogConfigure();
config.setSpaceId(mySpaceId);
config.setUsername(myUsername);
config.setPassword(myPassword); 
BacklogClient client = new BacklogClientFactory(config).newBacklogClient(); 
mySpaceIdは、プロジェクトURL(https://ourSpace.backlog.jp/)のourSpaceに当たる部分です。myUsernameとmyPasswordは、一般ユーザとしてログインする時に入力するユーザ名とパスワードです。MalformedURLExceptionをスローできるようにしておきましょう。



それでは自分のプロジェクトを取得してみます。
GetProject getProject = backlogClient.getProject();
getProject.setProjectKey("PJT_x");
Project project = getProject.execute();
LOGGER.info(project.getName());

実行結果
Xプロジェクト
プロジェクトキーとは、課題のURL(https://ourSpace.backlog.jp/projects/PJT_x)のPJT_xに当たる部分です。このケースでは、PJT_xに対するプロジェクト名が取得できます。


続いて自分のプロジェクト(複数)を取得してみます。
GetProjects getProjects = client.getProjects();
ProjectList projectList = getProjects.execute();
Iterator<Project> it = projectList.iterator();
while (it.hasNext()) {
Project myProject = it.next();
LOGGER.info(myProject.getId()+" "+myProject.getName());
}
実行結果
PJT_x Xプロジェクト
PJT_y Yプロジェクト
PJT_z Zプロジェクト
プロジェクトIDとプロジェクト名が取得できました。

コードを確認しますと、
GetProjectsのインスタンスに、フィルタをセットして、executeするクエリ的に扱います。
Project以外にも、課題やコメント、課題の状態にも同じ方法で取ってきます。

キーがPJT_x-26の課題(issue)を取得してみます。
GetIssue getIssue = client.getIssue();
getIssue.setIssueKey("PJT_x-26");
Issue issue = getIssue.execute();
LOGGER.info(issue.getSummary()); 
実行結果
PJT_x-26の課題のサマリが取得できました。


課題一覧を取得してみます。
FindIssue findIssue = client.findIssue();
findIssue.setProjectId(project.getId());
IssueList issueList = findIssue.execute();
Iterator<Issue> issues = issueList.iterator();
while (issues.hasNext()) {
Issue myIssue = issues.next();
LOGGER.info(myIssue.getId() + " "
+ myIssue.getStatus() + " " + myIssue.getSummary());
}
実行結果
1077583463 Status{name='処理済み'} 伝票番号欄が空欄になるバグ
1077346780 Status{name='未対応'} ファイルをアップロードする機能
1077204542 Status{name='処理中'} メニューから案件を選択する機能
1077580378 Status{name='未対応'} 決定ボタンをクリックすると画面が白くなる
1077583839 Status{name='完了'} 既存案件をアップロードするとエラーになる
findIssueは自分が閲覧できる全課題をとってきてます。
setProjectで単一プロジェクトでフィルタして取得してきています。


課題の状態(未対応・処理中・処理済み・完了)一覧を取得してみます。
GetStatuses getStatuses = backlogClient.getStatuses();
StatusList statusList = getStatuses.execute();
Iterator<Status> statuses = statusList.iterator();
while (statuses.hasNext()) {
Status myStatus = statuses.next();
LOGGER.info(myStatus.getId() + " " + myStatus.getName() + " " + myStatus.getCount());
}
実行結果
1 未対応 null
2 処理中 null
3 処理済 null
4 完了 null
課題の状態は静的フィールドかと思いきや、APIで取得しないと取れないものでした。
基本的に、Get****やFind****のオブジェクトにフィルタやソートをかけて、
executeした後に取れるオブジェクトが本体という仕様になっています。

次回は、コメントを追加します。

2014年1月4日土曜日

[GAE/J] Cronがon time failedになる

Google App EngineのCronサービスを使いたくて公式のドキュメントを見たのですが、
どうもダメそうなので試行錯誤してみました。

今回は、appspot.com/cron/backupをcronで動かすことにします。

まず、elipseプロジェクトにweb.xmlとcron.xmlを新規作成します。


cron.xmlを以下のように書きます。
以下の例は、/cron/backupを毎時間叩くように指定します。

cron.xml
<?xml version="1.0" encoding="UTF-8"?>
<cronentries>
  <cron>
    <url>/cron/backup</url>
    <description>save contents every 1 hours</description>
    <schedule>every 1 hours</schedule>
    <timezone>Asia/Tokyo</timezone>
    <target>save</target>
  </cron>
</cronentries>
次に、web.xmlでルーティングの設定を以下のように書きます。
<servlet>と<servlet-mapping>は、servlet-nameでひもづけします。

web.xml 
<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<servlet>
<servlet-name>Btools</servlet-name>
<servlet-class>jp.btools.backuperServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Btools</servlet-name>
<url-pattern>/cron/backup</url-pattern>
</servlet-mapping>
<security-constraint>
       <web-resource-collection>
           <url-pattern>/cron/*</url-pattern>
       </web-resource-collection>
       <auth-constraint>
           <role-name>admin</role-name>
       </auth-constraint>
   </security-constraint>  
</web-app>
デプロイして確かめてみると、on time Failed

試行錯誤して、queue.xmlを新規作成します。













queue.xmlは今回使わないので<queue-entries>タグのみ追加。

queue.xml
<queue-entries>
</queue-entries>

デプロイして確かめてみると、on time Success
queue.xmlを追加したところ、cronが動くようになりました。

はて、cronを動かす為にはqueue.xmlが必要だったのでしょうか。