Lukasz Lenart created WW-5673:
---------------------------------
Summary: Remove the deprecated ConversionRule.COLLECTION and
Collection_ prefix constants
Key: WW-5673
URL: https://issues.apache.org/jira/browse/WW-5673
Project: Struts 2
Issue Type: Improvement
Reporter: Lukasz Lenart
Fix For: 8.0.0
Follow-up to WW-5656, which annotated these as {{@Deprecated(since = "7.3.0")}}
without {{forRemoval}}. Removing them is source-breaking for applications, so
it belongs in a major release.
h2. Scope
||Item||Action||
|{{ConversionRule.COLLECTION}}|remove the enum constant|
|{{ConversionRule.prefix()}}|drop the {{case COLLECTION ->}} arm and the
{{@SuppressWarnings("deprecation")}}|
|{{DefaultObjectTypeDeterminer.DEPRECATED_ELEMENT_PREFIX}}|remove the constant|
|{{XWorkConverter.CONVERSION_COLLECTION_PREFIX}}|remove the constant (a second
public spelling of the same literal, never read by the framework)|
|{{DefaultConversionAnnotationProcessor.process(...)}}|drop the
{{ConversionRule.COLLECTION}} term from the guard and the suppression|
|Test fixtures {{AnnotationUser}}, {{ConversionTestAction}}|migrate {{rule =
COLLECTION}} to {{ELEMENT}}|
|{{ConversionRuleTest}}, {{XWorkConverterTest}}|drop the {{Collection_}}
assertions covering the removed constant|
h2. Open decision: the properties-file fallback
Removing the *Java constants* and removing the *{{Collection_}} key fallback in
{{-conversion.properties}} files* are two independent decisions, and this
ticket should settle both.
{{DefaultObjectTypeDeterminer.getElementClass(...)}} reads
{{Element_${property}}} first and falls back to {{Collection_${property}}},
logging an INFO when the fallback is hit. That fallback is what keeps
long-lived {{-conversion.properties}} files working, and it costs almost
nothing to keep — it can survive the removal of the enum constant by inlining
the literal.
Two options:
# *Remove the constants, keep the fallback.* The conservative choice.
Applications with {{Collection_xxx}} entries in their conversion properties
keep working; only code written against the Java API breaks. The literal
{{"Collection_"}} gets inlined into {{getElementClass}} with a comment.
# *Remove both.* A cleaner engine, but it silently changes behaviour for any
application still shipping {{Collection_xxx}} properties: the element type
stops being resolved and conversion falls through to generic parametrics. If
this option is taken it needs a prominent migration note, and arguably a WARN
rather than the current INFO in the 7.x line first.
Note that these test resources still exercise the fallback and would have to be
migrated under option 2:
{{core/src/test/resources/org/apache/struts2/test/User-conversion.properties}},
{{.../util/Cat-conversion.properties}},
{{.../util/Tiger-conversion.properties}}, plus the {{Collection_list}} lookups
in {{XWorkConverterTest}}.
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_}} as a fallback. The two have been interchangeable
in the engine ever since, and the deprecation has been stated in prose since
2.1.x — WW-5656 only made it machine-visible.
Also worth updating on removal: the {{DefaultObjectTypeDeterminer}} class
Javadoc, which still says the {{Collection_xxx}} format "is still supported and
honored, although it is deprecated and will be removed eventually".
--
This message was sent by Atlassian Jira
(v8.20.10#820010)