[Aglets-commits] aglets/src/com/ibm/aglets ListenerList.java, 1.1.1.1, 1.1.1.1.2.1 AgletContextImpl
Status: Beta
Brought to you by:
cat4hire
From: Luca F. <cat...@us...> - 2007-08-27 16:24:55
|
Update of /cvsroot/aglets/aglets/src/com/ibm/aglets In directory sc8-pr-cvs11.sourceforge.net:/tmp/cvs-serv23565/src/com/ibm/aglets Modified Files: Tag: Branch-Integration_of_module_aglets2_1 ListenerList.java AgletContextImpl.java Log Message: The ListenerList is now implemented as a typized linked list. Index: AgletContextImpl.java =================================================================== RCS file: /cvsroot/aglets/aglets/src/com/ibm/aglets/AgletContextImpl.java,v retrieving revision 1.4.2.2 retrieving revision 1.4.2.3 diff -u -d -r1.4.2.2 -r1.4.2.3 --- AgletContextImpl.java 9 Aug 2007 16:49:55 -0000 1.4.2.2 +++ AgletContextImpl.java 25 Aug 2007 12:39:10 -0000 1.4.2.3 @@ -163,10 +163,10 @@ AgletID context_aid = new AgletID("00"); - /* - * + /** + * A list of context listeners. */ - ContextListener listeners = null; + ListenerList listeners = null; EventRunner erunner = null; @@ -250,54 +250,52 @@ // REMIND: critical session _agletProxies.put(aid, proxy); } - synchronized public void addContextListener(ContextListener o) { - if (ADD_LISTENER_PERMISSION == null) { - ADD_LISTENER_PERMISSION = new ContextPermission("listener", - "add"); - } - checkPermission(ADD_LISTENER_PERMISSION); - if (listeners == null) { - listeners = o; - return; - } - synchronized (listeners) { - if (listeners instanceof ListenerList) { - ListenerList tmp = (ListenerList)listeners; - - if (!tmp.contains(o)) { - tmp.addElement(o); - } - } else { - ListenerList tmp = new ListenerList(); - - tmp.addElement(listeners); - tmp.addElement(o); - listeners = tmp; - } - } + + /** + * Adds the specified context listener to the listener lists, only if the listener + * is not already contained in the listener list and if the agent has the right permission. + */ + public synchronized void addContextListener(ContextListener listener) { + // check params + if(listener == null) + return; + + // check if I've the permission to add a listener + // First of all check if I've got a permission already built, otherwise + // build the add listener permission type and store it. + if (ADD_LISTENER_PERMISSION == null) { + ADD_LISTENER_PERMISSION = new ContextPermission("listener","add"); + } + + checkPermission(ADD_LISTENER_PERMISSION); + + // if the listener container is null create a new one + if (listeners == null) + listeners = new ListenerList(); + + // now add the new element + if( ! this.listeners.contains(listener)){ + logger.debug("Adding the context listener " + listener); + this.listeners.add(listener); + } } - /* - * check permission + + + /** + * Checks the specified permission calling the access controller. + * @param permission the permission to check */ + void checkPermission(Permission permission) { + // check arguments + if ((! this._secure) || (permission == null)) { + return; + } - // accessable in package - void checkPermission(Permission p) { - if (!_secure) { - return; - } - - // ---- I don't make sense why doPricileged() - // - final Permission perm = p; - // - AccessController.doPrivileged(new PrivilegedAction() { - // - public Object run() { - // - AccessController.checkPermission(perm); - // - return null; - // - } - // - }); - - // System.out.println("permission="+String.valueOf(p)); - AccessController.checkPermission(p); + // check the permission + AccessController.checkPermission(permission); } + + /** * Clear the cache */ @@ -969,25 +967,35 @@ } } } - synchronized public void removeContextListener(ContextListener o) { - if (REMOVE_LISTENER_PERMISSION == null) { - REMOVE_LISTENER_PERMISSION = new ContextPermission("listener", - "remove"); - } - checkPermission(REMOVE_LISTENER_PERMISSION); - if (listeners == null) { - return; - } - - synchronized (listeners) { - if (listeners == o) { - listeners = null; - } else if (listeners != null - && listeners instanceof ListenerList) { - ((ListenerList)listeners).removeElement(o); - } - } + + /** + * Removes the specified context listener from the list. + */ + public synchronized void removeContextListener(ContextListener listener) { + // check args + if( listener == null ) + return; + + // check to see if the agent has the permission to remove the context + // listener. + if (REMOVE_LISTENER_PERMISSION == null) { + REMOVE_LISTENER_PERMISSION = new ContextPermission("listener","remove"); + } + + checkPermission(REMOVE_LISTENER_PERMISSION); + + // if the listener list is null create a new one + if( this.listeners == null ) + this.listeners = new ListenerList(); + + // now remove the specified listener + if( this.listeners.contains(listener)){ + logger.debug("Removing the context listener " + listener); + this.listeners.remove(listener); + } } + + public AgletProxy retractAglet(Ticket ticket, AgletID aid) throws IOException, AgletException { Index: ListenerList.java =================================================================== RCS file: /cvsroot/aglets/aglets/src/com/ibm/aglets/ListenerList.java,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.2.1 diff -u -d -r1.1.1.1 -r1.1.1.1.2.1 --- ListenerList.java 28 Jul 2001 06:32:00 -0000 1.1.1.1 +++ ListenerList.java 25 Aug 2007 12:39:10 -0000 1.1.1.1.2.1 @@ -35,6 +35,7 @@ import com.ibm.aglets.security.ContextPermission; import java.util.Hashtable; +import java.util.Iterator; import java.util.Properties; import java.util.Enumeration; import java.util.Vector; @@ -69,106 +70,181 @@ import sun.audio.*; import java.applet.AudioClip; -/* - * This class is used to hold the set of observers of an observable - * object whenever there is more than one observer. +/** + * This class is used to hold a list of context listeners and to forward an event to each + * listener. The class works as a linked list, and for each call to notify an event, the class extract + * each context listener and forwards the event to it. + * + * @author Luca Ferrari - cat...@us... + * + * 25/ago/07 */ -final class ListenerList extends java.util.Vector implements ContextListener { +public final class ListenerList extends java.util.LinkedList<ContextListener> implements ContextListener { - /* synchronized */ - public void agletActivated(ContextEvent event) { - for (Enumeration e = elements(); e.hasMoreElements(); ) { - ((ContextListener)e.nextElement()).agletActivated(event); - } + /** + * Notifies all listeners than the aglet has been activated. + */ + public synchronized void agletActivated(ContextEvent event) { + Iterator listener = this.iterator(); + while (listener != null && listener.hasNext()) { + ((ContextListener) listener.next()).agletActivated(event); + + } } - /* synchronized */ - public void agletArrived(ContextEvent event) { - for (Enumeration e = elements(); e.hasMoreElements(); ) { - ((ContextListener)e.nextElement()).agletArrived(event); - } + + /** + * Notifies all listeners than an aglet has arrived. + */ + public synchronized void agletArrived(ContextEvent event) { + Iterator listener = this.iterator(); + while (listener != null && listener.hasNext()) { + ((ContextListener) listener.next()).agletArrived(event); + + } } - /* synchronized */ - public void agletCloned(ContextEvent event) { - for (Enumeration e = elements(); e.hasMoreElements(); ) { - ((ContextListener)e.nextElement()).agletCloned(event); - } + + /** + * Notifies all listeners than an aglet has been cloned. + */ + public synchronized void agletCloned(ContextEvent event) { + Iterator listener = this.iterator(); + while (listener != null && listener.hasNext()) { + ((ContextListener) listener.next()).agletCloned(event); + + } } - /* synchronized */ - public void agletCreated(ContextEvent event) { - for (Enumeration e = elements(); e.hasMoreElements(); ) { - ((ContextListener)e.nextElement()).agletCreated(event); - } + + /** + * Notifies all listeners than an aglet has been created. + */ + public synchronized void agletCreated(ContextEvent event) { + Iterator listener = this.iterator(); + while (listener != null && listener.hasNext()) { + ((ContextListener) listener.next()).agletCreated(event); + + } } - /* synchronized */ - public void agletDeactivated(ContextEvent event) { - for (Enumeration e = elements(); e.hasMoreElements(); ) { - ((ContextListener)e.nextElement()).agletDeactivated(event); - } + + /** + * Notifies all listeners than the aglet has been deactivated. + */ + public synchronized void agletDeactivated(ContextEvent event) { + Iterator listener = this.iterator(); + while (listener != null && listener.hasNext()) { + ((ContextListener) listener.next()).agletDeactivated(event); + + } + } - /* synchronized */ - public void agletDispatched(ContextEvent event) { - for (Enumeration e = elements(); e.hasMoreElements(); ) { - ((ContextListener)e.nextElement()).agletDispatched(event); - } + + /** + * Notifies all listeners than an aglet has been dispatched. + */ + public synchronized void agletDispatched(ContextEvent event) { + Iterator listener = this.iterator(); + while (listener != null && listener.hasNext()) { + ((ContextListener) listener.next()).agletDispatched(event); + + } + } - /* synchronized */ - public void agletDisposed(ContextEvent event) { - for (Enumeration e = elements(); e.hasMoreElements(); ) { - ((ContextListener)e.nextElement()).agletDisposed(event); - } + + /** + * Notifies all listeners than an aglet has been disposed. + */ + public synchronized void agletDisposed(ContextEvent event) { + Iterator listener = this.iterator(); + while (listener != null && listener.hasNext()) { + ((ContextListener) listener.next()).agletDisposed(event); + + } } - /* synchronized */ - public void agletResumed(ContextEvent event) { - for (Enumeration e = elements(); e.hasMoreElements(); ) { - ((ContextListener)e.nextElement()).agletResumed(event); - } + + /** + * Notifies all listeners than an aglet has been resumed. + */ + public synchronized void agletResumed(ContextEvent event) { + Iterator listener = this.iterator(); + while (listener != null && listener.hasNext()) { + ((ContextListener) listener.next()).agletResumed(event); + + } } - /* synchronized */ + + /** + * Notifies all listeners than an aglet has been called home. + */ public void agletReverted(ContextEvent event) { - for (Enumeration e = elements(); e.hasMoreElements(); ) { - ((ContextListener)e.nextElement()).agletReverted(event); - } + Iterator listener = this.iterator(); + while (listener != null && listener.hasNext()) { + ((ContextListener) listener.next()).agletReverted(event); + + } } - /* synchronized */ - public void agletStateChanged(ContextEvent event) { - for (Enumeration e = elements(); e.hasMoreElements(); ) { - ((ContextListener)e.nextElement()).agletStateChanged(event); - } + + /** + * Notifies all listeners than the state of the agent has changed. + */ + public synchronized void agletStateChanged(ContextEvent event) { + Iterator listener = this.iterator(); + while (listener != null && listener.hasNext()) { + ((ContextListener) listener.next()).agletStateChanged(event); + + } } - /* synchronized */ - public void agletSuspended(ContextEvent event) { - for (Enumeration e = elements(); e.hasMoreElements(); ) { - ((ContextListener)e.nextElement()).agletSuspended(event); - } + + /** + * Notifies all listeners than the state of the agent has been suspended. + */ + public synchronized void agletSuspended(ContextEvent event) { + Iterator listener = this.iterator(); + while (listener != null && listener.hasNext()) { + ((ContextListener) listener.next()).agletSuspended(event); + + } } - /* synchronized */ - public void contextShutdown(ContextEvent event) { - for (Enumeration e = elements(); e.hasMoreElements(); ) { - ((ContextListener)e.nextElement()).contextShutdown(event); - } + + /** + * Notifies all listeners that the context has been shut down. + */ + public synchronized void contextShutdown(ContextEvent event) { + Iterator listener = this.iterator(); + while (listener != null && listener.hasNext()) { + ((ContextListener) listener.next()).contextShutdown(event); + + } } - /* synchronized */ - public void contextStarted(ContextEvent event) { - - // int i = size(); - // - // while (--i >= 0) { - // ((ContextListener) elementAt(i)).contextStarted(event); - // } - for (Enumeration e = elements(); e.hasMoreElements(); ) { - ((ContextListener)e.nextElement()).contextStarted(event); - } + + /** + * Notifies all listeners that the context has been started. + */ + public synchronized void contextStarted(ContextEvent event) { + Iterator listener = this.iterator(); + while (listener != null && listener.hasNext()) { + ((ContextListener) listener.next()).contextStarted(event); + + } } - /* synchronized */ - public void showDocument(ContextEvent event) { - for (Enumeration e = elements(); e.hasMoreElements(); ) { - ((ContextListener)e.nextElement()).showDocument(event); - } + + /** + * Notifies of a show document call. + */ + public synchronized void showDocument(ContextEvent event) { + Iterator listener = this.iterator(); + while (listener != null && listener.hasNext()) { + ((ContextListener) listener.next()).showDocument(event); + + } } - /* synchronized */ - public void showMessage(ContextEvent event) { - for (Enumeration e = elements(); e.hasMoreElements(); ) { - ((ContextListener)e.nextElement()).showMessage(event); - } + + /** + * Notifies of a show message call. + */ + public synchronized void showMessage(ContextEvent event) { + Iterator listener = this.iterator(); + while (listener != null && listener.hasNext()) { + ((ContextListener) listener.next()).showMessage(event); + + } } } |