Friday, March 22, 2013

What is the best open source Java decompiler?

A Java decompiler turns a .class file back into a .java file. While decompiled code is not perfect (no comments, sometimes obfuscated names), it can be useful during hacking competitions, or to liberate your data locked by proprietary software, or to satisfy curiosity.

There used to be a time where everyone's decompiler of choice was jad.
But jad is dead, and it was not Open Source anyway, so there must be something better, right?

Current winner

Started in 2012, Procyon has quickly emerged as the best open source Java decompiler. Its source code is released under the Apache 2 license, making it easily reusable. It has GUI frontends:  and SecureTeam Java Decompiler, bytecode-viewer and Luyten.

Lead by Mike Strobel, Procyon has a healthy community with issue reports being filed and processed every few weeks, pull requests from various contributors, and several releases per year.

Challengers

  • Fernflower is the second best, and its inclusion in IntelliJ speaks about its reliability. Also released under the Apache 2 license, it is unfortunately hold back by project policy problems: 1) No releases, meaning that users have to either compile it or use IntelliJ 2) No separate issue tracker, which means Fernflower issue reports get lost in the sea of IntelliJ issue reports.
  • Krakatau, interestingly written in Python, and licensed under the GNU GPLv3 license, is kept active by its leader and its community is slowly growing. It does not fully support Java 8 yet.
  • CFR is produced as a friendly competition within the same company as Procyon. A young project with frequent releases, it is not open source yet as the author wishes to polish the code before.
  •  Cake Decompiler/Candle Decompiler is a work in progress that stalled a few months ago. Even though it is backed by RedHat, there is a risk that it will be abandoned in favor of the more advanced challengers.

Abandoned

  • Jdec is a great Open Source decompiler, but it is not perfect: There is no community, and there are bugs, none of which has got fixed since 2007.
  • JODE has had no release since 2004.
  • dcompiler has had no release since 2002.
  • JReversePro shows signs of activity but has had no release since 2002.

Need work

  • Dava seems to be a thesis project rather than a programming tool.
  • javap only shows assembly-level code.
  • Soot is not really a decompiler.

Out of Competition

Those ones might be usable but they are not Open Source:
Please let us know about any other Open Source decompiler your know!
Nicolas Raoul

Wednesday, March 13, 2013

Alfrescoのユーザ検索の文字数制限

こんにちは。おおたにです。

今回はAlfrescoのユーザ検索についてお話ししたいと思います。Alfrescoを使っている人であればご存知の方も多いと思いますが、ユーザ検索には最低文字数が設定されています。基本的には1文字なのですが、権限管理画面でのユーザ/グループ検索だけ何故か3文字になっています。ユーザIDだけでなく姓名でも検索できるのですが、残念ながら「鈴木」さんとか「林」さんとかでは検索できません。




せっかくなので、ここも1文字以上で検索できるようにしてみましょう。変更箇所は以下のとおりです。

webapps/share/components/manage-permissions/manage-permissions.js
// Set the correct options for our use
this.modules.authorityFinder.setOptions(
{
   dataWebScript: Alfresco.constants.URL_SERVICECONTEXT + "components/people-finder/authority-query",
   viewMode: Alfresco.AuthorityFinder.VIEW_MODE_COMPACT,
   singleSelectMode: true,
//   minSearchTermLength: 3
   minSearchTermLength: 1
});

さらに、上記変更ファイルからwebapps/share/components/manage-permissions/manage-permissions-min.jsを再作成する必要があります。この-min.jsは元のJavaScriptファイルを圧縮し、容量を減らしたものなので、YUI Compressor等を使って圧縮してください。

上記2ファイルの修正が終わったら、Alfrescoサーバを再起動して確認してみましょう。以下のように3文字未満でも検索ができるようになっていればOKです。



Wednesday, March 6, 2013

AlfrescoをActive Directoryと連携させてみた

こんにちは。おおたにです。

今回はAlfrescoをActive Directory(以下AD)と連携させてみようと思います。一言で連携と言っても、単純な認証の委譲なのか、SSOなのかとかありますが、今回はAlfrescoログイン時の認証をADに行ってもらう&ユーザ・グループ情報を同期するという一番簡単なパターンについて見ていきます。


初めに


この記事の前提条件は以下の通りです。
  • Alfrescoがインストールされている(本記事では現時点での最新版であるAlfresco 4.2.cを使っています)
  • ADがセットアップされている(Windows Server 2008 R2を使ってます)
Alfrescoがインストールされていない場合は「Alfresco4.0をインストールしてみよう(インストーラ編)」や「Alfresco4.0をインストールしてみよう(手動インストール編)」を参考にインストールしてみてください。ADについては…頑張ってください!

なお、ADにはLDAPアクセスする必要があるため、ファイアウォールでは標準的なLDAP用ポートである389番を通すように設定しておいてください。


AlfrescoにAD連携用の設定を行う


基本は以前の記事「AlfrescoのLDAP連携」とほぼ同じで、設定項目がちょろっと違う程度だと思ってください。

まずは、ユーザやグループのBaseDNを調べるべく、適当なLDAPクライアントを使ってADにアクセスしてみます。筆者はよくApache Directory Studio(のEclipseプラグイン)を使っています。インストール方法等はこちらにまとめられています。インストールしたら、早速ADにアクセスしてみます。以下のスナップショットのように新規接続を作成してアクセスし、同期対象のユーザ/グループのBaseDNを調べます。







すると、ユーザのBaseDNはOU=User Accounts,DC=aegif,DC=localで、グループのBaseDNはOU=User Groups,DC=aegif,DC=localであることが分かります。ちなみにこの例ではADサーバのIPが192.168.0.70、ドメイン名がaegif.local、ADアクセス用のユーザアカウントはAdministratorとなっています(実運用上は、ADの情報を取得する権限を委譲した個別のユーザアカウントを用意した方がよいかと思います)。

以上で設定に必要な情報がそろったので、Alfrescoにこれらの設定を反映させます。いじるファイルは <tomcat_dir>/shared/classes/alfresco-global.properties です。このファイルが無い場合は、alfresco-global.properties.sample というファイルがあるはずなのでこれをリネームして利用します。

# How to map the user id entered by the user to taht passed through to LDAP
# In Active Directory, this can either be the user principal name (UPN) or DN.
# UPNs are in the form <samaccountname>@domain and are held in the userPrincipalName attribute of a user
ldap.authentication.userNameFormat=%s@aegif.local

# The URL to connect to the LDAP server 
ldap.authentication.java.naming.provider.url=ldap://192.168.0.70:389

# The default principal to bind with (only used for LDAP sync). This should be a UPN or DN
ldap.synchronization.java.naming.security.principal=Administrator@aegif.local

# The password for the default principal (only used for LDAP sync)
ldap.synchronization.java.naming.security.credentials=p@ssw0rd

# The group search base restricts the LDAP group query to a sub section of tree on the LDAP server.
ldap.synchronization.groupSearchBase=ou\=User Groups,dc\=aegif,dc\=local

# The user search base restricts the LDAP user query to a sub section of tree on the LDAP server.
ldap.synchronization.userSearchBase=ou\=User Accounts,dc\=aegif,dc\=local


# authentication chain
authentication.chain=alfrescoNtlm1:alfrescoNtlm,ldap-ad1:ldap-ad

以上で設定完了です。"ldap"から始まるプロパティがAD連携に関する設定で、"authentication.chain"は、Alfrescoログイン時の認証システムとして何を利用するかを指定するものです。複数指定し、認証処理をチェイニングすることが可能で、この例では通常のAlfrescoの認証とAD認証の両方を利用できるように設定されます。
"ldap-ad1:ldap-ad"はある種のおまじないで、Alfrescoの認証システム等で使われるSubsystemという仕組みにおけるAD連携モジュールのIDだと思ってください(このおまじないによって呼び出されるbeanの定義ファイルは <tomcat_dir>/webapps/alfresco/WEB-INF/classes/alfresco/subsystems/Authentication/ldap-ad/ldap-ad-authentication-context.xml ですので、興味があったら見てみてください)。


できたかな?


あとはAlfrescoを起動し、実際に動作確認してみるだけです。Alfresco起動時にユーザ/グループ情報の同期処理が走るので、起動後にログをチェックしてみてエラーが出力されていないかを確認してみてください。 また、実際にADのユーザでログインしてみて、正常にログインできることも確認してくださいね(当たり前!)。他方、adminユーザでログインし、ユーザ/グループ情報が同期されていることも確認しましょう。

今回はここまでになります。この先にはSSO等がひかえていると思いますが、それはそれで大きなトピックですのでまたの機会にしたいと思います。

Wednesday, February 27, 2013

Klingon use CmisSync!

弊社製品CmisSyncクリンゴン語に翻訳しました。

言語リソースの翻訳はここで行われています。
翻訳作業は、自然言語と人工言語を趣味としている筆者(linzhixing)が担当しました。プログラミング言語は仕事で使っています。(主にJavaと、最近はRubyも)


[CmisSyncって?]
◆弊社の開発するCmisSyncというソフトウェアは、このブログでも既に紹介されていますが、AlfrescoなどのCMIS対応サーバとローカルPCの間で双方向の同期ができるDropbox風のツールです。

     Alfrescoに限らずMicrosoft SharepointやIBM FileNetなど、社内のECM(文書管理システム)サーバが文書をやり取りするCMISという標準規格に対応したものであれば、更新のあった文書がCmisSyncで自動的に同期されて、出先などオフライン/オンラインを問わずシームレスな作業が可能になります。


[クリンゴン語って?]

◆クリンゴン語は、SFテレビシリーズ『スタートレック』に登場するクリンゴン人が使用する架空の言語です。

  宇宙語の一種なので、ソフトウェアの多言語対応(globalization)としては地球(globe)の範囲を超えてしまっているきらいもありますが、便利なCmisSyncを、高度な情報技術を有する数多くのクリンゴン人やクリンゴン語を話す地球人の方々にも触れてもらいたいと思い、翻訳してみました。(英語と)クリンゴン語以外に、すでに日本語、フランス語、ウクライナ語などに翻訳されています。

◆ISO639(言語名コードの規格)によって、jaやenと同様に、tlhというコードが割り当てられています。OSやブラウザにもよりますが、言語コードを変更することでCmisSyncがクリンゴン語化されます。

     Windowsの場合は、コントロールバネル>>地域と言語>>フォーマットの値を切り替えると、対応する言語でCmisSyncのUIが表示されます。(直接は選択できないかもしれませんが……)

     "tlh"というのは不思議なスペルですが、これで一つの子音を表します。この発音はとても難しいので省略しますが、クリンゴン語を象徴する音で、クリンゴン語でクリンゴン語のことはtlhIngan Holと書きます。

◆クリンゴン語を言語として整備した言語学者マーク・オクランド氏が、Klingon Dictionaryという辞書を出しています。クリンゴン語の文法も単語も、事実上この本を基準とすることになります。ネット上でも、この本をなぞった解説サイトがいくつかありますので興味がある方は検索してみてください。


[Pick Up!]
Klingon Dictionaryには、約3000の単語しか含まれていません。また、クリンゴン人が戦闘民族であるためか、内容にも偏りがあるので、翻訳するときは上手い意訳・造語を考える必要があります。

そこで、翻訳が難しかったところや興味深かったポイントをいくつかピックアップしてみました。


Enterprise Content Management
     「enterprise」は難しい英語で、「組織」とも「冒険」とも少しずつニュアンスが違いますが、クリンゴン語とは実はとても相性のよい言葉です。そうです、エンタープライズ号は"enterpray"と呼ばれています。

       訳語: enterpray ngaSghach vu'ghach

Welcome to CmisSync!
  クリンゴン語は戦士の言葉なので、気安く「ようこそ」と挨拶することはありません。が、文明を有している限り(他の文明からそうは見えないとしても)挨拶に似たものは持っています。彼らの場合、nuqneH?「何か用か?」 というのが私たちのいう挨拶のようです。

     ちなみにCmisSyncのリソース多言語化にはcrowdinというサービスが使われていますが、ここで翻訳文を入力するとき、原文が"!"で終わっていれば訳文も"!"で終わっていないと警告表示が出ます。Welcome!のエクスクラメーションマークがnuqneH?のクエスチョンマークになるあたり、異文化の味わいがありますね。 

     訳語: CmisSyncDaq nuqneH?

Please…
     ヨーロッパ系の言語では、ソフトウェアのダイアログやメニューバーの「開く」や「戻る」は動詞の命令形ではなく不定詞で書かれることが一般的です。日本語でいうと「開け!」ではなく「開く」と書いてあるわけです。

     クリンゴン語でも、命令形ではなく動詞の原形を使うように訳しました。ただし、元の英語がPleaseで始まっている文章の場合は不定詞ではニュアンスが 出ません。命令形でもよいですが、クリンゴン語では何かを特に強く要請する場合、〜be'chugh bIHegh!「〜しないとお前は死ぬぞ!」という言い回しをします。物騒ですが、戦士の言葉なので仕方ありません。

     訳語: -be'chugh bIHegh!

synchronize
     クリンゴン語はよりによってsynchronizeを意味する単語がありません。CmisSyncは固有名詞だからそのままでよいとしても、これはCmisSyncの翻訳の根本を揺るがす由々しき事態です。しかし、クリンゴン語はたしかにボキャブラリに偏りがあるものの、幸いなことに強力な造語能力も兼ね備えています。名詞や動詞の前や後ろに、規則的に接辞を付けることで意味を変化させられるのです。

     たとえば、poS「開いている」に対しpoS-moH「開ける」、ja'「話す」に対しqa-ja'-qang「私は自主的にあなたに話す」など。

     rap「同じである」という動詞はあるので、rapmoH =「同じにする」=synchronize、という造語を作ってみました。さらに、synchronizationはrapmoHghachとなります。

     訳語: rapmoH

document / folder
     戦士であるだけでなく高度なテクノロジーと共に宇宙を駆ける彼らのこと、De'wI'「コンピュータ」やDe'「データ」、さらにtebwI'「サーバ」といった単語も存在しています。しかし、CmisSyncにとって重要なドキュメント/フォルダを意味する単語は見当たりません。

    ひとまずの訳語・造語として、ドキュメント=paper (eng.) =nav、フォルダ=container (eng.) = ngaSwI' としてみました。ngaSは英語の"contain"の意味で、-wI'を付けると行為者名詞にできます。

     この訳はベストではないかもしれません。クリンゴン語のフォーラムでは既に良い訳が作られているかもしれません。フィードバックをいただければ嬉しいです。

     訳語: nav / ngaSwI'


[最後に]
◆クリンゴン語への翻訳を通して、"Language is Open Source!"という思いを新たにしました。ぴったり来る単語や言い回しがないのなら自分で作ってしまえばいいのです。そのための材料(単語)もルール(文法)も公開されています。

     翻訳に使われているcrowdinは、誰もが翻訳することのできるコラボレーティブ型翻訳プラットホームなので、気軽にご参加ください。たとえ訳に自信がないところがあっても、他の人が修正してくれるでしょう。

     とくに筆者は『スタートレック』を一度も観たことがありませんので、本当のクリンゴン人はもっと自然な言い回しをしていた、などご指摘いただければと思います。

     CmisSyncはオープンソースソフトウェアで、現在も随時バージョンアップを重ねています。ぜひお使いください!

Wednesday, February 20, 2013

CmisSync:AlfrescoのためのDropboxのような同期ツール

CmisSync を使うと、あなたのPCと社内 Alfresco を簡単に同期できます。
オフラインでも、ドキュメントの閲覧と編集を行えます。


ステップ1

まず .NET Framework、次に CmisSync をインストールしましょう。

ステップ2

CmisSync を実行してください。
チュートリアル画面が終わると、タスクトレイに CmisSync のアイコンが追加されます。


アイコンを右クリックして、「リモートフォルダを追加...」を選択します。

ステップ3

表示された画面の「URL」フィールドに、Alfresco サーバの URL を入力します(ブラウザで Alfresco のドキュメントを閲覧する為のURL):


プロトコル( http:// か https:// )も必要です。
ユーザ名とパスワードも入力してください。

ステップ4

「次」を押すと、Alfrescoのフォルダのリストが表示されます。
同期したいフォルダを選択してください。
とくにAlfresco Share の場合は「Sites」をクリックして、同期したい Site を選び、その「documentLibrary」を選択してください。

  
設定はこれで終了です。
CmisSync はすぐに Alfresco とあなたのPCとの同期を開始します。
CmisSync はファイルの編集・追加を双方向で行えます。
もしもファイルの変更が衝突した場合、警告が表示されます。衝突した2つのファイルはバックアップされている為、後でマージすることも可能です。

CmisSyncはイージフが開発しているオープンソース製品です。
Alfrescoだけではなく、NuxeoやIBM FileNetやSharePointなど、CMIS準拠のリポジトリならなんでも同期できます。

Thursday, February 14, 2013

AlfrescoのJavaScriptコードをデバッグする

こんにちは。大谷です。

今日はAlfrescoでJavaScriptのデバッグを行う際に便利な機能をまとめてみました。Alfrescoをカスタマイズする際にJavaScriptを触ることも多いかと思いますので、その際に参考にしてみてください。


一言でJavaScriptって言っても


Alfrescoでは、サーバサイド、クライアントサイド(ブラウザですね)の両方でJavaScriptのコードが実行されます。サーバサイドでのJavaScript実行にはRhino(JavaによるJavaScript実装)を利用しています。
 また、Alfrescoはリポジトリのコア機能を提供するalfresco、UIレイヤを提供するshareの2アプリケーションから構成されています。
従って、 一言でJavaScriptと言っても、実際にはサーバサイドJavaScript(alfresco, shareの両者で実行)とクライアントサイドJavaScript(shareが提供)の計3ヶ所について、それぞれ個別にデバッグの方法を考えなくてはなりません。



サーバサイドJavaScript(alfrescoアプリケーション)


alfrescoアプリケーションのサーバサイドJavaScriptは主に、Web Scriptsと呼ばれる、簡単にREST APIを作ることのできるフレームワークを利用する際に使われます。

まずはデバッグツールですが、AlfrescoにはRhinoで実行されるJavaScriptをデバッグするための仕組みが用意されています。まず、http://localhost:8080/alfresco/service/api/javascript/debuggerにアクセスし、管理者のログイン情報を入力します。すると以下の画面が表示されるので「Enable」をクリックします。



あとは、通常どおりAlfrescoにアクセスすればOKです。JavaScript Debuggerのダイアログが表示され、あとはJavaScriptが実行されるタイミングで適切に割り込みが入るので、ブレークポイントを設定するなり変数をウォッチするなりすることができます。




次に、ログの出力方法を見てみます。まず、JavaScriptにログ出力を仕込むには、Alfresco JavaScript APIのLogging APIを利用します(詳しくは4.0 JavaScript API - alfrescowikiを参照)。さらに、log4jの設定を変更してログレベルを適切に設定する必要があります。

<alf_dir>/tomcat/webapps/alfresco/WEB-INF/classes/log4j.properties
log4j.logger.org.springframework.extensions.webscripts=debug
log4j.logger.org.springframework.extensions.webscripts.ScriptLogger=debug
これで、JavaScript内で仕込んだログがAlfrescoログに出力されるようになります。もちろんログレベル変更後にはAlfrescoサーバの再起動が必要です。


サーバサイドJavaScript(shareアプリケーション)


次にshareアプリケーションのサーバサイドJavaScriptについてですが、基本的にはalfrescoアプリケーションのJavaScriptと同様の方法になります。デバッガを有効にするには、http://localhost:8080/share/service/api/javascript/debugger(URLのalfrescoがshareに変わってることに注意!)にアクセスすればよいだけですし、ログは<alf_dir>/tomcat/webapps/share/WEB-INF/classes/log4j.properties(こちらもファイルパスのalfrescoがshareに変わっていることに注意!)を先ほどと同じように設定するだけでOKです。


クライアントサイドJavaScript(shareアプリケーション)


最後はクライアントサイドのJavaScriptです。これは、UIレイヤを担当するshareアプリケーションがブラウザに実行させるスクリプトということになります。UIカスタマイズの際にいじることがほとんどで、<alf_dir>/tomcat/webapps/share/components/あたりにあるファイルがそれに該当します。

まずデバッグについてですが、ブラウザ上で実行されるJavaScriptのデバッグになるので、ブラウザごとに利用可能なデバッグツールを利用してください。筆者の場合は、FirefoxならFirebugとか、IEならF12で起動する開発者ツールとか、Chromeならctrl+shift+Iで起動するデベロッパーツールとかを主に使っています。

ログ出力に関しても、Alfrescoにはlog4javascriptを利用した仕組みが用意されています。まずは、以下のファイルの当該箇所を以下のように変更し、Alfrescoを再起動します。

<alf_dir>/tomcat/shared/classes/alfresco/web-extension/share-config-custom.xml
<alfresco-config>

   <!-- Global config section -->
   <config replace="true">
      <flags>
         <!--
            Developer debugging setting to turn on DEBUG mode for client scripts in the browser
         -->
         <client-debug>true</client-debug>

         <!--
            LOGGING can always be toggled at runtime when in DEBUG mode (Ctrl, Ctrl, Shift, Shift).
            This flag automatically activates logging on page load.
         -->
         <client-debug-autologging>true</client-debug-autologging>
      </flags>
   </config>

   ...

</alfresco-config>
これで、Alfrescoアクセス時にlog4javascriptのダイアログが表示されるようになり、このダイアログ上でログを確認できるようになります。もしくは、client-debug-autologgingをfalseにしておき、必要なタイミングでCtrl, Ctrl, Shift, Shiftと入力することでもこのダイアログを表示させることができます。



ログ出力を新たに埋め込む場合は、Alfresco.loggerという名前のlog4javascriptロガーオブジェクトを利用します。例えば以下のように記述します(詳しくはlog4javascript manualのloggersを参照)。

Alfresco.logger.info("test");
Alfresco.logger.debug("current object: ", object);

Thursday, February 7, 2013

Alfrescoのカスタム属性(とアスペクト名、タイプ名とか)を日本語化する

こんにちは。大谷です。
今回は「Alfrescoにカスタム属性を追加する - タイプとアスペクト -」に続く形で、カスタムモデル周りの日本語化(多言語化)について紹介したいと思います。基本的にはメッセージリソースの追加方法の説明だと思ってください。


プロパティ名とか変じゃない?


先ほどのリンク先の記事、特に画像を見た人は既にお気づきだと思いますが、追加したプロパティ名やアスペクト名がリソースIDみたいな文字列になっています。まあ頑張れば何を表しているか分からなくもないですが、あまりユーザフレンドリではありません。そこで、今回はこの表示をユーザが分かりやすい文字列に変えてみようと思います。つまり、表示ラベルを設定するようなものです。


まずは英語で表示できるようにしてみる


日本人であれば日本語で表示したいところですが、まずは英語にしてみましょう。日本語に関しては、設定時に一工夫必要なので(まあ大体想像つくと思いますが)、後ほど多言語化の方法と併せて説明することとします。

まずは、プロパティの表示名を設定するために、以下の2ファイルを作成します。custom-model-context.xmlは前回作成してあるので、<property name="labels">タグを追加して読み込むリソースファイル名を指定します。そして、指定したファイル名のリソースファイルを作成します。コンテンツモデル名やプロパティ名の":"を"_"に置き換える形で用い、title(表示名)やdescription(説明)の文言を設定します。

<alf_dir>/tomcat/shared/classes/alfresco/extension/custom-model-context.xml
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'>
<beans>
    <!-- Registration of new models -->   
    <bean depends-on="dictionaryBootstrap" id="extension.dictionaryBootstrap" parent="dictionaryModelBootstrap">
        <property name="models">
            <list>
                <value>alfresco/extension/customModel.xml</value>
            </list>
        </property>
        <property name="labels">
            <list>
                <value>alfresco/messages/custom-model</value>
            </list>
        </property>
    </bean>
</beans>

<alf_dir>/tomcat/shared/classes/alfresco/messages/custom-model.properties
custom_customModel.property.custom_reviewer.title=Reviewer
custom_customModel.property.custom_reviewer.description=Reviewer's name
custom_customModel.property.custom_reviewDate.title=Reviewed Date
custom_customModel.property.custom_reviewDate.description=When this item reviewed

次に、アスペクトの表示名を設定するために、以下の2ファイルを作成します。読み込むリソースファイル名を指定するcustom-messages-context.xmlはweb-extension以下に配置します。タイプもこの方法で表示名を設定できます。リソースファイル内でtype.***=***のように設定するだけです。

<alf_dir>/tomcat/shared/classes/alfresco/web-extension/custom-messages-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'>
<beans>
   <bean id="custom.resources" class="org.springframework.extensions.surf.util.ResourceBundleBootstrapComponent">
      <property name="resourceBundles">
         <list>
            <value>alfresco.messages.custom-share-messages</value>
         </list>
      </property>
   </bean>
</beans>

<alf_dir>/tomcat/shared/classes/alfresco/messages/custom-share-messages.properties
aspect.custom_reviewable=Reviewable

以上で設定完了です。Alfrescoサーバを再起動し、プロパティ名やアスペクト名が指定した文言になっていることが確認できると思います。先のエントリのスナップショットと比較すると変化が分かりやすいと思います。




日本語表示を追加してみよう


英語でうまく表示できたら、次は日本語表示に進みます。方法としては以下のように2通りの方法があります。
  1. 先ほど設定したリソースを日本語の文言に置き換える
  2. 先ほどのリソースファイルとは別に日本語用のリソースファイルを用意する
Alfrescoの場合、ブラウザの言語設定によって表示言語が自動的に変更されます。例えばブラウザの言語設定を英語に変更すると、Alfrescoの表示が英語になるはずです。ここで改めて先ほどの2つの方法を見てみると、2.の方法はこの言語切り替えに対応する方法ということになります。もちろんどちらの方法を選択するかは要件によりますが、ここでは2.の方法を紹介したいと思います。

手順は簡単、以下の2ファイルを追加で用意するだけです。追加するファイル名は、既存のリソースファイル名に_jaを付けたものになります。これだけで日本語フランス語のリソースだったら_fr、イタリア語だったら_it、英語だったら_enという感じです。英語のリソースファイルも用意してあげれば、日本語/英語の両方に対応した表示が完成です。何もついてない元のリソースファイルはデフォルトの表示名ということになります。

<alf_dir>/tomcat/shared/classes/alfresco/messages/custom-model_ja.properties
custom_customModel.property.custom_reviewer.title=\u30ec\u30d3\u30e5\u30a2
custom_customModel.property.custom_reviewer.description=\u30ec\u30d3\u30e5\u30fc\u8005\u540d
custom_customModel.property.custom_reviewDate.title=\u30ec\u30d3\u30e5\u30fc\u65e5
custom_customModel.property.custom_reviewDate.description=\u30ec\u30d3\u30e5\u30fc\u65e5

<alf_dir>/tomcat/shared/classes/alfresco/messages/custom-share-messages_ja.properties
aspect.custom_reviewable=\u30ec\u30d3\u30e5\u30fc\u53ef\u80fd

ここでのポイントは、日本語の文言がUnicodeエンコーディングされている点です。JDKに付属するnative2ascii等を利用してエンコーディングする必要があります。もしくは、自動的にエンコーディングしてくれるようなEclipseプラグインを使ってpropertiesファイルを編集するなどの方法があります。

では、Alfrescoサーバを再起動して再度プロパティ名やアスペクト名を確認してみましょう。無事日本語の文言に変わっているはずです。



 
今回はextensionフォルダ側とweb-extensionフォルダ側から計2つのリソースファイルを参照しましたが、役割分担としては、extensionフォルダ側から参照するリソースファイルではカスタムモデルに関するものを、web-extensionフォルダ側から参照するリソースファイルではShare UI上のメッセージに関するものを指定します。


今回の説明は以上になりますが、基本的なメッセージリソースの追加方法はお分かりいただけたかと思います。メッセージの追加が必要になった場合は是非参考にしてください。