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