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    }