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 / workspace / tables / RemoteChangesTable.java @ 3633

History | View | Annotate | Download (19.5 KB)

1
package org.gvsig.vcsgis.lib.workspace.tables;
2

    
3
import java.util.List;
4
import javax.json.JsonObject;
5
import javax.json.JsonString;
6
import javax.json.JsonValue;
7
import org.apache.commons.lang3.StringUtils;
8
import org.gvsig.fmap.dal.DALLocator;
9
import org.gvsig.fmap.dal.DataManager;
10
import org.gvsig.fmap.dal.feature.EditableFeatureType;
11
import org.gvsig.fmap.dal.feature.Feature;
12
import org.gvsig.fmap.dal.feature.FeatureQuery;
13
import org.gvsig.fmap.dal.feature.FeatureSet;
14
import org.gvsig.fmap.dal.feature.FeatureSet.DisposableFeatureSetIterable;
15
import org.gvsig.fmap.dal.feature.FeatureStore;
16
import org.gvsig.fmap.dal.feature.FeatureType;
17
import org.gvsig.fmap.geom.Geometry;
18
import org.gvsig.fmap.geom.GeometryLocator;
19
import org.gvsig.fmap.geom.GeometryManager;
20
import org.gvsig.json.Json;
21
import org.gvsig.tools.dataTypes.DataTypes;
22
import org.gvsig.tools.dispose.DisposeUtils;
23
import org.gvsig.tools.dynobject.DynObjectValueItem;
24
import org.gvsig.tools.util.GetItemWithSize64;
25
import org.gvsig.vcsgis.lib.VCSGisEntity;
26
import static org.gvsig.vcsgis.lib.VCSGisManager.OP_DELETE;
27
import static org.gvsig.vcsgis.lib.VCSGisManager.OP_INSERT;
28
import static org.gvsig.vcsgis.lib.VCSGisManager.OP_UPDATE;
29
import static org.gvsig.vcsgis.lib.VCSGisManager.STATE_CONFLICT;
30
import static org.gvsig.vcsgis.lib.VCSGisManager.STATE_LOCAL_MODIFIED;
31
import static org.gvsig.vcsgis.lib.VCSGisManager.STATE_LOCAL_UNMODIFIED;
32
import static org.gvsig.vcsgis.lib.VCSGisManager.VCSGISCODELEN;
33
import org.gvsig.vcsgis.lib.VCSGisUtils;
34
import org.gvsig.vcsgis.lib.repository.VCSGisRepositoryChange;
35
import org.gvsig.vcsgis.lib.workspace.VCSGisWorkspace;
36
import org.gvsig.vcsgis.lib.workspace.tables.AbstractTable.AbstractRow;
37

    
38
/**
39
 *
40
 * @author gvSIG Team
41
 */
42
@SuppressWarnings("UseSpecificCatch")
43
public class RemoteChangesTable extends AbstractTable {
44

    
45
    
46
    public static final String TABLE_NAME = "VCSGIS_REMOTECHANGES";
47
    
48
    private static final String COD_REMOTECHANGE = "COD_REMOTECHANGE";
49
    public static final String COD_ENTITY = "COD_ENTITY";
50
    private static final String COD_REVISION = "COD_REVISION";
51
//    private static final String COD_USER = "COD_USER";
52
    public static final String SELECTED = "RCH_SELECTED";
53
    private static final String REQUESTCODE = "RCH_REQUESTCODE";
54
    private static final String REVISION_NUMBER = "RCH_REVNUMBER";
55
    private static final String DATA_CODE = "RCH_DATACODE";
56
    private static final String OPERATION = "RCH_OPERATION";
57
//    private static final String REVISION_DATE = "RCH_DATE";
58
    private static final String FEATURE_DATA = "RCH_DATA";
59
    private static final String STATUS = "RCH_STATUS";
60
  
61
    @SuppressWarnings("UseSpecificCatch")
62
    public static class RemoteChangeRow extends AbstractRow implements VCSGisRepositoryChange {
63

    
64
        protected VCSGisEntity entity;
65
        
66
        public RemoteChangeRow(VCSGisWorkspace workspace) {
67
            super(workspace, TABLE_NAME, COD_REMOTECHANGE);
68
        }
69
        
70
        public RemoteChangeRow(VCSGisWorkspace workspace, Feature feature) {
71
            super(workspace, TABLE_NAME, COD_REMOTECHANGE, feature);
72
        }
73
        
74
        @Override
75
        public String getEntityCode() {
76
            return this.getString(COD_ENTITY);
77
        }
78

    
79
        @Override
80
        public String getRelatedFeatureCode() {
81
            return this.getString(DATA_CODE);
82
        }
83

    
84
        private Feature getRelatedFeature() {
85
            String entityName;
86
            String code;
87
            try {
88
                entityName = this.getEntity().getEntityName();
89
                code = this.getRelatedFeatureCode();
90
                FeatureStore store = workspace.getFeatureStore(entityName);
91
                Feature f = store.findFirst("\""+this.getEntity().getFeatureIdFieldName()+"\"='"+code+"'");
92
                if( f==null ) {
93
                    return null;
94
                }
95
                return f;
96
            } catch (Exception ex) {
97
                return null;
98
            }
99
        }        
100
        
101
        @Override
102
        public String getRequestCode() {
103
            return this.getString(REQUESTCODE);
104
        }
105
        
106
        @Override
107
        public String getRevisionCode() {
108
            return this.getString(COD_REVISION);
109
        }
110
        
111
        @Override
112
        public long getRevisionNumber() {
113
            return this.getLong(REVISION_NUMBER);
114
        }
115
        
116
        @Override
117
        public int getOperation() {
118
            return this.getInt(OPERATION);
119
        }
120
        
121
        @Override
122
        public String getOperationLabel() {
123
            return VCSGisUtils.getOperationLabel(this.getOperation());
124
        }
125
        
126
        @Override
127
        public boolean isSelected() {
128
            return this.getBoolean(SELECTED);
129
        }
130
        
131
        @Override
132
        public int getStatus() {
133
            return this.getInt(STATUS);
134
        }
135
        
136
        @Override
137
        public String getRelatedFeatureData() {
138
            return this.getString(FEATURE_DATA);
139
        }        
140

    
141
        @Override
142
        public JsonObject getRelatedFeatureDataAsJson() {
143
            JsonObject json = Json.createObject(this.getString(FEATURE_DATA));
144
            return json;
145
        }        
146

    
147
        public void setEntityCode(String code) {
148
            this.set(COD_ENTITY, code);
149
        }
150

    
151
//        public void setUserCode(String code) {
152
//            this.feature.set(COD_USER, code);
153
//        }
154

    
155
        public void setData(String data) {
156
            this.set(FEATURE_DATA, data);
157
        }
158

    
159
        public void setRevisionCode(String code) {
160
            this.set(COD_REVISION, code);
161
        }
162

    
163
        public void setRequestCode(String code) {
164
            this.set(REQUESTCODE, code);
165
        }
166

    
167
        public void setRevisionNumber(int revnum) {
168
            this.set(REVISION_NUMBER, revnum);
169
        }
170

    
171
        public void setDataCode(String code) {
172
            this.set(DATA_CODE, code);
173
        }
174
        
175
        public void setOperation(int op) {
176
            this.set(OPERATION, op);
177
        }
178
        
179
        @Override
180
        public void setSelected(boolean selected) {
181
            this.set(SELECTED, selected);
182
        }
183
        
184
        public void setStatus(int status) {
185
            this.set(STATUS, status);
186
        }
187
        
188
        public VCSGisEntity getEntity() {
189
            if( this.entity == null ) {
190
                this.entity = this.workspace.getWorkspaceEntityByCode(this.getEntityCode());
191
                if(this.entity == null){
192
                    this.entity = this.workspace.getRepositoryEntityByCode(this.getEntityCode());
193
                }
194
            }
195
            return this.entity;
196
        }
197

    
198
        @Override
199
        public String getLabel() {
200
            if(StringUtils.isBlank(this.getRelatedFeatureData())){
201
                Feature f = getRelatedFeature();
202
                if(f==null){
203
                    return null;
204
                }
205
                return f.getString(this.getEntity().getFieldForLabel());
206
            }
207
            JsonValue jsonValue = this.getRelatedFeatureDataAsJson().get(this.getEntity().getFieldForLabel());
208
            return convertJsonValueToString(jsonValue);
209
        }
210
        
211
        private static String convertJsonValueToString(JsonValue jsonValue) {
212
            if( jsonValue==null ) {
213
                return "";
214
            }
215
            if (jsonValue instanceof JsonString) {
216
                String jsonString = jsonValue.toString();
217
                return jsonString.substring(1, jsonString.length() - 1);
218
            } else {
219
                return jsonValue.toString();
220
            }
221
        }
222
        
223
        @Override
224
        public String toString() {
225
            switch (this.getOperation()) {
226
                case OP_INSERT:
227
                    return "{ OP:'INSERT', ENTITYCODE:'"+this.getEntityCode()+"', FEATURECODE:'"+this.getRelatedFeatureCode()+"', DATA:'"+this.getRelatedFeatureData()+"' }";
228
                case OP_UPDATE:
229
                    return "{ OP:'UPDATE', ENTITYCODE:'"+this.getEntityCode()+"', FEATURECODE:'"+this.getRelatedFeatureCode()+"', DATA:'"+this.getRelatedFeatureData()+"' }";
230
                case OP_DELETE:
231
                    return "{ OP:'DELETE', ENTITYCODE:'"+this.getEntityCode()+"', FEATURECODE:'"+this.getRelatedFeatureCode()+"' }";
232
                default:
233
                    return "{ OP:'"+this.getOperation()+"', ENTITYCODE:'"+this.getEntityCode()+"', FEATURECODE:'"+this.getRelatedFeatureCode()+"' }";
234
            }
235
        }
236
        
237
        @Override
238
        public Geometry getGeometry() {
239
            Geometry geom = null;
240
            GeometryManager geometryManager = GeometryLocator.getGeometryManager();
241
            String geometryFieldName = getEntity().getGeometryFieldName();
242
            String data = getRelatedFeatureData();
243
            if( !StringUtils.isBlank(data) && !StringUtils.isBlank(geometryFieldName) ) {
244
                JsonObject dataJson = Json.createObject(data);
245
                geom = geometryManager.createFromQuietly(
246
                        dataJson.getString(geometryFieldName, null)
247
                );
248
            }
249
            return geom;
250
        }
251

    
252
    }
253
    
254
    public RemoteChangesTable() {
255
        super(TABLE_NAME, featureType());
256
    }
257

    
258

    
259
    public void deleteAll(VCSGisWorkspace workspace) {
260
        FeatureStore store = null;
261
        try {
262
            store = workspace.getFeatureStore(TABLE_NAME);
263
            store.delete("TRUE");
264
        } catch (Exception ex) {
265
            throw new RuntimeException("Can't delete all remote changes.", ex);
266
        } finally {
267
            if( store!=null ) {
268
                DisposeUtils.dispose(store);
269
            }
270
        }
271
    }
272

    
273
    public void delete(VCSGisWorkspace workspace, String entityCode) {
274
        FeatureStore store = null;
275
        try {
276
            store = workspace.getFeatureStore(TABLE_NAME);
277
            store.delete("\""+COD_ENTITY+"\"='"+entityCode+"'");
278
        } catch (Exception ex) {
279
            throw new RuntimeException("Can't delete remote changes of entity ENTITY["+entityCode+"].", ex);
280
        } finally {
281
            if( store!=null ) {
282
                DisposeUtils.dispose(store);
283
            }
284
        }
285
    }
286

    
287
    public void delete(FeatureStore store, String entityCode) {
288
        store.delete("\""+COD_ENTITY+"\"='"+entityCode+"'");
289
    }
290

    
291
    public void deleteSelecteds(VCSGisWorkspace workspace) {
292
        FeatureStore store = null;
293
        try {
294
            store = workspace.getFeatureStore(TABLE_NAME);
295
            store.delete("\""+SELECTED+"\"");
296
        } catch (Exception ex) {
297
            throw new RuntimeException("Can't delete selected remote changes.", ex);
298
        } finally {
299
            if( store!=null ) {
300
                DisposeUtils.dispose(store);
301
            }
302
        }
303
    }
304
    public DisposableFeatureSetIterable getByEntityCodeAsIterator(VCSGisWorkspace workspace, String entityCode) {
305
        FeatureStore store = null;
306
        try {
307
            store = workspace.getFeatureStore(TABLE_NAME);
308
            FeatureSet changes;
309
            if( StringUtils.isBlank(entityCode) ) {
310
                changes = store.getFeatureSet();
311
            } else {
312
                changes = store.getFeatureSet("\""+COD_ENTITY+"\"='"+entityCode+"'");
313
            }
314
            return changes.iterable();
315
        } catch (Exception ex) {
316
            throw new RuntimeException("Can't retrieve remote changes by entity code (ENTITY["+entityCode+"]).", ex);
317
        } finally {
318
            if( store!=null ) {
319
                DisposeUtils.dispose(store);
320
            }
321
        }
322
    }
323

    
324

    
325
    public DisposableFeatureSetIterable getSelectedsByEntityCodeAsIterator(VCSGisWorkspace workspace, String entityCode) {
326
        FeatureStore store = null;
327
        try {
328
            store = workspace.getFeatureStore(TABLE_NAME);
329
            FeatureSet changes;
330
            if( StringUtils.isBlank(entityCode) ) {
331
                changes = store.getFeatureSet("\""+SELECTED+"\"");
332
            } else {
333
                changes = store.getFeatureSet("\""+SELECTED+"\" AND \""+COD_ENTITY+"\"='"+entityCode+"'");
334
            }
335
            return changes.iterable();
336
        } catch (Exception ex) {
337
            throw new RuntimeException("Can't retrieve selected remote changes by entity code (ENTITY["+entityCode+"]).", ex);
338
        } finally {
339
            if( store!=null ) {
340
                DisposeUtils.dispose(store);
341
            }
342
        }
343
    }
344

    
345
    public DisposableFeatureSetIterable getNotSelectedsByEntityCodeAsIterator(VCSGisWorkspace workspace, String entityCode) {
346
        FeatureStore store = null;
347
        try {
348
            store = workspace.getFeatureStore(TABLE_NAME);
349
            FeatureSet changes;
350
            if( StringUtils.isBlank(entityCode) ) {
351
                changes = store.getFeatureSet("NOT \""+SELECTED+"\"");
352
            } else {
353
                changes = store.getFeatureSet("NOT \""+SELECTED+"\" AND \""+COD_ENTITY+"\"='"+entityCode+"'");
354
            }
355
            return changes.iterable();
356
        } catch (Exception ex) {
357
            throw new RuntimeException("Can't retrieve not selected remote changes by entity code (ENTITY["+entityCode+"]).", ex);
358
        } finally {
359
            if( store!=null ) {
360
                DisposeUtils.dispose(store);
361
            }
362
        }
363
    }
364
    
365
    public GetItemWithSize64<Feature> getByEntityCode(VCSGisWorkspace workspace, String entityCode) {
366
        FeatureStore store = null;
367
        try {
368
            store = workspace.getFeatureStore(TABLE_NAME);
369
            
370
            
371
            GetItemWithSize64<Feature>  changes;
372
            if( StringUtils.isBlank(entityCode) ) {
373
                changes = store.getFeatures64();
374
            } else {
375
                changes = store.getFeatures64("\""+COD_ENTITY+"\"='"+entityCode+"'");
376
            }
377
            return changes;
378
        } catch (Exception ex) {
379
            throw new RuntimeException("Can't retrieve remote changes by entity code (ENTITY["+entityCode+"]).", ex);
380
        } finally {
381
            if( store!=null ) {
382
                DisposeUtils.dispose(store);
383
            }
384
        }
385
    }
386
    
387
    public GetItemWithSize64<Feature> getByEntityCodes(VCSGisWorkspace workspace, List<String> entityCodes) {
388
        FeatureStore store = null;
389
        try {
390
            store = workspace.getFeatureStore(TABLE_NAME);
391
            
392
            
393
            GetItemWithSize64<Feature>  changes;
394
            if( entityCodes == null || entityCodes.isEmpty()) {
395
                changes = store.getFeatures64();
396
            } else {
397
                StringBuilder filter = new StringBuilder();
398
                for (String entityCode : entityCodes) {
399
                    if(filter.length()>0){
400
                        filter.append(" OR "); 
401
                    }
402
                    filter.append("\"" + COD_ENTITY + "\"='").append(entityCode).append("'");
403
                }
404
                
405
                changes = store.getFeatures64(filter.toString());
406
            }
407
            return changes;
408
        } catch (Exception ex) {
409
            throw new RuntimeException("Can't retrieve remote changes by entity codes.", ex);
410
        } finally {
411
            if( store!=null ) {
412
                DisposeUtils.dispose(store);
413
            }
414
        }
415
    }
416
    
417
    public static final FeatureType featureType() {
418
        DataManager dataManager = DALLocator.getDataManager();
419
        EditableFeatureType ft = dataManager.createFeatureType();
420
        ft.setLabel("VCSGIS Remote changes");
421
        ft.getTags().set("ID", TABLE_NAME);
422
        ft.add(COD_REMOTECHANGE, DataTypes.STRING)
423
                .setSize(VCSGISCODELEN)
424
                .setIsPrimaryKey(true)
425
                .setLabel("Code")
426
                .setReadOnly(false);        
427
        ft.add(COD_ENTITY, DataTypes.STRING)
428
                .setIsIndexed(true)
429
                .setAllowIndexDuplicateds(true)
430
                .setSize(VCSGISCODELEN)
431
                .setLabel("Entity code");
432
        ft.add(COD_REVISION, DataTypes.STRING)
433
                .setIsIndexed(true)
434
                .setAllowIndexDuplicateds(true)
435
                .setSize(VCSGISCODELEN)
436
                .setLabel("Revision code");
437
        ft.add(REQUESTCODE, DataTypes.STRING)
438
                .setIsIndexed(true)
439
                .setAllowIndexDuplicateds(true)
440
                .setSize(40)
441
                .setLabel("Request code");
442
//        ft.add(COD_USER, DataTypes.STRING)
443
//                .setIsIndexed(true)
444
//                .setAllowIndexDuplicateds(true)
445
//                .setSize(VCSGISCODELEN)
446
//                .setLabel("User code");
447
        ft.add(SELECTED, DataTypes.BOOLEAN)
448
                .setIsIndexed(true)
449
                .setAllowIndexDuplicateds(true)
450
                .setLabel("Selected");
451
        ft.add(DATA_CODE, DataTypes.STRING)
452
                .setIsIndexed(false)
453
                .setSize(VCSGISCODELEN)
454
                .setLabel("Identifier")
455
                .setDescription("Feature code");
456
        ft.add(OPERATION, DataTypes.INTEGER)
457
                .setLabel("Operation")
458
                .setAvailableValues(new DynObjectValueItem[] {
459
                    new DynObjectValueItem(OP_INSERT, "Insert"),
460
                    new DynObjectValueItem(OP_UPDATE, "Update"),
461
                    new DynObjectValueItem(OP_DELETE, "Delete")
462
                });
463
        ft.add(STATUS, DataTypes.INTEGER)
464
                .setLabel("Status")
465
                .setAvailableValues(new DynObjectValueItem[] {
466
                    new DynObjectValueItem(STATE_LOCAL_UNMODIFIED, "Unmodified"),
467
                    new DynObjectValueItem(STATE_LOCAL_MODIFIED, "Modified"),
468
                    new DynObjectValueItem(STATE_CONFLICT, "Conflict")
469
                });
470
        ft.add(REVISION_NUMBER, DataTypes.LONG)
471
                .setLabel("Revision number");
472
//        ft.add(REVISION_DATE, DataTypes.TIMESTAMP)
473
//                .setLabel("Modification date");
474
        ft.add(FEATURE_DATA, DataTypes.STRING)
475
                .setLabel("Data");
476
        
477
        return ft.getNotEditableCopy();
478
    }
479
    
480
    public DisposableFeatureSetIterable getGroupedByEntity(VCSGisWorkspace workspace) {
481
        FeatureStore store = null;
482
        try {
483
            store = workspace.getFeatureStore(TABLE_NAME);
484
            FeatureQuery query = store.createFeatureQuery();
485

    
486
            query.getOrder().add(COD_ENTITY,true);
487
            query.getGroupByColumns().add(COD_ENTITY);
488
            query.retrievesAllAttributes();
489
            DisposableFeatureSetIterable changes = store.getFeatureSet(query).iterable();
490
            return changes;
491
        } catch (Exception ex) {
492
            throw new RuntimeException("Can't retrieve changes grouped by entity.", ex);
493
        } finally {
494
            if( store!=null ) {
495
                DisposeUtils.dispose(store);
496
            }
497
        }
498
    }
499
    
500
    public boolean updateNeedMerge(VCSGisWorkspace workspace, String entityCode) {
501
        FeatureStore store = null;
502
        try {
503
            store = workspace.getFeatureStore(TABLE_NAME);
504
            FeatureQuery query = store.createFeatureQuery("NOT \""+SELECTED+"\" AND \""+COD_ENTITY+"\"='"+entityCode+"'");
505
            query.setLimit(1);
506
            Feature f = store.findFirst(query);
507
            return f != null;
508
        } catch (Exception ex) {
509
            throw new RuntimeException("Can't retrieve if need merge for entity code (ENTITY["+entityCode+"]).", ex);
510
        } finally {
511
            if( store!=null ) {
512
                DisposeUtils.dispose(store);
513
            }
514
        }
515
    }
516
    
517
    
518
    public boolean updateStateFromLocalChanges(VCSGisWorkspace workspace, int status) {
519
        
520
        String sql = String.format(VCSGisUtils.getSqlTemplate(workspace.getExplorer().getProviderName(), "updateStateFromLocalChanges"), status);
521
        workspace.getExplorer().execute(sql);
522
                
523
        return true;
524
    }
525
}