001 package com.thaiopensource.relaxng.impl;
002
003 import org.relaxng.datatype.Datatype;
004 import org.relaxng.datatype.DatatypeException;
005 import org.relaxng.datatype.ValidationContext;
006
007 class DataDataDerivType extends DataDerivType {
008 private final Datatype dt;
009 private PatternMemo validMemo;
010 private PatternMemo invalidMemo;
011
012 DataDataDerivType(Datatype dt) {
013 this.dt = dt;
014 }
015
016 PatternMemo dataDeriv(ValidatorPatternBuilder builder, Pattern p, String str, ValidationContext vc) {
017 try {
018 dt.checkValid(str, vc);
019 if (validMemo == null)
020 validMemo = super.dataDeriv(builder, p, str, vc);
021 return validMemo;
022 } catch (DatatypeException e) {
023 String msg = e.getMessage();
024 if (msg != null && !"".equals(msg)) {
025 if (vc instanceof PatternValidator) {
026 PatternValidator pv = (PatternValidator) vc;
027 pv.addDatatypeError(msg, e);
028 }
029 }
030 if (invalidMemo == null)
031 invalidMemo = super.dataDeriv(builder, p, str, vc);
032 return invalidMemo;
033 }
034 }
035
036 DataDerivType copy() {
037 return new DataDataDerivType(dt);
038 }
039
040 DataDerivType combine(DataDerivType ddt) {
041 if (ddt instanceof DataDataDerivType) {
042 if (((DataDataDerivType)ddt).dt == dt)
043 return this;
044 return InconsistentDataDerivType.getInstance();
045 }
046 if (ddt instanceof ValueDataDerivType) {
047 if (((ValueDataDerivType)ddt).getDatatype() == dt)
048 return ddt;
049 return InconsistentDataDerivType.getInstance();
050 }
051 return ddt.combine(this);
052 }
053 }