From: Andrea A. <and...@ge...> - 2010-10-04 17:52:05
|
On Mon, Oct 4, 2010 at 7:26 PM, Andrea Aime <and...@ge...> wrote: > Hi, > I'm trying to use app-schema with a target schema that, unfortunately, > uses a DirectPosition as > the feature "geometry". I don't have any control over the schema so I > have to try and make it work > anyways. > > What I get overall is that my points are turned into their WKT > representation when the > GML encoding happens. Which is not what I want. > > Looking a bit more deeply I see that the attribute is correctly bound > to DirectPosition: > ComplexTypeImpl http://www.opengis.net/gml:DirectPositionType extends > doubleList(axisLabels:NCNameList,srsDimension:positiveInteger,srsName:anyURI,uomLabels:NCNameList) > but nowhere in the code there is an attempt to use converters to turn > the JTS Point into a DirectPosition. > > Now, I tracked down the issue to XPath.convertValue: > > private Object convertValue(final AttributeDescriptor descriptor, > final Object value) { > final AttributeType type = descriptor.getType(); > Class<?> binding = type.getBinding(); > > if (type instanceof ComplexType && binding == Collection.class) { > if (!(value instanceof Collection) && isSimpleContentType(type)) { > ArrayList<Property> list = new ArrayList<Property>(); > if (value == null && !descriptor.isNillable()) { > return list; > } > list.add(buildSimpleContent(type, value)); > return list; > } > } > if (binding == String.class && value instanceof Collection) { > // if it's a single value in a collection, strip the square brackets > String collectionString = value.toString(); > return collectionString.substring(1, collectionString.length() - 1); > } > return FF.literal(value).evaluate(value, binding); > } > > type is a complex type, but binding for some reason is exactly Collection.class, > which results in the wrong code path being chosen (the right one, imho, would > be the usage of the last line, FF.literal(value).evaluate(value, binding), which > could be expressed also as Converters.convert(value, binding)). > > Now... does anybody know why the binding ends up being a collection instead > of org.opengis.geometry.DirectPosition? > I still haven't quite tracked down where the bindings are built... Ok, tracked it down. The GMLSchema class contains the definitions of many gml foundation types, for point the definition is: public static final AttributeType POINTTYPE_TYPE = build_POINTTYPE_TYPE(); private static AttributeType build_POINTTYPE_TYPE() { AttributeType builtType; builtType = new AttributeTypeImpl( new NameImpl("http://www.opengis.net/gml","PointType"), com.vividsolutions.jts.geom.Point.class, false, false, Collections.<Filter>emptyList(), ABSTRACTGEOMETRICPRIMITIVETYPE_TYPE, null ); return builtType; } Notice the direct binding to Point.class. But for DirectPosition it is: public static final ComplexType DIRECTPOSITIONTYPE_TYPE = build_DIRECTPOSITIONTYPE_TYPE(); private static ComplexType build_DIRECTPOSITIONTYPE_TYPE() { ComplexType builtType; List<PropertyDescriptor> schema = new ArrayList<PropertyDescriptor>(); schema.add( new AttributeDescriptorImpl( NCNAMELIST_TYPE, new NameImpl("http://www.opengis.net/gml","axisLabels"), 0, 1, true, null ) ); schema.add( new AttributeDescriptorImpl( XSSchema.POSITIVEINTEGER_TYPE, new NameImpl("http://www.opengis.net/gml","srsDimension"), 0, 1, true, null ) ); schema.add( new AttributeDescriptorImpl( XSSchema.ANYURI_TYPE, new NameImpl("http://www.opengis.net/gml","srsName"), 0, 1, true, null ) ); schema.add( new AttributeDescriptorImpl( NCNAMELIST_TYPE, new NameImpl("http://www.opengis.net/gml","uomLabels"), 0, 1, true, null ) ); builtType = new ComplexTypeImpl( new NameImpl("http://www.opengis.net/gml","DirectPositionType"), schema, false, false, Collections.<Filter>emptyList(), DOUBLELIST_TYPE, null ); return builtType; } That is, it's built as a complex type, and all complex types bind to Collection.class (that's inside the ComplexTypeImpl constructor). The change I'm tempted to perform is to make the direct position bound to a opengis DirectPosition instead. It would contain the ordinates and the crs, but not the other attributes... And then make a converter between Point and DirectPosition... the DirectPositionTypeBinding is actually already there and should work Thoughts? Cheers Andrea ----------------------------------------------------- Ing. Andrea Aime Senior Software Engineer GeoSolutions S.A.S. Via Poggio alle Viti 1187 55054 Massarosa (LU) Italy phone: +39 0584962313 fax: +39 0584962313 http://www.geo-solutions.it http://geo-solutions.blogspot.com/ http://www.linkedin.com/in/andreaaime http://twitter.com/geowolf ----------------------------------------------------- |