/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2002-2008, Open Source Geospatial Foundation (OSGeo)
*
* 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.
*
* Created on November 3, 2003, 12:00 PM
*/
package org.geotools.styling;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.geotools.data.DataStore;
import org.geotools.util.Utilities;
import org.opengis.feature.simple.SimpleFeatureType;
/**
* DJB: on inlinefeature support:
* The inline features also lets you "sort of" make your WMS into a WFS-T.
*
*I was going to implement this after SLD POST on monday, but I was
*expecting the definition in the spec to be a bit "nicer". Right now
*its just:
*
*<element name=�InlineFeature�>
* <complexType>
* <sequence>
* <element ref="gml:_Feature"
* maxOccurs="unbounded"/>
* </sequence>
* </complexType>
*
*
* (the spec hasnt been finalized)
*
* I guess if we make some assumptions about the data coming in - ie. every
* feature is the same type, and its simple (no nesting, no <choices>, and
* no attributes), then we can parse ones that look like:
*
* <Feature>
* <Name>David Blasby</Name>
* <Location> ... GML ... </Location>
* </Feature>
*
*
*I'm not the best at reading .xsd, but I think that means you can stick
*in ANY GML Feature. If so, its way too general.
*
*My plan was to parse the first Feature (or, the given schema if there is
*one) to find out all the property names (and which one(s) are the
*geometry) and make a FeatureType. (I'd assume all the properties were
*strings)
*
*Then, make a MemoryDataStore and put the features in it. I can pass
*this off to the lite renderer as normal.
*
* @author jamesm
* @source $URL$
*/
public class UserLayerImpl extends StyledLayerImpl implements UserLayer {
/**
* the (memory) datastore that will contain the inline features.
* The initial implementation has this as a MemoryDataStore with one FeatureType in it.
* You should ensure that you dont keep references to it around so it can be GCed.
*/
private DataStore inlineFeatureDatastore = null;
private SimpleFeatureType inlineFeatureType = null;
RemoteOWS remoteOWS;
List<Style> styles = new ArrayList<Style>();
List<FeatureTypeConstraint> constraints = new ArrayList<FeatureTypeConstraint>();
public RemoteOWS getRemoteOWS() {
return remoteOWS;
}
public DataStore getInlineFeatureDatastore() {
return inlineFeatureDatastore;
}
public SimpleFeatureType getInlineFeatureType() {
return inlineFeatureType;
}
public void setInlineFeatureDatastore(DataStore store) {
inlineFeatureDatastore = store;
}
public void setInlineFeatureType(SimpleFeatureType ft) {
inlineFeatureType = ft;
}
public void setRemoteOWS(RemoteOWS service)
{
this.remoteOWS = service;
}
public List<FeatureTypeConstraint> layerFeatureConstraints() {
return constraints;
}
public FeatureTypeConstraint[] getLayerFeatureConstraints(){
return constraints.toArray(new FeatureTypeConstraint[0]);
}
public void setLayerFeatureConstraints(FeatureTypeConstraint[] array){
this.constraints.clear();
this.constraints.addAll( Arrays.asList(array));
}
public List<Style> userStyles() {
return styles;
}
public Style[] getUserStyles(){
return (Style[])styles.toArray(new Style[0]);
}
public void setUserStyles(Style[] styles){
this.styles.clear();
this.styles.addAll(Arrays.asList(styles));
}
public void addUserStyle(Style style){
styles.add(style);
}
public void accept(StyleVisitor visitor) {
visitor.visit(this);
}
public boolean equals(Object oth) {
if (this == oth) {
return true;
}
if (oth instanceof UserLayerImpl) {
UserLayerImpl other = (UserLayerImpl) oth;
if (!(Utilities.equals(inlineFeatureDatastore, other.inlineFeatureDatastore) && Utilities.equals(inlineFeatureType, other.inlineFeatureType) && Utilities.equals(remoteOWS, other.remoteOWS) && Utilities.equals(styles, other.styles))) {
return false;
}
if (!Utilities.equals(constraints, other.constraints)){
return false;
}
return true;
}
return false;
}
}