Project Moscato Team Messaging Middleware Implemetation Message Middleware by Golang Operate as Secure, Effectively
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

matching.go 8.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. package modules
  2. import (
  3. "errors"
  4. )
  5. type sub_manager struct {
  6. list topicList
  7. /* Manage sub# */
  8. count_sub int // Subscription #
  9. emptylist []int // To administrate sub #
  10. ip2sub map[string][]int // ip2sub[ip] = sub# ...
  11. sub2ip map[int]string // sub2ip[sub#] = ip
  12. sub2node map[int][]nodeInfo // sub2node[sub#] = node_addr ...
  13. israngesub map[int]bool // To manage when deleted
  14. }
  15. type nodeInfo struct{
  16. valNodeList []*valueNode
  17. topic []int64
  18. }
  19. func (manager *sub_manager) Initialize() {
  20. // Some initialize
  21. manager.ip2sub = make(map[string][]int)
  22. manager.sub2ip = make(map[int]string)
  23. manager.sub2node = make(map[int][]nodeInfo)
  24. manager.israngesub = make(map[int]bool)
  25. }
  26. func newSubmng() *sub_manager {
  27. subMng := &sub_manager{}
  28. subMng.Initialize()
  29. return subMng
  30. }
  31. func (manager *sub_manager) isDuplicated(msg MsgUnit) bool{
  32. from := msg.(SubscriptionMsg).From
  33. topic := msg.(SubscriptionMsg).Topic
  34. value := msg.(SubscriptionMsg).Value
  35. operator := msg.(SubscriptionMsg).Operator
  36. subList := manager.ip2sub[from]
  37. canFind := false
  38. for i := 0; i < len(subList) && canFind == false ; i++{
  39. sub := subList[i]
  40. nodeinfoList := manager.sub2node[sub]
  41. for j := 0; j < len(nodeinfoList); j++{
  42. node := nodeinfoList[j]
  43. if Compare(node.topic, topic) == 0 {
  44. cnt := 0
  45. if len(operator) == 1{
  46. valPtr := node.valNodeList[0]
  47. if Compare(valPtr.val ,value) == 0{
  48. op := operator[0]
  49. cnt += findOperatorList(op, valPtr, sub, true)
  50. }
  51. } else { // value가 숫자일 때
  52. leftop := operator[0]
  53. logicalop := operator[1]
  54. rightop := operator[2]
  55. leftValuePtr := node.valNodeList[0]
  56. rightValuePtr := node.valNodeList[1]
  57. nodeValList := []int64{leftValuePtr.val[0], rightValuePtr.val[0]}
  58. if Compare(nodeValList, value) == 0 {
  59. if logicalop == "&&" {
  60. cnt += findOperatorList(leftop, leftValuePtr, sub, false)
  61. cnt += findOperatorList(rightop, rightValuePtr, sub, false)
  62. } else {
  63. cnt += findOperatorList(leftop, leftValuePtr, sub, true)
  64. cnt += findOperatorList(rightop, rightValuePtr, sub, true)
  65. }
  66. }
  67. }
  68. if cnt == len(node.valNodeList){
  69. canFind = true
  70. break
  71. }
  72. }
  73. }
  74. }
  75. return canFind
  76. }
  77. // Returns if sub exists in the operator list in the same node as op.
  78. func findOperatorList(op string, node *valueNode, sub int, issingle bool) int {
  79. ret := -1
  80. if issingle == true {
  81. switch op {
  82. case "<":
  83. ret = findSub(node.single2sub_s, sub)
  84. case "<=":
  85. ret = findSub(node.single2sub_es, sub)
  86. case ">":
  87. ret = findSub(node.single2sub_b, sub)
  88. case ">=":
  89. ret = findSub(node.single2sub_eb, sub)
  90. case "==":
  91. ret = findSub(node.single2sub_e, sub)
  92. }
  93. } else {
  94. switch op {
  95. case "<":
  96. ret = findSub(node.range2sub_s, sub)
  97. case "<=":
  98. ret = findSub(node.range2sub_es, sub)
  99. case ">":
  100. ret = findSub(node.range2sub_b, sub)
  101. case ">=":
  102. ret = findSub(node.range2sub_eb, sub)
  103. }
  104. }
  105. if ret < 0{
  106. return 0
  107. } else{
  108. return 1
  109. }
  110. }
  111. // ### To Insert sub#
  112. func (manager *sub_manager) addSubscription(msg MsgUnit) error {
  113. topic := msg.(SubscriptionMsg).Topic
  114. value := msg.(SubscriptionMsg).Value
  115. operator := msg.(SubscriptionMsg).Operator
  116. subnumber := 0
  117. // 0. Check the same ip and sub information
  118. if manager.isDuplicated(msg) == true {
  119. return errors.New("Duplicater Subscription")
  120. }
  121. // 1. Mapping incoming IP address to sub #
  122. if len(manager.emptylist) == 0 {
  123. subnumber = manager.count_sub
  124. manager.ip2sub[msg.(SubscriptionMsg).From] = append(manager.ip2sub[msg.(SubscriptionMsg).From], manager.count_sub)
  125. manager.sub2ip[subnumber] = msg.(SubscriptionMsg).From
  126. manager.count_sub++
  127. } else {
  128. subnumber := manager.emptylist[len(manager.emptylist)-1]
  129. manager.emptylist = manager.emptylist[:len(manager.emptylist)-1]
  130. manager.ip2sub[msg.(SubscriptionMsg).From] = append(manager.ip2sub[msg.(SubscriptionMsg).From], subnumber)
  131. manager.sub2ip[subnumber] = msg.(SubscriptionMsg).From
  132. }
  133. nameptr := manager.list.head
  134. findOk := false
  135. // * 2. Add Subscription
  136. // Find name in namelist, add if not found
  137. for nameptr != nil {
  138. if Compare(nameptr.topic, topic) == 0 {
  139. findOk = true
  140. break
  141. }
  142. nameptr = nameptr.next
  143. }
  144. if !findOk {
  145. manager.list.addTopicNode(topic)
  146. nameptr = manager.list.tail
  147. }
  148. var addValNodeList []*valueNode
  149. // Add Value to list[name]
  150. if len(operator) == 1 { // if single expression
  151. valptr := nameptr.list.getValueNodePos(value)
  152. if valptr == nil {
  153. nameptr.list.addValueNode(value)
  154. valptr = nameptr.list.tail
  155. }
  156. addValNodeList = append(addValNodeList, valptr)
  157. manager.sub2node[subnumber] = append(manager.sub2node[subnumber], nodeInfo{addValNodeList, topic})
  158. valptr.insertSub(operator[0], subnumber, true)
  159. return nil // AddSubscription ok
  160. } else {
  161. // {">" "&&" "<"}
  162. // For compound expressions bounded by '&&' and '||'
  163. // (ex) { (234 < x) && (x <= 1293) } , { (234 < x) || ( x < 1293) }
  164. logical_operator := operator[2]
  165. // Find ValueNode = (namelist[name].list.val == Value)
  166. valptr1 := nameptr.list.getValueNodePos([]int64{value[0]})
  167. valptr2 := nameptr.list.getValueNodePos([]int64{value[1]})
  168. if valptr1 == nil {
  169. nameptr.list.addValueNode([]int64{value[0]})
  170. valptr1 = nameptr.list.tail
  171. }
  172. if valptr2 == nil {
  173. nameptr.list.addValueNode([]int64{value[1]})
  174. valptr2 = nameptr.list.tail
  175. }
  176. addValNodeList = append(addValNodeList, valptr1)
  177. addValNodeList = append(addValNodeList, valptr2)
  178. manager.sub2node[subnumber] = append(manager.sub2node[subnumber], nodeInfo{addValNodeList, topic})
  179. manager.sub2node[subnumber] = append(manager.sub2node[subnumber], nodeInfo{addValNodeList, topic})
  180. if logical_operator == "&&" {
  181. // If they are enclosed in '&&' -> Insert Value to range_operator_list
  182. manager.israngesub[subnumber] = true
  183. valptr1.insertSub(operator[0], subnumber, false)
  184. valptr2.insertSub(operator[2], subnumber, false)
  185. } else {
  186. // if they are enclosed in '||' -> Insert Value to single_operator_list
  187. valptr1.insertSub(operator[0], subnumber, true)
  188. valptr2.insertSub(operator[2], subnumber, true)
  189. }
  190. return nil // addSubscription ok
  191. }
  192. return errors.New("Can't addSubscription")
  193. }
  194. // To delete subscription
  195. func (manager *sub_manager) delete(from string) error {
  196. ip := from
  197. cand := manager.ip2sub[ip]
  198. for i := 0; i < len(cand); i++ {
  199. sub := cand[i]
  200. for j := 0; j < len(manager.sub2node[sub]); j++ {
  201. nodeinfo := manager.sub2node[sub][j]
  202. node := nodeinfo.valNodeList
  203. if manager.israngesub[sub] {
  204. for k := 0; k < len(node); k++ {
  205. pos := findSub(node[k].range2sub_s, sub)
  206. if pos != -1 {
  207. node[k].range2sub_s = remove(node[k].range2sub_s, pos)
  208. manager.emptylist = append(manager.emptylist, sub)
  209. }
  210. pos = findSub(node[k].range2sub_es, sub)
  211. if pos != -1 {
  212. node[k].range2sub_es = remove(node[k].range2sub_es, pos)
  213. manager.emptylist = append(manager.emptylist, sub)
  214. }
  215. pos = findSub(node[k].range2sub_b, sub)
  216. if pos != -1 {
  217. node[k].range2sub_b = remove(node[k].range2sub_b, pos)
  218. manager.emptylist = append(manager.emptylist, sub)
  219. }
  220. pos = findSub(node[k].range2sub_eb, sub)
  221. if pos != -1 {
  222. node[k].range2sub_eb = remove(node[k].range2sub_eb, pos)
  223. manager.emptylist = append(manager.emptylist, sub)
  224. }
  225. isempty := node[k].isEmpty()
  226. // Delete if Value Node is empty
  227. if isempty && node[k] != nil {
  228. prev_node := node[k].prev
  229. next_node := node[k].next
  230. prev_node.next = node[k].next
  231. next_node.prev = node[k].prev
  232. }
  233. }
  234. } else {
  235. for k := 0; k < len(node); k++ {
  236. pos := findSub(node[k].single2sub_s, sub)
  237. if pos != -1 {
  238. node[k].single2sub_s = remove(node[k].single2sub_s, pos)
  239. manager.emptylist = append(manager.emptylist, sub)
  240. }
  241. pos = findSub(node[k].single2sub_es, sub)
  242. if pos != -1 {
  243. node[k].single2sub_es = remove(node[k].single2sub_es, pos)
  244. manager.emptylist = append(manager.emptylist, sub)
  245. }
  246. pos = findSub(node[k].single2sub_b, sub)
  247. if pos != -1 {
  248. node[k].single2sub_b = remove(node[k].single2sub_b, pos)
  249. manager.emptylist = append(manager.emptylist, sub)
  250. }
  251. pos = findSub(node[k].single2sub_eb, sub)
  252. if pos != -1 {
  253. node[k].single2sub_eb = remove(node[k].single2sub_eb, pos)
  254. manager.emptylist = append(manager.emptylist, sub)
  255. }
  256. pos = findSub(node[k].single2sub_e, sub)
  257. if pos != -1 {
  258. node[k].single2sub_e = remove(node[k].single2sub_e, pos)
  259. manager.emptylist = append(manager.emptylist, sub)
  260. }
  261. isempty := node[k].isEmpty()
  262. // Delete if Value Node is empty
  263. if isempty && node[k] != nil {
  264. prevNode := node[k].prev
  265. nextNode := node[k].next
  266. prevNode.next = node[k].next
  267. nextNode.prev = node[k].prev
  268. }
  269. }
  270. }
  271. }
  272. manager.ip2sub[ip] = nil // Delete sub#s mapped to Ip address
  273. return nil
  274. }
  275. return errors.New("Don't Exist Subscription to delete")
  276. }