-OSGi

3.0から登場したOSGiというものについてEclipseのソースを見ていたら、OSGi Allianceという団体があることがわかりました。みんな知ってた?知らなかったのは私だけではあるまい。
サイトに行って登録するとリソースがダウンロードできるのでさっそく登録-ダウンロード。600ページ超のPDFドキュメントほかいろいろ。なるほどね〜、ここにドキュメントがあるから、Eclipseのほうには無かったのか。まあ豆知識としては、OSGiはプラグインがどうとかというレベルのものでなく、デバイスやプロトコルに関わらず付加価値サービスが受け取れたり提供できたりというようなプラットホームのようです。
こいつでEclipseプラグインのうちガツンと変るのが設定周り。PreferencesのとこやPluginRegistryのところが軒並みdeplecatedね。。。試みに直してみたら結構すぐに直せる程度でした。さて、ところでこのOSGiですが見れば見るほど面白げです。プラグインがすぐ触るところに、BundleContextというのがあるのですが、このメソッドたくさんのうち、目を引いたのが以下の感じ。

  • registerService(String clazz, Object service, Dictionary properties)
  • getService(ServiceReference reference)
  • getBundle()
  • installBundle(String location, InputStream input)
  • addServiceListener(ServiceListener listener)
  • addBundleListener(BundleListener listener)

Bundleのほうは、やっぱりたくさんメソッドあるけど、目立つのは、

  • start()
  • stop()
  • install()
  • update()
  • loadClass(String name)

update()はまんま、バージョンアップデートのことをさしているみたい。

-Tapestryサービス(4)

サービスコンテキストとサービスパラメータを利用して、画面遷移間の情報送信がカスタマイズできることを説明しました。今日はケーススタディとして、サービスパラメータ付のPageLink/PageServiceを作ってみることにしましょう。同時に、Tapestryのページの状態保全についての考察も行っていきます。まず作成するのは、PageServiceのパラメータ付サービスである、ValuePageServiceと、そのサービスへのリンクをレンダリングするValuePageLinkコンポーネントです。実装自体はシンプルな内容です。サービスを作成するのに、AbstractServiceを継承すると、サービス実装に有用なユーティリティメソッドが用意されているので便利です。

サービスの実装-ValuePageService
package sample.valuepagelink;
import java.io.IOException;
import javax.servlet.ServletException;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.tapestry.IComponent;
import org.apache.tapestry.IPage;
import org.apache.tapestry.IRequestCycle;
import org.apache.tapestry.engine.AbstractService;
import org.apache.tapestry.engine.IEngineServiceView;
import org.apache.tapestry.engine.ILink;
import org.apache.tapestry.request.ResponseOutputStream;
public class ValuePageService extends AbstractService {
  public static final String SERVICE_NAME = "valuePage";
  public String getName() {
    return SERVICE_NAME;
  }
  public ILink getLink(IRequestCycle cycle, IComponent component, Object parameters) {
    String context = new String { (String)parameters[0], (String)parameters[1] };
    Object values = new Object { parameters[2] };
    return constructLink(cycle, SERVICE_NAME, context, values, true);
  }
  public void service(IEngineServiceView engine, IRequestCycle cycle,
      ResponseOutputStream output) throws ServletException, IOException {
    String context = getServiceContext(cycle.getRequestContext());
    Object[] parameters = getParameters(cycle);
    cycle.activate(context[0]);
    IPage page = cycle.getPage(context[0]);
    setPropertyValue(page, context[1], parameters[0]);
    engine.renderResponse(cycle, output);
  }
  private void setPropertyValue(IPage page, String name, Object value) {
    try {
      PropertyUtils.setProperty(page, name, value);
    } catch (Exception e) {
      throw new ServletException(e);
    }
  }
}

HTMLリンクが書かれるページにてgetLink()が用いられ、HTMLリンクのクリックによるリクエストに対応するのがservice()です。getLink()は以下のコンポーネントが描画されるときに用いられます。

サービスへのリンクコンポーネントの実装-valuePageLink
package sample.valuepagelink;
import org.apache.tapestry.IRequestCycle;
import org.apache.tapestry.engine.ILink;
import org.apache.tapestry.link.AbstractLinkComponent;
public abstract class ValuePageLink extends AbstractLinkComponent {
  public abstract String getTargetPage();
  public abstract String getPropertyName();
  public abstract Object getPropertyValue();
  public ILink getLink(IRequestCycle cycle) {
    Object[] parameter = new Object[3];
    parameter[0] = getTargetPage();
    parameter[1] = getPropertyName();
    parameter[2] = getPropertyValue();
    return getLink(cycle, ValuePageService.SERVICE_NAME, parameter);
  }
}

リンクコンポーネントはその中核の内容をサービスに委譲していますのでとても簡素なつくりとなります。こちらも、AbstractLinkComponentを継承することによって、リンク生成をサービス側に委譲するgetLink(IRequestCycle,String,Object[])メソッドが利用できます。

コンポーネントスペックXML-ValuePageLink.jwc
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE component-specification
      PUBLIC "-//Apache Software Foundation//Tapestry Specification 3.0//EN"
      "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">
<component-specification
    class="sample.valuepagelink.ValuePageLink"
    allow-body="yes" allow-informal-parameters="yes">
  <parameter name="page" type="java.lang.String" required="yes"
    property-name="targetPage" direction="in"/>
  <parameter name="name" type="java.lang.String" required="yes" 
    property-name="propertyName" direction="in"/>
  <parameter name="value" type="java.lang.Object" required="yes" 
    property-name="propertyValue" direction="in"/>
  <parameter name="disabled" type="boolean" direction="in"/>
  <parameter name="anchor" type="java.lang.String" direction="in"/>
  <parameter name="renderer" 
    type="org.apache.tapestry.link.ILinkRenderer" direction="in"/>
  <reserved-parameter name="href"/>
</component-specification>

さらには、アプリケーションスペックXMLにサービスを登録します。

各アプリケーションスペックXML(.application)に記述する内容
<service name="valuePage" class="sample.valuepagelink.ValuePageService"/>

この、<service>エレメントのname属性には、リンクやサービスで用いている文字列を登録します。すなわち、ValuePageService.SERVICE_NAMEの値、「valuePage」となります。では、続いてこのサービスとコンポーネントを用いたサンプルアプリケーションを示します。

-会社の環境

ということで(どういうこと?)、ノートPCの環境をEclipse新3.0系にしたので、Tapestryは会社のデスクトップPCのほうが快適なので会社に出てきました。徒歩で15分ぐらいなので本屋に寄りつつ到着。その昔はハード好きで何台もPC持っていたけど、今は会社の、その昔組み立てたデスクトップと家のDynabook SS S6だけなのです。いまは特にハードに食指は沸かないのだけど、ちょっと欲しいのがハードディスク搭載のポータブルオーディオ。開発プロジェクトをPC間移動するときに、もうメールじゃ無理だし。東芝のgigabeatをチェックしたのですが、一点、バッテリー継続時間が11時間にひっかかってます。iPODの8時間より長いのですが、あっちはPDA的な機能があるからね〜。今日の帰りに買うかマジに悩む。

-プラットホーム

さて、家に帰ってきて、戯れにEclipse3.0-I20040514をダウンロードしてきてプラグインのプロジェクトを開いてみました。うーむ、M8まであった2.1.xとの互換性が一部なくなり、いくらか修正が必要になりました。私のほうですぐに気がつく違いは、

  • Xercesのプラグインがどっかにいってしまった。JDKに入ってるCrimsonを使ってるのかな?
  • Pluginクラス周辺で多くのクラスやメソッドがdeplecatedに。新しいプラグインサービス環境のOSGiに対応するため。
  • 内部利用のクラスに、機能拡張の余波でコンストラクターの引数型やメソッドの戻値にリファクタリングが入ってる。

I20040514見る限りでは、M8のインターフェイスがまた磨かれた感じになりました。ウェルカム画面のデザインや、アイコンデザインなどが変ってます。とりあえず、作成中のプラグインの内部で使ってるクラスでリファクタされてしまったものがあるので、2.1.xと3.0を同一バイナリで対応できないかもしれません。というか、M8とI20040514の間に溝があります。deplecatedを無視すれば、ダメなクラスは一個だけなんで、当面は何とかなるでしょう。
OSGiに対応するとホットプラッガブルになるらしい(資料不足・未読了のためまだ良くわからない)。

-叙々苑

今日は昼に叙々苑で焼肉を食べました。家のすぐそばにあるので、たまに一人のときに行くのですが、ひさびさに入ってみるとランチが値上がりしている上に、肉がまずかったです。米国産牛の輸入が解禁がまたれます。前は1,200円(税抜)のランチで結構うまかったのに、今日は1,400円(税込)に値上がりしたランチでNG。これじゃしばらく行かないよ。叙々苑のサラダが好きなんだけど、サラダを食いには入らない。

-I20040514

Eclipseのサイトを見ていると、ここ数日、一日に3度や4度のインテグレーションビルドが出ていていよいよ3.0M9へのカウントダウンのようです。I20040514の最新を見ると、Windowsはテスト通過していて、残すところLinux/gtkの16件だからペースから見るとここ一両日かな。今使ってる3.0M8が文字コードの問題のほか、UIのライフサイクルバグを残していて長くつかってると不安定な感じなので、楽しみ。併せてGEFも本体のインテグレーションビルドにバージョンをあわせて活発に開発されているので、3.0M9とほぼ同時に対応したものが出るんじゃないかな。