/[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 341 by alfonx, Mon Aug 31 10:16:40 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.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    }

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26