/*
* Geotoolkit - An Open Source Java GIS Toolkit
* http://www.geotoolkit.org
*
* (C) 2014, Geomatys
*
* This library 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;
* version 2.1 of the License.
*
* This library 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
* Lesser General Public License for more details.
*/
package org.geotoolkit.display2d.ext.isoline.symbolizer;
import org.apache.sis.storage.DataStoreException;
import org.geotoolkit.display2d.GO2Utilities;
import org.geotoolkit.factory.FactoryFinder;
import org.geotoolkit.filter.function.other.OtherFunctionFactory;
import org.geotoolkit.processing.coverage.isoline2.Isoline2;
import org.geotoolkit.se.xml.v110.*;
import org.geotoolkit.sld.xml.StyleXmlIO;
import org.geotoolkit.style.StyleConstants;
import org.geotoolkit.style.visitor.ListingPropertyVisitor;
import org.opengis.feature.FeatureType;
import org.opengis.filter.FilterFactory;
import org.opengis.filter.expression.Expression;
import org.opengis.style.*;
import org.apache.sis.measure.Units;
import javax.measure.quantity.Length;
import javax.measure.Unit;
import javax.xml.bind.annotation.*;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
* @author Quentin Boileau (Geomatys)
*/
@XmlType(name = "IsolineSymbolizerType")
@XmlRootElement(name = "IsolineSymbolizer", namespace = "http://geotoolkit.org")
@XmlAccessorType(XmlAccessType.FIELD)
public class IsolineSymbolizer extends SymbolizerType implements ExtensionSymbolizer {
@XmlTransient
private static final FilterFactory FF = FactoryFinder.getFilterFactory(null);
@XmlElement(name = "Raster", namespace = "http://geotoolkit.org")
public RasterSymbolizerType rasterSymbolizerType;
@XmlElement(name = "Stroke", namespace = "http://geotoolkit.org")
public LineSymbolizerType lineSymbolizerType;
@XmlElement(name = "Text", namespace = "http://geotoolkit.org")
public TextSymbolizerType textSymbolizerType;
@XmlElement(name = "IsolineOnly", namespace = "http://geotoolkit.org")
public Boolean isolineOnly;
@XmlTransient
private RasterSymbolizer rasterSymbolizer;
@XmlTransient
private LineSymbolizer lineSymbolizer;
@XmlTransient
private TextSymbolizer textSymbolizer;
public IsolineSymbolizer() {
}
public IsolineSymbolizer(RasterSymbolizer rasterSymbolizer, LineSymbolizer lineSymbolize) {
this(rasterSymbolizer, lineSymbolize, null);
}
public IsolineSymbolizer(RasterSymbolizer rasterSymbolizer, LineSymbolizer lineSymbolize, TextSymbolizer ts) {
this(rasterSymbolizer, lineSymbolize, ts, false);
}
public IsolineSymbolizer(RasterSymbolizer rasterSymbolizer, LineSymbolizer lineSymbolizer, TextSymbolizer ts, Boolean isolineOnly) {
this.isolineOnly = isolineOnly;
setRasterSymbolizer(rasterSymbolizer);
setLineSymbolizer(lineSymbolizer);
if (ts == null) {
this.textSymbolizer = null;
} else {
setTextSymbolizer(GO2Utilities.STYLE_FACTORY.textSymbolizer(ts.getName(),
ts.getGeometryPropertyName(),
ts.getDescription(),
ts.getUnitOfMeasure(),
FF.function(OtherFunctionFactory.NUMBER_FORMAT, FF.literal("#.000"), FF.property("value")),
ts.getFont(),
StyleConstants.DEFAULT_POINTPLACEMENT,
ts.getHalo(),
ts.getFill()));
}
}
public IsolineSymbolizer(IsolineSymbolizer source) {
if (source != null) {
setRasterSymbolizer(source.getRasterSymbolizer());
setLineSymbolizer(source.getLineSymbolizer());
setTextSymbolizer(source.getTextSymbolizer());
setIsolineOnly(source.getIsolineOnly());
}
}
@Override
public String getExtensionName() {
return "Isoline";
}
@Override
public Map<String, Expression> getParameters() {
final Map<String, Expression> config = new HashMap<String, Expression>();
final Set<String> properties = new HashSet<String>();
if (rasterSymbolizer != null) {
rasterSymbolizer.accept(ListingPropertyVisitor.VISITOR, properties);
}
if (lineSymbolizer != null) {
lineSymbolizer.accept(ListingPropertyVisitor.VISITOR, properties);
}
if (textSymbolizer != null) {
textSymbolizer.accept(ListingPropertyVisitor.VISITOR, properties);
}
int i = 0;
for (String str : properties) {
config.put(String.valueOf(i++), FactoryFinder.getFilterFactory(null).property(str));
}
return config;
}
@Override
public Unit<Length> getUnitOfMeasure() {
return Units.POINT;
}
@Override
public String getGeometryPropertyName() {
return null;
}
@Override
public Expression getGeometry() {
return null;
}
@Override
public Object accept(StyleVisitor visitor, Object extraData) {
return visitor.visit(this, extraData);
}
public RasterSymbolizerType getRasterSymbolizerType() {
return rasterSymbolizerType;
}
public void setRasterSymbolizerType(RasterSymbolizerType rasterSymbolizerType) {
this.rasterSymbolizerType = rasterSymbolizerType;
this.rasterSymbolizer = null;
}
public LineSymbolizerType getLineSymbolizerType() {
return lineSymbolizerType;
}
public void setLineSymbolizerType(LineSymbolizerType lineSymbolizerType) {
this.lineSymbolizerType = lineSymbolizerType;
this.lineSymbolizer = null;
}
public TextSymbolizerType getTextSymbolizerType() {
return textSymbolizerType;
}
public void setTextSymbolizerType(TextSymbolizerType textSymbolizerType) {
this.textSymbolizerType = textSymbolizerType;
this.textSymbolizer = null;
}
public RasterSymbolizer getRasterSymbolizer() {
if (rasterSymbolizer != null) {
return rasterSymbolizer;
} else if (rasterSymbolizerType != null) {
final StyleXmlIO util = new StyleXmlIO();
rasterSymbolizer = util.getTransformer110().visit(rasterSymbolizerType);
return rasterSymbolizer;
}
return null;
}
public void setRasterSymbolizer(RasterSymbolizer rasterSymbolizer) {
this.rasterSymbolizer = rasterSymbolizer;
if (rasterSymbolizer != null) {
final StyleXmlIO util = new StyleXmlIO();
this.rasterSymbolizerType = util.getTransformerXMLv110().visit(rasterSymbolizer, null).getValue();
}
}
public LineSymbolizer getLineSymbolizer() {
if (lineSymbolizer != null) {
return lineSymbolizer;
} else if (lineSymbolizerType != null) {
final StyleXmlIO util = new StyleXmlIO();
lineSymbolizer = util.getTransformer110().visit(lineSymbolizerType);
return lineSymbolizer;
}
return null;
}
public void setLineSymbolizer(LineSymbolizer lineSymbolizer) {
this.lineSymbolizer = lineSymbolizer;
if (lineSymbolizer != null) {
final StyleXmlIO util = new StyleXmlIO();
this.lineSymbolizerType = util.getTransformerXMLv110().visit(lineSymbolizer, null).getValue();
}
}
public TextSymbolizer getTextSymbolizer() {
if (textSymbolizer != null) {
return textSymbolizer;
} else if (textSymbolizerType != null) {
final StyleXmlIO util = new StyleXmlIO();
textSymbolizer = util.getTransformer110().visit(textSymbolizerType);
return textSymbolizer;
}
return null;
}
public void setTextSymbolizer(TextSymbolizer textSymbolizer) {
this.textSymbolizer = textSymbolizer;
if (textSymbolizer != null) {
final StyleXmlIO util = new StyleXmlIO();
this.textSymbolizerType = util.getTransformerXMLv110().visit(textSymbolizer, null).getValue();
}
}
public Boolean getIsolineOnly() {
return isolineOnly;
}
public void setIsolineOnly(Boolean isolineOnly) {
this.isolineOnly = isolineOnly;
}
/**
* Get Isoline FeatureType
* @return
* @throws DataStoreException
*/
public static FeatureType buildIsolineType() throws DataStoreException {
return Isoline2.buildIsolineFeatureType(null,null);
}
}