/* (c) 2016 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.wms.style; import java.io.BufferedReader; import java.io.IOException; import java.io.OutputStream; import java.io.Reader; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.xml.transform.TransformerException; import org.geoserver.catalog.StyleHandler; import org.geotools.styling.ResourceLocator; import org.geotools.styling.SLDTransformer; import org.geotools.styling.StyledLayerDescriptor; import org.geotools.util.Version; import org.geotools.util.logging.Logging; import org.xml.sax.EntityResolver; /** * Handler for the dynamic palette style language. See {@link PaletteParser} for details on the grammar */ public class PaletteStyleHandler extends StyleHandler { static final Logger LOGGER = Logging.getLogger(PaletteStyleHandler.class); public static final String MIME_TYPE = "text/vnd.ncwms.palette"; public static final String FORMAT = "PAL"; protected PaletteStyleHandler() { super("Dynamic palette", FORMAT); } @Override public String getFileExtension() { return ".pal"; } @Override public StyledLayerDescriptor parse(Object input, Version version, ResourceLocator resourceLocator, EntityResolver entityResolver) throws IOException { try (Reader reader = toReader(input)) { StyledLayerDescriptor sld = new PaletteParser().parseStyle(reader); if (LOGGER.isLoggable(Level.FINE)) { try { LOGGER.fine("Palette has been parsed to " + toSLD(sld)); } catch (TransformerException e) { LOGGER.log(Level.FINE, "Failed to transform in memory style to SLD", e); } } return sld; } } String toSLD(StyledLayerDescriptor sld) throws TransformerException { final SLDTransformer tx = new SLDTransformer(); tx.setIndentation(2); return tx.transform(sld); } @Override public void encode(StyledLayerDescriptor sld, Version version, boolean pretty, OutputStream output) throws IOException { throw new UnsupportedOperationException(); } @Override public List<Exception> validate(Object input, Version version, EntityResolver entityResolver) throws IOException { // just check the palette is valid, no need to convert to Style try (BufferedReader reader = new BufferedReader(toReader(input))) { new PaletteParser().parseColorMap(reader); } catch (Exception e) { return Arrays.asList(e); } return Collections.emptyList(); } @Override public String mimeType(Version version) { return MIME_TYPE; } }