org.geomajas.plugin.deskmanager.service.common.DynamicLayerLoadServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.geomajas.plugin.deskmanager.service.common.DynamicLayerLoadServiceImpl.java

Source

/*
 * This is part of Geomajas, a GIS framework, http://www.geomajas.org/.
 *
 * Copyright 2008-2014 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.plugin.deskmanager.service.common;

import org.apache.commons.lang.SerializationUtils;
import org.geomajas.configuration.NamedStyleInfo;
import org.geomajas.configuration.Parameter;
import org.geomajas.configuration.VectorLayerInfo;
import org.geomajas.configuration.client.ClientApplicationInfo;
import org.geomajas.plugin.deskmanager.domain.LayerModel;
import org.geomajas.plugin.deskmanager.domain.dto.DynamicLayerConfiguration;
import org.geomajas.plugin.deskmanager.service.manager.DiscoveryService;
import org.geomajas.plugin.runtimeconfig.service.BeanDefinitionDtoConverterService;
import org.geomajas.plugin.runtimeconfig.service.BeanDefinitionDtoConverterService.NamedObject;
import org.geomajas.plugin.runtimeconfig.service.BeanDefinitionWriterService;
import org.geomajas.plugin.runtimeconfig.service.BeanDefinitionWriterServiceImpl;
import org.geomajas.plugin.runtimeconfig.service.BeanFactoryService;
import org.geomajas.plugin.runtimeconfig.service.ContextConfiguratorService;
import org.geotools.jdbc.JDBCDataStoreFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.config.BeanDefinitionHolder;
import org.springframework.core.io.FileSystemResource;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * Implementation of the dynamiclayerloadservice.
 *
 * @author Kristof Heirwegh
 */
@Component
@Transactional(readOnly = true)
public class DynamicLayerLoadServiceImpl implements DynamicLayerLoadService {

    private final Logger log = LoggerFactory.getLogger(DynamicLayerLoadServiceImpl.class);

    @Autowired
    private LayerModelService layerModelService;

    @Autowired
    private DiscoveryService discoService;

    @Autowired
    private ContextConfiguratorService configService;

    @Autowired
    private BeanDefinitionDtoConverterService converterService;

    @Autowired
    private BeanFactoryService beanFactoryService;

    @Autowired(required = false)
    @Qualifier("dataSourceDbType")
    private String dataSourceDbType = "postgis";

    @Autowired(required = false)
    @Qualifier("dataSourceNamespace")
    private String dataSourceNamespace = "postgis";

    @Resource(name = "dynamicLayersApplication")
    private ClientApplicationInfo applicationInfo;

    @Autowired
    private BeanDefinitionWriterService bser;

    // -------------------------------------------------

    public void loadDynamicLayers() {
        log.info("Loading dynamic layers");

        try {
            // -- clientside / namedstyleinfo --
            List<BeanDefinitionHolder> holders = new ArrayList<BeanDefinitionHolder>();
            List<NamedObject> objects = new ArrayList<NamedObject>();
            List<String> clientLayerIds = new ArrayList<String>();
            for (LayerModel lm : layerModelService.getDynamicLayerModelsInternal()) {
                log.info(" - creating a dynamic layer for: " + lm.getName());
                try {
                    clientLayerIds.add(lm.getClientLayerId());

                    //Clone layer configuration so that it doesn't get overwritten in the database.
                    DynamicLayerConfiguration clonedLayerConfiguration = (DynamicLayerConfiguration) SerializationUtils
                            .clone(lm.getDynamicLayerConfiguration());

                    updateLayerProperties(clonedLayerConfiguration);
                    objects.addAll(getClientLayerInfoObject(clonedLayerConfiguration));

                    // -- serverside layer bean has to be processed separately --
                    Map<String, Object> params = discoService
                            .createBeanLayerDefinitionParameters(clonedLayerConfiguration);
                    holders.addAll(beanFactoryService.createBeans(params));

                    // Add layer to the dynamicLayersApplication for dto postprocessing
                    applicationInfo.getMaps().get(0).getLayers().add(clonedLayerConfiguration.getClientLayerInfo());
                } catch (Exception e) {
                    log.warn("Error loading dynamic layers: " + e.getMessage());
                }
            }

            NamedObjectImpl applicationInfoNamedObject = new NamedObjectImpl(applicationInfo,
                    "dynamicLayersApplication");
            objects.add(applicationInfoNamedObject);

            holders.addAll(converterService.createBeanDefinitionsByIntrospection(objects));
            activateBeans(holders, clientLayerIds);

            log.info(" - finished loading dynamic layers into context.");
        } catch (Exception e) {
            log.warn("Error activating dynamic layers: " + e.getMessage());
        }
    }

    // ---- Load -----------------------------------------------

    /**
     * replaces params if necessary, removes styleinfos (use names)
     */
    private void updateLayerProperties(DynamicLayerConfiguration lc) throws Exception {
        if (lc == null) {
            throw new IllegalArgumentException("Need a DynamicLayerConfiguration");
        }

        if (lc.getParameter(DynamicLayerConfiguration.PARAM_SOURCE_TYPE) != null
                && DynamicLayerConfiguration.SOURCE_TYPE_SHAPE
                        .equals(lc.getParameter(DynamicLayerConfiguration.PARAM_SOURCE_TYPE).getValue())) {

            // inject private properties for shapelayers
            // this is only used for dbtype and namespace
            lc.getParameters().add(new Parameter(JDBCDataStoreFactory.NAMESPACE.key, dataSourceNamespace));
            lc.getParameters().add(new Parameter(JDBCDataStoreFactory.DBTYPE.key, dataSourceDbType));
        }
    }

    private List<NamedObject> getClientLayerInfoObject(DynamicLayerConfiguration lc) throws Exception {
        if (lc == null) {
            throw new IllegalArgumentException("Need a DynamicLayerConfiguration");
        }
        List<NamedObject> objects = new ArrayList<BeanDefinitionDtoConverterService.NamedObject>();

        if (lc.getServerLayerInfo() instanceof VectorLayerInfo) {
            NamedStyleInfo nsi = ((VectorLayerInfo) lc.getServerLayerInfo()).getNamedStyleInfos().get(0);
            objects.add(new NamedObjectImpl(nsi, nsi.getName()));
        }

        objects.add(new NamedObjectImpl(lc.getClientLayerInfo(), lc.getClientLayerInfo().getId()));

        return objects;
    }

    private void activateBeans(List<BeanDefinitionHolder> defs, List<String> clientLayerIds) throws Exception {
        if (defs.size() > 0) {
            if (log.isDebugEnabled()) {
                // -- write config out to XML --
                ((BeanDefinitionWriterServiceImpl) bser).setBaseResource(new FileSystemResource("."));
                bser.persist("_dynamicConfig_", defs);
            }

            configService.configureBeanDefinitions(defs);
        }
    }

    /**
     * TODO.
     * 
     * @author Jan De Moerloose
     * 
     */
    private static class NamedObjectImpl implements NamedObject {

        private final Object o;

        private final String name;

        public NamedObjectImpl(Object o, String name) {
            this.o = o;
            this.name = name;
        }

        public String getName() {
            return name;
        }

        public Object getObject() {
            return o;
        }
    }

}