[ 
https://issues.apache.org/jira/browse/WW-5656?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Work on WW-5656 started by Lukasz Lenart.
-----------------------------------------
> Mark ConversionRule.COLLECTION and the Collection_ prefix as @Deprecated
> ------------------------------------------------------------------------
>
>                 Key: WW-5656
>                 URL: https://issues.apache.org/jira/browse/WW-5656
>             Project: Struts 2
>          Issue Type: Improvement
>          Components: XML Validators
>            Reporter: Lukasz Lenart
>            Assignee: Lukasz Lenart
>            Priority: Minor
>             Fix For: 7.3.0
>
>
> h2. Summary
> {{ConversionRule.COLLECTION}} and 
> {{DefaultObjectTypeDeterminer.DEPRECATED_ELEMENT_PREFIX}} ({{"Collection_"}}) 
> have been documented as deprecated since WebWork 2.1.x, but neither carries 
> an actual {{@Deprecated}} annotation. Users get no compile-time signal — only 
> prose in Javadoc and an {{INFO}} log line at runtime, and the log fires only 
> when the fallback is actually hit.
> h2. Background
> {{Collection_}} and {{Element_}} express the same thing: the element type 
> inside a collection. {{Element_}} additionally covers the *values* of a 
> {{Map}}, which is why WebWork 2.1 introduced it as the single name for both 
> cases and kept {{Collection_}} working as a fallback so existing 
> {{-conversion.properties}} files would not break.
> The deprecation is stated in three places today:
> * {{DefaultObjectTypeDeterminer}} class Javadoc, line 50: _"From WebWork 
> 2.1.x, the *Collection_xxx* format is still supported and honored, although 
> it is deprecated"_
> * {{DefaultObjectTypeDeterminer:120}} — {{LOG.info("The Collection_xxx 
> pattern for collection type conversion is deprecated. Please use 
> Element_xxx!")}}
> * {{TypeConversion.rule()}} Javadoc — _"The ConversionRule can be a PROPERTY, 
> KEY, KEY_PROPERTY, ELEMENT, COLLECTION (deprecated) or a MAP"_
> The two rules are interchangeable in the engine: 
> {{DefaultConversionAnnotationProcessor}} handles {{ELEMENT}} and 
> {{COLLECTION}} in the same branch, and 
> {{DefaultObjectTypeDeterminer.getElementClass}} reads {{Element_${property}}} 
> first, then falls back to {{Collection_${property}}}.
> h2. Proposal
> Make the deprecation machine-visible so it reaches users through the compiler 
> rather than through documentation nobody reads.
> {code:java}
> public enum ConversionRule {
>     PROPERTY,
>     /**
>      * @deprecated since 7.3.0, use {@link #ELEMENT} instead. The 
> Collection_xxx key format has been
>      * superseded by Element_xxx since WebWork 2.1.x; both are handled 
> identically by the engine.
>      */
>     @Deprecated(since = "7.3.0")
>     COLLECTION,
>     MAP, KEY, KEY_PROPERTY, ELEMENT, CREATE_IF_NULL;
> {code}
> Same treatment for {{DefaultObjectTypeDeterminer.DEPRECATED_ELEMENT_PREFIX}}, 
> whose name already says what the annotation should.
> h3. Scope
> || Item || Change ||
> | {{ConversionRule.COLLECTION}} | add {{@Deprecated}} + {{@deprecated}} 
> Javadoc pointing at {{ELEMENT}} |
> | {{DefaultObjectTypeDeterminer.DEPRECATED_ELEMENT_PREFIX}} | add 
> {{@Deprecated}} + Javadoc |
> | {{TypeConversion}} Javadoc example, line 138 | switch the example from 
> {{ConversionRule.COLLECTION}} to {{ConversionRule.ELEMENT}} so the annotation 
> stops teaching the deprecated form |
> | Runtime behaviour | *unchanged* — the {{Collection_}} fallback keeps 
> working |
> h3. In-tree call sites that will warn
> Deprecating the constant makes our own code warn, so each of these needs a 
> decision — {{@SuppressWarnings("deprecation")}} where the reference is 
> deliberate, or a migration to {{ELEMENT}} where it is incidental:
> * {{ConversionRule.prefix()}} — {{case COLLECTION -> 
> DEPRECATED_ELEMENT_PREFIX}}. Both sides are deprecated references, and the 
> switch is deliberately exhaustive with no {{default}}, so the case *cannot* 
> be dropped without a compile error. Needs 
> {{@SuppressWarnings("deprecation")}}.
> * {{DefaultConversionAnnotationProcessor:73}} — references 
> {{ConversionRule.COLLECTION}} in a guard.
> * {{DefaultConversionFileProcessor:80}} and 
> {{DefaultObjectTypeDeterminer:118}} — reference the prefix constant.
> * Test fixtures {{AnnotationUser:87}} and {{ConversionTestAction:74}} use 
> {{rule = ConversionRule.COLLECTION}}. These deliberately cover the deprecated 
> path and should keep doing so, with a suppression and a comment saying why.
> * {{ConversionRuleTest:31}} and {{XWorkConverterTest:845}} assert on the 
> {{Collection_}} prefix and on the {{COLLECTION}}/{{ELEMENT}} key crossover 
> (see WW-3871) — both must keep passing.
> h2. Open questions
> * *{{forRemoval}} or not?* Removing the enum constant is a source-breaking 
> change for applications, so it belongs in a major release. Removing the 
> {{Collection_}} *properties-file* fallback is a separate, larger decision — 
> plenty of long-lived {{-conversion.properties}} files still use it, and it 
> costs almost nothing to keep. These two can be decided independently; 
> deprecating without {{forRemoval = true}} is the conservative first step.
> * *{{since}} value* — the version is chosen at release time by semver impact; 
> {{7.3.0}} above is a placeholder matching the branch that surfaced this.
> h2. Notes
> Found while implementing WW-3871, which routes every {{@TypeConversion}} key 
> through a single prefix resolver. That work has to treat {{Collection_}} as a 
> first-class prefix precisely because {{COLLECTION}} and {{ELEMENT}} are 
> interchangeable — {{@TypeConversion(key = "Element_users", rule = 
> COLLECTION)}} is a legitimate combination today and must keep resolving to 
> {{Element_users}}. Deprecating the constant does not change that; it only 
> tells authors not to write new code against it.
> This is a documentation and API-hygiene change with no behavioural component.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to