package com.thaiopensource.relaxng.pattern;
class DataDerivTypeFunction extends AbstractPatternFunction<DataDerivType> {
private final ValidatorPatternBuilder builder;
DataDerivTypeFunction(ValidatorPatternBuilder builder) {
this.builder = builder;
}
static DataDerivType dataDerivType(ValidatorPatternBuilder builder, Pattern pattern) {
return pattern.apply(builder.getDataDerivTypeFunction());
}
public DataDerivType caseOther(Pattern p) {
return new SingleDataDerivType();
}
public DataDerivType caseRef(RefPattern p) {
return apply(p.getPattern());
}
public DataDerivType caseAfter(AfterPattern p) {
Pattern p1 = p.getOperand1();
DataDerivType ddt = apply(p.getOperand1());
if (!p1.isNullable())
return ddt;
return ddt.combine(new BlankDataDerivType());
}
private DataDerivType caseBinary(BinaryPattern p) {
return apply(p.getOperand1()).combine(apply(p.getOperand2()));
}
public DataDerivType caseChoice(ChoicePattern p) {
return caseBinary(p);
}
public DataDerivType caseGroup(GroupPattern p) {
return caseBinary(p);
}
public DataDerivType caseInterleave(InterleavePattern p) {
return caseBinary(p);
}
public DataDerivType caseOneOrMore(OneOrMorePattern p) {
return apply(p.getOperand());
}
public DataDerivType caseList(ListPattern p) {
return InconsistentDataDerivType.getInstance();
}
public DataDerivType caseValue(ValuePattern p) {
return new ValueDataDerivType(p.getDatatype(), p.getDatatypeName());
}
public DataDerivType caseData(DataPattern p) {
if (p.allowsAnyString())
return new SingleDataDerivType();
return new DataDataDerivType(p);
}
public DataDerivType caseDataExcept(DataExceptPattern p) {
if (p.allowsAnyString())
return apply(p.getExcept());
return new DataDataDerivType(p).combine(apply(p.getExcept()));
}
private DataDerivType apply(Pattern p) {
return builder.getPatternMemo(p).dataDerivType();
}
}