ガイド
式言語部品の使いかた(woolpack.el)
Woolpackでは式言語のインタフェース「GettingEL」と「EL」を定義しており、 実装としてWoolpack実装とOGNLアダプタとJXPathアダプタを用意しています。
ELインタフェースは以下の例のように使います。
final EL el = null/* ... */;
final Map<String, String> map = Utils.map("key0", "value0");
final Object object = el.getValue(map);
assertEquals("value0", object);
el.setValue(map, "value1");
assertEquals("value1", map.get("key0"));
Woolpack実装は以下の例のように宣言します。
final EL el = new PathEL("key0");
Woolpack実装ではデフォルトで配列、コレクション、単純型、マップ、Beanをある程度自動的に変換します。
OGNLアダプタは以下の例のように宣言します。
final EL el = new OGE("key0");
OGNLを文字列で指定します。OGNLの文法は http://www.ognl.org/または http://s2container.seasar.org/ja/ognl.html が詳しいです。
JXPathアダプタは以下の例のように宣言します。
final EL el = new JXE("key0");
XPathを文字列で指定します。JXPathの文法は http://jakarta.apache.org/commons/jxpath/ が詳しいです。
Woolpackの式言語インタフェースは 処理部品を組み立てるフェーズと処理部品を実行するフェーズを分離するところに特徴があります。 式言語インタフェースのインスタンスを受け取って使っているクラスを一部紹介します。
クラスクラスの機能式言語インタフェースの使いかた
ActionDefMVCのひとつのアクション情報実行するPOJOのメソッドを指定する
AutoUpdaterコンポーネントのデータをDOMに流し込む処理部品データの取得先コンポーネントを指定する
DB処理部品の使いかた(woolpack.sql.fn)
Woolpackでは RDBメタ情報・クエリ生成・RDB値バインド・RDB値取得・トランザクション分離機構を 部品化しています。これらを組み立てて使用します。
入力のない更新系のクエリは以下の例のように宣言します。
final DataSource dataSource = null/* ... */;
final Fn<Object, Integer, Exception> fn = SqlFnUtils.inputStatement(
  dataSource,
  "create memory table my_table (" +
  "my_id integer, " +
  "my_seq integer, " +
  "my_string varchar, " +
  "my_int integer, " +
  "constraint MYTALBE0P primary key (my_id, my_seq))",
  SqlFnUtils.GET_COUNT, FnUtils.fix(null));
assertEquals(Integer.valueOf(0), fn.exec(null));
入力のあるクエリは以下の例のように宣言します。
final DataSource dataSource = null/* ... */;
final Fn<Map<String, ?>, Integer, Exception> fn = SqlFnUtils.inputBean(
  dataSource,
  new PreparedStatementInfo(
    "insert into my_table (my_id, my_seq, my_string, my_int) values (?, ?, ?, ?)",
    Arrays.asList("myId", "mySeq", "myString", "myInt")),
  SqlFnUtils.GET_COUNT, FnUtils.fix(null));
assertEquals(
    Integer.valueOf(1),
    fn.exec(Utils.<String, Object>
    map("myId", 0)
    .map("mySeq", 1)
    .map("myString", "c0")
    .map("myInt", 2)));
入力と出力がひとつの項目だけであるクエリは以下の例のように宣言します。
final DataSource dataSource = null/* ... */;
final Fn<Object, Object, Exception> fn = SqlFnUtils.inputSingle(
  dataSource,
  "select my_string from my_table where my_id = ?",
  SqlFnUtils.getOne(SqlFnUtils.GET_SINGLE, FnUtils.fix(null)), FnUtils.fix(null));
assertEquals("c0", fn.exec(0));
出力が複数の項目で複数レコードであるクエリは以下の例のように宣言します。
final DataSource dataSource = null/* ... */;
final Fn<Map<String, ?>, List<Map<String, Object>>, Exception> fn = SqlFnUtils.inputBean(
  dataSource,
  new PreparedStatementInfo(
    "select * from my_table where my_id = ? and my_seq = ?",
    Arrays.asList("myId", "mySeq")),
  SqlFnUtils.getList(
      SqlFnUtils.getBeanResult(FactoryUtils.LINKED_MAP_FACTORY),
      FnUtils.fix(null)), FnUtils.fix(null));
assertEquals(
  Utils.list(Utils.
    <String, Object>map("MY_ID", 0)
    .map("MY_SEQ", 1)
    .map("MY_STRING", "c0")
    .map("MY_INT", 2)),
  fn.exec(Utils.
    <String, Object>map("myId", 0)
    .map("mySeq", 1)));
出力がBeanであるクエリは以下の例のように宣言します。
final DataSource dataSource = null/* ... */;
final Fn<Object, TestBean, Exception> fn = SqlFnUtils.inputStatement(
  dataSource,
  "select * from my_table where my_id = 0 and my_seq = 1",
  SqlFnUtils.getOne(
      SqlFnUtils.getBeanResult(FactoryUtils.newInstance(TestBean.class)),
      FnUtils.fix(null)), FnUtils.fix(null));
assertEquals(2, fn.exec(null).getMyInt());
トランザクション制御部品の使いかた(woolpack.fn.tx)
Woolpackでは トランザクションを制御するDataSourceのプロキシと トランザクションが制御されたDataSourceのプロキシの組を生成するビルダーを用意しています。 これを使用することにより DataSourceを使用するDBアクセスクラスはそのままで 業務ロジックからトランザクション処理を分離することができます。
複数の更新クエリでトランザクションを制御する場合は以下の例のように宣言します。
final DataSource dataSource = null/* ... */;
final TxBuilder builder = new TxBuilder(dataSource);
final Fn<Map<String, ?>, Integer, Exception> fn = SqlTxUtils.tx(
  builder.getTxDataSource(),// トランザクションを制御するDataSourceのプロキシ
  FnUtils.seq(Utils.
    list(SqlFnUtils.inputBean(
      builder.getTmpDataSource(),// トランザクションが制御されたDataSourceのプロキシ
      new PreparedStatementInfo(
        "insert into your_table (my_int, your_string) values (?, ?)",
        Arrays.asList("myInt", "yourString")),
      SqlFnUtils.GET_COUNT, FnUtils.fix(null)))
    .list(
      SqlFnUtils.inputBean(
        builder.getTmpDataSource(),// トランザクションが制御されたDataSourceのプロキシ
        new PreparedStatementInfo(
          "insert into my_table (my_id, my_seq, my_string, my_int) values (?, ?, ?, ?)",
          Arrays.asList("myId", "mySeq", "myString", "myInt")),
        SqlFnUtils.GET_COUNT, FnUtils.fix(null)))));
fn.exec(Utils.<String, Object>
map("myId", 0)
.map("mySeq", 1)
.map("myString", "c0")
.map("myInt", 2)
.map("yourString", "y0"));
上の例ではトランザクションブロックである「SqlTxUtils.tx」の中にふたつのクエリを指定していますが、 「SqlTxUtils.tx」の委譲先には任意の「Fn」インスタンスを指定することができます。 特に、識別子で業務を分岐する処理を「SqlTxUtils.tx」の委譲先の中に指定することにより 業務に対し横断的にトランザクション制御を定義することができます。
Webアプリケーション部品の使いかた(woolpack.ee)
WoolpackではWebアプリケーションの作成を支援するためにいくつかの部品を用意しています。 Servlet APIのrequest、session、applicationの各スコープをMapインタフェースで扱うためのアダプタを用意しています。 これらを利用することにより業務クラスがServlet APIに依存することを防止し、JUnitテストケースの実装と実行を容易にします。
final Map<String, Object> request = new ServletRequestAttributeMap(request);
final ConcurrentMap<String, Object> session = Utils.concurrentMap(new HttpSessionMap(
  request.getSession()),
  request.getSession());
final ConcurrentMap<String, Object> application = Utils.concurrentMap(new ServletContextMap(
  request.getSession().getServletContext()),
  request.getSession().getServletContext());
フォーマットの使いかた(woolpack.convert)
Woolpackではjava.text.Formatを利用した変換用部品を用意しています。
java.text.Formatのformat()メソッドを利用した変換器は以下の例のように宣言します。
assertEquals("3",
  ConvertUtils.format(ConvertUtils.formatFactory(new DecimalFormat()))
  .exec(Integer.valueOf(3)));
java.text.FormatのparseObject()メソッドを利用した変換器は以下の例のように宣言します。
final Fn<String, Object, Exception> fn =
  ConvertUtils.parse(ConvertUtils.formatFactory(new DecimalFormat()));
assertEquals(Long.valueOf(3), fn.exec("3"));
入力値検証部品の使いかた(woolpack.validator)
Woolpackでは入力値検証を定義する部品を用意しています。 以下の例のように宣言します(woolpack.samples.crud.SampleServletから抜粋)。
final Fn<ValidatorContext, Boolean, RuntimeException> fn = BoolUtils.boolSeq(
  BoolUtils.ANDAND,
  Utils.<Fn<ValidatorContext, Boolean, RuntimeException>>
  // プロパティ「name」がパラメータに存在する場合はその長さをチェックします
  list(ValidatorUtils.branchByNameIfExists(
    Utils.<String, Fn<ValidatorContext, Boolean, RuntimeException>>
    map("name", BoolUtils.ifNot(
      FnUtils.join(ValidatorUtils.VALUE, ConvertUtils.TO_STRING, BoolUtils.checkMaxLength(40)),
      ValidatorUtils.message("validator.name.maxLength"))))
  )
  // 業務IDが正規表現「user_(register|update)(Confirm|Result)」に一致する場合に
  // プロパティ「name」プロパティ「name」の有無をチェックします
  .list(FnUtils.ifTrue(
    FnUtils.join(
      IdUtils.GET_ID,
      BoolUtils.checkRegExp(Pattern.compile("user_(register|update)(Confirm|Result)"))),
    ValidatorUtils.branchByName(
      Utils.<String, Fn<ValidatorContext, Boolean, RuntimeException>>
      map("name", BoolUtils.ifNot(
        FnUtils.join(ValidatorUtils.VALUE, BoolUtils.NOT_EMPTY),
        ValidatorUtils.message("validator.name.required")))
    ), FnUtils.fix(true)))
);
履歴
  1. 20070212 新規作成。
  2. 20070217 コレクションの説明を変更。表記誤りを変更(parseからparseObject)。
  3. 20070228 Fnインタフェース変更に伴う変更。
  4. 20070309 型宣言のエスケープ誤りを修正。
  5. 20070325 DB系部品と真偽ライブラリの変更に伴う変更。
  6. 20070502 woolpack.sql.metaの説明を削除(再構築のため)。
  7. 20070602 機能絞りこみのため説明を削除。
トップに戻る
Copyright (C) 2006-2007 Takahiro Nakamura. All rights reserved.