scalaxb 0.6.1

sbaz から conscript へ

scalaxb をインストールするのに、sbaz には今までお世話になりましたが、scala のバージョンに依存してたり、REPL のクラスパスを汚染したりなど問題も多いものだった。
0.6.1 より scalaxb は sbaz のサポートを打ち切り、全ユーザに conscript に移行して scalaxb をインストールすることを推奨する。

$ sudo sbaz remove scalaxb
$ cs eed3si9n/scalaxb

Array

  • xs:base64BinaryArray[Byte] ではなく、scalaxb.Base64Binary にマッピングするようにした。
  • scalaxb.HexBinaryscalaxb.Base64Binary の両方とも内部では Vector[Byte] を使う。
  • 他の組み込み型で以前に Array[String] にマッピングされていたものは Seq[String] マッピングするようにした。

mvn-scalaxb

@martiell氏により scalaxb plugin for Maven が提供された。

sbt-scalaxb for sbt 0.10

sbt 0.10 から scalaxb を呼び出すには、以下を project/plugins/build.sbt に加え:

libraryDependencies += "org.scalaxb" %% "sbt-scalaxb" % "0.6.1"

以下を build.sbt に加える:

sourceGenerators in Compile <+= scalaxb.identity

バグフィクスおよび細かな機能改善点

  • リストの派生型を修正した。 (#54 reported by @ikwzm)
  • 空のシーケンスの処理を修正した。(#55)
  • 名前と構造が一致するローカル要素の命名を修正した。(#56)
  • @implicitNotFound 属性を fromXML その他に加えた。
  • scalaxb.scala の生成を省くための --no-runtime オプションを加えた。(#45 requested by @martiell)
  • wdl オペレーション名のキャメルケース化を実装した。 (#52 requested by @timperrett)
  • wsdl より生成されるメッセージ case class に付けていた X プレフィックスを取り除いた。(#51 requested by @timperrett)
  • 200+ パラメータを処理するために --chunk-size オプションを加えた。(#58 reported by @ecin)

wsdl 1.1 サポート

ドットコムブームのさなか猫も杓子も WSDL で記述されたSOAP サービスの一つや二つは書いていたのではないか。この WSDL ドキュメントを詳しくみてみると、実はメッセージのレイアウトを記述した XML Schema ドキュメントが埋めこまれており、それが結構な部分を占めいていることが分かる。残りは些細なものだ。scalaxb は XML Schema 部分は処理できるため、WSDL をサポートし始めるのは、時間の問題だったと言えるだろう。

使用例

  1. wsdl ドキュメントをローカル環境にダウンロードする。
  2. sbt-scalaxb を使っている場合はそれを src/main/wsdl に置く。

サンプルの設定例はこんな感じ:

import ScalaxbKeys._
 
val scalaXml = "org.scala-lang.modules" %% "scala-xml" % "1.0.2"
val scalaParser = "org.scala-lang.modules" %% "scala-parser-combinators" % "1.0.1"

vmware は scalaxb と Salat を使っている

John Stanford 氏が Salat を使って scalaxb の case class を MongoDB に永続化してますという話:
- Using Salat with scalaxb generated classes

新しく作った scalaxb Google Group でも氏が一番乗りでした。参加してアイディアを contribute して下さい。

scalaxb 0.6.0

新機能

  • 実験的 wsdl 1.1 サポート。

バグフィクスおよび細かな機能改善点

  • XML バインディングを foo_xmlprotocol.scala に生成するようにした。
  • Scala 2.9.0-1。
  • Web API を Unfiltered 0.3.3 にアップグレードした。
  • xs:anyAttribute にデフォルトの引数を加えた。
  • xs:anySimpleType のサポートを加えた。(#34 reported by @psnively)
  • xs:any の命名を修正した。(#35 reported by @psnively)
  • DataRecord の型クラスインスタンスを追加した。(#40 reported by @psnively)
  • DataRecord のラウンドトリップを修正した。(#43)
  • xs:anyType を含む xs:choice のマッピングを変更した。(#44 reported by @psnively)

scalaxb 0.5.4

  • @max4f による sbt-scalaxb プラグインを追加した。
  • パッケージディレクトリ構造を生成する --package-dir 追加した。
  • conscript に対応した: cs eed3si9n/scalaxb.
  • パッケージをまたぐ choice が生成するコードを修正した (GH-33)。

sbt-scalaxb 登場

sbt のための scalaxb プラグインを書いてもらい、さらに快くそれをプロジェクトに取り込まさせてくれた Max 氏 (@max4f) に謝意を表したい。ところで、皆さんは sbt 使ってますね?

sbt から compile-xsd タスクを使うための手順を説明する。

step 1. Plugins.scala

以下を project/plugins/Plugins.scala に追加する。

import sbt._
 
class Plugins(info: ProjectInfo) extends PluginDefinition(info) {
  val scalaxb = "org.scalaxb" % "sbt-scalaxb" % "0.6.0"
 
  val scalaToolsNexusSnapshots = "Scala Tools Nexus Snapshots" at "http://nexus.scala-tools.org/content/repositories/snapshots/"
  val scalaToolsNexusReleases  = "Scala Tools Nexus Releases" at "http://nexus.scala-tools.org/content/repositories/releases/"
}

scalaxb 0.5.3

互換性の無い変更点 (no import)

  • 補助関数を Scalaxb オブジェクトから scalaxb パッケージオブジェクトに移した。
  • デフォルトの型クラスインスタンスを DefaultXMLProtocol trait から生成されるクラスのパッケージオブジェクトに移した。(#nescala での @jsuereth参照)

以前の使用例:

import scalaxb._
import Scalaxb._
import ipo._
import DefaultXMLProtocol._
val shipTo = fromXML[Address](subject)

今後の使用例:

val shipTo = scalaxb.fromXML[ipo.Address](subject)

バグフィクスおよび細かな機能改善点

  • xs:integer その他を BigInt に対応させた。
  • 代替グループのパーシングを修正した。(GH-25: 報告者 @dbolene)
  • attributeFormDefaultelementFormDefaultform のサポートを実装した。(GH-26: 報告者 @dbolene)
  • 長いシーケンスのパーシングを修正した。(GH-29: 報告者 E-Fir)
  • UTF-8 と UTF-16 における BOM の取り扱いを実装した。(GH-31: 報告者 @fredferrao)
  • バージョン番号を表示する。 (GH-24: 報告者 @dbolene)
  • パーサーのエラーメッセージを改善した。(GH-27: 報告者 @dbolene)

scalaxb 0.5.2

  • <xs:sequence> の取り扱いを修正しました。(GH-19)
  • <xs:attributeGroup> の取り扱いを修正しました。 (GH-21)
  • 参照されたスキーマやコンポーネントが見つからない場合のエラーメッセージを改善しました。
  • 見つからないスキーマを現ディレクトリ内で検索するようにしました。(GH-23)

複数のスキーマファイル

<xs:include> and <xs:import>

XML Schema では、<xs:include> を用いることで、一つの対象名前空間のためのスキーマを複数のスキーマ定義ドキュメントを組み合わせて定義することができる。例えば、MathML 3 のスキーマの XML Schema 版は以下を含む:

<xs:include schemaLocation="mathml3-strict-content.xsd"/> 

これは、mathml3-strict-content.xsd をあたかもスキーマの一部であるかのように取り込む。

また、XML Schema では、スキーマ定義ドキュメントは <xs:import> を用いることで他の名前空間のスキーマを参照することができ、つまり他のスキーマ定義ドキュメントを参照することができる。例えば、SAML Assertion のスキーマは二つの外部スキーマ定義をインポートする:

<import namespace="http://www.w3.org/2000/09/xmldsig#"

型クラスによる XML データバインディング

結局の所,scalaxb のユーザはエンティティ・オブジェクトが表現する現実の問題に興味があるのであって,それがどう XML に永続化されるかといったことではない.だから,いつかデータバインディングの実装をシングルトン/コンパニオン・オブジェクトから追い出さなければいけないことは分かっていた.つい最近までデータバインディングの実装は以下のように生成されていた:

object Address extends rt.ElemNameParser[Address] {
  val targetNamespace = "http://www.example.com/IPO"
 
  def parser(node: scala.xml.Node): Parser[Address] =
    ...
 
  def toXML(__obj: Address, __namespace: String, __elementLabel: String, __scope: scala.xml.NamespaceBinding): scala.xml.NodeSeq =
    ...
}

つまり,scalaxb は Address そのものとは関係の無い XML データバインディングのために一等地をハイジャックしてしまったのだ.

Syndicate content