com.bstek.dorado.data.config.DataConfigManagerSupport.java Source code

Java tutorial

Introduction

Here is the source code for com.bstek.dorado.data.config.DataConfigManagerSupport.java

Source

/*
 * This file is part of Dorado 7.x (http://dorado7.bsdn.org).
 * 
 * Copyright (c) 2002-2012 BSTEK Corp. All rights reserved.
 * 
 * This file is dual-licensed under the AGPLv3 (http://www.gnu.org/licenses/agpl-3.0.html) 
 * and BSDN commercial (http://www.bsdn.org/licenses) licenses.
 * 
 * If you are unsure which license is appropriate for your use, please contact the sales department
 * at http://www.bstek.com/contact.
 */

package com.bstek.dorado.data.config;

import java.util.LinkedHashSet;
import java.util.Set;
import java.util.Vector;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.bstek.dorado.config.ConfigUtils;
import com.bstek.dorado.core.io.Resource;
import com.bstek.dorado.data.provider.manager.DataProviderManager;
import com.bstek.dorado.data.resolver.manager.DataResolverManager;
import com.bstek.dorado.data.type.manager.DataTypeManager;

/**
 * ????
 * 
 * @author Benny Bao (mailto:benny.bao@bstek.com)
 * @since Feb 20, 2007
 */
public abstract class DataConfigManagerSupport implements DataConfigManager {
    private static Log logger = LogFactory.getLog(DataConfigManagerSupport.class);

    private Set<Resource> resourceSet = new LinkedHashSet<Resource>();
    private transient Vector<DataConfigManagerListener> configManagerListeners;

    /**
     * DataType?
     */
    protected DataTypeManager dataTypeManager;

    /**
     * DataProvider?
     */
    protected DataProviderManager dataProviderManager;

    /**
     * DataResolver?
     */
    protected DataResolverManager dataResolverManager;

    /**
     * ?ConfigManager???
     */
    public Set<Resource> getResources() {
        return resourceSet;
    }

    /**
     * DataType?
     */
    public void setDataTypeManager(DataTypeManager dataTypeManager) {
        this.dataTypeManager = dataTypeManager;
    }

    /**
     * DataProvider?
     */
    public void setDataProviderManager(DataProviderManager dataProviderManager) {
        this.dataProviderManager = dataProviderManager;
    }

    /**
     * DataResolver?
     */
    public void setDataResolverManager(DataResolverManager dataResolverManager) {
        this.dataResolverManager = dataResolverManager;
    }

    public synchronized void addConfigManagerListener(DataConfigManagerListener l) {
        if (configManagerListeners == null) {
            configManagerListeners = new Vector<DataConfigManagerListener>(1);
        }
        configManagerListeners.add(l);
    }

    public synchronized void removeConfigManagerListener(DataConfigManagerListener l) {
        if (configManagerListeners != null) {
            configManagerListeners.remove(l);
        }
    }

    /**
     * ???????
     * 
     * @param event
     *            ??
     */
    protected void fireOnConfigChanged(DataConfigManagerEvent event) {
        if (configManagerListeners != null) {
            for (DataConfigManagerListener listener : configManagerListeners) {
                listener.onConfigChanged(event);
            }
        }
    }

    public synchronized void loadConfigs(Resource[] resources, boolean throwOnError) throws Exception {
        long startTime = System.currentTimeMillis();

        CollectionUtils.addAll(resourceSet, resources);

        ConfigUtils.setDuringBuildTemplate(true);
        try {
            internalUnloadConfigs(resources);
            internalLoadConfig(resources);
        } catch (Exception ex) {
            if (throwOnError) {
                throw ex;
            } else {
                logger.error(ex, ex);
            }
        } finally {
            ConfigUtils.setDuringBuildTemplate(false);
        }

        DataConfigManagerEvent event = new DataConfigManagerEvent(this);
        event.setResource(resources);
        fireOnConfigChanged(event);

        long endTime = System.currentTimeMillis();

        String message = "Configures loaded in " + (endTime - startTime) + " ms.";
        message += " [";
        for (int i = 0; i < resources.length; i++) {
            if (i > 0)
                message += ',';
            message += resources[i];
        }
        message += "].";
        logger.info(message);
    }

    /**
     * ???? internalLoadConfig()?loadConfig()
     * 
     * @param resources
     *            ????
     * @return ???
     * @throws Exception
     */
    protected abstract boolean internalLoadConfig(Resource[] resources) throws Exception;

    public synchronized void unloadConfigs(Resource[] resources) throws Exception {
        if (internalUnloadConfigs(resources)) {
            dataTypeManager.clearCache();
        }

        for (Resource resource : resources) {
            resourceSet.remove(resource);
        }

        DataConfigManagerEvent event = new DataConfigManagerEvent(this);
        event.setResource(resources);
        event.setMode(DataConfigManagerEvent.MODE_UNLOAD);
        fireOnConfigChanged(event);

        String message = "Configures unloaded [";
        for (int i = 0; i < resources.length; i++) {
            if (i > 0) {
                message += ',';
            }
            message += resources[i];
        }
        message += "].";
        logger.info(message);
    }

    /**
     * ?????
     * internalUnloadConfig()?unloadConfig()
     * 
     * @param resources
     *            ????
     * @return ???
     * @throws Exception
     */
    protected abstract boolean internalUnloadConfigs(Resource[] resources) throws Exception;

}