Claus Ibsen created CAMEL-26236:
-----------------------------------

             Summary: camel-ignite - with fireExistingQueryResults the cache 
consumer sends Cache.Entry bodies without the key header, and producers without 
an operation fail with a NullPointerException
                 Key: CAMEL-26236
                 URL: https://issues.apache.org/jira/browse/CAMEL-26236
             Project: Camel
          Issue Type: Bug
          Components: camel-ignite
            Reporter: Claus Ibsen
             Fix For: 4.24.0


Found while adding the catalog body types of the seven ignite components 
(CAMEL-24961, PR #28397).

h4. 1. ignite-cache consumer: fireExistingQueryResults sends the wrong exchange

{{IgniteCacheContinuousQueryConsumer}} (main 2a465aa4814c, lines 78-80) builds 
an exchange with the value and the {{CamelIgniteCacheKey}} header, then 
processes {{createExchange(entry)}} instead, so each existing entry arrives as 
a {{Cache.Entry}} body with no key header, unlike the events that follow. 
Checked on 4.24.0-SNAPSHOT with an embedded Ignite node.

Proposed: process the exchange built on line 78.

h4. 2. ignite-cache PUT of a Map: null body, and a Map cannot be stored as one 
value

{{IgniteCacheProducer.doPut}} (lines 113-117) puts all entries of a Map body 
and returns before {{IgniteHelper.maybePropagateIncomingBody}} (line 130), so 
the body after the PUT is null whatever 
{{propagateIncomingBodyIfNoReturnValue}} says. A Map is always put as entries, 
even with the {{CamelIgniteCacheKey}} header or 
{{treatCollectionsAsCacheObjects=true}}, so a Map can never be stored as one 
value. Checked on 4.24.0-SNAPSHOT with an embedded Ignite node.

Proposed: store the Map as one value when the key header is set or 
{{treatCollectionsAsCacheObjects}} is true, and propagate the body in both 
branches.

h4. 3. No operation: NullPointerException (cache, idgen, queue, set)

The operation comes from the header, else the endpoint's {{operation}} 
({{IgniteCacheProducer}} lines 229-231, {{IgniteIdGenProducer}} lines 81-83, 
and the same in queue and set), and the producers switch on it 
({{IgniteCacheProducer}} line 58, {{IgniteIdGenProducer}} line 49, 
{{IgniteQueueProducer}} line 54, {{IgniteSetProducer}} line 54); with neither 
set the switch throws a NullPointerException. Checked on 4.24.0-SNAPSHOT with 
an embedded Ignite node.

Proposed: fail with a message that names the operation header and option (or 
make the option required).

h4. 4. ignite-idgen: GET and the increments fail on a body they do not use

{{IgniteIdGenProducer.process}} (line 47) converts the body to {{Long}} before 
the switch, so GET, GET_AND_INCREMENT and INCREMENT_AND_GET fail with a 
{{TypeConversionException}} when the body is not a number, although they ignore 
it. ADD_AND_GET with no body (line 52) fails with a NullPointerException on 
unboxing. Checked on 4.24.0-SNAPSHOT with an embedded Ignite node.

Proposed: convert the body only in ADD_AND_GET and GET_AND_ADD, and fail with a 
clear message when it is missing.

h4. 5. ignite-compute: null body and the error messages

{{IgniteComputeProducer}} calls {{job.getClass()}} on the body (CALL line 110, 
RUN line 179, and in BROADCAST and EXECUTE), so a null body fails with a 
NullPointerException. The APPLY, AFFINITY_CALL and AFFINITY_RUN errors (lines 
207, 235, 251) call {{getBody().getClass()}} while building the message, so the 
error itself throws a NullPointerException when the body is null. RUN and 
AFFINITY_RUN have no result, and {{IgniteInCamelClosure}} (line 291) sets the 
null result as the body whatever {{propagateIncomingBodyIfNoReturnValue}} says. 
Checked on 4.24.0-SNAPSHOT with an embedded Ignite node.

Proposed: fail with a clear message for a null body, and keep the incoming body 
for RUN and AFFINITY_RUN when {{propagateIncomingBodyIfNoReturnValue}} is true.

h4. 6. ignite-queue and ignite-set: ADD, CONTAINS, REMOVE and RETAIN_ALL with 
no body

{{IgniteQueueProducer}} and {{IgniteSetProducer}} call {{body.getClass()}} 
(line 57 and the CONTAINS, REMOVE and RETAIN_ALL cases), so a null body fails 
with a NullPointerException. Checked on 4.24.0-SNAPSHOT with an embedded Ignite 
node.

Proposed: fail with a message that the operation needs a body.

_Claude Code on behalf of davsclaus_



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to