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 }