tkobayas opened a new issue, #7185:
URL: https://github.com/apache/incubator-kie/issues/7185

   # Description
   
   ## Summary
   
   An empty DRL `declare` block for an existing Java class resets its Java 
annotation settings in the classic compiler, while the executable model retains 
them. Without the declaration, both models honor those settings.
   
   Investigated during [PR 
#7176](https://github.com/apache/incubator-kie/pull/7176), this issue tracks 
the broader precedence policy separately from that PR's dynamic fact listener 
fixes.
   
   ## Observed behavior
   
   | Java class setting | Classic compiler with an empty DRL declaration | 
Executable model with an empty DRL declaration |
   |---|---|---|
   | `@Role(EVENT)` | Reverts to `FACT` | Retains `EVENT` |
   | `@Expires("10s")` | No explicit expiration offset | Retains 10 seconds |
   | `@Timestamp("start")` | No timestamp attribute configured | Retains 
`start` |
   | `@Duration("length")` | No duration attribute configured | Retains 
`length` |
   | `@PropertyChangeSupport` | Disabled | Remains enabled |
   | `@ClassReactive` [1] | Reverts to property reactive | Remains class 
reactive |
   | `@PropertyReactive` [2] | Disabled | Remains enabled |
   
   [1] `PropertySpecificOption.ALWAYS` (default). [2] 
`PropertySpecificOption.ALLOWED`.
   
   An unrelated DRL annotation such as `@typesafe(true)` produces the same 
differences. The expiration row describes explicit metadata; expiration can 
also be inferred from rule constraints.
   
   Tested on commit `b70bdb8527523b9a1046545ec457e38fd753c2a9` from PR #7176, 
using OpenJDK 21 and Maven 3.9.16, before [Toni's proposed 
fix](https://github.com/Thebas/incubator-kie/pull/1). These results were not 
reproduced against published 7.74.1.Final artifacts.
   
   ## Reproduction
   
   Use this existing Java class:
   
   ```java
   package org.example;
   
   import org.kie.api.definition.type.*;
   
   @Role(Role.Type.EVENT)
   @Expires("10s")
   @Timestamp("start")
   @Duration("length")
   @ClassReactive
   public class EventFact {
       public long getStart() { return 0L; }
       public long getLength() { return 0L; }
   }
   ```
   
   Build this DRL using `KieHelper.build()` and 
`KieHelper.build(ExecutableModelProject.class)`:
   
   ```drl
   import org.example.EventFact;
   
   declare EventFact
   end
   
   rule "Match event"
   when
       EventFact()
   then
   end
   ```
   
   Inspect `((InternalKnowledgeBase) base).getTypeDeclaration(EventFact.class)`:
   
   ```text
   classic:    role=FACT  expires=-1    timestamp=null  duration=null    
propertyReactive=true
   executable: role=EVENT expires=10000 timestamp=start duration=length 
propertyReactive=false
   ```
   
   Remove the declaration: both models produce the executable-model values 
above. For a JavaBeans-compatible fact with `@PropertyChangeSupport`, the empty 
declaration also prevents listener registration and setter-triggered 
reevaluation in classic, while executable retains them.
   
   ## Proposed behavior and scope
   
   Preserve Java settings when the corresponding DRL annotation is omitted, and 
give explicit DRL settings documented precedence. Distinguish omission from an 
explicit reset or disable operation where supported. This is a proposed policy 
requiring agreement and compatibility assessment.
   
   Classic processes the DRL declaration without first importing Java 
annotations; executable runtime metadata reads Java annotations before applying 
model metadata. Toni's fix addresses `@PropertyChangeSupport` and can also 
preserve `@Expires`; recheck those rows after integration. PR #7176 should 
proceed with its focused fix and regression test independently of the remaining 
differences.
   
   Acceptance criteria:
   
   - Agree on and document precedence, explicit overrides, and compatibility 
exceptions.
   - Test both models with no declaration, an empty declaration, unrelated 
metadata, and explicit overrides for the annotations above.
   - Align remaining differences and verify relevant runtime behavior.
   
   The Drools 10.2.x [Rule Language 
Reference](https://kie.apache.org/docs/10.2.x/drools/drools/language-reference/index.html)
 describes adding metadata to existing types and using an empty declaration 
before extending a Java type. The [rule engine 
guide](https://kie.apache.org/docs/10.2.x/drools/drools/rule-engine/index.html) 
documents property-change settings in Java or DRL. These sections do not 
specify whether omitted DRL annotations preserve or clear Java metadata.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to