Diary?

2008-05-08
Thu

(20:02)

仕事で ASF の連中が作ってる OFBiz とかいうオープンソース ERP を弄っていて、とうとう我慢ならなくなったのでここでも書くことにした。ちなみにこれは知ってる人の方が確実にマイノリティだと断言できる程度の知名度しかない。

まずはこの OFBiz のアーキテクチャの特徴だが、こいつを使うには最低でも以下の言語を使いこなす必要がある。

  • Java
  • FreeMarker テンプレート
  • BeanShell
  • プレゼンテーション管理 XML スクリプト
  • メニュー管理用 XML スクリプト
  • サービス定義用 XML スクリプト
  • ミニ言語用 XML スクリプト
  • その他大量の設定ファイル

どうだ、舐めてるだろう? 今回はその中でも「ミニ言語用 XML スクリプト」について。まずは適当なサンプルを。

<simple-methods xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/simple-methods.xsd">
  <simple-method method-name="sampleMethod" short-description="sample method">
    <set field="foo" from-field="parameters.foo"/>
    <set field="bar" from-field="parameters.bar"/>
    <if>
      <condition>
        <and>
          <not>
            <if-empty field-name="foo"/>
          </not>
          <not>
            <if-empty field-name="bar"/>
          </not>
        </and>
      </condition>
      <then>
        <call-class-method class-name="SomeClass" method-name="fungaaa" ret-field-name="ret"/>
        <call-simple-method method-name="sampleMethod2">
          <result-to-field result-name="hage" field-name="x"/>
        </call-service>
        <entity-condition entity-name="TBL" use-cache="false" list-name="tblList">
          <condition-list combine="and">
                <condition-expr field-name="abc" operator="equals" value="${x}"/>
          </condition-list>
          <order-by field-name="xyz DESC"/>
        </entity-condition>
        <field-to-result field-name="tblList" result-name="aList"/>
      </then>
    </if>
  </simple-method>
  <simple-method method-name="someMethod2" short-description="sample method2">
  (中略)
  </simple-method>
</simple-methods>

もはや何か書く気力すら残っていないのだが一応解説しておくと、上記のスクリプトを走らせると、

  1. リクエストパラメータより foo, bar を取得してコンテキスト (Map) に詰める
  2. foo, bar ともに空でなければ
    1. SomeClass#fungaaa を引数なしで呼び出し、戻り値を ret という名前でコンテキストに詰める
    2. sampleMethod2 を呼び出し、戻り値の hage という値を x という名前でコンテキストに詰める
    3. TBL というテーブルから abc 列の値が x の値と等しい行を xyz 列について降順に並べたものを tblList という名前でコンテキストに詰める
    4. aList という名前で戻り値コンテキストに tblList の値を詰める

という動作をする。多分。

そしてここまで書いた時点で俺の怒りのボルテージは極限まで膨れ上がっており、何ていうかもう自分でも何をしでかすかわからない状態なのだが、とりあえずこのミニ言語が非常に馬鹿げたものだということは何となくわかってくれると思う。ちなみにミニ言語の言語仕様はどこにあるのかわからないというか多分存在しないので、俺はこの言語の XML Schema を読みながら文法を覚えた。というか他の XML 言語も Schema 読みながら試行錯誤していたんだけど、絶対にこれって間違ってるよな。

ちなみに実際のアプリケーションではこの XML スクリプトが何重にもネストして呼び出され、そしてこのミニ言語でやってることの中には極めてクリティカルなアクセス制御機構があり、基盤技術者である俺はその辺の仕様及び大体の実装を知っておかないとならないという状況で、なんていうかこれを一人で調べながら実装すんのはマジでキツいぞ。他の社員で出来そうな奴が殆どおらず、居たとしても外に出稼ぎに行ってるからまあ俺と共同作業なんざ出来そうもないが。

OFBiz の提供する機能自体は強力で、わかり易いマニュアルさえあれば使っても良いと思える部分があるのだが、いかんせん俺が知っておかないといけない部分についての資料が不足しているというか全然なくて、まあなんていうかこれじゃあ日本じゃ流行らんわな。

Creative Commons
この怪文書はクリエイティブ・コモンズ・ライセンスの元でライセンスされています。引用した文章など Kuwata Chikara に著作権のないものについては、それらの著作権保持者に帰属します。