All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.tinygroup.plugin.impl.PluginManagerImpl Maven / Gradle / Ivy

The newest version!
/**
 *  Copyright (c) 1997-2013, tinygroup.org ([email protected]).
 *
 *  Licensed under the GPL, Version 3.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *       http://www.gnu.org/licenses/gpl.html
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 * --------------------------------------------------------------------------
 *  版权 (c) 1997-2013, tinygroup.org ([email protected]).
 *
 *  本开源软件遵循 GPL 3.0 协议;
 *  如果您不遵循此协议,则不被允许使用此文件。
 *  你可以从下面的地址获取完整的协议文本
 *
 *       http://www.gnu.org/licenses/gpl.html
 */
package org.tinygroup.plugin.impl;

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

import org.tinygroup.logger.LogLevel;
import org.tinygroup.logger.Logger;
import org.tinygroup.logger.LoggerFactory;
import org.tinygroup.plugin.Plugin;
import org.tinygroup.plugin.PluginManager;
import org.tinygroup.plugin.config.PluginConfig;
import org.tinygroup.plugin.config.PluginConfigs;
import org.tinygroup.springutil.SpringUtil;

public class PluginManagerImpl implements PluginManager {
	Logger logger = LoggerFactory.getLogger(PluginManagerImpl.class);
	List pluginConfigList = new ArrayList();
	Map pluginConfigMap = new HashMap();

	public void addPlugin(PluginConfigs pluginConfigs) {
		if (pluginConfigs.getPluginConfigs() != null) {
			for (PluginConfig pluginConfig : pluginConfigs.getPluginConfigs()) {
				addPlugin(pluginConfig);
			}
		}
	}

	public void addPlugin(PluginConfig pluginConfig) {
		pluginConfigList.add(pluginConfig);
		pluginConfigMap.put(pluginConfig.getPluginName(), pluginConfig);
	}

	public void start() {
		refact();
		for (PluginConfig pluginConfig : pluginConfigList) {
			if (pluginConfig.isHealthy() && pluginConfig.getStatus() == STOPED) {// 启动健康的未启动插件
				startPlugin(pluginConfig);
			}
		}
	}

	public void stop() {
		for (PluginConfig pluginConfig : pluginConfigList) {
			if (pluginConfig.getStatus() == RUNING) {// 停止运行的插件
				stopPlugin(pluginConfig);
			}
		}
	}

	public void startPlugin(String pluginName) {
		PluginConfig pluginConfig = pluginConfigMap.get(pluginName);
		startPlugin(pluginConfig);
	}

	private void startPlugin(PluginConfig pluginConfig) {
		logger.logMessage(LogLevel.INFO, "开始启动插件:{}...",
				pluginConfig.getPluginName());
		if (pluginConfig.getStatus() == RUNING) {
			logger.logMessage(LogLevel.INFO, "{}插件已经启动!",
					pluginConfig.getPluginName());
		} else {
			if (!pluginConfig.isHealthy()) {// 如果当前插件不健康
				logger.logMessage(LogLevel.INFO, "{}插件不健康,无法启动,原因是依赖的以下插件不健康:",
						pluginConfig.getPluginName());
				for (PluginConfig config : pluginConfig.getDependList()) {
					if (!config.isHealthy()) {
						logger.logMessage(LogLevel.INFO, "{}插件不健康,无法启动!",
								config.getPluginName());
					}
				}
			} else {
				for (PluginConfig config : pluginConfig.getDependList()) {
					if (config.getStatus() == STOPED) {
						startPlugin(config);
					}
				}
			}
			Plugin plugin = SpringUtil.getBean(pluginConfig.getPluginBean());
			plugin.start();
			pluginConfig.setStatus(RUNING);
		}
		logger.logMessage(LogLevel.INFO, "插件:{}启动完毕。",
				pluginConfig.getPluginName());

	}

	public void stopPlugin(String pluginName) {
		PluginConfig pluginConfig = pluginConfigMap.get(pluginName);
		if (pluginConfig == null) {
			logger.logMessage(LogLevel.INFO, "不存在<{}>插件!", pluginName);
			return;
		}else{
			stopPlugin(pluginConfig);
		}
	}

	private void stopPlugin(PluginConfig pluginConfig) {
		if (pluginConfig.getStatus() == STOPED) {
			logger.logMessage(LogLevel.INFO, "<{}>插件已经停止!",
					pluginConfig.getPluginName());
		} else {
			Plugin plugin = SpringUtil.getBean(pluginConfig.getPluginBean());
			for (PluginConfig config : pluginConfig.getDependByList()) {// 停止依赖当前插件的插件
				stopPlugin(config.getPluginName());
			}
			plugin.stop();
			pluginConfig.setStatus(STOPED);
		}
	}

	public int getPluginStatus(String pluginName) {
		return pluginConfigMap.get(pluginName).getStatus();
	}

	public PluginConfig getPluginConfig(String pluginName) {
		return pluginConfigMap.get(pluginName);
	}

	public List getPluginConfigList() {
		List list = new ArrayList();
		list.addAll(pluginConfigList);
		return list;
	}

	public void stopLevel(int pluginLevel) {
		for (PluginConfig pluginConfig : pluginConfigList) {
			if (pluginConfig.getPluginLevel() >= pluginLevel
					&& pluginConfig.isHealthy()
					&& pluginConfig.getStatus() == RUNING) {
				stopPlugin(pluginConfig);
			}
		}
	}

	public void startLevel(int pluginLevel) {
		for (PluginConfig pluginConfig : pluginConfigList) {
			if (pluginConfig.getPluginLevel() <= pluginLevel
					&& pluginConfig.isHealthy()
					&& pluginConfig.getStatus() == STOPED) {
				startPlugin(pluginConfig);
			}
		}
	}

	private void refact() {
		// 首先重置状态
		for (PluginConfig pluginConfig : pluginConfigList) {
			pluginConfig.getDependByList().clear();
			pluginConfig.getDependList().clear();
			pluginConfig.setHealthy(false);
			pluginConfig.setRefacted(false);
		}// 进行反应计算
		for (PluginConfig pluginConfig : pluginConfigList) {
			refactPlugin(pluginConfig,new ArrayList());
		}// 停止不健康的
		for (PluginConfig pluginConfig : pluginConfigList) {
			if (!pluginConfig.isHealthy()) {// 停止不健康的插件
				stopPlugin(pluginConfig);
			}
		}
	}

	private void refactPlugin(PluginConfig pluginConfig,List pluginNames) {
		String pluginName = pluginConfig.getPluginName();
		if(pluginNames.contains(pluginName)){
			return ;
		}else{
			pluginNames.add(pluginName);
		}
		boolean healthy = true;
		healthy = healthy&&dealDepend(pluginConfig,pluginNames);
		healthy = healthy&&dealDependBy(pluginConfig,pluginNames);
		pluginConfig.setHealthy(healthy);// 设置健康情况
		pluginConfig.setRefacted(true);// 设置已经反应过
	}
	
	private boolean dealDependBy(PluginConfig pluginConfig,List pluginNames){
		String dependByPlugins = pluginConfig.getDependByPlugins();
		if(dependByPlugins != null && dependByPlugins.length() > 0){
			String[] dependByPluginArray = dependByPlugins.split(",");
			boolean healthy = true;
			for (String name : dependByPluginArray) {
				PluginConfig dependByPluginConfig = pluginConfigMap.get(name);
				if (dependByPluginConfig == null) {
					healthy = false;
					logger.logMessage(LogLevel.ERROR, "依赖插件{}的插件{}不存在!",
							pluginConfig.getPluginName(), name);
				} else {
					if (!dependByPluginConfig.isRefacted()) {// 如果还没有发生过,则使反应
						refactPlugin(dependByPluginConfig,pluginNames);
					}
					if (!dependByPluginConfig.isHealthy()) {
						logger.logMessage(LogLevel.ERROR, "依赖插件{}的插件{}不健康!",
								pluginConfig.getPluginName(), name);
						healthy = false;
					}
					pluginConfig.getDependByList().add(dependByPluginConfig);
					dependByPluginConfig.getDependList().add(pluginConfig);
				}
			}
			return healthy;
		} 
		return true;
	}
	
	private boolean dealDepend(PluginConfig pluginConfig,List pluginNames){
		String dependPlugins = pluginConfig.getDependPlugins();
		if (dependPlugins != null && dependPlugins.length() > 0) {
			String[] dependPluginArray = dependPlugins.split(",");
			boolean healthy = true;
			for (String name : dependPluginArray) {
				PluginConfig dependPluginConfig = pluginConfigMap.get(name);
				if (dependPluginConfig == null) {
					healthy = false;
					logger.logMessage(LogLevel.ERROR, "插件{}依赖的插件{}不存在!",
							pluginConfig.getPluginName(), name);
				} else {
					if (!dependPluginConfig.isRefacted()) {// 如果还没有发生过,则使反应
						refactPlugin(dependPluginConfig,pluginNames);
					}
					if (!dependPluginConfig.isHealthy()) {
						logger.logMessage(LogLevel.ERROR, "插件{}依赖的插件{}不健康!",
								pluginConfig.getPluginName(), name);
						healthy = false;
					}
					pluginConfig.getDependList().add(dependPluginConfig);
					dependPluginConfig.getDependByList().add(pluginConfig);
				}
			}
			return healthy;
		}
		return true;
	}

	public void removePlugin(PluginConfigs pluginConfigs) {
		if (pluginConfigs.getPluginConfigs() != null) {
			for (PluginConfig pluginConfig : pluginConfigs.getPluginConfigs()) {
				removePlugin(pluginConfig);
			}
		}

	}

	public void removePlugin(PluginConfig pluginConfig) {
		stopPlugin(pluginConfig);// 停止当前插件
		pluginConfigList.remove(pluginConfig);// 删除之
		pluginConfigMap.remove(pluginConfig.getPluginName());// 删除之
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy