/* * Copyright (c) 2002-2012 Alibaba Group Holding Limited. * All rights reserved. * * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 * * 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. */ package com.alibaba.antx.config.wizard.text; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import com.alibaba.antx.config.ConfigConstant; import com.alibaba.antx.config.ConfigSettings; import com.alibaba.antx.config.descriptor.ConfigDescriptor; import com.alibaba.antx.config.entry.ConfigEntry; import com.alibaba.antx.config.props.PropertiesSet; public class ConfigWizardLoader { private final ConfigSettings settings; private final List configEntries; private final ConfigDescriptor inlineDescriptor; public ConfigWizardLoader(ConfigSettings settings, List configEntries) { this.settings = settings; this.configEntries = configEntries; this.inlineDescriptor = null; } public ConfigWizardLoader(ConfigSettings settings, ConfigDescriptor inlineDescription) { this.settings = settings; this.configEntries = null; this.inlineDescriptor = inlineDescription; } public void loadAndStart() { // 使用wizard验证并和用户交互 ConfigDescriptor[] descriptors = getAllDescriptors(); PropertiesSet props = settings.getPropertiesSet(); ConfigWizard wizard = new ConfigWizard(descriptors, props, settings.getCharset()); boolean valid = wizard.validate(); String interactiveMode = settings.getInteractiveMode(); boolean interactiveAuto = ConfigConstant.INTERACTIVE_AUTO.equals(interactiveMode); boolean interactiveOn = ConfigConstant.INTERACTIVE_ON.equals(interactiveMode); if (interactiveOn || interactiveAuto && !valid) { if (!valid) { StringBuffer confirm = new StringBuffer(); confirm.append("╭───────────────────────┈┈┈┈\n"); confirm.append("│\n"); confirm.append("│ 您的配置文件需要被更新:\n"); confirm.append("│\n"); confirm.append("│ ").append(props.getUserPropertiesFile().getURI()).append("\n"); confirm.append("│\n"); confirm.append("│ 这个文件包括了您个人的特殊设置,\n"); confirm.append("│ 包括服务器端口、您的邮件地址等内容。\n"); confirm.append("│\n"); confirm.append("└───────┈┈┈┈┈┈┈┈┈┈┈\n"); confirm.append("\n").append(" 如果不更新此文件,可能会导致配置文件的内容不完整。\n"); confirm.append(" 您需要现在更新此文件吗?"); wizard.setConfirmMessage(confirm.toString()); } wizard.start(); valid = wizard.validate(); } // 设置valid变量为true,或抛出异常 if (!valid) { throw new ConfigWizardException("因为配置文件“" + props.getUserPropertiesFile().getURI() + "”未准备好,所以无法继续下去!"); } } /** * 取得所有的descriptors。 * * @return 所有descriptors的数组 */ private ConfigDescriptor[] getAllDescriptors() { if (configEntries != null) { List descriptors = new ArrayList(); for (Iterator i = configEntries.iterator(); i.hasNext(); ) { ConfigEntry entry = (ConfigEntry) i.next(); addConfigEntryRecursive(entry, descriptors); } return (ConfigDescriptor[]) descriptors.toArray(new ConfigDescriptor[descriptors.size()]); } else if (inlineDescriptor != null) { return new ConfigDescriptor[] { inlineDescriptor }; } else { return new ConfigDescriptor[0]; } } /** * 将entry及所有子entry中的descriptors加入列表中。 * * @param entry config entry * @param descriptors descriptors列表 */ private void addConfigEntryRecursive(ConfigEntry entry, List descriptors) { if (entry == null) { return; } ConfigDescriptor[] entryDescriptors = entry.getGenerator().getConfigDescriptors(); for (ConfigDescriptor entryDescriptor : entryDescriptors) { descriptors.add(entryDescriptor); } ConfigEntry[] subEntries = entry.getSubEntries(); for (ConfigEntry subEntrie : subEntries) { addConfigEntryRecursive(subEntrie, descriptors); } } }