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