/* 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.util.List; import org.geoserver.catalog.Catalog; import org.geoserver.catalog.CatalogBuilder; import org.geoserver.catalog.CoverageInfo; import org.geoserver.catalog.CoverageStoreInfo; import org.geoserver.catalog.LayerInfo; import org.geoserver.catalog.NamespaceInfo; 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 CoverageResource extends AbstractCatalogResource { public CoverageResource(Context context, Request request, Response response, Catalog catalog) { super(context, request, response, CoverageInfo.class, catalog); } @Override protected DataFormat createHTMLFormat(Request request, Response response) { return new ResourceHTMLFormat(CoverageInfo.class, request, response, this); } @Override protected Object handleObjectGet() throws Exception { String workspace = getAttribute( "workspace"); String coveragestore = getAttribute( "coveragestore"); String coverage = getAttribute( "coverage" ); if ( coveragestore == null ) { LOGGER.fine( "GET coverage " + workspace + "," + coverage ); //grab the corresponding namespace for this workspace NamespaceInfo ns = catalog.getNamespaceByPrefix( workspace ); if ( ns != null ) { return catalog.getCoverageByName(ns,coverage); } throw new RestletException( "", Status.CLIENT_ERROR_NOT_FOUND ); } LOGGER.fine( "GET coverage " + coveragestore + "," + coverage ); CoverageStoreInfo cs = catalog.getCoverageStoreByName(workspace, coveragestore); return catalog.getCoverageByCoverageStore( cs, coverage ); } @Override public boolean allowPost() { return getAttribute("coverage") == null; } @Override protected String handleObjectPost(Object object) throws Exception { String workspace = getAttribute( "workspace"); String coveragestore = getAttribute( "coveragestore"); CoverageInfo coverage = (CoverageInfo) object; if ( coverage.getStore() == null ) { //get from requests CoverageStoreInfo ds = catalog.getCoverageStoreByName( workspace, coveragestore ); coverage.setStore( ds ); } CatalogBuilder builder = new CatalogBuilder(catalog); builder.setStore(coverage.getStore()); builder.initCoverage(coverage); NamespaceInfo ns = coverage.getNamespace(); if ( ns != null && !ns.getPrefix().equals( workspace ) ) { //TODO: change this once the two can be different and we untie namespace // from workspace LOGGER.warning( "Namespace: " + ns.getPrefix() + " does not match workspace: " + workspace + ", overriding." ); ns = null; } if ( ns == null){ //infer from workspace ns = catalog.getNamespaceByPrefix( workspace ); coverage.setNamespace( ns ); } coverage.setEnabled(true); catalog.add( coverage ); //create a layer for the coverage catalog.add(builder.buildLayer(coverage)); LOGGER.info( "POST coverage " + coveragestore + "," + coverage.getName() ); return coverage.getName(); } @Override public boolean allowPut() { return getAttribute("coverage") != null; } @Override protected void handleObjectPut(Object object) throws Exception { CoverageInfo c = (CoverageInfo) object; String workspace = getAttribute("workspace"); String coveragestore = getAttribute("coveragestore"); String coverage = getAttribute("coverage"); CoverageStoreInfo cs = catalog.getCoverageStoreByName(workspace, coveragestore); CoverageInfo original = catalog.getCoverageByCoverageStore( cs, coverage ); new CatalogBuilder(catalog).updateCoverage(original,c); catalog.save( original ); clear(original); LOGGER.info( "PUT coverage " + coveragestore + "," + coverage ); } @Override public boolean allowDelete() { return getAttribute("coverage") != null; } @Override protected void handleObjectDelete() throws Exception { String workspace = getAttribute("workspace"); String coveragestore = getAttribute("coveragestore"); String coverage = getAttribute("coverage"); boolean recurse = getQueryStringValue("recurse", Boolean.class, false); CoverageStoreInfo ds = catalog.getCoverageStoreByName(workspace, coveragestore); CoverageInfo c = catalog.getCoverageByCoverageStore( ds, coverage ); List<LayerInfo> layers = catalog.getLayers(c); if (recurse) { //by recurse we clear out all the layers that public this resource for (LayerInfo l : layers) { catalog.remove(l); LOGGER.info( "DELETE layer " + l.getName()); } } else { if (!layers.isEmpty()) { throw new RestletException( "coverage referenced by layer(s)", Status.CLIENT_ERROR_FORBIDDEN); } } catalog.remove( c ); clear(c); LOGGER.info( "DELETE coverage " + coveragestore + "," + coverage ); } void clear(CoverageInfo info) { catalog.getResourcePool().clear(info.getStore()); } @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 NamespaceInfo ) { NamespaceInfo ns = (NamespaceInfo) obj; encodeLink("/namespaces/" + encode(ns.getPrefix()), writer); } if ( obj instanceof CoverageStoreInfo ) { CoverageStoreInfo cs = (CoverageStoreInfo) obj; encodeLink("/workspaces/" + encode(cs.getWorkspace().getName()) + "/coveragestores/" + encode(cs.getName()), writer ); } } }); } }