The deprecation cleanup set @EqualsAndHashCode(callSuper = true) on AlarmComment,
so equals/hashCode now include the BaseData id and createdTime. The delete tests
built the expected comment via a fresh builder (no id), which no longer matches the
server-generated deletion comment (which reuses the original comment id).
Mutate the original alarm comment (already carrying the correct id/createdTime) into
the expected SYSTEM deletion comment instead of building a fresh one.
Forward-merge of lts-4.2 into lts-4.3, bringing the deprecation-warning
cleanups (#15487, #15491, #15499, #15503, #15504, #15505, #15509, #15511,
#15512, #15515, #15517, #15522) in as real ancestry rather than the earlier
copy-paste (#15661).
Conflicts resolved toward the reviewed lts-4.2 form for shared code
(explicit @EqualsAndHashCode(callSuper=true), typed StringUtils/removeStart,
imported test annotations). lts-4.3-only implementations kept as-is
(calculated-field state classes, native CF repository); tests removed on
lts-4.3 (CalculatedFieldLinkDataValidatorTest, DefaultDataUpdateServiceTest)
stay removed.
The device-install wizard substituted ${...} placeholders via a plain
string replace, so a quoted boolean macro like "cleanSession":
"${mqttCleanSession}" parsed as the string "false" (truthy) instead of
the JSON boolean false. Unchecking a boolean field (e.g. clean session)
therefore had no effect and read as true in the resulting integration.
Add a type-aware resolveTemplateJson() that, using the form-field type
recorded in form.json, emits BOOLEAN/INTEGER placeholders occupying a
whole quoted token as raw JSON values (unquoted) while leaving string
fields and embedded placeholders quoted. Route all template-parse call
sites through it. Fixes cleanSession, ssl, port and connectTimeoutSec
across all existing device packages without any template changes.
* feat: send pseudonymized install report (tenant/user hash, tb version) to IoT Hub
* refactor: source install-report tb version/edition from ProjectInfo
Use the existing ProjectInfo component (getProjectVersion/getProductType)
instead of an ad-hoc optional BuildProperties field and a hard-coded "CE"
edition, so PE reports its own product type and the version is the canonical
cleaned value. Constructor-injected via @RequiredArgsConstructor.