SDL_Android/SmartDeviceLinkAndroidProxy - added the correct version of the proxy
[profile/ivi/smartdevicelink.git] / SDL_Android / SmartDeviceLinkProxyAndroid / src / com / smartdevicelink / messageDispatcher / ProxyMessageDispatcher.java
1 package com.smartdevicelink.messageDispatcher;\r
2 \r
3 import java.util.Comparator;\r
4 import java.util.concurrent.PriorityBlockingQueue;\r
5 \r
6 import com.smartdevicelink.util.DebugTool;\r
7 \r
8 public class ProxyMessageDispatcher<messageType> {\r
9         PriorityBlockingQueue<messageType> _queue = null;\r
10         private Thread _messageDispatchingThread = null;\r
11         IDispatchingStrategy<messageType> _strategy = null;\r
12 \r
13         // Boolean to track if disposed\r
14         private Boolean dispatcherDisposed = false;\r
15         \r
16         public ProxyMessageDispatcher(String THREAD_NAME, Comparator<messageType> messageComparator, \r
17                         IDispatchingStrategy<messageType> strategy) {\r
18                 _queue = new PriorityBlockingQueue<messageType>(10, messageComparator);\r
19                 \r
20                 _strategy = strategy;\r
21                 \r
22                 // Create dispatching thread\r
23                 _messageDispatchingThread = new Thread(new Runnable() {public void run(){handleMessages();}});\r
24                 _messageDispatchingThread.setName(THREAD_NAME);\r
25                 _messageDispatchingThread.setDaemon(true);\r
26                 _messageDispatchingThread.start();\r
27         }\r
28         \r
29         public void dispose() {\r
30                 dispatcherDisposed = true;\r
31                 \r
32                 if(_messageDispatchingThread != null) {\r
33                         _messageDispatchingThread.interrupt();\r
34                         _messageDispatchingThread = null;\r
35                 }\r
36         }\r
37                 \r
38         private void handleMessages() {\r
39                 \r
40                 try {\r
41                         messageType thisMessage;\r
42                 \r
43                         while(dispatcherDisposed == false) {\r
44                                 thisMessage = _queue.take();\r
45                                 _strategy.dispatch(thisMessage);\r
46                         }\r
47                 } catch (InterruptedException e) {\r
48                         // Thread was interrupted by dispose() method, no action required\r
49                         return;\r
50                 } catch (Exception e) {\r
51                         DebugTool.logError("Error occurred dispating message.", e);\r
52                         _strategy.handleDispatchingError("Error occurred dispating message.", e);\r
53                 }\r
54         }\r
55                 \r
56         public void queueMessage(messageType message) {\r
57                 try {\r
58                         _queue.put(message);\r
59                 } catch(ClassCastException e) { \r
60                         _strategy.handleQueueingError("ClassCastException encountered when queueing message.", e);\r
61                 } catch(Exception e) {\r
62                         _strategy.handleQueueingError("Exception encountered when queueing message.", e);\r
63                 }\r
64         }\r
65 }\r