From: Chris H. <ch...@op...> - 2003-11-03 18:24:25
|
Sorry about the errors. Transformer is relatively new - I built it to replace some hacky gml generation in GeoServer, but still haven't gotten over to really testing it and moving it over. That should happen over the next few weeks though. I just got it working enough to look like gml, hadn't gotten around to namespaces and whatnot. As for gml reading code - yeah, it's been neglected, as we would like to redo the gml module, but it's going to take a concerted effort, and we haven't yet figured out when to tackle it. GMLDataSource in particular is in a sorry state, as you noticed from the buried exceptions. The other classes get some use, in GeoServer, but we don't use GMLDataSource, as it's just not quite up to snuff. If you would like to work on better error handling and reporting, that would be greatly appreciated, since I'm not sure when we will get around to redoing gml. It probably isn't worth it to put in huge amounts of work, but nice sanity checks and reporting shouldn't change too much. I'll be working some on FeatureTransformer over the next week or two, so if you put changes into that just let me know. Email me if you have more questions. And you can also send patches to me and I should be fairly quick about getting them into cvs. thanks, Chris On Mon, 3 Nov 2003, Theodore Vaida wrote: > I am encountering a problem trying to read in streams generated by the > GML FeatureTransformer code. > > Here's the process: > > On the server (jakarta-tomcat servlet) I grab the data from a Postgis > database and convert it to an XML stream: > > System.setProperty("javax.xml.transform.TransformerFactory", > "org.apache.xalan.processor.TransformerFactoryImpl"); > FeatureTransformer fr = new FeatureTransformer(); > fr.setDefaultNamespace("http://www.w3.org/2000/10/XMLSchema"); > // note the setDefaultNamespace() appears to have absolutely no > effect whatsoever on the > // resulting XML code > fr.setPrettyPrint(true); > > PostgisDataSource pgData = new PostgisDataSource(dbConnection,dbName); > {snip boring filter creation} > DefaultQuery boxQuery = new > DefaultQuery(boxFilter); FeatureCollection requestedLayer = > pgData.getFeatures(boxQuery); > > response.setContentType("text/xml"); > OutputStream out = response.getOutputStream(); > fr.transform(requestedLayer, out); > out.flush(); > > > However the resulting XML stream header looks like this: > > <?xml version="1.0" encoding="UTF-8"?> > <wfs:featureCollection xmlns="" xmlns:wfs="http://www.opengis.net/wfs"> > <gml:featureMember> > <upolitical fid="upolitical.65069"> > <gid>1532</gid> > {snip} > > As you can see the default namespace is left blank, which should not be > a major issue however when the client system attempts to marshal this > XML stream through the SAX parser (Xerces-J-1.2 apparently based on > libraries mandated in the JTS classpath) the following error occurs: > > {logger output to console} > INFO: created datasource > org.geotools.data.DataSourceException: Parsing error: > java.lang.NullPointerException > at org.geotools.data.gml.GMLDataSource.parse(GMLDataSource.java:404) > at > org.geotools.data.gml.GMLDataSource.getFeatures(GMLDataSource.java:240) > at > org.geotools.data.gml.GMLDataSource.getFeatures(GMLDataSource.java:182) > at > org.geotools.data.gml.GMLDataSource.getFeatures(GMLDataSource.java:205) > at com.contrailservices.TrackerMain.main(TrackerMain.java:241) > > > The code where this error is occurring is: > URL urbanLayerURL = new URL(urlString); > DataSource urbanLayerSource = new GMLDataSource(urbanLayerURL); > log.info("created datasource"); > FeatureCollection urbanLayerFeatures = > urbanLayerSource.getFeatures(Query.ALL); > > > Now digging deeply through the debugger and tracing execution provides > the following true source of the exception: > > Class: org.geotools.gml.GMLFilterDocument > Method: > public void startElement(String namespaceURI, String localName, > String qName, org.xml.sax.Attributes atts) throws SAXException { > LOGGER.entering("GMLFilterDocument", "startElement", > new Object[] { namespaceURI, localName, qName, atts }); > > /* if at a GML element, do some checks to determine > * how to handle the element > */ > if (namespaceURI.equals(GML_NAMESPACE)) { > {snip} > > Looking at this code it is obvious that no argument/sanity checking has > been performed - the debugger shows clearly that the SAX parser is > passing a null value for the namespaceURI argument and when the if() > conditional is executed the NullPointerException is thrown. > > Worse (although understandable) is that the enclosing code in the > GMLDatasource manages to handily bury the error reporting functions of > the SAX parser so the user has no way of telling if this is a SAX > parser bug (due to a mishandled issue with a non validated XML file) or > a problem in the geotools code. > > I have as yet not attempted to try any hacks to the code however I > would be willing to work on solving this issue (on both server and > client end) if the owner/maintainer of this section is willing and has > any suggestions. > > Even if this is a server side misconfiguration I think it would be a > reasonably civil thing to improve the error handling and sanity > checking in the XML parser bits. > > > Feel free to carp if I have missed a README file somewhere and thanks > much for the otherwise great toolkit all! > > > > ------------------------------------------------------- > This SF.net email is sponsored by: SF.net Giveback Program. > Does SourceForge.net help you be more productive? Does it > help you create better code? SHARE THE LOVE, and help us help > YOU! Click Here: http://sourceforge.net/donate/ > _______________________________________________ > Geotools-devel mailing list > Geo...@li... > https://lists.sourceforge.net/lists/listinfo/geotools-devel > -- |