myGroup > myProject
 

Type Conversion Library

1. Type Conversion Library (共通処理)

UMS では、RELAX NG 同様、データ型に関する処理が 言語そのものから切り離されています。つまり、 各プログラミング言語ごとに、

  • encodeと、datatype
  • datatypeと、プログラミング言語のデータ型

の変換ルール(処理ロジック)を決める必要があり、 各々の組み合わせごとに変換のルールを決めておく必要があります。 これを Type Conversion Library と呼んでいます。 umsCodeGenerator では、これを言語本体とは別の XSLT で定義します。

共通処理は umsCodeGenerator 本体の XSLT から 直接呼び出される Type Conversion Library の入り口です。 umsCodeGenerator 本体の XSL は、datatypeLibrary 属性やその他の値を、 パラメータ 'library' などを用いて、template に引き渡します。 共通処理の template は、'library' の値を用いて、 各 Type Conversion Library 用の XSLT を呼び出します。 未定義の Type Conversion Library が指定された場合、 エラーメッセージを出力します。

新たな Type Conversion Library を、組み込む場合、この XSLT を変更します。

設計メモ: ソースコードのメタな記述 (添付資料)

1.1 typeConversion_lang.xsl

<stylesheet>
  <include href="file://localhost/W3C_typeConversion_lang.xsl" />
					
  <template name="initLibrary" />
					
  <template name="encode2valuetypeConversion"
               param="library, datatype, encode, cont10, cont20, constant"/>
  <template name="encode2datatypeConversion"
               param="library, datatype, encode, cont10, cont20"/>
  <template name="datatype2langtypeConversion"
               param="library, datatype, langtype, varname"/>
  <template name="langtype2datatypeConversion"
               param="library", datatype, langtype, varname"/>
  <template name="datatype2encodeConversion"
               param="library, datatype, encode, cont10, cont20"/>
  <template name="valuetype2encodeConversion"
               param="library, datatype, encode, cont10, cont20, constant"/>
</stylesheet>
				

1.2 typeConversion_chdr.xsl

<stylesheet>
  <include href="file://localhost/W3C_typeConversion_chdr.xsl" />
					
  <template name="useLibrary" />
</stylesheet>
				

2. Type Conversion Library (個別処理)

実際に、どのような処理を行うかは、 各々の Type Conversion Library 毎に個別に指定します。 umsCodeGenerator に同梱のサンプルでは W3C のデータ型の 一部が作りこまれています。

いずれの template も、パラメータ datatype を持っています。 これは、もともとマッピング定義の data 要素や、 value 要素の type 属性の値を umsCodeGenerator 本体の XSL が読み取ったものです。使用可能なデータ型の名前は 各 type conversion library にて定義します。 未定義の datatype が指定された場合、 エラーメッセージが出力されます。

この XSL ファイルに記載される関数呼び出しは 対応するライブラリで定義された関数のみです。

<value /> 要素で指定される固定パターンを プログラミング言語のリテラルに置き換えるのはこの スタイルシートです。と、いうのは、どのような 変換が必要かは type によって決まるからです。 これは、文字列の処理なので XSL のみでは解決できず、 JAVA のソースコードを呼び出しています。

2.1 W3C_typeConversion_lang.xsl

<stylesheet>

  <template name="W3C_initLibrary"/>

  <template name="W3C_dataTypeDefinition"
    param="datatype"/>
  <template name="W3C_encode2valuetypeConversion"
    param="datatype, encode, cont10, cont20, constant"/>
  <template name="W3C_encode2datatypeConversion">
    param="datatype, encode, cont10, cont20"/>
  <template name="W3C_datatype2langtypeConversion">
    param="datatype, langtype, varname"/>
  <template name="W3C_langtype2datatypeConversion">
    param="datatype, langtype, varname"/>
  <template name="W3C_datatype2encodeConversion">
    param="datatype, encode, cont10, cont20"/>
  <template name="W3C_valuetype2encodeConversion">
    param="datatype, encode, cont10, cont20, constant"/>

</stylesheet>
				

2.2 W3C_typeConversion_chdr.xsl

<stylesheet>
  <template name="W3C_useLibrary"/>
</stylesheet>
				

3. Type Conversion Library (Library Function)

エンコードされたデータを言語から読み書きする作業は、 直接書き下すことで、最も最適化された処理を行うことができます。 しかし、種々の場合に対応しようとすると、直接ソースコードを 書き出すよりも、ライブラリ関数として切り出しておく方が 検証とソースコードの可読性が向上します。そこで、umsCodeGenerator に同梱のサンプルでは、殆どの処理がプログラミング言語 そのもので記述された typeConversionLibrary を 呼び出す形式を採用しています。

3.1 W3C_typeConversionLibrary.{h,c}

void ums__W3C_typeConversionLibrary_init(void);
void ums__W3C_typeConversionLibrary_end(void);

char *ums__W3C_txtEncode_stringType
    (ums__dat_t *dat, int epos, ums__exception_t *ex);
char *ums__W3C_txtEncode_tokenType
    (ums__dat_t *dat, int epos, ums__exception_t *ex);
int32_t ums__W3C_txtEncode_intType
    (ums__dat_t *dat, int epos, ums__exception_t *ex);
uint32_t ums__W3C_txtEncode_unsignedIntType
    (ums__dat_t *dat, int epos, ums__exception_t *ex);
double ums__W3C_txtEncode_doubleType
    (ums__dat_t *dat, int epos, ums__exception_t *ex);
int32_t ums__W3C_signedEncode_intType
    (ums__dat_t *dat, int epos, ums__exception_t *ex);
uint32_t ums__W3C_unsignedEncode_unsignedIntType
    (ums__dat_t *dat, int epos, ums__exception_t *ex);
double ums__W3C_ieee754doubleEncode_doubleType
    (ums__dat_t *dat, int epos, ums__exception_t *ex);

void ums__W3C_stringType_txtEncode
    (char * str, ums__dat_t *dat, int epos, ums__exception_t *ex);
void ums__W3C_tokenType_txtEncode
    (char * str, ums__dat_t *dat, int epos, ums__exception_t *ex);
void ums__W3C_intType_txtEncode
    (int32_t num, ums__dat_t *dat, int epos, ums__exception_t *ex);
void ums__W3C_unsignedIntType_txtEncode
    (uint32_t num, ums__dat_t *dat, int epos, ums__exception_t *ex);
void ums__W3C_doubleType_txtEncode
    (double num, ums__dat_t *dat, int epos, ums__exception_t *ex);
void ums__W3C_intType_signedEncode
    (int32_t num, ums__dat_t *dat, int epos, ums__exception_t *ex);
void ums__W3C_unsignedIntType_unsignedEncode
    (uint32_t num, ums__dat_t *dat, int epos, ums__exception_t *ex);
void ums__W3C_doubleType_ieee754doubleEncode
    (double num, ums__dat_t *dat, int epos, ums__exception_t *ex);

void ums__W3C_txtEncode_stringValue
    (ums__dat_t *dat, int epos, char *literal, ums__exception_t *ex);
void ums__W3C_txtEncode_tokenValue
    (ums__dat_t *dat, int epos, char *literal, ums__exception_t *ex);
void ums__W3C_txtEncode_intValue
    (ums__dat_t *dat, int epos, int32_t literal, ums__exception_t *ex);
void ums__W3C_txtEncode_unsignedIntValue
    (ums__dat_t *dat, int epos, uint32_t literal, ums__exception_t *ex);
void ums__W3C_txtEncode_doubleValue
    (ums__dat_t *dat, int epos, double literal, ums__exception_t *ex);
void ums__W3C_signedEncode_intValue
    (ums__dat_t *dat, int epos, int32_t literal, ums__exception_t *ex);
void ums__W3C_unsignedEncode_unsignedIntValue
    (ums__dat_t *dat, int epos, uint32_t literal, ums__exception_t *ex);
void ums__W3C_ieee754doubleEncode_doubleValue
    (ums__dat_t *dat, int epos, double literal, ums__exception_t *ex);
				

3.2 Type Conversion Library (Library Function)

public class W3C_TypeConversionLibrary {

  public static String txtRead(UMSDat dat, int epos)
      throws UMSException;
  public static String txtEncode_stringType(UMSDat dat, int epos)
      throws UMSException;
  public static String txtEncode_tokenType(UMSDat umsDat, int epos)
      throws UMSException;
  public static int txtEncode_intType(UMSDat umsDat, int epos)
      throws UMSException;
  public static double txtEncode_doubleType(UMSDat umsDat, int epos)
      throws UMSException;
  public static int signedEncode_intType(UMSDat umsDat, int epos)
      throws UMSException;
  public static double ieee754doubleEncode_doubleType(UMSDat umsDat, int epos)
      throws UMSException;
  public static void bitWrite(long num, UMSDat umsDat, int epos)
      throws UMSException;
  public static void stringType_txtEncode(String str, UMSDat umsDat, int epos)
      throws UMSException;
  public static void tokenType_txtEncode(String str, UMSDat umsDat, int epos)
      throws UMSException;
  public static void intType_txtEncode(int num, UMSDat umsDat, int epos)
      throws UMSException;
  public static void doubleType_txtEncode(double num, UMSDat umsDat, int epos)
      throws UMSException;
  public static void intType_signedEncode(int num, UMSDat umsDat, int epos)
      throws UMSException;
  public static void doubleType_ieee754doubleEncode(double num, UMSDat umsDat, int epos)
      throws UMSException;
  public static void txtEncode_stringValue(UMSDat dat, int epos, String literal)
      throws UMSException;
  public static void txtEncode_intValue(UMSDat dat, int epos, int literal)
      throws UMSException;
  public static void txtEncode_doubleValue(UMSDat dat, int epos, double literal)
      throws UMSException;
  public static void signedEncode_intValue(UMSDat dat, int epos, int literal)
      throws UMSException;
  public static void ieee754doubleEncode_doubleValue(UMSDat dat, int epos, double literal)
      throws UMSException;
}