/[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 341 - (show annotations)
Mon Aug 31 10:16:40 2009 UTC (15 years, 6 months ago) by alfonx
Original Path: branches/1.0-gt2-2.6/src/skrueger/geotools/StyledFeatureCollectionTableModel.java
File size: 10314 byte(s)
Migrating to GT2.6... only 46 compile errors left...
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.filter.Filter;
46
47 import schmitzm.geotools.gui.FeatureCollectionTableModel;
48 import skrueger.AttributeMetaData;
49 import skrueger.i8n.I8NUtil;
50 import skrueger.i8n.Translation;
51
52 import com.vividsolutions.jts.geom.Envelope;
53
54 /**
55 * This class extends the the {@link FeatureCollectionTableModel} with the
56 * functionalities of the {@link AttributeMetaData} of
57 * {@linkplain StyledLayerInterface styled objects}.
58 * <ul>
59 * <li>column names are translated according to
60 * {@link AttributeMetaData#getTitle()}</li>
61 * <li>columns are hidden according to {@link AttributeMetaData#isVisible()()}</li>
62 * </ul>
63 *
64 * @author <a href="mailto:[email protected]">Martin Schmitz</a>
65 * (University of Bonn/Germany)
66 */
67 public class StyledFeatureCollectionTableModel extends
68 FeatureCollectionTableModel {
69 final static private Logger LOGGER = Logger
70 .getLogger(StyledFeatureCollectionTableModel.class);
71 /** Holds the data source as styled layer. */
72 protected StyledLayerInterface<?> layer = null;
73 /** Contains only the visible elements of the {@link AttributeMetaData}-Map */
74 protected Map<Integer, AttributeMetaData> visibleAMD = null;
75 /** Holds the data source for the table as {@code FeatureSource}. */
76 protected FeatureSource featureSource = null;
77 /** Contains the complete {@link AttributeMetaData}-Map of the styled layer. */
78 protected Map<Integer, AttributeMetaData> origAMD = null;
79 /** Holds the current filter on the table */
80 protected Filter filter = null;
81 /** Holds the Bounds for all features. Only set once during the constructor **/
82 protected Envelope bounds;
83
84
85
86 /**
87 * Creates a new table model for a styled layer.
88 *
89 * @param layer
90 * the styled layer
91 */
92 public StyledFeatureCollectionTableModel(
93 StyledFeatureCollectionInterface layer) {
94 this(layer, Filter.INCLUDE);
95 }
96
97 /**
98 * Creates a new table model for a styled layer.
99 *
100 * @param layer
101 * the styled layer
102 * @param filter
103 * filter applied to the table
104 */
105 public StyledFeatureCollectionTableModel(
106 StyledFeatureCollectionInterface layer, Filter filter) {
107 super();
108 setFeatureCollection(layer, filter);
109 }
110
111
112 /**
113 * Creates a new table model for a styled layer.
114 *
115 * @param layer
116 * the styled layer
117 */
118 public StyledFeatureCollectionTableModel(StyledFeaturesInterface layer) {
119 this(layer, Filter.INCLUDE);
120 }
121
122 /**
123 * Creates a new table model for a styled layer.
124 *
125 * @param layer
126 * the styled layer
127 * @param filter
128 * filter applied to the table
129 */
130 public StyledFeatureCollectionTableModel(StyledFeaturesInterface layer,
131 Filter filter) {
132 super();
133 setFeatureCollection(layer, filter);
134 }
135
136 /**
137 * Sets a new data source for the table.
138 *
139 * @param fs
140 * the feature source
141 * @param amd
142 * {@link AttributeMetaData}-Map to define the visible attributes
143 * and translation
144 */
145 protected void setFeatureSource(FeatureSource<SimpleFeatureType, SimpleFeature> fs,
146 Map<Integer, AttributeMetaData> amd, Filter filter)
147 throws Exception {
148 if (filter == null)
149 filter = Filter.INCLUDE;
150
151 this.featureSource = fs;
152 this.filter = filter;
153 this.origAMD = amd;
154 this.visibleAMD = null;
155
156 FeatureCollection fc = null;
157 if (fs != null) {
158
159 bounds = fs.getBounds();
160
161 Query query = new DefaultQuery(fs.getSchema().getName().getLocalPart(), filter);
162 if (amd != null) {
163 // determine the names of the visible Attributes
164 this.visibleAMD = StyledLayerUtil.getVisibleAttributeMetaData(
165 amd, true);
166 Vector<String> visibleAttrNames = new Vector<String>();
167 // Add the column with the geometry (usually "the_geom")
168 visibleAttrNames.add(fs.getSchema().getGeometryDescriptor()
169 .getLocalName());
170 for (int attrIdx : visibleAMD.keySet()) {
171
172 /**
173 * If the user removed columns from the schema of the DBF
174 * file, there might exist AttributeMetaData for columns
175 * that don't exists. We check here to avoid an
176 * ArrayOutOfIndex.
177 */
178 if (attrIdx < fs.getSchema().getAttributeCount()) {
179 final AttributeDescriptor attributeTypeAtIdx = fs.getSchema()
180 .getAttributeDescriptors().get(attrIdx);
181 visibleAttrNames.add(attributeTypeAtIdx.getLocalName());
182 } else {
183 LOGGER.warn("AttributeMetaData has been found for columnIdx="+attrIdx+", but fs.getSchema().getAttributeCount() = "+fs.getSchema().getAttributeCount()+". Ignored.");
184 }
185 }
186
187 // create a query for the visible attributes
188 String[] properties = visibleAttrNames.toArray(new String[0]);
189
190 LOGGER.debug("Query contains the following attributes: "
191 + visibleAttrNames);
192
193 query = new DefaultQuery(fs.getSchema().getTypeName(), filter,
194 properties);
195 }
196 fc = fs.getFeatures(query);
197
198 // FAILS:!!!, even with query = new
199 // DefaultQuery(fs.getSchema().getTypeName(), filter);
200 // java.lang.UnsupportedOperationException: Unknown feature
201 // attribute: PQM_MOD
202 // at
203 // schmitzm.geotools.feature.FeatureOperationTree.evaluate(FeatureOperationTree.java:93)
204 // bounds = fc.getBounds();
205 // SK, 17.4.2009
206 //
207 // System.out.println("Filter = "+filter);
208 // System.out.println("Size of FC = "+fc.size());
209 // System.out.println("anz att= "+fc.getNumberOfAttributes());
210 }
211 setFeatureCollection(fc);
212 }
213
214 /**
215 * Converts the {@code StyledFeatureCollection} to a {@code FeatureSource}
216 * and sets this as the new data source for the table.
217 *
218 * @param fs
219 * the feature source
220 * @param amd
221 * {@link AttributeMetaData}-Map to define the visible attributes
222 * and translation
223 */
224 public void setFeatureCollection(StyledFeaturesInterface layer,
225 Filter filter) {
226 this.layer = layer;
227 try {
228 if (layer == null)
229 setFeatureSource(null, null, null);
230 else {
231 FeatureCollection fc = layer.getFeatureCollection();
232 String fcName = fc.getSchema().getName().getLocalPart();
233 FeatureSource fs = new MemoryDataStore(fc)
234 .getFeatureSource(fcName);
235 setFeatureSource(fs, layer.getAttributeMetaDataMap(), filter);
236 }
237 } catch (Exception err) {
238 throw new RuntimeException(err);
239 }
240 }
241
242 /**
243 * Sets the {@code StyledFeatureCollection} as new data source for the
244 * table.
245 *
246 * @param fs
247 * the feature source
248 * @param amd
249 * {@link AttributeMetaData}-Map to define the visible attributes
250 * and translation
251 */
252 public void setFeatureCollection(StyledFeatureSourceInterface layer,
253 Filter filter) {
254 this.layer = layer;
255 try {
256 if (layer == null)
257 setFeatureSource(null, null, null);
258 else
259 setFeatureSource(layer.getGeoObject(), layer
260 .getAttributeMetaDataMap(), filter);
261 } catch (Exception err) {
262 throw new RuntimeException(err);
263 }
264 }
265
266 /**
267 * Resets the filter for the table.
268 *
269 * @param filter
270 * a filter
271 */
272 public void setFilter(Filter filter) {
273 try {
274 setFeatureSource(this.featureSource, this.origAMD, filter);
275 } catch (Exception err) {
276 LOGGER.error("Setting the filter of the table model", err);
277 throw new RuntimeException(err);
278 }
279 }
280
281 /**
282 * @return <code>Filter.INCLUDE</code> or the {@link Filter} applied to the
283 * Features
284 */
285 public Filter getFilter() {
286 return this.filter;
287 }
288
289 /**
290 * After calling {@code super.reorganize(.)} this method replaced the column
291 * descriptions with the titles of the {@code AttributeMetaData}.
292 *
293 * @param fireTableStructureChanged
294 * indicates whether a table event is initiated after reorganize
295 */
296 @Override
297 protected void reorganize(boolean fireTableStructureChanged) {
298 super.reorganize(false);
299 // translate the column names
300 if (visibleAMD != null) {
301 Iterator<Integer> keys = visibleAMD.keySet().iterator();
302 for (int i = 0; i < colNames.length && keys.hasNext(); i++) {
303 Translation title = visibleAMD.get(keys.next()).getTitle();
304 if (!I8NUtil.isEmpty(title)) {
305 // System.out.println("set colname " + i + " to " +
306 // title.toString());
307 colNames[i] = title.toString();
308 }
309 }
310 }
311 if (fireTableStructureChanged)
312 fireTableStructureChanged();
313 }
314
315 /**
316 * @return Cached bounds for the whole dataset (without applying the filter)
317 * or <code>null</code>
318 */
319 public Envelope getBounds() {
320 return bounds;
321 }
322 }

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26