You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

expression_resolver.go 3.4 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. /*
  2. * Licensed to the Apache Software Foundation (ASF) under one or more
  3. * contributor license agreements. See the NOTICE file distributed with
  4. * this work for additional information regarding copyright ownership.
  5. * The ASF licenses this file to You under the Apache License, Version 2.0
  6. * (the "License"); you may not use this file except in compliance with
  7. * the License. You may obtain a copy of the License at
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS,
  13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. */
  17. package expr
  18. import (
  19. "errors"
  20. "strings"
  21. )
  22. type ExpressionResolver interface {
  23. Expression(expressionStr string) Expression
  24. ExpressionFactoryManager() ExpressionFactoryManager
  25. SetExpressionFactoryManager(expressionFactoryManager ExpressionFactoryManager)
  26. }
  27. type DefaultExpressionResolver struct {
  28. expressionFactoryManager ExpressionFactoryManager
  29. }
  30. func (resolver *DefaultExpressionResolver) Expression(expressionStr string) Expression {
  31. expressionStruct, err := parseExpressionStruct(expressionStr)
  32. if err != nil {
  33. return nil
  34. }
  35. expressionFactory := resolver.expressionFactoryManager.GetExpressionFactory(expressionStruct.typ)
  36. if expressionFactory == nil {
  37. return nil
  38. }
  39. return expressionFactory.CreateExpression(expressionStruct.content)
  40. }
  41. func (resolver *DefaultExpressionResolver) ExpressionFactoryManager() ExpressionFactoryManager {
  42. return resolver.expressionFactoryManager
  43. }
  44. func (resolver *DefaultExpressionResolver) SetExpressionFactoryManager(expressionFactoryManager ExpressionFactoryManager) {
  45. resolver.expressionFactoryManager = expressionFactoryManager
  46. }
  47. type ExpressionStruct struct {
  48. typeStart int
  49. typeEnd int
  50. end int
  51. typ string
  52. content string
  53. }
  54. // old style: $type{content}
  55. // new style: $type.content
  56. func parseExpressionStruct(expressionStr string) (*ExpressionStruct, error) {
  57. eStruct := &ExpressionStruct{}
  58. eStruct.typeStart = strings.Index(expressionStr, "$")
  59. if eStruct.typeStart == -1 {
  60. return nil, errors.New("invalid expression")
  61. }
  62. dot := strings.Index(expressionStr, ".")
  63. leftBracket := strings.Index(expressionStr, "{")
  64. isOldEvaluatorStyle := false
  65. if eStruct.typeStart == 0 {
  66. if leftBracket < 0 && dot < 0 {
  67. return nil, errors.New("invalid expression")
  68. }
  69. // Backward compatible for structure: $expressionType{expressionContent}
  70. if leftBracket > 0 && (leftBracket < dot || dot < 0) {
  71. eStruct.typeEnd = leftBracket
  72. isOldEvaluatorStyle = true
  73. }
  74. if dot > 0 && (dot < leftBracket || leftBracket < 0) {
  75. eStruct.typeEnd = dot
  76. }
  77. }
  78. if eStruct.typeStart == 0 && leftBracket != -1 && leftBracket < dot {
  79. // Backward compatible for structure: $expressionType{expressionContent}
  80. eStruct.typeEnd = strings.Index(expressionStr, "{")
  81. isOldEvaluatorStyle = true
  82. }
  83. eStruct.typ = expressionStr[eStruct.typeStart+1 : eStruct.typeEnd]
  84. if isOldEvaluatorStyle {
  85. eStruct.end = strings.Index(expressionStr, "}")
  86. } else {
  87. eStruct.end = len(expressionStr)
  88. }
  89. eStruct.content = expressionStr[eStruct.typeEnd+1 : eStruct.end]
  90. return eStruct, nil
  91. }