/*
* Geotoolkit - An Open Source Java GIS Toolkit
* http://www.geotoolkit.org
*
* (C) 2008 - 2009, 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; either
* version 2.1 of the License, or (at your option) any later version.
*
* 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.sld.xml;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.geotoolkit.sld.xml.v110.InlineFeature;
import org.geotoolkit.sld.xml.v110.LayerCoverageConstraints;
import org.geotoolkit.sld.xml.v110.LayerFeatureConstraints;
import org.geotoolkit.sld.xml.v110.NamedLayer;
import org.geotoolkit.sld.xml.v110.StyledLayerDescriptor;
import org.geotoolkit.sld.xml.v110.UseSLDLibrary;
import org.geotoolkit.sld.xml.v110.UserLayer;
import org.geotoolkit.sld.xml.v110.UserStyle;
import org.geotoolkit.sld.MutableLayer;
import org.geotoolkit.sld.MutableLayerCoverageConstraints;
import org.geotoolkit.sld.MutableLayerFeatureConstraints;
import org.geotoolkit.sld.MutableLayerStyle;
import org.geotoolkit.sld.MutableNamedLayer;
import org.geotoolkit.sld.MutableNamedStyle;
import org.geotoolkit.sld.MutableStyledLayerDescriptor;
import org.geotoolkit.sld.MutableUserLayer;
import org.geotoolkit.sld.MutableSLDFactory;
import org.geotoolkit.style.MutableStyle;
import org.geotoolkit.style.MutableStyleFactory;
import org.opengis.util.GenericName;
import org.opengis.filter.Filter;
import org.opengis.filter.FilterFactory2;
import org.opengis.metadata.citation.OnlineResource;
import org.opengis.util.FactoryException;
import org.opengis.sld.CoverageConstraint;
import org.opengis.sld.CoverageExtent;
import org.opengis.sld.Extent;
import org.opengis.sld.FeatureTypeConstraint;
import org.opengis.sld.RangeAxis;
import org.opengis.sld.RemoteOWS;
import org.opengis.sld.SLDLibrary;
import org.opengis.sld.Source;
/**
* Transform a SLD v1.1.0 in GT classes.
*
* @author Johann Sorel (Geomatys)
* @module
*/
public class SLD110toGTTransformer extends SE110toGTTransformer{
protected final MutableSLDFactory sldFactory;
public SLD110toGTTransformer(final FilterFactory2 filterFactory, final MutableStyleFactory styleFactory,
final MutableSLDFactory sldFactory) {
super(filterFactory,styleFactory);
this.sldFactory = sldFactory;
}
public SLD110toGTTransformer(final FilterFactory2 filterFactory, final MutableStyleFactory styleFactory,
final MutableSLDFactory sldFactory, final Map<String, String> namespaceMapping) {
super(filterFactory,styleFactory, namespaceMapping);
this.sldFactory = sldFactory;
}
/**
* Transform a jaxb v1.1.0 SLD in a GT class.
*/
public MutableStyledLayerDescriptor visit(final StyledLayerDescriptor sld) throws FactoryException{
final MutableStyledLayerDescriptor geoSLD = sldFactory.createSLD();
geoSLD.setName(sld.getName());
geoSLD.setVersion(sld.getVersion());
geoSLD.setDescription(visitDescription(sld.getDescription()));
geoSLD.libraries().addAll( visitLibraries(sld.getUseSLDLibrary()) );
geoSLD.layers().addAll( visitLayers(sld.getNamedLayerOrUserLayer()));
return geoSLD;
}
/**
* Transform a jaxb v1.1.0 SLD UseSLDLibrary in a GT SLD library objects.
*/
public Collection<? extends SLDLibrary> visitLibraries( final List<UseSLDLibrary> libs){
if(libs == null || libs.isEmpty()){
return Collections.emptyList();
}else{
final Collection<SLDLibrary> sldLibs = new ArrayList<SLDLibrary>();
for(final UseSLDLibrary use : libs){
final OnlineResource online = visitOnlineResource(use.getOnlineResource());
if(online != null) sldLibs.add(sldFactory.createSLDLibrary(online));
}
return sldLibs;
}
}
/**
* Transform a jaxb v1.1.0 SLD layers in a GT layers Objects
*/
public Collection<? extends MutableLayer> visitLayers(final List<Object> layers) throws FactoryException{
if(layers == null || layers.isEmpty()){
return Collections.emptyList();
} else {
final Collection<MutableLayer> sldLayers = new ArrayList<MutableLayer>();
for(final Object obj : layers){
if(obj instanceof NamedLayer){
final NamedLayer nl = (NamedLayer) obj;
final MutableNamedLayer mnl = sldFactory.createNamedLayer();
mnl.setName(nl.getName());
mnl.setDescription(visitDescription(nl.getDescription()));
mnl.getConstraints().constraints().addAll(visitFeatureConstraints(nl.getLayerFeatureConstraints()));
mnl.styles().addAll( visitStyles(nl.getNamedStyleOrUserStyle()) );
sldLayers.add(mnl);
}else if( obj instanceof UserLayer){
final UserLayer ul = (UserLayer) obj;
final MutableUserLayer mul = sldFactory.createUserLayer();
mul.setName(ul.getName());
mul.setDescription(visitDescription(ul.getDescription()));
mul.styles().addAll( visitUserStyles(ul.getUserStyle()) );
if(ul.getLayerCoverageConstraints() != null){
final MutableLayerCoverageConstraints consts = sldFactory.createLayerCoverageConstraints();
consts.constraints().addAll(visitCoverageConstraints(ul.getLayerCoverageConstraints()));
mul.setConstraints(consts);
}else if(ul.getLayerFeatureConstraints() != null){
final MutableLayerFeatureConstraints consts = sldFactory.createLayerFeatureConstraints();
consts.constraints().addAll(visitFeatureConstraints(ul.getLayerFeatureConstraints()));
mul.setConstraints(consts);
}
if(ul.getInlineFeature() != null){
mul.setSource(visitInlineFeature(ul.getInlineFeature()));
}else if(ul.getRemoteOWS() != null){
mul.setSource(visiteRemoteOWS(ul.getRemoteOWS()));
}
sldLayers.add(mul);
}
}
return sldLayers;
}
}
/**
* Transform a jaxb v1.1.0 SLD constraints in a GT constraints class.
*/
public Collection<? extends FeatureTypeConstraint> visitFeatureConstraints(final LayerFeatureConstraints ftc) throws FactoryException{
if(ftc == null || ftc.getFeatureTypeConstraint() == null || ftc.getFeatureTypeConstraint().isEmpty()){
return Collections.emptyList();
}else{
final Collection<FeatureTypeConstraint> constraints = new ArrayList<FeatureTypeConstraint>();
for(final org.geotoolkit.sld.xml.v110.FeatureTypeConstraint aftc : ftc.getFeatureTypeConstraint()){
final GenericName name = visitQName(aftc.getFeatureTypeName());
final Filter filter = visitFilter(aftc.getFilter());
final List<Extent> extents = visitExtents(aftc.getExtent());
final FeatureTypeConstraint cons = sldFactory.createFeatureTypeConstraint(name, filter, extents);
constraints.add(cons);
}
return constraints;
}
}
/**
* Transform a jaxb v1.1.0 SLD constraints in a GT constraints class.
*/
public Collection<? extends CoverageConstraint> visitCoverageConstraints(final LayerCoverageConstraints ftc){
if(ftc == null || ftc.getCoverageConstraint() == null || ftc.getCoverageConstraint().isEmpty()){
return Collections.emptyList();
}else{
final Collection<CoverageConstraint> constraints = new ArrayList<CoverageConstraint>();
for(final org.geotoolkit.sld.xml.v110.CoverageConstraint aftc : ftc.getCoverageConstraint()){
final String name = aftc.getCoverageName();
final CoverageExtent extent = visitCoverageExtent(aftc.getCoverageExtent());
final CoverageConstraint cons = sldFactory.createCoverageConstraint(name, extent);
constraints.add(cons);
}
return constraints;
}
}
/**
* Transform a jaxb v1.1.0 SLD extents in a GT extents class.
*/
public List<Extent> visitExtents(final List<org.geotoolkit.sld.xml.v110.Extent> exts){
if(exts == null || exts.isEmpty()){
return Collections.emptyList();
}else{
final List<Extent> extents = new ArrayList<Extent>();
for(final org.geotoolkit.sld.xml.v110.Extent ex : exts){
extents.add(sldFactory.createExtent(ex.getName(), ex.getValue()));
}
return extents;
}
}
/**
* Transform a jaxb v1.1.0 SLD extent in a GT extent class.
*/
public CoverageExtent visitCoverageExtent(final org.geotoolkit.sld.xml.v110.CoverageExtent coverageExtent) {
if(coverageExtent == null){
return null;
}else{
if(coverageExtent.getTimePeriod() != null){
return sldFactory.createCoverageExtent(coverageExtent.getTimePeriod());
}else if(coverageExtent.getRangeAxis() != null){
return sldFactory.createCoverageExtent(visitRangeAxis(coverageExtent.getRangeAxis()));
}else{
return null;
}
}
}
/**
* Transform a jaxb v1.1.0 SLD RangeAxis in a GT RangeAxis class.
*/
public List<RangeAxis> visitRangeAxis(final List<org.geotoolkit.sld.xml.v110.RangeAxis> ranges){
if(ranges == null || ranges.isEmpty()){
return Collections.emptyList();
}else{
final List<RangeAxis> axis = new ArrayList<RangeAxis>();
for(final org.geotoolkit.sld.xml.v110.RangeAxis axe : ranges){
axis.add( sldFactory.createRangeAxis(axe.getName(), axe.getValue()) );
}
return axis;
}
}
/**
* Transform a jaxb v1.1.0 SLD remoteOWS in a GT remoteOWS class.
*/
public RemoteOWS visiteRemoteOWS(final org.geotoolkit.sld.xml.v110.RemoteOWS ows){
if(ows == null){
return null;
}else{
final OnlineResource online = visitOnlineResource(ows.getOnlineResource());
if( online != null){
return sldFactory.createRemoteOWS(ows.getService(), online);
}else{
return null;
}
}
}
/**
* Transform a jaxb v1.1.0 SLD inlineFeature in a GT inlineFeature class.
*/
public Source visitInlineFeature(final InlineFeature inlineFeature) {
//TODO : fix this when GML works.
return null;
}
/**
* Transform a jaxb v1.1.0 SLD layer style in a GT style class.
*/
public Collection<? extends MutableLayerStyle> visitStyles(final List<Object> styles) throws FactoryException{
if(styles == null || styles.isEmpty()){
return Collections.emptyList();
}else{
final Collection<MutableLayerStyle> mStyles = new ArrayList<MutableLayerStyle>();
for(final Object obj : styles){
if(obj instanceof org.geotoolkit.sld.xml.v110.NamedStyle){
final org.geotoolkit.sld.xml.v110.NamedStyle ns = (org.geotoolkit.sld.xml.v110.NamedStyle) obj;
final MutableNamedStyle mns = sldFactory.createNamedStyle();
mns.setName(ns.getName());
mns.setDescription(visitDescription(ns.getDescription()));
mStyles.add(mns);
}else if(obj instanceof org.geotoolkit.sld.xml.v110.UserStyle){
final org.geotoolkit.sld.xml.v110.UserStyle us = (org.geotoolkit.sld.xml.v110.UserStyle) obj;
//we call SE transformer for this part
mStyles.add(visitUserStyle(us));
}
}
return mStyles;
}
}
/**
* Transform a jaxb v1.1.0 layer style in a GT layer style class.
*/
public Collection<? extends MutableStyle> visitUserStyles(final List<UserStyle> styles) throws FactoryException{
if(styles == null || styles.isEmpty()){
return Collections.emptyList();
}else{
final Collection<MutableStyle> mStyles = new ArrayList<MutableStyle>();
for(final org.geotoolkit.sld.xml.v110.UserStyle us : styles){
//we call SE transformer for this part
mStyles.add(visitUserStyle(us));
}
return mStyles;
}
}
}