package com.thaiopensource.relaxng.pattern; import org.relaxng.datatype.Datatype; import org.relaxng.datatype.DatatypeException; import org.relaxng.datatype.ValidationContext; import java.util.List; class DataDataDerivType extends DataDerivType { private final DataPattern dp; private PatternMemo validMemo; private PatternMemo invalidMemo; DataDataDerivType(DataPattern dp) { this.dp = dp; } PatternMemo dataDeriv(ValidatorPatternBuilder builder, Pattern p, String str, ValidationContext vc, List<DataDerivFailure> fail) { boolean isValid; final Datatype dt = dp.getDatatype(); DataDerivFailure ddf = null; if (fail != null) { try { dt.checkValid(str, vc); isValid = true; } catch (DatatypeException e) { isValid = false; ddf = new DataDerivFailure(dp, e); } } else isValid = dt.isValid(str, vc); if (isValid) { if (validMemo == null || (fail != null && validMemo.isNotAllowed())) validMemo = super.dataDeriv(builder, p, str, vc, fail); return validMemo; } else { if (invalidMemo == null) invalidMemo = super.dataDeriv(builder, p, str, vc, fail); else if (invalidMemo.isNotAllowed() && ddf != null) fail.add(ddf); return invalidMemo; } } DataDerivType copy() { return new DataDataDerivType(dp); } DataDerivType combine(DataDerivType ddt) { if (ddt instanceof DataDataDerivType) { if (((DataDataDerivType)ddt).dp.getDatatype() == dp.getDatatype()) return this; return InconsistentDataDerivType.getInstance(); } if (ddt instanceof ValueDataDerivType) { if (((ValueDataDerivType)ddt).getDatatype() == dp.getDatatype()) return ddt; return InconsistentDataDerivType.getInstance(); } return ddt.combine(this); } }