Uploaded image for project: 'Confluence Data Center'
  1. Confluence Data Center
  2. CONFSERVER-8686

Requesting personal information entity of a user failed when user had no previously created personal information entity

    XMLWordPrintable

Details

    • Bug
    • Resolution: Answered
    • Medium
    • None
    • 2.5.1
    • None
    • Confluence 2.5.1 on Linux/i686, Sun JDK 1.6u1, Resin 3 pro, IBM DB2 8

    Description

      At my organization we have developed a filter (net.itella.confluence.profile.UpdateProfilePictureFilter) for Confluence which automatically sets the profile picture of users to a photograph of the user if needed. This seems to sometime fail when the user doesn't have personal information entity saved in the database yet. This happens due to the fact that when requesting the Personal Information object of a user (method com.atlassian.confluence.user.actions.AbstractUserProfileAction.getPersonalInformationEntity()), in the Personal Information Manager (com.atlassian.confluence.user.DefaultPersonalInformationManager) a new Personal Information object for the requested user is created if no existing Personal Information object couldn't be found using the Personal Information DAO (lines 39-41 of DefaultPersonalInformationManager.java). However, the underlying Hibernate session is in read-only mode and thus an org.springframework.dao.InvalidDataAccessApiUsageException is thrown. Below is the full stack trace and after that the relevat part of UpdateProfilePictureFilter is shown.

      org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER) - turn your Session into FlushMode.AUTO or remove 'readOnly' marker from transaction definition
      at org.springframework.orm.hibernate.HibernateTemplate.checkWriteOperationAllowed(HibernateTemplate.java:999)
      at org.springframework.orm.hibernate.HibernateTemplate$16.doInHibernate(HibernateTemplate.java:531)
      at org.springframework.orm.hibernate.HibernateTemplate.execute(HibernateTemplate.java:312)
      at org.springframework.orm.hibernate.HibernateTemplate.saveOrUpdate(HibernateTemplate.java:529)
      at com.atlassian.confluence.core.persistence.hibernate.VersionedHibernateObjectDao.save(VersionedHibernateObjectDao.java:106)
      at com.atlassian.confluence.core.DefaultContentEntityManager.saveContentEntity(DefaultContentEntityManager.java:62)
      at com.atlassian.confluence.user.DefaultPersonalInformationManager.savePersonalInformation(DefaultPersonalInformationManager.java:64)
      at com.atlassian.confluence.user.DefaultPersonalInformationManager.createPersonalInformation(DefaultPersonalInformationManager.java:54)
      at com.atlassian.confluence.user.DefaultPersonalInformationManager._getPersonalInformation(DefaultPersonalInformationManager.java:41)
      at com.atlassian.confluence.user.DefaultPersonalInformationManager.getPersonalInformation(DefaultPersonalInformationManager.java:34)
      at sun.reflect.GeneratedMethodAccessor693.invoke(Unknown Source)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:597)
      at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:284)
      at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:155)
      at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:122)
      at com.atlassian.spring.interceptors.SpringProfilingInterceptor.invoke(SpringProfilingInterceptor.java:20)
      at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:144)
      at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:56)
      at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:144)
      at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:174)
      at $Proxy14.getPersonalInformation(Unknown Source)
      at com.atlassian.confluence.user.actions.AbstractUserProfileAction.getPersonalInformationEntity(AbstractUserProfileAction.java:199)
      at net.itella.confluence.profile.UpdateProfilePictureFilter$UpdateProfilePictureFilterAction.hasProfilePicture(UpdateProfilePictureFilter.java:175)
      at net.itella.confluence.profile.UpdateProfilePictureFilter$UpdateProfilePictureFilterAction.updateProfilePicture(UpdateProfilePictureFilter.java:92)
      at net.itella.confluence.profile.UpdateProfilePictureFilter.doFilter(UpdateProfilePictureFilter.java:53)
      at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:70)
      at com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(PageFilter.java:117)
      at com.atlassian.confluence.util.profiling.ProfilingPageFilter.parsePage(ProfilingPageFilter.java:137)
      at com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:51)
      at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:70)
      at net.itella.confluence.filters.HackedServletContextThreadLocalFilter.doFilter(HackedServletContextThreadLocalFilter.java:19)
      at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:70)
      at com.atlassian.confluence.util.LoggingContextFilter.doFilter(LoggingContextFilter.java:46)
      at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:70)
      at com.atlassian.confluence.util.UserThreadLocalFilter.doFilter(UserThreadLocalFilter.java:44)
      at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:70)
      at com.atlassian.seraph.filter.SecurityFilter.doFilter(SecurityFilter.java:182)
      at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:70)
      at com.atlassian.seraph.filter.LoginFilter.doFilter(LoginFilter.java:159)
      at net.itella.confluence.ubilogin.ConfluenceUbiloginLoginFilter.doFilter(ConfluenceUbiloginLoginFilter.java:98)
      at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:70)
      at com.atlassian.confluence.util.ClusterHeaderFilter.doFilter(ClusterHeaderFilter.java:35)
      at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:70)
      at com.atlassian.johnson.filters.JohnsonFilter.doFilter(JohnsonFilter.java:96)
      at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:70)
      at org.springframework.orm.hibernate.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:172)
      at com.atlassian.spring.filter.FlushingSpringSessionInViewFilter.doFilterInternal(FlushingSpringSessionInViewFilter.java:29)
      at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
      at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:70)
      at com.atlassian.util.profiling.filters.ProfilingFilter.doFilter(ProfilingFilter.java:122)
      at com.atlassian.core.filters.ProfilingAndErrorFilter.doFilter(ProfilingAndErrorFilter.java:27)
      at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:70)
      at com.atlassian.confluence.util.RequestCacheThreadLocalFilter.doFilter(RequestCacheThreadLocalFilter.java:25)
      at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:70)
      at com.atlassian.core.filters.gzip.GzipFilter.doFilter(GzipFilter.java:61)
      at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:70)
      at com.atlassian.core.filters.AbstractEncodingFilter.doFilter(AbstractEncodingFilter.java:37)
      at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:70)
      at com.ubisecure.ubilogin.uwa.UbiloginFilter.doFilter(UbiloginFilter.java:302)
      at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:70)
      at com.ubisecure.util.filter.ProxyFilter.doFilter(ProxyFilter.java:185)
      at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:70)
      at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:173)
      at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:229)
      at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:274)
      at com.caucho.server.port.TcpConnection.run(TcpConnection.java:511)
      at com.caucho.util.ThreadPool.runTasks(ThreadPool.java:516)
      at com.caucho.util.ThreadPool.run(ThreadPool.java:442)
      at java.lang.Thread.run(Thread.java:619)

      The filter code:

      public class UpdateProfilePictureFilter extends AbstractFilter {

      [....]

      private class UpdateProfilePictureFilterAction extends AbstractUserProfileAction {

      [....]

      private boolean hasProfilePicture(File picture) {
      if(picture == null)

      { throw new RuntimeException("picture is null"); }

      Attachment attachment = attachmentManager.getAttachment(getPersonalInformationEntity(), picture.getName()); //this is line 175 of the file
      return attachment != null;
      }

      [....]

      }

      }

      Attachments

        Issue Links

          Activity

            People

              Unassigned Unassigned
              744135a9a5ef Tuomas Jormola
              Votes:
              1 Vote for this issue
              Watchers:
              1 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: