Statistics
| Revision:

gvsig-projects-pool / org.gvsig.vcsgis / trunk / org.gvsig.vcsgis / org.gvsig.vcsgis.lib / org.gvsig.vcsgis.lib.impl / src / main / java / org / gvsig / vcsgis / lib / repository / localdb / tables / DataRepoTable.java @ 3633

History | View | Annotate | Download (13.1 KB)

1
package org.gvsig.vcsgis.lib.repository.localdb.tables;
2

    
3
import java.sql.Timestamp;
4
import java.text.SimpleDateFormat;
5
import javax.json.JsonObject;
6
import org.gvsig.expressionevaluator.spi.JsonUtils;
7
import org.gvsig.fmap.dal.DALLocator;
8
import org.gvsig.fmap.dal.DataManager;
9
import org.gvsig.fmap.dal.DataTypes;
10
import org.gvsig.fmap.dal.feature.EditableFeatureType;
11
import org.gvsig.fmap.dal.feature.Feature;
12
import org.gvsig.fmap.dal.feature.FeatureSet;
13
import org.gvsig.fmap.dal.feature.FeatureStore;
14
import org.gvsig.fmap.dal.feature.FeatureType;
15
import org.gvsig.fmap.geom.Geometry;
16
import org.gvsig.json.Json;
17
import org.gvsig.json.JsonObjectBuilder;
18
import org.gvsig.tools.dataTypes.CoercionException;
19
import org.gvsig.tools.dispose.DisposableIterable;
20
import org.gvsig.tools.dispose.DisposeUtils;
21
import org.gvsig.tools.dynform.spi.DynFormSPIManager;
22
import org.gvsig.tools.dynobject.DynObjectValueItem;
23
import static org.gvsig.vcsgis.lib.VCSGisManager.OP_DELETE;
24
import static org.gvsig.vcsgis.lib.VCSGisManager.OP_INSERT;
25
import static org.gvsig.vcsgis.lib.VCSGisManager.OP_UPDATE;
26
import static org.gvsig.vcsgis.lib.VCSGisManager.VCSGISCODELEN;
27
import org.gvsig.vcsgis.lib.VCSGisUtils;
28
import org.gvsig.vcsgis.lib.repository.VCSGisRepositoryData;
29
import org.gvsig.vcsgis.lib.repository.localdb.VCSGisRepositoryLocaldb;
30

    
31
/**
32
 *
33
 * @author gvSIG Team
34
 */
35
@SuppressWarnings("UseSpecificCatch")
36
public class DataRepoTable extends AbstractRepoTable {
37

    
38
    public static final String TABLE_NAME = "VCSGISREPO_DATA";
39

    
40
    private static final String COD_DATA = "COD_DATA";
41
    private static final String COD_ENTITY = "COD_ENTITY";
42
    private static final String COD_REVISION = "COD_REVISION";
43
    private static final String DATA_REVNUMBER = "DAT_REVNUMBER";
44
    private static final String DATA_EFECTIVEDATE = "DAT_EFECTIVEDATE";
45
    private static final String DATA_OPERATION = "DAT_OPERATION";
46
    private static final String DATA_FEATURERELATEDCODE = "DAT_FEATURERELATEDCODE";
47
    private static final String DATA_GEOM = "DAT_GEOM";
48
    private static final String DATA_DATA = "DAT_DATA";
49

    
50
    public static class DataRepoRow extends AbstractRow implements VCSGisRepositoryData {
51

    
52
        public DataRepoRow(VCSGisRepositoryLocaldb repository) {
53
            super(repository, TABLE_NAME, COD_DATA, null);
54
        }
55
        
56
        public DataRepoRow(VCSGisRepositoryLocaldb repository, Feature feature) {
57
            super(repository, TABLE_NAME, COD_DATA, feature);
58
        }
59

    
60
        @Override
61
        public String getDataCode() {
62
            return this.getCode();
63
        }
64

    
65
        @Override
66
        public String getRevisionCode() {
67
            return this.feature.getString(COD_REVISION);
68
        }
69
        
70
        @Override
71
        public String getEntityCode() {
72
            return this.feature.getString(COD_ENTITY);
73
        }
74
        
75
        @Override
76
        public int getOperation() {
77
            return this.feature.getInt(DATA_OPERATION);
78
        }
79
        
80
        @Override
81
        public int getRevisionNumber() {
82
            return this.feature.getInt(DATA_REVNUMBER);
83
        }
84
        
85
        @Override
86
        public Timestamp getEfectiveDate() {
87
            return this.feature.getTimestamp(DATA_EFECTIVEDATE);
88
        }
89

    
90
        @Override
91
        public String getFeatureRelatedCode() {
92
            return this.feature.getString(DATA_FEATURERELATEDCODE);
93
        }
94
        
95
        public Geometry getGeometry() {
96
            return this.feature.getGeometry(DATA_GEOM);
97
        }
98
        
99
        @Override
100
        public String getData() {
101
            return this.feature.getString(DATA_DATA);
102
        }
103
        
104
        public void setRevisionCode(String code) {
105
            this.feature.set(COD_REVISION, code);
106
        }
107
        
108
        public void setEntityCode(String code) {
109
            this.feature.set(COD_ENTITY, code);
110
        }
111
        
112
        public void setOperation(int op) {
113
            this.feature.set(DATA_OPERATION, op);
114
        }
115
        
116
        public void setRevisionNumber(long revnum) {
117
            this.feature.set(DATA_REVNUMBER, revnum);
118
        }
119
        
120
        public void setEfectiveDate(Timestamp date) {
121
            this.feature.set(DATA_EFECTIVEDATE, date);
122
        }
123
        
124
        public void setIdentifier(String code) {
125
            this.feature.set(DATA_FEATURERELATEDCODE, code);
126
        }
127
        
128
        public void setGeometry(Geometry geom) {
129
            this.feature.set(DATA_GEOM, geom);
130
        }
131
        
132
        public void setValues(String jsonValues) {
133
            this.feature.set(DATA_DATA, jsonValues);
134
        }
135

    
136
        @Override
137
        public JsonObject getDataAsJson() {
138
            try {
139
                String s = this.getData();
140
                if( s == null ) {
141
                    return null;
142
                }
143
                JsonObject json = JsonUtils.toJsonObject(s);
144
                return json;
145
            } catch (CoercionException ex) {
146
                return null;
147
            }
148
        }
149

    
150
        @Override
151
        public JsonObject toJson() {
152
            return this.toJsonBuilder().build();
153
        }
154

    
155
        @Override
156
        public JsonObjectBuilder toJsonBuilder() {
157
            JsonObjectBuilder builder = Json.createObjectBuilder();
158
            builder.add("DataCode", this.getDataCode());
159
            builder.add("EntityCode", this.getEntityCode());
160
            builder.add("RevisionCode", this.getRevisionCode());
161
            builder.add("RevisionNumber", this.getRevisionNumber());
162
            builder.add("EfectiveDate", this.getEfectiveDate().toString());
163
            builder.add("Operation", this.getOperation());
164
            builder.add("FeatureRelatedCode", this.getFeatureRelatedCode());
165
            builder.add("Data", this.getData());
166
            return builder;
167
        }
168
        
169
    }
170

    
171
    public DataRepoTable() {
172
        super(TABLE_NAME, featureType());
173
    }
174

    
175
    
176
    public DisposableIterable<Feature> getDataOfEntityFromRevisionNumber(VCSGisRepositoryLocaldb repository, String entityCode, long revnumber) {
177
        // if revnumber < 0 return all features
178
        FeatureStore store = null;
179
        DisposableIterable<Feature> features = null;
180
        try {
181

    
182
            String sql = String.format(
183
                    VCSGisUtils.getSqlTemplate(
184
                            repository.getServerExplorer().getProviderName(), 
185
                            "getDataOfEntityFromRevisionNumber"),
186
                    revnumber,
187
                    entityCode
188
            );
189
                    
190
            
191
            store = repository.openFeatureStore(TABLE_NAME,sql);
192
            FeatureSet fset = store.getFeatureSet();
193
//            dumpData("Data", fset);
194
            features = fset.iterable();
195
            return features;
196
        } catch (Exception ex) {
197
            DisposeUtils.disposeQuietly(features);
198
            throw new RuntimeException("Can't retrieve data of 'ENTITY["+entityCode+"] from revision "+revnumber+".", ex);
199
        } finally {
200
            if( store!=null ) {
201
                DisposeUtils.dispose(store);
202
            }
203
        }
204
    }
205

    
206
    public DisposableIterable<Feature> getDataOfEntityToRevisionNumber(VCSGisRepositoryLocaldb repository, String entityCode, long revnumber) {
207
        // if revnumber < 0 return all features
208
        FeatureStore store = null;
209
        DisposableIterable<Feature> features = null;
210
        try {
211

    
212
            String sql = String.format(
213
                    VCSGisUtils.getSqlTemplate(
214
                            repository.getServerExplorer().getProviderName(), 
215
                            "getDataOfEntityToRevisionNumber"),
216
                    revnumber,
217
                    entityCode
218
            );
219
                    
220
            
221
            store = repository.openFeatureStore(TABLE_NAME,sql);
222
            FeatureSet fset = store.getFeatureSet();
223
//            dumpData("Data", fset);
224
            features = fset.iterable();
225
            return features;
226
        } catch (Exception ex) {
227
            DisposeUtils.disposeQuietly(features);
228
            throw new RuntimeException("Can't retrieve data of 'ENTITY["+entityCode+"] to revision "+revnumber+".", ex);
229
        } finally {
230
            if( store!=null ) {
231
                DisposeUtils.dispose(store);
232
            }
233
        }
234
    }
235

    
236
    public DisposableIterable<Feature> getDataOfEntityFromEfectiveDate(VCSGisRepositoryLocaldb repository, String entityCode, Timestamp efectiveDate) {
237
        FeatureStore store = null;
238
        DisposableIterable<Feature> features = null;
239
        SimpleDateFormat dateFormat = new SimpleDateFormat(
240
                VCSGisUtils.getSqlTemplate(
241
                        repository.getServerExplorer().getProviderName(),
242
                        "dateFormat")
243
        );
244
        try {
245
            String sql = String.format(
246
                    VCSGisUtils.getSqlTemplate(
247
                            repository.getServerExplorer().getProviderName(), 
248
                            "getDataOfEntityFromEfectiveDate"
249
                    ),
250
                    entityCode,
251
                    dateFormat.format(efectiveDate)
252
            );
253

    
254
            store = repository.openFeatureStore(TABLE_NAME,sql);
255
            FeatureSet fset = store.getFeatureSet();
256
            features = fset.iterable();
257
            return features;
258
        } catch (Exception ex) {
259
            DisposeUtils.disposeQuietly(features);
260
            throw new RuntimeException("Can't data of 'ENTITY["+entityCode+"] from efective date "+efectiveDate+".", ex);
261
        } finally {
262
            if( store!=null ) {
263
                DisposeUtils.dispose(store);
264
            }
265
        }
266
    }
267

    
268
    private void dumpData(String s, FeatureSet fset) {
269
        LOGGER.debug("BEGIN "+s);
270
        DisposableIterable<Feature> features = fset.iterable();
271
        for (Feature feature : features) {
272
            LOGGER.debug("DATA: "+ feature.toJson().toString());
273
        }
274
        LOGGER.debug("END "+s);
275
    }
276
    
277
    public static final FeatureType featureType() {
278
        DataManager dataManager = DALLocator.getDataManager();
279
        EditableFeatureType ft = dataManager.createFeatureType();
280
        ft.setLabel("VCSGIS Data");
281
        ft.getTags().set("ID", TABLE_NAME);
282
        ft.getTags().set(DynFormSPIManager.TAG_DYNFORM_HEIGHT, 400);
283
        ft.getTags().set(DynFormSPIManager.TAG_DYNFORM_WIDTH, 500);
284
        ft.getTags().set(DynFormSPIManager.TAG_DYNFORM_LAYOUTMODE, DynFormSPIManager.TAG_DYNFORM_LAYOUTMODE_VALUE_TABS);
285
        ft.add(COD_DATA, DataTypes.STRING)
286
                .setSize(VCSGISCODELEN)
287
                .setIsPrimaryKey(true)
288
                .setLabel("Code");
289
        ft.add(COD_REVISION, DataTypes.STRING)
290
                .setForeingkey(
291
                        true, 
292
                        false, 
293
                        RevisionsRepoTable.TABLE_NAME, 
294
                        RevisionsRepoTable.COD_REVISION, 
295
                        "FORMAT('r%d %s', REV_NUMBER, REV_OPERATIONDATE)"
296
                )
297
//                .setIsIndexed(true)
298
//                .setAllowIndexDuplicateds(true)
299
                .setSize(VCSGISCODELEN)
300
                .setLabel("Revision");
301
        ft.add(COD_ENTITY, DataTypes.STRING)
302
                .setForeingkey(
303
                        true, 
304
                        false, 
305
                        EntitiesRepoTable.TABLE_NAME, 
306
                        EntitiesRepoTable.COD_ENTITY, 
307
                        EntitiesRepoTable.ENTITY_NAME
308
                )
309
//                .setIsIndexed(true)
310
//                .setAllowIndexDuplicateds(true)
311
                .setSize(VCSGISCODELEN)
312
                .setLabel("Entity");
313
        ft.add(DATA_OPERATION, DataTypes.INTEGER)
314
//                .setIsIndexed(true)
315
//                .setAllowIndexDuplicateds(true)
316
                .setLabel("Operation")
317
                .setAvailableValues(new DynObjectValueItem[] {
318
                    new DynObjectValueItem(OP_INSERT, "Insert"),
319
                    new DynObjectValueItem(OP_DELETE, "Delete"),
320
                    new DynObjectValueItem(OP_UPDATE, "Update")
321
                });
322
        ft.add(DATA_REVNUMBER, DataTypes.LONG)
323
//                .setIsIndexed(true)
324
//                .setAllowIndexDuplicateds(true)
325
                .setLabel("Rev. number");
326
        ft.add(DATA_EFECTIVEDATE, DataTypes.TIMESTAMP)
327
//                .setIsIndexed(true)
328
//                .setAllowIndexDuplicateds(true)
329
                .setLabel("User date");
330
        ft.add(DATA_FEATURERELATEDCODE, DataTypes.STRING)
331
//                .setIsIndexed(true)
332
//                .setAllowIndexDuplicateds(true)
333
                .setSize(VCSGISCODELEN)
334
                .setLabel("Identifier")
335
                .setDescription("Identifier if the feature that represent.");
336
        ft.add(DATA_GEOM, DataTypes.GEOMETRY)
337
                .setGeometryType(Geometry.TYPES.GEOMETRY, Geometry.SUBTYPES.GEOM3D)
338
//                .setIsIndexed(true)
339
                .setLabel("Geometry");
340
        ft.add(DATA_DATA, DataTypes.STRING)
341
                .setSize(10240)
342
                .setLabel("Feature data serialized in json.")
343
                .setGroup("Data");
344
        
345
        return ft.getNotEditableCopy();
346
    }
347

    
348
    public boolean canUpdate(String relatedFeatureCode) {
349
        return true;
350
    }
351

    
352
    public boolean canDelete(String relatedFeatureCode) {
353
        return true;
354
    }
355

    
356
}