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 }