Wow yeah, I'm not sure how portalEventFactory could ever be null, Spring should simply fail to create the DLM instance if it can't inject it. I don't think either node or parent can be null on those lines but it might be worth moving those two dereferences to their own lines and grab the result in a local variable just to rule it out.

-Eric

On 3/1/12 9:43 AM, Drew Wills wrote:
We would get stack traces referring here...

https://github.com/Jasig/uPortal/blob/master/uportal-war/src/main/java/org/jasig/portal/layout/dlm/DistributedLayoutManager.java#L461

and here...

https://github.com/Jasig/uPortal/blob/master/uportal-war/src/main/java/org/jasig/portal/layout/dlm/DistributedLayoutManager.java#L464

drew

On 3/1/2012 8:31 AM, Eric Dalquist wrote:
Drew could you correlate your line 455 with a linenumber on github, ex:
https://github.com/Jasig/uPortal/blob/master/uportal-war/src/main/java/org/jasig/portal/layout/dlm/DistributedLayoutManager.java#L455


-Eric

On 2/29/12 3:48 PM, Drew Wills wrote:
Hey folks,

I just encountered some behavior in a running instance of uPortal 4
that I can't explain -- is there someone who can help me understand
how this is possible? also maybe how to prevent it in the future?

User-facing behavior...

- User clicks on something to personalize the layout: add tab, remove
tab, add portlet, etc.
- Nothing happens in the browser, but the requested change is there
when the portal page is refreshed
- Using a tool like firebug, we can see that the ajax call to
/uPortal/api/layout is coming back with an HTTP 400 (bad request) or
500 (internal error) -- which one you get depends on which operation
you invoke
- So that explains the initial behavior in the browser: the change
isn't applied by JavaScript because the jQuery success function is
never called
- Looking in the logs we discover an NPE in DistributedLayoutManager
(pasted at bottom)
- Looking at the code, this error explains the server-side behavior:
the issue that caused the HTTP 400/500 happened *after* the layout
change was applied, so the user sees the change when he refreshes the
page
- The line that caused the error is this one...

this.portalEventFactory.publishFolderAddedToLayoutPortalEvent(this,
this.owner, layoutId, node.getId());

- The portalEventFactory member variable is null
- That member variable is wired to the layoutManager by Spring as follows

@Autowired
public void setPortalEventFactory(IPortalEventFactory
portalEventFactory) {
this.portalEventFactory = portalEventFactory;
}

- The UpdatePreferencesServlet (after several nested methods) gets
it's reference to the layoutManager as follows

final IUserLayoutManager userLayoutManager =
(IUserLayoutManager)this.beanFactory.getBean(USER_LAYOUT_MANAGER_PROTOTYPE_BEAN_NAME,
person, profile);

So, I don't understand how the portalEventFactory could be null -- I
would think the app context would fail to come up at all.

This issue effected only 1 of 2 server nodes, and a restart cleared it
up.

Any thoughts?

drew


** STACK TRACE **

SEVERE: Servlet.service() for servlet MVCDispatcherServlet threw
exception
java.lang.NullPointerException
at
org.jasig.portal.layout.dlm.DistributedLayoutManager.addNode(DistributedLayoutManager.java:455)

at
org.jasig.portal.layout.TransientUserLayoutManagerWrapper.addNode(TransientUserLayoutManagerWrapper.java:158)

at
org.jasig.portal.layout.dlm.remoting.UpdatePreferencesServlet.addPortlet(UpdatePreferencesServlet.java:576)

at sun.reflect.GeneratedMethodAccessor544.invoke(Unknown Source)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:597)
at
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)

at
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:436)

at
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424)

at
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790)

at
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)

at
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:669)

at
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:585)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)

at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

at
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:70)

at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)

at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

at
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)

at
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)

at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)

at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

at
org.springframework.web.filter.ShallowEtagHeaderFilter.doFilterInternal(ShallowEtagHeaderFilter.java:58)

at
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)

at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)

at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

at
org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:83)

at
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)

at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)

at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

at
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:369)

at
org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109)

at
org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83)

at
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381)

at
org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:97)

at
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381)

at
org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:100)

at
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381)

at
org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:78)

at
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381)

at
org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54)

at
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381)

at
org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:35)

at
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381)

at
org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:177)

at
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381)

at
org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:91)

at
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381)

at
org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:187)

at
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381)

at
org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter.doFilter(AbstractPreAuthenticatedProcessingFilter.java:89)

at
org.jasig.portal.spring.security.preauth.PortalPreAuthenticatedProcessingFilter.doFilter(PortalPreAuthenticatedProcessingFilter.java:106)

at
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381)

at
org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105)

at
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381)

at
org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79)

at
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381)

at
org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:168)

at
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)

at
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)

at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)

at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

at
org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:113)

at
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)

at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)

at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)

at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)

at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)

at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)

at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)

at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)

at
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)

at
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)

at
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:662)



Attachment: smime.p7s
Description: S/MIME Cryptographic Signature

Reply via email to