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 / VCSGisUtils.java @ 3375

History | View | Annotate | Download (22.8 KB)

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

    
23
package org.gvsig.vcsgis.lib;
24

    
25
import java.io.IOException;
26
import java.io.InputStream;
27
import java.security.MessageDigest;
28
import java.util.HashMap;
29
import java.util.Iterator;
30
import java.util.List;
31
import java.util.Map;
32
import java.util.function.Predicate;
33
import javax.json.JsonArray;
34
import javax.json.JsonObject;
35
import javax.json.JsonValue;
36
import org.apache.commons.io.IOUtils;
37
import org.apache.commons.lang3.StringUtils;
38
import org.gvsig.fmap.dal.feature.Feature;
39
import org.gvsig.json.Json;
40
import org.gvsig.json.JsonObjectBuilder;
41
import org.gvsig.tools.ToolsLocator;
42
import org.gvsig.tools.util.MapBuilder;
43
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_AUTHENTICATION_EXPIRED;
44
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_CANT_ADD_ENTITY_WITHOUT_PRIMARY_KEY;
45
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_CANT_ADD_LAYER;
46
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_CANT_AUTHENTICATE_USER;
47
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_CANT_BUILD_REQUEST_RESPONSE;
48
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_CANT_CHECKOUT;
49
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_CANT_COMMIT;
50
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_CANT_COMMIT_WITH_FEATURE_CODE_BLANK;
51
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_CANT_COMMIT_WORKSPACE_OUTDATED;
52
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_CANT_CREATE_TABLE;
53
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_CANT_CREATE_TABLE_CHANGES;
54
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_CANT_CREATE_TABLE_CONFIG;
55
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_CANT_CREATE_TABLE_ENTITIES;
56
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_CANT_EXECUTE_REQUEST;
57
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_CANT_HANDLE_REQUEST;
58
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_CANT_INITIALIZE_REPOSITORY;
59
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_CANT_INSERT_CHANGE;
60
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_CANT_INSERT_ENTITIES;
61
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_CANT_INSERT_FEATURES;
62
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_CANT_OPEN_CHANGES;
63
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_CANT_OPEN_ENTITIES;
64
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_CANT_OPEN_STORE;
65
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_CANT_OPEN_WORKSPACE;
66
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_CANT_OPEN_WORKSPACE_SERVEREXPLORER;
67
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_CANT_PREPARE_UPDATE;
68
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_CANT_REMOVE_CHANGES;
69
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_CANT_REMOVE_ENTITY;
70
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_CANT_RETRIEVE_ENTITIES;
71
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_CANT_RETRIEVE_SOURCE_FEATURES;
72
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_CANT_RETRIEVE_TOPOLOGYPLANS;
73
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_CANT_RETRIEVE_USERS;
74
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_CANT_REVERT;
75
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_CANT_UPDATE;
76
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_CANT_UPDATE_CLEAN;
77
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_CANT_UPDATE_ENTITIES;
78
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_DBFILE_IS_NULL;
79
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_ENTITY_ALREADY_EXISTS;
80
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_ENTITY_NOT_HAS_VCSGISCODE;
81
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_INVALID_AUTHENTICATION_TOKEN;
82
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_INVALID_DATA;
83
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_INVALID_REPOSITORY;
84
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_INVALID_REVISION;
85
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_INVALID_REVISION_FOR_ENTITY;
86
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_INVALID_USERCODE;
87
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_LABEL_IS_NULL;
88
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_NO_ERROR;
89
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_STORE_NOT_IN_VERSION_CONTROL;
90
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_USER_NOT_AUTHORIZED;
91
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_WSEXPLORER_IS_NULL;
92
import static org.gvsig.vcsgis.lib.VCSGisManager.OP_ADD_ENTITY;
93
import static org.gvsig.vcsgis.lib.VCSGisManager.OP_DELETE;
94
import static org.gvsig.vcsgis.lib.VCSGisManager.OP_INSERT;
95
import static org.gvsig.vcsgis.lib.VCSGisManager.OP_UPDATE;
96
import static org.gvsig.vcsgis.lib.VCSGisManager.STATE_CONFLICT;
97
import static org.gvsig.vcsgis.lib.VCSGisManager.STATE_LOCAL_MODIFIED;
98
import static org.gvsig.vcsgis.lib.VCSGisManager.STATE_LOCAL_NEW;
99
import static org.gvsig.vcsgis.lib.VCSGisManager.STATE_LOCAL_OUTDATED;
100
import static org.gvsig.vcsgis.lib.VCSGisManager.STATE_LOCAL_OUTDATED_AND_MODIFIED;
101
import static org.gvsig.vcsgis.lib.VCSGisManager.STATE_LOCAL_UNMODIFIED;
102
import static org.gvsig.vcsgis.lib.VCSGisManager.TOPOLOGYPLAN_MODE_RECOMMENDED;
103
import org.gvsig.vcsgis.lib.workspace.VCSGisWorkspaceEntity;
104

    
105
/**
106
 *
107
 * @author gvSIG Team
108
 */
109
public class VCSGisUtils {
110
    
111
    public static final String ENTITY_CODE = "EntityCode";
112
    public static final String ENTITY_NAME = "EntityName";
113
    public static final String ENTITY_DATATABLENAME = "DataTableName";
114
    public static final String ENTITY_DESCRIPTION = "Description";
115
    public static final String ENTITY_FEATUREIDFIELDNAME = "FeatureIdFieldName";
116
    public static final String ENTITY_FEATURETYPEASJSON = "FeatureTypeAsJson";
117
    public static final String ENTITY_FIELDFORLABEL = "FieldForLabel";
118
    public static final String ENTITY_GEOMETRYFIELDNAME = "GeometryFieldName";
119
    public static final String ENTITY_REVISIONCODE = "RevisionCode";
120
    public static final String ENTITY_TOPOLOGYPLANCODE = "TopologyPlanCode";
121
    public static final String ENTITY_USERCODE = "UserCode";
122
    public static final String ENTITY_CATEGORY = "Category";
123
    public static final String ENTITY_LABEL = "Label";
124
    public static final String ENTITY_AUTHORIZATIONS = "Autorizations";
125
    public static final String ENTITY_TOPOLOGYPLANMODE = "TopologyPlanMode";
126
    public static final String ENTITY_LOCALREVISIONCODE = "LocalRevisionCode";
127
    
128
//    private static final String[] JSONENTITY_ATTRNAMES = new String[] {
129
//        ENTITY_DATATABLENAME, 
130
//        ENTITY_DESCRIPTION, ENTITY_CODE, 
131
//        ENTITY_NAME, 
132
//        ENTITY_FEATUREIDFIELDNAME, 
133
//        ENTITY_FEATURETYPEASJSON, 
134
//        ENTITY_FIELDFORLABEL, 
135
//        ENTITY_GEOMETRYFIELDNAME, 
136
//        ENTITY_REVISIONCODE, 
137
//        ENTITY_TOPOLOGYPLANCODE, 
138
//        ENTITY_USERCODE,
139
//        ENTITY_CATEGORY,
140
//        ENTITY_LABEL
141
//    };
142
    
143
    private static final Map<Integer,String> ERRMSGS = new MapBuilder<>()
144
            .add(ERR_NO_ERROR, "_No_errors")
145
            .add(ERR_DBFILE_IS_NULL, "_dbfile_is_null")
146
            .add(ERR_WSEXPLORER_IS_NULL, "_workspace_explorer_is_null")
147
            .add(ERR_LABEL_IS_NULL, "_label_is_null")
148
            .add(ERR_CANT_OPEN_WORKSPACE, "_Cant_open_workspace")
149
            .add(ERR_CANT_OPEN_WORKSPACE_SERVEREXPLORER, "_Cant_open_workspace")
150
            .add(ERR_STORE_NOT_IN_VERSION_CONTROL, "_Store_not_in_control_version")
151
            .add(ERR_CANT_CREATE_TABLE, "_Cant_create_table")
152
            .add(ERR_CANT_CREATE_TABLE_CONFIG, "_Cant_create_config_table")
153
            .add(ERR_CANT_CREATE_TABLE_ENTITIES, "_Cant_create_table_entities")
154
            .add(ERR_CANT_CREATE_TABLE_CHANGES, "_Cant_create_table_changes")
155
            .add(ERR_ENTITY_ALREADY_EXISTS, "_Entity_already_exists")
156
            .add(ERR_ENTITY_NOT_HAS_VCSGISCODE, "_Entity_has_not_VCSGISCODE")
157
            .add(ERR_CANT_OPEN_ENTITIES, "_Cant_open_entities")
158
            .add(ERR_CANT_INSERT_ENTITIES, "_Cant_insert_entities")
159
            .add(ERR_CANT_OPEN_CHANGES, "_Cant_open_changes")
160
            .add(ERR_CANT_INSERT_CHANGE, "_Cant_insert_change")
161
            .add(ERR_CANT_OPEN_STORE, "_Cant_open_store")
162
            .add(ERR_CANT_RETRIEVE_SOURCE_FEATURES, "_Cant_retrieve_source_features")
163
            .add(ERR_CANT_INSERT_FEATURES, "_Cant_insert_features")
164
            .add(ERR_CANT_COMMIT, "_Cant_commit")
165
            .add(ERR_CANT_COMMIT_WORKSPACE_OUTDATED, "_Cant_commit_workspace_is_out_of_date")
166
            .add(ERR_CANT_CHECKOUT, "_Cant_checkout")
167
            .add(ERR_CANT_UPDATE_ENTITIES, "_Cant_update_entities")
168
            .add(ERR_CANT_PREPARE_UPDATE, "_Cant_prepare_update")
169
            .add(ERR_CANT_UPDATE, "_Cant_update")
170
            .add(ERR_CANT_EXECUTE_REQUEST, "_Cant_execute_request")
171
            .add(ERR_CANT_BUILD_REQUEST_RESPONSE,"_Cant_build_request_response")
172
            .add(ERR_CANT_HANDLE_REQUEST,"_Cant_handle_request")
173
            .add(ERR_CANT_UPDATE_CLEAN,"_Cant_update_clean")
174
            .add(ERR_CANT_COMMIT_WITH_FEATURE_CODE_BLANK,"_Cant_commit_with_feature_code_blank")
175
            .add(ERR_CANT_ADD_ENTITY_WITHOUT_PRIMARY_KEY,"Cant_add_entity_without_primary_key")
176
            .add(ERR_CANT_INITIALIZE_REPOSITORY, "_Cant_initialize_repository")
177
            .add(ERR_INVALID_DATA, "_Data_can_be_empty")
178
            .add(ERR_INVALID_REPOSITORY, "_Invalid_repository")
179
            .add(ERR_INVALID_REVISION, "_Invalid_revision")
180
            .add(ERR_INVALID_REVISION_FOR_ENTITY, "_Invalid_revision_for_entity")
181
            .add(ERR_CANT_RETRIEVE_ENTITIES, "_Cant_retrieve_entities")
182
            .add(ERR_CANT_RETRIEVE_USERS, "_Cant_retrieve_users")
183
            .add(ERR_CANT_RETRIEVE_TOPOLOGYPLANS, "_Cant_retrieve_topologyplans")
184
            .add(ERR_CANT_ADD_LAYER, "_Cant_add_layer_to_view")
185
            .add(ERR_CANT_REMOVE_ENTITY, "_Cant_remove_entity")
186
            .add(ERR_CANT_REMOVE_CHANGES, "_Cant_remove_change")
187
            
188
            .add(ERR_CANT_AUTHENTICATE_USER, "_Cant_authenticate_user")
189
            .add(ERR_INVALID_AUTHENTICATION_TOKEN, "_Invalid_authentication_token")
190
            .add(ERR_USER_NOT_AUTHORIZED, "_User_not_authorized")
191
            .add(ERR_AUTHENTICATION_EXPIRED,"_Authentication_expired")
192
            .add(ERR_INVALID_USERCODE, "_Invalid_user_code")
193
            .add(ERR_CANT_REVERT, "_Cant_revert")
194
            .build();
195
    
196
    private static final Map<Integer,String> OPERATION_LABELS = new MapBuilder<Integer,String>()
197
            .add(OP_DELETE, "Delete")
198
            .add(OP_UPDATE, "Update")
199
            .add(OP_INSERT, "Insert")
200
            .add(OP_ADD_ENTITY, "Add entity")
201
            .build();
202
    
203
    private static final Map<Integer,String> STATE_LABELS = new MapBuilder<Integer,String>()
204
        .add(STATE_LOCAL_UNMODIFIED, "Unmodified")
205
        .add(STATE_LOCAL_NEW, "New")
206
        .add(STATE_LOCAL_MODIFIED, "Modified")
207
        .add(STATE_LOCAL_OUTDATED, "Outdated")
208
        .add(STATE_LOCAL_OUTDATED_AND_MODIFIED, "Outdated and modified")
209
        .add(STATE_CONFLICT, "Conflict")
210
        .build();
211
    
212
    private static final Map<String, Map<String, String>> SQL_TEMPLATES_BY_PROVIDER = new HashMap<>();
213
    
214
    public static String getErrorMessage(int errcode) {
215
        String msg = ERRMSGS.get(errcode);
216
        msg = ToolsLocator.getI18nManager().getTranslation(msg);
217
        return msg;
218
    }
219
    
220
    public static void copy(VCSGisEntity source, VCSGisEntityEditable target, Predicate<String> excludes) {
221
        target.setDataTableName(source.getDataTableName());
222
        target.setDescription(source.getDescription());
223
        target.setEntityCode(source.getEntityCode());
224
        target.setEntityName(source.getEntityName());
225
        target.setFeatureIdFieldName(source.getFeatureIdFieldName());
226
        target.setFeatureTypeAsJson(source.getFeatureTypeAsJson());
227
        target.setFieldForLabel(source.getFieldForLabel());
228
        target.setGeometryFieldName(source.getGeometryFieldName());
229
        target.setRepositoryRevisionCode(source.getRepositoryRevisionCode());
230
        target.setTopologyPlanCode(source.getTopologyPlanCode());
231
        target.setUserCode(source.getUserCode());
232
        target.setCategory(source.getCategory());
233
        target.setLabel(source.getLabel());
234
        target.setAuthorizations(source.getAuthorizations());
235
        target.setTopologyPlanMode(source.getTopologyPlanMode());
236
        if(source instanceof VCSGisWorkspaceEntity && target instanceof VCSGisWorkspaceEntity){
237
            ((VCSGisWorkspaceEntity)target).setLocalRevisionCode(((VCSGisWorkspaceEntity)source).getLocalRevisionCode());
238
        }
239
    }
240
    public static JsonObjectBuilder toJsonBuilder(VCSGisEntity entity, Predicate<String> excludes) {
241
        JsonObjectBuilder jsonEntity = Json.createObjectBuilder();
242
        if( excludes==null || !excludes.test(ENTITY_DATATABLENAME) ) {
243
            jsonEntity.add(ENTITY_DATATABLENAME, entity.getDataTableName());
244
        }
245
        if( excludes==null || !excludes.test(ENTITY_DESCRIPTION) ) {
246
            jsonEntity.add(ENTITY_DESCRIPTION, entity.getDescription());
247
        }
248
        if( excludes==null || !excludes.test(ENTITY_CODE) ) {
249
            jsonEntity.add(ENTITY_CODE, entity.getEntityCode());
250
        }
251
        if( excludes==null || !excludes.test(ENTITY_NAME) ) {
252
            jsonEntity.add(ENTITY_NAME, entity.getEntityName());
253
        }
254
        if( excludes==null || !excludes.test(ENTITY_FEATUREIDFIELDNAME) ) {
255
            jsonEntity.add(ENTITY_FEATUREIDFIELDNAME, entity.getFeatureIdFieldName());
256
        }
257
        if( excludes==null || !excludes.test(ENTITY_FEATURETYPEASJSON) ) {
258
            jsonEntity.add(ENTITY_FEATURETYPEASJSON, entity.getFeatureTypeAsJson());
259
        }
260
        if( excludes==null || !excludes.test(ENTITY_FIELDFORLABEL) ) {
261
            jsonEntity.add(ENTITY_FIELDFORLABEL, entity.getFieldForLabel());
262
        }
263
        if( excludes==null || !excludes.test(ENTITY_GEOMETRYFIELDNAME) ) {
264
            jsonEntity.add(ENTITY_GEOMETRYFIELDNAME, entity.getGeometryFieldName());
265
        }
266
        if( excludes==null || !excludes.test(ENTITY_REVISIONCODE) ) {
267
            jsonEntity.add(ENTITY_REVISIONCODE, entity.getRepositoryRevisionCode());
268
        }
269
        if( excludes==null || !excludes.test(ENTITY_TOPOLOGYPLANCODE) ) {
270
            jsonEntity.add(ENTITY_TOPOLOGYPLANCODE, entity.getTopologyPlanCode());
271
        }
272
        if( excludes==null || !excludes.test(ENTITY_USERCODE) ) {
273
            jsonEntity.add(ENTITY_USERCODE, entity.getUserCode());
274
        }
275
        if( excludes==null || !excludes.test(ENTITY_CATEGORY) ) {
276
            jsonEntity.add(ENTITY_CATEGORY, entity.getCategory());
277
        }
278
        if( excludes==null || !excludes.test(ENTITY_LABEL) ) {
279
            jsonEntity.add(ENTITY_LABEL, entity.getLabel());
280
        }
281
        if( excludes==null || !excludes.test(ENTITY_AUTHORIZATIONS) ) {
282
            jsonEntity.add(ENTITY_AUTHORIZATIONS, entity.getAuthorizations());
283
        }
284
        if( excludes==null || !excludes.test(ENTITY_TOPOLOGYPLANMODE) ) {
285
            jsonEntity.add(ENTITY_TOPOLOGYPLANMODE, entity.getTopologyPlanMode());
286
        }
287
        
288
        if( entity instanceof VCSGisWorkspaceEntity ) {
289
            if( excludes==null || !excludes.test(ENTITY_LOCALREVISIONCODE) ) {
290
                jsonEntity.add(ENTITY_LOCALREVISIONCODE, ((VCSGisWorkspaceEntity) entity).getLocalRevisionCode());
291
            }
292
        }
293

    
294
        
295
        return jsonEntity;
296
    }
297

    
298
    public static void fromJson(VCSGisEntityEditable entity, JsonObject jsonEntity) {
299
        if( jsonEntity.containsKey(ENTITY_DATATABLENAME) ) {
300
            entity.setDataTableName(jsonEntity.getString(ENTITY_DATATABLENAME));
301
        }
302
        if( jsonEntity.containsKey(ENTITY_DESCRIPTION) ) {
303
            entity.setDescription(jsonEntity.getString(ENTITY_DESCRIPTION, null));
304
        }
305
        if( jsonEntity.containsKey(ENTITY_CODE) ) {
306
            entity.setEntityCode(jsonEntity.getString(ENTITY_CODE, null));
307
        }
308
        if( jsonEntity.containsKey(ENTITY_NAME) ) {
309
            entity.setEntityName(jsonEntity.getString(ENTITY_NAME, null));
310
        }
311
        if( jsonEntity.containsKey(ENTITY_FEATUREIDFIELDNAME) ) {
312
            entity.setFeatureIdFieldName(jsonEntity.getString(ENTITY_FEATUREIDFIELDNAME, null));
313
        }
314
        if( jsonEntity.containsKey(ENTITY_FEATURETYPEASJSON) ) {
315
            entity.setFeatureTypeAsJson(jsonEntity.getString(ENTITY_FEATURETYPEASJSON, null));
316
        }
317
        if( jsonEntity.containsKey(ENTITY_FIELDFORLABEL) ) {
318
            entity.setFieldForLabel(jsonEntity.getString(ENTITY_FIELDFORLABEL, null));
319
        }
320
        if( jsonEntity.containsKey(ENTITY_GEOMETRYFIELDNAME) ) {
321
            entity.setGeometryFieldName(jsonEntity.getString(ENTITY_GEOMETRYFIELDNAME, null));
322
        }
323
        if( jsonEntity.containsKey(ENTITY_REVISIONCODE) ) {
324
            entity.setRepositoryRevisionCode(jsonEntity.getString(ENTITY_REVISIONCODE, null));
325
        }
326
        if( jsonEntity.containsKey(ENTITY_TOPOLOGYPLANCODE) ) {
327
            entity.setTopologyPlanCode(jsonEntity.getString(ENTITY_TOPOLOGYPLANCODE, null));
328
        }
329
        if( jsonEntity.containsKey(ENTITY_USERCODE) ) {
330
            entity.setUserCode(jsonEntity.getString(ENTITY_USERCODE, null));                
331
        }
332
        if( jsonEntity.containsKey(ENTITY_CATEGORY) ) {
333
            entity.setCategory(jsonEntity.getString(ENTITY_CATEGORY, null));                
334
        }
335
        if( jsonEntity.containsKey(ENTITY_LABEL) ) {
336
            entity.setLabel(jsonEntity.getString(ENTITY_LABEL, null));                
337
        }
338
        if( jsonEntity.containsKey(ENTITY_AUTHORIZATIONS) ) {
339
            entity.setAuthorizations(jsonEntity.getString(ENTITY_AUTHORIZATIONS, null));                
340
        }
341
        if( jsonEntity.containsKey(ENTITY_TOPOLOGYPLANMODE) ) {
342
            entity.setTopologyPlanMode(jsonEntity.getInt(ENTITY_TOPOLOGYPLANMODE, TOPOLOGYPLAN_MODE_RECOMMENDED));                
343
        }
344
        if( entity instanceof VCSGisWorkspaceEntity ) {
345
            if( jsonEntity.containsKey(ENTITY_LOCALREVISIONCODE) ) {
346
                ((VCSGisWorkspaceEntity) entity).setLocalRevisionCode(jsonEntity.getString(ENTITY_LOCALREVISIONCODE, null));                
347
            }
348
        }
349
    }
350
    
351
    public static boolean isAuthorized(VCSGisEntity entity, String operation, String userid) {
352
        String s = entity.getAuthorizations();
353
        if( StringUtils.isBlank(s) ) {
354
            return true;
355
        }
356
        JsonObject authorizations = Json.createObject(s);
357
        if( authorizations==null ) {
358
            return false;
359
        }
360
        if( StringUtils.isBlank(userid) || StringUtils.isBlank(operation)) {
361
            return false;
362
        }
363
        JsonArray op = authorizations.getJsonArray(operation.toLowerCase());
364
        if( op == null ) {
365
           return false; 
366
        }
367
        userid = userid.toLowerCase();
368
        Iterator<JsonValue> it = op.iterator();
369
        while (it.hasNext()) {
370
            JsonValue value = it.next();
371
            if(StringUtils.containsIgnoreCase(value.toString(),userid)){
372
                return true;
373
            }
374
        }
375
//        if( op.contains(userid) ) {
376
//        if( op.getValuesAs(String.class).toString().contains(userid) ) {
377
//            return true;
378
//        }
379
        return false;
380
    }
381

    
382
    public static String getOperationLabel(int operation) {
383
        return OPERATION_LABELS.getOrDefault(operation, "unknown");
384
    }
385
    public static String getStateLabel(int state) {
386
        return STATE_LABELS.getOrDefault(state, "unknown");
387
    }
388
    
389
    @SuppressWarnings("null")
390
    private static Map<String,String> getSqlTemplates(String name) {
391
      final int SEARCHING_ITEM = 0;
392
      final int READING_ITEM = 1;
393
      
394
      InputStream sqls = VCSGisUtils.class.getResourceAsStream("/org/gvsig/vcsgis/lib/"+name+".sql"); // org.gvsig.vcsgis.lib
395
      Map<String,String> expecteds = new HashMap<>();
396
      List<String> lines;
397
        try {
398
            lines = IOUtils.readLines(sqls);
399
        } catch (IOException ex) {
400
            throw new RuntimeException("Can't read sql templates for provider "+name, ex);
401
        }
402

    
403
      StringBuilder sb = null;
404
      String currentItem = null;
405
      int lineno = 1;
406
      int state = SEARCHING_ITEM;
407
      for (String line : lines) {
408
          line = line + "\n";
409
          switch(state) {
410
            case SEARCHING_ITEM:
411
                if( line.toLowerCase().startsWith("@begin ") ) {
412
                    currentItem = line.substring(7).trim();
413
                    sb = new StringBuilder();
414
                    state = READING_ITEM;
415
                } else if( line.toLowerCase().startsWith("-- ") ) {
416
                    // do nothing skip comment
417
                } else if( !StringUtils.isBlank(line) ) {
418
                    throw new IllegalStateException("Syntax error at '"+name+"', line "+lineno+ ".");
419
                }
420
                break;
421
            case READING_ITEM:
422
                if( line.toLowerCase().startsWith("@end ") ) {
423
                    if( !StringUtils.equals(currentItem,line.substring(5).trim()) ) {
424
                      throw new IllegalStateException("Syntax error at '"+name+"', line "+lineno+ ", expected @end "+currentItem+", and found "+line+".");
425
                    }
426
                    String s = sb.toString();
427
                    if( s.endsWith("\n") ) {
428
                        s = s.substring(0, s.length()-1);
429
                    }
430
                    expecteds.put(currentItem, s);
431
                    state = SEARCHING_ITEM;
432
                    
433
                } else if( line.toLowerCase().startsWith("-- ") ) {
434
                    // do nothing skip comment
435
                } else {
436
                    sb.append(line);
437
                }
438
                break;
439
        }
440
        lineno++;
441
      }
442
      if( state!=SEARCHING_ITEM ) {
443
          throw new IllegalStateException("Syntax error at '"+name+"', expected @end "+currentItem+" and found EOF .");
444
      }
445
      return expecteds;
446
    }
447
    
448
    public static String getSqlTemplate(String providerName, String sqlId){
449
        if(SQL_TEMPLATES_BY_PROVIDER.get(providerName) == null) {
450
            SQL_TEMPLATES_BY_PROVIDER.put(providerName, getSqlTemplates(providerName));
451
        }
452
        return SQL_TEMPLATES_BY_PROVIDER.get(providerName).get(sqlId);
453
    }
454
    
455
    public static void updateMessageDigest(MessageDigest md, Feature f, String fieldName) {
456
        String s = f.getString(fieldName);
457
        if( s!=null ) {
458
            md.update(s.getBytes());
459
        }
460
    }
461
    
462
}