package org.geoserver.wfs.xml;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.geotools.feature.type.GeometryDescriptorImpl;
import org.geotools.feature.type.GeometryTypeImpl;
import org.geotools.geometry.jts.CurvedGeometry;
import org.geotools.geometry.jts.MultiCurvedGeometry;
import org.opengis.feature.Property;
import org.opengis.feature.type.AttributeType;
import org.opengis.feature.type.FeatureType;
import org.opengis.feature.type.GeometryDescriptor;
import org.opengis.feature.type.GeometryType;
import org.opengis.feature.type.Name;
import org.opengis.feature.type.PropertyDescriptor;
import org.opengis.filter.Filter;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.util.InternationalString;
import com.vividsolutions.jts.geom.LineString;
import com.vividsolutions.jts.geom.MultiLineString;
public class CurveTypeWrapper implements FeatureType {
FeatureType delegate;
public CurveTypeWrapper(FeatureType delegate) {
this.delegate = delegate;
}
public boolean isIdentified() {
return delegate.isIdentified();
}
public GeometryDescriptor getGeometryDescriptor() {
GeometryDescriptor gd = delegate.getGeometryDescriptor();
return wrapGeometryDescriptor(gd);
}
private GeometryDescriptor wrapGeometryDescriptor(GeometryDescriptor gd) {
GeometryType type = gd.getType();
Class<?> binding = type.getBinding();
if (MultiLineString.class.isAssignableFrom(binding)) {
GeometryType curvedType = new GeometryTypeImpl(type.getName(),
MultiCurvedGeometry.class, type.getCoordinateReferenceSystem(),
type.isIdentified(), type.isAbstract(),
type.getRestrictions(), type.getSuper(),
type.getDescription());
return new GeometryDescriptorImpl(curvedType, gd.getName(),
gd.getMinOccurs(), gd.getMaxOccurs(), gd.isNillable(),
gd.getDefaultValue());
} else if (LineString.class.isAssignableFrom(binding)) {
GeometryType curvedType = new GeometryTypeImpl(type.getName(),
CurvedGeometry.class, type.getCoordinateReferenceSystem(),
type.isIdentified(), type.isAbstract(),
type.getRestrictions(), type.getSuper(),
type.getDescription());
return new GeometryDescriptorImpl(curvedType, gd.getName(),
gd.getMinOccurs(), gd.getMaxOccurs(), gd.isNillable(),
gd.getDefaultValue());
} else {
return gd;
}
}
public CoordinateReferenceSystem getCoordinateReferenceSystem() {
return delegate.getCoordinateReferenceSystem();
}
public AttributeType getSuper() {
return delegate.getSuper();
}
public Class<Collection<Property>> getBinding() {
return delegate.getBinding();
}
public Collection<PropertyDescriptor> getDescriptors() {
List<PropertyDescriptor> result = new ArrayList<>();
Collection<PropertyDescriptor> descriptors = delegate.getDescriptors();
for (PropertyDescriptor pd : descriptors) {
if (pd instanceof GeometryDescriptor) {
pd = wrapGeometryDescriptor((GeometryDescriptor) pd);
}
result.add(pd);
}
return result;
}
public PropertyDescriptor getDescriptor(Name name) {
return delegate.getDescriptor(name);
}
public PropertyDescriptor getDescriptor(String name) {
return delegate.getDescriptor(name);
}
public Name getName() {
return delegate.getName();
}
public boolean isInline() {
return delegate.isInline();
}
public boolean isAbstract() {
return delegate.isAbstract();
}
public List<Filter> getRestrictions() {
return delegate.getRestrictions();
}
public InternationalString getDescription() {
return delegate.getDescription();
}
public Map<Object, Object> getUserData() {
return delegate.getUserData();
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((delegate == null) ? 0 : delegate.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
CurveTypeWrapper other = (CurveTypeWrapper) obj;
if (delegate == null) {
if (other.delegate != null)
return false;
} else if (!delegate.equals(other.delegate))
return false;
return true;
}
}