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}