001    package com.thaiopensource.relaxng.impl;
002    
003    import org.relaxng.datatype.Datatype;
004    
005    class ValuePattern extends StringPattern {
006      private final Object obj;
007      private final Datatype dt;
008    
009      ValuePattern(Datatype dt, Object obj) {
010        super(combineHashCode(VALUE_HASH_CODE, obj.hashCode()));
011        this.dt = dt;
012        this.obj = obj;
013      }
014    
015      boolean samePattern(Pattern other) {
016        if (getClass() != other.getClass())
017          return false;
018        if (!(other instanceof ValuePattern))
019          return false;
020        return (dt.equals(((ValuePattern)other).dt)
021                && dt.sameValue(obj, ((ValuePattern)other).obj));
022      }
023    
024      void accept(PatternVisitor visitor) {
025        visitor.visitValue(dt, obj);
026      }
027    
028      Object apply(PatternFunction f) {
029        return f.caseValue(this);
030      }
031    
032      void checkRestrictions(int context, DuplicateAttributeDetector dad, Alphabet alpha)
033        throws RestrictionViolationException {
034        switch (context) {
035        case START_CONTEXT:
036          throw new RestrictionViolationException("start_contains_value");
037        }
038      }
039    
040      Datatype getDatatype() {
041        return dt;
042      }
043    
044      Object getValue() {
045        return obj;
046      }
047    
048    }