[MGNLUI-3799] ShowVersionsAction doesn't use ContentConnector Created: 07/Mar/16  Updated: 29/Jun/18  Resolved: 14/Apr/16

Status: Closed
Project: Magnolia UI
Component/s: None
Affects Version/s: None
Fix Version/s: 5.4.6

Type: Bug Priority: Blocker
Reporter: Samuel Zihlmann Assignee: Ngoc Nguyenthanh
Resolution: Fixed Votes: 0
Labels: None
Remaining Estimate: 1h
Time Spent: 5d 4.5h
Original Estimate: 5d

Issue Links:
Cloners
dependency
is depended upon by MGNLRES-271 Use ContentConnector in ResourcesVers... Closed
relation
is related to MGNLUI-3848 User should be aware if inconsistent ... 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
Documentation update required:
Yes
Date of First Response:
Visible to:
Peter Mohn
Sprint: Saigon 39
Story Points: 8

 Description   

info.magnolia.ui.contentapp.browser.action.ShowVersionsAction doesn't use info.magnolia.ui.vaadin.integration.contentconnector.ContentConnector, this cause problem when browser/detail subapp has set rootPath for ContentConnector

To reproduction:
example 1

  1. set /modules/personalization-segmentation-app/apps/segmentation/subApps/detail/contentConnector@rootPath on /Economic-regions
  2. in Segments app "Publish" one segment and try to "Edit segments" or "Show Version"
  3. you will see error (log is attached below)

example 2

  1. set /Economic-regions in /modules/personalization-segmentation-app/apps/segmentation/subApps/browser/contentConnector@rootPath
  2. in "Edit segment" isn't seen label

example 3

  1. set /Economic-regions rootPath in contentConnector for "browser" and "detail"
  2. "Edit segments" look correctly, but "Show version" causes error

Error:

2016-03-07 14:03:16,482 ERROR agnolia.ui.framework.app.AppInstanceControllerImpl: Sub-app detail failed to start: null
java.lang.NullPointerException
	at info.magnolia.ui.vaadin.integration.contentconnector.JcrContentConnector.getNewItemId(JcrContentConnector.java:206)
	at info.magnolia.ui.contentapp.detail.DetailEditorPresenter.start(DetailEditorPresenter.java:119)
	at info.magnolia.ui.contentapp.detail.DetailSubApp.start(DetailSubApp.java:116)
	at info.magnolia.ui.contentapp.detail.DetailSubApp.start(DetailSubApp.java:71)
	at info.magnolia.ui.framework.app.AppInstanceControllerImpl.startSubApp(AppInstanceControllerImpl.java:426)
	at info.magnolia.ui.framework.app.AppInstanceControllerImpl.openSubApp(AppInstanceControllerImpl.java:382)
	at info.magnolia.ui.framework.app.BaseApp.locationChanged(BaseApp.java:65)
	at info.magnolia.ui.framework.app.AppInstanceControllerImpl.onLocationUpdate(AppInstanceControllerImpl.java:270)
	at info.magnolia.ui.framework.app.AppControllerImpl.doStartIfNotAlreadyRunning(AppControllerImpl.java:253)
	at info.magnolia.ui.framework.app.AppControllerImpl.onLocationChanged(AppControllerImpl.java:339)
	at info.magnolia.ui.api.location.LocationChangedEvent.dispatch(LocationChangedEvent.java:64)
	at info.magnolia.ui.api.location.LocationChangedEvent.dispatch(LocationChangedEvent.java:42)
	at info.magnolia.event.SimpleEventBus.fireEvent(SimpleEventBus.java:78)
	at info.magnolia.ui.api.location.LocationController.goToWithoutChecks(LocationController.java:103)
	at info.magnolia.ui.api.location.LocationController.goTo(LocationController.java:97)
	at info.magnolia.ui.framework.action.AbstractVersionAction$1.onSuccess(AbstractVersionAction.java:135)
	at info.magnolia.ui.framework.action.EditorCallbackAction.execute(EditorCallbackAction.java:76)
	at info.magnolia.ui.api.action.AbstractActionExecutor.execute(AbstractActionExecutor.java:62)
	at info.magnolia.ui.dialog.BaseDialogPresenter.executeAction(BaseDialogPresenter.java:212)
	at info.magnolia.ui.dialog.BaseDialogPresenter.onActionFired(BaseDialogPresenter.java:202)
	at info.magnolia.ui.dialog.actionarea.renderer.DefaultEditorActionRenderer$DefaultActionView$1.buttonClick(DefaultEditorActionRenderer.java:67)
	at sun.reflect.GeneratedMethodAccessor840.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:508)
	at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:198)
	at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:161)
	at com.vaadin.server.AbstractClientConnector.fireEvent(AbstractClientConnector.java:977)
	at com.vaadin.ui.Button.fireClick(Button.java:393)
	at com.vaadin.ui.Button$1.click(Button.java:61)
	at sun.reflect.GeneratedMethodAccessor839.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:168)
	at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:118)
	at com.vaadin.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:291)
	at com.vaadin.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:184)
	at com.vaadin.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:92)
	at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:41)
	at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1408)
	at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:350)
	at info.magnolia.ui.admincentral.AdmincentralVaadinServlet.service(AdmincentralVaadinServlet.java:131)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
	at info.magnolia.cms.filters.ServletDispatchingFilter.doFilter(ServletDispatchingFilter.java:148)
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81)
	at info.magnolia.cms.filters.CompositeFilter.doFilter(CompositeFilter.java:65)
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
	at info.magnolia.cms.filters.VirtualUriFilter.doFilter(VirtualUriFilter.java:69)
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
	at info.magnolia.module.cache.executor.Bypass.processCacheRequest(Bypass.java:58)
	at info.magnolia.module.cache.executor.CompositeExecutor.processCacheRequest(CompositeExecutor.java:67)
	at info.magnolia.module.cache.filter.CacheFilter.doFilter(CacheFilter.java:174)
	at info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:59)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
	at info.magnolia.cms.i18n.I18nContentSupportFilter.doFilter(I18nContentSupportFilter.java:74)
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
	at info.magnolia.cms.filters.RangeSupportFilter.doFilter(RangeSupportFilter.java:84)
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
	at info.magnolia.cms.security.BaseSecurityFilter.doFilter(BaseSecurityFilter.java:57)
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81)
	at info.magnolia.cms.security.SecurityCallbackFilter.doFilter(SecurityCallbackFilter.java:80)
	at info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:59)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
	at info.magnolia.cms.security.LogoutFilter.doFilter(LogoutFilter.java:94)
	at info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:59)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
	at info.magnolia.module.site.filters.SiteMergeFilter.doFilter(SiteMergeFilter.java:119)
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
	at info.magnolia.multisite.filters.MultiSiteFilter.doFilter(MultiSiteFilter.java:105)
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
	at info.magnolia.cms.filters.MultiChannelFilter.doFilter(MultiChannelFilter.java:83)
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
	at info.magnolia.module.cache.filter.GZipFilter.doFilter(GZipFilter.java:73)
	at info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:59)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81)
	at info.magnolia.cms.security.auth.login.LoginFilter.doFilter(LoginFilter.java:127)
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
	at info.magnolia.enterprise.registration.RegistrationFilter.doFilter(RegistrationFilter.java:64)
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81)
	at info.magnolia.personalization.preview.filter.PreviewFilter.doFilter(PreviewFilter.java:92)
	at info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:59)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81)
	at info.magnolia.cms.filters.ContentTypeFilter.doFilter(ContentTypeFilter.java:148)
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
	at info.magnolia.cms.filters.ContextFilter.doFilter(ContextFilter.java:128)
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
	at info.magnolia.cms.filters.CompositeFilter.doFilter(CompositeFilter.java:65)
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
	at info.magnolia.cms.filters.SafeDestroyMgnlFilterWrapper.doFilter(SafeDestroyMgnlFilterWrapper.java:107)
	at info.magnolia.cms.filters.MgnlFilterDispatcher.doDispatch(MgnlFilterDispatcher.java:67)
	at info.magnolia.cms.filters.MgnlMainFilter.doFilter(MgnlMainFilter.java:108)
	at info.magnolia.cms.filters.MgnlMainFilter.doFilter(MgnlMainFilter.java:94)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:745)


 Comments   
Comment by Ngoc Nguyenthanh [ 22/Mar/16 ]
What happen?
  • ShowVersionsAction use absolute path of the node in getLocation to pass through a location.
  • JcrContentConnector#getItemIdByUrlFragment expect a relative path and try to get fullFragment by append the rootPath if needed. Then it lead to the issue.
Solution
  • Inject ContentConnector into ShowVersionsAction
  • Use ContentConnector to get the path in ShowVersionsAction#getLocation
        final Object itemId = contentConnector.getItemId(nodeAdapter);
        final String path = contentConnector.getItemUrlFragment(itemId);
Comment by Mikaël Geljić [ 29/Mar/16 ]

Stuck because can not get ContentConnector by using static method Components.getComponent for back compatibility constructor

With Components.getComponent you always get components from the "main" IoC container, not from the admincentral, app nor subApp one.

I can't think of any workaround on component-provider level right now; however we have a number of other components, especially the UiContext, which would most likely be the SubAppContext.
From there we could get the descriptor and sniff inside the ContentConnectorDefinition to get the root-path, maybe? Totally hackish, so this would need to be at least in a deprecated method already.

Why is this important in this case?
–That constructor is likely to be used by other actions, as this action has a number of subclasses already in UI.

Comment by Mikaël Geljić [ 05/Apr/16 ]

... and status here (cc ngoc.nguyenthanh mdivilek)

  • Fix works as expected for "normal" content-apps with rootPath
  • We ignore the case of the (abnormal) pages-app
    • I wouldn't recommend changing rootPath there anyway;
    • PagesEditorSubApp doesn't support locations relative to a different_rootPath_ than workspace root
  • re: deprecated ctors, with Stephen we crafted a dirty little workaround, i.e. re-instantiating a ContentConnectorProvider w/ current SubAppContext
    • most likely, we've been using Components.getComponent for sub-app components blindly in plenty of other deprecation cases before :# let's keep an eye on that from now on

Some additional tasks:

  • How about info.magnolia.ui.contentapp.browser.action.RestoreItemPreviousVersionAction? If needed, file a follow-up ticket
  • The resources-app extends those version actions, but its ResourcesContentConnector doesn't have any notion of rootPath; it might transparently work though.
    • file a follow-up, at least to inject ContentConnector, instead of using the deprecated ctors.
Comment by Sang Ngo Huu [ 15/Apr/16 ]

QA without error. Filed MGNLUI-3848 for enhancement

Generated at Mon Feb 12 09:10:11 CET 2024 using Jira 9.4.2#940002-sha1:46d1a51de284217efdcb32434eab47a99af2938b.