com.vividsolutions.jts.io.gml2.GMLHandler Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of JTSplus Show documentation
Show all versions of JTSplus Show documentation
JTS Topology Suite 1.14 with additional functions for GeoSpark
/*
* The JTS Topology Suite is a collection of Java classes that
* implement the fundamental operations required to validate a given
* geo-spatial data set to a known topological specification.
*
* Copyright (C) 2001 Vivid Solutions
*
* 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; either
* version 2.1 of the License, or (at your option) any later version.
*
* 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.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* For more information, contact:
*
* Vivid Solutions
* Suite #1A
* 2328 Government Street
* Victoria BC V8T 5G5
* Canada
*
* (250)385-6040
* www.vividsolutions.com
*/
package com.vividsolutions.jts.io.gml2;
import java.util.*;
import org.xml.sax.*;
import org.xml.sax.helpers.AttributesImpl;
import org.xml.sax.helpers.DefaultHandler;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.io.gml2.GeometryStrategies.ParseStrategy;
/**
* A SAX {@link DefaultHandler} which builds {@link Geometry}s
* from GML2-formatted geometries.
* An XML parser can delegate SAX events to this handler
* to parse and building Geometrys.
*
* This handler currently ignores both namespaces and prefixes.
*
* Hints:
*
* - If your parent handler is a DefaultHandler register the parent handler to receive the errors and locator calls.
*
- Use {@link GeometryStrategies#findStrategy(String, String)} to help check for applicability
*
*
* @see DefaultHandler
*
* @author David Zwiers, Vivid Solutions.
*/
public class GMLHandler extends DefaultHandler {
/**
* This class is intended to log the SAX acitivity within a given element until its termination.
* At this time, a new object of value is created and passed to the parent.
* An object of value is typically either java.lang.* or a JTS Geometry
* This class is not intended for use outside this distribution,
* and may change in subsequent versions.
*
* @author David Zwiers, Vivid Solutions.
*/
static class Handler {
protected Attributes attrs = null;
protected ParseStrategy strategy;
/**
* @param strategy
* @param attributes Nullable
*/
public Handler(ParseStrategy strategy, Attributes attributes) {
if (attributes != null)
this.attrs = new AttributesImpl(attributes);
this.strategy = strategy;
}
protected StringBuffer text = null;
/**
* Caches text for the future
* @param str
*/
public void addText(String str) {
if (text == null)
text = new StringBuffer();
text.append(str);
}
protected List children = null;
/**
* Store param for the future
*
* @param obj
*/
public void keep(Object obj) {
if (children == null)
children = new LinkedList();
children.add(obj);
}
/**
* @param gf GeometryFactory
* @return Parsed Object
* @throws SAXException
*/
public Object create(GeometryFactory gf) throws SAXException {
return strategy.parse(this, gf);
}
}
private Stack stack = new Stack();
private ErrorHandler delegate = null;
private GeometryFactory gf = null;
/**
* Creates a new handler.
* Allows the user to specify a delegate object for error / warning messages.
* If the delegate also implements ContentHandler then the document Locator will be passed on.
*
* @param gf Geometry Factory
* @param delegate Nullable
*
* @see ErrorHandler
* @see ContentHandler
* @see ContentHandler#setDocumentLocator(org.xml.sax.Locator)
* @see org.xml.sax.Locator
*
*/
public GMLHandler(GeometryFactory gf, ErrorHandler delegate) {
this.delegate = delegate;
this.gf = gf;
stack.push(new Handler(null, null));
}
/**
* Tests whether this handler has completed parsing
* a geometry.
* If this is the case, {@link #getGeometry()} can be called
* to get the value of the parsed geometry.
*
* @return if the parsing of the geometry is complete
*/
public boolean isGeometryComplete()
{
if (stack.size() > 1)
return false;
// top level node on stack needs to have at least one child
Handler h = (Handler) stack.peek();
if (h.children.size() < 1)
return false;
return true;
}
/**
* Gets the geometry parsed by this handler.
* This method should only be called AFTER the parser has completed execution
*
* @return the parsed Geometry, or a GeometryCollection if more than one geometry was parsed
* @throws IllegalStateException if called before the parse is complete
*/
public Geometry getGeometry() {
if (stack.size() == 1) {
Handler h = (Handler) stack.peek();
if (h.children.size() == 1)
return (Geometry) h.children.get(0);
return gf.createGeometryCollection(
(Geometry[]) h.children.toArray(new Geometry[stack.size()]));
}
throw new IllegalStateException(
"Parse did not complete as expected, there are " + stack.size()
+ " elements on the Stack");
}
//////////////////////////////////////////////
// Parsing Methods
/**
* @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int)
*/
public void characters(char[] ch, int start, int length) throws SAXException {
if (!stack.isEmpty())
((Handler) stack.peek()).addText(new String(ch, start, length));
}
/**
* @see org.xml.sax.helpers.DefaultHandler#ignorableWhitespace(char[], int, int)
*/
public void ignorableWhitespace(char[] ch, int start, int length)
throws SAXException {
if (!stack.isEmpty())
((Handler) stack.peek()).addText(" ");
}
/**
* @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
*/
public void endElement(String uri, String localName, String qName)
throws SAXException {
Handler thisAction = (Handler) stack.pop();
((Handler) stack.peek()).keep(thisAction.create(gf));
}
/**
* @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
*/
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
// create a handler
ParseStrategy ps = GeometryStrategies.findStrategy(uri, localName);
if (ps == null) {
String qn = qName.substring(qName.indexOf(':') + 1, qName.length());
ps = GeometryStrategies.findStrategy(null, qn);
}
Handler h = new Handler(ps, attributes);
// and add it to the stack
stack.push(h);
}
//////////////////////////////////////////////
// Logging Methods
/**
* @see org.xml.sax.helpers.DefaultHandler#setDocumentLocator(org.xml.sax.Locator)
*/
public void setDocumentLocator(Locator locator) {
this.locator = locator;
if (delegate != null && delegate instanceof ContentHandler)
((ContentHandler) delegate).setDocumentLocator(locator);
}
private Locator locator = null;
protected Locator getDocumentLocator() {
return locator;
}
//////////////////////////////////////////////
// ERROR Methods
/**
* @see org.xml.sax.helpers.DefaultHandler#fatalError(org.xml.sax.SAXParseException)
*/
public void fatalError(SAXParseException e) throws SAXException {
if (delegate != null)
delegate.fatalError(e);
else
super.fatalError(e);
}
/**
* @see org.xml.sax.helpers.DefaultHandler#error(org.xml.sax.SAXParseException)
*/
public void error(SAXParseException e) throws SAXException {
if (delegate != null)
delegate.error(e);
else
super.error(e);
}
/**
* @see org.xml.sax.helpers.DefaultHandler#warning(org.xml.sax.SAXParseException)
*/
public void warning(SAXParseException e) throws SAXException {
if (delegate != null)
delegate.warning(e);
else
super.warning(e);
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy