いろいろなデータ型のサポート

Curl ORBのデータ通信には以下のデータ型を利用することができます。(要はサービスクラスのコンストラクタやメソッドの引数及び戻り値、フィールドのデータクラスとして利用できる方です。)

Curl Java
int int
int8 byte
int16 short
int32 int
int64 long
float float
double double
bool boolean
char char
String java.lang.String
DateTime java.util.Date
FastArray-of データ型 配列
Array (Array-of any) List, ArrayList
HashTable (HashTable-of any) Map, HashMap
ByteArray com.curl.io.serialize.types.ByteArray
COM.CURL.ORB.TYPE.SerializableRecordSet
COM.CURL.ORB.TYPE.SerializableRecordField
COM.CURL.ORB.TYPE.SerializableRecordData(0.7以上でサポート)
com.curl.orb.type.SerializableRecordSet
com.curl.orb.type.SerializableRecordField
com.curl.orb.type.SerializableRecordData
ユーザ定義型(フィールドは上記のものに限る) ユーザ定義型(フィールドは上記のものに限る)

バージョン0.6から以下のデータ型もサポートされました。

Curl Java
COM.CURL.ORB.TYPE.BigInteger java.math.BigInteger
COM.CURL.ORB.TYPE.BigDecimal java.math.BigDecimal
COM.CURL.ORB.TYPE.Date java.util.Date
COM.CURL.ORB.TYPE.CDate java.sql.Date
COM.CURL.ORB.TYPE.CTime java.sql.Time
COM.CURL.ORB.TYPE.CTimestamp java.sql.Timestamp
COM.CURL.ORB.TYPE.Blob java.sql.Blob
COM.CURL.ORB.TYPE.Clob java.sql.Clob

注意) サーバからのレスポンスとして受け取る場合(戻り値)は、すべてNull許容の型となる。(例、#String, #Foo)

また、Curlのユーザ定義型をJavaのクラスから生成する場合は、”Data Class”としてコード生成ツールから生成します。

さらにバージョン0.8からValueクラスDecimal型 (Curl8.0のみ)もサポートされました。

注意) Valueクラスを利用する際は、Javaクラスに@ValueClassアノテーションを付与する必要があります。

レコードセットのサンプル

以下のようにサーバ側でレコードセットを作成し、クライアントへ返すことができます。

Java

// 0.6 の場合
public SerializableRecordSet createRecordSet() {
SerializableRecordSet records =
new SerializableRecordSet(
new SerializableRecordField[]{
new SerializableRecordField(“name”, String.class),
new SerializableRecordField(“age”, int.class),
new SerializableRecordField(“money”, double.class),
new SerializableRecordField(“date”, DateTime.class)});
records.addRecord(new Object[]{“hokada”, 32, 10.1, new DateTime()});
records.addRecord(new Object[]{“amori”, 27, 20000.01, new DateTime()});
records.addRecord(new Object[]{“tyamamoto”, 30, 0.0001, new DateTime()});
records.addRecord(new Object[]{“foo”, 20, 2.2, new DateTime()});
return records;

}

// 0.7の場合
public SerializableRecordSet createRecordSet() {
SerializableRecordSet records = new SerializableRecordSet(
new SerializableRecordField[]{
new SerializableRecordField(“name”, String.class),
new SerializableRecordField(“age”, int.class),
new SerializableRecordField(“money”, double.class),
new SerializableRecordField(“dt”, DateTime.class),
new SerializableRecordField(“ts”, CTimestamp.class),
new SerializableRecordField(“bigint”, com.curlap.orb.type.BigInteger.class)
}
);
records.addRecord(
new SerializableRecordData(
new String[]{“name”, “age”, “money”, “dt”, “ts”, “bigint”},
new Object[]{“hokada”, 32, 10.1, new DateTime(), new Timestamp(0), new BigInteger(“100”)}
)
);
records.addRecord(
new SerializableRecordData(
new String[]{“name”, “age”, “money”, “dt”, “ts”, “bigint”},
new Object[]{“amori”, 27, 20000.01, new DateTime(), new Timestamp(0), new BigInteger(“200”)})
);
records.addRecord(
new SerializableRecordData(
new String[]{“name”, “age”, “money”, “dt”, “ts”, “bigint”},
new Object[]{“tyamamoto”, 30, 0.0001, new DateTime(), new Timestamp(0), new BigInteger(“300”)})
);
records.addRecord(
new SerializableRecordData(
new String[]{“name”, “age”, “money”, “dt”, “ts”, “bigint”},
new Object[]{“foo”, 20, 2.2, new DateTime(), new Timestamp(0), new BigInteger(“400”)})
);
return records
}

Curl

{method public {create-record-set}:#SerializableRecordSet
{return {self.invoke “createRecordSet”}}
}

|| 利用例
{RecordGrid record-source = {foo.create-record-set}}

BigInteger、BigDecimalのサンプル

Java

import java.math.BigDecimal;
import java.math.BigInteger;
import java.sql.Blob;
import java.sql.Clob;
import java.sql.Date;
import java.sql.Time;
import java.sql.Timestamp;

public class TestTypes {

public BigInteger echoBigInteger(BigInteger bigInteger) {
return bigInteger;
}

public BigDecimal echoBigDecimal(BigDecimal bigDecimal) {
return bigDecimal;
}

public Date echoDate(Date sqlDate) {
return sqlDate;
}

public Time echoTime(Time sqlTime) {
return sqlTime;
}

public Timestamp echoTimestamp(Timestamp sqlTimestamp) {
return sqlTimestamp;
}

public Blob echoBlob(Blob blob) {
return blob;
}

public Clob echoClob(Clob clob) {
return clob;
}
}

Curl

{define-class public TestTypes {inherits ApplicationContextClient}

|| これは生成されたコード
[…] 

{method public {echo-date v0:CDate}:#CDate
{return {self.invoke “echoDate”, arguments = {FastArray v0}}}
}

{method public {echo-complex-type v0:ComplexTypeDto}:#ComplexTypeDto
{return {self.invoke “echoComplexType”, arguments = {FastArray v0}}}
}

{method public {echo-big-integer v0:BigInteger}:#BigInteger
{return {self.invoke “echoBigInteger”, arguments = {FastArray v0}}}
}

{method public {echo-big-decimal v0:BigDecimal}:#BigDecimal
{return {self.invoke “echoBigDecimal”, arguments = {FastArray v0}}}
}

{method public {echo-time v0:CTime}:#CTime
{return {self.invoke “echoTime”, arguments = {FastArray v0}}}
}

{method public {echo-timestamp v0:CTimestamp}:#CTimestamp
{return {self.invoke “echoTimestamp”, arguments = {FastArray v0}}}
}

{method public {echo-blob v0:Blob}:#Blob
{return {self.invoke “echoBlob”, arguments = {FastArray v0}}}
}

{method public {echo-clob v0:Clob}:#Clob
{return {self.invoke “echoClob”, arguments = {FastArray v0}}}
}
}

|| 以下のように利用

{import * from COM.CURL.ORB}

|| from-int64, from-int, from-String, from-doubleファクトリでBigIntegerのインスタンス生成可能
|| add(+), subtract(-), multiple(*), divide(/), to-int, to-int64, to-Stringというメソッドなどで操作可能
def big-integer:BigInteger = {ct.echo-big-integer {BigInteger.from-int 123}}

|| from-int64, from-int, from-String, from-doubleファクトリでBigDecimalのインスタンス生成可能
|| add(+), subtract(-), multiple(*), divide(/), to-int, to-int64, to-Stringというメソッドなどで操作可能

def big-decimal:BigDecimal = {ct.echo-big-decimal {BigDecimal.from-double 123.10}}

def date:CDate = {ct.echo-date {CDate}}

def time:CTime = {ct.echo-time {CTime 20000}}

def timestamp:CTimestamp = {ct.echo-timestamp {CTimestamp 40000}}

def blob:Blob = {ct.echo-blob {Blob {{Array-of byte} ‘a’, ‘b’, ‘c’}}

def clob:Clob = {ct.echo-clob {Clob {{Array-of char} ‘a’, ‘b’, ‘c’}}}

*各クラスは、基本的にJavaのAPIと同等のメソッドを持っています。