/* (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 org.geoserver.config.util.SecureXStream; import org.geoserver.config.util.XStreamPersister; import org.geoserver.rest.wrapper.RestHttpInputWrapper; import org.geoserver.rest.wrapper.RestListWrapper; import org.geoserver.rest.wrapper.RestWrapper; import org.springframework.http.HttpInputMessage; import org.springframework.http.HttpOutputMessage; import org.springframework.http.MediaType; import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.http.converter.HttpMessageNotWritableException; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.HierarchicalStreamWriter; /** * Message converter implementation for XML serialization via XStream */ public class XStreamXMLMessageConverter extends XStreamMessageConverter<Object> { public XStreamXMLMessageConverter() { super(MediaType.APPLICATION_XML, MediaType.TEXT_XML); } @Override protected boolean supports(Class<?> clazz) { // we can only read RestWrapper, not RestListWrapper return !RestWrapper.class.isAssignableFrom(clazz) || !RestListWrapper.class.isAssignableFrom(clazz); } // // reading // // @Override // public boolean canRead(Class<?> clazz, MediaType mediaType) { // return !RestListWrapper.class.isAssignableFrom(clazz) && canRead(mediaType); // } @Override protected Object readInternal(Class<?> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { XStreamPersister p = xpf.createXMLPersister(); if (inputMessage instanceof RestHttpInputWrapper) { ((RestHttpInputWrapper) inputMessage).configurePersister(p, this); } p.setCatalog(catalog); return p.load(inputMessage.getBody(), clazz); } // // writing // @Override public boolean canWrite(Class<?> clazz, MediaType mediaType) { // we can only write RestWrapper, not RestListWrapper return !RestListWrapper.class.isAssignableFrom(clazz) && RestWrapper.class.isAssignableFrom(clazz) && canWrite(mediaType); } @Override protected void writeInternal(Object o, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { XStreamPersister xmlPersister = xpf.createXMLPersister(); xmlPersister.setCatalog(catalog); xmlPersister.setReferenceByName(true); xmlPersister.setExcludeIds(); if (o instanceof RestWrapper) { RestWrapper<?> wrapper = (RestWrapper<?>) o; wrapper.configurePersister(xmlPersister, this); o = wrapper.getObject(); } xmlPersister.save(o, outputMessage.getBody()); } @Override public String getExtension() { return "xml"; } @Override public String getMediaType() { return MediaType.APPLICATION_XML_VALUE; } @Override protected XStream createXStreamInstance() { return new SecureXStream(); } @Override public void encodeLink(String link, HierarchicalStreamWriter writer) { encodeAlternateAtomLink(link, writer); } @Override public void encodeCollectionLink(String link, HierarchicalStreamWriter writer) { encodeAlternateAtomLink(link, writer); } }