要素内容がVCのテンプレートルールの場合は、次の手順で処理します。
- インストラクション要素の内容に記述されたテンプレートルールを解析し、解析結果を表す
SequenceEvaluatorオブジェクトを作成する
- 作成した
SequenceEvaluatorオブジェクトをインストラクションファクトリーやインストラクションの引数に設定する
実装例を次に示します。
インストラクションパーサーサービスプロバイダでは、インストラクション要素の内容に記述されたテンプレートルールを解析します。その結果をインストラクションファクトリの引数に設定します。
import com.xfy.common.vc.VcUtilities;
import com.xfy.common.vc.SequenceEvaluator;
import com.xfy.common.vc.SequenceParserService;
:
public class FooInstructionParser extends XfyObject implements InstructionParserService {
public InstructionFactory createInstructionFactory(Element elem, XmlSource source)
throws ValidationException {
:
SequenceParserService parser = VcUtilities.sequenceParser();
SequenceEvaluator evaluator = parser.parseSequence(elem, source);
return new FooInstructionFactory(source, evaluator);
:
}
}
インストラクションファクトリ実装クラスでは、生成するインストラクションの引数にSequenceEvaluatorオブジェクトを設定します。
public class FooInstructionFactory extends InstructionFactory {
private SequenceEvaluator evaluator;
public FooInstructionFactory(XmlSource source, SequenceEvaluator evaluator) {
super(source);
this.evaluator = evaluator;
}
public Instruction createInstruction(InstructionContext c) {
return new FooInstruction(c, this.evaluator);
}
}
インストラクション実装クラスでは、executeメソッドの中でSequenceEvaluatorオブジェクトを評価します。評価結果をXML文書フラグメントとして取得する実装例は、次のとおりです。
public class FooInstruction extends AbstractInstruction {
private SequenceEvaluator evaluator;
public FooInstruction(InstructionContext c, SequenceEvaluator evaluator) {
super(c);
this.evaluator = evaluator;
}
public void execute() throws CommandException {
// 評価結果フラグメントを
// コンテキストノードのオーナードキュメントにインポート
DocumentFragment fragment = this.evaluator.importAsFragment(this.context);
// 以下、DOM API でフラグメントを利用する
:
}
}
SequenceEvaluatorオブジェクトは、最後にdestroyメソッドを呼び出して破棄する必要があります。SequenceEvaluatorオブジェクトの破棄は、InstructionFactory派生クラスのdestroyメソッドをオーバーライドして実装します。インストラクション実装クラスではなく、解析結果を保持するファクトリクラスで破棄する点に注意してください。
SequenceEvaluatorオブジェクトの破棄の実装例を、次に示します。
public class FooInstructionFactory extends InstructionFactory {
private SequenceEvaluator evaluator;
public FooInstructionFactory(XmlSource source, SequenceEvaluator evaluator) {
super(source);
this.evaluator = evaluator;
}
public Instruction createInstruction(InstructionContext c) {
return new FooInstruction(c, this.evaluator);
}
public void destroy() {
this.evaluator.destory();
super.destroy();
}
}