001package net.gdface.facelog.client;
002
003import java.net.URI;
004import java.net.URL;
005import java.util.List;
006import java.util.Map;
007
008import com.google.common.base.Function;
009import com.google.common.base.Supplier;
010import com.google.common.util.concurrent.Futures;
011import com.google.common.util.concurrent.ListenableFuture;
012
013import gu.dtalk.MenuItem;
014import gu.dtalk.cmd.CmdManager;
015import gu.dtalk.cmd.TaskManager;
016import gu.dtalk.engine.BaseDispatcher;
017import gu.dtalk.engine.TaskDispatcher;
018import gu.simplemq.IMessageAdapter;
019import gu.simplemq.IMessageQueueFactory;
020import net.gdface.facelog.MQParam;
021import net.gdface.facelog.Token;
022import net.gdface.facelog.client.ClientExtendTools.ParameterSupplier;
023import net.gdface.facelog.client.dtalk.DtalkEngineForFacelog;
024import net.gdface.facelog.hb.DynamicChannelListener;
025import net.gdface.facelog.hb.DeviceHeartbeat;
026import net.gdface.facelog.thrift.IFaceLogThriftClientAsync;
027import net.gdface.thrift.ClientFactory;
028
029public class IFaceLogClientAsync extends IFaceLogThriftClientAsync {
030        private final ClientExtendTools clientTools;
031        public IFaceLogClientAsync(ClientFactory factory) {
032                super(factory);
033                clientTools = new ClientExtendTools(this);
034        }       
035    /**
036     * @param host RPC service host
037     * @param port RPC service port 
038     */
039    public IFaceLogClientAsync(String host,int port) {
040        this(ClientFactory.builder().setHostAndPort(host,port));
041    }
042    /**
043     * test if connectable for RPC service
044     * @return return {@code true} if connectable ,otherwise {@code false}
045     */
046    public boolean testConnect(){
047        return getFactory().testConnect();
048    }
049        /**
050         * 如果{@code host}是本机地址则用facelog服务主机名替换
051         * @param host
052         * @return {@code host} or host in {@link #factory}
053         */
054        public String insteadHostIfLocalhost(String host) {
055                return clientTools.insteadHostIfLocalhost(host);
056        }
057        /**
058         * 如果{@code uri}的主机名是本机地址则用facelog服务主机名替换
059         * @param uri
060         * @return {@code uri} or new URI instead with host of facelog
061         */
062        public URI insteadHostIfLocalhost(URI uri) {
063                return clientTools.insteadHostIfLocalhost(uri);
064        }
065        /**
066         * 如果{@code url}的主机名是本机地址则用facelog服务主机名替换
067         * @param url
068         * @return {@code url} or new URI instead with host of facelog
069         */
070        public URL insteadHostIfLocalhost(URL url) {
071                return clientTools.insteadHostIfLocalhost(url);
072        }
073        /**
074         * @param deviceId
075         * @return Supplier instance
076         * @see net.gdface.facelog.client.ClientExtendTools#getDeviceGroupIdSupplier(int)
077         */
078        public Supplier<Integer> getDeviceGroupIdSupplier(int deviceId) {
079                return clientTools.getDeviceGroupIdSupplier(deviceId);
080        }
081        /**
082         * @param personId
083         * @return Supplier instance
084         * @see net.gdface.facelog.client.ClientExtendTools#getPersonGroupBelonsSupplier(int)
085         */
086        public Supplier<List<Integer>> getPersonGroupBelonsSupplier(int personId) {
087                return clientTools.getPersonGroupBelonsSupplier(personId);
088        }
089        /**
090         * @param token
091         * @return CmdManager instance
092         * @see net.gdface.facelog.client.ClientExtendTools#makeCmdManager(net.gdface.facelog.Token)
093         */
094        public CmdManager makeCmdManager(Token token) {
095                return clientTools.makeCmdManager(token);
096        }
097        /**
098         * @param token
099         * @param cmdpath 设备(菜单)命令路径
100         * @param taskQueueSupplier
101         * @return TaskManager instance
102         * @see net.gdface.facelog.client.ClientExtendTools#makeTaskManager(Token, String, Supplier)
103         */
104        public TaskManager makeTaskManager(Token token, String cmdpath, Supplier<String> taskQueueSupplier) {
105                return clientTools.makeTaskManager(token, null, taskQueueSupplier);
106        }
107        /**
108         * @param token
109         * @return BaseDispatcher instance
110         * @see net.gdface.facelog.client.ClientExtendTools#makeCmdDispatcher(net.gdface.facelog.Token)
111         */
112        public BaseDispatcher makeCmdDispatcher(Token token) {
113                return clientTools.makeCmdDispatcher(token);
114        }
115        /**
116         * @param token
117         * @param taskQueueSupplier
118         * @return TaskDispatcher instance
119         * @see net.gdface.facelog.client.ClientExtendTools#makeTaskDispatcher(Token, Supplier)
120         */
121        protected TaskDispatcher makeTaskDispatcher(Token token, Supplier<String> taskQueueSupplier) {
122                return clientTools.makeTaskDispatcher(token, taskQueueSupplier);
123        }
124        /**
125         * @param duration
126         * @param token
127         * @return Supplier instance
128         * @see net.gdface.facelog.client.ClientExtendTools#getAckChannelSupplier(int, net.gdface.facelog.Token)
129         */
130        public Supplier<String> getAckChannelSupplier(int duration, Token token) {
131                return clientTools.getAckChannelSupplier(duration,token);
132        }
133        /**
134         * @param token
135         * @return Supplier instance
136         * @see net.gdface.facelog.client.ClientExtendTools#getAckChannelSupplier(net.gdface.facelog.Token)
137         */
138        public Supplier<String> getAckChannelSupplier(Token token) {
139                return clientTools.getAckChannelSupplier(token);
140        }
141        /**
142         * @param token
143         * @return Supplier instance
144         * @see net.gdface.facelog.client.ClientExtendTools#getCmdSnSupplier(net.gdface.facelog.Token)
145         */
146        public Supplier<Integer> getCmdSnSupplier(Token token) {
147                return clientTools.getCmdSnSupplier(token);
148        }
149
150        /**
151         * @param deviceToken
152         * @param rootMenu
153         * @return DtalkEngineForFacelog instance
154         * @see net.gdface.facelog.client.ClientExtendTools#initDtalkEngine(net.gdface.facelog.Token, gu.dtalk.MenuItem)
155         */
156        public DtalkEngineForFacelog initDtalkEngine(Token deviceToken, MenuItem rootMenu) {
157                return clientTools.initDtalkEngine(deviceToken, rootMenu);
158        }
159        /**
160         * @param token
161         * @see net.gdface.facelog.client.ClientExtendTools#initMQDefaultFactory(net.gdface.facelog.Token)
162         */
163        public void initMQDefaultFactory(Token token) {
164                clientTools.initMQDefaultFactory(token);
165        }
166        /**
167         * 转换参数中的主机名
168         * @see net.gdface.facelog.thrift.IFaceLogThriftClientAsync#getRedisParameters(net.gdface.facelog.Token)
169         * @see ClientExtendTools#insteadHostOfMQParamIfLocalhost(Map)
170         */
171        @Override
172        public ListenableFuture<Map<MQParam, String>> getRedisParameters(Token token) {
173                ListenableFuture<Map<MQParam, String>> feature = super.getRedisParameters(token);
174                return Futures.transform(feature, 
175                        new Function<Map<MQParam, String>, Map<MQParam, String>>() {
176
177                        @Override
178                        public Map<MQParam, String> apply(Map<MQParam, String> input) {
179                                return clientTools.insteadHostOfMQParamIfLocalhost(input);
180                        }
181                });
182        }
183        /**
184         * @param token
185         * @return 返回一个获取redis参数的{@link Supplier}实例
186         * @see net.gdface.facelog.client.ClientExtendTools#getRedisParametersSupplier(net.gdface.facelog.Token)
187         */
188        public Supplier<Map<MQParam, String>> getRedisParametersSupplier(Token token) {
189                return clientTools.getRedisParametersSupplier(token);
190        }
191        /**
192         * @param token
193         * @return 返回一个获取消息系统参数的{@link Supplier}实例
194         * @see net.gdface.facelog.client.ClientExtendTools#getMessageQueueParametersSupplier(net.gdface.facelog.Token)
195         */
196        public Supplier<Map<MQParam, String>> getMessageQueueParametersSupplier(Token token) {
197                return clientTools.getMessageQueueParametersSupplier(token);
198        }
199        /**
200         * @param token
201         * @return 返回一个获取设备心跳实时监控通道名的{@link Supplier}实例
202         * @see net.gdface.facelog.client.ClientExtendTools#getMonitorChannelSupplier(net.gdface.facelog.Token)
203         */
204        public Supplier<String> getMonitorChannelSupplier(Token token) {
205                return clientTools.getDynamicParamSupplier(MQParam.HB_MONITOR_CHANNEL,token);
206        }
207        /**
208         * @param mqParam 
209         * @param token 访问令牌
210         * @return 返回一个动态获取指定消息参数的{@link Supplier}实例
211         */
212        public Supplier<String> getDynamicParamSupplier(MQParam mqParam,Token token){
213                return clientTools.getDynamicParamSupplier(mqParam,token);
214        }
215        /**
216         * 返回有效令牌的{@link Supplier}实例<br>
217         * @return {@link Supplier}实例
218         */
219        public Supplier<Token> getTokenSupplier() {
220                return clientTools.getTokenSupplier();
221        }
222
223        /**
224         * 创建动态频道名侦听对象
225         * 动态频道是指定当服务重启后,频道名会动态改变的频道,
226         * 对于这种频道,通过侦听服务心跳判断服务是否重启,如果重启则重新获取频道名继续保持侦听
227         * @param listener
228         * @param channelType 频道消息数据类型
229         * @param mqParam 参数名
230         * @param token
231         * @param factory 消息系统工厂类实例
232         * @return 返回{@link DynamicChannelListener}实例
233         */
234        public <T>DynamicChannelListener<T> makeDynamicChannelListener(IMessageAdapter<T> listener,Class<T> channelType, MQParam mqParam, Token token, IMessageQueueFactory factory) {
235                return clientTools.makeDynamicChannelListener(listener, channelType, mqParam, token, factory);
236        }
237        /**
238         * 创建设备心跳包发送对象<br>
239         * {@link DeviceHeartbeat}为单实例,该方法只能调用一次
240         * @param deviceID 设备ID
241         * @param token 设备令牌
242         * @return {@link DeviceHeartbeat}实例
243         */
244        public DeviceHeartbeat makeHeartbeat(int deviceID, Token token) {
245                return clientTools.makeHeartbeat(deviceID, token);
246        }
247        /**
248         * @param tokenHelper 要设置的 tokenHelper
249         * @return 当前{@link IFaceLogClientAsync}实例
250         */
251        public IFaceLogClientAsync setTokenHelper(TokenHelper tokenHelper) {
252                clientTools.setTokenHelper(tokenHelper);
253                return this;
254        }
255        /**
256         * 启动服务心跳侦听器<br>
257         * 启动侦听器后CLIENT端才能感知服务端断线,并执行相应动作。
258         * 调用前必须先执行{@link #setTokenHelper(TokenHelper)}初始化
259         * @param token 令牌
260         * @param initMQDefaultFactoryInstance 是否初始化 {@link IMessageQueueFactory}默认实例
261         * @return 返回当前{@link IFaceLogClientAsync}实例
262         */
263        public IFaceLogClientAsync startServiceHeartbeatListener(Token token, boolean initMQDefaultFactoryInstance) {
264                clientTools.startServiceHeartbeatListener(token, initMQDefaultFactoryInstance);
265                return this;
266        }
267        /**
268         * @param task
269         * @param token
270         * @return ParameterSupplier instance
271         * @see net.gdface.facelog.client.ClientExtendTools#getTaskQueueSupplier(java.lang.String, net.gdface.facelog.Token)
272         */
273        public ParameterSupplier<String> getTaskQueueSupplier(String task, Token token) {
274                return clientTools.getTaskQueueSupplier(task, token);
275        }
276        /**
277         * @param task
278         * @param sdkVersion
279         * @param token
280         * @return ParameterSupplier instance
281         * @see net.gdface.facelog.client.ClientExtendTools#getSdkTaskQueueSupplier(java.lang.String, java.lang.String, net.gdface.facelog.Token)
282         */
283        public ParameterSupplier<String> getSdkTaskQueueSupplier(String task, String sdkVersion, Token token) {
284                return clientTools.getSdkTaskQueueSupplier(task, sdkVersion, token);
285        }
286}