You are viewing a plain text version of this content. The canonical link for it is here.
Posted to savan-dev@ws.apache.org by ch...@apache.org on 2007/05/20 05:11:46 UTC

svn commit: r539821 - in /webservices/savan/trunk/java/src: main/config/ main/java/org/apache/savan/configuration/ main/java/org/apache/savan/eventing/ main/java/org/apache/savan/eventing/subscribers/ main/java/org/apache/savan/filters/ main/java/org/a...

Author: chamikara
Date: Sat May 19 20:11:44 2007
New Revision: 539821

URL: http://svn.apache.org/viewvc?view=rev&rev=539821
Log:
Refactored and updated the Savan codebase.
InHandler and outHander were removed. Now all the processing happens in the MessageReceiver level.
Changed the in-memory Publishing API to void sendPublication (OMElement eventData, AxisService service, URI eventName)


Added:
    webservices/savan/trunk/java/src/main/java/org/apache/savan/subscribers/Subscriber.java
      - copied, changed from r537482, webservices/savan/trunk/java/src/main/java/org/apache/savan/subscribers/AbstractSubscriber.java
    webservices/savan/trunk/java/src/main/java/org/apache/savan/subscribers/SubscriberGroup.java
      - copied, changed from r537482, webservices/savan/trunk/java/src/main/java/org/apache/savan/subscribers/CompositeSubscriber.java
Removed:
    webservices/savan/trunk/java/src/main/java/org/apache/savan/eventing/subscribers/EventingLeafSubscriber.java
    webservices/savan/trunk/java/src/main/java/org/apache/savan/eventing/subscribers/EventingTopicSubscriber.java
    webservices/savan/trunk/java/src/main/java/org/apache/savan/handlers/
    webservices/savan/trunk/java/src/main/java/org/apache/savan/subscribers/AbstractSubscriber.java
    webservices/savan/trunk/java/src/main/java/org/apache/savan/subscribers/CompositeSubscriber.java
    webservices/savan/trunk/java/src/main/java/org/apache/savan/subscribers/LeafSubscriber.java
    webservices/savan/trunk/java/src/test/java/org/apache/axis2/savan/CompositeSubscriberTest.java
    webservices/savan/trunk/java/src/test/java/org/apache/axis2/savan/ConpositeSubscriberTest.java
Modified:
    webservices/savan/trunk/java/src/main/config/savan-config.xml
    webservices/savan/trunk/java/src/main/java/org/apache/savan/configuration/ConfigurationManager.java
    webservices/savan/trunk/java/src/main/java/org/apache/savan/configuration/MappingRules.java
    webservices/savan/trunk/java/src/main/java/org/apache/savan/configuration/Protocol.java
    webservices/savan/trunk/java/src/main/java/org/apache/savan/eventing/EventingMessageReceiverDeligater.java
    webservices/savan/trunk/java/src/main/java/org/apache/savan/eventing/EventingSubscriptionProcessor.java
    webservices/savan/trunk/java/src/main/java/org/apache/savan/eventing/EventingUtilFactory.java
    webservices/savan/trunk/java/src/main/java/org/apache/savan/eventing/subscribers/EventingSubscriber.java
    webservices/savan/trunk/java/src/main/java/org/apache/savan/filters/EmptyFilter.java
    webservices/savan/trunk/java/src/main/java/org/apache/savan/filters/Filter.java
    webservices/savan/trunk/java/src/main/java/org/apache/savan/filters/XPathBasedFilter.java
    webservices/savan/trunk/java/src/main/java/org/apache/savan/messagereceiver/MessageReceiverDeligater.java
    webservices/savan/trunk/java/src/main/java/org/apache/savan/messagereceiver/SavanInOutMessageReceiver.java
    webservices/savan/trunk/java/src/main/java/org/apache/savan/module/SavanModule.java
    webservices/savan/trunk/java/src/main/java/org/apache/savan/publication/client/PublicationClient.java
    webservices/savan/trunk/java/src/main/java/org/apache/savan/storage/DefaultSubscriberStore.java
    webservices/savan/trunk/java/src/main/java/org/apache/savan/storage/SubscriberStore.java
    webservices/savan/trunk/java/src/main/java/org/apache/savan/subscription/SubscriptionProcessor.java
    webservices/savan/trunk/java/src/main/java/org/apache/savan/util/ProtocolManager.java
    webservices/savan/trunk/java/src/main/java/org/apache/savan/util/UtilFactory.java
    webservices/savan/trunk/java/src/main/resources/META-INF/module.xml
    webservices/savan/trunk/java/src/test/java/org/apache/axis2/savan/EventingSubscripitonProcessorTest.java
    webservices/savan/trunk/java/src/test/java/org/apache/axis2/savan/XPathBasedFilterTest.java
    webservices/savan/trunk/java/src/test/resources/savan-config-test.xml

Modified: webservices/savan/trunk/java/src/main/config/savan-config.xml
URL: http://svn.apache.org/viewvc/webservices/savan/trunk/java/src/main/config/savan-config.xml?view=diff&rev=539821&r1=539820&r2=539821
==============================================================================
--- webservices/savan/trunk/java/src/main/config/savan-config.xml (original)
+++ webservices/savan/trunk/java/src/main/config/savan-config.xml Sat May 19 20:11:44 2007
@@ -10,7 +10,7 @@
                 <action>http://schemas.xmlsoap.org/ws/2004/08/eventing/GetStatus</action>
                 <action>http://schemas.xmlsoap.org/ws/2004/08/eventing/Unsubscribe</action>
         	</mapping-rules>
-        	<defaultSubscriber>eventing-leaf</defaultSubscriber>
+        	<defaultSubscriber>eventing</defaultSubscriber>
         	<defaultFilter>empty</defaultFilter>
         	<!--
         	<parameters>
@@ -45,16 +45,8 @@
     
     <subscribers>
     	<subscriber>
-    		<name>composite</name>
-    		<class>org.apache.savan.subscribers.CompositeSubscriber</class>
-    	</subscriber>
-    	<subscriber>
-    		<name>eventing-leaf</name>
-    		<class>org.apache.savan.eventing.subscribers.EventingLeafSubscriber</class>
-    	</subscriber>
-    	 <subscriber>
-    		<name>eventing-topic</name>
-    		<class>org.apache.savan.eventing.subscribers.EventingTopicSubscriber</class>
+    		<name>eventing</name>
+    		<class>org.apache.savan.eventing.subscribers.EventingSubscriber</class>
     	</subscriber>
     </subscribers>
     

Modified: webservices/savan/trunk/java/src/main/java/org/apache/savan/configuration/ConfigurationManager.java
URL: http://svn.apache.org/viewvc/webservices/savan/trunk/java/src/main/java/org/apache/savan/configuration/ConfigurationManager.java?view=diff&rev=539821&r1=539820&r2=539821
==============================================================================
--- webservices/savan/trunk/java/src/main/java/org/apache/savan/configuration/ConfigurationManager.java (original)
+++ webservices/savan/trunk/java/src/main/java/org/apache/savan/configuration/ConfigurationManager.java Sat May 19 20:11:44 2007
@@ -38,7 +38,7 @@
 import org.apache.savan.SavanException;
 import org.apache.savan.filters.Filter;
 import org.apache.savan.storage.SubscriberStore;
-import org.apache.savan.subscribers.AbstractSubscriber;
+import org.apache.savan.subscribers.Subscriber;
 import org.apache.savan.subscribers.Subscriber;
 import org.apache.savan.util.UtilFactory;
 
@@ -59,8 +59,7 @@
 	private final String NAME = "name";
 	private final String UTIL_FACTORY = "utilFactory";
 	private final String MAPPING_RULES = "mapping-rules";
-	private final String ACTION = "mapping-rules";
-	private final String SOAP_ACTION = "mapping-rules";
+	private final String ACTION = "action";
 	private final String SUBSCRIBER_STORES = "subscriberStores";
 	private final String SUBSCRIBER_STORE = "subscriberStore";
 	private final String FILTERS = "filters";
@@ -227,21 +226,15 @@
 	
 	private void processMappingRules (OMElement element, Protocol protocol) {
 		
-		MappingRules mappingRules = new MappingRules ();
+		MappingRules mappingRules = protocol.getMappingRules();
 		
 		Iterator actionsIterator = element.getChildrenWithName(new QName (ACTION));
 		while (actionsIterator.hasNext()) {
 			OMElement actionElement = (OMElement) actionsIterator.next();
 			String action = actionElement.getText();
-			mappingRules.addAction(action);
+			mappingRules.addRule(MappingRules.MAPPING_TYPE_ACTION, action);
 		}
 		
-		Iterator SOAPActionsIterator = element.getChildrenWithName(new QName (SOAP_ACTION));
-		while (SOAPActionsIterator.hasNext()) {
-			OMElement SOAPactionElement = (OMElement) SOAPActionsIterator.next();
-			String SOAPaction = SOAPactionElement.getText();
-			mappingRules.addAction(SOAPaction);
-		}
 	}
 	
 	private void processSubscriberStores (OMElement element) throws SavanException {
@@ -410,14 +403,14 @@
 		return (SubscriberBean) subscribersMap.get(subscriberName);
 	}
 	
-	public AbstractSubscriber getSubscriberInstance (String subscriberName) throws SavanException {
+	public Subscriber getSubscriberInstance (String subscriberName) throws SavanException {
 		SubscriberBean subscriberBean = (SubscriberBean) subscribersMap.get(subscriberName);
 		if (subscriberBean==null) {
 			String message = "A subscriber with the name '" + subscriberName + "' was not found.";
 			throw new SavanException (message);
 		}
 		
-		return (AbstractSubscriber) getObject(subscriberBean.getClazz());
+		return (Subscriber) getObject(subscriberBean.getClazz());
 	}
 	
 }

Modified: webservices/savan/trunk/java/src/main/java/org/apache/savan/configuration/MappingRules.java
URL: http://svn.apache.org/viewvc/webservices/savan/trunk/java/src/main/java/org/apache/savan/configuration/MappingRules.java?view=diff&rev=539821&r1=539820&r2=539821
==============================================================================
--- webservices/savan/trunk/java/src/main/java/org/apache/savan/configuration/MappingRules.java (original)
+++ webservices/savan/trunk/java/src/main/java/org/apache/savan/configuration/MappingRules.java Sat May 19 20:11:44 2007
@@ -25,28 +25,24 @@
  */
 public class MappingRules {
 
-	private ArrayList actionMap = null;
-	private ArrayList SOAPActionMap = null;
+	public static final int MAPPING_TYPE_ACTION = 1;
 	
-	public MappingRules () {
-		actionMap = new ArrayList ();
-		SOAPActionMap = new ArrayList ();
-	}
+	private ArrayList actionList = null;
 	
-	public void addAction (String action) {
-		actionMap.add(action);
-	}
-	
-	public boolean isActionPresent (String action) {
-		return actionMap.contains(action);
+	public MappingRules () {
+		actionList = new ArrayList ();
 	}
 	
-	public void addSOAPAction (String SOAPAction) {
-		SOAPActionMap.add(SOAPAction);
+	public void addRule (int type,String value) {
+		if (type==MAPPING_TYPE_ACTION)
+			actionList.add(value);
 	}
 	
-	public boolean isSOAPActionPresent (String SOAPAction) {
-		return SOAPActionMap.contains(SOAPAction);
+	public boolean ruleMatched (int type, String value) {
+		if (type==MAPPING_TYPE_ACTION)
+			return actionList.contains(value);
+		
+		return false;
 	}
 	
 }

Modified: webservices/savan/trunk/java/src/main/java/org/apache/savan/configuration/Protocol.java
URL: http://svn.apache.org/viewvc/webservices/savan/trunk/java/src/main/java/org/apache/savan/configuration/Protocol.java?view=diff&rev=539821&r1=539820&r2=539821
==============================================================================
--- webservices/savan/trunk/java/src/main/java/org/apache/savan/configuration/Protocol.java (original)
+++ webservices/savan/trunk/java/src/main/java/org/apache/savan/configuration/Protocol.java Sat May 19 20:11:44 2007
@@ -31,6 +31,10 @@
 	private String defaultSubscriber;
 	private String defaultFilter;
 	
+	public Protocol () {
+		this.mappingRules = new MappingRules ();
+	}
+
 	public String getDefaultFilter() {
 		return defaultFilter;
 	}
@@ -67,7 +71,4 @@
 		return mappingRules;
 	}
 
-	public void setMappingRules(MappingRules mappingRule) {
-		this.mappingRules = mappingRule;
-	}
 }

Modified: webservices/savan/trunk/java/src/main/java/org/apache/savan/eventing/EventingMessageReceiverDeligater.java
URL: http://svn.apache.org/viewvc/webservices/savan/trunk/java/src/main/java/org/apache/savan/eventing/EventingMessageReceiverDeligater.java?view=diff&rev=539821&r1=539820&r2=539821
==============================================================================
--- webservices/savan/trunk/java/src/main/java/org/apache/savan/eventing/EventingMessageReceiverDeligater.java (original)
+++ webservices/savan/trunk/java/src/main/java/org/apache/savan/eventing/EventingMessageReceiverDeligater.java Sat May 19 20:11:44 2007
@@ -33,17 +33,30 @@
 import org.apache.savan.SavanConstants;
 import org.apache.savan.SavanException;
 import org.apache.savan.SavanMessageContext;
-import org.apache.savan.eventing.subscribers.EventingLeafSubscriber;
+import org.apache.savan.eventing.subscribers.EventingSubscriber;
 import org.apache.savan.messagereceiver.MessageReceiverDeligater;
 import org.apache.savan.storage.SubscriberStore;
-import org.apache.savan.subscribers.AbstractSubscriber;
+import org.apache.savan.subscribers.Subscriber;
 import org.apache.savan.subscribers.Subscriber;
 import org.apache.savan.util.CommonUtil;
 
 
-public class EventingMessageReceiverDeligater implements MessageReceiverDeligater {
+public class EventingMessageReceiverDeligater extends MessageReceiverDeligater {
+	
+	public void doProtocolSpecificProcessing (SavanMessageContext inSavanMessage, MessageContext outMessage) throws SavanException {
+		int messageType = inSavanMessage.getMessageType();
+		if (messageType==SavanConstants.MessageTypes.SUBSCRIPTION_MESSAGE) {
+			handleSubscriptionRequest(inSavanMessage,outMessage);
+		} else if (messageType==SavanConstants.MessageTypes.RENEW_MESSAGE) {
+			handleRenewRequest (inSavanMessage,outMessage);
+		} else if (messageType==SavanConstants.MessageTypes.UNSUBSCRIPTION_MESSAGE) {
+			handleEndSubscriptionRequest (inSavanMessage,outMessage);
+		} else if (messageType==SavanConstants.MessageTypes.GET_STATUS_MESSAGE) {
+			handleGetStatusRequest (inSavanMessage,outMessage);
+		}		
+	}
 
-	public void handleSubscriptionRequest(SavanMessageContext subscriptionMessage, MessageContext outMessage) throws SavanException {
+	private void handleSubscriptionRequest(SavanMessageContext subscriptionMessage, MessageContext outMessage) throws SavanException {
 		
 		if (outMessage==null)
 			throw new SavanException ("Eventing protocol need to sent the SubscriptionResponseMessage. But the outMessage is null");
@@ -98,7 +111,7 @@
 	
 	}
 	
-	public void handleRenewRequest(SavanMessageContext renewMessage, MessageContext outMessage) throws SavanException {
+	private void handleRenewRequest(SavanMessageContext renewMessage, MessageContext outMessage) throws SavanException {
 		
 		if (outMessage==null)
 			throw new SavanException ("Eventing protocol need to sent the SubscriptionResponseMessage. But the outMessage is null");
@@ -136,7 +149,7 @@
 
 		SubscriberStore store = CommonUtil.getSubscriberStore(renewMessage.getMessageContext().getAxisService());
 		Subscriber subscriber = store.retrieve(subscriberID);
-		EventingLeafSubscriber eventingSubscriber = (EventingLeafSubscriber) subscriber;
+		EventingSubscriber eventingSubscriber = (EventingSubscriber) subscriber;
 		if (eventingSubscriber==null) {
 			String message = "Cannot find the AbstractSubscriber with the given ID";
 			throw new SavanException (message);
@@ -159,7 +172,7 @@
 		outMessage.setProperty(SavanConstants.MESSAGE_TYPE,new Integer (SavanConstants.MessageTypes.RENEW_RESPONSE_MESSAGE));
 	}
 
-	public void handleEndSubscriptionRequest(SavanMessageContext renewMessage, MessageContext outMessage) throws SavanException {
+	private void handleEndSubscriptionRequest(SavanMessageContext renewMessage, MessageContext outMessage) throws SavanException {
 		
 		if (outMessage==null)
 			throw new SavanException ("Eventing protocol need to sent the SubscriptionResponseMessage. But the outMessage is null");
@@ -226,7 +239,7 @@
 			throw new SavanException ("AbstractSubscriber Store was not found");
 		}
 		
-		EventingLeafSubscriber subscriber = (EventingLeafSubscriber) store.retrieve(id);
+		EventingSubscriber subscriber = (EventingSubscriber) store.retrieve(id);
 		if (subscriber==null) {
 			throw new SavanException ("AbstractSubscriber not found");
 		}
@@ -250,6 +263,8 @@
 		outMessage.setProperty(SavanConstants.MESSAGE_TYPE,new Integer (SavanConstants.MessageTypes.GET_STATUS_RESPONSE_MESSAGE));
 	}
 	
-	
+	public void doProtocolSpecificProcessing(SavanMessageContext inSavanMessage) throws SavanException {
+		
+	}
 
 }

Modified: webservices/savan/trunk/java/src/main/java/org/apache/savan/eventing/EventingSubscriptionProcessor.java
URL: http://svn.apache.org/viewvc/webservices/savan/trunk/java/src/main/java/org/apache/savan/eventing/EventingSubscriptionProcessor.java?view=diff&rev=539821&r1=539820&r2=539821
==============================================================================
--- webservices/savan/trunk/java/src/main/java/org/apache/savan/eventing/EventingSubscriptionProcessor.java (original)
+++ webservices/savan/trunk/java/src/main/java/org/apache/savan/eventing/EventingSubscriptionProcessor.java Sat May 19 20:11:44 2007
@@ -17,6 +17,8 @@
 
 package org.apache.savan.eventing;
 
+import java.net.URI;
+import java.net.URISyntaxException;
 import java.util.Calendar;
 import java.util.Date;
 
@@ -47,7 +49,7 @@
 import org.apache.savan.configuration.SubscriberBean;
 import org.apache.savan.eventing.subscribers.EventingSubscriber;
 import org.apache.savan.filters.Filter;
-import org.apache.savan.subscribers.AbstractSubscriber;
+import org.apache.savan.subscribers.Subscriber;
 import org.apache.savan.subscribers.Subscriber;
 import org.apache.savan.subscription.ExpirationBean;
 import org.apache.savan.subscription.SubscriptionProcessor;
@@ -86,7 +88,7 @@
 		String subscriberName = protocol.getDefaultSubscriber();
 		SubscriberBean subscriberBean = configurationManager.getSubscriberBean(subscriberName);
 		
-		AbstractSubscriber subscriber = configurationManager.getSubscriberInstance(subscriberName);
+		Subscriber subscriber = configurationManager.getSubscriberInstance(subscriberName);
 		
 		if (!(subscriber instanceof EventingSubscriber)) {
 			String message = "Eventing protocol only support implementations of eventing subscriber as Subscribers";
@@ -96,8 +98,12 @@
 		EventingSubscriber eventingSubscriber = (EventingSubscriber) subscriber;
 		String id = UUIDGenerator.getUUID();
 		smc.setProperty(EventingConstants.TransferedProperties.SUBSCRIBER_UUID,id);
-	
-		eventingSubscriber.setId(id);
+		try {
+			URI uri = new URI (id);
+			eventingSubscriber.setId(uri);
+		} catch (URISyntaxException e) {
+			throw new SavanException (e);
+		}
 		
 		SOAPBody body = envelope.getBody();
 		OMElement subscribeElement = body.getFirstChildWithName(new QName (EventingConstants.EVENTING_NAMESPACE,EventingConstants.ElementNames.Subscribe));
@@ -304,22 +310,6 @@
 		return bean;
 	}
 
-	public void doProtocolSpecificEndSubscription(Subscriber subscriber, String reason, ConfigurationContext configurationContext) throws SavanException {
-		String SOAPVersion = (String) subscriber.getProperty(EventingConstants.Properties.SOAPVersion);
-		if (SOAPVersion==null) 
-			throw new SavanException ("Cant find the SOAP version of the subscriber");
-		
-		SOAPFactory factory = null;
-		if (SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI.equals(SOAPVersion))
-			factory = OMAbstractFactory.getSOAP11Factory();
-		else if (SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI.equals(SOAPVersion))
-			factory = OMAbstractFactory.getSOAP12Factory();
-		else
-			throw new SavanException ("The subscriber has a unknown SOAP version property set");
-		
-		SOAPEnvelope envelope = factory.getDefaultEnvelope();
-	}
-	
 	private boolean deliveryModesupported() {
 		return true;
 	}

Modified: webservices/savan/trunk/java/src/main/java/org/apache/savan/eventing/EventingUtilFactory.java
URL: http://svn.apache.org/viewvc/webservices/savan/trunk/java/src/main/java/org/apache/savan/eventing/EventingUtilFactory.java?view=diff&rev=539821&r1=539820&r2=539821
==============================================================================
--- webservices/savan/trunk/java/src/main/java/org/apache/savan/eventing/EventingUtilFactory.java (original)
+++ webservices/savan/trunk/java/src/main/java/org/apache/savan/eventing/EventingUtilFactory.java Sat May 19 20:11:44 2007
@@ -19,10 +19,11 @@
 
 import org.apache.axis2.context.MessageContext;
 import org.apache.savan.SavanConstants;
+import org.apache.savan.SavanException;
 import org.apache.savan.SavanMessageContext;
-import org.apache.savan.eventing.subscribers.EventingLeafSubscriber;
+import org.apache.savan.eventing.subscribers.EventingSubscriber;
 import org.apache.savan.messagereceiver.MessageReceiverDeligater;
-import org.apache.savan.subscribers.AbstractSubscriber;
+import org.apache.savan.subscribers.Subscriber;
 import org.apache.savan.subscription.SubscriptionProcessor;
 import org.apache.savan.util.UtilFactory;
 
@@ -64,8 +65,8 @@
 		return new EventingMessageReceiverDeligater ();
 	}
 
-	public AbstractSubscriber createSubscriber() {
-		return new EventingLeafSubscriber ();
+	public Subscriber createSubscriber() {
+		return new EventingSubscriber ();
 	}
 	
 }

Modified: webservices/savan/trunk/java/src/main/java/org/apache/savan/eventing/subscribers/EventingSubscriber.java
URL: http://svn.apache.org/viewvc/webservices/savan/trunk/java/src/main/java/org/apache/savan/eventing/subscribers/EventingSubscriber.java?view=diff&rev=539821&r1=539820&r2=539821
==============================================================================
--- webservices/savan/trunk/java/src/main/java/org/apache/savan/eventing/subscribers/EventingSubscriber.java (original)
+++ webservices/savan/trunk/java/src/main/java/org/apache/savan/eventing/subscribers/EventingSubscriber.java Sat May 19 20:11:44 2007
@@ -16,37 +16,156 @@
 
 package org.apache.savan.eventing.subscribers;
 
+import java.net.URI;
+import java.util.Calendar;
+import java.util.Date;
+
+import org.apache.axiom.om.OMElement;
+import org.apache.axis2.AxisFault;
 import org.apache.axis2.addressing.EndpointReference;
+import org.apache.axis2.client.Options;
+import org.apache.axis2.client.ServiceClient;
+import org.apache.axis2.context.ConfigurationContext;
+import org.apache.axis2.context.MessageContext;
+import org.apache.savan.SavanException;
 import org.apache.savan.eventing.Delivery;
+import org.apache.savan.filters.Filter;
 import org.apache.savan.subscribers.Subscriber;
+import org.apache.savan.subscription.ExpirationBean;
+import org.apache.savan.util.CommonUtil;
 
 /**
  * Defines methods common to all eventing subscribers.
  */
-public interface EventingSubscriber extends Subscriber {
+public class EventingSubscriber implements Subscriber {
 	
-	/**
-	 * To get the EndTo EPR
-	 * @return
-	 */
-	EndpointReference getEndToEPr();
 	
-	/**
-	 * To get the Delivery object
-	 * @return
-	 */
-	Delivery getDelivery();
+	private URI id;
+	private Filter filter = null;
+	private EndpointReference endToEPr;
+	private Delivery delivery;
+	private ConfigurationContext configurationContext;
 	
 	/**
-	 * To se the Delivery object
-	 * @param delivery
+	 * The time at which further notification of messages should be avaoded
+	 * to this subscriber.
 	 */
-	void setDelivery(Delivery delivery);
+	private Date subscriptionEndingTime = null;
+
+
+	public Filter getFilter() {
+		return filter;
+	}
+
+	public void setFilter(Filter filter) {
+		this.filter = filter;
+	}
+
+	public URI getId() {
+		return id;
+	}
+	
+	public void setId(URI id) {
+		this.id = id;
+	}
+	
+	public Delivery getDelivery() {
+		return delivery;
+	}
+
+	public EndpointReference getEndToEPr() {
+		return endToEPr;
+	}
+
+	public void setDelivery(Delivery delivery) {
+		this.delivery = delivery;
+	}
+
+	public void setEndToEPr(EndpointReference errorReportingEPR) {
+		this.endToEPr = errorReportingEPR;
+	}
+
+	public Date getSubscriptionEndingTime () {
+		return subscriptionEndingTime;
+	}
+	
+	public void setSubscriptionEndingTime () {
+	}
+	
+	public ConfigurationContext getConfigurationContext() {
+		return configurationContext;
+	}
+
+	public void setConfigurationContext(ConfigurationContext configurationContext) {
+		this.configurationContext = configurationContext;
+	}
+
+	public void setSubscriptionEndingTime(Date subscriptionEndingTime) {
+		this.subscriptionEndingTime = subscriptionEndingTime;
+	}
 	
 	/**
-	 * To set the EndTo EPR
-	 * @param errorReportingEPR
+	 * This method first checks weather the passed message complies with the current filter.
+	 * If so message is sent, and the subscriberID is added to the PublicationReport.
+	 * Else message is ignored.
+	 * 
+	 * @param smc
+	 * @param report
+	 * @throws SavanException
 	 */
-	void setEndToEPr(EndpointReference errorReportingEPR);
+	public void sendEventData (OMElement eventData) throws SavanException {
+
+		Date date = new Date ();
+		boolean expired = false;
+		if (subscriptionEndingTime!=null && date.after(subscriptionEndingTime))
+			expired = true;
+		
+		if (expired) {
+			String message = "Cant notify the listner since the subscription has been expired";
+			throw new SavanException (message);
+		}
+		
+		if (doesEventDataBelongToTheFilter(eventData)) {
+			sendThePublication (eventData);
+		}
+	}
+
+	private boolean doesEventDataBelongToTheFilter(OMElement eventData) throws SavanException {
+		if (filter!=null) {
+			return filter.checkCompliance (eventData);
+		} else 
+			return true;
+	}
+	
+	private void sendThePublication(OMElement eventData) throws SavanException {
+		
+		EndpointReference deliveryEPR  = delivery.getDeliveryEPR();
+		try {
+			ServiceClient sc = new ServiceClient (configurationContext,null);
+			Options options = new Options ();
+			sc.setOptions(options);
+			options.setTo(deliveryEPR);
+			options.setProperty(MessageContext.TRANSPORT_NON_BLOCKING, Boolean.FALSE);
+			sc.fireAndForget(eventData);
+		} catch (AxisFault e) {
+			throw new SavanException (e);
+		}
+	}
+	
+	public void renewSubscription (ExpirationBean bean) {
+		if (bean.isDuration()) {
+			if (subscriptionEndingTime==null) {
+				Calendar calendar = Calendar.getInstance();
+				CommonUtil.addDurationToCalendar(calendar,bean.getDurationValue());
+				subscriptionEndingTime = calendar.getTime();
+			} else {
+				Calendar expiration = Calendar.getInstance();
+				expiration.setTime(subscriptionEndingTime);
+				CommonUtil.addDurationToCalendar(expiration,bean.getDurationValue());
+				subscriptionEndingTime = expiration.getTime();
+			}
+		} else
+			subscriptionEndingTime = bean.getDateValue();
+	}
 	
 }

Modified: webservices/savan/trunk/java/src/main/java/org/apache/savan/filters/EmptyFilter.java
URL: http://svn.apache.org/viewvc/webservices/savan/trunk/java/src/main/java/org/apache/savan/filters/EmptyFilter.java?view=diff&rev=539821&r1=539820&r2=539821
==============================================================================
--- webservices/savan/trunk/java/src/main/java/org/apache/savan/filters/EmptyFilter.java (original)
+++ webservices/savan/trunk/java/src/main/java/org/apache/savan/filters/EmptyFilter.java Sat May 19 20:11:44 2007
@@ -16,17 +16,17 @@
 
 package org.apache.savan.filters;
 
+import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMNode;
-import org.apache.axiom.soap.SOAPEnvelope;
 import org.apache.savan.SavanException;
 
 /**
  * This filter does not do any affective filtering.
  * May be the default for some protocols.
  */
-public class EmptyFilter extends Filter {
+public class EmptyFilter implements Filter {
 
-	public boolean checkEnvelopeCompliance(SOAPEnvelope envelope) throws SavanException {
+	public boolean checkCompliance(OMElement envelope) throws SavanException {
 		return true;
 	}
 

Modified: webservices/savan/trunk/java/src/main/java/org/apache/savan/filters/Filter.java
URL: http://svn.apache.org/viewvc/webservices/savan/trunk/java/src/main/java/org/apache/savan/filters/Filter.java?view=diff&rev=539821&r1=539820&r2=539821
==============================================================================
--- webservices/savan/trunk/java/src/main/java/org/apache/savan/filters/Filter.java (original)
+++ webservices/savan/trunk/java/src/main/java/org/apache/savan/filters/Filter.java Sat May 19 20:11:44 2007
@@ -17,15 +17,15 @@
 
 package org.apache.savan.filters;
 
+import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMNode;
-import org.apache.axiom.soap.SOAPEnvelope;
 import org.apache.savan.SavanException;
 
 /**
  * Defines a filter used by Savan. 
  *
  */
-public abstract class Filter {
+public interface Filter {
 	
 	/**
 	 * To check weather the passed envelope is compliant with the current filter.
@@ -33,7 +33,7 @@
 	 * @return
 	 * @throws SavanException
 	 */
-	public abstract boolean checkEnvelopeCompliance (SOAPEnvelope envelope) throws SavanException;
+	public boolean checkCompliance (OMElement element) throws SavanException;
 	
 	/**
 	 * To initialize the filter. The filter value should be sent to the argument
@@ -41,12 +41,13 @@
 	 * 
 	 * @param element
 	 */
-	public abstract void setUp (OMNode element);
+	public void setUp (OMNode element);
 	
 	/**
 	 * Returns a previously set filter value.
 	 * 
 	 * @return
 	 */
-	public abstract Object getFilterValue ();
+	public Object getFilterValue ();
+	
 }

Modified: webservices/savan/trunk/java/src/main/java/org/apache/savan/filters/XPathBasedFilter.java
URL: http://svn.apache.org/viewvc/webservices/savan/trunk/java/src/main/java/org/apache/savan/filters/XPathBasedFilter.java?view=diff&rev=539821&r1=539820&r2=539821
==============================================================================
--- webservices/savan/trunk/java/src/main/java/org/apache/savan/filters/XPathBasedFilter.java (original)
+++ webservices/savan/trunk/java/src/main/java/org/apache/savan/filters/XPathBasedFilter.java Sat May 19 20:11:44 2007
@@ -48,7 +48,7 @@
  * A filter that does filtering of messages based on a XPath string.
  * 
  */
-public class XPathBasedFilter extends Filter {
+public class XPathBasedFilter implements Filter {
 
 	private String XPathString = null;
 	
@@ -63,17 +63,14 @@
 	/**
 	 * This method may fail due to the JIRA issues WS-Commons(40) amd WS-Commons (41)
 	 */
-	public boolean checkEnvelopeCompliance(SOAPEnvelope envelope) throws SavanException {
-		OMElement firstChild = envelope.getBody().getFirstElement();
-		if (firstChild==null)
-			return false;
+	public boolean checkCompliance (OMElement element) throws SavanException {
 		
 		if (XPathString==null)
 			return true;
 		
 		try {
 			AXIOMXPath xpath = new AXIOMXPath (XPathString);
-			List resultList = xpath.selectNodes(firstChild);
+			List resultList = xpath.selectNodes(element);
 
             return resultList.size() > 0;
 		} catch (JaxenException e) {

Modified: webservices/savan/trunk/java/src/main/java/org/apache/savan/messagereceiver/MessageReceiverDeligater.java
URL: http://svn.apache.org/viewvc/webservices/savan/trunk/java/src/main/java/org/apache/savan/messagereceiver/MessageReceiverDeligater.java?view=diff&rev=539821&r1=539820&r2=539821
==============================================================================
--- webservices/savan/trunk/java/src/main/java/org/apache/savan/messagereceiver/MessageReceiverDeligater.java (original)
+++ webservices/savan/trunk/java/src/main/java/org/apache/savan/messagereceiver/MessageReceiverDeligater.java Sat May 19 20:11:44 2007
@@ -17,53 +17,94 @@
 
 package org.apache.savan.messagereceiver;
 
+import org.apache.axis2.AxisFault;
 import org.apache.axis2.context.MessageContext;
+import org.apache.axis2.description.AxisService;
+import org.apache.axis2.description.Parameter;
+import org.apache.axis2.engine.Handler.InvocationResponse;
+import org.apache.savan.SavanConstants;
 import org.apache.savan.SavanException;
 import org.apache.savan.SavanMessageContext;
+import org.apache.savan.configuration.ConfigurationManager;
+import org.apache.savan.configuration.Protocol;
+import org.apache.savan.storage.SubscriberStore;
+import org.apache.savan.subscription.SubscriptionProcessor;
+import org.apache.savan.util.ProtocolManager;
+import org.apache.savan.util.UtilFactory;
 
 /**
  * Provide abstract functions that may be done by protocols at the MessageReceiver level.
  *
  */
-public interface MessageReceiverDeligater {
+public abstract class MessageReceiverDeligater {
 	
-	/**
-	 * Handles a subscription request at the MessageReceiver level.
-	 * (may possibly send a subscription response).
-	 * 
-	 * @param subscriptionMessage
-	 * @param outMessage
-	 * @throws SavanException
-	 */
-	void handleSubscriptionRequest (SavanMessageContext subscriptionMessage, MessageContext outMessage) throws SavanException ;
 	
-	/**
-	 * Handles a renew request at the MessageReceiver level.
-	 * (may possibly send a renew response)
-	 * 
-	 * @param renewMessage
-	 * @param outMessage
-	 * @throws SavanException
-	 */
-	void handleRenewRequest(SavanMessageContext renewMessage, MessageContext outMessage) throws SavanException;
+	public void processMessage (SavanMessageContext smc) throws SavanException {
+		MessageContext msgContext = smc.getMessageContext();
+		
+		//setting the Protocol
+		Protocol protocol = smc.getProtocol();
+		
+		if (protocol==null) {
+			//this message does not have a matching protocol
+			//so let it go
+			throw new SavanException ("Cannot find a matching protocol");
+		}
+		
+		smc.setProtocol(protocol);
+		
+		AxisService axisService = msgContext.getAxisService();
+		if (axisService==null)
+			throw new SavanException ("Service context is null");
+		
+		//setting the AbstractSubscriber Store
+		Parameter parameter = axisService.getParameter(SavanConstants.SUBSCRIBER_STORE);
+		if (parameter==null){
+			setSubscriberStore (smc);
+			parameter = axisService.getParameter(SavanConstants.SUBSCRIBER_STORE);
+		}
+		
+		UtilFactory utilFactory = smc.getProtocol().getUtilFactory();
+		utilFactory.initializeMessage (smc);
+		
+		int messageType = smc.getMessageType ();
+
+		SubscriptionProcessor processor = utilFactory.createSubscriptionProcessor ();
+		processor.init (smc);
+		if (messageType==SavanConstants.MessageTypes.SUBSCRIPTION_MESSAGE) {
+		   processor.subscribe(smc);
+		} else if (messageType==SavanConstants.MessageTypes.UNSUBSCRIPTION_MESSAGE) {
+			processor.unsubscribe(smc);
+		} else if (messageType==SavanConstants.MessageTypes.RENEW_MESSAGE) {
+			processor.renewSubscription(smc);
+		}
+	}
+	
+	private void setSubscriberStore (SavanMessageContext smc) throws SavanException {
+		MessageContext msgContext = smc.getMessageContext();
+		AxisService axisService = msgContext.getAxisService();
+		
+		Parameter parameter = axisService.getParameter(SavanConstants.SUBSCRIBER_STORE_KEY);
+		String subscriberStoreKey = SavanConstants.DEFAULT_SUBSCRIBER_STORE_KEY;
+		if (parameter!=null)
+			subscriberStoreKey = (String) parameter.getValue();
+		
+		ConfigurationManager configurationManager = (ConfigurationManager) smc.getConfigurationContext().getProperty(SavanConstants.CONFIGURATION_MANAGER);
+		SubscriberStore store = configurationManager.getSubscriberStoreInstance(subscriberStoreKey);
+
+		parameter = new Parameter ();
+		parameter.setName(SavanConstants.SUBSCRIBER_STORE);
+		parameter.setValue(store);
+		
+		try {
+			axisService.addParameter(parameter);
+		} catch (AxisFault e) {
+			throw new SavanException (e);
+		}
+		
+	}
 	
-	/**
-	 * Handles an EndSubscription request at the MessageReceiver level.
-	 * (may possibly send a EndSubscription response)
-	 * 
-	 * @param renewMessage
-	 * @param outMessage
-	 * @throws SavanException
-	 */
-	void handleEndSubscriptionRequest(SavanMessageContext renewMessage, MessageContext outMessage) throws SavanException;
+	public abstract void doProtocolSpecificProcessing (SavanMessageContext inSavanMessage, MessageContext outMessage) throws SavanException;
 	
-	/**
-	 * Handles a GetStatus request at the MessageReceiver level.
-	 * (may possibly send a GetStatus response).
-	 * 
-	 * @param renewMessage
-	 * @param outMessage
-	 * @throws SavanException
-	 */
-	void handleGetStatusRequest (SavanMessageContext renewMessage, MessageContext outMessage) throws SavanException;
+	public abstract void doProtocolSpecificProcessing (SavanMessageContext inSavanMessage) throws SavanException;
 }

Modified: webservices/savan/trunk/java/src/main/java/org/apache/savan/messagereceiver/SavanInOutMessageReceiver.java
URL: http://svn.apache.org/viewvc/webservices/savan/trunk/java/src/main/java/org/apache/savan/messagereceiver/SavanInOutMessageReceiver.java?view=diff&rev=539821&r1=539820&r2=539821
==============================================================================
--- webservices/savan/trunk/java/src/main/java/org/apache/savan/messagereceiver/SavanInOutMessageReceiver.java (original)
+++ webservices/savan/trunk/java/src/main/java/org/apache/savan/messagereceiver/SavanInOutMessageReceiver.java Sat May 19 20:11:44 2007
@@ -20,10 +20,10 @@
 import org.apache.axis2.AxisFault;
 import org.apache.axis2.context.MessageContext;
 import org.apache.axis2.receivers.AbstractInOutSyncMessageReceiver;
-import org.apache.savan.SavanConstants;
 import org.apache.savan.SavanException;
 import org.apache.savan.SavanMessageContext;
 import org.apache.savan.configuration.Protocol;
+import org.apache.savan.util.ProtocolManager;
 import org.apache.savan.util.UtilFactory;
 
 /**
@@ -36,27 +36,21 @@
 
 		SavanMessageContext savanInMessage = new SavanMessageContext (inMessage);
 		
-//		Integer protocolVersion = (Integer) inMessage.getProperty(SavanConstants.PROTOCOL_VERSION);
-//		UtilFactory utilFactory = AbstractSavanUtilFactory.getUtilFactory(protocolVersion.intValue());
-		
-		Protocol protocol = savanInMessage.getProtocol();
+		//setting the Protocol
+		Protocol protocol = ProtocolManager.getMessageProtocol(savanInMessage);
 		if (protocol==null) {
-			throw new SavanException ("Protocol not found");
+			//this message does not have a matching protocol
+			//so let it go
+			throw new SavanException ("Cannot find a matching protocol");
 		}
 		
+		savanInMessage.setProtocol(protocol);
+		
 		UtilFactory utilFactory = protocol.getUtilFactory();
 		MessageReceiverDeligater deligator = utilFactory.createMessageReceiverDeligater();
-
-		int messageType = savanInMessage.getMessageType();
-		if (messageType==SavanConstants.MessageTypes.SUBSCRIPTION_MESSAGE) {
-			deligator.handleSubscriptionRequest(savanInMessage,outMessage);
-		} else if (messageType==SavanConstants.MessageTypes.RENEW_MESSAGE) {
-			deligator.handleRenewRequest (savanInMessage,outMessage);
-		} else if (messageType==SavanConstants.MessageTypes.UNSUBSCRIPTION_MESSAGE) {
-			deligator.handleEndSubscriptionRequest (savanInMessage,outMessage);
-		} else if (messageType==SavanConstants.MessageTypes.GET_STATUS_MESSAGE) {
-			deligator.handleGetStatusRequest (savanInMessage,outMessage);
-		}
+		
+		deligator.processMessage(savanInMessage);
+		deligator.doProtocolSpecificProcessing (savanInMessage, outMessage);
 		
 	}
 

Modified: webservices/savan/trunk/java/src/main/java/org/apache/savan/module/SavanModule.java
URL: http://svn.apache.org/viewvc/webservices/savan/trunk/java/src/main/java/org/apache/savan/module/SavanModule.java?view=diff&rev=539821&r1=539820&r2=539821
==============================================================================
--- webservices/savan/trunk/java/src/main/java/org/apache/savan/module/SavanModule.java (original)
+++ webservices/savan/trunk/java/src/main/java/org/apache/savan/module/SavanModule.java Sat May 19 20:11:44 2007
@@ -56,7 +56,7 @@
 		ConfigurationManager configurationManager = new ConfigurationManager ();
 		try {
 			ClassLoader moduleClassLoader = module.getModuleClassLoader();
-			configurationManager.configure(moduleClassLoader);
+			configurationManager.configure(getClass().getClassLoader());
 		} catch (SavanException e) {
 			log.error ("Exception thrown while trying to configure the Savan module",e);
 		}

Modified: webservices/savan/trunk/java/src/main/java/org/apache/savan/publication/client/PublicationClient.java
URL: http://svn.apache.org/viewvc/webservices/savan/trunk/java/src/main/java/org/apache/savan/publication/client/PublicationClient.java?view=diff&rev=539821&r1=539820&r2=539821
==============================================================================
--- webservices/savan/trunk/java/src/main/java/org/apache/savan/publication/client/PublicationClient.java (original)
+++ webservices/savan/trunk/java/src/main/java/org/apache/savan/publication/client/PublicationClient.java Sat May 19 20:11:44 2007
@@ -17,6 +17,10 @@
 
 package org.apache.savan.publication.client;
 
+import java.net.URI;
+import java.net.URL;
+import java.util.Iterator;
+
 import javax.xml.namespace.QName;
 
 import org.apache.axiom.om.OMAbstractFactory;
@@ -30,11 +34,15 @@
 import org.apache.axis2.client.ServiceClient;
 import org.apache.axis2.context.ConfigurationContext;
 import org.apache.axis2.context.MessageContext;
+import org.apache.axis2.description.AxisOperation;
 import org.apache.axis2.description.AxisService;
 import org.apache.axis2.description.Parameter;
 import org.apache.savan.SavanConstants;
 import org.apache.savan.SavanException;
+import org.apache.savan.publication.PublicationReport;
 import org.apache.savan.storage.SubscriberStore;
+import org.apache.savan.subscribers.Subscriber;
+import org.apache.savan.subscribers.SubscriberGroup;
 import org.apache.savan.util.CommonUtil;
 
 /**
@@ -50,58 +58,67 @@
 	public PublicationClient (ConfigurationContext configurationContext) {
 		this.configurationContext = configurationContext;
 	}
-	
+
 	/**
 	 * This can be used by the Publishers in the same JVM (e.g. a service deployed in the same Axis2 instance).
 	 * 
-	 * @param publication - the XML message to be published
+	 * @param eventData - The XML message to be published
 	 * @param service - The service to which this publication is bound to (i.e. this will be only sent to the subscribers of this service)
+	 * @param eventName - The name of the event, this can be a action which represents an out only operation or a Topic ID.
+	 * 
 	 * @throws SavanException
 	 */
-	public void sendPublication (OMElement publication, AxisService service) throws SavanException {
+	public void sendPublication (OMElement eventData, AxisService service, URI eventName) throws SavanException {
 		
 		try {
-			ServiceClient sc = new ServiceClient (configurationContext,null);
-			Options options = new Options ();
-			sc.setOptions(options);
-			
-			//Just a matter of getting it to the SavanOutHandler
-			options.setTo(new EndpointReference ("http://temp.publication.URI"));
-			
-			if (options.getAction()==null)
-				options.setAction(TEMP_PUBLICATION_ACTION);
 			
-			sc.setOptions(options);
-			
-			//this will not be required when the 
-			Parameter parameter = new Parameter ();
-			parameter.setName(SavanConstants.SUBSCRIBER_STORE);
-			SubscriberStore store = CommonUtil.getSubscriberStore(service);
-			parameter.setValue(store);
-			sc.getAxisService().addParameter(parameter);
-			
-			//if already engaged, axis2 will neglect this engagement.
-			sc.engageModule( new QName("savan"));
+			SubscriberStore subscriberStore = CommonUtil.getSubscriberStore(service);
+			if (subscriberStore==null)
+				throw new SavanException ("Cannot find the Subscriber Store");
+				
+			PublicationReport report = new PublicationReport();
+			if (eventName!=null) {
+				//there should be a valid operation or a SubscriberGroup to match this event.
+				AxisOperation operation = getAxisOperationFromEventName (eventName);
+				if (operation!=null) {
+					//send to all subscribers with this operation.
+					throw new UnsupportedOperationException ("Not implemented");
+				} else {
+					//there should be a valid SubscriberGroup to match this eventName
+					
+					String groupId = eventName.toString();
+					SubscriberGroup group = (SubscriberGroup) subscriberStore.getSubscriberGroup(groupId);
+					if (group!=null)
+						group.sendEventDataToGroup(eventData);
+					else
+						throw new SavanException ("Could not find a subscriberGroup or an operation to match the eventName");
+
+				}
+			} else {
+				//no event name, so send it to everybody.
+			
+				//sending to all individual subscribers
+				for (Iterator iter = subscriberStore.retrieveAllSubscribers();iter.hasNext();){
+					Subscriber subscriber = (Subscriber) iter.next();
+					subscriber.sendEventData(eventData);
+				}
+				
+				//sending to all Subscriber Groups
+				for (Iterator iter = subscriberStore.retrieveAllSubscriberGroups();iter.hasNext();){
+					SubscriberGroup subscriberGroup = (SubscriberGroup) iter.next();
+					subscriberGroup.sendEventDataToGroup(eventData);
+				}			
+			}
 			
-			MessageContext mc = new MessageContext ();
-			mc.setEnvelope(getEnvelopeFromPublication (publication));
-			OperationClient client = sc.createClient(ServiceClient.ANON_OUT_ONLY_OP);
-			client.addMessageContext(mc);
-			client.execute(true);
 		} catch (AxisFault e) {
 			String message = "Could not send the publication";
 			throw new SavanException (message,e);
 		}
 	}
 	
-	
-	private SOAPEnvelope getEnvelopeFromPublication (OMElement element) {
-		
-		//for now we are sending SOAP 1.1
-		SOAPEnvelope envelope = OMAbstractFactory.getSOAP11Factory().getDefaultEnvelope();
-		envelope.getBody().addChild(element);
-		
-		return envelope;
+	private AxisOperation getAxisOperationFromEventName (URI eventName) {
+		//TODO do operation lookup
+		return null;
 	}
 	
 }

Modified: webservices/savan/trunk/java/src/main/java/org/apache/savan/storage/DefaultSubscriberStore.java
URL: http://svn.apache.org/viewvc/webservices/savan/trunk/java/src/main/java/org/apache/savan/storage/DefaultSubscriberStore.java?view=diff&rev=539821&r1=539820&r2=539821
==============================================================================
--- webservices/savan/trunk/java/src/main/java/org/apache/savan/storage/DefaultSubscriberStore.java (original)
+++ webservices/savan/trunk/java/src/main/java/org/apache/savan/storage/DefaultSubscriberStore.java Sat May 19 20:11:44 2007
@@ -17,21 +17,24 @@
 
 package org.apache.savan.storage;
 
+import java.net.URI;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
 
 import org.apache.axis2.context.ConfigurationContext;
 import org.apache.savan.SavanException;
-import org.apache.savan.subscribers.AbstractSubscriber;
 import org.apache.savan.subscribers.Subscriber;
+import org.apache.savan.subscribers.SubscriberGroup;
 
 public class DefaultSubscriberStore implements SubscriberStore {
 
 	private HashMap subscriberMap = null;
+	private HashMap subscriberGroups = null;
 	
 	public DefaultSubscriberStore () {
 		subscriberMap = new HashMap ();
+		subscriberGroups = new HashMap ();
 	}
 	
 	public void init(ConfigurationContext configurationContext) throws SavanException {
@@ -39,18 +42,20 @@
 	}
 
 	public Subscriber retrieve(String id) {
-		return (AbstractSubscriber) subscriberMap.get(id);
+		return (Subscriber) subscriberMap.get(id);
 	}
 
 	public void store(Subscriber s) {
-		subscriberMap.put(s.getId(),s);
+		URI subscriberID = s.getId();
+		String key = subscriberID.toString();
+		subscriberMap.put(key,s);
 	}
 
 	public void delete(String subscriberID) {
 		subscriberMap.remove(subscriberID);
 	}
 
-	public Iterator retrieveAll() {
+	public Iterator retrieveAllSubscribers () {
 		ArrayList allSubscribers = new ArrayList ();
 		for (Iterator iter=subscriberMap.keySet().iterator();iter.hasNext();) {
 			Object key = iter.next();
@@ -59,5 +64,29 @@
 		return allSubscribers.iterator();
 	}
 
+	public Iterator retrieveAllSubscriberGroups () {
+		ArrayList allSubscriberGroups = new ArrayList ();
+		for (Iterator iter=subscriberGroups.keySet().iterator();iter.hasNext();) {
+			Object key = iter.next();
+			allSubscriberGroups.add(subscriberGroups.get(key));
+		}
+		return allSubscriberGroups.iterator();
+	}
 	
+	public void addSubscriberGroup(String groupId) {
+		subscriberGroups.put(groupId, new SubscriberGroup ());
+	}
+
+	public void addSubscriberToGroup(String listId, Subscriber subscriber) throws SavanException {
+		SubscriberGroup subscriberGroup = (SubscriberGroup) subscriberGroups.get(listId);
+		if (subscriberGroup!=null)
+			subscriberGroup.addSubscriber (subscriber);
+		else 
+			throw new SavanException ("Cannot find the Subscriber store");
+	}
+
+	public SubscriberGroup getSubscriberGroup(String groupId) {
+		return (SubscriberGroup) subscriberGroups.get(groupId);
+	}
+
 }

Modified: webservices/savan/trunk/java/src/main/java/org/apache/savan/storage/SubscriberStore.java
URL: http://svn.apache.org/viewvc/webservices/savan/trunk/java/src/main/java/org/apache/savan/storage/SubscriberStore.java?view=diff&rev=539821&r1=539820&r2=539821
==============================================================================
--- webservices/savan/trunk/java/src/main/java/org/apache/savan/storage/SubscriberStore.java (original)
+++ webservices/savan/trunk/java/src/main/java/org/apache/savan/storage/SubscriberStore.java Sat May 19 20:11:44 2007
@@ -17,10 +17,12 @@
 package org.apache.savan.storage;
 
 import java.util.Iterator;
+import java.util.List;
 
 import org.apache.axis2.context.ConfigurationContext;
 import org.apache.savan.SavanException;
 import org.apache.savan.subscribers.Subscriber;
+import org.apache.savan.subscribers.SubscriberGroup;
 
 /**
  * Defines the Storage for storing subscribers. 
@@ -58,7 +60,9 @@
 	 * @return
 	 * @throws SavanException
 	 */
-	Iterator retrieveAll () throws SavanException;
+	Iterator retrieveAllSubscribers () throws SavanException;
+
+	Iterator retrieveAllSubscriberGroups () throws SavanException;
 	
 	/**
 	 * To delete a previously stored subscriber.
@@ -67,4 +71,11 @@
 	 * @throws SavanException
 	 */
 	void delete (String subscriberID) throws SavanException;
+	
+	SubscriberGroup getSubscriberGroup (String groupId) throws SavanException;
+	
+	void addSubscriberGroup (String subscriberList) throws SavanException;
+	
+	void addSubscriberToGroup (String groupId, Subscriber subscriber) throws SavanException;
+	
 }

Copied: webservices/savan/trunk/java/src/main/java/org/apache/savan/subscribers/Subscriber.java (from r537482, webservices/savan/trunk/java/src/main/java/org/apache/savan/subscribers/AbstractSubscriber.java)
URL: http://svn.apache.org/viewvc/webservices/savan/trunk/java/src/main/java/org/apache/savan/subscribers/Subscriber.java?view=diff&rev=539821&p1=webservices/savan/trunk/java/src/main/java/org/apache/savan/subscribers/AbstractSubscriber.java&r1=537482&p2=webservices/savan/trunk/java/src/main/java/org/apache/savan/subscribers/Subscriber.java&r2=539821
==============================================================================
--- webservices/savan/trunk/java/src/main/java/org/apache/savan/subscribers/AbstractSubscriber.java (original)
+++ webservices/savan/trunk/java/src/main/java/org/apache/savan/subscribers/Subscriber.java Sat May 19 20:11:44 2007
@@ -17,14 +17,10 @@
 
 package org.apache.savan.subscribers;
 
-import java.util.Date;
-import java.util.HashMap;
+import java.net.URI;
 
-import org.apache.axiom.soap.SOAPEnvelope;
+import org.apache.axiom.om.OMElement;
 import org.apache.savan.SavanException;
-import org.apache.savan.SavanMessageContext;
-import org.apache.savan.filters.Filter;
-import org.apache.savan.publication.PublicationReport;
 import org.apache.savan.subscription.ExpirationBean;
 
 /**
@@ -32,74 +28,11 @@
  * in savan. Independent of the protocol type.
  *
  */
-public abstract class AbstractSubscriber implements Subscriber {
-
-	String id;
-	Filter filter = null;
-	HashMap properties = null;
-	
-	public AbstractSubscriber () {
-		properties = new HashMap ();
-	}
-	
-	public void addProperty (String key, Object value) {
-		properties.put(key,value);
-	}
-	
-	public Object getProperty (String key) {
-		return properties.get(key);
-	}
-	
-	public Filter getFilter() {
-		return filter;
-	}
-
-	public void setFilter(Filter filter) {
-		this.filter = filter;
-	}
-
-	public String getId() {
-		return id;
-	}
-	
-	public void setId(String id) {
-		this.id = id;
-	}
-	
-	public boolean doesMessageBelongToTheFilter(SavanMessageContext smc) throws SavanException {
-		if (filter!=null) {
-			SOAPEnvelope envelope = smc.getEnvelope();
-			return filter.checkEnvelopeCompliance(envelope);
-		} else 
-			return true;
-	}
-	
-	/**
-	 * This method first checks weather the passed message complies with the current filter.
-	 * If so message is sent, and the subscriberID is added to the PublicationReport.
-	 * Else message is ignored.
-	 * 
-	 * @param smc
-	 * @param report
-	 * @throws SavanException
-	 */
-	public void processPublication (SavanMessageContext publication,PublicationReport report) throws SavanException {
-		if (doesMessageBelongToTheFilter(publication)) {
-			sendPublication(publication,report);
-			if (getId()!=null)
-				report.addNotifiedSubscriber(getId());
-		}
-	}
+public interface Subscriber  {
 	
-	public abstract void setSubscriptionEndingTime (Date subscriptionEndingTime);
-	public abstract void renewSubscription (ExpirationBean bean);
+	public URI getId();
+	public void setId(URI id);
+	public void sendEventData (OMElement eventData) throws SavanException;
+	public void renewSubscription (ExpirationBean bean);
 	
-	/**
-	 * This should be used by based classes to sendThe publication in its own manner
-	 * 
-	 * @param publication
-	 * @param report
-	 * @throws SavanException
-	 */
-	protected abstract void sendPublication (SavanMessageContext publication,PublicationReport report) throws SavanException;
 }

Copied: webservices/savan/trunk/java/src/main/java/org/apache/savan/subscribers/SubscriberGroup.java (from r537482, webservices/savan/trunk/java/src/main/java/org/apache/savan/subscribers/CompositeSubscriber.java)
URL: http://svn.apache.org/viewvc/webservices/savan/trunk/java/src/main/java/org/apache/savan/subscribers/SubscriberGroup.java?view=diff&rev=539821&p1=webservices/savan/trunk/java/src/main/java/org/apache/savan/subscribers/CompositeSubscriber.java&r1=537482&p2=webservices/savan/trunk/java/src/main/java/org/apache/savan/subscribers/SubscriberGroup.java&r2=539821
==============================================================================
--- webservices/savan/trunk/java/src/main/java/org/apache/savan/subscribers/CompositeSubscriber.java (original)
+++ webservices/savan/trunk/java/src/main/java/org/apache/savan/subscribers/SubscriberGroup.java Sat May 19 20:11:44 2007
@@ -17,49 +17,44 @@
 
 package org.apache.savan.subscribers;
 
+import java.net.URI;
 import java.util.ArrayList;
-import java.util.Date;
 import java.util.Iterator;
+
+import org.apache.axiom.om.OMElement;
 import org.apache.savan.SavanException;
-import org.apache.savan.SavanMessageContext;
-import org.apache.savan.publication.PublicationReport;
-import org.apache.savan.subscription.ExpirationBean;
 
 /**
  * Defines a set of subscribers that are acting as a group or a Topic.
  *
  */
-public class CompositeSubscriber extends AbstractSubscriber {
+public class SubscriberGroup  {
 
-	ArrayList subscribers = null;
+	protected ArrayList subscribers = null;
 	
-	public CompositeSubscriber (){
-		subscribers = new ArrayList ();
-	}
+	private URI id;
 	
-	public void addSubscriber (AbstractSubscriber subscriber) {
-		subscribers.add(subscriber);
+	public URI getId() {
+		return id;
 	}
-	
-	public void sendPublication(SavanMessageContext publication, PublicationReport report)  throws SavanException {
-		for (Iterator it = subscribers.iterator();it.hasNext();) {
-			AbstractSubscriber subscriber = (AbstractSubscriber) it.next();
-			subscriber.processPublication(publication,report);
-		}
+
+	public void setId(URI id) {
+		this.id = id;
 	}
 
-	public void renewSubscription(ExpirationBean bean) {
-		for (Iterator it = subscribers.iterator();it.hasNext();) {
-			AbstractSubscriber subscriber = (AbstractSubscriber) it.next();
-			subscriber.renewSubscription(bean);
-		}
+	public SubscriberGroup (){
+		subscribers = new ArrayList ();
+	}
+	
+	public void addSubscriber (Subscriber subscriber) throws SavanException {
+		subscribers.add(subscriber);
 	}
 
-	public void setSubscriptionEndingTime(Date subscriptionEndingTime) {
+	public void sendEventDataToGroup(OMElement eventData) throws SavanException {
 		for (Iterator it = subscribers.iterator();it.hasNext();) {
-			AbstractSubscriber subscriber = (AbstractSubscriber) it.next();
-			subscriber.setSubscriptionEndingTime(subscriptionEndingTime);
+			Subscriber subscriber = (Subscriber) it.next();
+			subscriber.sendEventData(eventData);
 		}
 	}
-
+	
 }

Modified: webservices/savan/trunk/java/src/main/java/org/apache/savan/subscription/SubscriptionProcessor.java
URL: http://svn.apache.org/viewvc/webservices/savan/trunk/java/src/main/java/org/apache/savan/subscription/SubscriptionProcessor.java?view=diff&rev=539821&r1=539820&r2=539821
==============================================================================
--- webservices/savan/trunk/java/src/main/java/org/apache/savan/subscription/SubscriptionProcessor.java (original)
+++ webservices/savan/trunk/java/src/main/java/org/apache/savan/subscription/SubscriptionProcessor.java Sat May 19 20:11:44 2007
@@ -17,12 +17,10 @@
 
 package org.apache.savan.subscription;
 
-import org.apache.axis2.context.ConfigurationContext;
 import org.apache.axis2.context.ServiceContext;
 import org.apache.savan.SavanException;
 import org.apache.savan.SavanMessageContext;
 import org.apache.savan.storage.SubscriberStore;
-import org.apache.savan.subscribers.AbstractSubscriber;
 import org.apache.savan.subscribers.Subscriber;
 import org.apache.savan.util.CommonUtil;
 
@@ -54,7 +52,7 @@
 			throw new SavanException ("AbstractSubscriber store not found");
 			
 		ExpirationBean bean = getExpirationBean(renewMessage);
-		AbstractSubscriber subscriber = (AbstractSubscriber) store.retrieve(bean.getSubscriberID());
+		Subscriber subscriber = (Subscriber) store.retrieve(bean.getSubscriberID());
 		if (subscriber==null) {
 			throw new SavanException ("Given subscriber is not present");
 		}
@@ -82,7 +80,7 @@
 		}
 		
 		Subscriber subscriber = store.retrieve(subscriberID);
-		doProtocolSpecificEndSubscription(subscriber,reason,serviceContext.getConfigurationContext());
+//		doProtocolSpecificEndSubscription(subscriber,reason,serviceContext.getConfigurationContext());
 		
 		store.delete(subscriberID);
 	}
@@ -97,6 +95,5 @@
 	
 	public abstract String getSubscriberID (SavanMessageContext smc) throws SavanException;
 	
-	public abstract void doProtocolSpecificEndSubscription (Subscriber subscriber,String reason,ConfigurationContext configurationContext) throws SavanException;
 
 }

Modified: webservices/savan/trunk/java/src/main/java/org/apache/savan/util/ProtocolManager.java
URL: http://svn.apache.org/viewvc/webservices/savan/trunk/java/src/main/java/org/apache/savan/util/ProtocolManager.java?view=diff&rev=539821&r1=539820&r2=539821
==============================================================================
--- webservices/savan/trunk/java/src/main/java/org/apache/savan/util/ProtocolManager.java (original)
+++ webservices/savan/trunk/java/src/main/java/org/apache/savan/util/ProtocolManager.java Sat May 19 20:11:44 2007
@@ -17,10 +17,14 @@
 
 package org.apache.savan.util;
 
+import java.util.HashMap;
+import java.util.Iterator;
+
 import org.apache.savan.SavanConstants;
 import org.apache.savan.SavanException;
 import org.apache.savan.SavanMessageContext;
 import org.apache.savan.configuration.ConfigurationManager;
+import org.apache.savan.configuration.MappingRules;
 import org.apache.savan.configuration.Protocol;
 
 /**
@@ -35,8 +39,20 @@
 		if (configurationManager==null)
 			throw new SavanException ("Cant find the Configuration Manager");
 		
-		return (Protocol) configurationManager.getProtocolMap().get("eventing");
+		String action = smc.getMessageContext().getOptions().getAction();
+		if (action!=null) {
+			HashMap map = configurationManager.getProtocolMap();
+			Iterator iter = map.values().iterator();
+			while (iter.hasNext()) {
+				Protocol protocol = (Protocol) iter.next();
+				MappingRules mappingRules = protocol.getMappingRules();
+				if (mappingRules.ruleMatched (MappingRules.MAPPING_TYPE_ACTION, action)) {
+					return protocol;
+				}
+			}
+		}
 		
+		return null;
 	}
 	
 }

Modified: webservices/savan/trunk/java/src/main/java/org/apache/savan/util/UtilFactory.java
URL: http://svn.apache.org/viewvc/webservices/savan/trunk/java/src/main/java/org/apache/savan/util/UtilFactory.java?view=diff&rev=539821&r1=539820&r2=539821
==============================================================================
--- webservices/savan/trunk/java/src/main/java/org/apache/savan/util/UtilFactory.java (original)
+++ webservices/savan/trunk/java/src/main/java/org/apache/savan/util/UtilFactory.java Sat May 19 20:11:44 2007
@@ -20,7 +20,7 @@
 import org.apache.savan.SavanMessageContext;
 import org.apache.savan.filters.Filter;
 import org.apache.savan.messagereceiver.MessageReceiverDeligater;
-import org.apache.savan.subscribers.AbstractSubscriber;
+import org.apache.savan.subscribers.Subscriber;
 import org.apache.savan.subscription.SubscriptionProcessor;
 
 /**
@@ -33,6 +33,5 @@
 	public abstract SavanMessageContext initializeMessage (SavanMessageContext messageContext);
 	public abstract SubscriptionProcessor createSubscriptionProcessor ();
 	public abstract MessageReceiverDeligater createMessageReceiverDeligater ();
-//	public abstract AbstractSubscriber createSubscriber ();
 	
 }

Modified: webservices/savan/trunk/java/src/main/resources/META-INF/module.xml
URL: http://svn.apache.org/viewvc/webservices/savan/trunk/java/src/main/resources/META-INF/module.xml?view=diff&rev=539821&r1=539820&r2=539821
==============================================================================
--- webservices/savan/trunk/java/src/main/resources/META-INF/module.xml (original)
+++ webservices/savan/trunk/java/src/main/resources/META-INF/module.xml Sat May 19 20:11:44 2007
@@ -1,17 +1,5 @@
 <module name="Savan" class="org.apache.savan.module.SavanModule">
 
-    <InFlow>
-        <handler name="SavanInHandler" class="org.apache.savan.handlers.SavanInHandler">
-            <order phase="OperationInPhase"/>
-        </handler>
-    </InFlow>
-    
-    <OutFlow>
-        <handler name="SavanOutHandler" class="org.apache.savan.handlers.SavanOutHandler">
-            <order phase="OperationOutPhase"/>
-        </handler>
-    </OutFlow>
-
     <operation name="SavanInOutOperation" mep="http://www.w3.org/2004/08/wsdl/in-out">
         <messageReceiver class="org.apache.savan.messagereceiver.SavanInOutMessageReceiver"/>
         

Modified: webservices/savan/trunk/java/src/test/java/org/apache/axis2/savan/EventingSubscripitonProcessorTest.java
URL: http://svn.apache.org/viewvc/webservices/savan/trunk/java/src/test/java/org/apache/axis2/savan/EventingSubscripitonProcessorTest.java?view=diff&rev=539821&r1=539820&r2=539821
==============================================================================
--- webservices/savan/trunk/java/src/test/java/org/apache/axis2/savan/EventingSubscripitonProcessorTest.java (original)
+++ webservices/savan/trunk/java/src/test/java/org/apache/axis2/savan/EventingSubscripitonProcessorTest.java Sat May 19 20:11:44 2007
@@ -31,7 +31,7 @@
 import org.apache.savan.configuration.Protocol;
 import org.apache.savan.eventing.EventingConstants;
 import org.apache.savan.eventing.EventingSubscriptionProcessor;
-import org.apache.savan.eventing.subscribers.EventingLeafSubscriber;
+import org.apache.savan.eventing.subscribers.EventingSubscriber;
 import org.apache.savan.storage.DefaultSubscriberStore;
 import org.apache.savan.storage.SubscriberStore;
 import org.apache.savan.subscription.ExpirationBean;
@@ -65,7 +65,7 @@
 		smc.setSubscriberStore(store);
 		
 		EventingSubscriptionProcessor esp = new EventingSubscriptionProcessor ();
-		EventingLeafSubscriber eventingSubscriber = (EventingLeafSubscriber) esp.getSubscriberFromMessage(smc);
+		EventingSubscriber eventingSubscriber = (EventingSubscriber) esp.getSubscriberFromMessage(smc);
 		assertNotNull(eventingSubscriber);
 		
 		assertNotNull(eventingSubscriber.getDelivery());

Modified: webservices/savan/trunk/java/src/test/java/org/apache/axis2/savan/XPathBasedFilterTest.java
URL: http://svn.apache.org/viewvc/webservices/savan/trunk/java/src/test/java/org/apache/axis2/savan/XPathBasedFilterTest.java?view=diff&rev=539821&r1=539820&r2=539821
==============================================================================
--- webservices/savan/trunk/java/src/test/java/org/apache/axis2/savan/XPathBasedFilterTest.java (original)
+++ webservices/savan/trunk/java/src/test/java/org/apache/axis2/savan/XPathBasedFilterTest.java Sat May 19 20:11:44 2007
@@ -40,7 +40,7 @@
 		Filter filter = new XPathBasedFilter ();
 		filter.setUp(filterNode);
 		
-		assertTrue (filter.checkEnvelopeCompliance(envelope));
+		assertTrue (filter.checkCompliance(envelope));
 	}
 	
 	private SOAPEnvelope createTestEnvelope () {

Modified: webservices/savan/trunk/java/src/test/resources/savan-config-test.xml
URL: http://svn.apache.org/viewvc/webservices/savan/trunk/java/src/test/resources/savan-config-test.xml?view=diff&rev=539821&r1=539820&r2=539821
==============================================================================
--- webservices/savan/trunk/java/src/test/resources/savan-config-test.xml (original)
+++ webservices/savan/trunk/java/src/test/resources/savan-config-test.xml Sat May 19 20:11:44 2007
@@ -45,16 +45,8 @@
     
     <subscribers>
     	<subscriber>
-    		<name>composite</name>
-    		<class>org.apache.savan.subscribers.CompositeSubscriber</class>
-    	</subscriber>
-    	<subscriber>
     		<name>eventing-leaf</name>
-    		<class>org.apache.savan.eventing.subscribers.EventingLeafSubscriber</class>
-    	</subscriber>
-    	 <subscriber>
-    		<name>eventing-topic</name>
-    		<class>org.apache.savan.eventing.subscribers.EventingTopicSubscriber</class>
+    		<class>org.apache.savan.eventing.subscribers.EventingSubscriber</class>
     	</subscriber>
     </subscribers>