/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2004-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.
*/
package org.geotools.validation;
import java.util.logging.Logger;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.simple.SimpleFeatureType;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryCollection;
import com.vividsolutions.jts.geom.LineString;
import com.vividsolutions.jts.geom.MultiLineString;
/**
* Tests to see if a Feature ...
*
* <p>
* The geometry is first tested to see if it is null, and if it is null, then
* it is tested to see if it is allowed to be null by calling isNillable().
* </p>
*
* @author Jody Garnett, Refractions Research, Inc.
* @author $Author: jive $ (last modification)
*
* @source $URL$
* @version $Id$
*/
public class DefaultFeatureValidation implements FeatureValidation {
/** The logger for the validation module. */
private static final Logger LOGGER = org.geotools.util.logging.Logging.getLogger(
"org.geotools.validation");
/** User's Name of this validation test. */
private String name; // name of the validation
/** User's description of this validation test. */
private String description;
/**
* Identification of required FeatureType as dataStoreId:typeName.
*
* <p>
* The provided ValidationProcessor assumes that FeatureTypes will be
* references will be of the form dataStoreId:typeName.
* </p>
*
* <p>
* If "" or null is used All FetureTypes will be checked.
* </p>
*/
private String typeRef;
/**
* No argument constructor, required by the Java Bean Specification.
*/
public DefaultFeatureValidation() {
}
/**
* Sets the name of this validation.
*
* @param name The name of this validation.
*
* @see org.geotools.validation.Validation#setName(java.lang.String)
*/
public final void setName(String name) {
this.name = name;
}
/**
* Access the user's name for this test.
*
* @return The name of this validation.
*
* @see org.geotools.validation.Validation#getName()
*/
public final String getName() {
return name;
}
/**
* Sets the description of this validation.
*
* @param description The description of the validation.
*
* @see org.geotools.validation.Validation#setDescription(java.lang.String)
*/
public final void setDescription(String description) {
this.description = description;
}
/**
* Override getDescription.
*
* <p>
* Returns the description of this validation as a string.
* </p>
*
* @return The description of this validation.
*
* @see org.geotools.validation.Validation#getDescription()
*/
public final String getDescription() {
return description;
}
/**
* The priority level used to schedule this Validation.
*
* @return PRORITY_SIMPLE
*
* @see org.geotools.validation.Validation#getPriority()
*/
public int getPriority() {
return PRIORITY_SIMPLE;
}
/**
* Implementation of getTypeNames.
*
* @return Array of typeNames, or empty array for all, null for disabled
*
* @see org.geotools.validation.Validation#getTypeRefs()
*/
public String[] getTypeRefs() {
if (typeRef == null) {
return null;
}
if (typeRef.equals("*")) {
return ALL;
}
return new String[] { typeRef, };
}
/**
* Access typeRef property.
*
* @return Returns the typeRef in the format dataStoreId:typeName.
*/
public String getTypeRef() {
return typeRef;
}
/**
* Set typeRef to typeRef.
*
* @param typeRef The typeRef in the format dataStoreId:typeName
*/
public void setTypeRef(String typeRef) {
this.typeRef = typeRef;
}
/**
* Validation test for feature.
*
* <p>
* Description of test ...
* </p>
*
* @param feature The Feature to be validated
* @param type The FeatureType of the feature
* @param results The storage for error messages.
*
* @return <code>true</code> if the feature is a valid geometry.
*
* @see org.geotools.validation.FeatureValidation#validate
*/
public boolean validate(SimpleFeature feature, SimpleFeatureType type,
ValidationResults results) {
LOGGER.warning(getName() + " not implemented");
results.warning(feature, " test not implemented");
return false;
}
//
// Convience Methods
//
/**
* Retrives a single LineString from feature.getDefaultGeometry.
* <p>
* If feature contains MultiLineString (or GeometryCollection ) of length
* 1 it will be deemed sufficient. Shapefiles are determined to work with
* MultiLineStrings of length 1 forcing the creation of this method.
* </p>
*
* <p>
* If feature.getDefaultGeometry returns <code>null</code> this method
* will return null. For most cases the validation should just be abandoned
* with a warning; the user can separately specify a NullZero check. This
* will prevent the same error (a null value) being reproted by
* each and every SpatialValidation test.
* </p>
*
* @param feature Feature
* @return feature.getDefaultGeomertry as a LineString, or <code>null</code>
* @throws ClassCastException If feature.getDefaultGeometry is the wrong type
*/
protected LineString getDefaultLineString( SimpleFeature feature ) throws ClassCastException {
Geometry geom = (Geometry)feature.getDefaultGeometry();
if (geom == null) {
// Ignore null value, user can use NullZero check
return null;
}
if( geom instanceof LineString ){
return (LineString) geom;
}
else if( geom instanceof MultiLineString ){
// Shapefiles are determined to give us their contents as
// a MultiLineString - forcing our hand in this case
//
MultiLineString lines = (MultiLineString) geom;
if( lines.getNumGeometries() == 1){
return (LineString) lines.getGeometryN(0);
}
throw new ClassCastException("MultiLineString does not contain a single LineString");
}
else if( geom instanceof GeometryCollection ){
GeometryCollection geoms = (GeometryCollection) geom;
if( geoms.getNumGeometries() == 1 &&
geoms.getGeometryN( 0 ) instanceof LineString ){
return (LineString) geoms.getGeometryN(0);
}
throw new ClassCastException("GeometryCollection does not contain a single LineString");
}
else {
throw new ClassCastException("Cannot convert to LineString");
}
}
}