/* Copyright (c) 2001 - 2007 TOPP - www.openplans.org. All rights reserved.
* This code is licensed under the GPL 2.0 license, availible at the root
* application directory.
*/
package com.orci.geoserver.wfs.getnearest;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.geotools.data.FeatureResults;
import org.geotools.data.crs.ForceCoordinateSystemFeatureResults;
import org.geotools.feature.Feature;
import org.geotools.referencing.CRS;
import org.vfny.geoserver.global.FeatureTypeInfo;
/**
* Parameter object wich represents the results of a GetFeature or
* GetFeatureWithLock WFS request.<p>Holds the request, feature lock,
* feature types info and feature results produced when a succesfull execution
* of a GetFeature/GetFeatureWithLock ends</p>
*
* @author Gabriel Rold?n
* @version $Id: GetFeatureResults.java,v 1.1 2004/03/10 23:39:06 groldan Exp $
*/
public class GetNearestResults {
private static final Logger LOGGER = org.geotools.util.logging.Logging.getLogger("org.vfny.geoserver.responses");
/**
* the GetFeature or GetFeatureWithLock request who's processing
* has originated this results
*/
private final GetNearestRequest request;
/**
* List of FeatureResults obtained from excecuting the queries from
* the GetFeature request
*/
private List features;
/** List of FeatureTypeInfo objects for the queries featuretypes */
private List typeInfo;
/**
* Creates a new GetFeatureResults object.
*
* @param request the GetFeature or GetFeatureWithLock request who's
* processing has originated the results this object will hold
*/
public GetNearestResults(GetNearestRequest request) {
this.request = request;
features = new ArrayList(2);
typeInfo = new ArrayList(2);
}
/**
* returns the GetFeature or GetFeatureWithLock request who's
* processing has originated this results
*
* @return the GetFeature or GetFeatureWithLock request who's processing
* has originated this results
*/
public GetNearestRequest getRequest() {
return request;
}
/**
* returns the number of resultsets this object holds
*
* @return DOCUMENT ME!
*/
public int getResultsetsCount() {
return features.size();
}
/**
* returns the results of the queried featuretype at index
* <code>index</code>
*
* @param index the position in the list of FeatureResults to return
*
* @return the feature results object of the queried featuretype at index
* <code>index</code>
*
* @throws ArrayIndexOutOfBoundsException if index is not in the range from
* 0(zero) to FeatureResults' count -1
*/
public FeatureResults getFeatures(int index) throws ArrayIndexOutOfBoundsException {
return (FeatureResults) features.get(index);
}
/**
* returns the type info object of the queried featuretype at index
* <code>index</code>
*
* @param index the position in the list of typeinfos to return
*
* @return the type info object of the queried featuretype at index
* <code>index</code>
*
* @throws ArrayIndexOutOfBoundsException if index is not in the range from
* 0(zero) to FeatureTypeInfo's count -1
*/
public FeatureTypeInfo getTypeInfo(int index) throws ArrayIndexOutOfBoundsException {
return (FeatureTypeInfo) typeInfo.get(index);
}
/**
* getter for the list of FeatureResults this object holds
*
* @return an unmodifiable <code>List</code> of the
* <code>FeatureResults</code> this object holds
*/
public List getFeatures() {
return Collections.unmodifiableList(features);
}
/**
* getter for the list of FeatureResults this object holds
*
* @return an unmodifiable <code>List</code> of the
* <code>FeatureTypeInfo</code>'s this object holds
*/
public List getTypesInfo() {
return Collections.unmodifiableList(typeInfo);
}
/**
* Adds the results and metadata of a queries FeatureType to the
* list of GetFeature results this object holds
*
* @param meta the metadata object of the queried FeatureType
* @param features the resulting features from the queries FeatureType
*
* @throws IOException if an error occurs comparing the schemas from
* <code>meta</code> and <code>features</code>
* @throws NullPointerException if either of the arguments is
* <code>null</code>
* @throws IllegalArgumentException if <code>meta</code> and
* <code>features</code> aren't from the same featuretype
*/
public void addFeatures(FeatureTypeInfo meta, FeatureResults features)
throws IOException {
if ((meta == null) || (features == null)) {
throw new NullPointerException(
"Both the metadata and results of querying a featuretype must be passed");
}
if (!features.getSchema().getTypeName().equals(meta.getFeatureType().getTypeName())) {
throw new IllegalArgumentException("The passed type info and results"
+ " do not seems to belong to the same type");
}
if ((meta.getNativeCRS() != null) && features.getSchema().getDefaultGeometry() != null
&& !CRS.equalsIgnoreMetadata(meta.getNativeCRS(), meta.getDeclaredCRS())) {
try {
features = new ForceCoordinateSystemFeatureResults(features, meta.getDeclaredCRS());
} catch (Exception e) {
LOGGER.severe("Could not map original CRS to external CRS, "
+ "serving data in original CRS: " + e.getMessage());
LOGGER.log(Level.FINE, "Detailed mapping error: ", e);
}
}
this.typeInfo.add(meta);
this.features.add(features);
}
}