org.geomajas.command.configuration.GetMapConfigurationCommand.java Source code

Java tutorial

Introduction

Here is the source code for org.geomajas.command.configuration.GetMapConfigurationCommand.java

Source

/*
 * This is part of Geomajas, a GIS framework, http://www.geomajas.org/.
 *
 * Copyright 2008-2015 Geosparc nv, http://www.geosparc.com/, Belgium.
 *
 * The program is available in open source according to the GNU Affero
 * General Public License. All contributions in this program are covered
 * by the Geomajas Contributors License Agreement. For full licensing
 * details, see LICENSE.txt in the project root.
 */
package org.geomajas.command.configuration;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.SerializationUtils;
import org.geomajas.annotation.Api;
import org.geomajas.command.CommandHasRequest;
import org.geomajas.command.dto.GetMapConfigurationRequest;
import org.geomajas.command.dto.GetMapConfigurationResponse;
import org.geomajas.configuration.AttributeInfo;
import org.geomajas.configuration.FeatureInfo;
import org.geomajas.configuration.LayerExtraInfo;
import org.geomajas.configuration.ServerSideOnlyInfo;
import org.geomajas.configuration.client.ClientApplicationInfo;
import org.geomajas.configuration.client.ClientLayerInfo;
import org.geomajas.configuration.client.ClientLayerTreeInfo;
import org.geomajas.configuration.client.ClientLayerTreeNodeInfo;
import org.geomajas.configuration.client.ClientMapInfo;
import org.geomajas.configuration.client.ClientToolInfo;
import org.geomajas.configuration.client.ClientToolbarInfo;
import org.geomajas.configuration.client.ClientVectorLayerInfo;
import org.geomajas.configuration.client.ClientWidgetInfo;
import org.geomajas.global.ExceptionCode;
import org.geomajas.global.GeomajasException;
import org.geomajas.security.SecurityContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;

/**
 * This command fetches, and returns the initial application configuration for a specific MapWidget.
 *
 * @author Pieter De Graef
 * @author Jan De Moerloose
 * @author Joachim Van der Auwera
 * @author Jan Venstermans
 * @since 1.6.0
 */
@Api
@Component()
public class GetMapConfigurationCommand
        implements CommandHasRequest<GetMapConfigurationRequest, GetMapConfigurationResponse> {

    @Autowired
    private ApplicationContext context;

    @Autowired
    private SecurityContext securityContext;

    @Override
    public GetMapConfigurationRequest getEmptyCommandRequest() {
        return new GetMapConfigurationRequest();
    }

    @Override
    public GetMapConfigurationResponse getEmptyCommandResponse() {
        return new GetMapConfigurationResponse();
    }

    @Override
    public void execute(GetMapConfigurationRequest request, GetMapConfigurationResponse response) throws Exception {
        if (null == request.getApplicationId()) {
            throw new GeomajasException(ExceptionCode.PARAMETER_MISSING, "applicationId");
        }
        String mapId = request.getMapId();
        if (null == mapId) {
            throw new GeomajasException(ExceptionCode.PARAMETER_MISSING, "mapId");
        }

        ClientApplicationInfo application = context.getBean(request.getApplicationId(),
                ClientApplicationInfo.class);
        for (ClientMapInfo map : application.getMaps()) {
            if (mapId.equals(map.getId())) {
                response.setMapInfo(securityClone(map));
            }
        }
        if (response.getMapInfo() == null) {
            throw new GeomajasException(ExceptionCode.MAP_NOT_FOUND, request.getMapId(),
                    request.getApplicationId());
        }
    }

    public ClientMapInfo securityClone(ClientMapInfo original) {
        // the data is explicitly copied as this assures the security is considered when copying.
        if (null == original) {
            return null;
        }
        ClientMapInfo client = new ClientMapInfo();
        client.setBackgroundColor(original.getBackgroundColor());
        client.setCrs(original.getCrs());
        client.setDisplayUnitType(original.getDisplayUnitType());
        client.setId(original.getId());
        client.setInitialBounds(original.getInitialBounds());
        client.setPreferredPixelsPerTile(original.getPreferredPixelsPerTile());
        List<ClientLayerInfo> layers = new ArrayList<ClientLayerInfo>();
        client.setLayers(layers);
        for (ClientLayerInfo layer : original.getLayers()) {
            ClientLayerInfo clientLayer = securityClone(layer);
            if (null != clientLayer) {
                layers.add(clientLayer);
            }
        }
        client.setLayerTree(securityClone(original.getLayerTree()));
        client.setLineSelectStyle(original.getLineSelectStyle());
        client.setMaxBounds(original.getMaxBounds());
        client.setViewBoundsLimitOption(original.getViewBoundsLimitOption());
        client.setScaleConfiguration(original.getScaleConfiguration());
        client.setPanButtonsEnabled(original.isPanButtonsEnabled());
        client.setPixelLength(original.getPixelLength());
        client.setPointSelectStyle(original.getPointSelectStyle());
        client.setPolygonSelectStyle(original.getPolygonSelectStyle());
        client.setPrecision(original.getPrecision());
        client.setScaleBarEnabled(original.isScaleBarEnabled());
        client.setToolbar(securityClone(original.getToolbar()));
        client.setUnitLength(original.getUnitLength());
        if (!(original.getUserData() instanceof ServerSideOnlyInfo)) {
            client.setUserData(original.getUserData());
        }
        client.setWidgetInfo(securityClone(original.getWidgetInfo()));
        return client;
    }

    /**
     * Clone a widget info map considering what may be copied to the client.
     *
     * @param widgetInfo widget info map
     * @return cloned copy including only records which are not {@link ServerSideOnlyInfo}
     */
    public Map<String, ClientWidgetInfo> securityClone(Map<String, ClientWidgetInfo> widgetInfo) {
        Map<String, ClientWidgetInfo> res = new HashMap<String, ClientWidgetInfo>();
        for (Map.Entry<String, ClientWidgetInfo> entry : widgetInfo.entrySet()) {
            ClientWidgetInfo value = entry.getValue();
            if (!(value instanceof ServerSideOnlyInfo)) {
                res.put(entry.getKey(), value);
            }
        }
        return res;
    }

    /**
     * Clone a {@link org.geomajas.configuration.LayerInfo#extraInfo} considering what may be copied to the client.
     *
     * @param extraInfoMap map of extra info
     * @return cloned copy including only records which are not {@link ServerSideOnlyInfo}
     */
    public Map<String, LayerExtraInfo> securityCloneLayerExtraInfo(Map<String, LayerExtraInfo> extraInfoMap) {
        Map<String, LayerExtraInfo> res = new HashMap<String, LayerExtraInfo>();
        for (Map.Entry<String, LayerExtraInfo> entry : extraInfoMap.entrySet()) {
            LayerExtraInfo value = entry.getValue();
            if (!(value instanceof ServerSideOnlyInfo)) {
                res.put(entry.getKey(), value);
            }
        }
        return res;
    }

    /**
     * Clone layer information considering what may be copied to the client.
     *
     * @param original layer info
     * @return cloned copy including only allowed information
     */
    public ClientLayerInfo securityClone(ClientLayerInfo original) {
        // the data is explicitly copied as this assures the security is considered when copying.
        if (null == original) {
            return null;
        }
        ClientLayerInfo client = null;
        String layerId = original.getServerLayerId();
        if (securityContext.isLayerVisible(layerId)) {
            client = (ClientLayerInfo) SerializationUtils.clone(original);
            client.setWidgetInfo(securityClone(original.getWidgetInfo()));
            client.getLayerInfo().setExtraInfo(securityCloneLayerExtraInfo(original.getLayerInfo().getExtraInfo()));
            if (client instanceof ClientVectorLayerInfo) {
                ClientVectorLayerInfo vectorLayer = (ClientVectorLayerInfo) client;
                // set statuses
                vectorLayer.setCreatable(securityContext.isLayerCreateAuthorized(layerId));
                vectorLayer.setUpdatable(securityContext.isLayerUpdateAuthorized(layerId));
                vectorLayer.setDeletable(securityContext.isLayerDeleteAuthorized(layerId));
                // filter feature info
                FeatureInfo featureInfo = vectorLayer.getFeatureInfo();
                List<AttributeInfo> originalAttr = featureInfo.getAttributes();
                List<AttributeInfo> filteredAttr = new ArrayList<AttributeInfo>();
                featureInfo.setAttributes(filteredAttr);
                for (AttributeInfo ai : originalAttr) {
                    if (securityContext.isAttributeReadable(layerId, null, ai.getName())) {
                        filteredAttr.add(ai);
                    }
                }
            }
        }
        return client;
    }

    public ClientLayerTreeInfo securityClone(ClientLayerTreeInfo original) {
        // the data is explicitly copied as this assures the security is considered when copying.
        if (null == original) {
            return null;
        }
        // the data is explicitly copied as this assures the security is considered when copying.
        ClientLayerTreeInfo client = new ClientLayerTreeInfo();
        client.setId(original.getId());
        client.setTools(securityClone(original.getTools()));
        client.setTreeNode(securityClone(original.getTreeNode()));
        return client;
    }

    public ClientLayerTreeNodeInfo securityClone(ClientLayerTreeNodeInfo original) {
        // the data is explicitly copied as this assures the security is considered when copying.
        if (null == original) {
            return null;
        }
        ClientLayerTreeNodeInfo client = new ClientLayerTreeNodeInfo();
        client.setLabel(original.getLabel());
        client.setExpanded(original.isExpanded());
        List<ClientLayerInfo> layers = new ArrayList<ClientLayerInfo>();
        client.setLayers(layers);
        for (ClientLayerInfo layer : original.getLayers()) {
            ClientLayerInfo copy = securityClone(layer);
            if (null != copy) {
                layers.add(copy);
            }
        }
        List<ClientLayerTreeNodeInfo> nodes = new ArrayList<ClientLayerTreeNodeInfo>();
        client.setTreeNodes(nodes);
        for (ClientLayerTreeNodeInfo node : original.getTreeNodes()) {
            ClientLayerTreeNodeInfo copy = securityClone(node);
            if (null != copy) {
                nodes.add(copy);
            }
        }
        if (layers.size() > 0 || nodes.size() > 0) {
            return client;
        }
        return null;
    }

    public ClientToolbarInfo securityClone(ClientToolbarInfo original) {
        // the data is explicitly copied as this assures the security is considered when copying.
        if (null == original) {
            return null;
        }
        ClientToolbarInfo client = new ClientToolbarInfo();
        client.setId(original.getId());
        client.setTools(securityClone(original.getTools()));
        return client;
    }

    public List<ClientToolInfo> securityClone(List<ClientToolInfo> original) {
        // the data is explicitly copied as this assures the security is considered when copying.
        if (null == original) {
            return null;
        }
        List<ClientToolInfo> tools = new ArrayList<ClientToolInfo>();
        for (ClientToolInfo tool : original) {
            if (securityContext.isToolAuthorized(tool.getToolId())) {
                tools.add(tool);
            }
        }
        return tools;
    }
}