/* 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 java.util.Map; import org.geoserver.catalog.CascadeDeleteVisitor; import org.geoserver.catalog.Catalog; import org.geoserver.catalog.CatalogBuilder; import org.geoserver.catalog.CoverageInfo; import org.geoserver.catalog.CoverageStoreInfo; import org.geoserver.catalog.WorkspaceInfo; 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 org.restlet.resource.Resource; import com.thoughtworks.xstream.converters.MarshallingContext; import com.thoughtworks.xstream.io.HierarchicalStreamWriter; import freemarker.ext.beans.CollectionModel; import freemarker.template.Configuration; import freemarker.template.SimpleHash; public class CoverageStoreResource extends AbstractCatalogResource { public CoverageStoreResource(Context context, Request request, Response response, Catalog catalog) { super(context, request, response, CoverageStoreInfo.class, catalog); } @Override protected DataFormat createHTMLFormat(Request request, Response response) { return new CoverageStoreHTMLFormat( request, response, this, catalog ); } @Override protected Object handleObjectGet() throws Exception { String ws = getAttribute( "workspace" ); String cs = getAttribute( "coveragestore" ); LOGGER.fine( "GET coverage store " + ws + "," + cs ); if ( cs == null ) { return catalog.getCoverageStoresByWorkspace( ws ); } return catalog.getCoverageStoreByName( ws, cs ); } @Override public boolean allowPost() { return getAttribute("coveragestore") == null; } @Override protected String handleObjectPost(Object object) throws Exception { CoverageStoreInfo coverageStore = (CoverageStoreInfo) object; catalog.add( coverageStore ); LOGGER.info( "POST coverage store " + coverageStore.getName() ); return coverageStore.getName(); } @Override public boolean allowPut() { return getAttribute( "coveragestore" ) != null; } @Override protected void handleObjectPut(Object object) throws Exception { String workspace = getAttribute("workspace"); String coveragestore = getAttribute("coveragestore"); CoverageStoreInfo cs = (CoverageStoreInfo) object; CoverageStoreInfo original = catalog.getCoverageStoreByName(workspace, coveragestore); new CatalogBuilder( catalog ).updateCoverageStore( original, cs ); catalog.save( original ); clear(original); LOGGER.info( "PUT coverage store " + workspace + "," + coveragestore ); } @Override public boolean allowDelete() { return getAttribute( "coveragestore" ) != null; } @Override protected void handleObjectDelete() throws Exception { String workspace = getAttribute("workspace"); String coveragestore = getAttribute("coveragestore"); boolean recurse = getQueryStringValue("recurse", Boolean.class, false); CoverageStoreInfo cs = catalog.getCoverageStoreByName(workspace, coveragestore); if (!recurse) { if ( !catalog.getCoveragesByCoverageStore(cs).isEmpty() ) { throw new RestletException( "coveragestore not empty", Status.CLIENT_ERROR_UNAUTHORIZED); } catalog.remove( cs ); } else { new CascadeDeleteVisitor(catalog).visit(cs); } clear(cs); LOGGER.info( "DELETE coverage store " + workspace + "," + coveragestore ); } @Override protected void configurePersister(XStreamPersister persister, final DataFormat format ) { persister.setCallback( new XStreamPersister.Callback() { @Override protected void postEncodeCoverageStore(CoverageStoreInfo cs, HierarchicalStreamWriter writer, MarshallingContext context) { //add a link to the coverages writer.startNode( "coverages"); encodeCollectionLink("coverages", writer, format); writer.endNode(); } @Override protected void postEncodeReference(Object obj, String ref, HierarchicalStreamWriter writer, MarshallingContext context) { if ( obj instanceof WorkspaceInfo ) { encodeLink( "/workspaces/" + encode(ref), writer, format ); } } } ); } void clear(CoverageStoreInfo info) { catalog.getResourcePool().clear(info); } static class CoverageStoreHTMLFormat extends CatalogFreemarkerHTMLFormat { Catalog catalog; public CoverageStoreHTMLFormat(Request request, Response response, Resource resource, Catalog catalog) { super(CoverageStoreInfo.class, request, response, resource); this.catalog = catalog; } @Override protected Configuration createConfiguration(Object data, Class clazz) { Configuration cfg = super.createConfiguration(data, clazz); cfg.setObjectWrapper(new ObjectToMapWrapper<CoverageStoreInfo>(CoverageStoreInfo.class) { @Override protected void wrapInternal(Map properties, SimpleHash model, CoverageStoreInfo object) { List<CoverageInfo> coverages = catalog.getCoveragesByCoverageStore(object); properties.put( "coverages", new CollectionModel( coverages, new ObjectToMapWrapper(CoverageInfo.class) ) ); } }); return cfg; } }; }