/* 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); } } }); } }