package org.geotools.wfs.v1_0;
import java.util.ArrayList;
import java.util.List;
import javax.xml.namespace.NamespaceContext;
import javax.xml.namespace.QName;
import org.eclipse.emf.ecore.EObject;
import org.geotools.xs.bindings.XSQNameBinding;
import org.opengis.filter.FilterFactory;
import org.opengis.filter.expression.PropertyName;
import net.opengis.wfs.QueryType;
import net.opengis.wfs.WfsFactory;
public class QueryTypeBinding extends org.geotools.wfs.bindings.QueryTypeBinding {
FilterFactory filterFactory;
NamespaceContext namespaceContext;
public QueryTypeBinding(WfsFactory factory, FilterFactory filterFactory, NamespaceContext namespaceContext) {
super(factory);
this.filterFactory = filterFactory;
this.namespaceContext = namespaceContext;
}
@Override
public Object getProperty(Object object, QName name) throws Exception {
if ("typeName".equals(name.getLocalPart())) {
QueryType query = (QueryType) object;
if (!query.getTypeName().isEmpty()) {
//bit of a hack but handle both string and qname
Object obj = query.getTypeName().get(0);
if (obj instanceof String) {
obj = new XSQNameBinding(namespaceContext).parse(null, obj);
}
return obj;
}
return null;
}
else if ("PropertyName".equals(name.getLocalPart())) {
List l = new ArrayList();
for (String s : (List<String>)super.getProperty(object, name)) {
l.add(filterFactory.property(s));
}
return l;
}
else {
return super.getProperty(object, name);
}
}
@Override
protected void setProperty(EObject eObject, String property, Object value, boolean lax) {
if ("typeName".equals(property)) {
//in wfs 1.0 we are only allowed a singel type name
QueryType query = (QueryType)eObject;
ArrayList list = new ArrayList();
list.add(value);
query.setTypeName(list);
}
else if ("PropertyName".equals(property)) {
//in wfs 1.0 propertynames are ogc:PropertyName
PropertyName name = (PropertyName) value;
super.setProperty(eObject, property, name.getPropertyName(), lax);
}
else {
super.setProperty(eObject, property, value, lax);
}
}
}