/* Copyright (c) 2001 - 2009 TOPP - www.openplans.org. All rights reserved. * This code is licensed under the GPL 2.0 license, availible at the root * application directory. */ package org.geoserver.catalog.rest; import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; import org.geoserver.catalog.Catalog; import org.geoserver.catalog.DataStoreInfo; import org.geoserver.catalog.FeatureTypeInfo; import org.geoserver.rest.RestletException; import org.geoserver.rest.format.ReflectiveXMLFormat; import org.geotools.data.DataStore; import org.opengis.feature.type.FeatureType; import org.restlet.Context; import org.restlet.data.Request; import org.restlet.data.Response; import org.restlet.data.Status; import com.thoughtworks.xstream.XStream; public class AvailableFeatureTypeResource extends AbstractCatalogResource { public AvailableFeatureTypeResource(Context context, Request request, Response response, Catalog catalog) { super(context, request, response, FeatureTypeInfo.class, catalog); } @Override protected Object handleObjectGet() { String workspace = getAttribute("workspace"); String datastore = getAttribute("datastore"); DataStoreInfo info = catalog.getDataStoreByName( workspace, datastore ); if ( info == null ) { throw new RestletException( "No such datastore: " + datastore, Status.CLIENT_ERROR_NOT_FOUND ); } //flag to control whether to filter out types without geometry boolean skipNoGeom = "available_with_geom".equalsIgnoreCase(getQueryStringValue("list")); //list of available feature types List<String> available = new ArrayList<String>(); try { DataStore ds = (DataStore) info.getDataStore(null); String[] featureTypeNames = ds.getTypeNames(); for ( String featureTypeName : featureTypeNames ) { FeatureTypeInfo ftinfo = catalog.getFeatureTypeByDataStore(info, featureTypeName); if (ftinfo == null ) { //not in catalog, add it //check whether to filter by geometry if (skipNoGeom) { try { FeatureType featureType = ds.getSchema(featureTypeName); if (featureType.getGeometryDescriptor() == null) { //skip continue; } } catch(IOException e) { LOGGER.log(Level.WARNING, "Unable to load schema for feature type " + featureTypeName, e); } } available.add( featureTypeName ); } } } catch (IOException e) { throw new RestletException( "Could not load datastore: " + datastore, Status.SERVER_ERROR_INTERNAL, e ); } return available; } @Override protected ReflectiveXMLFormat createXMLFormat(Request request, Response response) { return new ReflectiveXMLFormat() { @Override protected void write(Object data, OutputStream output) throws IOException { XStream xstream = new XStream(); xstream.alias( "featureTypeName", String.class); xstream.toXML( data, output ); } }; } @Override public boolean allowPost() { return false; } @Override protected String handleObjectPost(Object object) { return null; } @Override protected void handleObjectPut(Object object) { //do nothing, we do not allow post } }