Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.dal / org.gvsig.fmap.dal.spi / src / main / java / org / gvsig / fmap / dal / spi / AbstractDataParameters.java @ 45425

History | View | Annotate | Download (11 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or modify it under
7
 * the terms of the GNU General Public License as published by the Free Software
8
 * Foundation; either version 3 of the License, or (at your option) any later
9
 * version.
10
 *
11
 * This program is distributed in the hope that it will be useful, but WITHOUT
12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
14
 * details.
15
 *
16
 * You should have received a copy of the GNU General Public License along with
17
 * this program; if not, write to the Free Software Foundation, Inc., 51
18
 * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19
 *
20
 * For any additional information, do not hesitate to contact us at info AT
21
 * gvsig.com, or visit our website www.gvsig.com.
22
 */
23
package org.gvsig.fmap.dal.spi;
24

    
25
import java.io.ByteArrayInputStream;
26
import java.io.ByteArrayOutputStream;
27
import java.io.File;
28
import java.io.IOException;
29
import java.util.Iterator;
30
import java.util.List;
31
import javax.json.JsonObject;
32
import org.apache.commons.io.FileUtils;
33
import org.apache.commons.io.FilenameUtils;
34
import org.apache.commons.lang3.StringUtils;
35
import org.apache.commons.lang3.mutable.MutableInt;
36
import org.cresques.cts.ICRSFactory;
37
import org.cresques.cts.IProjection;
38
import org.gvsig.fmap.crs.CRSFactory;
39

    
40
import org.slf4j.Logger;
41
import org.slf4j.LoggerFactory;
42

    
43
import org.gvsig.fmap.dal.DataParameters;
44
import org.gvsig.fmap.dal.exception.CopyParametersException;
45
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
46
import org.gvsig.json.Json;
47
import org.gvsig.json.JsonObjectBuilder;
48
import org.gvsig.tools.ToolsLocator;
49
import org.gvsig.tools.dynobject.DelegatedDynObject;
50
import org.gvsig.tools.dynobject.DynClass;
51
import org.gvsig.tools.dynobject.DynField;
52
import org.gvsig.tools.dynobject.DynObject;
53
import org.gvsig.tools.dynobject.DynObjectEncoder;
54
import org.gvsig.tools.dynobject.DynObjectManager;
55
import org.gvsig.tools.dynobject.exception.DynMethodException;
56
import org.gvsig.tools.dynobject.exception.DynObjectValidateException;
57
import org.gvsig.tools.persistence.PersistenceFactory;
58
import org.gvsig.tools.persistence.PersistenceManager;
59
import org.gvsig.tools.persistence.PersistentState;
60
import org.gvsig.tools.persistence.exception.PersistenceException;
61
import org.gvsig.tools.persistence.xml.XMLPersistenceManager;
62

    
63
/**
64
 * @author jmvivo
65
 *
66
 */
67
@SuppressWarnings("UseSpecificCatch")
68
public abstract class AbstractDataParameters implements DataParameters {
69

    
70
    private static final Logger LOGGER = LoggerFactory.getLogger(AbstractDataParameters.class);
71

    
72
    @Override
73
    public Object getDynValue(String name) {
74
        return getDelegatedDynObject().getDynValue(name);
75
    }
76

    
77
    public String getProviderName() {
78
        return (String) this.getDynValue(DataStoreProviderServices.PROVIDER_PARAMTER_NAME);
79
    }
80
    
81
    public String getDataStoreName() {
82
        return (String) this.getDynValue(DataStoreProviderServices.PROVIDER_PARAMTER_NAME);
83
    }
84

    
85
    public String getDescription() {
86
        return this.getDynClass().getDescription();
87
    }
88
    
89
    @Override
90
    public String toString() {
91
        DynObjectEncoder encoder = ToolsLocator.getDynObjectManager().createSimpleDynObjectEncoder();
92
        return encoder.encode(this);
93
    }
94

    
95
    @Override
96
    public void setDynValue(String name, Object value) {
97
        DelegatedDynObject delegated = getDelegatedDynObject();
98
        if (delegated.getDynClass().getDynField(name) != null) {
99
            delegated.setDynValue(name, value);
100
        } else {
101
            try {
102
                throw new IllegalArgumentException(name);
103
            } catch (IllegalArgumentException ex) {
104
                LOGGER.warn("Attribute '" + name + "' is not defined in "
105
                        + delegated.getDynClass().getFullName() + " definition", ex);
106
            }
107
        }
108
    }
109

    
110
    @Override
111
    public void clear() {
112
        DynObjectManager manager = ToolsLocator.getDynObjectManager();
113
        manager.clear(this);
114
    }
115

    
116
    protected void copyValuesTo(DataParameters target) {
117
        DynObjectManager manager = ToolsLocator.getDynObjectManager();
118
        manager.copy(this, target);
119
    }
120

    
121
    @Override
122
    public DataParameters getCopy() {
123
        DataParameters copy;
124
        try {
125
            if( this instanceof Cloneable ) {
126
                copy = (DataParameters) this.clone();
127
            } else {
128
                copy = (DataParameters) this.getClass().newInstance();
129
                this.copyValuesTo(copy);
130
            }
131
        } catch (Exception e) {
132
            throw new CopyParametersException("data parameters", e);
133
        }
134
        return copy;
135
    }
136

    
137
    @Override
138
    public void saveToState(PersistentState state) throws PersistenceException {
139
        DynField[] fields = getDelegatedDynObject().getDynClass().getDynFields();
140

    
141
        for (DynField field : fields) {
142
            if (field.isPersistent()) {
143
                String name = field.getName();
144
                Object value = this.getDynValue(name);
145
                state.set(name, value);
146
            }
147
        }
148
    }
149

    
150
    @Override
151
    public void loadFromState(PersistentState state) throws PersistenceException {
152
        @SuppressWarnings("rawtypes")
153
        Iterator it = state.getNames();
154
        while (it.hasNext()) {
155
            String name = (String) it.next();
156
            try {
157
                Object value = state.get(name);
158
                this.setDynValue(name, value);
159
            } catch (Throwable t) {
160
                LOGGER.warn("Can't load '" + name + "' property", t);
161
            }
162
        }
163
    }
164

    
165
    @Override
166
    public void delegate(DynObject dynObject) {
167
        getDelegatedDynObject().delegate(dynObject);
168

    
169
    }
170

    
171
    @Override
172
    public DynClass getDynClass() {
173
        return getDelegatedDynObject().getDynClass();
174
    }
175

    
176
    @Override
177
    public boolean hasDynValue(String name) {
178
        return getDelegatedDynObject().hasDynValue(name);
179
    }
180

    
181
    @Override
182
    public void implement(DynClass dynClass) {
183
        getDelegatedDynObject().implement(dynClass);
184
    }
185

    
186
    @Override
187
    public Object invokeDynMethod(String name, Object[] args)
188
            throws DynMethodException {
189
        return getDelegatedDynObject().invokeDynMethod(this, name, args);
190
    }
191

    
192
    @Override
193
    public Object invokeDynMethod(int code, Object[] args)
194
            throws DynMethodException {
195
        return getDelegatedDynObject().invokeDynMethod(this, code, args);
196
    }
197

    
198
    @Override
199
    public void validate() throws ValidateDataParametersException {
200
        try {
201
            this.getDynClass().validate(this);
202
        } catch (DynObjectValidateException e) {
203
            throw new ValidateDataParametersException(e);
204
        }
205
    }
206

    
207
    protected void loadPRJ(File file, String parameterName) {
208
        File prjFile = new File(FilenameUtils.removeExtension(file.getAbsolutePath()) + ".prj");
209
        if (prjFile.exists()) {
210
            try {
211
                String contentFile = FileUtils.readFileToString(prjFile);
212
                if (StringUtils.isNotEmpty(contentFile)) {
213
                    IProjection crs = CRSFactory.getCRSFactory().get(ICRSFactory.FORMAT_WKT_ESRI, contentFile);
214
                    this.setDynValue(parameterName, crs);
215
                }
216
            } catch (IOException e) {
217
                LOGGER.warn("Couldn't read prj file ''{}''", prjFile.getAbsolutePath());
218
            }
219
        }
220
    }
221

    
222
    protected void loadWLD(File file, String parameterName) {
223
        File wldFile = new File(FilenameUtils.removeExtension(file.getAbsolutePath()) + ".wld");
224
        if (wldFile.exists()) {
225
            try {
226
                List<String> lines = FileUtils.readLines(wldFile);
227
                if (lines != null && lines.size() == 6) {
228
                    this.setDynValue(parameterName, lines);
229
                }
230

    
231
            } catch (IOException e) {
232
                LOGGER.warn("Couldn't read wld file ''{}''", wldFile.getAbsolutePath());
233
            }
234
        }
235
    }
236

    
237
    @Override
238
    public byte[] toByteArray() {
239
            try {
240
//            PersistenceManager persistenceManager = ToolsLocator.getPersistenceManager();
241
            PersistenceManager persistenceManager = new XMLPersistenceManager();
242
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
243
            PersistentState state = persistenceManager.getState(this, false, new MutableInt(1));
244
            persistenceManager.saveState(state, stream);
245
            return stream.toByteArray();
246
        } catch (Exception ex) {
247
            LOGGER.warn("Can't get byte[] from parameters.",ex);
248
            return null;
249
        }
250
    }
251

    
252
    public static DataParameters fromByteArray(byte[] data) {
253
        Object x;
254
        PersistenceManager defaultPersistenceManager = ToolsLocator.getPersistenceManager();
255
        try {
256
            PersistenceManager xmlPersistenceManager = new XMLPersistenceManager();
257
            for (Iterator it = defaultPersistenceManager.getFactories().iterator(); it.hasNext();) {
258
              PersistenceFactory factory = (PersistenceFactory) it.next();
259
              xmlPersistenceManager.registerFactory(factory);
260
            }
261
            ByteArrayInputStream stream = new ByteArrayInputStream(data);
262
            x = xmlPersistenceManager.getObject(stream);
263
            DataParameters parameters = (DataParameters) x;
264
            return parameters;
265
        } catch (Exception ex) {
266
          LOGGER.debug("Can't get parameters from byte[] with XMLPersistenceManager.",ex);
267
          // Try with the default persistence manager for compatibility
268
        }      
269
        try {
270
            ByteArrayInputStream stream = new ByteArrayInputStream(data);
271
            DataParameters parameters = (DataParameters) defaultPersistenceManager.getObject(stream);
272
            return parameters;
273
        } catch (Exception ex) {
274
            LOGGER.warn("Can't get parameters from byte[].",ex);
275
            return null;
276
        }      
277
    }
278
    
279
    @Override
280
    public boolean equals(Object obj) {
281
        if( !(obj instanceof DynObject) ) {
282
            return false;
283
        }
284
        DynObjectManager manager = ToolsLocator.getDynObjectManager();
285
        return manager.equals(this, (DynObject) obj);
286
    }
287

    
288
    @Override
289
    public int hashCode() {
290
        DynObjectManager manager = ToolsLocator.getDynObjectManager();
291
        return manager.hashCode(this);
292
    }
293

    
294
    @Override
295
    public JsonObject toJson() {
296
        JsonObjectBuilder builder = this.toJsonBuilder();
297
        return builder.build();
298
    }
299

    
300
    @Override
301
    public JsonObjectBuilder toJsonBuilder() {        
302
        JsonObjectBuilder builder = Json.createObjectBuilder();
303
        builder.add_class(this);
304
        builder.addAll(this);
305
        return builder;
306
    }
307

    
308
    @Override
309
    public void fromJson(JsonObject json) {
310
        Json.addAll(this, json);
311
    }
312

    
313
    
314
    /**
315
     * Returns an instance of the {@link DynObject} to delegate to.
316
     *
317
     * @return the delegate {@link DynObject}
318
     */
319
    protected abstract DelegatedDynObject getDelegatedDynObject();
320

    
321
}