[MAGNOLIA-6518] BeanMerger attempts to proxy final classes (e.g. Locale, Enum etc) Created: 11/Jan/16  Updated: 23/May/16  Resolved: 04/Feb/16

Status: Closed
Project: Magnolia
Component/s: None
Affects Version/s: 5.4.4
Fix Version/s: 5.4.5

Type: Bug Priority: Blocker
Reporter: Ervin Vystup Assignee: Federico Grilli
Resolution: Fixed Votes: 2
Labels: support
Remaining Estimate: 0d
Time Spent: 6.5h
Original Estimate: Not Specified

Attachments: XML File config.modules.multisite.config.sites.travel.variations.xml    
Issue Links:
Relates
relation
is related to MGNLSITE-52 Switching language in preview does no... Closed
Template:
Acceptance criteria:
Empty
Task DoD:
[ ]* Doc/release notes changes? Comment present?
[ ]* Downstream builds green?
[ ]* Solution information and context easily available?
[ ]* Tests
[ ]* FixVersion filled and not yet released
[ ]  Architecture Decision Record (ADR)
Bug DoR:
[ ]* Steps to reproduce, expected, and actual results filled
[ ]* Affected version filled
Date of First Response:
Sprint: Basel 29
Story Points: 5

 Description   

To reproduce:

  1. Import this: config.modules.multisite.config.sites.travel.variations.xml
  2. Go to Pages - (choose some page from "travel" demo and "Preview" it)
  3. Switch the device from "Desktop" to "Tablet" or "Smartphone"

Than it reports:

HTTP Status 500 - Proxy class cannot extend java.util.Locale as it is final.

type: Exception report

message: Proxy class cannot extend java.util.Locale as it is final.

description: The server encountered an internal error that prevented it from fulfilling this request.

exception: 
org.apache.commons.proxy.exception.ProxyFactoryException: Proxy class cannot extend java.util.Locale as it is final.
	org.apache.commons.proxy.factory.util.AbstractSubclassingProxyFactory.getSuperclass(AbstractSubclassingProxyFactory.java:134)
	org.apache.commons.proxy.factory.cglib.CglibProxyFactory.createInvokerProxy(CglibProxyFactory.java:87)
	org.apache.commons.proxy.ProxyFactory.createInvokerProxy(ProxyFactory.java:145)
	info.magnolia.beanmerger.ProxyBasedBeanMerger.mergeBean(ProxyBasedBeanMerger.java:83)
	info.magnolia.beanmerger.BeanMergerBase.merge(BeanMergerBase.java:77)
	info.magnolia.beanmerger.ProxyBasedBeanMerger$MergeInvoker.invoke(ProxyBasedBeanMerger.java:138)
	org.apache.commons.proxy.factory.cglib.CglibProxyFactory$InvokerBridge.invoke(CglibProxyFactory.java:116)
	info.magnolia.cms.i18n.DefaultI18nContentSupport$$EnhancerByCGLIB$$99f0d861.determineLocale(<generated>)
	info.magnolia.module.site.i18n.SiteI18nContentSupport.determineLocale(SiteI18nContentSupport.java:104)
	info.magnolia.module.site.i18n.SiteI18nContentSupport$$EnhancerByCGLIB$$b5dc6d0.determineLocale(<generated>)
	info.magnolia.cms.i18n.I18nContentSupportFilter.doFilter(I18nContentSupportFilter.java:59)
	info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
	info.magnolia.cms.filters.RangeSupportFilter.doFilter(RangeSupportFilter.java:84)
	info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
	info.magnolia.cms.security.BaseSecurityFilter.doFilter(BaseSecurityFilter.java:57)
	info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
	info.magnolia.multisite.filters.CrossSiteSecurityFilter.doFilter(CrossSiteSecurityFilter.java:105)
	info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81)
	info.magnolia.cms.security.SecurityCallbackFilter.doFilter(SecurityCallbackFilter.java:80)
	info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:59)
	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
	info.magnolia.cms.security.LogoutFilter.doFilter(LogoutFilter.java:94)
	info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:59)
	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
	info.magnolia.module.site.filters.SiteMergeFilter.doFilter(SiteMergeFilter.java:119)
	info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
	info.magnolia.multisite.filters.MultiSiteFilter.doFilter(MultiSiteFilter.java:105)
	info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
	info.magnolia.cms.filters.MultiChannelFilter.doFilter(MultiChannelFilter.java:83)
	info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
	info.magnolia.module.cache.filter.GZipFilter.doFilter(GZipFilter.java:73)
	info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:59)
	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81)
	info.magnolia.cms.security.auth.login.LoginFilter.doFilter(LoginFilter.java:127)
	info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
	info.magnolia.enterprise.registration.RegistrationFilter.doFilter(RegistrationFilter.java:64)
	info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81)
	info.magnolia.cms.filters.CosMultipartRequestFilter.doFilter(CosMultipartRequestFilter.java:87)
	info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:59)
	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
	info.magnolia.personalization.preview.filter.PreviewFilter.doFilter(PreviewFilter.java:92)
	info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:59)
	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
	info.magnolia.personalization.trait.AbstractTraitDetectorFilter.doFilter(AbstractTraitDetectorFilter.java:74)
	info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
	info.magnolia.personalization.trait.AbstractTraitDetectorFilter.doFilter(AbstractTraitDetectorFilter.java:74)
	info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
	info.magnolia.personalization.trait.AbstractTraitDetectorFilter.doFilter(AbstractTraitDetectorFilter.java:74)
	info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
	info.magnolia.personalization.trait.AbstractTraitDetectorFilter.doFilter(AbstractTraitDetectorFilter.java:74)
	info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
	info.magnolia.cms.filters.ContentTypeFilter.doFilter(ContentTypeFilter.java:148)
	info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
	info.magnolia.cms.filters.ContextFilter.doFilter(ContextFilter.java:128)
	info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
	info.magnolia.cms.filters.CompositeFilter.doFilter(CompositeFilter.java:65)
	info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
	info.magnolia.cms.filters.SafeDestroyMgnlFilterWrapper.doFilter(SafeDestroyMgnlFilterWrapper.java:107)
	info.magnolia.cms.filters.MgnlFilterDispatcher.doDispatch(MgnlFilterDispatcher.java:67)
	info.magnolia.cms.filters.MgnlMainFilter.doFilter(MgnlMainFilter.java:108)
	info.magnolia.cms.filters.MgnlMainFilter.doFilter(MgnlMainFilter.java:94)

If you set the value of enabled to "false" here /server/filters/i18n@enabled, it is OK.

Cause
The issue shows up only when there are site variations as in that case the Site configs would be merged at info.magnolia.module.site.filters.SiteMergeFilter.doFilter(..). BeanMerger would then try to proxy java.util.Locale final class which isn't allowed by the underlying proxy library used by Magnolia, https://github.com/cglib/cglib/wiki
The problem is present at least since 5.4.3.

Solution
Obvious solution was to prevent BeanMerger from proxying final classes and interfaces (excluding Java's Map and Collection).


Generated at Mon Feb 12 04:15:16 CET 2024 using Jira 9.4.2#940002-sha1:46d1a51de284217efdcb32434eab47a99af2938b.