旧拡張機能の移行
Ant から Maven への移行
なぜこの変更をするのか
Ant は依存管理を備えない古いビルドシステムです。Maven に移行することで、開発者が OpenRefine に新しいライブラリを組み込みやすくなり、リポジトリに大量の .jar ファイルを同梱する必要がなくなります。Maven リポジトリを使うことで、更新しづらい独自スナップショットではなく、公開済みライブラリへの依存を推奨できる点もメリットです。
いつ変更されたか
3.0 から 3.1-beta の間で以下のコミットにより移行しました。 https://github.com/OpenRefine/OpenRefine/commit/47323a9e750a3bc9d43af606006b5eb20ca397b8
拡張を移行するには
拡張のルートに pom.xml を配置し、Maven 用のビルド設定を記述します。OpenRefine 同梱拡張(gdata、database、jython、pc-axis、wikidata)やサンプル拡張(sample)の pom.xml が参考になります。
依存ライブラリは可能な限り Maven Central から取得し、.jar を削除して pom.xml に依存を追加します。見つからない場合は maven-install-plugin を使って手元の .jar を取り込めます。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
<executions>
<execution>
<id>install-wdtk-datamodel</id>
<phase>process-resources</phase>
<configuration>
<file>${basedir}/lib/my-proprietary-library.jar</file>
<repositoryLayout>default</repositoryLayout>
<groupId>com.my.company</groupId>
<artifactId>my-library</artifactId>
<version>0.5.3-SNAPSHOT</version>
<packaging>jar</packaging>
<generatePom>true</generatePom>
</configuration>
<goals>
<goal>install-file</goal>
</goals>
</execution>
</executions>
</plugin>
依存セクションに通常どおり追加します。
<dependency>
<groupId>com.my.company</groupId>
<artifactId>my-library</artifactId>
<version>0.5.3-SNAPSHOT</version>
</dependency>
Wikimedia の i18n jQuery プラグインへの移行
なぜこの変更をするのか
複数形や文字列補間などの重要なローカリゼーション機能を利用できるようにするためです。また、翻訳が存在しない場合に英語にフォールバックする機能も復活します。
いつ移行したか
3.1-beta から 3.1 の間に以下のコミットで移行しました。 https://github.com/OpenRefine/OpenRefine/commit/22322bd0272e99869ab8381b1f28696cc7a26721
拡張を移行するには
翻訳ファイル内のネストされたオブジェクトを 1 つのオブジェクトに統合し、キーを連結します。以下の Python スクリプトを各 JSON に適用してください。
import json
import sys
with open(sys.argv[1], 'r') as f:
j = json.loads(f.read())
result = {}
def translate(obj, path):
if isinstance(obj, str):
result['/'.join(path)] = obj
else:
for k, v in obj.items():
translate(v, path + [k])
translate(j, [])
with open(sys.argv[1], 'w') as f:
f.write(json.dumps(result, ensure_ascii=False, indent=4))
JavaScript での取得方法は $.i18n._('core-dialogs')['cancel'] から $.i18n('core-dialogs/cancel') に変わります。次の sed スクリプトで置換可能です。
sed -i "s/\$\.i18n._(['"]\([A-Za-z0-9/_\\-]*\)['"])\[['"]\([A-Za-z0-9\-_]*\)["']\]/$.i18n('\1\/\2')/g" my_javascript_file.js
翻訳文字列を連結している箇所は、プラグインの機能を使った柔軟なパターンに置き換えてください。
org.json から Jackson への移行
なぜこの変更をするのか
org.json はライセンス上の問題や機能不足があり、Jackson に移行して統一的なシリアライズ/デシリアライズ処理を行うためです。
いつ移行したか
3.1 で実施されました。
拡張を移行するには
ParsingUtilities.mapper を活用して Jackson で JSON を扱います。org.json の JSONObject/JSONArray は以下のメソッドで置き換えます。
ParsingUtilities.mapper.createObjectNode()(new JSONObject()の代替)ParsingUtilities.mapper.createArrayNode()(new JSONArray()の代替)
移行前に、オブジェクトのシリアライズ/デシリアライズを行うテストを書き、JSON 形式が保持されることを確認してください。TestUtils のユーティリティも活用できます。
Function の場合
従来は write メソッドで JSON を明示的に定義していましたが、移行後は各種ドキュメント用の getter を上書きします。例: Cos 関数の 移行前 / 移行後。
Operation の場合
エンジン依存の Operation では、JSONObject の代わりに EngineConfig を使用するようリファクタ済みです。コンストラクターで EngineConfig を受け取り、デシリアライズ用のアノテーションを追加してください。Operation type は AbstractOperation が自動でシリアライズします。例: ColumnRemovalOperation の 前 / 後。
Change の場合
Change はテキストでシリアライズされますが、一部で JSON を使うことがあります。ParsingUtilities.mapper 経由で Jackson を利用してください(例: ReconChange)。
Importer の場合
インポートオプションは JSONObject から ObjectNode に移行しました。コンパイラの警告に従って変換できます。JSONUtilities も Jackson に対応済みです。例: TabularImportingParserBase の 前 / 後。
Overlay Model の場合
他オブジェクト同様にシリアライズ/デシリアライズを移行します。例: WikibaseSchema の 前 / 後。
Preference 値の場合
Preferences に保存するクラスは com.google.refine.preferences.PreferenceValue を実装し、従来の static load / write メソッドは削除して Jackson の標準的なシリアライズに置き換えます。クラス名のシリアライズはインターフェースが自動で処理します。例: TopList の 前 / 後。