Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.dal / org.gvsig.fmap.dal.swing / org.gvsig.fmap.dal.swing.impl / src / main / java / org / gvsig / fmap / dal / swing / impl / expressionevaluator / FeatureAttributeElement.java @ 45162

History | View | Annotate | Download (9.58 KB)

1
package org.gvsig.fmap.dal.swing.impl.expressionevaluator;
2

    
3
import java.util.ArrayList;
4
import java.util.HashMap;
5
import java.util.List;
6
import java.util.Map;
7
import java.util.Objects;
8
import javax.swing.SwingUtilities;
9
import org.apache.commons.lang3.StringUtils;
10
import org.gvsig.expressionevaluator.ExpressionBuilder;
11
import org.gvsig.expressionevaluator.ExpressionBuilder.Constant;
12
import org.gvsig.expressionevaluator.ExpressionUtils;
13
import org.gvsig.expressionevaluator.swing.Element;
14
import org.gvsig.expressionevaluator.swing.Element.SimpleElement;
15
import org.gvsig.expressionevaluator.swing.spi.AbstractElement;
16
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingLocator;
17
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingManager;
18
import org.gvsig.fmap.dal.DALLocator;
19
import org.gvsig.fmap.dal.DataManager;
20
import org.gvsig.fmap.dal.expressionevaluator.DALExpressionBuilder;
21
import org.gvsig.fmap.dal.feature.Feature;
22
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
23
import org.gvsig.fmap.dal.feature.FeatureSet;
24
import org.gvsig.fmap.dal.feature.FeatureStore;
25
import org.gvsig.tools.ToolsLocator;
26
import org.gvsig.tools.exception.BaseException;
27
import org.gvsig.tools.i18n.I18nManager;
28
import org.gvsig.tools.swing.api.ToolsSwingLocator;
29
import org.gvsig.tools.swing.icontheme.IconTheme;
30
import org.gvsig.tools.util.LabeledValue;
31
import org.gvsig.tools.visitor.VisitCanceledException;
32
import org.gvsig.tools.visitor.Visitor;
33

    
34
/**
35
 *
36
 * @author jjdelcerro
37
 */
38
public class FeatureAttributeElement
39
        extends AbstractElement
40
        implements
41
        SimpleElement
42
    {
43

    
44
    final FeatureStore store;
45
    final FeatureAttributeDescriptor attrdesc;
46
    List<Element> values;
47
    boolean hasMoreValues;
48
    private final Element parent;
49

    
50
    FeatureAttributeElement(Element parent, FeatureStore store, FeatureAttributeDescriptor attrdesc) {
51
        this(parent, store, attrdesc, "featurestore-column");
52
    }
53
    
54
    FeatureAttributeElement(Element parent, FeatureStore store, FeatureAttributeDescriptor attrdesc, String iconName) {
55
        super(attrdesc.getName(),  buildRenderedValueForAttribute(store,attrdesc), iconName);
56
        this.parent = parent;
57
        this.store = store;
58
        this.attrdesc = attrdesc;
59
        this.hasMoreValues = false;
60

    
61
        IconTheme iconTheme = ToolsSwingLocator.getIconThemeManager().getCurrent();
62
        String theIconName = attrdesc.getDataType().getIconName();
63
        IconTheme.Icon theIcon = iconTheme.getThemeIcon(theIconName);
64
        if( theIcon!=null && theIcon.getURL()!=null ) {
65
            this.icon = ToolsSwingLocator.getToolsSwingManager().createCompoundIcon(
66
                    SwingUtilities.HORIZONTAL, 
67
                    1, 
68
                    SwingUtilities.LEFT, 
69
                    SwingUtilities.TOP,
70
                    this.getIcon(),
71
                    theIcon.getImageIcon()
72
            );
73
        }
74
    }
75

    
76
    private static String buildRenderedValueForAttribute(FeatureStore store, FeatureAttributeDescriptor attrdesc) {
77
      String attrname = attrdesc.getName();
78
      String storename = store.getName();
79
      if( StringUtils.equalsIgnoreCase(storename, attrname) ) {
80
        return addQuotesIfNeeded(storename)+"."+addQuotesIfNeeded(attrname);
81
      }
82
      return addQuotesIfNeeded(attrname);
83
    }
84
    
85
    public Element getParent() {
86
        return this.parent;
87
    }
88

    
89
    @Override
90
    public String getRenderedValue() {
91
        if( this.parent instanceof DefaultFeatureStoreElement2 ) {
92
            return super.getRenderedValue();
93
        }
94
        List<String> fieldNames = new ArrayList<>();
95
        fieldNames.add(attrdesc.getName());
96
        Element theParent = this.parent;
97
        while( theParent!=null ) {
98
            if( theParent instanceof DefaultFeatureStoreElement2 ) {
99
                break;
100
            }
101
            if( !(theParent instanceof FeatureAttributeElement) ) {
102
                break; // Esto no deberia pasar
103
            }
104
            fieldNames.add(0, theParent.getName());
105
            theParent = ((FeatureAttributeElement)theParent).getParent();
106
        }
107

    
108
        DALExpressionBuilder bbuilder = DALLocator.getDataManager().createDALExpressionBuilder();
109
        String formula = bbuilder.foreing_value(fieldNames.get(0), fieldNames.get(1)).toString();
110
        return formula;
111
    }
112
    
113
    
114
    @Override
115
    public void reload() {
116
        this.values = null;
117
        hasMoreValues = false;
118
    }
119

    
120
    @Override
121
    public boolean isEnabled() {
122
        if (this.getConfig().getPreferences().isSQLCompatible()) {
123
            if (this.attrdesc.isComputed()) {
124
                return false;
125
            }
126
        }
127
        return true;
128
    }
129

    
130
    @Override
131
    public boolean hasMoreValues() {
132
        return this.hasMoreValues;
133
    }
134

    
135
    @Override
136
    public List<Element> getValues() {
137
        if (this.values == null) {
138
            hasMoreValues = false;
139
            ExpressionEvaluatorSwingManager manager = ExpressionEvaluatorSwingLocator.getManager();
140
            final List<Object> values = new ArrayList<>();
141
            final int limit = this.getConfig() == null ? 60 : this.getConfig().getPreferences().getSimpleElementsLimit();
142
            final long timeLimit = System.currentTimeMillis() + limit * 1000;
143
            try {
144
                FeatureSet set = this.store.getFeatureSet();
145
                set.accept(new Visitor() {
146
                    @Override
147
                    public void visit(Object o) throws VisitCanceledException, BaseException {
148
                        Object value = ((Feature) o).get(attrdesc.getName());
149
                        if (!values.contains(value)) {
150
                            values.add(value);
151
                        }
152
                        if (System.currentTimeMillis() > timeLimit) {
153
                            hasMoreValues = true;
154
                            throw new VisitCanceledException();
155
                        }
156
                    }
157
                });
158
            } catch (VisitCanceledException ex) {
159

    
160
            } catch (Exception ex) {
161
                // FIXME
162
            }
163
            this.values = new ArrayList<>();
164
            if (!values.isEmpty()) {
165
                LabeledValue[] availableValues = this.attrdesc.getAvailableValues();
166
                Map<String, String> availableValuesMap = new HashMap<>();
167
                if( availableValues!=null ) {
168
                    for (LabeledValue availableValue : availableValues) {
169
                        availableValuesMap.put(
170
                                Objects.toString(availableValue.getValue()),
171
                                availableValue.getLabel()
172
                        );
173
                    }
174
                }
175
                for (Object value : values) {
176
                    String key = Objects.toString(value);
177
                    String label = availableValuesMap.getOrDefault(key, null);
178
                    ConstantElement e = manager.createConstantElement(
179
                            value,
180
                            label
181
                    );
182
                    this.values.add(e);
183
                    e.setConfig(this.getConfig());
184
                }
185
            }
186
        }
187
        return this.values;
188
    }
189

    
190
    @Override
191
    public String getName() {
192
        return attrdesc.getName();
193
    }
194
    
195
    @Override
196
    public String getLabel() {
197
        if (getConfig().getPreferences().getShowLabelsOfElements()) {
198
            if (!StringUtils.equals(attrdesc.getName(), attrdesc.getLabel())) {
199
                return String.format(
200
                    "<html>%s<br><font size=\"2\"><i>(%s)</i></font></html>", 
201
                    attrdesc.getLocalizedLabel(), 
202
                    attrdesc.getName()
203
                );
204
            }
205
            return String.format(
206
                "<html>%s</html>", 
207
                attrdesc.getLocalizedLabel()
208
            );
209
        }
210
        return String.format(
211
            "<html>%s</html>", 
212
            attrdesc.getName()
213
        );
214
    }
215

    
216
    @Override
217
    public String getDescription() {
218
        I18nManager i18n = ToolsLocator.getI18nManager();
219

    
220
        StringBuilder html = new StringBuilder();
221
        html.append("<html>\n");
222

    
223
        html.append("<b>").append(this.attrdesc.getName()).append("</b><br>");
224
        if( !StringUtils.equalsIgnoreCase(attrdesc.getName(), attrdesc.getLabel()) ) {
225
            html.append(this.attrdesc.getLabel()).append("<br>\n");
226
        }
227
        html.append("<br>\n");
228
        html.append("<b>").append(i18n.getTranslation("_Source")).append("</b> ").append(this.store.getName()).append("<br>\n");
229
        html.append("<b>").append(i18n.getTranslation("_Name")).append("</b> ").append(this.getName()).append("<br>\n");
230
        html.append("<b>").append(i18n.getTranslation("_Label")).append("</b> ").append(this.attrdesc.getLocalizedLabel()).append("<br>\n");
231
        html.append("<b>").append(i18n.getTranslation("_Type")).append("</b> ").append(this.attrdesc.getDataTypeName()).append("<br>\n");
232
        if (!StringUtils.isBlank(this.attrdesc.getDescription())
233
                && StringUtils.equalsAnyIgnoreCase(this.getName(), this.attrdesc.getDescription())) {
234
            html.append("<b>").append(i18n.getTranslation("_Description")).append("</b><br>\n");
235
            html.append(this.attrdesc.getDescription().replace("\n", "<br>")).append("<br>\n");
236
        }
237
        html.append("</html>\n");
238
        return html.toString();
239
    }
240

    
241
    @Override
242
    @SuppressWarnings("empty-statement")
243
    public void used() {
244
        attrdesc.recentUsed();
245
    }
246
    
247
    private static String addQuotesIfNeeded(String fieldName) {
248
        if (!fieldName.matches("^[a-zA-Z][a-zA-Z0-9_]*")) {
249
            fieldName = '"'+fieldName+'"';
250
        }
251
        return fieldName;
252
    }
253
}