インターフェース実装クラス、データ構造
檜山正幸
Thu Sep 28 2006
1. インターフェースの実装
- PrintHandler : デフォルトのVSTHandler実装
- model.ModelBuilder : モデルを構築するVSTHandler実装
- TabFileEvaluator : タブ区切りファイルをもとにしたEvaluator実装
- 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. モデルのデータ構造
- model.Node : ノード一般
- model.TextNode : テキスト・ノード
- 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);
}
}