001 package com.thaiopensource.relaxng.impl;
002
003 import java.util.Hashtable;
004
005 public class FeasibleTransform {
006 private static class FeasiblePatternFunction extends AbstractPatternFunction {
007 private final SchemaPatternBuilder spb;
008 private final Hashtable elementTable = new Hashtable();
009
010 FeasiblePatternFunction(SchemaPatternBuilder spb) {
011 this.spb = spb;
012 }
013
014 public Object caseChoice(ChoicePattern p) {
015 return spb.makeChoice(p.getOperand1().applyForPattern(this), p.getOperand2().applyForPattern(this));
016 }
017
018 public Object caseGroup(GroupPattern p) {
019 return spb.makeGroup(p.getOperand1().applyForPattern(this), p.getOperand2().applyForPattern(this));
020 }
021
022 public Object caseInterleave(InterleavePattern p) {
023 return spb.makeInterleave(p.getOperand1().applyForPattern(this), p.getOperand2().applyForPattern(this));
024 }
025
026 public Object caseOneOrMore(OneOrMorePattern p) {
027 return spb.makeOneOrMore(p.getOperand().applyForPattern(this));
028 }
029
030 public Object caseElement(ElementPattern p) {
031 if (elementTable.get(p) == null) {
032 elementTable.put(p, p);
033 p.setContent(p.getContent().applyForPattern(this));
034 }
035 return spb.makeOptional(p);
036 }
037
038 public Object caseOther(Pattern p) {
039 return spb.makeOptional(p);
040 }
041 }
042
043 public static Pattern transform(SchemaPatternBuilder spb, Pattern p) {
044 return p.applyForPattern(new FeasiblePatternFunction(spb));
045 }
046 }