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.dtalk.redis.DefaultCustomRedisConfigProvider; 014import gu.simplemq.redis.JedisPoolLazy.PropName; 015import gu.simplemq.MessageQueueType; 016import gu.simplemq.redis.JedisUtils; 017import net.gdface.cli.BaseAppConfig; 018import static redis.clients.jedis.Protocol.*; 019 020import java.net.URI; 021import java.util.HashMap; 022import java.util.Map; 023 024import static gu.dtalk.client.SampleConsole.run; 025import static net.gdface.utils.ConditionChecks.checkTrue; 026 027/** 028 * 终端命令行配置参数 029 * @author guyadong 030 * 031 */ 032public class SampleConsoleRedisConfig extends BaseAppConfig implements SampleConsoleConstants { 033 @SuppressWarnings("serial") 034 private static final HashMap<String, Object> CONSTANTS = 035 new HashMap<String, Object>(){{put(IMPL_TYPE, MessageQueueType.REDIS);}}; 036 private final Map<PropName, Object> redisParameters = JedisUtils.initParameters(null); 037 038 private String mac; 039 private SampleConsoleRedisConfig() { 040 super(true); 041 options.addOption(Option.builder().longOpt(REDIS_HOST_OPTION_LONG) 042 .desc(REDIS_HOST_OPTION_DESC + DEFAULT_HOST).numberOfArgs(1).build()); 043 044 options.addOption(Option.builder().longOpt(REDIS_PORT_OPTION_LONG) 045 .desc(REDIS_PORT_OPTION_DESC + DEFAULT_PORT).numberOfArgs(1).type(Number.class).build()); 046 047 options.addOption(Option.builder(REDIS_PWD_OPTION).longOpt(REDIS_PWD_OPTION_LONG) 048 .desc(REDIS_PWD_OPTION_DESC).numberOfArgs(1).build()); 049 050 options.addOption(Option.builder().longOpt(REDIS_DB_OPTION_LONG) 051 .desc(REDIS_DB_OPTION_DESC + DEFAULT_DATABASE).numberOfArgs(1).type(Number.class).build()); 052 053 options.addOption(Option.builder().longOpt(REDIS_URI_OPTION_LONG) 054 .desc(REDIS_URI_OPTION_DESC).numberOfArgs(1).type(URI.class).build()); 055 056 options.addOption(Option.builder().longOpt(REDIS_TIMEOUT_OPTION_LONG) 057 .desc(REDIS_TIMEOUT_OPTION_DESC + DEFAULT_TIMEOUT + " ms.").numberOfArgs(1).type(Number.class).build()); 058 059 options.addOption(Option.builder().longOpt(DEVICE_MAC_OPTION_LONG) 060 .desc(DEVICE_MAC_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 070 } 071 @Override 072 public void loadConfig(Options options, CommandLine cmd) throws ParseException { 073 super.loadConfig(options, cmd); 074 075 redisParameters.put(PropName.host, getProperty(REDIS_HOST_OPTION_LONG)); 076 if(hasProperty(REDIS_PORT_OPTION_LONG)){ 077 redisParameters.put(PropName.port, ((Number)getProperty(REDIS_PORT_OPTION_LONG)).intValue()); 078 } 079 redisParameters.put(PropName.password, getProperty(REDIS_PWD_OPTION_LONG)); 080 if(hasProperty(REDIS_DB_OPTION_LONG)){ 081 redisParameters.put(PropName.database, ((Number)getProperty(REDIS_DB_OPTION_LONG)).intValue()); 082 } 083 redisParameters.put(PropName.uri, getProperty(REDIS_URI_OPTION_LONG)); 084 if(hasProperty(REDIS_TIMEOUT_OPTION_LONG)){ 085 redisParameters.put(PropName.timeout, ((Number)getProperty(REDIS_TIMEOUT_OPTION_LONG)).intValue()); 086 } 087 this.mac = (String) getProperty(DEVICE_MAC_OPTION_LONG); 088 if(!Strings.isNullOrEmpty(this.mac)){ 089 // 检查输入的mac地址字符串是否符合格式要求 090 checkTrue(OptionType.MAC.strValidator.apply(this.mac), 091 ParseException.class,"INVALID MAC address %s",this.mac); 092 this.mac = this.mac.replaceAll("[:-]", ""); 093 } 094 } 095 /** 096 * @return redisParameters 097 */ 098 public Map<PropName, Object> getRedisParameters() { 099 return Maps.filterValues(redisParameters, Predicates.notNull()); 100 } 101 /** 102 * @return 目标设备MAC地址 103 */ 104 public String getMac() { 105 return mac; 106 } 107 108 @Override 109 protected String getAppName() { 110 return SampleConsole.class.getSimpleName(); 111 } 112 @Override 113 protected String getHeader() { 114 return "Text terminal for Dtalk Device(Dtalk设备交互字符终端)"; 115 } 116 @Override 117 protected void doAfterParse() { 118 DefaultCustomRedisConfigProvider.initredisParameters(getRedisParameters()); 119 } 120 @Override 121 protected Map<String, Object> doGetConstants() { 122 return CONSTANTS; 123 } 124 public static void main(String []args){ 125 run(new SampleConsoleRedisConfig(), args); 126 } 127}