japan.internet.com The Internet & IT Network


RSSニュース検索
カテゴリ
> トップページ
> Webビジネス
> Eコマース
> Webファイナンス
> Webマーケティング
> パブリック
> Webテクノロジー
> 携帯・ワイヤレス
> Linux Today
> Linux Tutorial
> J.I.C.ブログ
キャリア
> 転職ならen
> 派遣ならen
> アルバイトならen
> IT求人情報
ヘッドライン
> 今日のヘッドライン
> 週間ヘッドライン
Special Link
> フォトコミュニティ
> ストックフォト
> クリップアート
> イラスト
> フェリカ
> Web2.0
> 写真
イベント&セミナー
> イベントカレンダー
> 書評「IT の耳」
> 出張・接待検索
> ニュースガジェット 注目
無料ニュースメール
> 新規登録
> 変更・解除
> オプトインメールの登録・変更・解除
インフォメーション
> パートナーサイト
転職ならエン
就職ならen
求人ならen
履歴書ならen
アルバイトならエン
CRM/SFAならオラクル
> グループ会社
株式会社アエリア
(株)サンゼロミニッツ
株式会社エアネット
> お問い合わせ
> 広告掲載について
> リンクについて
> 著作権について
> その他お問い合わせ
> 利用規約
> 個人情報保護方針
> 会社概要地図
デベロッパー 2007年8月28日 11:00
デベロッパー・バックナンバー
Eclipse RCPを好きなスクリプト言語で拡張する

著者: Riccardo Govoni  オリジナル版を読む プリンター用 記事を転送
2007年8月28日 11:00 付の記事
海外internet.com発の記事
このエントリーを含むはてなブックマーク この記事をクリップ! Buzzurlにブックマーク Yahoo!ブックマークに登録 newsing it!

はじめに

 Java Specification Request (JSR) 223は、Javaプラットフォームとスクリプト言語を連係させるための一連のAPIと関連フレームワークを定義します。このAPIは、Java SE 6に標準装備されている標準ライブラリの一部であるため、SE6 JVM上でアプリケーションを実行する場合にはスクリプトサポートを無償で受けられます。これは、Eclipseプラットフォーム上で構築されたアプリケーションにもあてはまります。

 JSR-223は、スクリプト言語とJavaプラットフォームとの間で行われるさまざまな対話を定義します。たとえば次のような対話があります。

  • インタプリタ型スクリプトをJavaアプリケーションに埋め込む
  • Javaオブジェクトをスクリプトコンテキスト内から変更およびコントロールする
  • Java言語を使用してスクリプトインタプリタを書き、公開する

 この記事では、Eclipseプラットフォームと、このプラットフォーム上で構築されるアプリケーションを、これらの新しいJava SE 6機能とスクリプト言語のメリットを利用して拡張する方法を紹介します。Eclipseプラットフォームをスクリプトで拡張する方法を覚えると、以下のことが可能になります。

  • 統合開発環境内でよく行う繰り返しの操作を自動化する
  • ユーザーインターフェイスとコントロールロジックの両方をその場で変更することにより、ユーザーインターフェイスのプロトタイプを短時間で作成する
  • アプリケーションユーザーが一般的な環境設定の域を超えてアプリケーションをカスタマイズできるようにする。たとえばユーザーがお気に入りのスクリプトまたはドメイン固有言語(DSL)にロジックを追加できるようにする

 これらの利点の多くは、スクリプト言語の性質に由来しています。スクリプト言語は、一般的には動的に型付けされ、場合によっては特定の問題分野に固有のものであることもあります。また、通常はコンパイラ型言語よりも読み書きが簡単で、JavaやCなどの古い言語のように「記述→コンパイル→実行」といったサイクルに縛られません。

前提条件

 この記事は、JSR-223に関する基本的な知識のみがあれば理解できます。実際のところ、理解しておく必要があるのは次のコードだけです。

Map vars =
    getScriptVariables(); // fictional method
String scriptBody = getScriptBody(); // fictional method
ScriptEngineManager sem = new ScriptEngineManager();
ScriptEngine engine = sem.getEngineByExtension("js");

for (String key : vars.keySet()) 
   engine.put(key, vars.get(key));

engine.eval(scriptBody); 
   // ScriptException handling code omitted

 このコードを実行すると、基本的には次の3つの処理が行われます。

  1. javax.script.ScriptEngineManagerを作成する(サポートされている拡張で検索)
  2. このjavax.script.ScriptEngineManagerは、スクリプトエンジンを見つけてインスタンス化します。スクリプトエンジンとは、スクリプトを評価して、効率よく実行するコンポーネントのことです。
  1. ScriptEngine.put(String,Object)メソッドで、一連のスクリプト変数を設定する
  2. これにより、Javaオブジェクトとスクリプト環境間のバインディングが定義され、このようなオブジェクトをスクリプトで処理できるようになります。一般的には、Java環境をスクリプトでコントロールできます。
  1. 指定されたスクリプトを、eval(String script)メソッドで評価する

 JVMは、Service Providerメカニズムを使って使用可能なエンジンを探します。このとき、アプリケーションで使用できるjarファイルのMETA-INF/サービスディレクトリをスキャンして、特定の構成ファイルを検索します。スクリプトエンジンをアプリケーションで使用できるようにするには、そのスクリプトエンジンを含む、正しく構成されたjarファイルをクラスパスに追加します。この記事では、dev.java.netのスクリプトプロジェクトで提供されているスクリプトエンジンのいくつか、たとえばRubyGroovyのエンジンを使用します。

 今回のサンプルではスクリプトAPIの使用をかなり抑えていますが、チュートリアルとしての目的は十分に果たしているのではないかと思います。詳細については、最後に紹介する参考資料を参照してください。

スクリプトプラグインとそのフラグメント

 この記事のサンプルコードでは、スクリプト言語とEclipse(補足説明1「EclipseのRich Client Platform」を参照。補足説明はこの記事の最後にあります)を、com.devx.scriptingプラグイン(補足説明2「Eclipseプラグインのしくみ」を参照)を介して接続しています。これにより、プラットフォームの他の部分が、スクリプトリソースと一連のプラグインフラグメントに共通アクセスできるようになります。図1で示すように、これは、アプリケーションがサポートするすべてのスクリプト言語に対応します。

図1 com.devx.scriptingプラグインアーキテクチャ
図1 com.devx.scriptingプラグインアーキテクチャ

 すべてのフラグメントは指定のインタプリタ(Ruby、JavaScript、AppleScriptなど)とそのJSR-223エンジンを提供しており、そのインタプリタをjavax.scriptスクリプトAPIを通じて公開します。インタプリタとJSR-223ラッパーは、セットにすることも、個別に開発して提供することもできます。

 このプラグインセットアップにはさまざまなメリットがあり、たとえば次のようなことが考えられます。

  • 分散フラグメントの数を制限し、プラットフォームに追加する言語を明確にコントロールできる。
  • ユーザーが必要なスクリプト言語のみを更新サイトから選択できるため、アプリケーションのインストールに伴う自分の作業を軽減できる。

 プラグインは次のようなIScriptインターフェイスを定義します。

public interface IScript {
   // @return the URI which points to the script code.
   public String getURI();
   // @return the script extension 
   public String getExtension();
   // @return a Reader which points to the script code
   public Reader getReader() throws IOException;
   // @return the script unique id
   public String getId();
   // @return the namespace (plug-in id) of the script
   public String getNamespace();
   // @return run the script in a modal context?
   public boolean isModal();
}

 スクリプトプラグインはcom.devx.scripting.ScriptSupportクラスを公開し、Eclipseプラットフォームで発生するスクリプト関連の一般的なニーズに対応するためにパブリックメソッドを定義します。一般的なニーズとしては、たとえば、進捗状況のモニタ(Eclipseでソースをコンパイルしているときに表示されるモニタなど)に照らしてスクリプトを実行する、ScriptEngineManagerに対してクエリを実行してサポート言語の一覧を取得する、などの処理が考えられます。次のコードは、クラスのパブリックインターフェイスの一部を示しています(実装についてはダウンロードサンプル中のソースコードを参照)。

public void runScript(final IScript script,
   Map params) throws ScriptException;
public List getSupportedLanguages();

外部スクリプトの実行

 これらの基本エレメントだけで、既にEclipseアプリケーション内でカスタムスクリプトを実行する手段を実現できます。たとえば、ユーザーがファイルシステムからスクリプトを選択し、プラットフォーム内で実行するためのEclipseアクションを提供できます。図2と図3は、これを実装した場合の画面例です。

図2 「Run Script」アクション
図2 「Run Script」アクション
図3 サポートされているすべての種類のスクリプトを選択できるファイルセレクタ
図3 サポートされているすべての種類のスクリプトを選択できるファイルセレクタ

 「Run Script」アクションは、ファイルセレクタを表示します。このファイルセレクタは、com.devx.scripting.ScriptSupportクラスに対してクエリを実行することで、使用可能なスクリプト言語のみをフィルタを使って抽出します。クエリを受け取ったcom.devx.scripting.ScriptSupportクラスは、javax.script.ScriptEngineManagerに対してサポート言語を要求します。最後に、javax.script.ScriptEngineManagerが、Service Providerメカニズムを使ってプラグインクラスパスとそのフラグメントをスキャンします。

 図のような結果を得るためには、org.eclipse.ui.actionSets拡張ポイントに対して拡張を定義する必要があります。この拡張ポイントは、リスト1のcom.devx.scripting.actions.RunScriptActionクラスによって実装されている、アプリケーションに対する追加メニューアクションを提供します。

 必要な作業はこれだけです。これで、アプリケーション内でRuby、Groovyなどのスクリプトを実行して、それぞれのスクリプトの性能や特性を利用することができます。たとえば、ワークスペースの一部で一括変更を行うスクリプトを作成したり、ビルドおよび配備プロセスの一部をスクリプト言語で書いて、必要に応じて開発者がプラットフォームから呼び出せるようにしたりできます。

リスト1 RunScriptActionクラス
public class RunScriptAction
   implements IWorkbenchWindowActionDelegate {

   // unneeded methods
   public void dispose() {}
   public void init(IWorkbenchWindow window) {}
   public void selectionChanged(IAction action,
      ISelection selection) {}

   public void run(IAction action) {
      FileDialog dlg = new FileDialog(
         PlatformUI.getWorkbench().getActiveWorkbenchWindow().
         getShell(), SWT.OPEN);

      List filterNames = new ArrayList();
      List filterExtensions = new ArrayList();
      ScriptSupport support = new ScriptSupport();
      for (ScriptSupport.Language l :
         support.getSupportedLanguages()) {
         filterNames.add(
            l.getName() + " (*." + l.getExtension().get(0) + ")");
         filterExtensions.add("*." +l.getExtension().get(0));
      }

      filterNames.add("All files (*.*)");
      filterExtensions.add("*.*");

      dlg.setFilterNames(
         filterNames.toArray(new String[filterNames.size()]));
      dlg.setFilterExtensions(
         filterExtensions.toArray(
            new String[filterExtensions.size()]));

      String f = dlg.open();
      if (f != null) {
         BufferedReader br = null;

         try {
            br = new BufferedReader(new FileReader(f));
            support.runScript(br, getExtension(f),null,true );
         }
         catch(IOException ioe) {
                // exception handling
         }
         catch(ScriptException se) {
            // exception handling
         }
         finally {
            if (br != null)
               try { br.close(); }
               catch(Exception ex) {}
         }
      }
   }

   private String getExtension(String f) {
      if (f.lastIndexOf(’.’) != -1) {
         return f.substring(f.lastIndexOf(’.’)+1);
      }
      else
         return f;
   }

}

プラットフォームでスクリプトコントリビューションを活用する

 これで、次の段階に進む準備ができました。今度は、スクリプト言語を使用してEclipseプラットフォームを直接操作して変更する方法、そしてスクリプトを使ってプラットフォームにコントリビューションを追加する方法を見ていきましょう。まずは、スクリプトコントリビューションとプラットフォームとの間を結ぶバインディングレイヤーの定義が必要です。このレイヤーには、以下のものが含まれます。

  • 標準のビューコントリビューションの代わりとなる、標準のEclipse拡張ポイントを模倣する拡張ポイント(scriptedViewなど)。スクリプトから返されるEclipseビューを提供するために必要。
  • org.eclipse.ui.part.ViewPartなどの標準Eclipseインターフェイスを実装し、メソッド呼び出しを基幹スクリプトに委任するプロキシクラス。
  • org.eclipse.ui.startup拡張ポイントへの拡張。スタートアップ時にスクリプトコントリビューションとプラットフォームとの間のすべてのプラミングとバインディングを行う。

 JavaScript実装に支えられているEclipseビューの例を見てみます。図4は、この例のサイクル全体を表しています。これを見ると、構成/スタートアップ時に実行されるアクションと、実行時に実行されるアクションの違いがわかります(Eclipseアクションセットなど、他の種類のコントリビューションについては、サンプルコードを参照してください)。

図4 スクリプトコントリビューションの処理サイクル
図4 スクリプトコントリビューションの処理サイクル

 まず、次のコードを使用して、スクリプトコントリビューションを定義します。

<plugin>
   <extension
      point="com.devx.scripting.scriptedContribution">
      <scriptedView
         allowMultiple="false"
         id="com.devx.scripting.jsCalculator
         name="JavaScript Calculator">
         <script
            extension="js"
            id="com.devx.scripting.jsCalculator.script"
            uri="scripts/jsCalculator.js">
         script>
      scriptedView>
   extension>
plugin>

 この拡張は標準のorg.eclipse.ui.viewsと非常によく似ています。唯一異なるのは追加のusers

★最新トップニュース
国内 Aucfan.com、Yahoo! ショッピング API 活用の「売れ筋アイテムランキング」を提供(E-コマース 7月25日 16:20)
株式会社オークファンは、2008年7月25日、ヤフー株式会社が運営する Yahoo! ショッピング Web サービスの「カテゴリランキング」を活用した新サービス「売れ筋アイテムランキング」の提供を開始したと発表した。
国内 au 携帯「W64SA」26日発売、カロリーカウンターなどを搭載画像のある記事(携帯・ワイヤレス 7月25日 16:00)
KDDI、沖縄セルラーは、2008年7月25日、au 携帯電話の新ラインアップとして“ヒカリ”の演出と、カロリーカウンターを搭載した“ビューティー・イルミ・ケータイ”「W64SA」(京セラ製)を26日に全国一斉発売すると発表した。
国内 Kabayaki のタイムインターメディア、オープンソースビジネス推進協議会に参加(LinuxToday 7月25日 16:00)
今後、本格的に OBCI の活動を支持する意向。同社は未来の主流プログラミング言語と言われる、Gauche や Haskell の普及活動も行っている。
国内 あの豪快な笑い声が着信音に―ドワンゴ、麻生太郎氏のボイスと待受画像を配信画像のある記事(E-コマース 7月25日 15:50)
株式会社ドワンゴは、2008年7月25日、同社が運営する「dwango.jp」各サイトにて、麻生太郎氏のボイスと待受画像を、株式会社 EDGE が運営するデコメアニメ配信サイト「花よりデコメ」では、麻生太郎氏のデコメアニメテンプレートを、それぞれ配信開始した。
国内 フリービット、中国向け事業で北京 BII と提携、事業子会社アドバイザーに出井氏と村井氏が就任予定(Webファイナンス 7月25日 15:40)
中国では、通信事業分野では外資規制があり、“次世代ネットワークサービス”を展開するには、中国国内企業にのみ与えられる各種ライセンスが必要。フリービットでは事業展開のパートナー企業として、BII を選択した。
トピックス
> オススメのIT系求人情報【毎週月曜日更新】
footer_301.gif


リサーチ
> デイリーリサーチDLサイト
> OnlineResearchPortal (リサーチデータバンク)
> モバイルリサーチ with goo
footer_301.gif
キーワード
> iPhone > Youtube
> Google > モバイルノート
> 半導体 > ウィルコム
> テーマ一覧はこちら
footer_301.gif
セミナー情報
> 第1回インターネットコムマーケティングセミナー「新規クライアントを効率的に獲得する Web マーケティング手法とは」(3月26日)多数のご参加ありがとうございました
footer_301.gif
デベロッパー
> DevX
> CodeGuru
> developer.com
footer_301.gif
日本Oracle
footer_301.gif
j.i.c.ブログ
ブログ一覧
デスマーチからの脱却 【デスマーチからの脱却】
独自ドメインでiPhoneのメール送受信(7月25日)
データメーション 【データメーション】
本物のスパム王様はお名乗り出ください(7月24日)
Graphic Design Forum 【Graphic Design Forum】
興味深い(?)90年代 (7月24日)
エンジニアの独り言 【エンジニアの独り言】
新入社員が配属される季節ですね。(7月23日)
ジュピターメディア創設者がITを斬る 【ジュピターメディア創設者がITを斬る】
Alan を探せ(7月18日)
ベンチャー専門家の目利きブログ「なぜこの企業は伸びるのか?」 【ベンチャー専門家の目利きブログ「なぜこの企業は伸びるのか?」】
「『訪問歯科診療』のパイオニア」/デンタルサポート株式会社(7月15日)
footer_301.gif
最新コラム一覧
CodeGuru CodeGuru

Visual C++ 2008 Feature Pack: MFCの強化 (2)(7月25日)
最新アフィリエイト事例にみる成功の法則 最新アフィリエイト事例にみる成功の法則

メディアのニーズ 〜アフィリエイトに対する思い〜(7月25日)
最新ハイテク講座 最新ハイテク講座

Blu-ray がノート PC でも快適に!インテル「Centrino 2」(7月25日)
百式のネットビジネス研究 百式のネットビジネス研究

究極にシンプルなタスク管理ツール「now do this」(7月25日)
週刊-サイト別アクセス状況データ 週刊-サイト別アクセス状況データ

ビデオリサーチインタラクティブ調査(月間インターネットオーディエンスデータ)(7月24日)
IT マネジメント IT マネジメント

Google Trends で見る IT のトレンド(7月24日)
ハードウェアから見たデータベース ハードウェアから見たデータベース

表計算ソフトの計算を支える仕組(7月24日)
「IT の耳」 「IT の耳」

【書評】ネットオークションで騙す。―全米を揺るがした絵画詐欺犯の告白―(7月24日)
検索エンジンマーケティング 検索エンジンマーケティング

ピンポイントマーケティングにおける P4P(検索連動型広告)の“当たり前”(7月24日)
Eメールマーケティング事情 Eメールマーケティング事情

大量送信のスパムからターゲット絞り込みスパムメールへ(7月23日)
footer_301.gif
専門チャンネル
> セキュリティチャネル > テレコムチャネル
> サーチエンジンウォッチ
footer_301.gif
海外のインターネットコム アメリカ韓国ドイツトルコ
関連企業のサイト:ストックフォト イラスト ネットストリート ホテル予約サイト タウン情報 出張 事業継承 シミュレーション トランクルーム 優待映画チケット 田舎暮らしガイド オリジナルデザインTシャツ ニタコエ
Copyright 2008 Jupitermedia Corporation All Rights Reserved. http://www.internet.com/
space.gif space.gif