backlog4jで課題を登録してみる

今度は、backlogへの課題登録を自動化したいという話があり、前回のredmineと似通った要件なので再利用箇所も多く、redmine java api部分をヌーラボ公認のbacklog4jに置き換えて実装してみました。
redmineとの違いはそれなりにありますが、backlog4jの方はKeyとIDを混同しやすい感じがします。例えば、課題のKeyはURLを見ればすぐ解りますが、IDの方は内部的なユニークな数値です。これに注意しながらbacklog用に前回のラッパークラスを置き換えてみました。

import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang3.StringUtils;

import com.nulabinc.backlog4j.BacklogClient;
import com.nulabinc.backlog4j.BacklogClientFactory;
import com.nulabinc.backlog4j.Category;
import com.nulabinc.backlog4j.Issue;
import com.nulabinc.backlog4j.IssueComment;
import com.nulabinc.backlog4j.IssueType;
import com.nulabinc.backlog4j.Project;
import com.nulabinc.backlog4j.Status;
import com.nulabinc.backlog4j.api.option.AddIssueCommentParams;
import com.nulabinc.backlog4j.api.option.CreateIssueParams;
import com.nulabinc.backlog4j.api.option.GetIssuesParams;
import com.nulabinc.backlog4j.api.option.UpdateIssueParams;
import com.nulabinc.backlog4j.conf.BacklogConfigure;
import com.nulabinc.backlog4j.conf.BacklogJpConfigure;
import com.nulabinc.backlog4j.conf.BacklogPackageConfigure;

public class BacklogRegist {
	
	private BacklogClient backlog;
		
	public BacklogRegist(String url, String apikey) throws MalformedURLException  {
		
		BacklogConfigure conf = null;
		//オンプレ環境
		if(url.startsWith("http")){
			conf = new BacklogPackageConfigure(url);
		}
		//クラウド
		else{
			conf = new BacklogJpConfigure(url);
		}
		conf.apiKey(apikey);
 		backlog = new BacklogClientFactory(conf).newClient();
				
		
	}
	/**
	 * 課題を取得する
	 * @param issueKey
	 * */
	public Issue getIssue(String issueKey){
		
		if(issueKey == null){
			return null;
		}
		return getIssue = backlog.getIssue(issueKey);
	}
	/**
	 * 課題を作成する
	 * @param projectKey
	 * @param  issueTypeName 種別名称
	 * @param categoryName カテゴリ名称
	 * @param summary 件名
	 * @param description 詳細
	 * @return ticketID 0は登録失敗
	 * */
	public long regist(String projectKey, String issueTypeName, String categoryName, 
						String summary, String description){
		
		CreateIssueParams param = new CreateIssueParams(
				getProjectID(projectKey), summary,
				getIssueTypeId(projectKey, issueTypeName), Issue.PriorityType.Normal);
		
		param.description(description);
		
		if(StringUtils.isNotEmpty(categoryName)){
			List<String> categoryIds = new ArrayList<String>();
			categoryIds.add(getCategoryId(projectKey, categoryName));		
			param.categoryIds(categoryIds);
		}
		
		Issue issue = backlog.createIssue(param);
		if(issue != null){
			return issue.getId();
		}
		return 0;
	}
	
	/**
	 * 課題を更新する(コメントの追加も可能)
	 * @param projectKey プロジェクトKey
	 * @param  issueIdorKey 課題IDまたはKey 
	 * @param status ステータス名称(更新しなければセットしない)
	 * @param addComment  更新なければセットしない
	 * @return commentID 0は登録失敗
	 * */
	public long update(String issueIdorKey, String status, String addComment){
		long ret = 0;
		Issue issue = null;
		
		if(StringUtils.isNotEmpty(status)){
			UpdateIssueParams param = new UpdateIssueParams(issueIdorKey);
			for( Status Entity: backlog.getStatuses()){
				if( Entity.getName().equals(status)){
					param.status(Entity.getStatusType());
				}
			}
			issue = backlog.updateIssue(param);
		}
		else{
			issue = backlog.getIssue(issueIdorKey);
		}
		if(StringUtils.isNotEmpty(addComment)){
			AddIssueCommentParams params = new AddIssueCommentParams(issue.getIssueKey(), addComment);

			IssueComment cmt = backlog.addIssueComment(params);
			ret = cmt.getId();
		}
		else{
			ret = issue.getId();
		}
		return ret;
	}

	/**
	 * 課題にコメントを追加する
	 * @param projectKey
	 * @param  issueKey
	 * @param addComment
	 * @return commentID 0は登録失敗
	 * */
	public long addComment(String issueKey, String addComment){
		Issue issue = backlog.getIssue(issueKey);
		
		if( issue != null){
			AddIssueCommentParams params = new AddIssueCommentParams(issue.getIssueKey(), addComment);

			IssueComment cmt = backlog.addIssueComment(params);
			return cmt.getId();
			
		}
		return 0;
	}

	/**
	 * 課題のタイプ(種別)を取得する
	 * @param prjKey プロジェクトキー
	 * @param name 種別名称
	 * */
	public String getIssueTypeId(String projectKey, String name){
		for( IssueType type: backlog.getIssueTypes(projectKey)){
			if( type.getName().equals(name)){
				return type.getIdAsString();
			}
		}
		return null;
	}
	
	/**
	 * カテゴリを取得する
	 * @param prjKey プロジェクトキー
	 * @param name 種別名称
	 * */
	public String getCategoryId(String projectKey, String name){
		for( Category type: backlog.getCategories(projectKey)){
			if( type.getName().equals(name)){
				return type.getIdAsString();
			}
		}
		return null;
	}
	/**
	 * プロジェクトIDを取得する
	 * @param prjKey プロジェクトキー
	 * @return Projectid
	 * */
	public String getProjectID(String projectKey){
		for( Project type: backlog.getProjects()){
			if( type.getProjectKey().equals(projectKey)){
				return type.getIdAsString();
			}
		}
		return null;
	}
}

上記を呼び出すのはこんな感じ

BacklogRegist backlog = new BacklogRegist("{URLまたはスペースID}","{apiKey}");

//チケット取得
Issue issue = backlog.getIssue("PROJECT-3");

//チケット登録
long issueId = backlog.regist("PROJECT", "要望", "設定変更",  
	"ユーザーの追加について", "○○さんを追加してください");

後日談
GetIssieで3ヶ月経って問題発生・・・たまに課題の取得に失敗するようになりました・・・
下記のようにしましたが、最初からそうしろ!って事ですね。でも、3ヶ月は何も問題なかったのですが・・
public Issue getIssue(String issueKey)

Issue getIssue = backlog.getIssue(issueKey);
カテゴリー: Javaredmine   作成者: bokusui パーマリンク

bokusui について

ソフトウェアハウスでのPG・SEから始まり、10年近く勤めた金融系企業の社内SEを数年前にやめ、フリーランス時代を経たのち法人成りしました。システム開発の全工程をこじんまりとやり続けています。