myGroup > myProject
 

Tips

Tips

1. Emacs + nxml-mode

Emacs + nxml-mode で編集すると、 mapping definition の validation をリアルタイムに行ってくれます。 nxml-mode が読み込む rnc ファイルは、以下のコマンドによって $TABLETOOLS_HOME/schema/rnc 配下に生成されます。

$ ant rnc

mapping definition が 正しい文法で書かれているか、msCodeGenerator がサポートしている範囲に収まっているかを チェックすることができます。 datatypeLibrary の URI と type もチェックの対象です。 ただし、両者が正しい組み合わせで使われているかはチェックされません。

2. 改行コードにマッチする value 要素

本当に改行コードを埋め込むしかないのです。

... <txt:value>
</txt:value>

以下ではありません。

<txt:value>\n</txt:value>

3. サンプルで用いるファイルを自動で生成する方法

サンプルで用いるファイルを、以下のコマンドにより、自動で生成することもできます。

$ createsample -lang -type ums_file output_directry

これにより、以下の構造のサンプルディレクトリに、サンプルで用いるファイルが自動で生成されます。

    + Sample

      + clng
        - SampleMain.c
        - SampleTest.c
        - Makefile
        - schemas.xml
        - Sample.ums

      + java
        - SampleMain.java
        - SampleTest.java
        - build.xml
        - schemas.xml
        - Sample.ums

      + data
				

設計メモ:サンプル自動生成ツール

4. validation プログラム

マッピング定義 を用いて 簡単に validation プログラムを書くことができます。 以下は、1行に ':' で区切られた8項目のデータが並ぶファイルを検証する例です。 JAVA では、以下のようになります。

<?xml version="1.0" encoding="utf-8"?>
<grammar xmlns="http://ums.isas.jaxa.jp/0.4"
         datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
  <start>
import jp.jaxa.isas.ums.runtime.*;
import jp.jaxa.isas.ums.m3.*;

class ValidateSample {

  static void validate( byte[] ums__buffer, int ums__bitlen ) throws UMSException {
    <defineMapping direction="decode">
      <dat:byte encode="txt" xmlns:dat="http://ums.isas.jaxa.jp/0.4/dat">
        <dat:list separator=":">
          <dat:data type="string"/>
          <dat:data type="string"/>
          <dat:data type="string"/>
          <dat:data type="string"/>
          <dat:data type="string"/>
          <dat:data type="string"/>
          <dat:data type="string"/>
          <dat:data type="string"/>
          <dat:data type="string"/>
        </dat:list>
      </dat:byte>
    </defineMapping>
  }

  /* 行データ用定型プログラム */
  public static void main(String[] args) {

    UMSLibrary.tableTools_init();

    String fileName = args[0];
    String inputBuffer;
    byte[] buffer = null;
    int inBitlen = 0;

    try {
      java.io.BufferedReader br
        = new java.io.BufferedReader( new java.io.FileReader( fileName ) );

      while( ( inputBuffer = br.readLine() ) != null ) {

        inBitlen = inputBuffer.length() * 8;

        try {
          buffer = inputBuffer.getBytes( "US-ASCII" );
          validate( buffer, inBitlen );
        } catch ( UMSException ex ) {
          ex.print( buffer, inBitlen );
          ex.printStackTrace( System.err );
        }
      }
      br.close();

    } catch ( java.io.IOException ex ) {
      ex.printStackTrace( System.err );
    }
    UMSLibrary.tableTools_end();
  }
}
  </start>
</grammar>

また、C言語では以下のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<grammar xmlns="http://ums.isas.jaxa.jp/0.4"
         datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
  <start>

void validate( char *ums__buffer, int ums__bitlen, ums__exception_t *ums__ex ) {
    <defineMapping direction="decode">
      <dat:byte encode="txt" xmlns:dat="http://ums.isas.jaxa.jp/0.4/dat">
        <dat:list separator=":">
          <dat:data type="string"/>
          <dat:data type="string"/>
          <dat:data type="string"/>
          <dat:data type="string"/>
          <dat:data type="string"/>
          <dat:data type="string"/>
          <dat:data type="string"/>
          <dat:data type="string"/>
          <dat:data type="string"/>
        </dat:list>
      </dat:byte>
    </defineMapping>
}

/* 行データ用定型プログラム */
int main() {

  char in_buffer[BUFFER_SIZE];
  int  in_bitlen;
  ums__exception_t ums__ex;

  tableTools_init();

  while ( fgets( in_buffer, BUFFER_SIZE, stdin ) != NULL ) {

    in_bitlen = strlen( in_buffer ) * 8 - 8;

    in_buffer[in_bitlen/8] = 0;
    printf( "input(%d*8+%d):<%s>\n", in_bitlen / 8, in_bitlen % 8 , in_buffer );

    initException( &ums__ex );

    validate(input_buffer, in_bitlen, &ex);

    if ( ums__ex.occured != UMS__STATE_OK ) {
      ums__exception_print( &ums__ex, in_buffer, in_bitlen );
      continue;
    }
  }

  tableTools_end();

  return 0;
}
  </start>
</grammar>

5. enocde と decode で同じデータ定義を参照する方法

'define'要素 、 及び 'ref'要素 を 用いて、共通部分を定義、参照することができます。 チュートリアルの例は、以下のように書き直すことができます。

<?xml version="1.0" encoding="UTF-8"?>
<grammar xmlns="http://ums.isas.jaxa.jp/0.4"
         datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
  <start>

    <java:class name="Sample" xmlns:java="http://ums.isas.jaxa.jp/0.4/java">

      <defineVariables>
        <java:var class="String" name="sData"/>
        <java:var type="int"     name="iData"/>
        <java:var type="double"  name="dData"/>
      </defineVariables>

      <defineFunctions>
        <java:function name="decode">
          <java:arg       type="byte[]" name="ums__buffer" direction="in"/>
          <java:arg       type="int"    name="ums__bitlen" direction="in"/>
          <java:return    type="void"/>
          <java:exception type="UMSException"/>

          <defineMapping direction="decode">

            <ref name="mapping">

          </defineMapping>
        </java:function>

        <java:function name="encode">
          <java:arg       type="byte[]" name="ums__buffer" direction="out"/>
          <java:arg       type="int[]"  name="ums__bitlen" direction="inout"/>
          <java:return    type="void"/>
          <java:exception type="UMSException"/>

          <defineMapping direction="encode">

            <ref name="mapping">

          </defineMapping>
        </java:function>

      </defineFunctions>
    </java:class>
  </start>

  <define name="mapping">
    <dat:byte encode="txt" xmlns:dat="http://ums.isas.jaxa.jp/0.4/dat">
      <dat:list separator=",">
        <java:value-of select="sData">
          <data type="token"/>
        </java:value-of>
        <java:value-of select="iData">
          <data type="int"/>
        </java:value-of>
        <java:value-of select="dData">
          <data type="double"/>
        </java:value-of>
      </dat:list>
    </dat:byte>
  </define>

</grammar>

6. define/ref の機能のみ使いたい

"resolveRef.xsl" を使用し、 define/ref の展開を行いたい XML ファイルを XSLT プロセッサにかけてください。

[参照ファイル]
src/xslt/raw/resolveRef.xsl