Project Moscato Team Messaging Middleware Implemetation Message Middleware by Golang Operate as Secure, Effectively
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

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. }