5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25 /*
26 * Copyright (C) 2004-2011
27 *
28 * Permission is hereby granted, free of charge, to any person obtaining a copy
29 * of this software and associated documentation files (the "Software"), to deal
30 * in the Software without restriction, including without limitation the rights
31 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
32 * copies of the Software, and to permit persons to whom the Software is
33 * furnished to do so, subject to the following conditions:
34 *
35 * The above copyright notice and this permission notice shall be included in
36 * all copies or substantial portions of the Software.
37 *
38 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
39 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
40 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
41 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
42 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
43 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
44 * THE SOFTWARE.
45 */
46 package com.sun.xml.internal.rngom.binary;
47
48 import com.sun.xml.internal.rngom.nc.NameClass;
49 import org.relaxng.datatype.Datatype;
50 import org.xml.sax.Locator;
51
52 public class SchemaPatternBuilder extends PatternBuilder {
53 private boolean idTypes;
54 private final Pattern unexpandedNotAllowed =
55 new NotAllowedPattern() {
56 @Override
57 boolean isNotAllowed() {
58 return false;
59 }
60 @Override
61 Pattern expand(SchemaPatternBuilder b) {
62 return b.makeNotAllowed();
63 }
64 };
65
66 private final TextPattern text = new TextPattern();
67 private final PatternInterner schemaInterner = new PatternInterner();
68
69 public SchemaPatternBuilder() { }
70
71 public boolean hasIdTypes() {
72 return idTypes;
73 }
74
75 Pattern makeElement(NameClass nameClass, Pattern content, Locator loc) {
76 Pattern p = new ElementPattern(nameClass, content, loc);
77 return schemaInterner.intern(p);
78 }
79
80 Pattern makeAttribute(NameClass nameClass, Pattern value, Locator loc) {
89 Pattern p = new DataPattern(dt);
90 return schemaInterner.intern(p);
91 }
92
93 Pattern makeDataExcept(Datatype dt, Pattern except, Locator loc) {
94 noteDatatype(dt);
95 Pattern p = new DataExceptPattern(dt, except, loc);
96 return schemaInterner.intern(p);
97 }
98
99 Pattern makeValue(Datatype dt, Object obj) {
100 noteDatatype(dt);
101 Pattern p = new ValuePattern(dt, obj);
102 return schemaInterner.intern(p);
103 }
104
105 Pattern makeText() {
106 return text;
107 }
108
109 @Override
110 Pattern makeOneOrMore(Pattern p) {
111 if (p == text)
112 return p;
113 return super.makeOneOrMore(p);
114 }
115
116 Pattern makeUnexpandedNotAllowed() {
117 return unexpandedNotAllowed;
118 }
119
120 Pattern makeError() {
121 Pattern p = new ErrorPattern();
122 return schemaInterner.intern(p);
123 }
124
125 @Override
126 Pattern makeChoice(Pattern p1, Pattern p2) {
127 if (p1 == notAllowed || p1 == p2)
128 return p2;
129 if (p2 == notAllowed)
130 return p1;
131 return super.makeChoice(p1, p2);
132 }
133
134 Pattern makeList(Pattern p, Locator loc) {
135 if (p == notAllowed)
136 return p;
137 Pattern p1 = new ListPattern(p, loc);
138 return schemaInterner.intern(p1);
139 }
140
141 Pattern makeMixed(Pattern p) {
142 return makeInterleave(text, p);
143 }
144
145 private void noteDatatype(Datatype dt) {
|
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package com.sun.xml.internal.rngom.binary;
27
28 import com.sun.xml.internal.rngom.nc.NameClass;
29 import org.relaxng.datatype.Datatype;
30 import org.xml.sax.Locator;
31
32 public class SchemaPatternBuilder extends PatternBuilder {
33 private boolean idTypes;
34 private final Pattern unexpandedNotAllowed =
35 new NotAllowedPattern() {
36 boolean isNotAllowed() {
37 return false;
38 }
39 Pattern expand(SchemaPatternBuilder b) {
40 return b.makeNotAllowed();
41 }
42 };
43
44 private final TextPattern text = new TextPattern();
45 private final PatternInterner schemaInterner = new PatternInterner();
46
47 public SchemaPatternBuilder() { }
48
49 public boolean hasIdTypes() {
50 return idTypes;
51 }
52
53 Pattern makeElement(NameClass nameClass, Pattern content, Locator loc) {
54 Pattern p = new ElementPattern(nameClass, content, loc);
55 return schemaInterner.intern(p);
56 }
57
58 Pattern makeAttribute(NameClass nameClass, Pattern value, Locator loc) {
67 Pattern p = new DataPattern(dt);
68 return schemaInterner.intern(p);
69 }
70
71 Pattern makeDataExcept(Datatype dt, Pattern except, Locator loc) {
72 noteDatatype(dt);
73 Pattern p = new DataExceptPattern(dt, except, loc);
74 return schemaInterner.intern(p);
75 }
76
77 Pattern makeValue(Datatype dt, Object obj) {
78 noteDatatype(dt);
79 Pattern p = new ValuePattern(dt, obj);
80 return schemaInterner.intern(p);
81 }
82
83 Pattern makeText() {
84 return text;
85 }
86
87 Pattern makeOneOrMore(Pattern p) {
88 if (p == text)
89 return p;
90 return super.makeOneOrMore(p);
91 }
92
93 Pattern makeUnexpandedNotAllowed() {
94 return unexpandedNotAllowed;
95 }
96
97 Pattern makeError() {
98 Pattern p = new ErrorPattern();
99 return schemaInterner.intern(p);
100 }
101
102 Pattern makeChoice(Pattern p1, Pattern p2) {
103 if (p1 == notAllowed || p1 == p2)
104 return p2;
105 if (p2 == notAllowed)
106 return p1;
107 return super.makeChoice(p1, p2);
108 }
109
110 Pattern makeList(Pattern p, Locator loc) {
111 if (p == notAllowed)
112 return p;
113 Pattern p1 = new ListPattern(p, loc);
114 return schemaInterner.intern(p1);
115 }
116
117 Pattern makeMixed(Pattern p) {
118 return makeInterleave(text, p);
119 }
120
121 private void noteDatatype(Datatype dt) {
|