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)
Attachment attachment = attachmentManager.getAttachment(getPersonalInformationEntity(), picture.getName()); //this is line 175 of the file
return attachment != null;
}
[....]
}
}
Attachments
Issue Links
- relates to
-
CONFSERVER-16601 "Create Personal Space" menu item missing for some users, particularly LDAP users
- Closed