-S2Tools

POJOでためし掘りしてみようかとS2周辺ツールのインターフェイス切ってみました。これでうまいこと成果がでるようなら報告します。S2Containerを組み込んだS2Pluginが実現しなくてもTestCaseに組み込んで使えるかなと思ってます。
インターフェイスはこんな感じ。

package org.seasar.tools.validate;
import java.io.InputStream;
import org.seasar.tools.Task;
import org.seasar.tools.TaskMonitor;
public interface ValidateTask {
  public boolean validate(InputStream in, TaskMonitor monitor) throws Throwable;
}
package org.seasar.tools.validate;
public interface ValidateReporter {
  public void report(ValidateTask task, boolean error, String message);
  public void report(ValidateTask task, boolean error, String message, int begin, int end);
}

実装イメージはこんな感じ。うまくできたら、Groovy-Seasarのも作ってみたいな。

package org.seasar.tools.validate;
import java.io.InputStream;
import org.seasar.framework.container.S2Container;
import org.seasar.framework.xml.SaxHandlerParser;
import org.seasar.tools.TaskMonitor;
public class S2ConfigXMLValidateTask implements ValidateTask {
  private ValidateReporter reporter;
  public S2ConfigXMLValidateTask(ValidateReporter reporter) {
    this.reporter = reporter; 
  }
  public String getTaskName() {
    return "S2ConfigValidate";
  }
  public boolean validate(InputStream in, TaskMonitor monitor) throws Throwable {
    try {
      SaxHandlerParser parser = createParser();
      S2Container container = (S2Container)parser.parse(in);
      // TODO: パースできた後のバリデーション処理
      return true;
    } catch(Exception e) {
      String message = analizeException(e);
      reporter.report(this, true, message);
      return false;
    }
  }
  private SaxHandlerParser createParser() {
    // TODO: reporterを仕込んだSAXハンドラを作る
    return null;
  }
  private String analizeException(Exception e) {
    // TODO: XMLパーサーの例外を分析する
    return null;
  }
}

とりあえずのレポーター実装

package org.seasar.tools.validate;
import java.io.PrintStream;
public class SimpleReporter implements ValidateReporter {
  private PrintStream out;
  public SimpleReporter(PrintStream out) {
    this.out = out;
  }
  private String getMessage(String taskName, boolean error, String message) {
    return "[" + taskName + "]  " + (error ? "error: " : "warning: ") + message;
  }
  public void report(ValidateTask task, boolean error, String message, int begin, int end) {
    out.println(getMessage(task.getTaskName(), error, 
      " pos:" + begin + "-" + end + " " + message));
  }
  public void report(ValidateTask task, boolean error, String message) {
    out.println(getMessage(task.getTaskName(), error, message));
  }
}