You are viewing a plain text version of this content. The canonical link for it is here.
Posted to slide-dev@jakarta.apache.org by df...@apache.org on 2004/05/12 13:09:48 UTC

cvs commit: jakarta-slide/src/webdav/server/org/apache/slide/webdav/event Subscriber.java NotificationTrigger.java

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: slide-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: slide-dev-help@jakarta.apache.org