1/*
2 * reserved comment block
3 * DO NOT REMOVE OR ALTER!
4 */
5/*
6 * Licensed to the Apache Software Foundation (ASF) under one or more
7 * contributor license agreements.  See the NOTICE file distributed with
8 * this work for additional information regarding copyright ownership.
9 * The ASF licenses this file to You under the Apache License, Version 2.0
10 * (the "License"); you may not use this file except in compliance with
11 * the License.  You may obtain a copy of the License at
12 *
13 *      http://www.apache.org/licenses/LICENSE-2.0
14 *
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
20 */
21
22package com.sun.org.apache.xerces.internal.jaxp;
23
24import java.util.HashMap;
25
26import com.sun.org.apache.xerces.internal.impl.validation.EntityState;
27import com.sun.org.apache.xerces.internal.impl.validation.ValidationManager;
28import com.sun.org.apache.xerces.internal.xni.Augmentations;
29import com.sun.org.apache.xerces.internal.xni.XMLDTDHandler;
30import com.sun.org.apache.xerces.internal.xni.XMLLocator;
31import com.sun.org.apache.xerces.internal.xni.XMLResourceIdentifier;
32import com.sun.org.apache.xerces.internal.xni.XMLString;
33import com.sun.org.apache.xerces.internal.xni.XNIException;
34import com.sun.org.apache.xerces.internal.xni.parser.XMLDTDFilter;
35import com.sun.org.apache.xerces.internal.xni.parser.XMLDTDSource;
36
37/**
38 * <p>This filter records which unparsed entities have been
39 * declared in the DTD and provides this information to a ValidationManager.
40 * Events are forwarded to the registered XMLDTDHandler without modification.</p>
41 *
42 * @author Michael Glavassevich, IBM
43 */
44final class UnparsedEntityHandler implements XMLDTDFilter, EntityState {
45
46    /** DTD source and handler. **/
47    private XMLDTDSource fDTDSource;
48    private XMLDTDHandler fDTDHandler;
49
50    /** Validation manager. */
51    private final ValidationManager fValidationManager;
52
53    /** Map for tracking unparsed entities. */
54    private HashMap fUnparsedEntities = null;
55
56    UnparsedEntityHandler(ValidationManager manager) {
57        fValidationManager = manager;
58    }
59
60    /*
61     * XMLDTDHandler methods
62     */
63
64    public void startDTD(XMLLocator locator, Augmentations augmentations)
65            throws XNIException {
66        fValidationManager.setEntityState(this);
67        if (fDTDHandler != null) {
68            fDTDHandler.startDTD(locator, augmentations);
69        }
70    }
71
72    public void startParameterEntity(String name,
73            XMLResourceIdentifier identifier, String encoding,
74            Augmentations augmentations) throws XNIException {
75        if (fDTDHandler != null) {
76            fDTDHandler.startParameterEntity(name, identifier, encoding, augmentations);
77        }
78    }
79
80    public void textDecl(String version, String encoding,
81            Augmentations augmentations) throws XNIException {
82        if (fDTDHandler != null) {
83            fDTDHandler.textDecl(version, encoding, augmentations);
84        }
85    }
86
87    public void endParameterEntity(String name, Augmentations augmentations)
88            throws XNIException {
89        if (fDTDHandler != null) {
90            fDTDHandler.endParameterEntity(name, augmentations);
91        }
92    }
93
94    public void startExternalSubset(XMLResourceIdentifier identifier,
95            Augmentations augmentations) throws XNIException {
96        if (fDTDHandler != null) {
97            fDTDHandler.startExternalSubset(identifier, augmentations);
98        }
99    }
100
101    public void endExternalSubset(Augmentations augmentations)
102            throws XNIException {
103        if (fDTDHandler != null) {
104            fDTDHandler.endExternalSubset(augmentations);
105        }
106    }
107
108    public void comment(XMLString text, Augmentations augmentations)
109            throws XNIException {
110        if (fDTDHandler != null) {
111            fDTDHandler.comment(text, augmentations);
112        }
113    }
114
115    public void processingInstruction(String target, XMLString data,
116            Augmentations augmentations) throws XNIException {
117        if (fDTDHandler != null) {
118            fDTDHandler.processingInstruction(target, data, augmentations);
119        }
120    }
121
122    public void elementDecl(String name, String contentModel,
123            Augmentations augmentations) throws XNIException {
124        if (fDTDHandler != null) {
125            fDTDHandler.elementDecl(name, contentModel, augmentations);
126        }
127    }
128
129    public void startAttlist(String elementName, Augmentations augmentations)
130            throws XNIException {
131        if (fDTDHandler != null) {
132            fDTDHandler.startAttlist(elementName, augmentations);
133        }
134    }
135
136    public void attributeDecl(String elementName, String attributeName,
137            String type, String[] enumeration, String defaultType,
138            XMLString defaultValue, XMLString nonNormalizedDefaultValue,
139            Augmentations augmentations) throws XNIException {
140        if (fDTDHandler != null) {
141            fDTDHandler.attributeDecl(elementName, attributeName,
142                    type, enumeration, defaultType,
143                    defaultValue, nonNormalizedDefaultValue,
144                    augmentations);
145        }
146    }
147
148    public void endAttlist(Augmentations augmentations) throws XNIException {
149        if (fDTDHandler != null) {
150            fDTDHandler.endAttlist(augmentations);
151        }
152    }
153
154    public void internalEntityDecl(String name, XMLString text,
155            XMLString nonNormalizedText, Augmentations augmentations)
156            throws XNIException {
157        if (fDTDHandler != null) {
158            fDTDHandler.internalEntityDecl(name, text,
159                    nonNormalizedText, augmentations);
160        }
161    }
162
163    public void externalEntityDecl(String name,
164            XMLResourceIdentifier identifier, Augmentations augmentations)
165            throws XNIException {
166        if (fDTDHandler != null) {
167            fDTDHandler.externalEntityDecl(name, identifier, augmentations);
168        }
169    }
170
171    public void unparsedEntityDecl(String name,
172            XMLResourceIdentifier identifier, String notation,
173            Augmentations augmentations) throws XNIException {
174        if (fUnparsedEntities == null) {
175            fUnparsedEntities = new HashMap();
176        }
177        fUnparsedEntities.put(name, name);
178        if (fDTDHandler != null) {
179            fDTDHandler.unparsedEntityDecl(name, identifier, notation, augmentations);
180        }
181    }
182
183    public void notationDecl(String name, XMLResourceIdentifier identifier,
184            Augmentations augmentations) throws XNIException {
185        if (fDTDHandler != null) {
186            fDTDHandler.notationDecl(name, identifier, augmentations);
187        }
188    }
189
190    public void startConditional(short type, Augmentations augmentations)
191            throws XNIException {
192        if (fDTDHandler != null) {
193            fDTDHandler.startConditional(type, augmentations);
194        }
195    }
196
197    public void ignoredCharacters(XMLString text, Augmentations augmentations)
198            throws XNIException {
199        if (fDTDHandler != null) {
200            fDTDHandler.ignoredCharacters(text, augmentations);
201        }
202
203    }
204
205    public void endConditional(Augmentations augmentations) throws XNIException {
206        if (fDTDHandler != null) {
207            fDTDHandler.endConditional(augmentations);
208        }
209    }
210
211    public void endDTD(Augmentations augmentations) throws XNIException {
212        if (fDTDHandler != null) {
213            fDTDHandler.endDTD(augmentations);
214        }
215    }
216
217    public void setDTDSource(XMLDTDSource source) {
218        fDTDSource = source;
219    }
220
221    public XMLDTDSource getDTDSource() {
222        return fDTDSource;
223    }
224
225    /*
226     * XMLDTDSource methods
227     */
228
229    public void setDTDHandler(XMLDTDHandler handler) {
230        fDTDHandler = handler;
231    }
232
233    public XMLDTDHandler getDTDHandler() {
234        return fDTDHandler;
235    }
236
237    /*
238     * EntityState methods
239     */
240
241    public boolean isEntityDeclared(String name) {
242        return false;
243    }
244
245    public boolean isEntityUnparsed(String name) {
246        if (fUnparsedEntities != null) {
247            return fUnparsedEntities.containsKey(name);
248        }
249        return false;
250    }
251
252    /*
253     * Other methods
254     */
255
256    public void reset() {
257        if (fUnparsedEntities != null && !fUnparsedEntities.isEmpty()) {
258            // should only clear this if the last document contained unparsed entities
259            fUnparsedEntities.clear();
260        }
261    }
262}
263