/[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 464 - (show annotations)
Tue Oct 13 13:22:31 2009 UTC (15 years, 4 months ago) by alfonx
Original Path: branches/1.0-gt2-2.6/src/skrueger/geotools/StyledFeatureCollectionTableModel.java
File size: 6425 byte(s)
* Changed AttributeMetadata and AttributeMetadataMap. It's not based on the attributes colIdx any more, but on the geotools.feature.type.Name. All the XML read/write methods have been adapted. 
This change was needed, as some users tend to change the DBF structure after the shapefile has been imported. Now columns can be moved, inserted and deleted. Just click "reload atlas" in Geopublisher after you changed the table schema. Geopublisher doesn't have to be closed.
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.Vector;
33
34 import org.apache.log4j.Logger;
35 import org.geotools.data.DefaultQuery;
36 import org.geotools.data.FeatureSource;
37 import org.geotools.data.Query;
38 import org.geotools.feature.FeatureCollection;
39 import org.opengis.feature.simple.SimpleFeature;
40 import org.opengis.feature.simple.SimpleFeatureType;
41 import org.opengis.feature.type.AttributeDescriptor;
42 import org.opengis.filter.Filter;
43
44 import schmitzm.geotools.gui.FeatureCollectionTableModel;
45 import skrueger.AttributeMetadata;
46
47 import com.vividsolutions.jts.geom.Envelope;
48
49 /**
50 * This class extends the the {@link FeatureCollectionTableModel} with the
51 * functionalities of the {@link AttributeMetadata}.
52 * <ul>
53 * <li>column names are translated according to
54 * {@link AttributeMetadata#getTitle()}</li>
55 * <li>columns are hidden according to {@link AttributeMetaData#isVisible()()}</li>
56 * <li>Any filter defined in the {@link StyledFeaturesInterface} will be applied.</li>
57 * </ul>
58 *
59 * @author Stefan A. Krüger
60 */
61 public class StyledFeatureCollectionTableModel extends
62 FeatureCollectionTableModel {
63 final static private Logger LOGGER = Logger
64 .getLogger(StyledFeatureCollectionTableModel.class);
65 /** Contains the complete {@link AttributeMetadata}-Map of the styled layer. */
66 protected AttributeMetadataMap origAMD = null;
67 /** Holds the current filter on the table */
68 protected Filter filter = null;
69 /** Holds the Bounds for all features. Only set once during the constructor **/
70 protected Envelope bounds;
71
72
73 /**
74 * Creates a new table model for a styled layer.
75 *
76 * @param styledFeatures
77 * the styled layer
78 * @param filter
79 * filter applied to the table
80 */
81 public StyledFeatureCollectionTableModel(StyledFeaturesInterface<?> styledFeatures) {
82 setStyledFeatures(styledFeatures);
83 }
84
85 /**
86 * Sets a new data source for the table.
87 *
88 * @param fs
89 * the feature source
90 * @param amd
91 * {@link AttributeMetadata}-Map to define the visible attributes
92 * and translation
93 */
94 protected void setFeatureSource(FeatureSource<SimpleFeatureType, SimpleFeature> fs,
95 AttributeMetadataMap amd, Filter filter)
96 throws Exception {
97
98 if (filter == null)
99 filter = Filter.INCLUDE;
100
101 // this.featureSource = fs;
102 this.filter = filter;
103 this.origAMD = amd;
104
105 FeatureCollection<SimpleFeatureType, SimpleFeature> fc = null;
106 if (fs != null) {
107
108 bounds = fs.getBounds();
109
110 final SimpleFeatureType schema = fs.getSchema();
111 Query query = new DefaultQuery(schema.getTypeName(), filter);
112 if (amd != null) {
113 Vector<String> visibleAttrNames = new Vector<String>();
114 // Add the column with the geometry (usually "the_geom")
115
116 for (AttributeDescriptor aDesc : schema.getAttributeDescriptors()) {
117
118 // Always add the geometry
119 if (schema.getGeometryDescriptor()
120 .getName().equals(aDesc.getName())) {
121 visibleAttrNames.add(schema.getGeometryDescriptor()
122 .getLocalName());
123 continue;
124 }
125
126 if (amd.get(aDesc.getName()).isVisible())
127 visibleAttrNames.add(aDesc.getName().getLocalPart());
128 }
129
130 // create a query for the visible attributes
131 String[] properties = visibleAttrNames.toArray(new String[] {});
132
133 LOGGER.debug("Query contains the following attributes: "
134 + visibleAttrNames);
135
136 query = new DefaultQuery(schema.getTypeName(), filter,
137 properties);
138 }
139 fc = fs.getFeatures(query);
140 }
141 setFeatureCollection(fc);
142 }
143
144 /**
145 * Converts the {@code StyledFeatureCollection} to a {@code FeatureSource}
146 * and sets this as the new data source for the table.
147 *
148 * @param fs
149 * the feature source
150 * @param amd
151 * {@link AttributeMetadata}-Map to define the visible attributes
152 * and translation
153 */
154 public void setStyledFeatures(StyledFeaturesInterface<?> styledFeatures) {
155 try {
156 if (styledFeatures == null)
157 setFeatureSource(null, null, null);
158 else {
159 setFeatureSource(styledFeatures.getFeatureSource(), styledFeatures.getAttributeMetaDataMap(), styledFeatures.getFilter());
160 }
161 } catch (Exception err) {
162 throw new RuntimeException(err);
163 }
164 }
165
166 /**
167 * After calling {@code super.reorganize(.)} this method replaced the column
168 * descriptions with the titles of the {@code AttributeMetaData}.
169 *
170 * @param fireTableStructureChanged
171 * indicates whether a table event is initiated after reorganize
172 */
173 @Override
174 protected void reorganize(boolean fireTableStructureChanged) {
175
176 super.reorganize(false);
177
178 // translate the column names
179 if (origAMD != null) {
180 for (int i = 0; i < colNames.length; i++) {
181 colNames[i] = origAMD.get(colNames[i]).getTitle().toString();
182 }
183
184 }
185 if (fireTableStructureChanged)
186 fireTableStructureChanged();
187 }
188
189 /**
190 * @return Cached bounds for the whole dataset (without applying the filter)
191 * or <code>null</code>
192 */
193 public Envelope getBounds() {
194 return bounds;
195 }
196 }

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26