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 / EntitiesRepoTable.java @ 3748

History | View | Annotate | Download (18.9 KB)

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

    
3
import java.util.HashMap;
4
import java.util.List;
5
import java.util.Map;
6
import javax.json.JsonObject;
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.FeatureSet.DisposableFeatureSetIterable;
13
import org.gvsig.fmap.dal.feature.FeatureStore;
14
import org.gvsig.fmap.dal.feature.FeatureType;
15
import org.gvsig.json.Json;
16
import org.gvsig.json.JsonObjectBuilder;
17
import org.gvsig.tools.dataTypes.DataTypes;
18
import org.gvsig.tools.dispose.DisposeUtils;
19
import org.gvsig.tools.dynform.spi.DynFormSPIManager;
20
import org.gvsig.tools.dynobject.DynObjectValueItem;
21
import org.gvsig.vcsgis.lib.VCSGisEntity;
22
import org.gvsig.vcsgis.lib.VCSGisEntityEditable;
23
import static org.gvsig.vcsgis.lib.VCSGisManager.TOPOLOGYPLAN_MODE_MANDATORY;
24
import static org.gvsig.vcsgis.lib.VCSGisManager.TOPOLOGYPLAN_MODE_RECOMMENDED;
25
import static org.gvsig.vcsgis.lib.VCSGisManager.VCSGISCODELEN;
26
import org.gvsig.vcsgis.lib.VCSGisUser;
27
import org.gvsig.vcsgis.lib.VCSGisUtils;
28
import org.gvsig.vcsgis.lib.repository.localdb.VCSGisRepositoryLocaldb;
29
import org.gvsig.vcsgis.lib.requests.RowCreateRequestHelper;
30
import org.gvsig.vcsgis.lib.requests.RowDeleteRequestHelper;
31
import org.gvsig.vcsgis.lib.requests.RowUpdateRequestHelper;
32

    
33
/**
34
 *
35
 * @author gvSIG Team
36
 */
37
@SuppressWarnings("UseSpecificCatch")
38
public class EntitiesRepoTable extends AbstractRepoTable {
39
    
40
    public static final String TABLE_NAME = "VCSGISREPO_ENTITIES";
41

    
42
    public static final String COD_ENTITY = "COD_ENTITY";
43
    private static final String COD_USER = "COD_USER";
44
    private static final String COD_TOPOLOGYPLAN = "COD_TOPOLOGYPLAN";
45
    private static final String COD_REVISION = "COD_REVISION";
46
    public static final String ENTITY_NAME = "ENT_NAME";
47
    private static final String DATATABLE_NAME = "ENT_DATATABLE";
48
    private static final String FEATUREID_FIELD_NAME = "ENT_FEATURECODE";
49
    private static final String GEOMETRY_FIELD_NAME = "ENT_GEOMNAME";
50
    private static final String DESCRIPTION = "ENT_DESCRIPTION";
51
    private static final String FEATURETYPE = "ENT_FEATURETYPE";
52
    private static final String FIELD_FOR_LABEL = "ENT_FIELDFORLABEL";
53
    private static final String CATEGORY = "ENT_CATEGORY";
54
    private static final String LABEL = "ENT_LABEL";
55
    private static final String AUTHORIZATIONS = "ENT_AUTORIZATIONS";
56
    private static final String TOPOLOGYPLAN_MODE = "ENT_TOPOLOGYPLAN_MODE";
57
    public static final String RESOURCES = "ENT_RESOURCES";
58
    public static final String DATA_MODELS = "ENT_DATA_MODELS";
59
    
60
    public static class EntityRepoRow extends AbstractRow implements VCSGisEntityEditable {
61

    
62
        FeatureType featureType;
63
        
64
        public EntityRepoRow(VCSGisRepositoryLocaldb repository) {
65
            super(repository, TABLE_NAME, COD_ENTITY, null);
66
        }
67
        
68
        public EntityRepoRow(VCSGisRepositoryLocaldb repository, Feature feature) {
69
            super(repository, TABLE_NAME, COD_ENTITY, feature);
70
        }
71

    
72
        @Override
73
        public String getEntityCode() {
74
            return super.getCode();
75
        }
76

    
77
        @Override
78
        public VCSGisEntityEditable setEntityCode(String code) {
79
            super.setCode(code);
80
            return this;
81
        }
82
        
83
        @Override
84
        public String getEntityName() {
85
            return this.feature.getString(ENTITY_NAME);
86
        }
87
        
88
        @Override
89
        public String getRepositoryRevisionCode() {
90
            return this.feature.getString(COD_REVISION);
91
        }
92
        
93
        @Override
94
        public String getTopologyPlanCode() {
95
            return this.feature.getString(COD_TOPOLOGYPLAN);
96
        }
97

    
98
        @Override
99
        public String getUserCode() {
100
            return this.feature.getString(COD_USER);
101
        }
102
        
103
        @Override
104
        public String getDataTableName() {
105
            return this.feature.getString(DATATABLE_NAME);
106
        }
107

    
108
        @Override
109
        public String getFeatureIdFieldName() {
110
            return this.feature.getString(FEATUREID_FIELD_NAME);
111
        }
112

    
113
        @Override
114
        public String getGeometryFieldName() {
115
            return this.feature.getString(GEOMETRY_FIELD_NAME);
116
        }
117

    
118
        @Override
119
        public String getDescription() {
120
            return this.feature.getString(DESCRIPTION);
121
        }
122

    
123
        @Override
124
        public String getFieldForLabel() {
125
            return this.feature.getString(FIELD_FOR_LABEL);
126
        }
127

    
128
        @Override
129
        public String getCategory() {
130
            return this.feature.getString(CATEGORY);
131
        }
132

    
133
        @Override
134
        public List<String> getCategoriesAsList() {
135
            String s = getCategory();
136
            return VCSGisUtils.getAsList(s);
137
        }
138

    
139
        @Override
140
        public String getAuthorizations() {
141
            return this.feature.getString(AUTHORIZATIONS);
142
        }
143

    
144
        @Override
145
        public int getTopologyPlanMode() {
146
            return this.feature.getIntOrDefault(TOPOLOGYPLAN_MODE, TOPOLOGYPLAN_MODE_RECOMMENDED);
147
        }
148
        
149
        @Override
150
        public String getLabel() {
151
            return this.feature.getString(LABEL);
152
        }
153

    
154
        @Override
155
        public String getFeatureTypeAsJson() {
156
            return this.feature.getString(FEATURETYPE);
157
        }
158

    
159
        @Override
160
        public FeatureType getFeatureType() {
161
            if( this.featureType==null ) {
162
                JsonObject json = Json.createObject(this.getFeatureTypeAsJson());
163
                this.featureType = DALLocator.getDataManager().createFeatureType(json);
164
            }
165
            return this.featureType;
166
        }
167

    
168
        @Override
169
        public VCSGisEntityEditable setEntityName(String entityName) {
170
            this.feature.set(ENTITY_NAME, entityName);
171
            if( StringUtils.isBlank(this.getLabel())) {
172
                this.setLabel(entityName);
173
            }
174
            return this;
175
        }
176
        
177
        @Override
178
        public VCSGisEntityEditable setRepositoryRevisionCode(String code) {
179
            this.feature.set(COD_REVISION, code);
180
            return this;
181
        }
182
        
183
        @Override
184
        public VCSGisEntityEditable setDataTableName(String dataTableName) {
185
            this.feature.set(DATATABLE_NAME, dataTableName);
186
            return this;
187
        }
188

    
189
        @Override
190
        public VCSGisEntityEditable setFeatureIdFieldName(String name) {
191
            this.feature.set(FEATUREID_FIELD_NAME, name);
192
            return this;
193
        }
194

    
195
        @Override
196
        public VCSGisEntityEditable setGeometryFieldName(String name) {
197
            this.feature.set(GEOMETRY_FIELD_NAME, name);
198
            return this;
199
        }
200

    
201
        @Override
202
        public VCSGisEntityEditable setDescription(String description) {
203
            this.feature.set(DESCRIPTION, description);
204
            return this;
205
        }
206
        
207
        @Override
208
        public VCSGisEntityEditable setFieldForLabel(String fieldForLabel) {
209
            this.feature.set(FIELD_FOR_LABEL, fieldForLabel);
210
            return this;
211
        }
212

    
213
        @Override
214
        public VCSGisEntityEditable setFeatureTypeAsJson(String json) {
215
            this.feature.set(FEATURETYPE, json);
216
            this.featureType = null;
217
            return this;
218
        }
219

    
220
        public void setFeatureType(FeatureType featureType) {
221
            this.feature.set(FEATURETYPE, featureType.toJson().toString());
222
            this.featureType = featureType;
223
        }
224

    
225
        @Override
226
        public VCSGisEntityEditable setTopologyPlanCode(String code) {
227
            this.feature.set(COD_TOPOLOGYPLAN, code);
228
            return this;
229
        }
230
        
231
        @Override
232
        public VCSGisEntityEditable setUserCode(String code) {
233
            this.feature.set(COD_USER, code);
234
            return this;
235
        }
236

    
237
        @Override
238
        public VCSGisEntityEditable setCategory(String category) {
239
            this.feature.set(CATEGORY, category);
240
            return this;
241
        }
242

    
243
        @Override
244
        public VCSGisEntityEditable setAuthorizations(String authorizations) {
245
            this.feature.set(AUTHORIZATIONS, authorizations);
246
            return this;
247
        }
248

    
249
        @Override
250
        public VCSGisEntityEditable setTopologyPlanMode(int topologyPlanMode) {
251
            this.feature.set(TOPOLOGYPLAN_MODE, topologyPlanMode);
252
            return this;
253
        }
254

    
255
        @Override
256
        public VCSGisEntityEditable setLabel(String label) {
257
            this.feature.set(LABEL, label);
258
            return this;
259
        }
260

    
261
        @Override
262
        public void copyfrom(VCSGisEntity entity) {
263
            VCSGisUtils.copy(entity, this, null);
264
        }
265

    
266
        @Override
267
        public void copyto(VCSGisEntityEditable entity) {
268
            VCSGisUtils.copy(this, entity, null);
269
        }
270

    
271
        @Override
272
        public JsonObject toJson() {
273
            return VCSGisUtils.toJsonBuilder(this, null).build();
274
        }
275

    
276
        @Override
277
        public JsonObjectBuilder toJsonBuilder() {
278
            return VCSGisUtils.toJsonBuilder(this, null);
279
        }
280

    
281
        @Override
282
        public void fromJson(JsonObject json) {
283
            VCSGisUtils.fromJson(this, json);
284
        }
285

    
286
        @Override
287
        public EntityRepoRow getValue() {
288
            return this;
289
        }
290

    
291
        @Override
292
        public String toString() {
293
            if( StringUtils.isBlank(this.getLabel()) ) {
294
                return this.getEntityName();
295
            }
296
            return this.getLabel();
297
        }
298

    
299
        @Override
300
        public boolean isAuthorized(VCSGisUser user, String operation) {
301
            return VCSGisUtils.isAuthorized(this, operation, user);
302
        }
303

    
304
        @Override
305
        public VCSGisEntityEditable setResources(String resources) {
306
            this.feature.set(RESOURCES, resources);
307
            return this;
308
        }
309

    
310
        @Override
311
        public VCSGisEntityEditable setDataModels(String dataModels) {
312
            this.feature.set(DATA_MODELS, dataModels);
313
            return this;
314
        }
315

    
316
        @Override
317
        public String getResources() {
318
            return this.getString(RESOURCES);
319
        }
320

    
321
        @Override
322
        public String getDataModels() {
323
            return this.getString(DATA_MODELS);
324
        }
325

    
326
        @Override
327
        public List<String> getDataModelsAsList() {
328
            String s = getDataModels();
329
            return VCSGisUtils.getAsList(s, false);
330
        }
331

    
332
    }
333
    
334
    public EntitiesRepoTable() {
335
        super(TABLE_NAME, featureType());
336
    }
337

    
338
    public EntityRepoRow getByEntityCode(VCSGisRepositoryLocaldb repository, String entityCode) {
339
        FeatureStore store = null;
340
        try {
341
            store = repository.getFeatureStore(TABLE_NAME);
342
            Feature f = store.findFirst("\""+COD_ENTITY+"\"='"+entityCode+"'");
343
            if( f==null ) {
344
                return null;
345
            }
346
            EntityRepoRow row = new EntityRepoRow(repository, f);
347
            return row;
348
        } catch (Exception ex) {
349
            throw new RuntimeException("Can't retrieve entity '"+entityCode+"'.", ex);
350
        } finally {
351
            DisposeUtils.disposeQuietly(store);
352
        }
353
    }
354
    
355
    public EntityRepoRow getByEntityName(VCSGisRepositoryLocaldb repository, String entityName) {
356
        FeatureStore store = null;
357
        try {
358
            store = repository.getFeatureStore(TABLE_NAME);
359
            Feature f = store.findFirst("\""+ENTITY_NAME+"\"='"+entityName+"'");
360
            if( f==null ) {
361
                return null;
362
            }
363
            EntityRepoRow row = new EntityRepoRow(repository, f);
364
            return row;
365
        } catch (Exception ex) {
366
            throw new RuntimeException("Can't retrieve entity '"+entityName+"'.", ex);
367
        } finally {
368
            DisposeUtils.disposeQuietly(store);
369
        }
370
    }
371
    
372
    public Map<String, EntityRepoRow> getAllAsMap(VCSGisRepositoryLocaldb repository) {
373
        Map<String, EntityRepoRow> entitiesMap = new HashMap<>();
374

    
375
        DisposableFeatureSetIterable entities = this.getAll(repository);
376
        for (Feature fentity : entities) {
377
            EntityRepoRow entity = new EntityRepoRow(repository, fentity);
378
            entitiesMap.put(entity.getCode(), entity);
379
        }
380
        entities = null;
381
        DisposeUtils.disposeQuietly(entities);        
382
        return entitiesMap;
383
    }
384
    
385
    public DisposableFeatureSetIterable getAll(VCSGisRepositoryLocaldb repository) {
386
        FeatureStore store = null;
387
        try {
388
            store = repository.getFeatureStore(TABLE_NAME);
389
            DisposableFeatureSetIterable changes = store.getFeatureSet().iterable();
390
            return changes;
391
        } catch (Exception ex) {
392
            throw new RuntimeException("Can't retrieve all entities.", ex);
393
        } finally {
394
            if( store!=null ) {
395
                DisposeUtils.dispose(store);
396
            }
397
        }
398
    }
399
    
400
    public static final FeatureType featureType() {
401
        DataManager dataManager = DALLocator.getDataManager();
402
        EditableFeatureType ft = dataManager.createFeatureType();
403
        ft.setLabel("VCSGIS Entities");
404
        ft.getTags().set("ID", TABLE_NAME);
405
        ft.getTags().set(DynFormSPIManager.TAG_DYNFORM_HEIGHT, 475);
406
        ft.getTags().set(DynFormSPIManager.TAG_DYNFORM_WIDTH, 570);
407
        ft.getTags().set(DynFormSPIManager.TAG_DYNFORM_LAYOUTMODE, DynFormSPIManager.TAG_DYNFORM_LAYOUTMODE_VALUE_TABS);
408
        ft.add(COD_ENTITY, DataTypes.STRING)
409
                .setSize(VCSGISCODELEN)
410
                .setIsPrimaryKey(true)
411
                .setLabel("Code")
412
                .setOrder(10);
413
        ft.add(COD_REVISION, DataTypes.STRING)
414
                .setForeingkey(
415
                        true, 
416
                        false, 
417
                        RevisionsRepoTable.TABLE_NAME, 
418
                        RevisionsRepoTable.COD_REVISION, 
419
                        "FORMAT('r%d %s', REV_NUMBER, REV_OPERATIONDATE)"
420
                )
421
                .setIsIndexed(true)
422
                .setAllowIndexDuplicateds(true)
423
                .setSize(VCSGISCODELEN)
424
                .setLabel("Head revision of this entity")
425
                .setOrder(40);
426
        ft.add(COD_USER, DataTypes.STRING)
427
                .setForeingkey(
428
                        true, 
429
                        false, 
430
                        UsersRepoTable.TABLE_NAME, 
431
                        UsersRepoTable.COD_USER, 
432
                        UsersRepoTable.USER_ID
433
                )
434
                .setIsIndexed(true)
435
                .setAllowIndexDuplicateds(true)
436
                .setSize(VCSGISCODELEN)
437
                .setLabel("Cod. user")
438
                .setOrder(30);
439
        ft.add(COD_TOPOLOGYPLAN, DataTypes.STRING)
440
                .setForeingkey(
441
                        true, 
442
                        false, 
443
                        TopologyplanRepoTable.TABLE_NAME, 
444
                        TopologyplanRepoTable.COD_TOPOLOGYPLAN, 
445
                        TopologyplanRepoTable.TOPPLAN_NAME
446
                )
447
                .setSize(VCSGISCODELEN)
448
                .setIsIndexed(true)
449
                .setAllowIndexDuplicateds(true)
450
                .setLabel("Topology plan")
451
                .setOrder(90);                  
452
        ft.add(ENTITY_NAME, DataTypes.STRING)
453
                .setIsIndexed(true)
454
                .setAllowIndexDuplicateds(false)
455
                .setSize(200)
456
                .setLabel("Name")
457
                .setOrder(20);
458
        ft.add(DATATABLE_NAME, DataTypes.STRING)
459
                .setSize(200)
460
                .setLabel("Name of the table in which the data is stored")
461
                .setOrder(50);
462
        ft.add(FEATUREID_FIELD_NAME, DataTypes.STRING)
463
                .setSize(200)
464
                .setLabel("Name of the primary key attribute.")
465
                .setOrder(60);
466
        ft.add(GEOMETRY_FIELD_NAME, DataTypes.STRING)
467
                .setSize(200)
468
                .setLabel("Name of the geometry attribute.")
469
                .setOrder(70);
470
        ft.add(FIELD_FOR_LABEL, DataTypes.STRING)
471
                .setSize(200)
472
                .setLabel("Field for label")
473
                .setOrder(10);
474
        ft.add(CATEGORY, DataTypes.STRING)
475
                .setSize(200)
476
                .setLabel("Category")
477
                .setOrder(80);
478
        ft.add(LABEL, DataTypes.STRING)
479
                .setSize(200)
480
                .setLabel("Label")
481
                .setOrder(25);
482
        ft.add(AUTHORIZATIONS, DataTypes.STRING)               
483
                .setTag(DynFormSPIManager.TAG_DYNFORM_RESIZEWEIGHT, 60) 
484
                .setTag(DynFormSPIManager.TAG_DYNFORM_LABEL_EMPTY, true) 
485
                .setDataProfileName("Text")
486
                .setSize(10240)
487
                .setLabel("Authorizations")
488
                .setGroup("Authorizations")
489
                .setOrder(10)
490
                .setDefaultFieldValue("{\n" +
491
"  \"checkout\": [ \"*\" ],\n" +
492
"  \"commit\": [ \"*\" ],\n" +
493
"  \"view\": [ \"*\" ],\n" +
494
"  \"history\": [ \"*\" ],\n" +
495
"  \"update\": [ \"*\" ]\n" +
496
"}")
497
                .setDescription("Json with the information of what operations the different users can do.\nExample:\n{\n" +
498
"  \"checkout\": [ \"user1\", \"user2\"],\n" +
499
"  \"commit\": [ \"user1\" ],\n" +
500
"  \"view\": [ \"user1\", \"user2\"],\n" +
501
"  \"history\": [ \"user1\" ],\n" +
502
"  \"update\": [ \"user1\", \"user2\"],\n" +
503
"  \""+RowCreateRequestHelper.REQUEST_NAME+"\": [ \"batchuser1\"],\n" +
504
"  \""+RowUpdateRequestHelper.REQUEST_NAME+"\": [ \"batchuser1\"],\n" +
505
"  \""+RowDeleteRequestHelper.REQUEST_NAME+"\": [ \"batchuser1\"],\n" +
506
"}\n\n" +
507
"use $ before the name to indicate a role name instead of a username."
508
                );
509
        ft.add(DESCRIPTION, DataTypes.STRING)
510
                .setTag(DynFormSPIManager.TAG_DYNFORM_RESIZEWEIGHT, 60)
511
                .setDataProfileName("Text")
512
                .setSize(10240)
513
                .setLabel("Description")
514
                .setOrder(110);
515
        ft.add(FEATURETYPE, DataTypes.STRING)
516
                .setTag(DynFormSPIManager.TAG_DYNFORM_RESIZEWEIGHT, 60)
517
                .setTag(DynFormSPIManager.TAG_DYNFORM_LABEL_EMPTY, true)
518
                .setDataProfileName("Text")
519
                .setSize(10240)
520
                .setLabel("Feature type")
521
                .setGroup("Feature type")
522
                .setOrder(10);
523
        ft.add(TOPOLOGYPLAN_MODE, DataTypes.INTEGER)
524
                .setLabel("Topology plan mode")                
525
                .setAvailableValues(new DynObjectValueItem[] {
526
                    new DynObjectValueItem(TOPOLOGYPLAN_MODE_RECOMMENDED, "Recommended"),
527
                    new DynObjectValueItem(TOPOLOGYPLAN_MODE_MANDATORY, "Mandatory")
528
                })
529
                .setOrder(100);
530
        ft.add(RESOURCES, DataTypes.STRING)
531
                .setSize(200)
532
                .setLabel("Resources");
533
        ft.add(DATA_MODELS, DataTypes.STRING)
534
                .setSize(200)
535
                .setLabel("Data models");
536

    
537
        return ft.getNotEditableCopy();
538
    }
539
    
540
}