/** * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * <p> * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * <p> * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * * @author Nuno Oliveira, GeoSolutions S.A.S., Copyright 2017 */ package org.geowebcache.config.legends; import com.thoughtworks.xstream.converters.Converter; import com.thoughtworks.xstream.converters.MarshallingContext; import com.thoughtworks.xstream.converters.UnmarshallingContext; import com.thoughtworks.xstream.io.HierarchicalStreamReader; import com.thoughtworks.xstream.io.HierarchicalStreamWriter; /** * XML converter for {@link LegendsRawInfo}. */ public class LegendsRawInfoConverter implements Converter { @Override public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) { LegendsRawInfo legendsRawInfo = (LegendsRawInfo) source; // encode default values writer.addAttribute("defaultWidth", String.valueOf(legendsRawInfo.getDefaultWidth())); writer.addAttribute("defaultHeight", String.valueOf(legendsRawInfo.getDefaultHeight())); writer.addAttribute("defaultFormat", String.valueOf(legendsRawInfo.getDefaultFormat())); // encode legends information for (LegendRawInfo legendRawInfo : legendsRawInfo.getLegendsRawInfo()) { writer.startNode("legend"); writer.addAttribute("style", legendRawInfo.getStyle()); encodeAttribute(writer, "width", legendRawInfo.getWidth()); encodeAttribute(writer, "height", legendRawInfo.getHeight()); encodeAttribute(writer, "format", legendRawInfo.getFormat()); encodeAttribute(writer, "url", legendRawInfo.getUrl()); encodeAttribute(writer, "completeUrl", legendRawInfo.getCompleteUrl()); encodeAttribute(writer, "minScale", legendRawInfo.getMinScale()); encodeAttribute(writer, "maxScale", legendRawInfo.getMaxScale()); writer.endNode(); } } private void encodeAttribute(HierarchicalStreamWriter writer, String name, Object value) { if (value == null) { return; } writer.startNode(name); writer.setValue(value.toString()); writer.endNode(); } @Override public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) { LegendsRawInfo legendsRawInfo = new LegendsRawInfo(); // setting the defaults based on legends element attributes legendsRawInfo.setDefaultWidth(toInteger(reader.getAttribute("defaultWidth"))); legendsRawInfo.setDefaultHeight(toInteger(reader.getAttribute("defaultHeight"))); legendsRawInfo.setDefaultFormat(reader.getAttribute("defaultFormat")); // parsing all legends information while(reader.hasMoreChildren()) { reader.moveDown(); legendsRawInfo.addLegendRawInfo(parseLegendRawInfo(reader)); reader.moveUp(); } return legendsRawInfo; } /** * Helper method that converts a non NULL string value to an integer. */ private Integer toInteger(String rawValue) { if (rawValue == null) { return null; } return Integer.valueOf(rawValue); } /** * Helper method that converts a non NULL string value to an double. */ private Double toDouble(String rawValue) { if (rawValue == null) { return null; } return Double.valueOf(rawValue); } /** * Helper method that retrieves from the reader a legend raw information. */ private LegendRawInfo parseLegendRawInfo(HierarchicalStreamReader reader) { LegendRawInfo legendRawInfo = new LegendRawInfo(); legendRawInfo.setStyle(reader.getAttribute("style")); while(reader.hasMoreChildren()) { reader.moveDown(); switch(reader.getNodeName()) { case "width": legendRawInfo.setWidth(toInteger(reader.getValue())); break; case "height": legendRawInfo.setHeight(toInteger(reader.getValue())); break; case "format": legendRawInfo.setFormat(reader.getValue()); break; case "url": legendRawInfo.setUrl(reader.getValue()); break; case "completeUrl": legendRawInfo.setCompleteUrl(reader.getValue()); break; case "minScale": legendRawInfo.setMinScale(toDouble(reader.getValue())); break; case "maxScale": legendRawInfo.setMaxScale(toDouble(reader.getValue())); break; } reader.moveUp(); } return legendRawInfo; } @Override public boolean canConvert(Class type) { return type.equals(LegendsRawInfo.class); } }