-Seasar2.0.8
Seasar2.0.8がリリースされました。式言語がとうとうOGNLです。そして設定XMLの拡張子が.dicon。OGNLはドキュメントがあるのでSeasarで独自にマニュアル用意しなくてもOKですね。チュートリアル&S2DIへの招待&S2AOPの正体の、2.0.7対応をさぼってるうちに、2.0.8。。。
-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()はまんま、バージョンアップデートのことをさしているみたい。
-gigabeat G21
gigabeat G21、かっちゃおっかな〜。とりあえずビックカメラに見に行こう。
。。。ということで、買っちゃった。わーい。東芝らしく、ディテールに難はあるがDynabookと並べるとまさに一緒のデザインでうれしい。
-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に対応するとホットプラッガブルになるらしい(資料不足・未読了のためまだ良くわからない)。