Statistics
| Revision:

gvsig-tools / org.gvsig.tools / library / trunk / org.gvsig.tools / org.gvsig.tools.lib / src / main / java / org / gvsig / tools / util / PropertiesSupportHelper.java @ 2022

History | View | Annotate | Download (7.14 KB)

1
package org.gvsig.tools.util;
2

    
3
import java.io.File;
4
import java.net.URI;
5
import java.net.URL;
6
import java.util.HashMap;
7
import java.util.Map;
8
import org.gvsig.tools.ToolsLocator;
9
import static org.gvsig.tools.dataTypes.DataTypes.URI;
10
import org.gvsig.tools.dynobject.DynStruct;
11
import org.gvsig.tools.observer.Observable;
12
import org.gvsig.tools.observer.ObservableHelper;
13
import org.gvsig.tools.observer.Observer;
14
import org.gvsig.tools.persistence.PersistenceFactory;
15
import org.gvsig.tools.persistence.PersistenceManager;
16
import org.gvsig.tools.persistence.Persistent;
17
import org.gvsig.tools.persistence.PersistentState;
18
import org.gvsig.tools.persistence.exception.PersistenceException;
19
import org.slf4j.Logger;
20
import org.slf4j.LoggerFactory;
21

    
22
/**
23
 * This class is intended to serve as an aid to the implementation of
24
 * PropertiesSupport.
25
 *
26
 * When we have a class that implements the PropertiesSupport interface, we will
27
 * use PropertiesSupportHelper to implement it. For this, we will declare a
28
 * property "propertiesHelper", and we will implement the interface methods
29
 * delegating in it.
30
 *
31
 * <code>
32
 *      private PropertiesSupportHelper propertiesHelper = new PropertiesSupportHelper();
33
 *
34
 *      ...
35
 *
36
 *      @Override
37
 *      public Object getProperty(String key) {
38
 *          return this.propertiesHelper.getProperty(key);
39
 *      }
40
 *
41
 *      @Override
42
 *      public void setProperty(String key, Object obj) {
43
 *          this.propertiesHelper.setProperty(key, obj);
44
 *      }
45
 *
46
 *      @Override
47
 *      public Map<String,Object> getProperties() { return
48
 * this.propertiesHelper.getProperties(); }
49
 * </code> If the class is persistent, we will declare "propertiesHelper" as:
50
 *
51
 * <code>
52
 *      definition.addDynFieldObject("propertiesHelper")
53
 *          .setClassOfValue(PropertiesSupportHelper.class)
54
 *          .setMandatory(false);
55
 * </code>
56
 *
57
 * We will add the following code to the "loadFromState" and "saveToState":
58
 *
59
 * <code>
60
 *      // in loadFromState
61
 *      this.propertiesHelper = (PropertiesSupportHelper) state.get("propertiesHelper");
62
 *
63
 *      // in saveToState
64
 *      state.set("propertiesHelper",propertiesHelper);
65
 * </code>
66
 *
67
 * And we will record the persistence invoking:
68
 *
69
 * <code>
70
 *      new PropertiesSupportHelper.RegisterPersistence().call()
71
 * </code>
72
 *
73
 * Or using <code>Caller</code>:
74
 *
75
 * <code>
76
 *      caller.add(new new PropertiesSupportHelper.RegisterPersistence());
77
 *      ...
78
 *      caller.call()
79
 * </code>
80
 *
81
 * @author gvSIG Team
82
 */
83
public class PropertiesSupportHelper implements PropertiesSupport, Persistent, Observable {
84

    
85
    private static final Logger LOGGER = LoggerFactory.getLogger(PropertiesSupportHelper.class);
86

    
87
    public static final String PROPERTY_CHANGE = "PropertyChange";
88
    public static final String PROPERTIES_CHANGE = "PropertiesChange";
89

    
90
    private Map<String, Object> properties = new HashMap<>();
91
    private ObservableHelper observableHelper;
92

    
93
    @Override
94
    public Object getProperty(String key) {
95
        return properties.get(key);
96
    }
97

    
98
    @Override
99
    public void setProperty(String key, Object val) {
100
        properties.put(key, val);
101
        if (this.observableHelper != null) {
102
            this.observableHelper.notifyObservers(this, PROPERTY_CHANGE, key, val);
103
        }
104
    }
105

    
106
    @Override
107
    public Map<String, Object> getProperties() {
108
        return properties;
109
    }
110

    
111
    public void setProperties(Map<String, Object> properties) {
112
        this.properties = new HashMap();
113
        if (properties != null) {
114
            this.copyFrom(properties);
115
        }
116
        if (this.observableHelper != null) {
117
            this.observableHelper.notifyObservers(this, PROPERTIES_CHANGE, null);
118
        }
119
    }
120

    
121
    protected void copyFrom(Map<String, Object> properties) {
122
        for (Map.Entry<String, Object> entry : properties.entrySet()) {
123
            String key = entry.getKey();
124
            if (key == null) {
125
                continue;
126
            }
127
            Object value;
128
            try {
129
                value = entry.getValue();
130
            } catch (Throwable th) {
131
                if (LOGGER.isDebugEnabled()) {
132
                    LOGGER.warn("Can't get property " + key + ".", th);
133
                } else {
134
                    LOGGER.warn("Can't get property " + key + ".");
135
                }
136
                value = null;
137
            }
138
            this.properties.put(key, value);
139
        }
140
    }
141

    
142
    @Override
143
    public void saveToState(PersistentState state) throws PersistenceException {
144
        HashMap<String, Object> toSave = new HashMap<String, Object>();
145
        for (Map.Entry<String, Object> entry : properties.entrySet()) {
146
            String key = entry.getKey();
147
            Object value = entry.getValue();
148
            if (isPersistent(value)) {
149
                toSave.put(key, value);
150
            }
151
        }
152
        state.set("properties", toSave);
153
    }
154

    
155
    private boolean isPersistent(Object obj) {
156
        if (obj instanceof Boolean
157
                || obj instanceof String
158
                || obj instanceof File
159
                || obj instanceof URL
160
                || obj instanceof URI
161
                || obj instanceof Short
162
                || obj instanceof Integer
163
                || obj instanceof Long
164
                || obj instanceof Float
165
                || obj instanceof Double) {
166
            return true;
167
        }
168
        PersistenceManager persistenceManager = ToolsLocator.getPersistenceManager();
169
        PersistenceManager.Factories factories = persistenceManager.getFactories();
170
        PersistenceFactory factory = factories.get(obj);
171
        if (factory == null) {
172
            return false;
173
        }
174
        return true;
175
    }
176

    
177
    @Override
178
    public void loadFromState(PersistentState state) throws PersistenceException {
179
        this.properties = new HashMap();
180
        Map props = (Map) state.get("properties");
181
        if (props != null) {
182
            copyFrom(props);
183
        }
184
    }
185

    
186
    @Override
187
    public void addObserver(Observer o) {
188
        if (this.observableHelper == null) {
189
            this.observableHelper = new ObservableHelper();
190
        }
191
        this.observableHelper.addObserver(o);
192
    }
193

    
194
    @Override
195
    public void deleteObserver(Observer o) {
196
        if (this.observableHelper == null) {
197
            this.observableHelper = new ObservableHelper();
198
        }
199
        this.observableHelper.deleteObserver(o);
200
    }
201

    
202
    @Override
203
    public void deleteObservers() {
204
        if (this.observableHelper == null) {
205
            this.observableHelper = new ObservableHelper();
206
        }
207
        this.observableHelper.deleteObservers();
208
    }
209

    
210
    public static void registerPersistence() {
211

    
212
        PersistenceManager manager = ToolsLocator.getPersistenceManager();
213
        if (manager.getDefinition("PropertiesSupportHelper") == null) {
214
            DynStruct definition = manager.addDefinition(
215
                    PropertiesSupportHelper.class,
216
                    "PropertiesSupportHelper",
217
                    "PropertiesSupportHelper Persistence definition",
218
                    null,
219
                    null
220
            );
221
            definition.addDynFieldMap("properties")
222
                    .setClassOfItems(Object.class)
223
                    .setMandatory(true);
224
        }
225
    }
226
}