Revision 46996

View differences:

trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.api/src/main/java/org/gvsig/fmap/dal/DataManager.java
59 59
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
60 60
import org.gvsig.fmap.dal.feature.FeatureRuleExpression;
61 61
import org.gvsig.fmap.dal.feature.FeatureSet;
62
import org.gvsig.fmap.dal.feature.LabelsCacheForFieldValues;
62 63
import org.gvsig.tools.observer.Observer;
63 64
import org.gvsig.tools.resourcesstorage.ResourcesStorage;
65
import org.gvsig.tools.task.SimpleTaskStatus;
64 66
import org.gvsig.tools.util.Factory;
67
import org.gvsig.tools.util.Invocable;
65 68

  
66 69
/**
67 70
 * There are two top level management roles within DAL: data access and resource
......
640 643
    public File getCacheResourcesFolder();
641 644
    
642 645
    public void clearAllCachedResources();
646
    
647
    public LabelsCacheForFieldValues createLabelsCacheForFieldValues(Invocable labelFormulaProvider, SimpleTaskStatus status);
643 648
}
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.api/src/main/java/org/gvsig/fmap/dal/feature/LabelsCacheForFieldValues.java
1
/*
2
 * To change this license header, choose License Headers in Project Properties.
3
 * To change this template file, choose Tools | Templates
4
 * and open the template in the editor.
5
 */
6
package org.gvsig.fmap.dal.feature;
7

  
8
/**
9
 *
10
 * @author jjdelcerro
11
 */
12
public interface LabelsCacheForFieldValues {
13

  
14
    String getLabelForFieldValue(Feature feature, String fieldName);
15
    
16
}
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/impl/DefaultDataManager.java
67 67
import org.gvsig.fmap.dal.feature.FeatureSet;
68 68
import org.gvsig.fmap.dal.feature.FeatureStore;
69 69
import org.gvsig.fmap.dal.feature.FeatureType;
70
import org.gvsig.fmap.dal.feature.LabelsCacheForFieldValues;
70 71
import org.gvsig.fmap.dal.feature.exception.UnsupportedDataTypeException;
71 72
import org.gvsig.fmap.dal.feature.impl.DALFile;
72 73
import org.gvsig.fmap.dal.feature.impl.DefaultEditableFeatureAttributeDescriptor;
......
74 75
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureIndex;
75 76
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureStore;
76 77
import org.gvsig.fmap.dal.feature.impl.FeatureStoreFactory;
78
import org.gvsig.fmap.dal.feature.impl.LabelsCacheForFieldValuesImpl;
77 79
import org.gvsig.fmap.dal.feature.paging.FeaturePagingHelper;
78 80
import org.gvsig.fmap.dal.feature.paging.impl.FeaturePagingHelperImpl;
79 81
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProvider;
......
116 118
import org.gvsig.tools.script.ScriptManager;
117 119
import org.gvsig.tools.service.spi.Services;
118 120
import org.gvsig.tools.swing.api.ToolsSwingLocator;
121
import org.gvsig.tools.task.SimpleTaskStatus;
119 122
import org.gvsig.tools.util.Factory;
123
import org.gvsig.tools.util.Invocable;
120 124
import org.slf4j.Logger;
121 125
import org.slf4j.LoggerFactory;
122 126

  
......
1522 1526
            LOGGER.warn("Can't remove local cache for of resources.", ex);
1523 1527
        }
1524 1528
    }
1529
    
1530
    @Override
1531
    public LabelsCacheForFieldValues createLabelsCacheForFieldValues(Invocable labelFormulaProvider, SimpleTaskStatus status) {
1532
        LabelsCacheForFieldValuesImpl x = new LabelsCacheForFieldValuesImpl(labelFormulaProvider, status);
1533
        return x;
1534
    }
1525 1535
}
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
1
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
        return Objects.toString(value);
126
        
127
    }
128

  
129
}

Also available in: Unified diff