2010年8月9日月曜日

JavaアプリケーションによるBEITELデータの読み込み

さて今回は、BEITELのデータを自分のJavaアプリケーションで読み込んでみましょう。
BEITELのデータを読み込むためには、(BEITELをインストールしたディレクトリ)/lib/beitel.jarをクラスパスに追加する必要があります。

BEITELのデータ読み込みには以下のクラス・インタフェースを使用します。
  • jp.carabiner.treeeditor.TreeEditorModelクラス - データを表現するモデル。
  • jp.carabiner.treeeditor.TreeNodeDataManagerクラス - ZTEファイルの読み込み用クラス。
  • jp.carabiner.treeeditor.FileManagerインタフェース - 一時ディレクトリの管理用インタフェース。
  • jp.carabiner.treeeditor.DataStoreインタフェース - ドキュメント内データの保持用インタフェース。
  • jp.carabiner.tarp.desktop.ui.TaskStatusインタフェース - タスク進行状況の管理用インタフェース。

これらのクラス・インタフェースの役割について簡単に説明します。
  • 読み込みはTreeNodeDataManagerクラスを介して行ないます。結果はTreeEditorModelとして取得されます。
  • 引数には以下のオブジェクトを指定します。
    • ZTEファイルのデータはjava.io.InputStreamクラスによって供給します。
    • 処理途中に必要となる一時ファイルの生成にはFileManagerインタフェースの実装が使用されます。
    • ZTEファイルから読み込んだデータのうち、画像などのバイナリデータはDataStoreインタフェースの実装に格納されます。
    • プログレスバーへの進行状況表示のため、進行状況は逐一TaskStatusインタフェースの実装に通知されます。
    • モデルの読み込み元を示す任意のファイル名を指定することができます。

このうち、DataStoreインタフェースにはデフォルトの実装jp.carabiner.treeeditor.DefaultDataStoreクラスがありますが、FileManagerとTaskStatusインタフェースは独自の実装クラスを作成する必要があります。

基本的な手順は以下のとおりです。
  1. jp.carabiner.treeeditor.FileManagerインタフェースの実装クラスの作成
    package jp.carabiner.beitel.sample;

    import java.io.File;
    import java.io.IOException;

    import jp.carabiner.treeeditor.FileManager;
    import jp.carabiner.treeeditor.TreeNode;

    /**
    * 一時ファイルのマネージャです。
    */
    public class TempFileManager implements FileManager {

    /**
    * 一時ディレクトリを保持します。
    */
    private File tempDir;

    /**
    * 構築します。
    *
    * @param tempDir
    * 一時ディレクトリ。
    */
    public TempFileManager(File tempDir) {
    this.tempDir = tempDir;
    }

    @Override
    public File createTempFile() throws IOException {
    File f = File.createTempFile("beitel-temp", ".tmp", tempDir);
    f.deleteOnExit();
    return f;
    }

    @Override
    public File createTempFile(TreeNode node) throws IOException {
    File f = File.createTempFile("beitel-node", ".tmp", tempDir);
    f.deleteOnExit();
    return f;
    }

    @Override
    public File createTempFile(String prefix, String suffix) throws IOException {
    File f = File.createTempFile(prefix, suffix, tempDir);
    f.deleteOnExit();
    return f;
    }

    @Override
    public void releaseTempFile(File f) {
    f.delete();
    }

    }
  2. jp.carabiner.tarp.desktop.ui.TaskStatusインタフェースの実装クラスの作成
    package jp.carabiner.beitel.sample;

    import jp.carabiner.tarp.desktop.ui.TaskStatus;

    /**
    * タスクの進行状況を管理します。
    */
    public class DefaultTaskStatus implements TaskStatus {

    /**
    * 構築します。
    */
    public DefaultTaskStatus() {
    ;
    }

    @Override
    public void begin(String name, int max, boolean indeterminate) {
    System.out.println("begin: " + name);
    }

    @Override
    public TaskStatus[] beginSubTask(String name, int num) {
    System.out.println("begin: " + name);
    DefaultTaskStatus[] subTasks = new DefaultTaskStatus[num];
    for (int i = 0; i < subTasks.length; i++) {
    subTasks[i] = new DefaultTaskStatus();
    }
    return subTasks;
    }

    @Override
    public void end() {
    System.out.println("end");
    }

    @Override
    public void progress() {
    System.out.print(".");
    }

    }
  3. jp.carabiner.treeeditor.TreeNodeDataManagerユーティリティクラスを利用してZTEファイルの読み込み
    package jp.carabiner.beitel.sample;

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.InputStream;

    import jp.carabiner.treeeditor.DataStore;
    import jp.carabiner.treeeditor.DefaultDataStore;
    import jp.carabiner.treeeditor.TreeEditorModel;
    import jp.carabiner.treeeditor.TreeNode;
    import jp.carabiner.treeeditor.TreeNodeDataManager;

    /**
    * テストタスクです。
    */
    public class Test {

    /**
    * 実行します。
    *
    * @param args
    * 引数。
    */
    public static void main(String[] args) {
    try {
    InputStream in = new FileInputStream(new File(args[0]));
    File tempDir = new File("temp/");
    tempDir.mkdirs();
    TempFileManager tempFileManager = new TempFileManager(tempDir);
    DefaultTaskStatus taskStatus = new DefaultTaskStatus();
    String filename = "test";
    DataStore dataStore = new DefaultDataStore(tempFileManager);

    TreeEditorModel model = TreeNodeDataManager.load(tempFileManager,
    filename, in, dataStore, taskStatus);
    in.close();

    TreeNode rootNode = model.getRootNode();
    printNode(rootNode, "");
    } catch (Throwable t) {
    t.printStackTrace();
    }
    }

    /**
    * ノードを出力します。
    *
    * @param node
    * ノード。
    * @param indent
    * インデント。
    */
    private static void printNode(TreeNode node, String indent) {
    System.out.println(indent + "+ " + node.getText());
    for (int i = 0; i < node.getChildrenCount(); i++) {
    printNode(node.getChild(i), indent + " ");
    }
    }

    }

0 件のコメント:

コメントを投稿