/* (c) 2014 Open Source Geospatial Foundation - all rights reserved * (c) 2001 - 2013 OpenPlans * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.wms.map; import java.io.IOException; import java.io.OutputStream; import java.util.Set; import javax.xml.transform.TransformerException; import org.geoserver.ows.Response; import org.geoserver.platform.Operation; import org.geoserver.platform.ServiceException; import org.geotools.xml.transform.TransformerBase; import org.springframework.util.Assert; /** * An OWS {@link Response} handler that knows how to encode a {@link XMLTransformerMap} * * @author Gabriel Roldan * @see XMLTransformerMap */ public class XMLTransformerMapResponse extends AbstractMapResponse { public XMLTransformerMapResponse() { super(XMLTransformerMap.class, (Set<String>) null); } /** * Encodes the {@link XMLTransformerMap} down to the given destination output stream. * * @param value * an {@link XMLTransformerMap} * @param output * xml stream destination * @param operation * operation descriptor for which the map was produced; not used at all. */ @Override public void write(Object value, OutputStream output, Operation operation) throws IOException, ServiceException { write(value, output); } public void write(Object value, OutputStream output) throws IOException, ServiceException { Assert.isInstanceOf(XMLTransformerMap.class, value); XMLTransformerMap map = (XMLTransformerMap) value; TransformerBase transformer = map.getTransformer(); Object transformerSubject = map.getTransformerSubject(); try { transformer.transform(transformerSubject, output); } catch (TransformerException e) { // TransformerException do not respect the Exception.getCause() contract Throwable cause = e.getCause() != null ? e.getCause() : e.getException(); // we need to propagate the RuntimeException if (cause instanceof RuntimeException) { throw (RuntimeException) cause; } throw new ServiceException("getmap operation failed.", cause != null ? cause : e); } finally { map.dispose(); } } }