/* 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.logging.Logger; import org.geoserver.catalog.Catalog; import org.geoserver.config.util.XStreamPersisterFactory; import org.geoserver.platform.GeoServerExtensions; import org.geoserver.rest.PageInfo; import org.geoserver.rest.ReflectiveResource; import org.geoserver.rest.format.DataFormat; import org.geoserver.rest.format.MediaTypes; import org.geoserver.rest.format.ReflectiveXMLFormat; import org.geotools.util.logging.Logging; import org.restlet.Context; import org.restlet.data.Request; import org.restlet.data.Response; import com.thoughtworks.xstream.io.HierarchicalStreamWriter; public abstract class CatalogResourceBase extends ReflectiveResource { /** * logger */ static Logger LOGGER = Logging.getLogger( "org.geoserver.catalog.rest"); /** * the catalog */ protected Catalog catalog; /** * the class of the resource */ protected Class clazz; /** * xstream persister factory */ protected XStreamPersisterFactory xpf; public CatalogResourceBase(Context context,Request request, Response response, Class clazz, Catalog catalog) { super( context, request, response ); this.clazz = clazz; this.catalog = catalog; this.xpf = GeoServerExtensions.bean(XStreamPersisterFactory.class); } @Override protected DataFormat createHTMLFormat(Request request,Response response) { return new CatalogFreemarkerHTMLFormat( clazz, request, response, this ); } protected void encodeAlternateAtomLink( String link, HierarchicalStreamWriter writer ) { encodeAlternateAtomLink( link, writer, getFormatGet() ); } protected void encodeAlternateAtomLink( String link, HierarchicalStreamWriter writer, DataFormat format ) { writer.startNode( "atom:link"); writer.addAttribute("xmlns:atom", "http://www.w3.org/2005/Atom"); writer.addAttribute( "rel", "alternate" ); writer.addAttribute( "href", href(link,format) ); if ( format != null ) { writer.addAttribute( "type", format.getMediaType().toString() ); } writer.endNode(); } protected void encodeLink( String link, HierarchicalStreamWriter writer ) { encodeLink( link, writer, getFormatGet() ); } protected void encodeLink( String link, HierarchicalStreamWriter writer, DataFormat format ) { if ( getFormatGet() instanceof ReflectiveXMLFormat ) { //encode as an atom link encodeAlternateAtomLink(link, writer, format); } else { //encode as a child element writer.startNode( "href" ); writer.setValue( href( link, format) ); writer.endNode(); } } protected void encodeCollectionLink( String link, HierarchicalStreamWriter writer ) { encodeCollectionLink( link, writer, getFormatGet() ); } protected void encodeCollectionLink( String link, HierarchicalStreamWriter writer, DataFormat format) { if ( format instanceof ReflectiveXMLFormat ) { //encode as atom link encodeAlternateAtomLink(link, writer, format); } else { //encode as a value writer.setValue( href( link, format ) ); } } String href( String link, DataFormat format ) { PageInfo pg = getPageInfo(); //try to figure out extension String ext = null; if ( format != null ) { ext = MediaTypes.getExtensionForMediaType( format.getMediaType() ); } if ( ext == null ) { ext = pg.getExtension(); } if(ext != null && ext.length() > 0) link = link+ "." + ext; // encode as relative or absolute depending on the link type if ( link.startsWith( "/") ) { // absolute, encode from "root" return pg.rootURI(link); } else { //encode as relative return pg.pageURI(link); } } }