You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by ak...@apache.org on 2004/09/22 11:39:34 UTC
svn commit: rev 47040 - incubator/directory/seda/trunk/src/java/org/apache/seda/event
Author: akarasulu
Date: Wed Sep 22 02:39:32 2004
New Revision: 47040
Added:
incubator/directory/seda/trunk/src/java/org/apache/seda/event/RoutingAdvice.java
Modified:
incubator/directory/seda/trunk/src/java/org/apache/seda/event/DefaultEventRouter.java
incubator/directory/seda/trunk/src/java/org/apache/seda/event/EventRouter.java
Log:
Commit changes ...
o added RoutingAdvice interface
o added method to apply advice to routing
o added 1/2 implementation to publish
Todos ...
o figure out what effective advice when is more than one advice is applicable
o add changes for multiple applicaple advice to publish()
o write some unit test cases to make sure this thing works and complies with
the specified semantics.
Modified: incubator/directory/seda/trunk/src/java/org/apache/seda/event/DefaultEventRouter.java
==============================================================================
--- incubator/directory/seda/trunk/src/java/org/apache/seda/event/DefaultEventRouter.java (original)
+++ incubator/directory/seda/trunk/src/java/org/apache/seda/event/DefaultEventRouter.java Wed Sep 22 02:39:32 2004
@@ -17,9 +17,9 @@
package org.apache.seda.event;
-import java.util.Set;
-import java.util.HashSet;
+import java.util.List;
import java.util.Iterator;
+import java.util.ArrayList;
import java.util.EventObject;
@@ -31,8 +31,10 @@
*/
public class DefaultEventRouter implements EventRouter
{
- /** the set of subscriptions made with this router */
- private Set subscriptions = new HashSet();
+ /** a list of applied routing advice */
+ private List adviceList = new ArrayList( 2 );
+ /** the list of subscriptions made with this router */
+ private List subscriptions = new ArrayList( 15 );
/** the monitor - initially set to the null monitor */
private EventRouterMonitor monitor = new EventRouterMonitorAdapter();
@@ -152,36 +154,108 @@
*/
public void publish( EventObject event )
{
- final Subscription [] l_subscriptions;
-
+ final ArrayList applicableAdvice = new ArrayList();
+
+ // --------------------------------------------------------------------
+ // Try and see what advice we can apply
+ // --------------------------------------------------------------------
+
+ synchronized( adviceList )
+ {
+ for ( int ii = 0; ii < adviceList.size(); ii++ )
+ {
+ RoutingAdvice advice = ( RoutingAdvice ) adviceList.get( ii ) ;
+
+ if ( advice.isApplicable( event ) )
+ {
+ applicableAdvice.add( advice );
+ }
+ }
+ }
+
+
+ Subscription[] subscrArray;
synchronized ( subscriptions )
{
- l_subscriptions = ( Subscription [] ) subscriptions
+ subscrArray = ( Subscription [] ) subscriptions
.toArray( new Subscription [ subscriptions.size() ] );
}
- for ( int ii = 0; ii < l_subscriptions.length; ii++ )
+ if ( applicableAdvice.isEmpty() )
{
- boolean isAssignable = l_subscriptions[ii].getType()
- .isAssignableFrom( event.getClass() );
-
+
+ publish( event, subscrArray );
+ return;
+ }
+
+
+ if ( applicableAdvice.size() == 1 )
+ {
+ RoutingAdvice advice = ( RoutingAdvice ) adviceList.get( 0 ) ;
+ publish( advice.getEvent( event ),
+ advice.getSubscriptions( event, subscrArray ) );
+ return;
+ }
+
+ throw new UnsupportedOperationException( "only one advice supported" );
+
+ /*
+ * you know I'm still not sure what sematics are best here whether to
+ * keep resubsituting events and the subscriptions or what.
+ *
+
+ EventObject newEvent = null;
+ for ( int ii = 0; ii < applicableAdvice.size(); ii++ )
+ {
+ RoutingAdvice advice = ( RoutingAdvice ) adviceList.get( ii ) ;
+
+ if ( ii >= applicableAdvice.size() - 1 )
+ {
+ newEvent = advice.getEvent( event );
+
+ }
+ }
+ */
+
+ }
+
+
+
+ private void publish( EventObject ev, Subscription[] subscriptions )
+ {
+ for ( int ii = 0; ii < subscriptions.length; ii++ )
+ {
+ boolean isAssignable = subscriptions[ii].getType()
+ .isAssignableFrom( ev.getClass() );
+
if ( ! isAssignable )
{
continue;
}
-
- if ( l_subscriptions[ii].getFilter() == null )
+
+ if ( subscriptions[ii].getFilter() == null )
{
- l_subscriptions[ii].getSubscriber().inform( event );
+ subscriptions[ii].getSubscriber().inform( ev );
}
- else if ( l_subscriptions[ii].getFilter().accept( event ) )
+ else if ( subscriptions[ii].getFilter().accept( ev ) )
{
- l_subscriptions[ii].getSubscriber().inform( event );
+ subscriptions[ii].getSubscriber().inform( ev );
}
}
}
-
-
+
+
+ /**
+ * Adds advice to the advice list.
+ *
+ * @param advice the advice to apply
+ */
+ public void apply( RoutingAdvice advice )
+ {
+ adviceList.add( advice );
+ }
+
+
/**
* Sets the event router's monitor.
*
Modified: incubator/directory/seda/trunk/src/java/org/apache/seda/event/EventRouter.java
==============================================================================
--- incubator/directory/seda/trunk/src/java/org/apache/seda/event/EventRouter.java (original)
+++ incubator/directory/seda/trunk/src/java/org/apache/seda/event/EventRouter.java Wed Sep 22 02:39:32 2004
@@ -41,7 +41,7 @@
/**
* Subscribes an event subscriber.
*
- * @param type an event type enumeration value
+ * @param type an event type
* @param subscriber the Subscriber to subscribe
*/
void subscribe( Class type, Subscriber subscriber );
@@ -56,6 +56,7 @@
/**
* Unsubscribes an event subscriber.
*
+ * @param type an event type
* @param subscriber the Subscriber to unsubscribe
*/
void unsubscribe( Class type, Subscriber subscriber );
@@ -67,4 +68,11 @@
* @param event the event to publish
*/
void publish( EventObject event );
+
+ /**
+ * Applies some routing advice to applicable events.
+ *
+ * @param advice the advice to apply
+ */
+ void apply( RoutingAdvice advice );
}
Added: incubator/directory/seda/trunk/src/java/org/apache/seda/event/RoutingAdvice.java
==============================================================================
--- (empty file)
+++ incubator/directory/seda/trunk/src/java/org/apache/seda/event/RoutingAdvice.java Wed Sep 22 02:39:32 2004
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2004 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.seda.event;
+
+
+import java.util.EventObject;
+
+
+/**
+ * Used to add another dimension to making fine grained routing decisions.
+ * RoutingAdvice can add to or prune from the registered set of Subscriptions.
+ * They can transform the event by cloning before Subscribers are informed.
+ * Other types of logic using these substitutions can be used to implement a
+ * gambit of routing rules and behavoirs. These objects are stackable in that
+ * more than one piece of advice can be used to route the same event: this is
+ * acheived by feeding the result of one advice operation into the input of
+ * another in a chain.
+ *
+ * @author <a href="mailto:directory-dev@incubator.apache.org">Apache Directory Project</a>
+ * @version $Rev$
+ */
+public interface RoutingAdvice
+{
+ /**
+ * Returns an alternative list of Subscriptions which may or may not be
+ * the same as those already registered with the router service.
+ *
+ * @param ev the original event without any chained substitutions
+ * @param subscriptions the subscriptions already registered with the router
+ * @return the advised list of subscriptions to use instead
+ */
+ public Subscription[] getSubscriptions( EventObject ev, Subscription[] subscriptions );
+
+
+ /**
+ * Gets an alternative event to use as the argument to inform Subscribers
+ * which may or may not be the same as the event argument.
+ *
+ * @param ev the event being published
+ * @return the advised event to use instead
+ */
+ public EventObject getEvent( EventObject ev );
+
+
+ /**
+ * Checks to see if this advice is applicable to an event.
+ *
+ * @param ev the event to check for advice applicability
+ * @return true if this advice applies, false otherwise
+ */
+ public boolean isApplicable( EventObject ev );
+}