/* (c) 2014 Open Source Geospatial Foundation - all rights reserved * (c) 2001 - 2013 OpenPlans * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.wfs.xml.filter.v1_1; import org.geoserver.catalog.Catalog; import org.geoserver.wfs.WFSException; import org.geotools.filter.v1_0.OGCPropertyNameTypeBinding; import org.geotools.gml3.GML; import org.geotools.xml.ElementInstance; import org.geotools.xml.Node; import org.opengis.filter.FilterFactory; import org.opengis.filter.FilterFactory2; import org.opengis.filter.expression.PropertyName; import org.xml.sax.helpers.NamespaceSupport; /** * A binding for ogc:PropertyName which does a special case check for an empty * property name and adds namespace support. * * @author Justin Deoliveira, The Open Planning Project * */ public class PropertyNameTypeBinding extends OGCPropertyNameTypeBinding { /** the geoserver catalog */ Catalog catalog; /** parser namespace mappings */ NamespaceSupport namespaceSupport; public PropertyNameTypeBinding(FilterFactory filterFactory, NamespaceSupport namespaceSupport, Catalog catalog) { super(filterFactory); this.namespaceSupport = namespaceSupport; this.catalog = catalog; } public Object parse(ElementInstance instance, Node node, Object value) throws Exception { PropertyName propertyName = (PropertyName) super.parse(instance, node, value); //JD: temporary hack, this should be carried out at evaluation time String name = propertyName.getPropertyName(); if (name != null && name.matches("\\w+:\\w+")) { //namespace qualified name, ensure the prefix is valid String prefix = name.substring(0, name.indexOf(':')); String namespaceURI = namespaceSupport.getURI(prefix); //only accept if its an application schema namespace, or gml if (!GML.NAMESPACE.equals(namespaceURI) && (catalog.getNamespaceByURI(namespaceURI) == null)) { throw new WFSException("Illegal attribute namespace: " + namespaceURI); } } if (factory instanceof FilterFactory2) { return ((FilterFactory2) factory).property(propertyName.getPropertyName(), namespaceSupport); } return propertyName; } }