Statistics
| Revision:

gvsig-projects-pool / org.gvsig.topology / trunk / org.gvsig.topology / org.gvsig.topology.lib / org.gvsig.topology.lib.impl / src / main / java / org / gvsig / topology / lib / impl / DefaultTopologyReport.java @ 2067

History | View | Annotate | Download (7.07 KB)

1 688 jjdelcerro
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 3
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.topology.lib.impl;
25
26
import java.util.ArrayList;
27
import java.util.Collections;
28
import java.util.List;
29
import org.gvsig.expressionevaluator.Code;
30
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
31
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
32
import org.gvsig.expressionevaluator.MutableSymbolTable;
33
import org.gvsig.fmap.dal.feature.FeatureReference;
34
import org.gvsig.fmap.geom.Geometry;
35
import org.gvsig.tools.task.SimpleTaskStatus;
36
import org.gvsig.topology.lib.api.TopologyDataSet;
37
import org.gvsig.topology.lib.api.TopologyPlan;
38
import org.gvsig.topology.lib.api.TopologyReport;
39
import org.gvsig.topology.lib.api.TopologyReportLine;
40
import org.gvsig.topology.lib.api.TopologyReportLineSet;
41
import org.gvsig.topology.lib.api.TopologyRule;
42
import org.slf4j.Logger;
43
import org.slf4j.LoggerFactory;
44
45
/**
46
 *
47
 * @author jjdelcerro
48
 */
49
@SuppressWarnings("UseSpecificCatch")
50
public class DefaultTopologyReport
51
        extends AbstractTopologyReportLineSet
52
        implements TopologyReport
53
    {
54
55
    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultTopologyReport.class);
56
57
    private class DefaultTopologyReportLineSet extends AbstractTopologyReportLineSet {
58
59
        public DefaultTopologyReportLineSet() {
60
            super();
61
        }
62
63
        public void polulate(List<TopologyReportLine> allLines, String filter) {
64
            this.lines.clear();
65
            if (filter == null) {
66
                this.lines.addAll(allLines);
67
                this.completed = true;
68
                return;
69
            }
70
            SimpleTaskStatus theTaskStatus = plan.getTaskStatus();
71
            try {
72 727 jjdelcerro
                theTaskStatus.push();
73 688 jjdelcerro
                theTaskStatus.restart();
74
                theTaskStatus.message("Preparing filter");
75
                theTaskStatus.setAutoremove(true);
76
                theTaskStatus.setIndeterminate();
77
78
                ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
79
80
                TopologyReportLineSymbolTable lineSymbolTable = new TopologyReportLineSymbolTable();
81
                MutableSymbolTable symbolTable = manager.createSymbolTable();
82
                symbolTable.addSymbolTable(lineSymbolTable);
83
84
                Code code = manager.compile(filter);
85
                code = manager.optimize(symbolTable, code);
86
87
                theTaskStatus.setRangeOfValues(0, allLines.size());
88
                theTaskStatus.setCurValue(0);
89
                for (TopologyReportLine line : allLines) {
90
                    lineSymbolTable.setLine(line);
91
                    Object value = manager.evaluate(symbolTable, code);
92
                    if (value instanceof Boolean && ((Boolean) value)) {
93
                        this.lines.add(line);
94
                        this.changeListenerHelper.fireEvent();
95
                    }
96
                    theTaskStatus.incrementCurrentValue();
97
                }
98
99
            } catch (Exception ex) {
100
                LOGGER.warn("Problems filtering.", ex);
101
                theTaskStatus.abort();
102
            } finally {
103
                if (theTaskStatus.isRunning()) {
104
                    theTaskStatus.terminate();
105
                }
106 727 jjdelcerro
                theTaskStatus.pop();
107 688 jjdelcerro
                this.completed = true;
108
            }
109
        }
110
111
112
    }
113
114
    // TODO: Habria que meter las lineas del report en disco
115
    private final TopologyPlan plan;
116
117
    public DefaultTopologyReport(TopologyPlan plan) {
118
        this.plan = plan;
119
    }
120
121
    @Override
122
    public TopologyReportLine addLine(TopologyRule rule, TopologyDataSet dataSet1,
123 727 jjdelcerro
            TopologyDataSet dataSet2, Geometry geometry, Geometry error,
124 688 jjdelcerro
            FeatureReference feature1, FeatureReference feature2,
125
            boolean exception, String description
126
    ) {
127
        TopologyReportLine line = new DefaultTopologyReportLine(
128 727 jjdelcerro
                this, rule, dataSet1, dataSet2, geometry, error, feature1,
129 893 jjdelcerro
                feature2, -1, -1, exception, description, null
130 688 jjdelcerro
        );
131
        this.lines.add(line);
132 760 jjdelcerro
        this.fireChangeEvent();
133 688 jjdelcerro
        return line;
134
    }
135
136
    @Override
137 893 jjdelcerro
    public TopologyReportLine addLine(TopologyRule rule,
138
            TopologyDataSet dataSet1,TopologyDataSet dataSet2,
139
            Geometry geometry, Geometry error,
140
            FeatureReference feature1, FeatureReference feature2,
141
            int primitive1, int primitive2,
142
            boolean exception,
143
            String description,
144
            String data
145
    ) {
146
        TopologyReportLine line = new DefaultTopologyReportLine(
147
                this, rule, dataSet1, dataSet2, geometry, error, feature1,
148
                feature2, primitive1, primitive2, exception, description, data
149
        );
150
        this.lines.add(line);
151
        this.fireChangeEvent();
152
        return line;
153
    }
154
155
    @Override
156 688 jjdelcerro
    public void removeAllLines() {
157
        this.lines.clear();
158
        this.fireChangeEvent();
159
    }
160
161
    @Override
162
    public TopologyReportLineSet getLineSet(final String filter) {
163
        final DefaultTopologyReportLineSet set = new DefaultTopologyReportLineSet();
164
        Thread th = new Thread(new Runnable() {
165
            @Override
166
            public void run() {
167
                set.polulate(lines, filter);
168
            }
169
        });
170
        th.start();
171
        return set;
172
    }
173
174
    @Override
175
    public List<TopologyReportLine> getLines(String filter) {
176
        if (filter == null) {
177
            return Collections.unmodifiableList(this.lines);
178
        }
179
        List<TopologyReportLine> ll = new ArrayList<>();
180
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
181
182
        TopologyReportLineSymbolTable lineSymbolTable = new TopologyReportLineSymbolTable();
183
        MutableSymbolTable symbolTable = manager.createSymbolTable();
184
        symbolTable.addSymbolTable(lineSymbolTable);
185
186
        Code code = manager.compile(filter);
187
        code = manager.optimize(symbolTable, code);
188
189
        for (TopologyReportLine line : this.lines) {
190
            lineSymbolTable.setLine(line);
191
            Object value = manager.evaluate(symbolTable, code);
192
            if (value instanceof Boolean && ((Boolean) value)) {
193
                ll.add(line);
194
            }
195
        }
196
        return Collections.unmodifiableList(ll);
197
    }
198
}