/* 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 org.geoserver.catalog.Catalog;
import org.geoserver.catalog.FeatureTypeInfo;
import org.geoserver.catalog.WMSLayerInfo;
import org.geoserver.catalog.WMSStoreInfo;
import org.geoserver.rest.RestletException;
import org.geoserver.rest.format.ReflectiveXMLFormat;
import org.geotools.data.ows.Layer;
import org.geotools.data.wms.WebMapServer;
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 AvailableWMSLayerResource extends AbstractCatalogResource {
public AvailableWMSLayerResource(Context context, Request request, Response response, Catalog catalog) {
super(context, request, response, FeatureTypeInfo.class, catalog);
}
@Override
protected Object handleObjectGet() {
String workspace = (String) getRequest().getAttributes().get( "workspace" );
String wmsstore = (String) getRequest().getAttributes().get( "wmsstore" );
WMSStoreInfo info = catalog.getStoreByName( workspace, wmsstore, WMSStoreInfo.class );
if ( info == null ) {
throw new RestletException( "No such WMS store: " + wmsstore, Status.CLIENT_ERROR_NOT_FOUND );
}
//list of available feature types
List<String> available = new ArrayList<String>();
try {
WebMapServer ds = (WebMapServer) info.getWebMapServer(null);
for ( Layer layer : ds.getCapabilities().getLayerList() ) {
if(layer.getName() == null || "".equals(layer.getName())) {
continue;
}
WMSLayerInfo wIinfo = catalog.getResourceByStore(info, layer.getName(), WMSLayerInfo.class);
if (wIinfo == null ) {
//not in catalog, add it
available.add( layer.getName() );
}
}
}
catch (IOException e) {
throw new RestletException( "Could not load wms store: " + wmsstore, 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( "wmsLayerName", 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
}
}