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 @ 2651

History | View | Annotate | Download (7.6 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 org.gvsig.tools.dynobject.DynStruct;
10
import org.gvsig.tools.lang.CloneableUtils;
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, org.gvsig.tools.lang.Cloneable {
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 PropertiesSupportHelper clone() throws CloneNotSupportedException {
95
        PropertiesSupportHelper other = (PropertiesSupportHelper) super.clone();
96
        
97
        other.properties = (Map<String, Object>) new HashMap<>(this.properties);
98
        if (observableHelper!=null) {
99
            other.observableHelper = this.observableHelper.clone();
100
        }
101
        
102
        return other;
103
    }
104

    
105
    
106
    @Override
107
    public Object getProperty(String key) {
108
        return properties.get(key.toUpperCase());
109
    }
110

    
111
    @Override
112
    public void setProperty(String key, Object val) {
113
        properties.put(key.toUpperCase(), val);
114
        if (this.observableHelper != null) {
115
            this.observableHelper.notifyObservers(this, PROPERTY_CHANGE, key, val);
116
        }
117
    }
118

    
119
    @Override
120
    public Map<String, Object> getProperties() {
121
        return properties;
122
    }
123

    
124
    public void setProperties(Map<String, Object> properties) {
125
        this.properties = new HashMap();
126
        if (properties != null) {
127
            this.copyFrom(properties);
128
        }
129
        if (this.observableHelper != null) {
130
            this.observableHelper.notifyObservers(this, PROPERTIES_CHANGE, null);
131
        }
132
    }
133

    
134
    protected void copyFrom(Map<String, Object> properties) {
135
        for (Map.Entry<String, Object> entry : properties.entrySet()) {
136
            String key = entry.getKey();
137
            if (key == null) {
138
                continue;
139
            }
140
            Object value;
141
            try {
142
                value = entry.getValue();
143
            } catch (Throwable th) {
144
                if (LOGGER.isDebugEnabled()) {
145
                    LOGGER.warn("Can't get property " + key + ".", th);
146
                } else {
147
                    LOGGER.warn("Can't get property " + key + ".");
148
                }
149
                value = null;
150
            }
151
            this.properties.put(key, value);
152
        }
153
    }
154

    
155
    @Override
156
    public void saveToState(PersistentState state) throws PersistenceException {
157
        HashMap<String, Object> toSave = new HashMap<String, Object>();
158
        for (Map.Entry<String, Object> entry : properties.entrySet()) {
159
            String key = entry.getKey();
160
            Object value = entry.getValue();
161
            if (isPersistent(value)) {
162
                toSave.put(key, value);
163
            }
164
        }
165
        state.set("properties", toSave);
166
    }
167

    
168
    private boolean isPersistent(Object obj) {
169
        if (obj instanceof Boolean
170
                || obj instanceof String
171
                || obj instanceof File
172
                || obj instanceof URL
173
                || obj instanceof URI
174
                || obj instanceof Short
175
                || obj instanceof Integer
176
                || obj instanceof Long
177
                || obj instanceof Float
178
                || obj instanceof Double) {
179
            return true;
180
        }
181
        PersistenceManager persistenceManager = ToolsLocator.getPersistenceManager();
182
        PersistenceManager.Factories factories = persistenceManager.getFactories();
183
        PersistenceFactory factory = factories.get(obj);
184
        if (factory == null) {
185
            return false;
186
        }
187
        return true;
188
    }
189

    
190
    @Override
191
    public void loadFromState(PersistentState state) throws PersistenceException {
192
        this.properties = new HashMap();
193
        Map props = (Map) state.get("properties");
194
        if (props != null) {
195
            copyFrom(props);
196
        }
197
    }
198

    
199
    @Override
200
    public void addObserver(Observer o) {
201
        if (this.observableHelper == null) {
202
            this.observableHelper = new ObservableHelper();
203
        }
204
        this.observableHelper.addObserver(o);
205
    }
206

    
207
    @Override
208
    public void deleteObserver(Observer o) {
209
        if (this.observableHelper == null) {
210
            this.observableHelper = new ObservableHelper();
211
        }
212
        this.observableHelper.deleteObserver(o);
213
    }
214

    
215
    @Override
216
    public void deleteObservers() {
217
        if (this.observableHelper == null) {
218
            this.observableHelper = new ObservableHelper();
219
        }
220
        this.observableHelper.deleteObservers();
221
    }
222

    
223
    public static void registerPersistence() {
224

    
225
        PersistenceManager manager = ToolsLocator.getPersistenceManager();
226
        if (manager.getDefinition("PropertiesSupportHelper") == null) {
227
            DynStruct definition = manager.addDefinition(
228
                    PropertiesSupportHelper.class,
229
                    "PropertiesSupportHelper",
230
                    "PropertiesSupportHelper Persistence definition",
231
                    null,
232
                    null
233
            );
234
            definition.addDynFieldMap("properties")
235
                    .setClassOfItems(Object.class)
236
                    .setMandatory(true);
237
        }
238
    }
239
}