Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.dal / org.gvsig.fmap.dal.impl / src / main / java / org / gvsig / fmap / dal / feature / impl / LabelsCacheForFieldValuesImpl.java

History | View | Annotate | Download (5.19 KB)

1 46996 jjdelcerro
package org.gvsig.fmap.dal.feature.impl;
2
3
import org.gvsig.fmap.dal.feature.LabelsCacheForFieldValues;
4
import java.util.HashMap;
5
import java.util.Map;
6
import java.util.Objects;
7
import org.apache.commons.lang3.StringUtils;
8
import org.gvsig.fmap.dal.feature.EditableForeingKey;
9
import org.gvsig.fmap.dal.feature.Feature;
10
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
11
import org.gvsig.fmap.dal.feature.FeatureStore;
12
import org.gvsig.fmap.dal.feature.FeatureType;
13
import org.gvsig.tools.dynobject.DynObjectValueItem;
14
import org.gvsig.tools.task.SimpleTaskStatus;
15
import org.gvsig.tools.util.Invocable;
16
import org.slf4j.Logger;
17
import org.slf4j.LoggerFactory;
18
19
/**
20
 *
21
 * @author jjdelcerro
22
 */
23
@SuppressWarnings("UseSpecificCatch")
24
public class LabelsCacheForFieldValuesImpl implements LabelsCacheForFieldValues {
25
26
    protected static final Logger LOGGER = LoggerFactory.getLogger(LabelsCacheForFieldValuesImpl.class);
27
28
    private static final DynObjectValueItem[] INVALID_AVAILABLE_VALUES = new DynObjectValueItem[1];
29
30
    private final Map<String, DynObjectValueItem[]> availableValues;
31
    private final Invocable labelFormulaProvider;
32
    private final SimpleTaskStatus status;
33
34
    public LabelsCacheForFieldValuesImpl(Invocable labelFormulaProvider, SimpleTaskStatus status) {
35
        this.availableValues = new HashMap<>();
36
        this.labelFormulaProvider = labelFormulaProvider;
37
        this.status = status;
38
    }
39
40
    public LabelsCacheForFieldValuesImpl() {
41
        this(null, null);
42
    }
43
44
    private void message(String msg) {
45
        if( this.status == null ) {
46
            return;
47
        }
48
        this.status.message(msg);
49
    }
50
51
    private DynObjectValueItem[] getAvailableValuesFromCache(String fieldName) {
52
        return this.availableValues.get(fieldName);
53
    }
54
55
    private void addAvailableValuesToCache(String fieldName, DynObjectValueItem[] values) {
56
        this.availableValues.put(fieldName, values);
57
    }
58
59
    private boolean areValidAvailableValues(DynObjectValueItem[] values) {
60
        return values!=null && values!=INVALID_AVAILABLE_VALUES;
61
    }
62
63
    private void invalidateAvailableValuesInCache(String fieldName) {
64
        this.availableValues.put(fieldName, INVALID_AVAILABLE_VALUES);
65
    }
66
67
    private String getAlternativeLabelFormula(FeatureType featureType, Feature feature, String fieldName) {
68
        if( this.labelFormulaProvider==null ) {
69
            return null;
70
        }
71
        String labelPhrase = (String) labelFormulaProvider.call(featureType,feature,fieldName);
72
//        FeatureAttributeDescriptor attr = featureType.getAttributeDescriptor(fieldName);
73
//        String labelPhrase = attr.getTags().getString(TAG_REPORT_ATTR_LABEL, null);
74
        return labelPhrase;
75
    }
76
77
    @Override
78
    public String getLabelForFieldValue(Feature feature, String fieldName) {
79
        FeatureStore store = feature.getStore();
80
        String availableValuesId = store.getFullName()+"/"+fieldName;
81
        String availableValuesLabelId = store.getName()+"/"+fieldName;
82
83
        DynObjectValueItem[] theAvailableValues = this.getAvailableValuesFromCache(availableValuesId);
84
        Object value = feature.get(fieldName);
85
        try {
86
            if (theAvailableValues==null) {
87
                FeatureType featureType = feature.getType();
88
                FeatureAttributeDescriptor attr = featureType.getAttributeDescriptor(fieldName);
89
90
                String labelFormula = this.getAlternativeLabelFormula(featureType, feature, fieldName);
91
                if (StringUtils.isBlank(labelFormula)) {
92
                    if (attr.hasAvailableValues()) {
93
                        message("Loading values for "+availableValuesLabelId);
94
                        this.addAvailableValuesToCache(availableValuesId, attr.getAvailableValues(null));
95
                    }
96
                } else {
97
                    if (attr.isForeingKey()) {
98
                        EditableForeingKey fk;
99
                        try {
100
                            fk = (EditableForeingKey) attr.getForeingKey().clone();
101
                            fk.unbind();
102
                            fk.setLabelFormula(labelFormula);
103
                            message("Loading values for "+availableValuesLabelId);
104
                            this.addAvailableValuesToCache(availableValuesId, fk.getAvailableValues(null));
105
                        } catch (CloneNotSupportedException ex) {
106
                            LOGGER.warn("Not able to clone foreing key. "+ex.toString());
107
                        }
108
                    }
109
                }
110
                theAvailableValues = this.getAvailableValuesFromCache(availableValuesId);
111
            }
112
113
            if ( this.areValidAvailableValues(theAvailableValues) ) {
114
                for (DynObjectValueItem theAvailableValue : theAvailableValues) {
115
                    if (Objects.equals(value, theAvailableValue.getValue())) {
116
                        return theAvailableValue.getLabel();
117
                    }
118
                }
119
            }
120
121
        } catch (Exception ex) {
122
            LOGGER.warn("Fail", ex);
123
            this.invalidateAvailableValuesInCache(availableValuesId);
124
        }
125 47008 jjdelcerro
        return Objects.toString(value,"");
126 46996 jjdelcerro
127
    }
128
129
}