private Resource getSourcePermission(final String layerId, final User user) { if (layerId == null) { return null; } if (layerId.startsWith(AnalysisParser.ANALYSIS_LAYER_PREFIX)) { final Resource resource = new Resource(); resource.setType(AnalysisLayer.TYPE); resource.setMapping( "analysis", Long.toString(AnalysisHelper.getAnalysisIdFromLayerId(layerId))); return permissionsService.findResource(resource); } else if (layerId.startsWith(AnalysisParser.MYPLACES_LAYER_PREFIX) || layerId.equals("-1") || layerId.startsWith(AnalysisParser.USERLAYER_PREFIX)) { final Resource resource = new Resource(); // permission to publish for self final Permission permPublish = new Permission(); permPublish.setExternalType(Permissions.EXTERNAL_TYPE_USER); permPublish.setExternalId("" + user.getId()); permPublish.setType(Permissions.PERMISSION_TYPE_PUBLISH); resource.addPermission(permPublish); try { // add VIEW_PUBLISHED for all roles currently in the system for (Role role : UserService.getInstance().getRoles()) { final Permission perm = new Permission(); perm.setExternalType(Permissions.EXTERNAL_TYPE_ROLE); perm.setExternalId("" + role.getId()); perm.setType(Permissions.PERMISSION_TYPE_VIEW_PUBLISHED); resource.addPermission(perm); } } catch (Exception e) { log.error( "Something went wrong when generating source permissions for myplaces layer or temporary or user data layer"); } return resource; } // default to usual layer final OskariLayer layer = mapLayerService.find(layerId); // copy permissions from source layer to new analysis return permissionsService.getResource( Permissions.RESOURCE_TYPE_MAP_LAYER, new OskariLayerResource(layer).getMapping()); }
/** * Handles action_route CreateAnalysisLayer * * @param params Ajax request parameters * ********************************************************************** */ public void handleAction(ActionParameters params) throws ActionException { if (params.getUser().isGuest()) { throw new ActionDeniedException("Session expired"); } final String analyse = params.getRequiredParam(PARAM_ANALYSE, ERROR_ANALYSE_PARAMETER_MISSING); JSONObject analyseJson = JSONHelper.createJSONObject(analyse); if (analyseJson == null) { // json corrupted/parsing failed throw new ActionParamsException(ERROR_ANALYSE_PARAMETER_MISSING); } // filter conf data final String filter1 = params.getHttpParam(PARAM_FILTER1); final String filter2 = params.getHttpParam(PARAM_FILTER2); // Get baseProxyUrl final String baseUrl = getBaseProxyUrl(params); // User String uuid = params.getUser().getUuid(); // note! analysisLayer is replaced in aggregate handling!! AnalysisLayer analysisLayer = getAnalysisLayer(analyseJson, filter1, filter2, baseUrl, uuid); Analysis analysis = null; if (analysisLayer.getMethod().equals(AnalysisParser.LAYER_UNION)) { // no WPS for merge analysis analysis = analysisDataService.mergeAnalysisData(analysisLayer, analyse, params.getUser()); } else { // Generate WPS XML String featureSet = executeWPSprocess(analysisLayer); if (analysisLayer.getMethod().equals(AnalysisParser.UNION) || analysisLayer.getMethod().equals(AnalysisParser.INTERSECT) || analysisLayer.getMethod().equals(AnalysisParser.SPATIAL_JOIN)) { // Harmonize namespaces and element names featureSet = analysisParser.harmonizeElementNames(featureSet, analysisLayer); } // Add data to analysis db - we must create still an union in aggregate case if (analysisLayer.getMethod().equals(AnalysisParser.AGGREGATE)) { // No store to analysis db for aggregate - set results in to the // response // Save analysis results - use union of input data analysisLayer.setWpsLayerId(-1); final String aggregateResult = this.localiseAggregateResult( analysisParser.parseAggregateResults(featureSet, analysisLayer), analyseJson); log.debug("\nAggregate results:\n", aggregateResult, "\n"); /* Aggregate results: {"fi_url_1":{"Count":4},"tmp_id":{"Sum":45301,"Median":12232,"Count":4,"Standar d deviation":3186.3551571505645,"Maximum":14592,"Average":11325.25,"Minimum":624 5},"fi_url_3":{"Count":4},"postinumero":{"Count":4},"fi_url_2":{"Count":4},"fi_s posti_1":{"Count":4},"kuntakoodi":{"Count":4},"fi_osoite":{"Count":4},"fi_nimi": {"Count":4},"kto_tarkennus":{"Count":4}} */ analysisLayer.setResult(aggregateResult); // Get geometry for aggretage features try { // Just return result as JSON and don't save analysis to DB if (!params.getHttpParam(PARAM_SAVE_BLN, true)) { // NOTE!! Replacing the analysisLayer! // Get response as geojson when no db store analysisLayer = getAggregateLayer(analyse, filter1, filter2, baseUrl, analysisLayer, JSONFORMAT); featureSet = wpsService.requestFeatureSet(analysisLayer); // Just return result as JSON and don't save analysis to DB // Get geometry as geojson for hilighting features of aggregate result JSONObject geojson = JSONHelper.createJSONObject(featureSet); JSONObject jsaggregate = JSONHelper.createJSONObject(aggregateResult); JSONObject results = new JSONObject(); JSONHelper.putValue(results, JSON_KEY_GEOJSON, geojson); JSONHelper.putValue(results, JSON_KEY_AGGREGATE_RESULT, jsaggregate); ResponseHelper.writeResponse(params, results); return; } // NOTE!! Replacing the analysisLayer! - response is gml analysisLayer = getAggregateLayer(analyse, filter1, filter2, baseUrl, analysisLayer, null); featureSet = wpsService.requestFeatureSet(analysisLayer); // Harmonize namespaces and element names featureSet = analysisParser.harmonizeElementNames(featureSet, analysisLayer); featureSet = analysisParser.mergeAggregateResults2FeatureSet( featureSet, analysisLayer, this.getRowOrder(analyseJson), this.getColumnOrder(analyseJson)); // Redefine column types analysisLayer.setFieldtypeMap( this.getAggregateFieldTypes(this.getColumnOrder(analyseJson))); } catch (ServiceException e) { throw new ActionException(ERROR_UNABLE_TO_GET_FEATURES_FOR_UNION, e); } } // Add extra TypeNames (depends on wps method) analysisParser.fixTypeNames(analysisLayer); // Fix geometry property name for WFST (could be any, depends on Wps method ) fixGeometryPropertyName(analysisLayer); analysis = analysisDataService.storeAnalysisData( featureSet, analysisLayer, analyse, params.getUser()); } if (analysis == null) { this.MyError(ERROR_UNABLE_TO_STORE_ANALYSIS_DATA, params, null); return; } analysisLayer.setWpsLayerId(analysis.getId()); // aka. analysis_id // Analysis field mapping analysisLayer.setLocaleFields(analysis); analysisLayer.setNativeFields(analysis); // copy permissions from source layer to new analysis final Resource sourceResource = getSourcePermission(analysisParser.getSourceLayerId(analyseJson), params.getUser()); if (sourceResource != null) { final Resource analysisResource = new Resource(); analysisResource.setType(AnalysisLayer.TYPE); analysisResource.setMapping("analysis", Long.toString(analysis.getId())); for (Permission p : sourceResource.getPermissions()) { // check if user has role matching permission? if (p.isOfType(Permissions.PERMISSION_TYPE_PUBLISH) || p.isOfType(Permissions.PERMISSION_TYPE_VIEW_PUBLISHED)) { analysisResource.addPermission(p.clonePermission()); } } log.debug( "Trying to save permissions for analysis", analysisResource, analysisResource.getPermissions()); permissionsService.saveResourcePermissions(analysisResource); } else { log.warn("Couldn't get source permissions for analysis, result will have none"); } // Get analysisLayer JSON for response to front final JSONObject analysisLayerJSON = AnalysisHelper.getlayerJSON(analysis); // Additional param for new layer creation when merging layers: // - Notify client to remove merged layers since they are removed from backend JSONArray mlayers = new JSONArray(); if (analysisLayer.getMergeAnalysisLayers() != null) { for (String lay : analysisLayer.getMergeAnalysisLayers()) { mlayers.put(lay); } } JSONHelper.putValue(analysisLayerJSON, "mergeLayers", mlayers); Set<String> permissionsList = permissionsService.getPublishPermissions(AnalysisLayer.TYPE); Set<String> downloadPermissionsList = permissionsService.getDownloadPermissions(AnalysisLayer.TYPE); Set<String> editAccessList = null; String permissionKey = "analysis+" + analysis.getId(); JSONObject permissions = OskariLayerWorker.getPermissions( params.getUser(), permissionKey, permissionsList, downloadPermissionsList, editAccessList); JSONHelper.putValue(analysisLayerJSON, "permissions", permissions); ResponseHelper.writeResponse(params, analysisLayerJSON); }