JIRAで外部のDBにあるデータを課題のフィールドに使用する #augj

Atlassian Advent Calendar 2012 21日目のエントリーです。

最近試したJIRA Database Values Pluginについて書いてみたいと思います。

Database Values Pluginは、その名のとおりDBに入っているデータから課題のフィールドを作成することができるプラグインです。例えば、顧客の要望を課題として登録する際に、別の顧客管理DBからデータをとってきて、リストから選択するようなことができます。

試したJIRAのバージョンは5.0.2だったので、最新版とは少し異なるかもしれません。接続先DBはMySQLで試しました。

インストール手順

まず、JIRA Database Values Pluginから、プラグインのファイル(jarファイル)をダウンロードしてきて、JIRAのインストール先のatlassian-jiraWEB-INF/lib にコピーし、JIRAを再起動します。

最新のプラグインは、JIRAの管理画面から直接インストールできるのですが、このプラグインは少し古いインストール方法にしか対応していないようです。

JIRAを再起動すると、管理画面のカスタムフィールドの追加画面に“Database Values Selection Field”が表示されるので、カスタムフィールドを追加します。

f:id:w650:20121220233132p:plain

次に、追加したカスタムフィールドの編集画面を開き、URLに含まれるID(id=10155 のようなパラメータがあります)をメモって、atlassian-jira\WEB-INF/classes/jira-database-values-plugin-ID.properties という名称のファイルを作成します(IDの部分に10155のような数字が入ります)。そのファイルに、以下のようにDB接続パラメータやプラグインの設定を記述します。

# The database connection parameters
database.driver=com.mysql.jdbc.Driver
database.user=ユーザー名
database.password=パスワード
database.connection.url=jdbc:mysql://サーバー名/データベース名

# Cache Timeout (= 15 minutes by default). The actual db is queried only once and then the results are kept in the cache for the given timeout. Uncomment the line below to change it.
#cache.timeout=900000

# The SQL Query that will be executed on the database
sql.query=select id, name, from users
# The column number (starting from 0) that contains the primary key of the returned data.
primarykey.column.number=0
# The pattern that should be used to render the data in view mode. Use {column_number} as placeholders. You can use HTML, but make sure you close your tags properly!
rendering.viewpattern={1}
# The pattern that should be used to render the data in edit mode. Use {column_number} as placeholders.
rendering.editpattern={1}
# The pattern that should be used to render the data in searcher. Use {column_number} as placeholders.
rendering.searchpattern={1}
# This is used when sorting in the issue navigator. When not defined, the 'rendering.viewpattern' is used.
rendering.sortpattern={1}
# Use 0 to have a combobox for editing, 1 to have AJAX-style input field, 2 for cascading select
edit.type=1
# Use 0 to have a list for searching, 1 to have AJAX-style input field
search.type=1
# The pattern that is used for the history and the activity view. If not specified, the 'rendering.viewpattern' is used. Note that you cannot use HTML.
rendering.changelog.viewpattern={1}
# The pattern that is used for the pie chart, 2d filter statistics and single level group by. If not specified, the 'rendering.viewpattern' is used. Note that you cannot use HTML.
rendering.statistics.viewpattern={1}

設定の詳細はこちらにあります。接続先情報と、データを取得するためのsqlを指定し、取得したデータを使用して表示用のパターン等を指定しています。表示にはHTMLも使えるので、別ページにリンクさせることもできます。

JIRAを再起動し、追加したカスタムフィールドを課題編集画面に追加すると使用可能になります。

プルダウンの他に、こんな感じでAjaxのサジェストボックスを使うことも可能です。またフィールドの検索にも対応しています。
f:id:w650:20121220233305p:plain

まとめ

設定ファイルを直接編集する必要があったりJIRAを再起動する必要があったりするのが面倒ですが、機能的にはほぼやりたいことができました。あとは複数選択ができるとよいのですが。。

ただ、いくつか問題点もありました。画面サイズによって発生するようなのですが、候補が表示される位置がテキストボックスからずれてしまう場合があり、そのため候補に気付かない可能性があります。

あとは、DBのからのデータの取得が完了してから課題の編集画面が表示されるので、DBへの接続に時間がかかる構成では操作性が低下します。キャッシュするので毎回では無いはずです。

おまけ

以前、このプラグインを試したときに、同じようなプラグインで、Database Custom Fieldというのもあって、何かの理由があってDatabase Values Pluginを使った気がしたのですが、このエントリーを書くにあたって再度見てみたところ、Database Custom Fieldは複数選択できるようになってました。また画面から設定ができるので、こちらの方がオススメかもしれません。。

オブジェクト指向JavaScript

オブジェクト指向JavaScript

オブジェクト指向JavaScript


本自体に初心者向けとあるとおり、jQueryとかで何となくJavaScriptを書いてきたけど、そろそろマジメに勉強しようという人向けでしょうか。サイ本や『JavaScript:The good parts』や『JavaScriptパターン』に書いてあることのうち、初心者向けの内容が過不足なくまとまっていて印象でよいと思います。

10種類以上の継承の実現方法が一覧で整理されていて、それはそれでわかりやすいのですが、こういうのを見るたびにJavaScriptを使ってよいコードを書く難しさを感じます。

リーダブルコード

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)


よかったです。

プライベートメソッドやローカル変数の名前の付け方やコメントの書き方というのは、すごくその人のセンスが試される部分だと思います(コーディング規約以上モデリング未満という感じの部分)。大部分はこだわりを持ってコードを書いていれば、自然と身についていくものだとは思いますが、たまにこういう本を読むと、できていること、わかっているけどサボっていること、などが明らかになって、綺麗なコードを書こうというモチベーションが上がると思います。

min/maxが境界値を含むのはよいのですが、begin/endのendが境界値を含まないのはイディオムなんですね。JavaのString#substringなんか、いつも少し迷います。

あとはgetXXX()が軽量アクセサであるというのが暗黙の規約だと意識はしているのですが、結構DBからデータを取り出すコードでも使ったりしていました。。

適切な単語を選択するというのは英単語の意味がイメージできないと難しいので、もう少し英文に慣れていて、自然とある状況に対して適切な単語の候補がスラスラと思いつくようにになりたいものです。

この本とは関係ないですが、、Javaだとよくpublic static final int/Stringで定数を定義して引数に使うコードを見ますが、、これもわかりづらいと思います。Java5より前の習慣だと思いますが、enumを使う場合に比べると、どこで定数が定義されているかとか、値の範囲が直ぐにわからないので。concurrentパッケージのTimeUnitみたいなAPIが好きです。

[本]データベースリファクタリング

データベース・リファクタリング

データベース・リファクタリング

  • 作者: スコット W アンブラー,ピラモド・サダラージ,梅澤真史,越智典子,小黒直樹
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2008/03/26
  • メディア: 単行本
  • 購入: 9人 クリック: 194回
  • この商品を含むブログ (44件) を見る

そもそも、データベースの構更は、例えば、サロゲートキーとナチュラルキーの選択や、制約やロジックをアプリケーションで持つかDBで持つのか、の様に、状況に応じて選択すべきで単純にどちらがよいと言い切れないケースが多く、単純に変更内容のみで評価することは難しいと思います。
そのため、本書でも、トレードオフについて必ず説明がされているのですが、レガシーコード改善ガイド (Object Oriented SELECTION)リファクタリング―プログラムの体質改善テクニック (Object Technology Series)などのコーディングにおけるリファクタリングほど面白くありません。また「外部キー制約の追加」と「外部キー制約の削除」のように対になった項目が多いのも冗長な感じがしますし、通して読むタイプの本ではないように思えます。
個別の項目の内容を見ると、

  • スキーマ変更手順
  • データ移行手順
  • アプリケーション変更手順

が実際のコードで例示されており、自分があるデータ変更を行う際になってどのような点を考慮すべきか確認したい、というケースでは役に立ちそうです。
項目自体は、ある程度、DB設計の経験がある人間であれば、ひと通り経験したであろう項目のように思います。

Bloggerをお試し中

はてなブログに移行したばかりですが、その少し前からBloggerを試しに使ってます。しばらく新しい投稿はBloggerの方に書こうと思いますので、よろしかったらご覧下さい。

azuki note2

→ 特にBloggerの方が優れているという点もないように思ったので、もうしばらくは使い慣れがはてなを使おうと思います。今後ともよろしくお願いいたします。