/* 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 org.geoserver.catalog.Catalog;
import org.geoserver.catalog.CatalogBuilder;
import org.geoserver.catalog.CoverageInfo;
import org.geoserver.catalog.FeatureTypeInfo;
import org.geoserver.catalog.LayerInfo;
import org.geoserver.catalog.ResourceInfo;
import org.geoserver.catalog.StyleInfo;
import org.geoserver.config.util.XStreamPersister;
import org.geoserver.rest.RestletException;
import org.geoserver.rest.format.DataFormat;
import org.restlet.Context;
import org.restlet.data.Request;
import org.restlet.data.Response;
import org.restlet.data.Status;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
public class LayerResource extends AbstractCatalogResource {
public LayerResource(Context context, Request request, Response response,
Catalog catalog) {
super(context, request, response, LayerInfo.class, catalog);
}
@Override
protected Object handleObjectGet() throws Exception {
String layer = getAttribute( "layer" );
if ( layer == null ) {
//return all layers
return catalog.getLayers();
}
return catalog.getLayerByName( layer );
}
@Override
protected String handleObjectPost(Object object) throws Exception {
return null;
}
@Override
public boolean allowPut() {
return getAttribute( "layer" ) != null;
}
@Override
protected void handleObjectPut(Object object) throws Exception {
String l = getAttribute( "layer" );
LayerInfo original = catalog.getLayerByName(l);
LayerInfo layer = (LayerInfo) object;
//ensure this is not a name change
// TODO: Uncomment this when the resource/layer split is not, now by definition
// we cannot rename a layer, it's just not possible and it's not un-marshalled either
// if ( layer.getName() != null && !layer.getName().equals( original.getName() ) ) {
// throw new RestletException( "Can't change name of a layer", Status.CLIENT_ERROR_FORBIDDEN );
// }
// force in the same resource otherwise the update will simply fail as we cannot reach the name
layer.setResource(original.getResource());
new CatalogBuilder( catalog ).updateLayer( original, layer );
catalog.save( original );
LOGGER.info( "PUT layer " + l);
}
@Override
public boolean allowDelete() {
return getAttribute("layer") != null;
}
@Override
protected void handleObjectDelete() throws Exception {
String l = getAttribute("layer");
LayerInfo layer = (LayerInfo) catalog.getLayerByName(l);
catalog.remove(layer);
LOGGER.info( "DELETE layer " + l);
}
@Override
protected void configurePersister(XStreamPersister persister, DataFormat format) {
persister.setCallback(new XStreamPersister.Callback() {
@Override
protected void postEncodeReference(Object obj, String ref,
HierarchicalStreamWriter writer, MarshallingContext context) {
if ( obj instanceof StyleInfo ) {
encodeLink( "/styles/" + ((StyleInfo)obj).getName(), writer);
}
if ( obj instanceof ResourceInfo ) {
ResourceInfo r = (ResourceInfo) obj;
StringBuffer link = new StringBuffer( "/workspaces/" ).
append( r.getStore().getWorkspace().getName() ).append( "/" );
if ( r instanceof FeatureTypeInfo ) {
link.append( "datastores/").append( r.getStore().getName() )
.append( "/featuretypes/");
}
else if ( r instanceof CoverageInfo ) {
link.append( "coveragestores/").append( r.getStore().getName() )
.append( "/coverages/");
}
else {
return;
}
link.append( r.getName() );
encodeLink(link.toString(), writer);
}
}
});
}
}