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 @ 3748

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

    
110
/**
111
 *
112
 * @author gvSIG Team
113
 */
114
public class VCSGisUtils {
115
    
116
    private static final Logger LOGGER = LoggerFactory.getLogger(VCSGisUtils.class);
117

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

    
316
        
317
        return jsonEntity;
318
    }
319

    
320
    public static void fromJson(VCSGisEntityEditable entity, JsonObject jsonEntity) {
321
        if( jsonEntity.containsKey(ENTITY_DATATABLENAME) ) {
322
            entity.setDataTableName(jsonEntity.getString(ENTITY_DATATABLENAME));
323
        }
324
        if( jsonEntity.containsKey(ENTITY_DESCRIPTION) ) {
325
            entity.setDescription(jsonEntity.getString(ENTITY_DESCRIPTION, null));
326
        }
327
        if( jsonEntity.containsKey(ENTITY_CODE) ) {
328
            entity.setEntityCode(jsonEntity.getString(ENTITY_CODE, null));
329
        }
330
        if( jsonEntity.containsKey(ENTITY_NAME) ) {
331
            entity.setEntityName(jsonEntity.getString(ENTITY_NAME, null));
332
        }
333
        if( jsonEntity.containsKey(ENTITY_FEATUREIDFIELDNAME) ) {
334
            entity.setFeatureIdFieldName(jsonEntity.getString(ENTITY_FEATUREIDFIELDNAME, null));
335
        }
336
        if( jsonEntity.containsKey(ENTITY_FEATURETYPEASJSON) ) {
337
            entity.setFeatureTypeAsJson(jsonEntity.getString(ENTITY_FEATURETYPEASJSON, null));
338
        }
339
        if( jsonEntity.containsKey(ENTITY_FIELDFORLABEL) ) {
340
            entity.setFieldForLabel(jsonEntity.getString(ENTITY_FIELDFORLABEL, null));
341
        }
342
        if( jsonEntity.containsKey(ENTITY_GEOMETRYFIELDNAME) ) {
343
            entity.setGeometryFieldName(jsonEntity.getString(ENTITY_GEOMETRYFIELDNAME, null));
344
        }
345
        if( jsonEntity.containsKey(ENTITY_REVISIONCODE) ) {
346
            entity.setRepositoryRevisionCode(jsonEntity.getString(ENTITY_REVISIONCODE, null));
347
        }
348
        if( jsonEntity.containsKey(ENTITY_TOPOLOGYPLANCODE) ) {
349
            entity.setTopologyPlanCode(jsonEntity.getString(ENTITY_TOPOLOGYPLANCODE, null));
350
        }
351
        if( jsonEntity.containsKey(ENTITY_USERCODE) ) {
352
            entity.setUserCode(jsonEntity.getString(ENTITY_USERCODE, null));                
353
        }
354
        if( jsonEntity.containsKey(ENTITY_CATEGORY) ) {
355
            entity.setCategory(jsonEntity.getString(ENTITY_CATEGORY, null));                
356
        }
357
        if( jsonEntity.containsKey(ENTITY_LABEL) ) {
358
            entity.setLabel(jsonEntity.getString(ENTITY_LABEL, null));                
359
        }
360
        if( jsonEntity.containsKey(ENTITY_AUTHORIZATIONS) ) {
361
            if(entity instanceof VCSGisWorkspaceEntity){
362
                entity.setAuthorizations(null);
363
            } else {
364
                entity.setAuthorizations(jsonEntity.getString(ENTITY_AUTHORIZATIONS, null));
365
            }
366
        }
367
        if( jsonEntity.containsKey(ENTITY_TOPOLOGYPLANMODE) ) {
368
            entity.setTopologyPlanMode(jsonEntity.getInt(ENTITY_TOPOLOGYPLANMODE, TOPOLOGYPLAN_MODE_RECOMMENDED));                
369
        }
370
        if( jsonEntity.containsKey(ENTITY_RESOURCES) ) {
371
            entity.setResources(jsonEntity.getString(ENTITY_RESOURCES, null));                
372
        }
373
        if( jsonEntity.containsKey(ENTITY_DATA_MODELS) ) {
374
            entity.setDataModels(jsonEntity.getString(ENTITY_DATA_MODELS, null));                
375
        }
376
        if( entity instanceof VCSGisWorkspaceEntity ) {
377
            if( jsonEntity.containsKey(ENTITY_LOCALREVISIONCODE) ) {
378
                ((VCSGisWorkspaceEntity) entity).setLocalRevisionCode(jsonEntity.getString(ENTITY_LOCALREVISIONCODE, null));                
379
            }
380
        }
381
    }
382
    
383
    public static boolean isAuthorized(VCSGisEntity entity, String operation, VCSGisUser user) {
384
        String s = entity.getAuthorizations();
385
        if( StringUtils.isBlank(s) ) {
386
            LOGGER.info("Repository authorization for '" + entity.getEntityName() + "' entity isn't actived.");
387
            return true;
388
        }
389
        String userid = user.getIdentifier().toLowerCase();
390
        try {
391
            JsonObject authorizations = Json.createObject(s);
392
            if (authorizations == null) {
393
                return false;
394
            }
395
            if (StringUtils.isBlank(userid) || StringUtils.isBlank(operation)) {
396
                return false;
397
            }
398
            JsonArray op = authorizations.getJsonArray(operation.toLowerCase());
399
            if (op == null) {
400
                return false;                
401
            }
402
            Iterator<JsonValue> it = op.iterator();
403
            while (it.hasNext()) {
404
                JsonValue value = it.next();
405
                String userOrRole = ((JsonString) value).getString();
406
                if (StringUtils.equalsIgnoreCase(userOrRole, "*")) {
407
                    LOGGER.info("Repository authorization for '"+operation+"' operation for '" + entity.getEntityName() + "' entity is allowed for all users.");
408
                    return true;
409
                }
410
                if (StringUtils.equalsIgnoreCase(userOrRole, userid)) {
411
                    LOGGER.info("Repository authorization for '"+operation+"' operation for '" + entity.getEntityName() + "' entity is allowed for user '" + userid + "'(" + user.getUserCode() + ").");
412
                    return true;
413
                }
414
                for (String role : user.getRolesAsList()) {
415
                    if (StringUtils.equalsIgnoreCase(userOrRole, "$" + role)) {
416
                        LOGGER.info("Repository authorization for '"+operation+"' operation for '" + entity.getEntityName() + "' entity is allowed for user '" + userid + "/"+role+"' (" + user.getUserCode() + ").");
417
                       return true;
418
                    }
419
                }
420
            }
421
        } catch (Exception ex) {
422
            LOGGER.warn("Can't verify authorization of user '"+userid+"'.", ex);
423
            return false;
424
        }
425
        
426
        return false;
427
    }
428

    
429
    public static String getOperationLabel(int operation) {
430
        return OPERATION_LABELS.getOrDefault(operation, "unknown");
431
    }
432
    public static String getStateLabel(int state) {
433
        return STATE_LABELS.getOrDefault(state, "unknown");
434
    }
435
    
436
    @SuppressWarnings("null")
437
    private static Map<String,String> getSqlTemplates(String name) {
438
      final int SEARCHING_ITEM = 0;
439
      final int READING_ITEM = 1;
440
      
441
      InputStream sqls = VCSGisUtils.class.getResourceAsStream("/org/gvsig/vcsgis/lib/"+name+".sql"); // org.gvsig.vcsgis.lib
442
      Map<String,String> expecteds = new HashMap<>();
443
      List<String> lines;
444
        try {
445
            lines = IOUtils.readLines(sqls);
446
        } catch (IOException ex) {
447
            throw new RuntimeException("Can't read sql templates for provider "+name, ex);
448
        }
449

    
450
      StringBuilder sb = null;
451
      String currentItem = null;
452
      int lineno = 1;
453
      int state = SEARCHING_ITEM;
454
      for (String line : lines) {
455
          line = line + "\n";
456
          switch(state) {
457
            case SEARCHING_ITEM:
458
                if( line.toLowerCase().startsWith("@begin ") ) {
459
                    currentItem = line.substring(7).trim();
460
                    sb = new StringBuilder();
461
                    state = READING_ITEM;
462
                } else if( line.toLowerCase().startsWith("-- ") ) {
463
                    // do nothing skip comment
464
                } else if( !StringUtils.isBlank(line) ) {
465
                    throw new IllegalStateException("Syntax error at '"+name+"', line "+lineno+ ".");
466
                }
467
                break;
468
            case READING_ITEM:
469
                if( line.toLowerCase().startsWith("@end ") ) {
470
                    if( !StringUtils.equals(currentItem,line.substring(5).trim()) ) {
471
                      throw new IllegalStateException("Syntax error at '"+name+"', line "+lineno+ ", expected @end "+currentItem+", and found "+line+".");
472
                    }
473
                    String s = sb.toString();
474
                    if( s.endsWith("\n") ) {
475
                        s = s.substring(0, s.length()-1);
476
                    }
477
                    expecteds.put(currentItem, s);
478
                    state = SEARCHING_ITEM;
479
                    
480
                } else if( line.toLowerCase().startsWith("-- ") ) {
481
                    // do nothing skip comment
482
                } else {
483
                    sb.append(line);
484
                }
485
                break;
486
        }
487
        lineno++;
488
      }
489
      if( state!=SEARCHING_ITEM ) {
490
          throw new IllegalStateException("Syntax error at '"+name+"', expected @end "+currentItem+" and found EOF .");
491
      }
492
      return expecteds;
493
    }
494
    
495
    public static String getSqlTemplate(String providerName, String sqlId){
496
        if(SQL_TEMPLATES_BY_PROVIDER.get(providerName) == null) {
497
            SQL_TEMPLATES_BY_PROVIDER.put(providerName, getSqlTemplates(providerName));
498
        }
499
        return SQL_TEMPLATES_BY_PROVIDER.get(providerName).get(sqlId);
500
    }
501
    
502
    public static void updateMessageDigest(MessageDigest md, Feature f, String fieldName) {
503
        String s = f.getString(fieldName);
504
        if( s!=null ) {
505
            md.update(s.getBytes());
506
        }
507
    }
508
    
509
    public static List<String> getAsList(String s) {
510
        return getAsList(s, true);
511
    }
512
    
513
    public static List<String> getAsList(String s, boolean toLowerCase) {
514
        if( StringUtils.isBlank(s) ) {
515
            return Collections.EMPTY_LIST;
516
        }
517
        try{
518
            List<String> l = new ArrayList<>();
519
            String[] ss = StringUtils.split(s, ",");
520
            for (String s1 : ss) {
521
                if (StringUtils.isBlank(s1)) {
522
                    continue;
523
                }
524
                if (toLowerCase) {
525
                    l.add(s1.trim().toLowerCase());
526
                } else {
527
                    l.add(s1.trim());
528
                }
529
            }
530
            return l;
531
        } catch (Exception ex) {
532
            return Collections.EMPTY_LIST;
533
        }
534
    }
535

    
536
    
537
}