mirror of
				https://github.com/gyurix1968/guacamole-client.git
				synced 2025-10-31 00:53:21 +00:00 
			
		
		
		
	Implemented SessionListenerCollection - a simple auto-populating collection of instances of all available listeners.
This commit is contained in:
		| @@ -0,0 +1,110 @@ | ||||
| package net.sourceforge.guacamole.net.basic.event; | ||||
|  | ||||
| import java.lang.reflect.InvocationTargetException; | ||||
| import java.util.AbstractCollection; | ||||
| import java.util.ArrayList; | ||||
| import java.util.Collection; | ||||
| import java.util.Iterator; | ||||
| import javax.servlet.http.HttpSession; | ||||
| import net.sourceforge.guacamole.GuacamoleException; | ||||
| import net.sourceforge.guacamole.net.basic.GuacamoleClassLoader; | ||||
|  | ||||
| /** | ||||
|  * A collection which iterates over instances of all listeners defined in | ||||
|  * guacamole.properties. For each listener defined in guacamole.properties, a | ||||
|  * new instance is created and stored in this collection. The contents of this | ||||
|  * collection is stored within the HttpSession, and will be reused if available. | ||||
|  * Each listener is instantiated once per session. Listeners are singleton | ||||
|  * classes within the session, but not globally. | ||||
|  *  | ||||
|  * @author Michael Jumper | ||||
|  */ | ||||
| public class SessionListenerCollection extends AbstractCollection { | ||||
|  | ||||
|     /** | ||||
|      * The name of the session attribute which will contain the listener | ||||
|      * collection. | ||||
|      */ | ||||
|     private static final String SESSION_ATTRIBUTE = "__GUAC_LISTENERS"; | ||||
|  | ||||
|     /** | ||||
|      * The wrapped collection of listeners, possibly retrieved from the | ||||
|      * session. | ||||
|      */ | ||||
|     private Collection listeners; | ||||
|      | ||||
|     /** | ||||
|      * Creates a new SessionListenerCollection which stores all listeners | ||||
|      * defined in guacamole.properties in the provided session. If listeners | ||||
|      * are already stored in the provided session, those listeners are used | ||||
|      * instead. | ||||
|      *  | ||||
|      * @param session The HttpSession to store listeners within. | ||||
|      * @throws GuacamoleException If an error occurs while instantiating new | ||||
|      *                            listeners. | ||||
|      */ | ||||
|     public SessionListenerCollection(HttpSession session) throws GuacamoleException { | ||||
|          | ||||
|         // Pull cached listeners from session | ||||
|         listeners = (Collection) session.getAttribute(SESSION_ATTRIBUTE); | ||||
|  | ||||
|         // If no listeners stored, listeners must be loaded first | ||||
|         if (listeners == null) { | ||||
|  | ||||
|             // Load listeners from guacamole.properties | ||||
|             listeners = new ArrayList(); | ||||
|             try { | ||||
|  | ||||
|                 // TODO: Retrieve list of listener classnames from properties | ||||
|                 Class listenerClass = GuacamoleClassLoader.getInstance().loadClass( | ||||
|                         "net.sourceforge.guacamole.test.GenericLoggingListener" | ||||
|                 ); | ||||
|  | ||||
|                 // Instantiate listener | ||||
|                 Object listener = listenerClass.getConstructor().newInstance(); | ||||
|  | ||||
|                 // Add listener to collection of listeners | ||||
|                 listeners.add(listener); | ||||
|  | ||||
|             } | ||||
|             catch (ClassNotFoundException e) { | ||||
|                 throw new GuacamoleException("Could not find listener class.", e); | ||||
|             } | ||||
|             catch (InstantiationException e) { | ||||
|                 throw new GuacamoleException("Listener class is abstract.", e); | ||||
|             } | ||||
|             catch (IllegalAccessException e) { | ||||
|                 throw new GuacamoleException("No access to listener constructor.", e); | ||||
|             } | ||||
|             catch (IllegalArgumentException e) { | ||||
|                 // This should not happen, given there ARE no arguments | ||||
|                 throw new GuacamoleException("Illegal arguments to listener constructor.", e); | ||||
|             } | ||||
|             catch (InvocationTargetException e) { | ||||
|                 throw new GuacamoleException("Error while instantiating listener.", e); | ||||
|             } | ||||
|             catch (NoSuchMethodException e) { | ||||
|                 throw new GuacamoleException("Listener has no default constructor.", e); | ||||
|             } | ||||
|             catch (SecurityException e) { | ||||
|                 throw new GuacamoleException("Security restrictions prevent instantiation of listener.", e); | ||||
|             } | ||||
|  | ||||
|             // Store listeners for next time | ||||
|             session.setAttribute(SESSION_ATTRIBUTE, listeners); | ||||
|              | ||||
|         } | ||||
|          | ||||
|     } | ||||
|      | ||||
|     @Override | ||||
|     public Iterator iterator() { | ||||
|         return listeners.iterator(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public int size() { | ||||
|         return listeners.size(); | ||||
|     } | ||||
|      | ||||
| } | ||||
		Reference in New Issue
	
	Block a user