ECF(Eclipse Communication Framework)入門

ECFを使ってコミュニケーション・ベースのアプリケーションを素早く作成する

ECF(Eclipse Communication Framework)は新しいEclipseプロジェクトであり、Eclipseプラットフォーム上でコミュニケーション・ベース・アプリケーションを作成するためのオープンソース・フレームワークです。ECFと、その基本機能、将来の方向性について学びましょう。

Chris Aniszczyk, Software Engineer, IBM

Chris AniszczykChris AniszczykはIBM Lotusのソフトウェア技術者であり、IBMのExtreme Blueインターンシップ・プログラムの卒業生でもあります。オープンソースの信奉者であり、現在はGentoo Linux (http://www.gentoo.org) ディストリビューションに取り組んでいます。またEMFT(Eclipse Modeling Framework Technology)プロジェクトのコミッターでもあります。



Borna Safabakhsh (borna@us.ibm.com), Software Engineer, IBM

Borna Safabakhshは、IBM Tivoli Securityソフトウェア・エンジニアであり、IBMのExtreme Blueインターンシップ・プログラムの卒業生でもあります。情報と技術の持つ問題解決力を信奉しており、今日の、そして明日の疑問に答えるための新しい手法やアプリケーションを追求しています。車が大好きであり、そして何でも速いものが大好きです。



2006年 3月 14日

背景

ECFプロジェクトの目標を非常に簡単に言うと、クロス・プロトコルのAPIを提供することです。ECFは、次のような4つのグループの人達にとって、大きな価値を持っています。

コミュニケーション・プロバイダー
対象者: Eclipseベースのアプリケーションやプラグイン用に、新規、あるいは既存のコミュニケーション・プロバイダー(YahooやAIMなど)を実装する、プラグイン開発者。
価値: インターオペラビリティーの実現。開発者のアプリケーションとユーザーのアプリケーションが、プロトコルをまたがって動作できるようになります。
コンポーネント開発者
対象者: 汎用のコンポーネント・レベル機能(ファイル共有やホワイトボード共有など)を実装する、プラグイン開発者。
価値: 再利用の実現。アプリケーション設計者は、プロバイダーの実装がECFをサポートしている限り、コンポーネントを再利用することができます。
ツール・インテグレーター
対象者: 新しい価値を追加するために既存アプリケーションとECF技術とを統合しようとする、プラグイン開発者。
価値: 機能の増加。開発者はECFによって、アプリケーションに新たな命を吹き込むことができます。
ユーザー・インターフェース(UI)設計者
対象者: ユーザー・インターフェースを構築、あるいは統合する、プラグイン開発者。ECFが提供するのは骨格部分のみなので、チャット・ルーム用やファイル共有用に独自のUIを追加することができます。
価値: 使いやすさ。設計時に、あるいは統合時にも、基礎となる実装とは独立にUIを改善し、カスタム化することができます。

ECFはこうした目標を、別のメッセージングAPIを提供するのではなく、高位レベルの抽象化を提供することで実現しようとしています。このような設計方式を採用しているため、様々なアプリケーション・コンテキストやUIの中で、高位レベルのコミュニケーション・コンポーネント(インスタント・メッセージング、ファイル共有、ビデオ会議など)を再利用できるようになっています。例えば、インスタント・メッセージングやブログ、BitTorrent、ファイル共有、音声会議などが必要なアプリケーションを開発することを考えてみてください。ECFを利用することによって、こうした各サービスに対するコミュニケーション・コード全般の開発が迅速になるため、ビジネス・ロジックやUIに集中できるようになるのです。


ECFをインストールする

ECFは次のような一連のEclipseプラグインとして、標準的なインストール・プロセスでインストールすることができます。

またECFプロジェクトでは、別のプロバイダーやアプリケーション例(IRCやJMSなど)を含んだサーバーもホストしています。


ECFの「目玉」

どんな記事でも、読者の興味を引くためには「目玉」が必要です。図1はECFのIRCプロバイダーの一例として、ECFのチャット・ルーム機能の一部を示しています。図2は、2つのメッセージング接続でのメンバーリストを示すビューの一例です。

図1.ECFのIRCプロバイダー
ECFのIRCプロバイダー
図2.メンバーリストを示すビュー
メンバーリストを示すビュー

これで、ECFがどのように見えるかが分かったので、今度は詳細に入りましょう。


ECFアダプター

ECFの動作を理解するための最初のステップは、そのAPI、特にアダプターを見ることです。ECFでの基本的な構成ブロックは、IContainerというインスタンスのコミュニケーション・コンテナーです。IContainerインスタンスは、ECF内でのコミュニケーション用の共通インターフェースであり、コミュニケーション・コンテキスト(クライアント/サーバー・モデルであれパブリッシュ/サブスクライブ・モデルであれ)のインスタンスを表現します。

IContainerはECF内の重要なインターフェースですが、これがおなじみのEclipse IAdaptableインターフェースを通して拡張できるという点は、決定的に重要です。ECFコンテナーはIAdaptableであることによってランタイム拡張性をサポートしているため、ランタイム・インスタンスに対してその機能をクエリーし、そうした機能を利用することができます。ECFのコンテキストでの機能の例としては、プレゼンス/チャット、チャット・ルームなどがあります。下記の表は、ECFが備えている一般的な機能のリストです。

ECFの一般機能
IPresenceContainerプレゼンス・メッセージ(在、不在など)、テキスト・メッセージ、サブスクリプション・リクエストなどに関してリスナーを設定するための機能を公開します。このインターフェースの実装の例としては、チャット・メッセージング・プロトコル(YahooやAIM、Gadu Gaduなど)があります。
ISharedObjectContainer任意情報を自在に渡せる機能により、任意のコミュニケーション・プロトコルが構築できる機能を公開します。
IDiscoveryContainer(コンピューターやデバイス、IPネットワーク上のサービスなどに対する)ルックアップや発見の機構をサポートする機能を公開します。Appleの Bonjour は、このアダプターの実装の好例です。
IChatRoomManagerECF内でのチャット・ルームをサポートする機能を公開します。このインターフェースの実装例としては、チャット・ルームをサポートするプロトコルがあります。(YahooやXMPP、IRCなど)

ECFが成熟するにつれ、こうしたアダプターは洗練され、また新しいアダプターも追加されるでしょう。


ECFの例

一例として、コミュニケーション・プロバイダー、具体的にはYahoo!のメッセージング・プロトコル(YMSG)でのコミュニケーション・プロバイダーを演じてみましょう。ここでは、このプロトコルのオープンソース実装(jYMSG)を使います。この記事には、ECFプレゼンス・コンテナー(IPresenceContainer)を使った、YMSGプロトコルの基本ECF実装が含まれています。これを実装するための手順の概要を説明します。また最終的なコードはダウンロードすることができます。(このコードは、恐らくECFプロジェクトに寄贈されるはずです。)YMSG用のプレゼンス・コンテナーを実装するための手順は次の通りです。

  1. Namespaceを定義し、登録する
  2. IDを実装する
  3. Containerを実装する
  4. ContainerInstantiatorを定義し、登録する
  5. IPresenceContainerをYahoo流に実装する

名前空間とID

名前空間は、ECFのIDFactoryを通して新しいIDインスタンスを作成することに責任を持ちます。名前空間は、このファクトリーを通して作られるIDインスタンスのタイプを制限する権限を持っています。私達のYahooNamespace実装では、単純にID作成用のユーザー名のみを要求するようにしています。

リスト1.YahooNamespace.java
public class YahooNamespace extends Namespace {
...
	public ID createInstance(Class[] argTypes, Object[] args) \
	throws IDInstantiationException {
		try {
			return new YahooID(this, (String) args[0]);
		} catch (Exception e) {
			throw new IDInstantiationException\
			("Yahoo ID creation exception", e);
		}
	}
}

また、ECFに分かるように、適切に名前空間を登録する必要があります。これは、org.eclipse.ecf.namespaceエクステンション・ポイントを使って実現します。

リスト2.plugin.xml
   <extension
         point="org.eclipse.ecf.namespace">
      <namespace
            class="org.eclipse.ecf.provider.yahoo.identity.YahooNamespace"
            description="Yahoo Namespace"
            name="ecf.yahoo"/>
   </extension>

名前空間を作成したら、Yahoo! 名前空間の中で1つの実体を固有識別するための、YahooIDというIDを作成します(ダウンロードを見てください)。

コンテナー

この場合、つまりコネクション指向のクライアント/サーバー・シナリオでは、ECFコンテナーはコミュニケーション・セッションの概念を表します。IContainerインターフェースを実装し、YahooContainerを、IPresenceContainerインターフェースに合うようにします。リスト3を見ると、この重要なメソッドが一目で分かるでしょう。

リスト3.YahooContainer.java
public class YahooContainer implements IContainer {
...
private Session session; // jYMSG session
...
	public void connect(ID targetID, IConnectContext connectContext)
		throws ContainerConnectException {
		String password = getPassword(connectContext);
		this.targetID = (YahooID) targetID;
		try {
			// login to yahoo messaging
			session.login(this.targetID.getUsername(), password); 
		}
...
		// listen to yahoo messaging events
		session.addSessionListener(new YahooSessionListener(presenceContainer));
		// notify ECF we joined
		presenceContainer.fireContainerJoined(getConnectedID());
	}
...
	public Object getAdapter(Class serviceType) {
		if (serviceType.equals(IPresenceContainer.class)) {
			return presenceContainer;
		}
		return Platform.getAdapterManager().getAdapter(this, serviceType);
	}
...

上記のコードでは、Yahoo!メッセージング・サーバーに接続し、接続が成功したことをECFに通知します。また、getAdapterメソッドの中で、IPresenceContainerインターフェースに合わせていることに注意してください。

コンテナー・インスタンシエーター(Container instantiators)

コンテナー・インスタンシエーターは、(皆さんご想像の通り)ECFコンテナーの作成に責任を持つ単純なクラスです。コンテナー・インスタンシエーターであるためには、IContainerInstantiatorインターフェースを実装する必要があります。私達が使用した、単純なYahooConstainerInstatiatorを見てください(リスト4)。ほとんど中身はありません。

リスト4.YahooContainerInstantiator.java
public class YahooContainerInstantiator implements IContainerInstantiator {
	
	public IContainer createInstance(
	ContainerDescription description, 
	Class[] argTypes, 
	Object[] args) throws ContainerInstantiationException {
		ID guid;
		try {
			guid = IDFactory.getDefault().createGUID();
		} catch (IDInstantiationException e) {
			throw new ContainerInstantiationException\
			("Exception creating ID",e);
		}
		return new YahooContainer(guid);
	}
	
}

IPresenceContainer

YahooPresenceContainerは、私達の持っている武器の中で、最も強力なクラスです。単純にするために、幾つかのメソッドのみに注目することにします。リスト5を見てください。

リスト5.YahooPresenceContainer.java
public class YahooPresenceContainer implements IPresenceContainer {
...
	public IMessageSender getMessageSender() {
		return new IMessageSender() {
			public void sendMessage(
					ID fromID, 
					ID toID, 
					Type type, 
					String subject,
					String messageBody) {
				try {
					session.sendMessage\
					(toID.getName(), messageBody);
				} catch (IllegalStateException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		};
	}

	public void handleMessageReceived(SessionEvent event) {
		for(int i = 0; i < messageListeners.size(); i++) {
			IMessageListener l = (IMessageListener) messageListeners.get(i);
			ID from = makeIDFromName(event.getFrom());
			ID to = makeIDFromName(event.getTo());
			l.handleMessage(
					from, 
					to, 
					IMessageListener.Type.NORMAL, 
					event.getFrom(), 
					event.getMessage());
		}
	}
...
}

ユーザーにメッセージを送るためにgetMessageSenderメソッドを実装していることに注意してください。この場合では、Yahoo Sessionを使い、適当なメッセージを送っています。また、handleMessageReceivedというヘルパー・メソッドがあることにも注意してください。このメソッドは、Yohooユーザーからメッセージを受信した場合に、私達のプレゼンス・コンテナーについてIMessageListenersに通知することに責任を持っています。

YahooPresenceContainerには他にも必要なメソッドがありますが、単純にするために意図的にヌルにしてあります(あるいはjYMSG APIによって制限されています)。こうしたメソッドには、次のようなものがあります。

  • getAccountManager: アカウント管理(パスワード変更やアカウント作成)のためのアクションに責任を持ちます。
  • getPresenceSender: 関心を持っている人達に対してプレゼンスの更新(在/不在、メンバー追加など)を通知することに責任を持ちます。
  • getChatRoomManager: チャット・ルームの管理に責任を持ちます(例えば、Yahooチャット・ロビーなど)。

皆さんには練習として、getChatRoomManagerメソッドを使ってチャット・ルーム・サポートを実装してみることをお勧めします。

すべてが実装できたら、このプロバイダーの機能をテストするために、ECFが提供している機構(図3)を単純に使って、このプロバイダーを実行し、選択します。

図3.ECF Yahooプロバイダー
ECF Yahoo プロバイダー

まとめ

共同コンピューティング(collaborative computing)が台頭しつつあり、VoIPやビデオ会議も間もなく身近になるため、ECFの将来は明るいと言えます。また、Eclipse Foundationが、コミッター・サポートを強化するための協調ツールとして、ECFを使うという話もあります。

ここではECFを簡単に解説し、ECFが提供する様々な機能のうちの1つを紹介しました。皆さんもECFの使い方を数多く見つけ、このプロジェクトに貢献してくださることを期待しています。

謝辞

この記事の執筆に協力くださったScott LewisとECFチームに対して感謝致します。


ダウンロード

内容ファイル名サイズ
Yahoo ECF Provider os-ecl-commfwk_org.eclipse.ecf.provider.yahoo.zip142KB

参考文献

学ぶために

  • Eclipse Communication Frameworkについて学んでください。
  • Eclipse Foundationについて、そして、そこで行われている数多くのプロジェクトについて学んでください。
  • developerWorksのEclipse project resourcesを利用して、Eclipseについて学んでください。
  • developerWorks technical events and webcastsを利用して、最新技術を学んでください。
  • developerWorksのOpen sourceゾーンをご覧ください。オープンソース技術を使った開発や、IBM製品でオープンソース技術を使用するためのハウ・ツー情報やツール、プロジェクトの更新情報など、豊富な情報が用意されています。

製品や技術を入手するために

  • 皆さんの次期オープンソース開発プロジェクトを、IBM trial softwareを使って構築してください。ダウンロードで、あるいはDVDで入手することができます。

議論するために

  • Eclipse.org ECF mailing listsを調べて、開発に参加してください。
  • Eclipse.org ECF Newsgroupを利用してください。(Usenetニュースグループ・リーダーを正しく設定してあれば、このリンクをクリックするとリーダーが起動します。)
  • Eclipse newsgroupには、Eclipseを利用し拡張することに興味を持つ人達のために、豊富な資料が用意されています。
  • developerWorks blogsからdeveloperWorksコミュニティーに加わってください。

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Open source, Java technology
ArticleID=236844
ArticleTitle=ECF(Eclipse Communication Framework)入門
publish-date=03142006