Python Web サービス開発者: 第 2 回: Web サービス ソフトウェア・リポジトリー 第 1 回

これは、Python プログラミング言語を使って Web サービス上に構築されるソフトウェア・リポジトリー・システムの作成についての短いシリーズの最初のものです。Python で 4Suite オープン・ソース XML サーバーを使うことによって Web サービス ベースのアプリケーションを作成する方法を、Mike Olson 氏が詳しく説明します。

Mike OlsonFourthought, Inc.

Mike Olson 氏は、企業向けの知識管理アプリケーションのための XML ソリューションを専門とするソフトウェア・ベンダーおよびコンサルタント会社である、Fourthought Inc. のコンサルタントであり、共同設立者です。Fourthoughtは、XML ミドルウェア用のオープン・ソース・プラットフォームである 4Suite を開発しています。



Uche Ogbuji, Principal Consultant, Fourthought, Inc.

Uche OgbujiUche Ogbuji 氏は、Fourthought, Inc. のコンサルタント兼共同設立者です。この会社は、企業のナレッジ・マネジメントのための XML ソリューションを専門とするソフトウェア・ベンダー兼コンサルタント会社です。Fourthought では、XML、RDF、およびナレッジ・マネジメント・アプリケーション用のオープン・ソース・プラットフォームである 4Suite を開発しています。Ogbuji 氏は、ナイジェリア出身のコンピューター・エンジニア兼ライターで、現在は、米国コロラド州ボールダーに住み、そこで働いています。



2001年 3月

Python Web サービス開発者: 第 1 回のコラムでは、たくさんのコードを掲載することを約束しました。しかし残念ながら、すぐに使用可能な Python を使い、そして Python で使用可能な数多くのサード・パーティーのアプリケーションを使って Web サービスの開発をする場合、ほとんどコーディングをしなくてよい場合がよくあります。今月のコラムは、まさにそれに当たりますが 1 つのオンライン情報ディレクトリーを用意しました。そのディレクトリーは、いくつかのソフトウェア・パッケージをダウンロードできるようにするために用意されたものです。そこでは、ソフトウェア・パッケージについてのデータおよびメタデータのリアルタイム更新、パッケージに関するメタデータの検索、そしてもちろん、パッケージ自体のダウンロードがサポートされています。

この記事を読み進めるには、このコラムで扱ういくつかのテクノロジーについて基本的な理解が必要です。その中には、Extensible Stylesheet Language Transformations (XSLT)、XML Path Language (XPath)、および Resource Description Framework (RDF) が含まれます。参考文献のセクションに、それらのすべてのテクノロジーについての情報へのリンクがあります。

4Suite Server の概要

XML リポジトリーである 4Suite Server™ (4SS) は、このコラムの 2 人の筆者が共同で開発したものです。それは、ここで使用する例の基礎となるアプリケーションとして使用されます。4Suite Server™ は、XML データおよびメタデータを管理するためのたくさんの機能が含まれている XML リポジトリーであり、Python かどうかを問わず Web サービスの開発を短期間で行うのに非常に適しています。

この記事で使う例は 4Suite Server™ 0.10.2 を使用したものであり、Python 1.5.2 以上、および 4Suite™ 0.10.2 が必要です。それらのアプリケーションすべてをダウンロードするためのリンクが参考文献のセクションにあります。

オンライン・ソフトウェア・リポジトリー

この記事は「Python Web サービス開発者」コラムの第 2 回ですが、これは 3 回に及ぶオンライン・ソフトウェア・リポジトリー構築の第 1 回目です。今回は、まずそのためのインフラストラクチャーを構築します。残りの 2 回のコラムでは、索引付きコンテンツの検索や、Simple Object Access Protocol (SOAP)、HTTP、および WWW Distributed Authoring and Versioning (WebDAV) などのさまざまなプロトコルを使ってコンテンツの追加や検索をエージェント・ベースで実行する機能をフィーチャーします。

そのオンライン・ソフトウェア・リポジトリー・サービスのスキーマは、大まかではありますが RPMFind.net の RDF スキーマに基づくものです。RPMFind は、よく知られた Red Hat Package Manager (RPM) 形式での UNIX および Linux ソフトウェアのカタログ・パッケージのためのシステムです。それには、ソフトウェア・パッケージについてのキー・メタデータが含まれており、作成者、バージョン、および記述情報が RDF 形式で含まれています (リスト 1 を参照)。RDF とは何かについては、このコラムの第 1 回をご覧ください。また、参考文献のセクションには、このシンプルな形式についての基礎知識の説明へのリンクがあります。

XML の実際の形式がどうであるかは、あまり問題ではありません。実際、ソフトウェアを記述したものである必要さえないのです。述べられている手法は、どんな XML コンテンツについてもうまく動作します。この手法を使うことによって、本のカタログ、従業員情報、さらにはワインの一覧表さえ記述できます。

この例で使用されるすべてのコードおよびデータ・ファイルは、参考文献のセクションにあるリンクからダウンロードできます。

文書定義

4Suite Server の MetaXML サーバーにおいて、文書定義は XML コンテンツと RDF メタデータの間のマッピングを指定するためのものです。それには、3 種類の XPath 式 (サブジェクト式、述部式、オブジェクト式) からなる集合を定義する必要があります。1 つの XPath 式では、その文書の中でのノードの関係の集まりを定義し、文書のコンテンツのうち、それらの関係に基づくサブセットを戻します。リポジトリー中の XML 文書が追加、修正、および削除されると、その各 XML ごとにそれらの XPath 式が評価されます。その結果のステートメント (トリプル) は、自動的に RDF サーバーに追加されたり、そこから削除されたりします。文書が変更された場合は、その変更を反映するようにトリプルが変更されます。また、文書が削除された場合、トリプルは RDF サーバーから削除されます。文書定義は、他の文書定義から情報を継承できるため、XML コンテンツと RDF メタデータ情報の間の複雑なマッピングも定義できます。

ここで使用するサンプル・アプリケーションでは、デフォルト文書定義の 1 つを拡張します。デフォルト文書定義は、XML コンテンツの中に埋め込まれた Dublin Core タグと、Dublin Core ステートメントとの間のマッピングを定義したものです。Dublin Core というのは、CreatorTitle、および Date など、Web ベースの一般的なオブジェクトの標準のプロパティーの集まりを定義するメタデータ・イニシアティブです。ここで使用する文書定義は、それから派生したものであり、各文書ごとに 1 つずつステートメントを追加しています。

下記の例に示す簡単な宣言は、この文書が特定のタイプのものであることを示しています。

RdfStatement(subject='$uri',
  predicate="http://purl.org/dc/elements/1.1#Title",
  object="/rdf:RDF/s:Software/dc:Creator")

(上記のコードは本来 1 行のステートメントですが、便宜上、字下げして掲載しています。)

システム・デフォルト・データを追加または更新するには、4Suite Server に付属のスクリプト populate.py を実行する必要があります。このスクリプトは、私たちのサイト ftp://ftp.fourthought.com からサーバー更新用データをダウンロードします。ダウンロードされるデータには、Dublin Core 文書定義や Docbook スタイル・シートなど、よく使われるものが含まれています (Docbook は技術文書用に広く使われている XML 形式の 1 つ)。

このデータ取り込み用スクリプトは、4Suite Server のインストール時に自動的にデモ・アプリケーションの中にインストールされます。UNIX ベースのマシンでは、一般に /usr/doc/4SuiteServer-0.10.2 または /usr/local/doc/4SuiteServer-0.10.2 に入れられます。Windows マシンの場合、一般にそれらのディレクトリーは c:¥Program Files¥Python または c:¥Python20 です。4Suite Server ベースのアプリケーションにデータを取り込むためのインストール手順をリスト 2 に示します。

リスト 2: 4Suite Server アプリケーションにデータを取り込む
[molson@penny example]$ python /usr/doc/4SuiteServer-0.11/demo/populate.py
Downloading XML Documents
Downloading Stylesheets
Downloading DocDefs
Adding XML document: 'null'
Adding stylesheet: 'docbook_html1.xslt'
Adding stylesheet: 'presentation_toc.xslt'
Adding stylesheet: 'presentation.xslt'
Adding stylesheet: 'docbook_text1.xslt'
Adding document definition: 'dublin_core'
Adding document definition: 'docbook1'

次に、ソフトウェア・エントリー・リストのための文書定義を作成する必要があります。定義を追加するには、コマンド・ライン・スクリプト 4ss_create_document_definition を使い、その唯一のパラメーターとして、シリアル化した文書定義のファイル名をそれに渡します。たとえば、

[molson@penny example]$ 4ss_create_document_definition software.docdef

コンテンツ

コマンド・ラインから新しいコンテンツをシステムに追加するために、4ss_create_resource を使います。ダウンロードされるサンプルには、XML ファイルである 2 つのソフトウェア・リスト、software1.rdf および software2.rdf が含まれています。これらのファイルをシステムに追加するため、4ss_create_resource を実行し、追加するファイル名と、システム内でそのリソースに割り当てる別名のリストとを指定します。

新しいリソースがサーバーに追加されると、1 つのサーバー生成の汎用固有 ID (UUID) がそれに割り当てられます。これは、読みやすいものではないので、それに対してユニフォーム・リソース ID (URI) の形で別名を割り当てることにより、リポジトリー内のそのリソースを簡単に参照できるようにします。ここでは、別名としてソフトウェア・リストにアクセスするために使う URL を使います。XML ファイルを追加する場合には、--docdef オプションを使うことにより、文書定義を使ってそれらの文書を追加することを指定します (リスト 3 を参照)。

次に、サンプル・ダウンロード・ファイルをリポジトリーにも追加します。4Suite Server リポジトリーは、ほとんどあらゆる形式のデータを格納できますが、特に XML データを格納する点で高度に最適化されています。この例で使用する.tar ファイルをリポジトリーに追加するような場合には、-f オプションとそのファイルの MIME タイプを指定することによって、その内容が XML ベースでないことをサーバーに通知します (リスト 3 を参照)。

コンテンツの取り出し

コンテンツの取り出しは、追加と同じようにとても簡単です。しかし、まずリポジトリーにスタイル・シートを追加する必要があります。この例で使用するファイルには、非常にシンプルなものが含まれています。それを追加するには、4ss_create_resource を使い、それに software.xslt という別名を付けます。たとえば、

[molson@penny example]$ 4ss_create_resource -x software.xslt software.xslt

-x オプションは、4Suite Server に対して、この文書を XSLT スタイル・シートとして最適化するように指示するためのものです。

文書を追加したなら、Web ブラウザーを使って 4Suite Server HTTP Listener に接続し、http://localhost:8080/pong.xml のページに移動します。これで、リポジトリーから pong ソフトウェア定義文書が取り出されます。Internet Explorer や Mozilla など、MIME タイプ text/xml を認識するブラウザーを使用しているなら、リポジトリーに追加された XML を表示させることができます。そのページを戻す前にレンダリングするよう HTTP Listener に対して指示するには、http://localhost/pong.xml?xslt=software.xslt のように URI 照会引数を指定します。

パッケージ・ダウンロード用のページにあるリンクも localhost を指していることに注意してください。このリンクも HTTP Listener を通り、pong-0.0.2.tgz のために追加したリソースを取り出します。それがブラウザーに戻される時には、リソースをシステムに追加した時点で定義した MIME タイプが指定されています。


インデックス・ページの生成

インデックス・ページを生成するには、XSLT が RDF サーバーにアクセスできるようにするため、4Suite Server の拡張関数をいくつか使うことになります。4Suite Server でのインデックス・ページ生成の問題には、それ以外にもいくつかの解決方法があります。そのうちの 1 つは、index.html が要求された場合に RDF サーバーを照会するための 4Suite Server HTTP Listener 用カスタム GET HTTP ハンドラーを作成することです。別の解決方法としては、4Suite Server イベント・システムを使用することにより、新しい文書がシステムに追加されたり文書がシステムから削除されたりした場合に index.html 文書が更新されるようにする方法もあります。

XSLT は常にソース文書に対して適用されなければならないため、ここではダミー・ソース文書をシステムに追加することにします。サンプル・ダウンロードの中には、index.doc というソース文書が含まれています。下記のように 4ss_create_resource を使うことによって、それをリポジトリーに追加します。

[molson@penny example]$ 4ss_create_resource index.doc index.doc

システム内のすべてのソフトウェアに関する情報を収集するため、スタイル・シートの中で rdfserver.complete という拡張関数を使います。この拡張関数は、RDF サーバー上の complete メソッドを呼び出します。complete メソッドは、RDF モデルの中から、指定したパターンに一致するステートメントを検索します。それにはサブジェクト (subject)、述部 (predicate)、オブジェクト (object) の 3 つのパラメーターがあり、object はオプションです。各パラメーターには空ストリングも指定できます。そして、指定した値のすべてに一致するステートメントのリストが戻されます。たとえば、subjectfooobjectbar を指定した場合は、subjectfoopredicate は任意、objectbar であるステートメントのリストが戻されます。

どの XML 文書についても、それがソフトウェア・リスト文書定義にリンクしているなら、それに対して一連の RDF ステートメントが生成されることになります。XML 文書のステートメントのうちの 1 つは、述部 (predicate) が http://www.w3.org/1999/02/22-rdf-syntax-ns#type、オブジェクト (object) が http://localhost/document というものです。そこで、述部とオブジェクトを指定した単純な complete を使用することにより、システム内のソフトウェア文書のリストを入手します。

この例で使用するスタイル・シートは index.xslt です。ソース文書のルートに一致するテンプレートには、rdfserver.complete の最初の出現箇所が含まれています。この関数呼び出しは、RDF サーバーにおいて、述部が http://www.w3.org/1999/02/22-rdf-syntax-ns#type、オブジェクトが http://localhost/document であるステートメントすべてに対して complete 操作を実行します。rdfserver.complete 関数呼び出しの結果は、Statement 要素のノード・セットです。各 Statement 要素には、それぞれ 3 つの子、つまり SubjectPredicate、および Object があります。関数の結果に対して xsl:apply-templates を使用し、テンプレートのうちStatement に一致する各ソフトウェア項目を表示させます (リスト 4)。

生成されるインデックス・ページを表示するには、ブラウザーにアドレスとして http://localhost:8080/index.doc?xslt=index.xslt を指定します。

このインデックスは検索用に設計されたものではありません。しかし、何らかの方法でソフトウェア・タイトルを表示するよう、この簡単なページを拡張する方法は容易にわかります。各項目の表示方法はスタイル・シートで変更できます。また、スタイル・シートで使用できるデータは、文書定義にマッピングを追加することによって調整できます。


結論

ここまでで Python コードはまだ 1 つも書いていませんが、4Suite Server の機能のいくらかを垣間見ることができました。来月のコラムでは、ここに示した例をさらに拡張して、このソフトウェア・リポジトリーに、コンテンツ・マネージメント機能や生成するメタデータのすべてを検索する機能を持たせるようにする予定です。

参考文献

コメント

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=SOA and web services
ArticleID=241875
ArticleTitle=Python Web サービス開発者: 第 2 回: Web サービス ソフトウェア・リポジトリー 第 1 回
publish-date=032001