luetzkendorf    2004/07/13 02:08:19

  Modified:    src/webdav/server/org/apache/slide/webdav/event
                        NotificationTrigger.java Subscriber.java
  Log:
  some changes to satisfy the notification test cases
  
  Revision  Changes    Path
  1.11      +51 -35    
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.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- NotificationTrigger.java  12 May 2004 11:09:47 -0000      1.10
  +++ NotificationTrigger.java  13 Jul 2004 09:08:18 -0000      1.11
  @@ -80,6 +80,8 @@
       }
   
       public boolean removeSubscriber(Subscriber subscriber) {
  +       Domain.log("Removing subscriber with ID: "+subscriber.getId(), LOG_CHANNEL, 
Logger.INFO);
  +       subscriber.getLifetime().cancel();
          return subscribers.remove(subscriber);
       }
   
  @@ -122,8 +124,11 @@
   
       private void notifySubscribers(EventCollection collection) {
           Map subscriberEnumerations = new HashMap();
  -        ContentEvent[] update = 
EventCollectionFilter.getChangedContents(collection);
           List matchingSubscribers = new ArrayList();
  +
  +        // get subscribers with matching notification types
  +        // (and remember events)
  +        ContentEvent[] update = 
EventCollectionFilter.getChangedContents(collection);
           for ( int i = 0; i < update.length; i++ ) {
               matchingSubscribers.addAll(getSubscribers(Subscriber.UPDATE, 
update[i]));
           }
  @@ -136,34 +141,42 @@
               matchingSubscribers.addAll(getSubscribers(Subscriber.DELETE, 
delete[i]));
           }
           // FIXME: Add methods for MOVE, and NEW_MAIL (??) to get full exchange 
notification compliance
  +        
  +        // notifiy subscribers
           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);
  -                     }
  -             }
  +           final Subscriber subscriber = (Subscriber)i.next();
  +           
  +           // skip subscribers that has no callback (we can't notify them)
  +           if (!subscriber.hasCallback()) continue;
  +           
  +           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();
  @@ -185,14 +198,16 @@
           }
       }
   
  -    private void notifySubscriber(String callback, String subscribers) {
  +    protected void notifySubscriber(String callback, String subscribers) {
           if ( callback.startsWith(TCP_PROTOCOL) ) {
               Domain.log("Notify subscribers with adress='"+callback+"' via TCP with 
id's "+subscribers, LOG_CHANNEL, Logger.INFO);
               NotifyMethod notifyMethod = new NotifyMethod(callback.toString());
               notifyMethod.addRequestHeader(H_SUBSCRIPTION_ID_RESPONSE, subscribers);
               try {
                   URL url = new URL(callback);
  -                int state = notifyMethod.execute(new HttpState(), new 
HttpConnection(url.getHost(), url.getPort()));
  +                notifyMethod.execute(
  +                      new HttpState(), new HttpConnection(url.getHost(), 
  +                            url.getPort()!=-1 ? url.getPort() : 80));
               } catch (IOException e) {
                   Domain.log("Notification of subscriber '"+callback.toString()+"' 
failed!");
               }
  @@ -203,7 +218,8 @@
                   String notification = "NOTIFY "+callback+" 
HTTP/1.1\nSubscription-id: "+subscribers;
                   byte[] buf = notification.getBytes();
                   InetAddress address = InetAddress.getByName(url.getHost());
  -                DatagramPacket packet = new DatagramPacket(buf, buf.length, 
address, url.getPort());
  +                DatagramPacket packet = new DatagramPacket(
  +                      buf, buf.length, address, url.getPort()!=-1 ? url.getPort() : 
80);
                   socket.send(packet);
               } catch (IOException e) {
                   Domain.log("Notification of subscriber '"+callback.toString()+"' 
failed!", LOG_CHANNEL, Logger.ERROR);
  
  
  
  1.9       +11 -7     
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.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- Subscriber.java   2 Jul 2004 12:04:28 -0000       1.8
  +++ Subscriber.java   13 Jul 2004 09:08:18 -0000      1.9
  @@ -90,9 +90,9 @@
        // check if event matches notification-type
        // see 
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wss/wss/_webdav_notification_type_header.asp
        // for details
  -     if ( notificationType.equals(type) || 
  -             ( type.equals(NEW_MEMBER) && notificationType.equals(UPDATE) && depth 
== 1 ) || 
  -             ( type.equals(DELETE) && notificationType.equals(UPDATE) && depth == 1 
) ){
  +     if ( type.equalsIgnoreCase(notificationType) || 
  +             ( type.equalsIgnoreCase(NEW_MEMBER) && 
notificationType.equalsIgnoreCase(UPDATE) && depth > 0 ) || 
  +             ( type.equalsIgnoreCase(DELETE) && 
notificationType.equalsIgnoreCase(UPDATE) && depth > 0 ) ){
                String eventUri = event.getUri();
                if ( eventUri != null && uri != null ) {
                        if ( depth == 0 && eventUri.equals(uri.toString()) ) return 
true;
  @@ -107,6 +107,10 @@
           return false;
       }
   
  +    public boolean hasCallback() {
  +       return this.callback != null && this.callback.length() > 0;
  +    }
  +    
       public String getCallback() {
           return callback;
       }
  
  
  

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

Reply via email to