/* 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.LayerGroupInfo;
import org.geoserver.catalog.LayerInfo;
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 LayerGroupResource extends AbstractCatalogResource {
public LayerGroupResource(Context context, Request request,
Response response, Catalog catalog) {
super(context, request, response, LayerGroupInfo.class, catalog);
}
@Override
protected Object handleObjectGet() throws Exception {
String lg = getAttribute( "layergroup" );
LOGGER.fine( "GET layer group " + lg );
return catalog.getLayerGroupByName( lg );
}
@Override
public boolean allowPost() {
return getAttribute( "layergroup") == null;
}
@Override
protected String handleObjectPost(Object object) throws Exception {
LayerGroupInfo lg = (LayerGroupInfo) object;
LOGGER.info( "POST layer group " + lg.getName() );
if ( lg.getLayers().isEmpty() ) {
throw new RestletException( "layer group must not be empty", Status.CLIENT_ERROR_BAD_REQUEST );
}
if ( lg.getBounds() == null ) {
LOGGER.fine( "Auto calculating layer group bounds");
new CatalogBuilder( catalog ).calculateLayerGroupBounds(lg);
}
catalog.add( lg );
return lg.getName();
}
@Override
public boolean allowPut() {
return getAttribute( "layergroup") != null;
}
@Override
protected void handleObjectPut(Object object) throws Exception {
String layergroup = getAttribute("layergroup");
LOGGER.info( "PUT layer group " + layergroup );
LayerGroupInfo lg = (LayerGroupInfo) object;
LayerGroupInfo original = catalog.getLayerGroupByName( layergroup );
//ensure not a name change
if ( lg.getName() != null && !lg.getName().equals( original.getName() ) ) {
throw new RestletException( "Can't change name of a layer group", Status.CLIENT_ERROR_FORBIDDEN );
}
new CatalogBuilder( catalog ).updateLayerGroup( original, lg );
catalog.save( original );
}
@Override
public boolean allowDelete() {
return getAttribute( "layergroup" ) != null;
}
@Override
protected void handleObjectDelete() throws Exception {
String layergroup = getAttribute( "layergroup" );
LOGGER.info( "DELETE layer group " + layergroup );
LayerGroupInfo lg = catalog.getLayerGroupByName( layergroup );
catalog.remove( lg );
}
@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/" + encode(ref), writer);
}
if ( obj instanceof LayerInfo ) {
encodeLink("/layers/" + encode(ref), writer);
}
}
});
}
}