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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

trunk/src/skrueger/geotools/StyledFeatureCollectionTableModel.java revision 46 by mojays, Fri Apr 17 11:44:05 2009 UTC branches/1.0-gt2-2.6/src/skrueger/geotools/StyledFeatureCollectionTableModel.java revision 335 by alfonx, Wed Aug 26 18:09:39 2009 UTC
# Line 1  Line 1 
1  package skrueger.geotools;  /*******************************************************************************
2     * Copyright (c) 2009 Martin O. J. Schmitz.
3  import schmitzm.geotools.gui.FeatureCollectionTableModel;   *
4     * This file is part of the SCHMITZM library - a collection of utility
5  public class StyledFeatureCollectionTableModel extends FeatureCollectionTableModel {   * classes based on Java 1.6, focusing (not only) on Java Swing
6       * and the Geotools library.
7    public StyledFeatureCollectionTableModel(StyledFeatureCollectionInterface map) {   *
8      super(null);   * The SCHMITZM project is hosted at:
9    }   * http://wald.intevation.org/projects/schmitzm/
10       *
11    public StyledFeatureCollectionTableModel(StyledFeatureSourceInterface map) {   * This program is free software; you can redistribute it and/or
12      super(null);   * 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    public String[] createColumnNames() {   *
16      return new String[0];   * 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    public int getRowCount() {   * GNU General Public License for more details.
20      return 0;   *
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    public Object getValueAt(int row, int col) {   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
24      return "";   * 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    }

Legend:
Removed from v.46  
changed lines
  Added in v.335

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26