There are 5 updates.
 
 
XWiki Rendering / cid:jira-generated-image-avatar-58a576e8-0894-4772-b1cb-25e3380742c9 XRENDERING-809 Open

MacroDescriptor legacy getDefaultCategory() aspect is never weaved

 
View issue   ยท   Add comment
 

5 updates

 
cid:jira-generated-image-avatar-0a5023fc-089f-450e-80b1-48b87157746d Changes by Vincent Massol on 23/Jul/26 22:46
 
Fix Version: 18.4.3
Fix Version: 17.10.11
Description: h2. Problem
The backward
\ -compatibility aspect {{MacroDescriptorAspect}} \ (in the {{xwiki \ -rendering \ -legacy \ -transformation \ -macro}} module \ ) defines an {{@Around}} advice {{aroundGetDefaultCategory}} whose purpose is to make the deprecated {{MacroDescriptor.getDefaultCategory \ ( \ )}} return a value derived from the modern {{getDefaultCategories \ ( \ )}}.

This advice is *never weaved*. The build emits
\ (only as a warning \ ):

{code}
advice defined in org.xwiki.rendering.macro.descriptor.MacroDescriptorAspect has not been applied [Xlint:adviceDidNotMatch]
{code}

The pointcut is {{execution
\ (String MacroDescriptor.getDefaultCategory \ ( \ ) \ ) && within \ (MacroDescriptor \ )}}, but {{getDefaultCategory \ ( \ )}} has no method body inside {{MacroDescriptor}}: it exists only as a {{default}} method on {{CompatibilityMacroDescriptor}} \ (added to {{MacroDescriptor}} through {{@DeclareParents}} \ ) and as an inter \ -type declaration on {{AbstractMacroDescriptor}}. So the join point targeted by {{within \ (MacroDescriptor \ )}} does not exist and the advice matches nothing.

h2. User
\ -visible impact
For any {{MacroDescriptor}} implementation that implements only the modern {{getDefaultCategories
\ ( \ )}} and does not extend {{AbstractMacroDescriptor}}, the deprecated {{getDefaultCategory \ ( \ )}} returns {{null}} instead of one of the configured categories. Legacy code still calling {{getDefaultCategory \ ( \ )}} therefore silently loses the macro's default category, breaking the backward \ -compatibility guarantee.

h2. Fix
Retarget the pointcut to {{CompatibilityMacroDescriptor}}
\ (where the method body actually lives \ ) and add a {{ \ !cflowbelow \ (... \ )}} guard so that this advice and the symmetric {{getDefaultCategories \ ( \ )}} advice do not recurse infinitely when a descriptor implements neither method. Add unit tests covering both the derivation and the neither \ -implemented cases.

Note: this went unnoticed because AspectJ only reports an unmatched advice as a warning. See the companion Commons issue about failing the build in that case.


Assignee: Vincent Massol
Labels: regression