package org.geoserver.geosearch;
import java.io.IOException;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.NoSuchElementException;
import org.geoserver.catalog.Catalog;
import org.geoserver.catalog.FeatureTypeInfo;
import org.geoserver.catalog.NamespaceInfo;
import org.geoserver.rest.format.DataFormat;
import org.geoserver.rest.format.FreemarkerFormat;
import org.geoserver.rest.RestletException;
import org.geotools.factory.CommonFactoryFinder;
import org.geotools.feature.FeatureCollection;
import org.geotools.data.DefaultQuery;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.filter.FilterFactory;
import org.restlet.data.MediaType;
import org.restlet.data.Method;
import org.restlet.data.Request;
import org.restlet.data.Response;
import org.restlet.data.Status;
public abstract class AbstractFeatureDescription extends GeoServerProxyAwareRestlet {
private Catalog myCatalog;
private final DataFormat format =
new FreemarkerFormat(
"featurepage.ftl",
HTMLFeatureDescription.class,
MediaType.TEXT_HTML
);
private String GEOSERVER_BASE_URL;
public void setCatalog(Catalog c){
myCatalog = c;
}
public Catalog getCatalog(){
return myCatalog;
}
public SimpleFeature findFeature(Request req){
String layer = (String)req.getAttributes().get("layer");
String namespace = (String)req.getAttributes().get("namespace");
String feature = (String)req.getAttributes().get("feature");
NamespaceInfo ns = myCatalog.getNamespaceByPrefix(namespace);
if ( ns == null ) {
throw new RestletException(
"No such namespace:" + namespace,
Status.CLIENT_ERROR_NOT_FOUND
);
}
FeatureTypeInfo featureType = null;
try {
featureType = myCatalog.getFeatureTypeByName(ns, layer);
} catch (NoSuchElementException e) {
throw new RestletException(
e.getMessage(),
Status.CLIENT_ERROR_NOT_FOUND
);
}
if (!(Boolean)featureType.getMetadata().get("indexingEnabled")){
throw new RestletException(
"Indexing is disabled for this layer (" + ns + ":" + layer + ") "
+ featureType.getMetadata().get("indexingEnabled"),
Status.CLIENT_ERROR_FORBIDDEN
);
}
DefaultQuery q = new DefaultQuery();
FilterFactory ff = CommonFactoryFinder.getFilterFactory(null);
q.setFilter(ff.id(Collections.singleton(ff.featureId(feature))));
FeatureCollection col = null;
try {
col = featureType.getFeatureSource(null, null).getFeatures(q);
} catch (IOException e) {
throw new RestletException(
e.getMessage(),
Status.SERVER_ERROR_INTERNAL
);
}
if (col.size() != 1) {
throw new RestletException(
"Unexpected results from data query, "
+ "should be exactly one feature with given ID",
Status.SERVER_ERROR_INTERNAL
);
}
return (SimpleFeature)col.iterator().next();
}
}