/[schmitzm]/branches/1.0-gt2-2.6/src/skrueger/geotools/StyledFeatureCollectionTableModel.java
ViewVC logotype

Annotation of /branches/1.0-gt2-2.6/src/skrueger/geotools/StyledFeatureCollectionTableModel.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 464 - (hide annotations)
Tue Oct 13 13:22:31 2009 UTC (15 years, 4 months ago) by alfonx
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 alfonx 244 /*******************************************************************************
2     * Copyright (c) 2009 Martin O. J. Schmitz.
3     *
4     * This file is part of the SCHMITZM library - a collection of utility
5 alfonx 256 * classes based on Java 1.6, focusing (not only) on Java Swing
6 alfonx 244 * 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 alfonx 335 import org.opengis.feature.simple.SimpleFeature;
40     import org.opengis.feature.simple.SimpleFeatureType;
41 alfonx 332 import org.opengis.feature.type.AttributeDescriptor;
42 alfonx 244 import org.opengis.filter.Filter;
43    
44     import schmitzm.geotools.gui.FeatureCollectionTableModel;
45 alfonx 464 import skrueger.AttributeMetadata;
46 alfonx 244
47     import com.vividsolutions.jts.geom.Envelope;
48    
49     /**
50     * This class extends the the {@link FeatureCollectionTableModel} with the
51 alfonx 464 * functionalities of the {@link AttributeMetadata}.
52 alfonx 244 * <ul>
53     * <li>column names are translated according to
54 alfonx 464 * {@link AttributeMetadata#getTitle()}</li>
55 alfonx 244 * <li>columns are hidden according to {@link AttributeMetaData#isVisible()()}</li>
56 alfonx 428 * <li>Any filter defined in the {@link StyledFeaturesInterface} will be applied.</li>
57 alfonx 244 * </ul>
58     *
59 alfonx 428 * @author Stefan A. Krüger
60 alfonx 244 */
61     public class StyledFeatureCollectionTableModel extends
62     FeatureCollectionTableModel {
63     final static private Logger LOGGER = Logger
64     .getLogger(StyledFeatureCollectionTableModel.class);
65 alfonx 464 /** Contains the complete {@link AttributeMetadata}-Map of the styled layer. */
66     protected AttributeMetadataMap origAMD = null;
67 alfonx 244 /** 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 alfonx 428 * @param styledFeatures
77 alfonx 244 * the styled layer
78     * @param filter
79     * filter applied to the table
80     */
81 alfonx 428 public StyledFeatureCollectionTableModel(StyledFeaturesInterface<?> styledFeatures) {
82     setStyledFeatures(styledFeatures);
83 alfonx 244 }
84    
85     /**
86     * Sets a new data source for the table.
87     *
88     * @param fs
89     * the feature source
90     * @param amd
91 alfonx 464 * {@link AttributeMetadata}-Map to define the visible attributes
92 alfonx 244 * and translation
93     */
94 alfonx 335 protected void setFeatureSource(FeatureSource<SimpleFeatureType, SimpleFeature> fs,
95 alfonx 464 AttributeMetadataMap amd, Filter filter)
96 alfonx 244 throws Exception {
97 alfonx 428
98 alfonx 244 if (filter == null)
99     filter = Filter.INCLUDE;
100    
101 alfonx 428 // this.featureSource = fs;
102 alfonx 244 this.filter = filter;
103     this.origAMD = amd;
104    
105 alfonx 428 FeatureCollection<SimpleFeatureType, SimpleFeature> fc = null;
106 alfonx 244 if (fs != null) {
107    
108     bounds = fs.getBounds();
109    
110 alfonx 464 final SimpleFeatureType schema = fs.getSchema();
111     Query query = new DefaultQuery(schema.getTypeName(), filter);
112 alfonx 244 if (amd != null) {
113     Vector<String> visibleAttrNames = new Vector<String>();
114     // Add the column with the geometry (usually "the_geom")
115 alfonx 464
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 alfonx 244 }
125 alfonx 464
126     if (amd.get(aDesc.getName()).isVisible())
127     visibleAttrNames.add(aDesc.getName().getLocalPart());
128 alfonx 244 }
129    
130     // create a query for the visible attributes
131 alfonx 464 String[] properties = visibleAttrNames.toArray(new String[] {});
132 alfonx 244
133     LOGGER.debug("Query contains the following attributes: "
134     + visibleAttrNames);
135    
136 alfonx 464 query = new DefaultQuery(schema.getTypeName(), filter,
137 alfonx 244 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 alfonx 464 * {@link AttributeMetadata}-Map to define the visible attributes
152 alfonx 244 * and translation
153     */
154 alfonx 428 public void setStyledFeatures(StyledFeaturesInterface<?> styledFeatures) {
155 alfonx 244 try {
156 alfonx 428 if (styledFeatures == null)
157 alfonx 244 setFeatureSource(null, null, null);
158     else {
159 alfonx 428 setFeatureSource(styledFeatures.getFeatureSource(), styledFeatures.getAttributeMetaDataMap(), styledFeatures.getFilter());
160 alfonx 244 }
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 alfonx 464
176 alfonx 244 super.reorganize(false);
177 alfonx 464
178 alfonx 244 // translate the column names
179 alfonx 464 if (origAMD != null) {
180     for (int i = 0; i < colNames.length; i++) {
181     colNames[i] = origAMD.get(colNames[i]).getTitle().toString();
182 alfonx 244 }
183 alfonx 464
184 alfonx 244 }
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