/[schmitzm]/trunk/src/skrueger/geotools/StyledFeatureCollectionTableModel.java
ViewVC logotype

Contents of /trunk/src/skrueger/geotools/StyledFeatureCollectionTableModel.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 335 - (show annotations)
Wed Aug 26 18:09:39 2009 UTC (15 years, 6 months ago) by alfonx
Original Path: branches/1.0-gt2-2.6/src/skrueger/geotools/StyledFeatureCollectionTableModel.java
File size: 10359 byte(s)
Migrating to GT2.6...
1 /*******************************************************************************
2 * Copyright (c) 2009 Martin O. J. Schmitz.
3 *
4 * This file is part of the SCHMITZM library - a collection of utility
5 * classes based on Java 1.6, focusing (not only) on Java Swing
6 * and the Geotools library.
7 *
8 * The SCHMITZM project is hosted at:
9 * http://wald.intevation.org/projects/schmitzm/
10 *
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Lesser General Public License
13 * as published by the Free Software Foundation; either version 3
14 * of the License, or (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU Lesser General Public License (license.txt)
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
24 * or try this link: http://www.gnu.org/licenses/lgpl.html
25 *
26 * Contributors:
27 * Martin O. J. Schmitz - initial API and implementation
28 * Stefan A. Krüger - additional utility classes
29 ******************************************************************************/
30 package skrueger.geotools;
31
32 import java.util.Iterator;
33 import java.util.Map;
34 import java.util.Vector;
35
36 import org.apache.log4j.Logger;
37 import org.geotools.data.DefaultQuery;
38 import org.geotools.data.FeatureSource;
39 import org.geotools.data.Query;
40 import org.geotools.data.memory.MemoryDataStore;
41 import org.geotools.feature.FeatureCollection;
42 import org.opengis.feature.simple.SimpleFeature;
43 import org.opengis.feature.simple.SimpleFeatureType;
44 import org.opengis.feature.type.AttributeDescriptor;
45 import org.opengis.feature.type.FeatureType;
46 import org.opengis.filter.Filter;
47
48 import schmitzm.geotools.gui.FeatureCollectionTableModel;
49 import skrueger.AttributeMetaData;
50 import skrueger.i8n.I8NUtil;
51 import skrueger.i8n.Translation;
52
53 import com.vividsolutions.jts.geom.Envelope;
54
55 /**
56 * This class extends the the {@link FeatureCollectionTableModel} with the
57 * functionalities of the {@link AttributeMetaData} of
58 * {@linkplain StyledLayerInterface styled objects}.
59 * <ul>
60 * <li>column names are translated according to
61 * {@link AttributeMetaData#getTitle()}</li>
62 * <li>columns are hidden according to {@link AttributeMetaData#isVisible()()}</li>
63 * </ul>
64 *
65 * @author <a href="mailto:[email protected]">Martin Schmitz</a>
66 * (University of Bonn/Germany)
67 */
68 public class StyledFeatureCollectionTableModel extends
69 FeatureCollectionTableModel {
70 final static private Logger LOGGER = Logger
71 .getLogger(StyledFeatureCollectionTableModel.class);
72 /** Holds the data source as styled layer. */
73 protected StyledLayerInterface<?> layer = null;
74 /** Contains only the visible elements of the {@link AttributeMetaData}-Map */
75 protected Map<Integer, AttributeMetaData> visibleAMD = null;
76 /** Holds the data source for the table as {@code FeatureSource}. */
77 protected FeatureSource featureSource = null;
78 /** Contains the complete {@link AttributeMetaData}-Map of the styled layer. */
79 protected Map<Integer, AttributeMetaData> origAMD = null;
80 /** Holds the current filter on the table */
81 protected Filter filter = null;
82 /** Holds the Bounds for all features. Only set once during the constructor **/
83 protected Envelope bounds;
84
85
86
87 /**
88 * Creates a new table model for a styled layer.
89 *
90 * @param layer
91 * the styled layer
92 */
93 public StyledFeatureCollectionTableModel(
94 StyledFeatureCollectionInterface layer) {
95 this(layer, Filter.INCLUDE);
96 }
97
98 /**
99 * Creates a new table model for a styled layer.
100 *
101 * @param layer
102 * the styled layer
103 * @param filter
104 * filter applied to the table
105 */
106 public StyledFeatureCollectionTableModel(
107 StyledFeatureCollectionInterface layer, Filter filter) {
108 super();
109 setFeatureCollection(layer, filter);
110 }
111
112
113 /**
114 * Creates a new table model for a styled layer.
115 *
116 * @param layer
117 * the styled layer
118 */
119 public StyledFeatureCollectionTableModel(StyledFeaturesInterface layer) {
120 this(layer, Filter.INCLUDE);
121 }
122
123 /**
124 * Creates a new table model for a styled layer.
125 *
126 * @param layer
127 * the styled layer
128 * @param filter
129 * filter applied to the table
130 */
131 public StyledFeatureCollectionTableModel(StyledFeaturesInterface layer,
132 Filter filter) {
133 super();
134 setFeatureCollection(layer, filter);
135 }
136
137 /**
138 * Sets a new data source for the table.
139 *
140 * @param fs
141 * the feature source
142 * @param amd
143 * {@link AttributeMetaData}-Map to define the visible attributes
144 * and translation
145 */
146 protected void setFeatureSource(FeatureSource<SimpleFeatureType, SimpleFeature> fs,
147 Map<Integer, AttributeMetaData> amd, Filter filter)
148 throws Exception {
149 if (filter == null)
150 filter = Filter.INCLUDE;
151
152 this.featureSource = fs;
153 this.filter = filter;
154 this.origAMD = amd;
155 this.visibleAMD = null;
156
157 FeatureCollection fc = null;
158 if (fs != null) {
159
160 bounds = fs.getBounds();
161
162 Query query = new DefaultQuery(fs.getSchema().getName().getLocalPart(), filter);
163 if (amd != null) {
164 // determine the names of the visible Attributes
165 this.visibleAMD = StyledLayerUtil.getVisibleAttributeMetaData(
166 amd, true);
167 Vector<String> visibleAttrNames = new Vector<String>();
168 // Add the column with the geometry (usually "the_geom")
169 visibleAttrNames.add(fs.getSchema().getGeometryDescriptor()
170 .getLocalName());
171 for (int attrIdx : visibleAMD.keySet()) {
172
173 /**
174 * If the user removed columns from the schema of the DBF
175 * file, there might exist AttributeMetaData for columns
176 * that don't exists. We check here to avoid an
177 * ArrayOutOfIndex.
178 */
179 if (attrIdx < fs.getSchema().getAttributeCount()) {
180 final AttributeDescriptor attributeTypeAtIdx = fs.getSchema()
181 .getAttributeDescriptors().get(attrIdx);
182 visibleAttrNames.add(attributeTypeAtIdx.getLocalName());
183 } else {
184 LOGGER.warn("AttributeMetaData has been found for columnIdx="+attrIdx+", but fs.getSchema().getAttributeCount() = "+fs.getSchema().getAttributeCount()+". Ignored.");
185 }
186 }
187
188 // create a query for the visible attributes
189 String[] properties = visibleAttrNames.toArray(new String[0]);
190
191 LOGGER.debug("Query contains the following attributes: "
192 + visibleAttrNames);
193
194 query = new DefaultQuery(fs.getSchema().getTypeName(), filter,
195 properties);
196 }
197 fc = fs.getFeatures(query);
198
199 // FAILS:!!!, even with query = new
200 // DefaultQuery(fs.getSchema().getTypeName(), filter);
201 // java.lang.UnsupportedOperationException: Unknown feature
202 // attribute: PQM_MOD
203 // at
204 // schmitzm.geotools.feature.FeatureOperationTree.evaluate(FeatureOperationTree.java:93)
205 // bounds = fc.getBounds();
206 // SK, 17.4.2009
207 //
208 // System.out.println("Filter = "+filter);
209 // System.out.println("Size of FC = "+fc.size());
210 // System.out.println("anz att= "+fc.getNumberOfAttributes());
211 }
212 setFeatureCollection(fc);
213 }
214
215 /**
216 * Converts the {@code StyledFeatureCollection} to a {@code FeatureSource}
217 * and sets this as the new data source for the table.
218 *
219 * @param fs
220 * the feature source
221 * @param amd
222 * {@link AttributeMetaData}-Map to define the visible attributes
223 * and translation
224 */
225 public void setFeatureCollection(StyledFeaturesInterface layer,
226 Filter filter) {
227 this.layer = layer;
228 try {
229 if (layer == null)
230 setFeatureSource(null, null, null);
231 else {
232 FeatureCollection fc = layer.getFeatureCollection();
233 String fcName = fc.getSchema().getName().getLocalPart();
234 FeatureSource fs = new MemoryDataStore(fc)
235 .getFeatureSource(fcName);
236 setFeatureSource(fs, layer.getAttributeMetaDataMap(), filter);
237 }
238 } catch (Exception err) {
239 throw new RuntimeException(err);
240 }
241 }
242
243 /**
244 * Sets the {@code StyledFeatureCollection} as new data source for the
245 * table.
246 *
247 * @param fs
248 * the feature source
249 * @param amd
250 * {@link AttributeMetaData}-Map to define the visible attributes
251 * and translation
252 */
253 public void setFeatureCollection(StyledFeatureSourceInterface layer,
254 Filter filter) {
255 this.layer = layer;
256 try {
257 if (layer == null)
258 setFeatureSource(null, null, null);
259 else
260 setFeatureSource(layer.getGeoObject(), layer
261 .getAttributeMetaDataMap(), filter);
262 } catch (Exception err) {
263 throw new RuntimeException(err);
264 }
265 }
266
267 /**
268 * Resets the filter for the table.
269 *
270 * @param filter
271 * a filter
272 */
273 public void setFilter(Filter filter) {
274 try {
275 setFeatureSource(this.featureSource, this.origAMD, filter);
276 } catch (Exception err) {
277 LOGGER.error("Setting the filter of the table model", err);
278 throw new RuntimeException(err);
279 }
280 }
281
282 /**
283 * @return <code>Filter.INCLUDE</code> or the {@link Filter} applied to the
284 * Features
285 */
286 public Filter getFilter() {
287 return this.filter;
288 }
289
290 /**
291 * After calling {@code super.reorganize(.)} this method replaced the column
292 * descriptions with the titles of the {@code AttributeMetaData}.
293 *
294 * @param fireTableStructureChanged
295 * indicates whether a table event is initiated after reorganize
296 */
297 @Override
298 protected void reorganize(boolean fireTableStructureChanged) {
299 super.reorganize(false);
300 // translate the column names
301 if (visibleAMD != null) {
302 Iterator<Integer> keys = visibleAMD.keySet().iterator();
303 for (int i = 0; i < colNames.length && keys.hasNext(); i++) {
304 Translation title = visibleAMD.get(keys.next()).getTitle();
305 if (!I8NUtil.isEmpty(title)) {
306 // System.out.println("set colname " + i + " to " +
307 // title.toString());
308 colNames[i] = title.toString();
309 }
310 }
311 }
312 if (fireTableStructureChanged)
313 fireTableStructureChanged();
314 }
315
316 /**
317 * @return Cached bounds for the whole dataset (without applying the filter)
318 * or <code>null</code>
319 */
320 public Envelope getBounds() {
321 return bounds;
322 }
323 }

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26