001package gu.dtalk.client; 002 003import org.apache.commons.cli.CommandLine; 004import org.apache.commons.cli.Option; 005import org.apache.commons.cli.Options; 006import org.apache.commons.cli.ParseException; 007 008import com.google.common.base.Predicates; 009import com.google.common.base.Strings; 010import com.google.common.collect.Maps; 011 012import gu.dtalk.OptionType; 013import gu.simplemq.redis.JedisPoolLazy.PropName; 014import gu.simplemq.redis.JedisUtils; 015import net.gdface.cli.BaseAppConfig; 016import static redis.clients.jedis.Protocol.*; 017 018import java.net.URI; 019import java.util.Map; 020 021import static com.google.common.base.Preconditions.*; 022/** 023 * 终端命令行配置参数 024 * @author guyadong 025 * 026 */ 027public class SampleConsoleConfig extends BaseAppConfig implements SampleConsoleConstants { 028 static final SampleConsoleConfig CONSOLE_CONFIG = new SampleConsoleConfig(); 029 private final Map<PropName, Object> redisParameters = JedisUtils.initParameters(null); 030 031 private String password; 032 private String mac; 033 private boolean trace; 034 public SampleConsoleConfig() { 035 options.addOption(Option.builder().longOpt(REDIS_HOST_OPTION_LONG) 036 .desc(REDIS_HOST_OPTION_DESC + DEFAULT_HOST).numberOfArgs(1).build()); 037 038 options.addOption(Option.builder().longOpt(REDIS_PORT_OPTION_LONG) 039 .desc(REDIS_PORT_OPTION_DESC + DEFAULT_PORT).numberOfArgs(1).type(Number.class).build()); 040 041 options.addOption(Option.builder().longOpt(REDIS_PWD_OPTION_LONG) 042 .desc(REDIS_PWD_OPTION_DESC).numberOfArgs(1).build()); 043 044 options.addOption(Option.builder().longOpt(REDIS_DB_OPTION_LONG) 045 .desc(REDIS_DB_OPTION_DESC + DEFAULT_DATABASE).numberOfArgs(1).type(Number.class).build()); 046 047 options.addOption(Option.builder().longOpt(REDIS_URI_OPTION_LONG) 048 .desc(REDIS_URI_OPTION_DESC).numberOfArgs(1).type(URI.class).build()); 049 050 options.addOption(Option.builder().longOpt(REDIS_TIMEOUT_OPTION_LONG) 051 .desc(REDIS_TIMEOUT_OPTION_DESC + DEFAULT_TIMEOUT + " ms.").numberOfArgs(1).type(Number.class).build()); 052 053 options.addOption(Option.builder().longOpt(DEVICE_MAC_OPTION_LONG) 054 .desc(DEVICE_MAC_OPTION_DESC ).numberOfArgs(1).build()); 055 056 options.addOption(Option.builder(TRACE_OPTION).longOpt(TRACE_OPTION_LONG) 057 .desc(TRACE_OPTION_DESC ).hasArg(false).build()); 058 059 options.addOption(Option.builder().longOpt(CONNEC_PWD_OPTION_LONG) 060 .desc(CONNEC_PWD_OPTION_DESC ).numberOfArgs(1).build()); 061 062 defaultValue.setProperty(REDIS_HOST_OPTION_LONG, null); 063 defaultValue.setProperty(REDIS_PORT_OPTION_LONG, redisParameters.get(PropName.port)); 064 defaultValue.setProperty(REDIS_PWD_OPTION_LONG, null); 065 defaultValue.setProperty(REDIS_DB_OPTION_LONG, redisParameters.get(PropName.database)); 066 defaultValue.setProperty(REDIS_URI_OPTION_LONG, null); 067 defaultValue.setProperty(REDIS_TIMEOUT_OPTION_LONG, redisParameters.get(PropName.timeout)); 068 defaultValue.setProperty(DEVICE_MAC_OPTION_LONG, ""); 069 defaultValue.setProperty(CONNEC_PWD_OPTION_LONG, ""); 070 071 } 072 @Override 073 public void loadConfig(Options options, CommandLine cmd) throws ParseException { 074 super.loadConfig(options, cmd); 075 076 redisParameters.put(PropName.host, getProperty(REDIS_HOST_OPTION_LONG)); 077 if(hasProperty(REDIS_PORT_OPTION_LONG)){ 078 redisParameters.put(PropName.port, ((Number)getProperty(REDIS_PORT_OPTION_LONG)).intValue()); 079 } 080 redisParameters.put(PropName.password, getProperty(REDIS_PWD_OPTION_LONG)); 081 if(hasProperty(REDIS_DB_OPTION_LONG)){ 082 redisParameters.put(PropName.database, ((Number)getProperty(REDIS_DB_OPTION_LONG)).intValue()); 083 } 084 redisParameters.put(PropName.uri, getProperty(REDIS_URI_OPTION_LONG)); 085 if(hasProperty(REDIS_TIMEOUT_OPTION_LONG)){ 086 redisParameters.put(PropName.timeout, ((Number)getProperty(REDIS_TIMEOUT_OPTION_LONG)).intValue()); 087 } 088 this.password = getProperty(CONNEC_PWD_OPTION_LONG); 089 this.mac = (String) getProperty(DEVICE_MAC_OPTION_LONG); 090 if(!Strings.isNullOrEmpty(this.mac)){ 091 // 检查输入的mac地址字符串是否符合格式要求 092 checkArgument(OptionType.MAC.strValidator.apply(this.mac),"INVALID MAC address %s",this.mac); 093 this.mac = this.mac.replaceAll("[:-]", ""); 094 } 095 this.trace = getProperty(TRACE_OPTION_LONG); 096 097 } 098 /** 099 * @return redisParameters 100 */ 101 public Map<PropName, Object> getRedisParameters() { 102 return Maps.filterValues(redisParameters, Predicates.notNull()); 103 } 104 public String getConnectPassword() { 105 return password; 106 } 107 /** 108 * @return 目标设备MAC地址 109 */ 110 public String getMac() { 111 return mac; 112 } 113 /** 114 * @return 发生异常时是否输出详细堆栈信息 115 */ 116 public boolean isTrace() { 117 return trace; 118 } 119 @Override 120 protected String getAppName() { 121 return SampleConsole.class.getSimpleName(); 122 } 123 @Override 124 protected String getHeader() { 125 return "Text terminal for Dtalk Device(Dtalk设备交互字符终端)"; 126 } 127}