1 /* 2 * reserved comment block 3 * DO NOT REMOVE OR ALTER! 4 */ 5 // ExtendedXMLCatalogReader.java - Read XML Catalog files 6 7 /* 8 * Copyright 2001-2004 The Apache Software Foundation or its licensors, 9 * as applicable. 10 * 11 * Licensed under the Apache License, Version 2.0 (the "License"); 12 * you may not use this file except in compliance with the License. 13 * You may obtain a copy of the License at 14 * 15 * http://www.apache.org/licenses/LICENSE-2.0 16 * 17 * Unless required by applicable law or agreed to in writing, software 18 * distributed under the License is distributed on an "AS IS" BASIS, 19 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 20 * See the License for the specific language governing permissions and 21 * limitations under the License. 22 */ 23 24 package com.sun.org.apache.xml.internal.resolver.readers; 25 26 import java.util.Vector; 27 import com.sun.org.apache.xml.internal.resolver.Catalog; 28 import com.sun.org.apache.xml.internal.resolver.Resolver; 29 import com.sun.org.apache.xml.internal.resolver.CatalogEntry; 30 import com.sun.org.apache.xml.internal.resolver.CatalogException; 31 32 import org.xml.sax.*; 33 import org.w3c.dom.*; 34 35 /** 36 * Parse Extended OASIS Entity Resolution Technical Committee 37 * XML Catalog files. 38 * 39 * @see Catalog 40 * 41 * @author Norman Walsh 42 * <a href="mailto:Norman.Walsh@Sun.COM">Norman.Walsh@Sun.COM</a> 43 * 44 */ 45 public class ExtendedXMLCatalogReader extends OASISXMLCatalogReader { 46 /** The namespace name of extended catalog elements */ 47 public static final String extendedNamespaceName = "http://nwalsh.com/xcatalog/1.0"; 48 49 /** 50 * The SAX <code>startElement</code> method recognizes elements 51 * from the plain catalog format and instantiates CatalogEntry 52 * objects for them. 53 * 54 * @param namespaceURI The namespace name of the element. 55 * @param localName The local name of the element. 56 * @param qName The QName of the element. 57 * @param atts The list of attributes on the element. 58 * 59 * @see CatalogEntry 60 */ 61 public void startElement (String namespaceURI, 62 String localName, 63 String qName, 64 Attributes atts) 65 throws SAXException { 66 67 // Check before calling the super because super will report our 68 // namespace as an extension namespace, but that doesn't count 69 // for this element. 70 boolean inExtension = inExtensionNamespace(); 71 72 super.startElement(namespaceURI, localName, qName, atts); 73 74 int entryType = -1; 75 Vector entryArgs = new Vector(); 76 77 if (namespaceURI != null && extendedNamespaceName.equals(namespaceURI) 78 && !inExtension) { 79 // This is an Extended XML Catalog entry 80 81 if (atts.getValue("xml:base") != null) { 82 String baseURI = atts.getValue("xml:base"); 83 entryType = Catalog.BASE; 84 entryArgs.add(baseURI); 85 baseURIStack.push(baseURI); 86 87 debug.message(4, "xml:base", baseURI); 88 89 try { 90 CatalogEntry ce = new CatalogEntry(entryType, entryArgs); 91 catalog.addEntry(ce); 92 } catch (CatalogException cex) { 93 if (cex.getExceptionType() == CatalogException.INVALID_ENTRY_TYPE) { 94 debug.message(1, "Invalid catalog entry type", localName); 95 } else if (cex.getExceptionType() == CatalogException.INVALID_ENTRY) { 96 debug.message(1, "Invalid catalog entry (base)", localName); 97 } 98 } 99 100 entryType = -1; 101 entryArgs = new Vector(); 102 } else { 103 baseURIStack.push(baseURIStack.peek()); 104 } 105 106 if (localName.equals("uriSuffix")) { 107 if (checkAttributes(atts, "suffix", "uri")) { 108 entryType = Resolver.URISUFFIX; 109 entryArgs.add(atts.getValue("suffix")); 110 entryArgs.add(atts.getValue("uri")); 111 112 debug.message(4, "uriSuffix", 113 atts.getValue("suffix"), 114 atts.getValue("uri")); 115 } 116 } else if (localName.equals("systemSuffix")) { 117 if (checkAttributes(atts, "suffix", "uri")) { 118 entryType = Resolver.SYSTEMSUFFIX; 119 entryArgs.add(atts.getValue("suffix")); 120 entryArgs.add(atts.getValue("uri")); 121 122 debug.message(4, "systemSuffix", 123 atts.getValue("suffix"), 124 atts.getValue("uri")); 125 } 126 } else { 127 // This is equivalent to an invalid catalog entry type 128 debug.message(1, "Invalid catalog entry type", localName); 129 } 130 131 if (entryType >= 0) { 132 try { 133 CatalogEntry ce = new CatalogEntry(entryType, entryArgs); 134 catalog.addEntry(ce); 135 } catch (CatalogException cex) { 136 if (cex.getExceptionType() == CatalogException.INVALID_ENTRY_TYPE) { 137 debug.message(1, "Invalid catalog entry type", localName); 138 } else if (cex.getExceptionType() == CatalogException.INVALID_ENTRY) { 139 debug.message(1, "Invalid catalog entry", localName); 140 } 141 } 142 } 143 } 144 } 145 146 /** The SAX <code>endElement</code> method does nothing. */ 147 public void endElement (String namespaceURI, 148 String localName, 149 String qName) 150 throws SAXException { 151 152 super.endElement(namespaceURI, localName, qName); 153 154 // Check after popping the stack so we don't erroneously think we 155 // are our own extension namespace... 156 boolean inExtension = inExtensionNamespace(); 157 158 int entryType = -1; 159 Vector entryArgs = new Vector(); 160 161 if (namespaceURI != null 162 && (extendedNamespaceName.equals(namespaceURI)) 163 && !inExtension) { 164 165 String popURI = (String) baseURIStack.pop(); 166 String baseURI = (String) baseURIStack.peek(); 167 168 if (!baseURI.equals(popURI)) { 169 entryType = catalog.BASE; 170 entryArgs.add(baseURI); 171 172 debug.message(4, "(reset) xml:base", baseURI); 173 174 try { 175 CatalogEntry ce = new CatalogEntry(entryType, entryArgs); 176 catalog.addEntry(ce); 177 } catch (CatalogException cex) { 178 if (cex.getExceptionType() == CatalogException.INVALID_ENTRY_TYPE) { 179 debug.message(1, "Invalid catalog entry type", localName); 180 } else if (cex.getExceptionType() == CatalogException.INVALID_ENTRY) { 181 debug.message(1, "Invalid catalog entry (rbase)", localName); 182 } 183 } 184 } 185 } 186 } 187 }