001 package com.thaiopensource.relaxng.impl;
002
003 class DataDerivTypeFunction extends AbstractPatternFunction {
004 private final ValidatorPatternBuilder builder;
005
006 DataDerivTypeFunction(ValidatorPatternBuilder builder) {
007 this.builder = builder;
008 }
009
010 static DataDerivType dataDerivType(ValidatorPatternBuilder builder, Pattern pattern) {
011 return (DataDerivType)pattern.apply(builder.getDataDerivTypeFunction());
012 }
013
014 public Object caseOther(Pattern p) {
015 return new SingleDataDerivType();
016 }
017
018 public Object caseAfter(AfterPattern p) {
019 Pattern p1 = p.getOperand1();
020 DataDerivType ddt = apply(p.getOperand1());
021 if (!p1.isNullable())
022 return ddt;
023 return ddt.combine(new BlankDataDerivType());
024 }
025
026 private Object caseBinary(BinaryPattern p) {
027 return apply(p.getOperand1()).combine(apply(p.getOperand2()));
028 }
029
030 public Object caseChoice(ChoicePattern p) {
031 return caseBinary(p);
032 }
033
034 public Object caseGroup(GroupPattern p) {
035 return caseBinary(p);
036 }
037
038 public Object caseInterleave(InterleavePattern p) {
039 return caseBinary(p);
040 }
041
042 public Object caseOneOrMore(OneOrMorePattern p) {
043 return apply(p.getOperand());
044 }
045
046 public Object caseList(ListPattern p) {
047 return InconsistentDataDerivType.getInstance();
048 }
049
050 public Object caseValue(ValuePattern p) {
051 return new ValueDataDerivType(p.getDatatype());
052 }
053
054 public Object caseData(DataPattern p) {
055 if (p.allowsAnyString())
056 return new SingleDataDerivType();
057 return new DataDataDerivType(p.getDatatype());
058 }
059
060 public Object caseDataExcept(DataExceptPattern p) {
061 if (p.allowsAnyString())
062 return apply(p.getExcept());
063 return new DataDataDerivType(p.getDatatype()).combine(apply(p.getExcept()));
064 }
065
066 private DataDerivType apply(Pattern p) {
067 return builder.getPatternMemo(p).dataDerivType();
068 }
069 }