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