Package org.geoserver.flow

Source Code of org.geoserver.flow.DefaultFlowControllerProvider

/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.flow;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.geoserver.flow.config.DefaultControlFlowConfigurator;
import org.geoserver.ows.Request;
import org.geoserver.platform.GeoServerExtensions;
import org.geotools.util.logging.Logging;
import org.springframework.context.ApplicationContext;

/**
* A provider that always returns the same set of flow control rules, regardless of the current
* request, based on the list provided by a ControlFlowConfigurator
*
* @author Andrea Aime - GeoSolutions
*
*/
public class DefaultFlowControllerProvider implements FlowControllerProvider {

    static final Logger LOGGER = Logging.getLogger(ControlFlowCallback.class);

    ControlFlowConfigurator configurator;

    List<FlowController> controllers = Collections.emptyList();

    private long timeout;

    public DefaultFlowControllerProvider(ApplicationContext applicationContext) {
        // look for a ControlFlowConfigurator in the application context, if none is found, use the
        // default one
        configurator = GeoServerExtensions.bean(ControlFlowConfigurator.class, applicationContext);
        if (configurator == null) {
            configurator = new DefaultControlFlowConfigurator();
        }
        initControllers();
    }

    public DefaultFlowControllerProvider(ControlFlowConfigurator configurator) {
        this.configurator = configurator;
        initControllers();
    }

    private void initControllers() {
        checkConfiguration();
        if (controllers.size() == 0) {
            LOGGER.info("Control-flow inactive, there are no configured rules");
        }
    }

    @Override
    public List<FlowController> getFlowControllers(Request request) throws Exception {
        checkConfiguration();
        return controllers;
    }

    @Override
    public long getTimeout(Request request) {
        return timeout;
    }

    private void checkConfiguration() {
        // check if we need to rebuild the flow controller list
        if (configurator.isStale()) {
            // be careful, as the configuration can be read on demand, it'd not be uncommon that
            // multiple requests come at once when the config file changed
            synchronized (configurator) {
                if (configurator.isStale()) {
                    reloadConfiguration();
                }
            }
        }
    }

    /**
     * Reloads the flow controller list and replaces the existing ones
     */
    void reloadConfiguration() {
        try {
            List<FlowController> newControllers = new ArrayList<FlowController>(
                    configurator.buildFlowControllers());
            Collections.sort(newControllers, new ControllerPriorityComparator());
            controllers = newControllers;
            int controllersCount = controllers.size();
            if (controllersCount > 0) {
                LOGGER.info("Control-flow active with " + controllersCount + " flow controllers");
            } else {
                LOGGER.info("Control-flow inactive, there are no configured rules");
            }
            timeout = configurator.getTimeout();
        } catch (Exception e) {
            LOGGER.log(Level.SEVERE, "Error occurerd during flow controllers reconfiguration");
        }
    }

}
TOP

Related Classes of org.geoserver.flow.DefaultFlowControllerProvider

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.