[jboss-jira] [JBoss JIRA] Created: (JBPORTAL-1708) Identity APIs should invalidate cache on update/change of role membership

Andrew Oliver (JIRA) jira-events at lists.jboss.org
Thu Sep 20 09:01:12 EDT 2007


Identity APIs should invalidate cache on update/change of role membership
-------------------------------------------------------------------------

                 Key: JBPORTAL-1708
                 URL: http://jira.jboss.com/jira/browse/JBPORTAL-1708
             Project: JBoss Portal
          Issue Type: Bug
      Security Level: Public (Everyone can see)
          Components: Portal Identity
    Affects Versions: 2.6.1 Final
            Reporter: Andrew Oliver


Consider this code:

			String username = request.getParameter("username");
			User user= usermodule.findUserByUserName(username);
			System.err.println("user was equal to "+(user == null ? "null" : user.getUserName()));
			Role role = rolemodule.findRoleByName("approved");
			Set users = new HashSet();
			users.add(user);
			membership.assignUsers(role, users);

And this code:

			Role roleApproved = rolemodule.findRoleByName("approved");
			Set usersApproved = membership.getUsers(roleApproved);

With the default Hibernate settings for identity in server\default\deploy\jboss-portal.sar\conf\hibernate\user\hibernate.cfg.xml:

      <property name="cache.use_second_level_cache">true</property>
      <property name="cache.use_query_cache">true</property>

The second bit of code doesn't see changes by the first bit of code until the portal is restarted (it seems).  

Switching these to false solves the problem.  It is likely that this is due to the HibernateMembershipModuleImpl and the        <set
          name="roles"
          table="jbp_role_membership"
          lazy="false"
          inverse="false"
          cascade="none"
          sort="unsorted">
          <cache usage="read-write"/>
          <key column="jbp_uid"/>
          <many-to-many
             class="org.jboss.portal.identity.db.HibernateRoleImpl"
             column="jbp_rid"
             outer-join="true"/>
       </set>
which specifies a cached collection and in http://viewvc.jboss.org/cgi-bin/viewvc.cgi/portal/branches/JBoss_Portal_Branch_2_6/identity/src/main/org/jboss/portal/identity/db/HibernateMembershipModuleImpl.java?revision=7695&view=markup&pathrev=7695
   public void assignRoles(User user, Set roles) throws IdentityException
   {
      //throw new UnsupportedOperationException("Not yet implemented");
      if (!(user instanceof HibernateUserImpl))
      {
         throw new IllegalArgumentException("User is not a HibernateUserImpl user");
      }

      // We make a defensive copy with unwrapped maps and update with a new set
      Set copy = new HashSet();
      for (Iterator i = roles.iterator(); i.hasNext();)
      {
         Object o = i.next();
         if (o instanceof HibernateRoleImpl)
         {
            copy.add(o);
         }
         else
         {
            throw new IllegalArgumentException("Only HibernateRoleImpl roles can be accepted");
         }
      }

      // Assign new roles
      HibernateUserImpl ui = (HibernateUserImpl)user;
      ui.setRoles(copy);
   }

The defensive copy which avoids the hibernate collection probably prevents triggering of the cache invalidation logic in the many-many relationship (not 100% sure that this is how hibernate works for collection caching but it seems logical).

The hibernate membership module's usage of hibernate is a bit odd and probably needs review anyhow.  

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.jboss.com/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        



More information about the jboss-jira mailing list