dflorey     2004/05/12 04:09:48

  Modified:    src/webdav/server/org/apache/slide/webdav/event
                        Subscriber.java NotificationTrigger.java
  Log:
  Added notification support for Delete and Update/newmember notification type to 
improve exchange compliance
  
  Revision  Changes    Path
  1.7       +23 -18    
jakarta-slide/src/webdav/server/org/apache/slide/webdav/event/Subscriber.java
  
  Index: Subscriber.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/event/Subscriber.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- Subscriber.java   11 May 2004 15:22:54 -0000      1.6
  +++ Subscriber.java   12 May 2004 11:09:47 -0000      1.7
  @@ -23,11 +23,9 @@
   
   package org.apache.slide.webdav.event;
   
  -import org.apache.slide.event.EventCollection;
   import org.apache.slide.event.ResourceEvent;
   import org.apache.slide.webdav.method.AbstractWebdavMethod;
   
  -import java.net.URL;
   import java.util.ArrayList;
   import java.util.List;
   import java.util.StringTokenizer;
  @@ -39,7 +37,12 @@
    */
   public class Subscriber {
       protected static final String LOG_CHANNEL = Subscriber.class.getName();
  -
  +    final static String UPDATE = "Update";
  +    final static String DELETE = "Delete";
  +    final static String MOVE = "Move";
  +    final static String NEW_MEMBER = "Update/newmember";
  +    final static String NEW_MAIL = 
"pragma/<http://schemas.microsoft.com/exchange/newmail>";
  +    
       private String callback;
       private String notificationType, uri;
       private int depth, notificationDelay, subscriptionLifetime, id;
  @@ -83,17 +86,19 @@
           this.notify = notify;
       }
   
  -    public boolean matches(ResourceEvent event) {
  -        String eventUri = event.getUri();
  -        if ( eventUri != null && uri != null ) {
  -             if ( depth == 0 && eventUri.equals(uri.toString()) ) return true;
  -             if ( depth == AbstractWebdavMethod.INFINITY && 
eventUri.startsWith(uri.toString()) ) return true;
  -             if ( eventUri.startsWith(uri.toString() )) {
  -             String subpath = eventUri.substring(uri.toString().length());   
  -             StringTokenizer tokenizer = new StringTokenizer(subpath, "/");
  -             if ( tokenizer.countTokens() <= depth ) return true;
  -             }
  -        }
  +    public boolean matches(String type, ResourceEvent event) {
  +     if ( notificationType.equals(type) ) {
  +             String eventUri = event.getUri();
  +             if ( eventUri != null && uri != null ) {
  +                     if ( depth == 0 && eventUri.equals(uri.toString()) ) return 
true;
  +                     if ( depth == AbstractWebdavMethod.INFINITY && 
eventUri.startsWith(uri.toString()) ) return true;
  +                     if ( eventUri.startsWith(uri.toString() )) {
  +                             String subpath = 
eventUri.substring(uri.toString().length());   
  +                             StringTokenizer tokenizer = new 
StringTokenizer(subpath, "/");
  +                             if ( tokenizer.countTokens() <= depth ) return true;
  +                     }
  +             }
  +     }
           return false;
       }
   
  
  
  
  1.10      +49 -41    
jakarta-slide/src/webdav/server/org/apache/slide/webdav/event/NotificationTrigger.java
  
  Index: NotificationTrigger.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/event/NotificationTrigger.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- NotificationTrigger.java  26 Apr 2004 11:40:58 -0000      1.9
  +++ NotificationTrigger.java  12 May 2004 11:09:47 -0000      1.10
  @@ -122,41 +122,48 @@
   
       private void notifySubscribers(EventCollection collection) {
           Map subscriberEnumerations = new HashMap();
  -        // FIXME: Add event method based dispatching... At the moment only update 
events are handled
           ContentEvent[] update = 
EventCollectionFilter.getChangedContents(collection);
  +        List matchingSubscribers = new ArrayList();
           for ( int i = 0; i < update.length; i++ ) {
  -            Subscriber[] subscribers = getSubscribers(update[i]);
  -            for ( int j = 0; j < subscribers.length; j++ ) {
  -                final Subscriber subscriber = subscribers[j];
  -                if ( subscriber.getNotificationDelay() == 0 ) {
  -                    // send notification without delay
  -                    List idList = 
(List)subscriberEnumerations.get(subscriber.getCallback());
  -                    if ( idList == null ) {
  -                        idList = new ArrayList();
  -                        subscriberEnumerations.put(subscriber.getCallback(), 
idList);
  -                    }
  -                    Integer subscriberId = new Integer(subscriber.getId());
  -                    if ( !idList.contains(subscriberId) ) {
  -                        idList.add(subscriberId);
  -                    }
  -                } else {
  -                    // send delayed notification
  -                    TimerTask notifyTask = subscriber.getNotify();
  -                    if ( notifyTask == null ) {
  -                        Domain.log("Starting notification delay: 
"+subscriber.getNotificationDelay(), LOG_CHANNEL, Logger.INFO);
  -                        notifyTask = new TimerTask() {
  -                            public void run() {
  -                                notifySubscriber(subscriber.getCallback(), 
String.valueOf(subscriber.getId()));
  -                                subscriber.setNotify(null);
  -                            }
  -                        };
  -                        subscriber.setNotify(notifyTask);
  -                        timer.schedule(notifyTask, 
subscriber.getNotificationDelay()*1000);
  -                    }
  -                }
  -                // remember this event for later poll method call
  -                ((Subscriber)subscriber).addEvent(update[i]);
  -            }
  +            matchingSubscribers.addAll(getSubscribers(Subscriber.UPDATE, 
update[i]));
  +        }
  +        ContentEvent[] create = 
EventCollectionFilter.getCreatedContents(collection);
  +        for ( int i = 0; i < create.length; i++ ) {
  +            matchingSubscribers.addAll(getSubscribers(Subscriber.NEW_MEMBER, 
create[i]));
  +        }
  +        ContentEvent[] delete = 
EventCollectionFilter.getRemovedContents(collection);
  +        for ( int i = 0; i < delete.length; i++ ) {
  +            matchingSubscribers.addAll(getSubscribers(Subscriber.DELETE, 
delete[i]));
  +        }
  +        // FIXME: Add methods for MOVE, and NEW_MAIL (??) to get full exchange 
notification compliance
  +        for ( Iterator i = matchingSubscribers.iterator(); i.hasNext(); ) {
  +             final Subscriber subscriber = (Subscriber)i.next();
  +             if ( subscriber.getNotificationDelay() == 0 ) {
  +                     // send notification without delay
  +                     List idList = 
(List)subscriberEnumerations.get(subscriber.getCallback());
  +                     if ( idList == null ) {
  +                             idList = new ArrayList();
  +                             subscriberEnumerations.put(subscriber.getCallback(), 
idList);
  +                     }
  +                     Integer subscriberId = new Integer(subscriber.getId());
  +                     if ( !idList.contains(subscriberId) ) {
  +                             idList.add(subscriberId);
  +                     }
  +             } else {
  +                     // send delayed notification
  +                     TimerTask notifyTask = subscriber.getNotify();
  +                     if ( notifyTask == null ) {
  +                             Domain.log("Starting notification delay: 
"+subscriber.getNotificationDelay(), LOG_CHANNEL, Logger.INFO);
  +                             notifyTask = new TimerTask() {
  +                                     public void run() {
  +                                             
notifySubscriber(subscriber.getCallback(), String.valueOf(subscriber.getId()));
  +                                             subscriber.setNotify(null);
  +                                     }
  +                             };
  +                             subscriber.setNotify(notifyTask);
  +                             timer.schedule(notifyTask, 
subscriber.getNotificationDelay()*1000);
  +                     }
  +             }
           }
           for ( Iterator i = subscriberEnumerations.entrySet().iterator(); 
i.hasNext(); ) {
               Map.Entry entry = (Map.Entry)i.next();
  @@ -204,16 +211,17 @@
           }
       }
   
  -    private Subscriber []getSubscribers(ResourceEvent event) {
  +    private List getSubscribers(String type, ResourceEvent event) {
           List matchingSubscribers = new ArrayList();
           for ( Iterator i = subscribers.iterator(); i.hasNext(); ) {
               Subscriber subscriber = (Subscriber)i.next();
  -            if ( subscriber.matches(event)) {
  +            if ( subscriber.matches(type, event)) {
                   matchingSubscribers.add(subscriber);
  +             // remember this event for later poll method call
  +             subscriber.addEvent(event);
               }
           }
  -        Subscriber[] subscribers = new Subscriber[matchingSubscribers.size()];
  -        return (Subscriber [])matchingSubscribers.toArray(subscribers);
  +        return matchingSubscribers;
       }
   
       public void configure(Configuration configuration) throws 
ConfigurationException {
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to