| /* |
| * Copyright 2004,2005 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.savan.eventing.subscribers; |
| |
| 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; |
| |
| import java.net.URI; |
| import java.util.Calendar; |
| import java.util.Date; |
| |
| /** Defines methods common to all eventing subscribers. */ |
| public class EventingSubscriber implements Subscriber { |
| |
| |
| private URI id; |
| private Filter filter = null; |
| private EndpointReference endToEPr; |
| private Delivery delivery; |
| private ConfigurationContext configurationContext; |
| |
| /** The time at which further notification of messages should be avaoded to this subscriber. */ |
| 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; |
| } |
| |
| /** |
| * 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 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 listener 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(); |
| } |
| |
| } |