* @throws InvalidMessageException
* @throws InvalidExpirationTimeException
*/
public Subscription toSubscription(SOAPEnvelope envelope)
throws InvalidMessageException, InvalidExpirationTimeException {
Subscription subscription = null;
OMElement notifyToElem;
if (envelope == null) {
log.error("No SOAP envelope was provided.");
throw new BuilderException("No SOAP envelope was provided.");
}
OMElement elem = null;
if (envelope.getBody() != null) {
elem = envelope.getBody().getFirstChildWithName(SUBSCRIBE_QNAME);
}
if (elem != null) {
OMElement deliveryElem = elem.getFirstChildWithName(DELIVERY_QNAME);
if (deliveryElem != null) {
notifyToElem = deliveryElem.getFirstChildWithName(NOTIFY_TO_QNAME);
if (notifyToElem != null) {
String ep = BuilderUtils.getEndpointFromWSAAddress(
notifyToElem.getFirstElement());
if (ep != null) {
subscription = new Subscription();
subscription.setEventSinkURL(ep);
}
} else {
log.error("NotifyTo element not found in the subscription message.");
throw new InvalidMessageException(
"NotifyTo element not found in the subscription message.");
}
} else {
log.error("Delivery element is not found in the subscription message.");
throw new InvalidMessageException(
"Delivery element is not found in the subscription message.");
}
OMElement filterElem = elem.getFirstChildWithName(FILTER_QNAME);
if (subscription != null && filterElem != null) {
OMAttribute dialectAttribute = filterElem.getAttribute(ATT_DIALECT);
if (dialectAttribute != null && dialectAttribute.getAttributeValue() != null) {
subscription.setEventFilter(
new EventFilter(dialectAttribute.getAttributeValue(),
filterElem.getText().trim()));
} else {
log.error("Error in creating subscription. Filter dialect not defined.");
throw new BuilderException(
"Error in creating subscription. Filter dialect not defined.");
}
} else if (subscription == null) {
log.error("Error in creating subscription.");
throw new BuilderException("Error in creating subscription.");
}
OMElement expiryElem = elem.getFirstChildWithName(EXPIRES);
if (expiryElem != null) {
Calendar calendarExpires;
try {
String expiryText = expiryElem.getText().trim();
if (expiryText.startsWith("P")) {
calendarExpires = Calendar.getInstance();
Duration duration = ConverterUtil.convertToDuration(expiryText);
calendarExpires.add(Calendar.YEAR, duration.getYears());
calendarExpires.add(Calendar.MONTH, duration.getMonths());
calendarExpires.add(Calendar.DAY_OF_MONTH, duration.getDays());
calendarExpires.add(Calendar.HOUR_OF_DAY, duration.getHours());
calendarExpires.add(Calendar.MINUTE, duration.getMinutes());
calendarExpires.add(Calendar.SECOND, (int)duration.getSeconds());
} else {
calendarExpires = ConverterUtil.convertToDateTime(expiryText);
}
} catch (Exception e) {
log.error("Error converting the expiration date.", e);
throw new InvalidExpirationTimeException(
"Error converting the expiration date.", e);
}
Calendar calendarNow = Calendar.getInstance();
if (calendarNow.before(calendarExpires)) {
subscription.setExpires(calendarExpires);
} else {
log.error("The expiration time has passed.");
throw new InvalidExpirationTimeException("The expiration time has passed.");
}
}
OMElement scriptElement = elem.getFirstChildWithName(new QName(EventingConstants.WSE_EXTENDED_EVENTING_NS, EventingConstants.EVENTING_EXECUTABLE_SCRIPT_ELEMENT));
if (scriptElement != null) {
subscription.getProperties().put(EventingConstants.EVENTING_EXECUTABLE_SCRIPT_ELEMENT, scriptElement.getText());
}
} else {
log.error("Subscribe element is required as the payload of the subscription message.");
throw new InvalidMessageException(
"Subscribe element is required as the payload of the subscription message.");