You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jetspeed-dev@portals.apache.org by jf...@apache.org on 2004/07/29 05:45:35 UTC

cvs commit: jakarta-jetspeed/src/java/org/apache/jetspeed/services/security SecurityCacheImpl.java

jford       2004/07/28 20:45:35

  Modified:    src/java/org/apache/jetspeed/services/security
                        SecurityCacheImpl.java
  Log:
  Added messaging support
  
  Revision  Changes    Path
  1.12      +183 -4    jakarta-jetspeed/src/java/org/apache/jetspeed/services/security/SecurityCacheImpl.java
  
  Index: SecurityCacheImpl.java
  ===================================================================
  RCS file: /home/cvs/jakarta-jetspeed/src/java/org/apache/jetspeed/services/security/SecurityCacheImpl.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- SecurityCacheImpl.java	25 Jun 2004 15:50:24 -0000	1.11
  +++ SecurityCacheImpl.java	29 Jul 2004 03:45:35 -0000	1.12
  @@ -21,6 +21,10 @@
   import java.util.Iterator;
   import java.util.Map;
   
  +import javax.jms.JMSException;
  +import javax.jms.Message;
  +import javax.jms.MessageListener;
  +import javax.jms.ObjectMessage;
   import javax.servlet.ServletConfig;
   
   import org.apache.jetspeed.om.security.Group;
  @@ -28,8 +32,10 @@
   import org.apache.jetspeed.om.security.Permission;
   import org.apache.jetspeed.om.security.Role;
   import org.apache.jetspeed.services.JetspeedSecurity;
  +import org.apache.jetspeed.services.Messenger;
   import org.apache.jetspeed.services.logging.JetspeedLogFactoryService;
   import org.apache.jetspeed.services.logging.JetspeedLogger;
  +import org.apache.jetspeed.services.messaging.MessagingService;
   import org.apache.turbine.services.InitializationException;
   import org.apache.turbine.services.TurbineBaseService;
   import org.apache.turbine.services.TurbineServices;
  @@ -44,7 +50,7 @@
   
   
   public class SecurityCacheImpl  extends TurbineBaseService
  -                                implements SecurityCacheService
  +                                implements SecurityCacheService, MessageListener
   {
       /**
        * Static initialization of the logger for this class
  @@ -53,6 +59,7 @@
       
       protected Map acls = new HashMap();
       protected Map perms = new HashMap();
  +    private boolean enableMessaging = false;
   
      /*
       * Utility method for accessing the service
  @@ -118,7 +125,14 @@
           if (!perms.containsKey(role.getName()))
           {
               perms.put(role.getName(), new HashMap());
  -        }        
  +        }
  +        
  +        //is there a need to send this message?
  +        if(enableMessaging)
  +        {
  +            Message message = createMessage(null, role.getName());
  +            Messenger.sendMessage(message, MessagingService.SECURITY_CACHE_UPDATE_SUBJECT);
  +        }
       }
   
       public void addRole(String username, Role role)
  @@ -131,7 +145,13 @@
           if (!perms.containsKey(role.getName()))
           {
               perms.put(role.getName(), new HashMap());
  -        }        
  +        }
  +        
  +        if(enableMessaging)
  +        {
  +            Message message = createMessage(username, null);
  +            Messenger.sendMessage(message, MessagingService.SECURITY_CACHE_UPDATE_SUBJECT);
  +        }
       }
   
   	public void addRole(String username, Role role, Group group)
  @@ -145,6 +165,12 @@
   		{
   			perms.put(role.getName(), new HashMap());
   		}
  +		
  +		if(enableMessaging)
  +        {
  +            Message message = createMessage(username, null);
  +            Messenger.sendMessage(message, MessagingService.SECURITY_CACHE_UPDATE_SUBJECT);
  +        }
   	}
   
   	public boolean hasRole(String username, String roleName)
  @@ -180,6 +206,12 @@
   		{
   			acl.removeRole(roleName, groupName);
   		}
  +		
  +		if(enableMessaging)
  +        {
  +            Message message = createMessage(username, null);
  +            Messenger.sendMessage(message, MessagingService.SECURITY_CACHE_UPDATE_SUBJECT);
  +        }
   	}
   
       public CachedAcl getAcl(String username)
  @@ -215,6 +247,12 @@
           {
               map.put(permission.getName(), permission);
           }
  +        
  +        if(enableMessaging)
  +        {
  +            Message message = createMessage(null, roleName);
  +            Messenger.sendMessage(message, MessagingService.SECURITY_CACHE_UPDATE_SUBJECT);
  +        }
       }
   
       public boolean hasPermission(String roleName, String permissionName)
  @@ -234,6 +272,12 @@
           {
               map.remove(permissionName);
           }
  +        
  +        if(enableMessaging)
  +        {
  +            Message message = createMessage(null, roleName);
  +            Messenger.sendMessage(message, MessagingService.SECURITY_CACHE_UPDATE_SUBJECT);
  +        }
       }
   
       public Iterator getPermissions(String roleName)
  @@ -259,16 +303,38 @@
               acl.removeRole(rolename);
           }
           perms.remove(rolename);
  +        
  +        if(enableMessaging)
  +        {
  +            Message message = createMessage(null, rolename);
  +            Messenger.sendMessage(message, MessagingService.SECURITY_CACHE_UPDATE_SUBJECT);
  +        }
       }
   
       public void removeAllPermissions(String permissionName)
       {
  +        /*
           Iterator iterator = perms.values().iterator();
           while (iterator.hasNext())
           {
               Map map = (Map)iterator.next();
               map.remove(permissionName);
           }
  +        */
  +        
  +        Iterator keyIter = perms.keySet().iterator();
  +        while (keyIter.hasNext())
  +        {
  +            String rolename = (String) keyIter.next();
  +            Map permissions = (Map)perms.get(rolename);
  +            permissions.remove(permissionName);
  +            
  +            if(enableMessaging)
  +            {
  +                Message message = createMessage(null, rolename);
  +                Messenger.sendMessage(message, MessagingService.SECURITY_CACHE_UPDATE_SUBJECT);
  +            }
  +        }
       }
   
       public void loadRolePermissions()
  @@ -312,6 +378,22 @@
           if (getInit()) return;
   
           super.init(conf);
  +        
  +        this.enableMessaging = getConfiguration().getBoolean("enable_messaging", false);
  +        if(enableMessaging)
  +        {
  +            try
  +            {
  +                TurbineServices.getInstance().initService(MessagingService.SERVICE_NAME, conf);
  +        
  +                Messenger.addMessageListener(this, SecurityCacheImpl.class.getName(), MessagingService.SECURITY_CACHE_UPDATE_SUBJECT);
  +            }
  +            catch(Exception e)
  +            {
  +                enableMessaging = false;
  +                logger.warn("Messaging support has been disabled due to a failure to initialize the service or add a listener.");
  +            }
  +        }
   
           setInit(true);
        }
  @@ -337,6 +419,103 @@
           }
   	}
   
  +    /**
  +     * @see javax.jms.MessageListener#onMessage(javax.jms.Message)
  +     */
  +    public void onMessage(Message message)
  +    {
  +        if(message instanceof ObjectMessage)
  +        {
  +            ObjectMessage objMsg = (ObjectMessage)message;
  +            Object obj = null;
  +            try
  +            {
  +                obj = objMsg.getObject();
  +            }
  +            catch (JMSException e)
  +            {
  +                logger.error("Failed to retrieve object from message.");
  +                return;
  +            }
  +            
  +            if((obj != null) && (obj instanceof SecurityMessage))
  +            {
  +                SecurityMessage sm = (SecurityMessage)obj;
  +                String user = sm.getUser();
  +                if(user != null)
  +                {
  +                    try
  +                    {
  +                        this.load(user);
  +                    }
  +                    catch (JetspeedSecurityException e)
  +                    {
  +                        logger.error("Failed to update user.", e);
  +                    }
  +                }
  +                
  +                String role = sm.getRole();
  +                if(role != null)
  +                {
  +                    perms.remove(role);
  +                    loadRolePermissions(role);
  +                }
  +            }
  +        }
  +    }
  +    
  +    private Message createMessage(String userName, String roleName)
  +    {
  +        ObjectMessage objMsg = null;
  +        
  +        try
  +        {
  +            objMsg = (ObjectMessage) Messenger.createMessage(MessagingService.OBJECT_MESSAGE);
  +        
  +            SecurityMessage message = new SecurityMessage();
  +            message.setUser(userName);
  +            message.setRole(roleName);
  +            objMsg.setObject(message);
  +        }
  +        catch (JMSException e)
  +        {
  +            logger.error("Failed to create message.", e);
  +        }
  +        
  +        return objMsg;
  +    }
  +    
  +    public void loadRolePermissions(String roleName)
  +    {
  +        try
  +        {
  +            Role role = null;
  +            try
  +            {
  +                JetspeedSecurity.getRole(roleName);
  +            }
  +            catch(RoleException e)
  +            {
  +                //no role found, nothing to do
  +            }
  +            
  +            if(role != null)
  +            {
  +	            Map map = new HashMap();
  +	            Iterator prms = JetspeedSecurity.getPermissions(role.getName());
  +	            while (prms.hasNext())
  +	            {
  +	                Permission perm = (Permission)prms.next();
  +	                map.put(perm.getName(), perm);
  +	            }
  +	            perms.put(role.getName(), map);
  +            }
  +        }
  +        catch (JetspeedSecurityException e)
  +        {
  +            logger.error("Exception", e);
  +        }
  +    }
   }
   
   
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: jetspeed-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jetspeed-dev-help@jakarta.apache.org