/* (c) 2017 Open Source Geospatial Foundation - all rights reserved
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.rest.converters;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.commons.io.IOUtils;
import org.geoserver.catalog.StyleHandler;
import org.geoserver.catalog.StyleInfo;
import org.geoserver.catalog.Styles;
import org.geoserver.config.GeoServerDataDirectory;
import org.geoserver.platform.GeoServerExtensions;
import org.geoserver.platform.resource.Resource;
import org.geoserver.rest.wrapper.RestWrapper;
import org.geotools.styling.Style;
import org.geotools.styling.StyledLayerDescriptor;
import org.geotools.util.Version;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageNotWritableException;
/**
* Write {@link Style} (or {@link StyleInfo}) using provided mimeType and handler.
*/
public class StyleWriterConverter extends BaseMessageConverter<Object> {
private final Version version;
private final StyleHandler handler;
public StyleWriterConverter(String mimeType, Version version, StyleHandler handler) {
super(MediaType.valueOf(mimeType));
this.handler = handler;
this.version = version;
}
@Override
protected boolean supports(Class<?> clazz) {
return RestWrapper.class.isAssignableFrom(clazz) || Style.class.isAssignableFrom(clazz) || StyleInfo.class.isAssignableFrom(clazz);
}
//
// reading
//
@Override
protected boolean canRead(MediaType mediaType) {
return false;
}
//
// writing
//
@Override
public void writeInternal(Object object, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException {
if (object instanceof RestWrapper) {
object = ((RestWrapper<?>) object).getObject();
}
if (object instanceof StyleInfo) {
StyleInfo style = (StyleInfo) object;
// optimization, if the requested format is the same as the native format
// of the style, stream the file directly from the disk, otherwise encode
// the style in the requested format
if (handler.getFormat().equalsIgnoreCase(style.getFormat())) {
copyDefinition(style, outputMessage.getBody());
return;
}
}
Style style = object instanceof StyleInfo ? ((StyleInfo) object).getStyle()
: (Style) object;
StyledLayerDescriptor sld = Styles.sld(style);
// TODO: support pretty print somehow - probably a hint
handler.encode(sld, version, false, outputMessage.getBody());
}
void copyDefinition(StyleInfo style, OutputStream out) throws IOException {
GeoServerDataDirectory dd = GeoServerExtensions.bean(GeoServerDataDirectory.class);
Resource resource = dd.style(style);
try (InputStream in = resource.in()) {
IOUtils.copy(in, out);
}
}
@Override
public String toString() {
return "StyleWriterConverter [version=" + version + ", handler=" + handler + "]";
}
}