/* (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.request;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import net.opengis.wfs.GetFeatureType;
import net.opengis.wfs.GetFeatureWithLockType;
import net.opengis.wfs.ResultTypeType;
import net.opengis.wfs.WfsFactory;
import net.opengis.wfs20.ResolveValueType;
import net.opengis.wfs20.Wfs20Factory;
import org.eclipse.emf.ecore.EObject;
import org.geotools.xml.EMFUtils;
/**
* WFS GetFeature request.
*
* @author Justin Deoliveira, OpenGeo
*/
public abstract class GetFeatureRequest extends RequestObject {
public static GetFeatureRequest adapt(Object request) {
if (request instanceof GetFeatureType) {
return new WFS11((EObject) request);
}
else if (request instanceof net.opengis.wfs20.GetFeatureType) {
return new WFS20((EObject) request);
}
return null;
}
protected GetFeatureRequest(EObject adaptee) {
super(adaptee);
}
public BigInteger getStartIndex() {
return eGet(adaptee, "startIndex", BigInteger.class);
}
public List<Map<String,String>> getViewParams() {
return eGet(adaptee, "viewParams", List.class);
}
public void setViewParams(List<Map<String,String>> viewParams) {
List l = eGet(adaptee, "viewParams", List.class);
l.clear();
l.addAll(viewParams);
List check = eGet(adaptee, "viewParams", List.class);
}
public abstract List<Query> getQueries();
public abstract List<Object> getAdaptedQueries();
public abstract boolean isQueryTypeNamesUnset();
public abstract BigInteger getMaxFeatures();
public abstract void setMaxFeatures(BigInteger maxFeatures);
public abstract String getTraverseXlinkDepth();
public abstract boolean isResultTypeResults();
public abstract boolean isResultTypeHits();
public abstract boolean isLockRequest();
public abstract Query createQuery();
public abstract LockFeatureRequest createLockRequest();
public abstract FeatureCollectionResponse createResponse();
public abstract ResolveValueType getResolve();
public abstract BigInteger getResolveTimeOut();
//
// GetFeatureWithLock
//
public BigInteger getExpiry() {
return eGet(adaptee, "expiry", BigInteger.class);
}
public void setExpiry(BigInteger expiry) {
eSet(adaptee, "expiry", expiry);
}
public static class WFS11 extends GetFeatureRequest {
public WFS11(EObject adaptee) {
super(adaptee);
}
@Override
public List<Query> getQueries() {
//TODO: instead of creating a new list we should wrap the existing on in case the client
// code needs to modify
List<Query> list = new ArrayList<Query>();
for (Object o : getAdaptedQueries()) {
list.add(new Query.WFS11((EObject)o));
}
return list;
}
@Override
public List<Object> getAdaptedQueries() {
return eGet(adaptee, "query", List.class);
}
@Override
public boolean isQueryTypeNamesUnset() {
return EMFUtils.isUnset(eGet(adaptee, "query", List.class), "typeName");
}
@Override
public BigInteger getMaxFeatures() {
return eGet(adaptee, "maxFeatures", BigInteger.class);
}
@Override
public void setMaxFeatures(BigInteger maxFeatures) {
eSet(adaptee, "maxFeatures", maxFeatures);
}
@Override
public String getTraverseXlinkDepth() {
return eGet(adaptee, "traverseXlinkDepth", String.class);
}
@Override
public boolean isResultTypeResults() {
return ((GetFeatureType)adaptee).getResultType() == ResultTypeType.RESULTS_LITERAL;
}
@Override
public boolean isResultTypeHits() {
return ((GetFeatureType)adaptee).getResultType() == ResultTypeType.HITS_LITERAL;
}
@Override
public boolean isLockRequest() {
return adaptee instanceof GetFeatureWithLockType;
}
@Override
public Query createQuery() {
return new Query.WFS11(((WfsFactory)getFactory()).createQueryType());
}
@Override
public LockFeatureRequest createLockRequest() {
return new LockFeatureRequest.WFS11(((WfsFactory)getFactory()).createLockFeatureType());
}
@Override
public FeatureCollectionResponse createResponse() {
return new FeatureCollectionResponse.WFS11(
((WfsFactory)getFactory()).createFeatureCollectionType());
}
@Override
public ResolveValueType getResolve() {
return ResolveValueType.ALL;
}
@Override
public BigInteger getResolveTimeOut() {
BigInteger seconds = eGet(adaptee, "traverseXlinkExpiry", BigInteger.class);
return seconds == null ? null : BigInteger.valueOf(60).multiply(seconds);
}
}
public static class WFS20 extends GetFeatureRequest {
public WFS20(EObject adaptee) {
super(adaptee);
}
@Override
public List<Query> getQueries() {
List<Query> list = new ArrayList<Query>();
for (Object o : getAdaptedQueries()) {
list.add(new Query.WFS20((EObject)o));
}
return list;
}
@Override
public List<Object> getAdaptedQueries() {
return eGet(adaptee, "abstractQueryExpression", List.class);
}
@Override
public boolean isQueryTypeNamesUnset() {
return EMFUtils.isUnset(eGet(adaptee, "abstractQueryExpression", List.class), "typeNames");
}
@Override
public BigInteger getMaxFeatures() {
return eGet(adaptee, "count", BigInteger.class);
}
@Override
public void setMaxFeatures(BigInteger maxFeatures) {
eSet(adaptee, "count", maxFeatures);
}
@Override
public String getTraverseXlinkDepth() {
Object obj = eGet(adaptee, "resolveDepth", Object.class);
return obj != null ? obj.toString() : null;
}
@Override
public boolean isResultTypeResults() {
return ((net.opengis.wfs20.GetFeatureType)adaptee).getResultType()
== net.opengis.wfs20.ResultTypeType.RESULTS;
}
@Override
public boolean isResultTypeHits() {
return ((net.opengis.wfs20.GetFeatureType)adaptee).getResultType()
== net.opengis.wfs20.ResultTypeType.HITS;
}
@Override
public boolean isLockRequest() {
return adaptee instanceof net.opengis.wfs20.GetFeatureWithLockType;
}
@Override
public Query createQuery() {
return new Query.WFS20(((Wfs20Factory)getFactory()).createQueryType());
}
@Override
public LockFeatureRequest createLockRequest() {
return new LockFeatureRequest.WFS20(((Wfs20Factory)getFactory()).createLockFeatureType());
}
@Override
public FeatureCollectionResponse createResponse() {
return new FeatureCollectionResponse.WFS20(
((Wfs20Factory)getFactory()).createFeatureCollectionType());
}
@Override
public ResolveValueType getResolve() {
return eGet(adaptee, "resolve", ResolveValueType.class);
}
@Override
public BigInteger getResolveTimeOut() {
return eGet(adaptee, "resolveTimeOut", BigInteger.class);
}
}
}