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 }