001: /*
002: * GeoTools - OpenSource mapping toolkit
003: * http://geotools.org
004: * (C) 2002-2006, GeoTools Project Managment Committee (PMC)
005: *
006: * This library is free software; you can redistribute it and/or
007: * modify it under the terms of the GNU Lesser General Public
008: * License as published by the Free Software Foundation;
009: * version 2.1 of the License.
010: *
011: * This library is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * Lesser General Public License for more details.
015: */
016: package org.geotools.caching.impl;
017:
018: import com.vividsolutions.jts.geom.Envelope;
019:
020: import org.geotools.caching.FeatureIndex;
021:
022: import org.geotools.data.DataStore;
023: import org.geotools.data.DefaultQuery;
024: import org.geotools.data.FeatureListener;
025: import org.geotools.data.FeatureSource;
026: import org.geotools.data.Query;
027:
028: import org.geotools.feature.FeatureCollection;
029: import org.geotools.feature.FeatureType;
030:
031: import org.opengis.filter.Filter;
032:
033: import java.io.IOException;
034:
035: /** Associates a FeatureIndex with a query.
036: * This is used to get a view from the index,
037: * ie. a subset of the features containes in the index.
038: *
039: * If more features are added to the underlying FeatureIndex,
040: * after instance is created, instance will reflect new set,
041: * as it delegates actual process to the FeatureIndex.
042: *
043: * @task implements private method : Query restrict(Query q)
044: *
045: * @author Christophe Rousson, SoC 2007, CRG-ULAVAL
046: *
047: */
048: public class IndexView implements FeatureSource {
049: private final FeatureIndex index;
050: private final Query view;
051:
052: /** Associates FeatureIndex with Query.
053: *
054: * @param index a FeatureIndex
055: * @param q Query
056: */
057: public IndexView(FeatureIndex index, Query q) {
058: this .index = index;
059: this .view = q;
060: }
061:
062: /** Creates a dummy view with all features,
063: * yielding all features within the FeatureIndex
064: *
065: * @param index FeatureIndex on which to build the view.
066: *
067: */
068: public IndexView(FeatureIndex index) {
069: this (index, Query.ALL);
070: }
071:
072: /********************************************************
073: **
074: ** Next methods delegate process to FeatureIndex.
075: **
076: ********************************************************/
077: public void addFeatureListener(FeatureListener arg0) {
078: // TODO Auto-generated method stub
079: }
080:
081: public Envelope getBounds() throws IOException {
082: // TODO Auto-generated method stub
083: return index.getBounds(view);
084: }
085:
086: public Envelope getBounds(Query q) throws IOException {
087: // TODO Auto-generated method stub
088: return index.getBounds(restrict(q));
089: }
090:
091: public int getCount(Query q) throws IOException {
092: // TODO Auto-generated method stub
093: return index.getCount(restrict(q));
094: }
095:
096: public DataStore getDataStore() {
097: // TODO Auto-generated method stub
098: return index.getDataStore();
099: }
100:
101: /* (non-Javadoc)
102: * @see org.geotools.data.FeatureSource#getFeatures()
103: *
104: * Get FeatureCollection associated with view from the FeatureIndex.
105: *
106: */
107: public FeatureCollection getFeatures() throws IOException {
108: // TODO Auto-generated method stub
109: return index.getFeatures(view);
110: }
111:
112: public FeatureCollection getFeatures(Query q) throws IOException {
113: return index.getFeatures(restrict(q));
114: }
115:
116: public FeatureCollection getFeatures(Filter f) throws IOException {
117: // TODO Auto-generated method stub
118: return index.getFeatures(new DefaultQuery("", f));
119: }
120:
121: public FeatureType getSchema() {
122: return index.getSchema();
123: }
124:
125: public void removeFeatureListener(FeatureListener arg0) {
126: // TODO Auto-generated method stub
127: }
128:
129: /** Actually does nothing,
130: * but ideally would return a new query
131: * defined by ((view query) AND (input query))
132: *
133: * @param q a Query
134: * @return new Query
135: */
136: private Query restrict(Query q) {
137: // TODO combine view query and new query
138: return q;
139: }
140: }
|