ObjectSquare

[XMLとオブジェクト指向]


XMLとオブジェクト指向

連載第3回

XMLとコンポーネント技術(CCM,BML,JSP)


はじめに

前回は、オブジェクト指向とはあまり関係のない方向へ話がそれてしまいました。今回はなんとか建て直しを図って、JavaBeansやCORBAなどのコンポーネント技術とXMLの関係について考えていきます。

XMLは、文書管理やEC/EDIで注目を浴びていることから、XMLをシステムの対象データの記述形式として捕らえることが多いと思います。実際、多くのXMLアプリケーションは、垂直ドメインのデータを記述するための仕様となっていますし、これがXMLの使い方としては主流となるのでしょう。

しかし、アプリケーション開発者の立場からすれば、XMLで記述できるものは、他にもあるはずです。それが、今回のテーマであるコンポーネント技術です。これまではコンポーネントをつなぎ合わせるには、そのためのプログラムが不可欠でした。これを容易にするためにグラフィカルな開発環境を使うこともできますが、やはり最低限、Javaなどの開発言語の知識は欠かせません。

今回とりあげるのは、プログラミング言語を極力使わずに、XMLでアプリケーションを記述する方法です。CORBA3のCORBA Component Model、IBM Alpha Worksから提供されているBean Markup Language(BML)、Java Server Pages(JSP)のそれぞれのアプローチを見ていきます。

今回も原稿はXML + XSLで記述しています。IE5.0でごらんの方はこちらでもどうぞ。第2回第1回第0回の原稿もXMLで参照可能です。

CORBA Component Model (CCM)

CORBA Component Modelは、まもなくOMGから正式に発表されるCORBA 3.0で追加される機能の一つです。これまでのCORBAの仕様では、エンタープライズレベルの大規模アプリケーション構築にあたっては、トランザクションや永続化、イベントハンドリングなどの分散アーキテクチャとアプリケーションのビジネスロジックを、開発者がプログラムレベルで記述しなければなりませんでした。また、開発したアプリケーションの配布に関するモデルも規定されていませんでした。CCMは、このような問題に言及する、CORBAアプリケーション構築、配布のためのサーバーサイドのコンポーネントモデルです。また、CCMは、CORBAコンポーネントの定義、コード生成、パッケージング、アセンブリ、配布に関するOMAフレームワークの総称ともいうことができます。また、CCMはEnterprise Java Beans(EJB)とのインターオペラビリティを提供し、CCMからはEJBをCCMコンポーネントとして、逆にEJBからはCCMコンポーネントをEJBとして扱うことができるようになります。CCMに関する詳細は、OMGから公開されているドキュメントをぜひご覧ください。

CCMの仕様の中で、XMLが関わってくるのはコンポーネントパッケージングと呼ばれる部分です。CORBAコンポーネントパッケージは、1つ以上のコンポーネントの実装をまとめたものです。パッケージは、1つ以上のディスクリプタとファイルの集合です。ディスクリプタには、そのパッケージの特徴やファイルへのポインタを記述します。このディスクリプタに、XMLが利用されています。これはW3Cに提案されているOpen Software Description(OSD)の拡張だそうです。

ソフトウェアパッケージに関する情報は、ソフトウェアパッケージディスクリプタに記述されます。ここには、ソフトウェアに関する一般的情報のほか、ソフトウェアの実装に関する情報が記述されています。ソフトウェアパッケージは次のようになります。

<softpkg name="Bank" version="1,0,1,0"> 
  <pkgtype>CORBA Component</pkgtype> 
  <title>Bank</title> 
  <author> 
    <company>Acme Component Corp.</company> 
    <webpage href="https://www.acmecomponent.com/> 
  </author> 
  <description>Yet another bank example</description> 
  <license href="https://www.acmecomponent.com/license.html" /> 
  <idl id="IDL:M1/Bank:1.0" >
    <link href=”ftp://x/y/Bank.idl”/>
  </idl> 
  <propertyfile>
    <fileinarchive name="bankprops.cpf"/>
  </propertyfile> 

  <implementation id=”DCE:700dc518-0110-11ce-ac8f-0800090b5d3e”> 
    <os name="WinNT" version="4,0,0,0" /> 
    <os name="Win95" /> 
    <processor name="x86" /> 
    <compiler name="MyFavoriteCompiler" /> 
    <programminglanguage name="C++" /> 
    <dependency type=”ORB”>
      <name>ExORB</name>
    </dependency> 
    <descriptor type=”CORBA Component”> 
      <fileinarchive>processcontainer.ccd</fileinarchive> 
    </descriptor> 
    <code type=”DLL”> 
      <fileinarchive name="bank.dll"/> 
      <entrypoint>createBankHome</entrypoint> 
    </code> 
    <dependency type=”DLL”> 
      <localfile name="rwthr.dll"/> 
    </dependency> 
  </implementation> 

  <implementation> <!-- another implementation --> </implementation> 
</softpkg> 

これは、"Bank"というソフトウェアパッケージの記述例です。前半には、<title>や<author>などの情報が記され、その後、<implementation>タグを使用して、プラットフォームや開発言語などの実装情報が記述されています。詳細についての説明は省きますが、各要素名から記述内容についておおよその見当はつくのではないでしょうか。

XMLはCORBAコンポーネントディスクリプタでも利用されています。これは、設計および配布時に使用されるコンポーネント情報が記述されているもので、Component Implementation Definition Language(CIDL)コンパイラが生成するものです。上述のソフトウェアパッケージディスクリプタ内から、<descriptor type="CORBAComponent">で参照されます。コンポーネントディスクリプタには、大きく分けて、コンポーネントの機能に関する情報と、配布に関する情報が記述されます。コンポーネント機能に関する情報に含まれるのは、サポートするインタフェース、継承するコンポーネント、使用するポートなどです。一方、配布情報には、コンポーネントがインストールされるコンテナに関する情報が含まれます。

このようにCORBA3.0では、CCMというEJBに似たサーバー側のフレームワークで、CORBAコンポーネントおよびパッケージを記述するために、XMLを使用します。これらの情報は、さまざまな開発ツール、配布ツールで利用されることになるでしょう。これまで、CORBAは柔軟であるがゆえに、つねに複雑さがつきまとうという状態だったのですが、CCMの実装が出てくれば、アプリケーション開発や運用に関わる人の負荷は大幅に軽減されそうです。

蛇足ですが、OMGでは、XMLをCORBAを介してやりとりするためのXML Valueについても検討中です。これについては、別途扱いたいと考えています。

Bean Markup Language (BML)

Bean Markup Language (BML)はIBMのalphaWorksから提供されている、Java Beanを組み合わせてアプリケーションを記述するためのXMLアプリケーションです。IDGコミュニケーションズの雑誌Java Worldの99年10月号の特集でも紹介されたため、ご存知の方も多いのではないでしょうか?CCMのコンポーネントディスクリプタやパッケージディスクリプタは、コンポーネントやパッケージそのものに関する情報をXMLで記述していました。BMLでは、Bean間の関係、つまりアプリケーションの構造をXMLで記述します。

BMLで書かれたアプリケーションはBMLプレーヤと呼ばれるJavaアプリケーションに渡すと、BMLが解釈され、記述されたアプリケーションが動き出します。また、BMLコンパイラと呼ばれるツールによってJavaソースコードに変換することもできます。

BMLの例を示しておきます。これは、BMLのパッケージにサンプルとして含まれているものを少し短く編集したものです。簡単に説明すると、このBMLでは、java.awt.Frameのインスタンス(ID="topFrame")を生成し、その属性(title, backgroundなど)に値をセットし(<property>タグ)、フレームにいくつかのBeanを追加して(<add>タグ)、それらの間の関係を定義するというものです。イベントは<event-binding>を利用して、関連するオブジェクトの属性を設定したり、メソッドを呼び出したりします。

<?xml version="1.0"?> 
<bean class="java.awt.Frame" id="topFrame"> 
  <property name="title" value="IBM Juggler"/> 
  <property name="background" value="0xeeeeee"/> 
  <property name="layout"> 
    <bean class="java.awt.BorderLayout"/> 
  </property> 

  <add> 
    <bean class="demos.juggler.Juggler" id="Juggler"> 
      <property name="animationRate" value="110"/> 
      <call-method name="start"/> 
    </bean> 
    <string value="Center"/> 
  </add> 

  <add> 
    <bean class="java.awt.Panel"> 
      <add> 
        <bean class="java.awt.Button"> 
          <property name="label" value="Start"/> 
          <event-binding name="action"> 
            <script> 
              <call-method target="Juggler" name="start"/> 
            </script> 
          </event-binding> 
        </bean> 
      </add> 
    </bean> 
  </add> 

  <add> 
    <bean class="java.awt.Panel"> 
      <add> 
        <bean class="java.awt.TextField" id="currentRate"> 
          <property name="columns" value="5"/> 
          <property name="text"> 
            <property name="animationRate" target="Juggler"/> 
          </property> 
          <event-binding name="action"> 
            <script> 
              <property target="scale" name="value"> 
                <property target="currentRate" name="text"/> 
              </property> 
              <property target="Juggler" name="animationRate"> 
                <property target="currentRate" name="text"/> 
              </property> 
            </script> 
          </event-binding> 
        </bean> 
      </add> 
    </bean> 
    <string value="South"/> 
  </add> 

  <add> <!-- another Java Bean --> </add> 
</bean>

このように、Bean間の関係をXMLで記述します。このようにBeanを関連付けるだけでも、かなり立派なアプリケーションが書けそうです。将来は、内部のデータ形式をBMLでもつようなRADツールが出てくるかもしれません。また、このしくみをEJBにまで拡張していけば、アプリケーションサーバーの提供するような、アプリケーション配布やパーティショニング、分散トランザクションなども表現できるかもしれません。

Java Server Pages (JSP)

さて、もう一つSun Microsystemsが提供しているJava Server Pages(JSP)についても見ておきましょう。これは、HTMLの中に、JSPの特殊なタグを埋め込み、そのページが参照された段階でダイナミックにServletを生成し、ブラウザへの表示を行うという仕組みです。

これも例を見てみましょう。

<html> 
<body bgcolor="white"> 

<jsp:useBean id='clock' scope='page' class='dates.JspCalendar' type="dates.JspCalendar" /> 

<font size=4> 
<ul> 
  <li> Day of month: is <jsp:getProperty name="clock" property="dayOfMonth"/> 
  <li> Year: is <jsp:getProperty name="clock" property="year"/> 
  <li> Month: is <jsp:getProperty name="clock" property="month"/> 
  <li> Time: is <jsp:getProperty name="clock" property="time"/> 
  <li> Date: is <jsp:getProperty name="clock" property="date"/> 
  <li> Day: is <jsp:getProperty name="clock" property="day"/> 
</ul> 
</font> 
</body> 
</html> 

<jsp:useBean>で使用するJavaBeanを指定します。HTMLの中のjspネームスペースのタグはJavaBeanに対する呼び出しに置き換えられます。例えば、<jsp:getProperty>では、Beanに対して、属性名を指定して、その値を取得します。下の例では、dates.JspCalenderというBeanに対して、いくつかの属性を取得しています。

この他JSPには、<%と%>に囲まれた範囲にJavaコードを直接記述することもでき、柔軟なWWWページ作成を可能にしています。

このようにJSPはピュアなXMLを利用しているとはいえませんが、現在使われている特殊な記法<%, %>をXMLに適合させるのは難しいことではありませんから、将来は完全にXML化してくるのではないでしょうか。また、Javaコードを埋め込めるようにしたことで、BMLでは困難な複雑な処理も可能になります。もっとも、これは、使いやすさとの裏返しで、やはりJavaコードが埋め込まれたJSPは可読性や分かりやすさが下がってしまいます。

JSPはSunから提供されているJava Server Web Development Kit(JSWDK)に含まれています。余談になりますが、JSWDKに含まれるテスト用のJSP,Servlet対応Webサーバーのコンフィグレーション情報もXMLで記述されています。

最後に

今回は、XMLとコンポーネント技術をテーマに、CCM, BML, JSPを見てみました。CCMはCORBA3.0で導入されるCORBAコンポーネント、ソフトウェアパッケージに関する情報をXML形式で記述するというものでした。BMLはJava Beanの関係をXMLで記述し、Javaコードを書かずにアプリケーションの構造を定義するというものでした。JSPはServletを動的に生成するしくみで、出力されるHTMLに埋め込むデータを得るために、Java Beanを使用して、メソッドを呼び出すことができます。同時にJSPでは、Javaコードを記述することもできました。

それぞれのアプローチは異なっていますが、今や新しい技術には必ずXMLが関わってくるようになってきました。アプリケーションが対象とするデータから、アプリケーションそのものの定義まで、XMLで表現できないものはないのではないかというほどです。人類はついにXMLというシステムでデータを扱う際の標準語を手に入れたのかもしれません。

おば

© 1999 OGIS-RI Co., Ltd.

Prev.

Index

Next