/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2004-2008, Open Source Geospatial Foundation (OSGeo) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package org.geotools.data.wfs.v1_0_0; import java.net.URI; import org.geotools.ows.ServiceException; import org.geotools.xml.SchemaFactory; import org.geotools.xml.XSIElementHandler; import org.geotools.xml.XSISAXHandler; import org.geotools.xml.filter.FilterSchema; import org.geotools.xml.handlers.xsi.RootHandler; import org.geotools.xml.schema.Schema; import org.xml.sax.Attributes; import org.xml.sax.SAXException; /** * <p> * DOCUMENT ME! * </p> * * @author dzwiers * * * @source $URL$ */ public class WFSSchemaFactory extends SchemaFactory { // HACK for setting up the static field to use. protected WFSSchemaFactory() { is = this; } protected XSISAXHandler getSAXHandler(URI uri) { return new WFSXSISAXHandler(uri); } protected static class WFSXSISAXHandler extends XSISAXHandler { /** * * @param uri */ public WFSXSISAXHandler(URI uri) { super(uri); rootHandler = new WFSRootHandler(uri); } } protected static class WFSRootHandler extends RootHandler { /** * Comment for <code>serialVersionUID</code> */ private static final long serialVersionUID = "org.geotools.data.wfs.WFSSchemaFactory.WFSRootHandler".hashCode(); private ServiceExceptionReportHandler se = null; /** * * @param uri */ public WFSRootHandler(URI uri) { super(uri); } /** * * @see org.geotools.xml.XSIElementHandler#getHandler(java.lang.String, java.lang.String) */ public XSIElementHandler getHandler(String namespaceURI, String localName){ XSIElementHandler r = null; r = super.getHandler(namespaceURI, localName); if (r != null) { return r; } if ("ServiceExceptionReport".equalsIgnoreCase(localName) && FilterSchema.NAMESPACE.toString().equalsIgnoreCase(namespaceURI)) { // FilterSchema.getInstance().getElements()[37] // ServiceException if (se == null) { se = new ServiceExceptionReportHandler(); } return se; } return null; } /** * * @see org.geotools.xml.handlers.xsi.RootHandler#getSchema() */ public Schema getSchema() throws SAXException { if (se != null) { if (se.getException() != null) { throw se.getException(); } } return super.getSchema(); } } private static class ServiceExceptionReportHandler extends XSIElementHandler { /** * Comment for <code>serialVersionUID</code> */ private static final long serialVersionUID = "org.geotools.data.wfs.WFSSchemaFactory.ServiceExceptionReportHandler".hashCode(); private ServiceException exception; private boolean inside = false; /** * @see org.geotools.xml.XSIElementHandler#getHandlerType() */ public int getHandlerType() { return DEFAULT; } protected ServiceException getException() { return exception; } /** * @see org.geotools.xml.XSIElementHandler#endElement(java.lang.String, * java.lang.String) */ public void endElement(String namespaceURI, String localName){ inside = false; } /** * @see org.geotools.xml.XSIElementHandler#startElement(java.lang.String, * java.lang.String, org.xml.sax.Attributes) */ public void startElement(String namespaceURI, String localName, Attributes attr){ if ("ServiceException".equalsIgnoreCase(localName)) { inside = true; if (attr != null) { String locator = attr.getValue("", "locator"); if (locator == null) { locator = attr.getValue(namespaceURI, "locator"); } String code = attr.getValue("", "code"); if (code == null) { code = attr.getValue(namespaceURI, "code"); } exception = new ServiceException("", code, locator); } } } /** * @see org.geotools.xml.XSIElementHandler#characters(java.lang.String) */ public void characters(String text){ if (inside) { exception = new ServiceException(text, exception.getCode(), exception.getLocator()); } } /** * @see org.geotools.xml.XSIElementHandler#getHandler(java.lang.String, * java.lang.String) */ public XSIElementHandler getHandler(String namespaceURI, String localName){ if ("ServiceException".equalsIgnoreCase(localName) && FilterSchema.NAMESPACE.toString().equalsIgnoreCase(namespaceURI)) { return this; } return null; } /** * @see org.geotools.xml.XSIElementHandler#getLocalName() */ public String getLocalName() { // TODO Auto-generated method stub return null; } /** * @see org.geotools.xml.XSIElementHandler#hashCode() */ public int hashCode() { // TODO Auto-generated method stub return 0; } } }