0

I having trouble creating Unomi rules with condition type "booleanCondition". When I choose "OR" operator and trying to create a new rule I have the IllegalArgumentException (stack trace below). However, if choose "AND" operator, in the same rule I don't have an error, and the rule work as I need.

An example rule is as follows:

"itemId": "test-rule",
  "itemType": "rule",
  "version": 1,
 "condition": {
   "parameterValues": {
   "subConditions": [ 
    {
      "type": "eventTypeCondition",
      "parameterValues": {
        "eventTypeId": "view"
      }
    },
    {
     "type": "profilePropertyCondition",
      "parameterValues": {
        "propertyName": "properties.nbOfVisits",
        "comparisonOperator": "greaterThan",
        "propertyValueInteger" : 1
      }
    },
    {
     "type": "profilePropertyCondition",
      "parameterValues": {
        "propertyName": "properties.someTestProperty",
        "comparisonOperator": "equals",
        "propertyValue" : "Test value"
      }
    }
   ],
   "operator" : "or"
 },
 "type": "booleanCondition"},
"actions": [
    {
    "parameterValues": {
        "setPropertyName": "test name",
        "setPropertyValue": "test value",
        "storeInSession": true
                },
      "type": "setPropertyAction"
    }

  ],
  "linkedItems": null,
  "raiseEventOnlyOnceForProfile": false,
  "raiseEventOnlyOnceForSession": false,
  "raiseEventOnlyOnce": false,
  "priority": 1,
  "metadata": {
    "id": "test-rule",
    "name": "test-rule",
    "description": "test rule",
    "scope": "systemscope",
    "tags": [],
    "systemTags": [ ],
    "enabled": true,
    "missingPlugins": false,
    "hidden": false,
    "readOnly": false
  }

Stacktrace an error:

java.lang.IllegalArgumentException
  at org.apache.unomi.services.impl.definitions.DefinitionsServiceImpl.extractConditionBySystemTag(DefinitionsServiceImpl.java:509)
  at org.apache.unomi.services.impl.rules.RulesServiceImpl.setRule(RulesServiceImpl.java:360)
  at Proxy8201644d_3a75_4301_b38d_53e8230320d6.setRule(Unknown Source)
  at org.apache.unomi.rest.RulesServiceEndPoint.setRule(RulesServiceEndPoint.java:81)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:498)
  at org.apache.cxf.service.invoker.AbstractInvoker.performInvocation(AbstractInvoker.java:179)
  at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:96)
  at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:201)
  at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:104)
  at org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:59)
  at org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:96)
  at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
  at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
  at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:267)
  at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:234)
  at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:208)
  at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:160)
  at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:216)
  at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:301)
  at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:220)
  at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
  at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:276)
  at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:760)
  at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1617)
  at org.eclipse.jetty.websocket.server.WebSocketUpgradeFilter.doFilter(WebSocketUpgradeFilter.java:226)
  at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1604)
  at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:545)
  at org.ops4j.pax.web.service.jetty.internal.HttpServiceServletHandler.doHandle(HttpServiceServletHandler.java:71)
  at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
  at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:536)
  at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
  at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:235)
  at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1592)
  at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233)
  at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1296)
  at org.ops4j.pax.web.service.jetty.internal.HttpServiceContext.doHandle(HttpServiceContext.java:298)
  at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188)
  at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:485)
  at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1562)
  at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186)
  at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1211)
  at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)

Also I tried to research the source code in the Unomi repository and found that some strange method is causing this exception... Why does it work like that?

screenshot the unomi method here

KazikM
  • 1,257
  • 5
  • 21
  • 29
  • (What does the documentation tell about choice (and default?) of operator?) – greybeard Dec 26 '20 at 12:15
  • "AND" is default of operator, as you can see in the documentation don't tell something specific about choice operator [link](https://unomi.apache.org/manual/latest/#_condition). But I sure that I used correctly operator because unomi rule with operator "AND" working correctly. – Slavik Semenuk Dec 26 '20 at 17:03
  • If *not* happened to work as needed in addition to *and*, but *or* does not, you could use [DeMorgan](https://en.m.wikipedia.org/wiki/De_Morgan%27s_laws). – greybeard Dec 26 '20 at 17:13
  • See also: [Jira Unomi 22](https://issues.apache.org/jira/browse/UNOMI-22), [Jira Unomi 372](https://issues.apache.org/jira/browse/UNOMI-372). – greybeard Dec 26 '20 at 17:32

0 Answers0