public Subscriber getSubscriberFromMessage()

in modules/core/src/main/java/org/apache/savan/eventing/EventingSubscriptionProcessor.java [63:220]


    public Subscriber getSubscriberFromMessage(SavanMessageContext smc) throws SavanException {

        ConfigurationManager configurationManager = (ConfigurationManager)smc
                .getConfigurationContext().getProperty(SavanConstants.CONFIGURATION_MANAGER);
        if (configurationManager == null)
            throw new SavanException("Configuration Manager not set");

        Protocol protocol = smc.getProtocol();
        if (protocol == null)
            throw new SavanException("Protocol not found");

        UtilFactory utilFactory = protocol.getUtilFactory();

        SOAPEnvelope envelope = smc.getEnvelope();
        if (envelope == null)
            return null;

//		AbstractSubscriber subscriber = utilFactory.createSubscriber();  //eventing only works on leaf subscriber for now.

        String subscriberName = protocol.getDefaultSubscriber();
        SubscriberBean subscriberBean = configurationManager.getSubscriberBean(subscriberName);

        Subscriber subscriber = configurationManager.getSubscriberInstance(subscriberName);

        if (!(subscriber instanceof EventingSubscriber)) {
            String message =
                    "Eventing protocol only support implementations of eventing subscriber as Subscribers";
            throw new SavanException(message);
        }

        EventingSubscriber eventingSubscriber = (EventingSubscriber)subscriber;
        String id = UUIDGenerator.getUUID();
        smc.setProperty(EventingConstants.TransferedProperties.SUBSCRIBER_UUID, 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));
        if (subscribeElement == null)
            throw new SavanException("'Subscribe' element is not present");

        OMElement endToElement = subscribeElement.getFirstChildWithName(new QName(
                EventingConstants.EVENTING_NAMESPACE, EventingConstants.ElementNames.EndTo));
        if (endToElement != null) {
            EndpointReference endToEPR = null;

            try {
                endToEPR = EndpointReferenceHelper.fromOM(endToElement);
            }
            catch (AxisFault af) {
                throw new SavanException(af);
            }

            eventingSubscriber.setEndToEPr(endToEPR);
        }

        OMElement deliveryElement = subscribeElement.getFirstChildWithName(new QName(
                EventingConstants.EVENTING_NAMESPACE, EventingConstants.ElementNames.Delivery));
        if (deliveryElement == null)
            throw new SavanException("Delivery element is not present");

        OMElement notifyToElement = deliveryElement.getFirstChildWithName(new QName(
                EventingConstants.EVENTING_NAMESPACE, EventingConstants.ElementNames.NotifyTo));
        if (notifyToElement == null)
            throw new SavanException("NotifyTo element is null");

        EndpointReference notifyToEPr = null;

        try {
            notifyToEPr = EndpointReferenceHelper.fromOM(notifyToElement);
        }
        catch (AxisFault af) {
            throw new SavanException(af);
        }

        OMAttribute deliveryModeAttr =
                deliveryElement.getAttribute(new QName(EventingConstants.ElementNames.Mode));
        String deliveryMode = null;
        if (deliveryModeAttr != null) {
            deliveryMode = deliveryModeAttr.getAttributeValue().trim();
        } else {
            deliveryMode = EventingConstants.DEFAULT_DELIVERY_MODE;
        }

        if (!deliveryModesupported()) {
            //TODO throw unsupported delivery mode fault.
        }

        Delivery delivery = new Delivery();
        delivery.setDeliveryEPR(notifyToEPr);
        delivery.setDeliveryMode(deliveryMode);

        eventingSubscriber.setDelivery(delivery);

        OMElement expiresElement =
                subscribeElement.getFirstChildWithName(EventingConstants.EXPIRES_QNAME);
        if (expiresElement != null) {
            String expiresText = expiresElement.getText();

            if (expiresText == null) {
                String message = "Expires Text is null";
                throw new SavanException(message);
            }

            expiresText = expiresText.trim();

            ExpirationBean expirationBean = getExpirationBeanFromString(expiresText);
            Date expiration = null;
            if (expirationBean.isDuration()) {
                Calendar calendar = Calendar.getInstance();
                CommonUtil.addDurationToCalendar(calendar, expirationBean.getDurationValue());
                expiration = calendar.getTime();
            } else
                expiration = expirationBean.getDateValue();

            if (expiration == null) {
                String message = "Cannot understand the given date-time value for the Expiration";
                throw new SavanException(message);
            }

            eventingSubscriber.setSubscriptionEndingTime(expiration);
        } else {
            // They didn't specify an expiration, so default to an hour.
            Calendar calendar = Calendar.getInstance();
            Duration duration = new Duration();
            duration.setHours(1);
            CommonUtil.addDurationToCalendar(calendar, duration);
            eventingSubscriber.setSubscriptionEndingTime(calendar.getTime());
        }

        OMElement filterElement = subscribeElement.getFirstChildWithName(new QName(
                EventingConstants.EVENTING_NAMESPACE, EventingConstants.ElementNames.Filter));
        if (filterElement != null) {
            OMNode filterNode = filterElement.getFirstOMChild();
            OMAttribute dialectAttr =
                    filterElement.getAttribute(new QName(EventingConstants.ElementNames.Dialect));
            Filter filter = null;

            String filterKey = EventingConstants.DEFAULT_FILTER_IDENTIFIER;
            if (dialectAttr != null) {
                filterKey = dialectAttr.getAttributeValue();
            }
            filter = configurationManager.getFilterInstanceFromId(filterKey);
            if (filter == null)
                throw new SavanException("The Filter defined by the dialect is not available");

            filter.setUp(filterNode);

            eventingSubscriber.setFilter(filter);
        }

        return eventingSubscriber;
    }