001    package com.thaiopensource.relaxng.impl;
002    
003    import org.relaxng.datatype.Datatype;
004    import org.relaxng.datatype.ValidationContext;
005    
006    import java.util.Hashtable;
007    
008    class ValueDataDerivType extends DataDerivType {
009      private final Datatype dt;
010      private PatternMemo noValue;
011      private Hashtable valueTable;
012    
013      ValueDataDerivType(Datatype dt) {
014        this.dt = dt;
015      }
016    
017      DataDerivType copy() {
018        return new ValueDataDerivType(dt);
019      }
020    
021      PatternMemo dataDeriv(ValidatorPatternBuilder builder, Pattern p, String str, ValidationContext vc) {
022        Object value = dt.createValue(str, vc);
023        if (value == null) {
024          if (noValue == null)
025            noValue = super.dataDeriv(builder, p, str, vc);
026          return noValue;
027        }
028        else {
029          DatatypeValue dtv = new DatatypeValue(value, dt);
030          if (valueTable == null)
031            valueTable = new Hashtable();
032          PatternMemo tem = (PatternMemo)valueTable.get(dtv);
033          if (tem == null) {
034            tem = super.dataDeriv(builder, p, str, vc);
035            valueTable.put(dtv, tem);
036          }
037          return tem;
038        }
039      }
040    
041      DataDerivType combine(DataDerivType ddt) {
042        if (ddt instanceof ValueDataDerivType) {
043          if (((ValueDataDerivType)ddt).dt == this.dt)
044            return this;
045          else
046            return InconsistentDataDerivType.getInstance();
047        }
048        else
049          return ddt.combine(this);
050      }
051    
052      Datatype getDatatype() {
053        return dt;
054      }
055    }