001    package com.thaiopensource.relaxng.impl;
002    
003    import org.relaxng.datatype.Datatype;
004    import org.xml.sax.Locator;
005    
006    class DataExceptPattern extends DataPattern {
007      private final Pattern except;
008      private final Locator loc;
009    
010      DataExceptPattern(Datatype dt, Pattern except, Locator loc) {
011        super(dt);
012        this.except = except;
013        this.loc = loc;
014      }
015    
016      boolean samePattern(Pattern other) {
017        if (!super.samePattern(other))
018          return false;
019        return except.samePattern(((DataExceptPattern)other).except);
020      }
021    
022      void accept(PatternVisitor visitor) {
023        visitor.visitDataExcept(getDatatype(), except);
024      }
025    
026      Object apply(PatternFunction f) {
027        return f.caseDataExcept(this);
028      }
029    
030      void checkRestrictions(int context, DuplicateAttributeDetector dad, Alphabet alpha)
031        throws RestrictionViolationException {
032        super.checkRestrictions(context, dad, alpha);
033        try {
034          except.checkRestrictions(DATA_EXCEPT_CONTEXT, null, null);
035        }
036        catch (RestrictionViolationException e) {
037          e.maybeSetLocator(loc);
038          throw e;
039        }
040      }
041    
042      Pattern getExcept() {
043        return except;
044      }
045    }