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

org.tinygroup.databasechange.DatabaseInstallerStart Maven / Gradle / Ivy

The newest version!
package org.tinygroup.databasechange;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.springframework.beans.BeanWrapper;
import org.tinygroup.beancontainer.BeanContainerFactory;
import org.tinygroup.beanwrapper.BeanWrapperHolder;
import org.tinygroup.commons.io.StreamUtil;
import org.tinygroup.commons.tools.CollectionUtil;
import org.tinygroup.commons.tools.StringUtil;
import org.tinygroup.database.ProcessorManager;
import org.tinygroup.database.customesql.CustomSqlProcessor;
import org.tinygroup.database.customesql.impl.CustomSqlProcessorImpl;
import org.tinygroup.database.fileresolver.InitDataFileResolver;
import org.tinygroup.database.fileresolver.ProcedureFileResolver;
import org.tinygroup.database.fileresolver.TableFileResolver;
import org.tinygroup.database.fileresolver.ViewFileResolver;
import org.tinygroup.database.impl.ProcessorManagerImpl;
import org.tinygroup.database.initdata.InitDataProcessor;
import org.tinygroup.database.initdata.impl.InitDataProcessorImpl;
import org.tinygroup.database.procedure.ProcedureProcessor;
import org.tinygroup.database.procedure.impl.ProcedureProcessorImpl;
import org.tinygroup.database.sequence.SequenceProcessor;
import org.tinygroup.database.sequence.impl.SequenceProcessorImpl;
import org.tinygroup.database.table.TableProcessor;
import org.tinygroup.database.table.impl.TableProcessorImpl;
import org.tinygroup.database.trigger.TriggerProcessor;
import org.tinygroup.database.trigger.impl.TriggerProcessorImpl;
import org.tinygroup.database.view.ViewProcessor;
import org.tinygroup.database.view.impl.ViewProcessorImpl;
import org.tinygroup.databasebuinstaller.DataSourceHolder;
import org.tinygroup.databasebuinstaller.DatabaseInstallerProcessor;
import org.tinygroup.databasebuinstaller.InstallProcessor;
import org.tinygroup.databasebuinstaller.impl.CustomSqlInstallProcessor;
import org.tinygroup.databasebuinstaller.impl.InitDataInstallProcessor;
import org.tinygroup.databasebuinstaller.impl.ProcedureInstallProcessor;
import org.tinygroup.databasebuinstaller.impl.SequenceInstallProcessor;
import org.tinygroup.databasebuinstaller.impl.TableInstallProcessor;
import org.tinygroup.databasebuinstaller.impl.TriggerInstallProcessor;
import org.tinygroup.databasebuinstaller.impl.ViewInstallProcessor;
import org.tinygroup.fileresolver.FileResolver;
import org.tinygroup.fileresolver.FileResolverFactory;
import org.tinygroup.fileresolver.FileResolverUtil;
import org.tinygroup.fileresolver.impl.I18nFileProcessor;
import org.tinygroup.fileresolver.impl.XStreamFileProcessor;
import org.tinygroup.logger.LogLevel;
import org.tinygroup.logger.Logger;
import org.tinygroup.logger.LoggerFactory;
import org.tinygroup.metadata.bizdatatype.impl.BusinessTypeProcessorImpl;
import org.tinygroup.metadata.constants.impl.ConstantsProcessorImpl;
import org.tinygroup.metadata.errormessage.impl.ErrorMessageProcessorImpl;
import org.tinygroup.metadata.fileresolver.BusinessTypeFileResolver;
import org.tinygroup.metadata.fileresolver.ConstantFileResolver;
import org.tinygroup.metadata.fileresolver.ErrorMessageFileResolver;
import org.tinygroup.metadata.fileresolver.StandardFieldFileResolver;
import org.tinygroup.metadata.fileresolver.StandardTypeFileResolver;
import org.tinygroup.metadata.stddatatype.impl.StandardTypeProcessorImpl;
import org.tinygroup.metadata.stdfield.impl.StandardFieldProcessorImpl;
import org.tinygroup.parser.filter.PathFilter;
import org.tinygroup.springutil.SpringBeanContainer;
import org.tinygroup.xmlparser.node.XmlNode;
import org.tinygroup.xmlparser.parser.XmlStringParser;

/**
 * 数据库按照启动类
 * 
 * @author renhui
 *
 */
public class DatabaseInstallerStart {

	private static String DEFAULT_CONFIG = "application.xml";
	private static final String TYPE = "type";
	private static final String PROPERTY = "property";
	private static final String TINY_JAR_PATTERN = "org\\.tinygroup\\.(.)*\\.jar";
	private static final Logger LOGGER = LoggerFactory
			.getLogger(DatabaseInstallerStart.class);
	private DatabaseInstallerProcessor installer;
	private XmlNode applicationNode;

	public DatabaseInstallerStart() {
		applicationNode = getRootNode();
		installer = initInstaller();
		installer.setDbLanguage(resolverLanguageType());
		BeanContainerFactory.initBeanContainer(SpringBeanContainer.class.getName());
		DataSourceHolder.setDataSource(createDataSource());// 绑定数据源
		initFileResolver();
	}

	private DatabaseInstallerProcessor initInstaller() {
		DatabaseInstallerProcessor installer = new DatabaseInstallerProcessor();
		List installProcessors = new ArrayList();
		ProcessorManager processorManager = ProcessorManagerImpl
				.getProcessorManager();

		TableInstallProcessor tableInstallProcessor = new TableInstallProcessor();
		TableProcessor tableProcessor = createTableProcessor(processorManager);
		tableInstallProcessor.setTableProcessor(tableProcessor);
		installProcessors.add(tableInstallProcessor);

		ViewInstallProcessor viewInstallProcessor = new ViewInstallProcessor();
		ViewProcessor viewProcessor = createViewProcessor(processorManager);
		viewInstallProcessor.setViewProcessor(viewProcessor);
		installProcessors.add(viewInstallProcessor);

		InitDataInstallProcessor initDataInstallProcessor = new InitDataInstallProcessor();
		InitDataProcessor initDataProcessor = createInitDataProcessor(processorManager);
		initDataInstallProcessor.setInitDataProcessor(initDataProcessor);
		installProcessors.add(initDataInstallProcessor);

		ProcedureInstallProcessor procedureInstallProcessor = new ProcedureInstallProcessor();
		ProcedureProcessor procedureProcessor = createProcedureProcessor(processorManager);
		procedureInstallProcessor.setProcedureProcessor(procedureProcessor);
		installProcessors.add(procedureInstallProcessor);

		TriggerInstallProcessor triggerInstallProcessor = new TriggerInstallProcessor();
		TriggerProcessor triggerProcessor = createTriggerProcessor(processorManager);
		triggerInstallProcessor.setProcessor(triggerProcessor);
		installProcessors.add(triggerInstallProcessor);

		SequenceInstallProcessor sequenceInstallProcessor = new SequenceInstallProcessor();
		SequenceProcessor sequenceProcessor = createSequenceProcessor(processorManager);
		sequenceInstallProcessor.setProcessor(sequenceProcessor);
		installProcessors.add(sequenceInstallProcessor);

		CustomSqlInstallProcessor customSqlInstallProcessor = new CustomSqlInstallProcessor();
		CustomSqlProcessor customSqlProcessor = createCustomSqlProcessor();
		customSqlInstallProcessor.setCustomSqlProcessor(customSqlProcessor);
		installProcessors.add(customSqlInstallProcessor);
		installer.setInstallProcessors(installProcessors);
		return installer;
	}

	private String resolverLanguageType() {
		PathFilter filter = new PathFilter(applicationNode);
		XmlNode xmlNode = filter
				.findNode("/application/database-install-processor/database-installer");
		XmlNode node = xmlNode.getSubNode("database");
		String language = node.getAttribute("type");
		if (StringUtil.isBlank(language)) {
			language = "oracle";
		}
		return language;
	}

	/**
	 * 数据库安装启动
	 */
	public void installer() {
		LOGGER.logMessage(LogLevel.INFO, "开始启动数据库安装操作");
		databaseInstaller();
		LOGGER.logMessage(LogLevel.INFO, "数据库安装操作过程结束");

	}

	public Map> getChangeSqls() {
		LOGGER.logMessage(LogLevel.INFO, "开始检测数据库变化");
		Map> sqls = installer.getChangeSqls();
		LOGGER.logMessage(LogLevel.INFO, "检测数据库变化过程结束");
		return sqls;
	}
	
	public Map> getFullSqls() {
		LOGGER.logMessage(LogLevel.INFO, "开始生成全量sql");
		Map> sqls = installer.getFullSqls();
		LOGGER.logMessage(LogLevel.INFO, "生成全量sql结束");
		return sqls;
	}

	private void initFileResolver() {
		FileResolver fileResolver = createFileResolver();
		addI18nFileProcessor(fileResolver);
		addXstreamFileProcessor(fileResolver);
		addConstantFileProcessor(fileResolver);
		addStandardTypeFileProcessor(fileResolver);
		addErrorMessageFileProcessor(fileResolver);
		addBusinessTypeFileResolver(fileResolver);
		addStandardFieldFileResolver(fileResolver);
		addTableFileResolver(fileResolver);
		addInitDataFileResolver(fileResolver);
		addCustomSqlFileResolver(fileResolver);
		addViewFileResolver(fileResolver);
		addProcedureFileResolver(fileResolver);
		startFileResolver(fileResolver);
	}

	private void databaseInstaller() {
		installer.process();
	}

	private void startFileResolver(FileResolver fileResolver) {
		fileResolver.resolve();
	}

	private void addProcedureFileResolver(FileResolver fileResolver) {
		ProcedureFileResolver procedureFileResolver = new ProcedureFileResolver();
		procedureFileResolver.setProcedureProcessor(ProcedureProcessorImpl
				.getProcedureProcessor());
		fileResolver.addFileProcessor(procedureFileResolver);
	}

	private void addViewFileResolver(FileResolver fileResolver) {
		ViewFileResolver viewFileResolver = new ViewFileResolver();
		viewFileResolver.setViewProcessor(ViewProcessorImpl.getViewProcessor());
		fileResolver.addFileProcessor(viewFileResolver);
	}

	private void addCustomSqlFileResolver(FileResolver fileResolver) {

	}

	private void addInitDataFileResolver(FileResolver fileResolver) {
		InitDataFileResolver initDataFileResolver = new InitDataFileResolver();
		initDataFileResolver.setInitDataProcessor(InitDataProcessorImpl
				.getInitDataProcessor());
		fileResolver.addFileProcessor(initDataFileResolver);
	}

	private void addTableFileResolver(FileResolver fileResolver) {
		TableFileResolver tableFileResolver = new TableFileResolver();
		tableFileResolver.setTableProcessor(TableProcessorImpl
				.getTableProcessor());
		fileResolver.addFileProcessor(tableFileResolver);
	}

	private void addStandardFieldFileResolver(FileResolver fileResolver) {
		StandardFieldFileResolver standardFieldFileResolver = new StandardFieldFileResolver();
		standardFieldFileResolver
				.setStandardFieldProcessor(StandardFieldProcessorImpl
						.getStandardFieldProcessor());
		fileResolver.addFileProcessor(standardFieldFileResolver);
	}

	private void addBusinessTypeFileResolver(FileResolver fileResolver) {
		BusinessTypeFileResolver businessTypeFileResolver = new BusinessTypeFileResolver();
		businessTypeFileResolver
				.setBusinessTypeProcessor(BusinessTypeProcessorImpl
						.getBusinessTypeProcessor());
		fileResolver.addFileProcessor(businessTypeFileResolver);
	}

	private void addErrorMessageFileProcessor(FileResolver fileResolver) {
		ErrorMessageFileResolver errorMessageFileResolver = new ErrorMessageFileResolver();
		errorMessageFileResolver
				.setErrorMessageProcessor(ErrorMessageProcessorImpl
						.getErrorMessageProcessor());
		fileResolver.addFileProcessor(errorMessageFileResolver);
	}

	private void addStandardTypeFileProcessor(FileResolver fileResolver) {
		StandardTypeFileResolver standardTypeFileResolver = new StandardTypeFileResolver();
		standardTypeFileResolver
				.setStandardDataTypeProcessor(StandardTypeProcessorImpl
						.getStandardTypeProcessor());
		fileResolver.addFileProcessor(standardTypeFileResolver);
	}

	private void addConstantFileProcessor(FileResolver fileResolver) {
		ConstantFileResolver constantFileResolver = new ConstantFileResolver();
		constantFileResolver.setConstantProcessor(ConstantsProcessorImpl
				.getConstantProcessor());
		fileResolver.addFileProcessor(constantFileResolver);
	}

	private void addXstreamFileProcessor(FileResolver fileResolver) {
		fileResolver.addFileProcessor(new XStreamFileProcessor());
	}

	private void addI18nFileProcessor(FileResolver fileResolver) {
		fileResolver.addFileProcessor(new I18nFileProcessor());
	}

	private FileResolver createFileResolver() {
		FileResolver fileResolver = FileResolverFactory.getFileResolver();
		FileResolverUtil.addClassPathPattern(fileResolver);
		fileResolver
				.addResolvePath(FileResolverUtil.getClassPath(fileResolver));
		fileResolver.addResolvePath(FileResolverUtil.getWebClasses());
		try {
			fileResolver.addResolvePath(FileResolverUtil
					.getWebLibJars(fileResolver));
		} catch (Exception e) {
			LOGGER.errorMessage("为文件扫描器添加webLibJars时出现异常", e);
		}
		fileResolver.addIncludePathPattern(TINY_JAR_PATTERN);
		loadFileResolverConfig(fileResolver);
		return fileResolver;
	}

	private XmlNode getRootNode() {
		InputStream inputStream = DatabaseInstallerStart.class.getClassLoader()
				.getResourceAsStream(DEFAULT_CONFIG);
		if (inputStream == null) {
			inputStream = DatabaseInstallerStart.class
					.getResourceAsStream(DEFAULT_CONFIG);
		}
		String applicationConfig = null;
		try {
			applicationConfig = StreamUtil.readText(inputStream, "UTF-8", true);
		} catch (IOException e1) {
			LOGGER.errorMessage("读取application.xml文件出错", e1);
			throw new RuntimeException(e1);
		}
		XmlStringParser parser = new XmlStringParser();
		return parser.parse(applicationConfig).getRoot();
	}

	private DataSource createDataSource() {
		PathFilter filter = new PathFilter(applicationNode);
		XmlNode xmlNode = filter.findNode("/application/datasource");
		if (xmlNode != null) {
			String type = xmlNode.getAttribute(TYPE);
			try {
				DataSource dataSource = newDataSourceInstance(type);
				setProperties(xmlNode, dataSource);
				return dataSource;
			} catch (Exception e) {
				LOGGER.errorMessage("实例化数据源出错", e);
				throw new RuntimeException(e);
			}
		}
		return null;
	}

	private void setProperties(XmlNode node, Object object) {
		Map properties = new HashMap();
		List subNodes = node.getSubNodes(PROPERTY);
		if (!CollectionUtil.isEmpty(subNodes)) {
			for (XmlNode subNode : subNodes) {
				properties.put(subNode.getAttribute("name"),
						subNode.getAttribute("value"));
			}
		}
		BeanWrapper wrapperImpl = BeanWrapperHolder.getInstance()
				.getBeanWrapper(object);
		wrapperImpl.setPropertyValues(properties);
	}

	public static void setProperties(Object object,
			Map properties) {
		BeanWrapper wrapperImpl = BeanWrapperHolder.getInstance()
				.getBeanWrapper(object);
		for (String attribute : properties.keySet()) {
			try {
				String value = properties.get(attribute);
				wrapperImpl.setPropertyValue(attribute, value);
			} catch (Exception e) {
				throw new RuntimeException("设置对象属性出现异常", e);
			}
		}
	}

	private DataSource newDataSourceInstance(String type)
			throws ClassNotFoundException, InstantiationException,
			IllegalAccessException {
		Class dataSourceType = Class.forName(type);
		DataSource dataSource = (DataSource) dataSourceType.newInstance();
		return dataSource;
	}

	private void loadFileResolverConfig(FileResolver fileResolver) {
		PathFilter filter = new PathFilter(applicationNode);
		List classPathList = filter
				.findNodeList("/application/file-resolver-configuration/class-paths/class-path");
		for (XmlNode classPath : classPathList) {
			fileResolver.addResolvePath(classPath.getAttribute("path"));
		}
		List includePatternList = filter
				.findNodeList("/application/file-resolver-configuration/include-patterns/include-pattern");
		for (XmlNode includePatternNode : includePatternList) {
			fileResolver.addIncludePathPattern(includePatternNode
					.getAttribute("pattern"));
		}

	}

	private CustomSqlProcessor createCustomSqlProcessor() {
		CustomSqlProcessor customSqlProcessor = CustomSqlProcessorImpl
				.getCustomSqlProcessor();
		return customSqlProcessor;
	}

	private SequenceProcessor createSequenceProcessor(
			ProcessorManager processorManager) {
		SequenceProcessor sequenceProcessor = SequenceProcessorImpl
				.getSequenceProcessor();
		sequenceProcessor.setProcessorManager(processorManager);
		return sequenceProcessor;
	}

	private TriggerProcessor createTriggerProcessor(
			ProcessorManager processorManager) {
		TriggerProcessor triggerProcessor = TriggerProcessorImpl
				.getTriggerProcessor();
		triggerProcessor.setProcessorManager(processorManager);
		return triggerProcessor;
	}

	private ProcedureProcessor createProcedureProcessor(
			ProcessorManager processorManager) {
		ProcedureProcessor procedureProcessor = ProcedureProcessorImpl
				.getProcedureProcessor();
		procedureProcessor.setProcessorManager(processorManager);
		return procedureProcessor;
	}

	private InitDataProcessor createInitDataProcessor(
			ProcessorManager processorManager) {
		InitDataProcessor initDataProcessor = InitDataProcessorImpl
				.getInitDataProcessor();
		initDataProcessor.setProcessorManager(processorManager);
		return initDataProcessor;
	}

	private ViewProcessor createViewProcessor(ProcessorManager processorManager) {
		ViewProcessor viewProcessor = ViewProcessorImpl.getViewProcessor();
		viewProcessor.setProcessorManager(processorManager);
		return viewProcessor;
	}

	private TableProcessor createTableProcessor(
			ProcessorManager processorManager) {
		TableProcessor tableProcessor = TableProcessorImpl.getTableProcessor();
		tableProcessor.setProcessorManager(processorManager);
		return tableProcessor;
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy