インターフェース実装クラス、データ構造

檜山正幸
Thu Sep 28 2006

目次

1. インターフェースの実装

  1. PrintHandler : デフォルトのVSTHandler実装
  2. model.ModelBuilder : モデルを構築するVSTHandler実装
  3. TabFileEvaluator : タブ区切りファイルをもとにしたEvaluator実装
  4. misc.FileContentEvaluator : ファイル名からファイル内容を出力するEvaluator実装
/* PrintHandler.java */
package sample;

import sample.VSTHandler;

/* デバッグ目的のデフォルト・ハンドラ */
public class PrintHandler implements VSTHandler {
  public void startTemplate() {
    System.out.println("startTemplate");
  }
  public void endTemplate()  {
    System.out.println("endTemplate");
    System.out.flush();
  }

  public void placeholder(String content) {
    System.out.println("placeholder:" + content);
  }

  public void text(String text) {
    System.out.println("text:" + "'" + text + "'");
  }

  public void error(String message)  {
    System.out.println("error:" + message);
    System.out.flush();
  }
}
/* ModelBuilder.java */
package sample.model;

import java.util.*;
import sample.VSTHandler;
import sample.Result;

public class ModelBuilder implements VSTHandler, Result<List<Node>> {
  /* -- component ports */
  // @Provide
  public final VSTHandler handler;
  // @Provide
  public final Result<List<Node>> result;
  /* -- end ports */

  public ModelBuilder() {
    handler = this;
    result = this;
  }

  private List<Node> list = null;
  private boolean available = false;

  public void startTemplate() {
    list = new LinkedList<Node>();
  }
    
  public void endTemplate() {
    available = true;
  }

  public void placeholder(String content) {
    list.add(new PlaceholderNode(content));
  }

  public void text(String text) {
    list.add(new TextNode(text));
  }

  public void error(String message) {
    list = null;
    available = false;
  }

  public List<Node> result() {
    return list;
  }

  public boolean isAvailable() {
    return available;
  }
}
/* TabFileEvaluator.java */
package sample;

import java.util.*;
import java.io.*;

// 内部コンポネント
class TSPLoader implements Result<Map<String, String>> {
  /* -- component ports */
  // @Provide
  public final Result<Map<String, String>>  result;
  // @Require
  public void setInput(Reader reader) {
    input = new BufferedReader(reader);
  }
  /* -- end ports */

  public TSPLoader() {
    result = this;
  }

  private BufferedReader input;  
  private Map<String, String> map;
  private boolean available = false;
  
  public void load() throws IOException {
    
    map = new HashMap<String, String>();
    available = false;

    String line;
    while ((line = input.readLine()) != null) {
      Scanner sc = new Scanner(new StringReader(line));
      sc.useDelimiter("\\t+");
      String first = sc.next();
      String second = sc.next();
      map.put(first, second);
    }
    available = true;
  }
  public boolean isAvailable() {
    return available;
  }
  public Map<String, String> result() {
    return map;
  }
}

public class TabFileEvaluator implements Evaluator {

  private Map<String, String> map = new HashMap<String, String>();

  public void load(String file) throws IOException {
    TSPLoader loader = new TSPLoader();
    Reader reader = new FileReader(new File(file));
    loader.setInput(reader);
    loader.load();
    if (loader.result.isAvailable()) {
      map = loader.result.result();
    } else {
      map = new HashMap<String, String>();
    }
  }
  
  public String eval(String arg) {
    return map.get(arg);
  }
}
/* FileContentEvaluator.java */
package sample.misc;

import java.io.*;
import sample.*;

public class FileContentEvaluator implements Evaluator {
  public String eval(String fname) {
    String s;
    try {
      Reader r = new FileReader(new File(fname));
      StringBuilder sb = new StringBuilder();
      int c;
      while ((c = r.read()) != -1) {
	sb.append((char)c);
      }
      s = sb.toString();
    } catch (Exception e) {
      return null;
    }
    return s;
  }
}

2. モデルのデータ構造

  1. model.Node : ノード一般
  2. model.TextNode : テキスト・ノード
  3. model.PlaceholderNode : プレイスホルダー・ノード
/* Node.java */
package sample.model;

public class Node {
  public final String value;
  public Node(String value) {
    this.value = value;
  }
}
/* TextNode.java */
package sample.model;

public class TextNode extends Node {
  public TextNode(String value) {
    super(value);
  }
}
/* PlaceholderNode.java */
package sample.model;

public class PlaceholderNode extends Node {
  public PlaceholderNode(String value) {
    super(value);
  }
}