Uploaded image for project: 'PUBLIC - Liferay Portal Community Edition'
  1. PUBLIC - Liferay Portal Community Edition
  2. LPS-109833

NPE is written to log file in case a portlet couldn't be added to a page

    Details

      Description

      Discovered while diagnosing LPS-109788:

      1. UpdateLayoutAction.getJSON is called in case you add a portlet. That method calls LayoutTypePortletImpl.addPortletId.
      2. In case LayoutTypePortletImpl.addPortletId cannot add a portlet to a page, it returns null.
      3. After calling that method, storeAddContentPortletPreferences is called, but due to portletId=null, a NPE is thrown

      Instead of having a NPE, we should have a controlled error trace.

      Steps to reproduce

      1. Create a new page
      2. Open the same page in two browser windows
      3. Go first browser window:
        • Click in [+] button => widgets => type "sign in"
        • "sign in" widget will be shown in Add bar. DO NOT ADD TO THE PAGE YET
      4. Go second browser window:
        • Click in [+] button => widgets => type "sign in"
        • "sign in" widget will be shown in Add bar.
        • Add it to page
      5. Return to first browser window:
        • Add "sign in" widget from "Add bar" to page
      6. An error will be displayed, this error is ok because portlet already exists in the page
      7. Check log file:
        • Expected behavior: Only one ERROR trace is written to log file, explaining that portlet wasn't added
          2020-03-05 09:56:07.337 ERROR [default task-6][JSONAction:105] Portlet com_liferay_login_web_portlet_LoginPortlet could not be added to layout 21 by user 20128
        • Wrong behavior: A NPE and its full stacktrace is written to log file
          2020-03-05 07:49:31.921 ERROR [default task-75][JSONAction:105] null
          2020-03-05 07:49:31.922 WARN  [default task-75][PortalImpl:6585] java.lang.NullPointerException
          java.lang.NullPointerException
          	at com.liferay.portal.kernel.portlet.PortletIdCodec.hasUserId(PortletIdCodec.java:190)
          	at com.liferay.portlet.PortletPreferencesFactoryImpl.getLayoutPortletSetup(PortletPreferencesFactoryImpl.java:267)
          	at com.liferay.portlet.PortletPreferencesFactoryImpl.getLayoutPortletSetup(PortletPreferencesFactoryImpl.java:257)
          	at com.liferay.portal.kernel.portlet.PortletPreferencesFactoryUtil.getLayoutPortletSetup(PortletPreferencesFactoryUtil.java:82)
          	at com.liferay.portal.action.UpdateLayoutAction.storeAddContentPortletPreferences(UpdateLayoutAction.java:309)
          	at com.liferay.portal.action.UpdateLayoutAction.getJSON(UpdateLayoutAction.java:99)
          	at com.liferay.portal.struts.JSONAction.execute(JSONAction.java:74)
          	at com.liferay.portal.struts.PortalRequestProcessor._process(PortalRequestProcessor.java:415)
          	at com.liferay.portal.struts.PortalRequestProcessor.process(PortalRequestProcessor.java:155)
          	at com.liferay.portal.internal.servlet.MainServlet.doPost(MainServlet.java:215)
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:706)
          	at com.liferay.portal.internal.servlet.MainServlet.service(MainServlet.java:622)
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:791)
          	at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)
          	at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)
          	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:124)
          	at com.liferay.portal.servlet.filters.password.modified.PasswordModifiedFilter.processFilter(PasswordModifiedFilter.java:62)
          	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:49)
          	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:215)
          	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:116)
          	at com.liferay.portal.servlet.filters.lockout.LockoutFilter.processFilter(LockoutFilter.java:58)
          	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:49)
          	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:215)
          	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:116)
          	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:147)
          	at com.liferay.portal.servlet.filters.secure.BaseAuthFilter.processFilter(BaseAuthFilter.java:340)
          	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:49)
          	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:215)
          	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:116)
          	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:147)
          	at com.liferay.portal.sharepoint.SharepointFilter.processFilter(SharepointFilter.java:88)
          	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:49)
          	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:215)
          	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:116)
          	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:147)
          	at com.liferay.portal.servlet.filters.virtualhost.VirtualHostFilter.processFilter(VirtualHostFilter.java:250)
          	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:49)
          	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:215)
          	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:116)
          	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:147)
          	at com.liferay.portal.monitoring.internal.servlet.filter.MonitoringFilter.processFilter(MonitoringFilter.java:183)
          	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:49)
          	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:215)
          	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:116)
          	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:196)
          	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:99)
          	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:196)
          	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:99)
          	at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176)
          	at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145)
          	at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92)
          	at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:389)
          	at com.liferay.portal.servlet.filters.urlrewrite.UrlRewriteFilter.processFilter(UrlRewriteFilter.java:65)
          	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:49)
          	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:215)
          	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:116)
          	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:175)
          	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:99)
          	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:175)
          	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:99)
          	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:196)
          	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:99)
          	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilter.doFilter(InvokerFilter.java:104)
          	at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
          	at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
          	at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)
          	at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
          	at io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)
          	at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
          	at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
          	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
          	at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:132)
          	at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
          	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
          	at io.undertow.security.handlers.AuthenticationConstraintHandler.handleRequest(AuthenticationConstraintHandler.java:53)
          	at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
          	at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
          	at io.undertow.servlet.handlers.security.ServletSecurityConstraintHandler.handleRequest(ServletSecurityConstraintHandler.java:59)
          	at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
          	at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
          	at io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)
          	at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
          	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
          	at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
          	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
          	at org.wildfly.extension.undertow.deployment.GlobalRequestControllerHandler.handleRequest(GlobalRequestControllerHandler.java:68)
          	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
          	at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:292)
          	at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:81)
          	at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:138)
          	at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)
          	at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)
          	at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
          	at org.wildfly.extension.undertow.security.SecurityContextThreadSetupAction.lambda$create$0(SecurityContextThreadSetupAction.java:105)
          	at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1502)
          	at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1502)
          	at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1502)
          	at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1502)
          	at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:272)
          	at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81)
          	at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:104)
          	at io.undertow.server.Connectors.executeRootHandler(Connectors.java:364)
          	at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:830)
          	at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
          	at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1982)
          	at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486)
          	at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1377)
          	at java.lang.Thread.run(Thread.java:748)

        Attachments

          Issue Links

            Activity

              People

              Assignee:
              yang.cao Yang Cao
              Reporter:
              jorge.diaz Jorge Diaz
              Participants of an Issue:
              Recent user:
              Jason Pince
              Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

                Dates

                Created:
                Updated:
                Resolved:
                Days since last comment:
                45 weeks ago

                  Packages

                  Version Package
                  7.2.10 DXP FP5
                  7.2.10.2 DXP SP2
                  7.2.X
                  7.3.1 CE GA2
                  7.3.2 CE GA3
                  7.3.10 DXP GA1
                  Master