001    package com.thaiopensource.relaxng.impl;
002    
003    import org.relaxng.datatype.Datatype;
004    import org.xml.sax.Locator;
005    
006    public class SchemaPatternBuilder extends PatternBuilder {
007      private boolean idTypes;
008      private final UnexpandedNotAllowedPattern unexpandedNotAllowed = new UnexpandedNotAllowedPattern();
009      private final TextPattern text = new TextPattern();
010      private final PatternInterner schemaInterner = new PatternInterner();
011    
012      public SchemaPatternBuilder() { }
013    
014      public boolean hasIdTypes() {
015        return idTypes;
016      }
017    
018      Pattern makeElement(NameClass nameClass, Pattern content, Locator loc) {
019        Pattern p = new ElementPattern(nameClass, content, loc);
020        return schemaInterner.intern(p);
021      }
022    
023      Pattern makeAttribute(NameClass nameClass, Pattern value, Locator loc) {
024        if (value == notAllowed)
025          return value;
026        Pattern p = new AttributePattern(nameClass, value, loc);
027        return schemaInterner.intern(p);
028      }
029    
030      Pattern makeData(Datatype dt) {
031        noteDatatype(dt);
032        Pattern p = new DataPattern(dt);
033        return schemaInterner.intern(p);
034      }
035    
036      Pattern makeDataExcept(Datatype dt, Pattern except, Locator loc) {
037        noteDatatype(dt);
038        Pattern p = new DataExceptPattern(dt, except, loc);
039        return schemaInterner.intern(p);
040      }
041    
042      Pattern makeValue(Datatype dt, Object obj) {
043        noteDatatype(dt);
044        Pattern p = new ValuePattern(dt, obj);
045        return schemaInterner.intern(p);
046      }
047    
048      Pattern makeText() {
049        return text;
050      }
051    
052      Pattern makeOneOrMore(Pattern p) {
053        if (p == text)
054          return p;
055        return super.makeOneOrMore(p);
056      }
057    
058      Pattern makeUnexpandedNotAllowed() {
059        return unexpandedNotAllowed;
060      }
061    
062      Pattern makeError() {
063        Pattern p = new ErrorPattern();
064        return schemaInterner.intern(p);
065      }
066    
067      Pattern makeChoice(Pattern p1, Pattern p2) {
068        if (p1 == notAllowed || p1 == p2)
069          return p2;
070        if (p2 == notAllowed)
071          return p1;
072        return super.makeChoice(p1, p2);
073      }
074    
075      Pattern makeList(Pattern p, Locator loc) {
076        if (p == notAllowed)
077          return p;
078        Pattern p1 = new ListPattern(p, loc);
079        return schemaInterner.intern(p1);
080      }
081    
082      Pattern makeMixed(Pattern p) {
083        return makeInterleave(text, p);
084      }
085    
086      private void noteDatatype(Datatype dt) {
087        if (dt.getIdType() != Datatype.ID_TYPE_NULL)
088          idTypes = true;
089      }
090    }