package org.geoserver.catalog;
import java.awt.Color;
import java.io.IOException;
import java.io.OutputStream;
import java.io.Reader;
import java.util.Collections;
import java.util.List;
import java.util.Properties;
import org.geotools.factory.CommonFactoryFinder;
import org.geotools.styling.FeatureTypeStyle;
import org.geotools.styling.LineSymbolizer;
import org.geotools.styling.Mark;
import org.geotools.styling.PointSymbolizer;
import org.geotools.styling.PolygonSymbolizer;
import org.geotools.styling.RasterSymbolizer;
import org.geotools.styling.ResourceLocator;
import org.geotools.styling.Rule;
import org.geotools.styling.SLD;
import org.geotools.styling.Style;
import org.geotools.styling.StyleFactory;
import org.geotools.styling.StyledLayerDescriptor;
import org.geotools.styling.Symbolizer;
import org.geotools.styling.UserLayer;
import org.geotools.util.Version;
import org.opengis.filter.FilterFactory;
import org.xml.sax.EntityResolver;
/**
* Test style handler based on properties format.
*/
public class PropertyStyleHandler extends StyleHandler {
public static final String FORMAT = "psl";
public static final String MIMETYPE = "application/prs.gs.psl";
StyleFactory styleFactory;
FilterFactory filterFactory;
public PropertyStyleHandler() {
super("Property", FORMAT);
styleFactory = CommonFactoryFinder.getStyleFactory();
filterFactory = CommonFactoryFinder.getFilterFactory();
}
@Override
public String getFileExtension() {
return "properties";
}
@Override
public String mimeType(Version version) {
return MIMETYPE;
}
@Override
public StyledLayerDescriptor parse(Object input, Version version, ResourceLocator resourceLocator,
EntityResolver enityResolver) throws IOException {
Properties p = new Properties();
try(Reader reader = toReader(input)) {
p.load(reader);
}
Color color = color(p.getProperty("color"), Color.BLACK);
Symbolizer sym = null;
String type = p.getProperty("type");
if ("line".equalsIgnoreCase(type)) {
LineSymbolizer ls = styleFactory.createLineSymbolizer();
ls.setStroke(styleFactory.createStroke(filterFactory.literal(color), filterFactory.literal(2)));
sym = ls;
}
else if ("polygon".equalsIgnoreCase(type)) {
PolygonSymbolizer ps = styleFactory.createPolygonSymbolizer();
ps.setFill(styleFactory.createFill(filterFactory.literal(color)));
sym = ps;
}
else if ("raster".equalsIgnoreCase(type)) {
RasterSymbolizer rs = styleFactory.createRasterSymbolizer();
sym = rs;
}
else {
Mark mark = styleFactory.createMark();
mark.setFill(styleFactory.createFill(filterFactory.literal(color)));
PointSymbolizer ps = styleFactory.createPointSymbolizer();
ps.setGraphic(styleFactory.createDefaultGraphic());
ps.getGraphic().graphicalSymbols().add(mark);
sym = ps;
}
Rule r = styleFactory.createRule();
r.symbolizers().add(sym);
FeatureTypeStyle fts = styleFactory.createFeatureTypeStyle();
fts.rules().add(r);
Style s = styleFactory.createStyle();
s.featureTypeStyles().add(fts);
UserLayer l = styleFactory.createUserLayer();
l.userStyles().add(s);
StyledLayerDescriptor sld = styleFactory.createStyledLayerDescriptor();
sld.layers().add(l);
return sld;
}
Color color(String color, Color def) {
if (color == null) {
return def;
}
return new Color(Integer.valueOf(color.substring(0,2), 16),
Integer.valueOf(color.substring(2,4), 16), Integer.valueOf(color.substring(4,6), 16));
}
@Override
public void encode(StyledLayerDescriptor sld, Version version, boolean pretty, OutputStream output) throws IOException {
Properties props = new Properties();
for (Symbolizer sym : SLD.symbolizers(Styles.style(sld))) {
if (sym instanceof PointSymbolizer) {
props.put("type", "point");
}
else if (sym instanceof LineSymbolizer) {
props.put("type", "line");
}
else if (sym instanceof PolygonSymbolizer) {
props.put("type", "polygon");
}
else if (sym instanceof RasterSymbolizer) {
props.put("type", "raster");
}
}
props.store(output, null);
}
@Override
public List<Exception> validate(Object input, Version version, EntityResolver entityResolver) throws IOException {
return Collections.emptyList();
}
}