/*
 * 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 whether the passed message complies with the current filter.
     * If so the message is sent, and the subscriberID is added to the PublicationReport.
     * Otherwise the message is ignored.
     *
     * @param eventData an OMElement containing the SOAP Envelope
     * @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 {
        return filter == null || filter.checkCompliance(eventData);
    }

    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();
	}
	
}
