[MAGNOLIA-7083] Backport sanity-checks against NPEs to old URI mappings Created: 07/Jul/17  Updated: 25/Sep/17  Resolved: 22/Jul/17

Status: Closed
Project: Magnolia
Component/s: core
Affects Version/s: None
Fix Version/s: 5.5.6, 5.6

Type: Bug Priority: Major
Reporter: Oanh Thai Hoang Assignee: Oanh Thai Hoang
Resolution: Fixed Votes: 0
Labels: quickwin
Remaining Estimate: 1h
Time Spent: 2d 6.5h
Original Estimate: 2d

Issue Links:
Relates
relates to MAGNOLIA-7158 Host-based mappings require a fallbac... Closed
relation
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:
Epic Link: Virtual URI mappings
Sprint: Saigon 104, Saigon 105
Story Points: 3

 Description   

Problem was addressed already in the new virtual-uri module; here we apply it to the deprecated mappings in core.

Step to reproduce:

  • In /modules/ui-admincentral/virtualURIMapping
  • Create a contentNode tours
  • Add prop class and enter value info.magnolia.virtualuri.mapping.RegexpVirtualUriMapping
  • Add prop fromUri, haven’t yet entered the value
  • Admincentral stopped

Error log:

java.lang.NullPointerException
	java.util.regex.Matcher.appendReplacement(Matcher.java:804)
	java.util.regex.Matcher.replaceAll(Matcher.java:955)
	info.magnolia.cms.beans.config.RegexpVirtualURIMapping.mapURI(RegexpVirtualURIMapping.java:74)
	info.magnolia.cms.beans.config.RegexpVirtualURIMapping.mapURI(RegexpVirtualURIMapping.java:57)
	info.magnolia.virtualuri.compatibility.VirtualUriMappingAdapter.mapUri(VirtualUriMappingAdapter.java:66)
	info.magnolia.virtualuri.VirtualUriFilter.lambda$doFilter$0(VirtualUriFilter.java:92)
	java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
	java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1374)
	java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
	java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
	java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
	java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	java.util.stream.ReferencePipeline.reduce(ReferencePipeline.java:479)
	java.util.stream.ReferencePipeline.max(ReferencePipeline.java:515)
	info.magnolia.virtualuri.VirtualUriFilter.doFilter(VirtualUriFilter.java:95)
	info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
	info.magnolia.module.cache.executor.Bypass.processCacheRequest(Bypass.java:58)
	info.magnolia.module.cache.executor.CompositeExecutor.processCacheRequest(CompositeExecutor.java:67)
	info.magnolia.module.cache.filter.CacheFilter.doFilter(CacheFilter.java:220)
	info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
	info.magnolia.cms.i18n.I18nContentSupportFilter.doFilter(I18nContentSupportFilter.java:89)
	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:77)
	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.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81)
	info.magnolia.cms.security.SecurityCallbackFilter.doFilter(SecurityCallbackFilter.java:84)
	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.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.cms.filters.UnicodeNormalizationFilter.doFilter(UnicodeNormalizationFilter.java:89)
	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.ContentTypeFilter.doFilter(ContentTypeFilter.java:155)
	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)


 Comments   
Comment by Mikaël Geljić [ 14/Jul/17 ]

ilgun reported a minor side-effect to this one:

With sitemap module installed, logs are getting spoiled with the following for every request:

2017-07-14 15:38:02,842 WARN  .magnolia.cms.beans.config.RegexpVirtualURIMapping: Config for VirtualURIMapping SiteMapVirtualUriMapping[null --> null] is incomplete. Skipping URI mapping.

SiteMapVirtualUriMapping extends RegexpVirtualURIMapping, but its config does not require fromURI nor toURI. To fix this, I suggest two things:

  1. Exclude subclasses from the check in the new sanityCheck method
    • probably by something like this.getClass().equals(StrictlyThatUriMapping.class)
    • Do the same for new mappings
  2. Upon looking briefly, it's unclear why SiteMapVirtualUriMapping extends the regex-impl, instead of just implementing the interface.
    • We will address this with MGNLGS-134 (and override the sanity-check against the prefix config instead).

One more open question, how much more work would it be to "report the problem" on DefinitionProvider level, instead of the log message?

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