blob: b50944197005e335f022f32e603b3d8704eb8f6c [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.synapse.eventing.builders;
import org.apache.axiom.om.OMAttribute;
import org.apache.axiom.om.OMElement;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.databinding.utils.ConverterUtil;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.synapse.SynapseException;
import org.apache.synapse.config.xml.XMLConfigConstants;
import org.apache.synapse.endpoints.AddressEndpoint;
import org.apache.synapse.endpoints.Endpoint;
import org.apache.synapse.endpoints.EndpointDefinition;
import org.apache.synapse.eventing.SynapseSubscription;
import org.wso2.eventing.EventingConstants;
import javax.xml.namespace.QName;
import java.util.Calendar;
/**
*
*/
public class SubscriptionMessageBuilder {
private static final Log log = LogFactory.getLog(SubscriptionMessageBuilder.class);
private static final QName SUBSCRIBE_QNAME =
new QName(EventingConstants.WSE_EVENTING_NS, EventingConstants.WSE_EN_SUBSCRIBE);
private static final QName DELIVERY_QNAME =
new QName(EventingConstants.WSE_EVENTING_NS, EventingConstants.WSE_EN_DELIVERY);
private static final QName FILTER_QNAME =
new QName(EventingConstants.WSE_EVENTING_NS, EventingConstants.WSE_EN_FILTER);
private static final QName NOTIFY_TO_QNAME =
new QName(EventingConstants.WSE_EVENTING_NS, EventingConstants.WSE_EN_NOTIFY_TO);
private static final QName ATT_DIALECT =
new QName(XMLConfigConstants.NULL_NAMESPACE, EventingConstants.WSE_EN_DIALECT);
private static final QName IDENTIFIER =
new QName(EventingConstants.WSE_EVENTING_NS, EventingConstants.WSE_EN_IDENTIFIER);
private static final QName EXPIRES =
new QName(EventingConstants.WSE_EVENTING_NS, EventingConstants.WSE_EN_EXPIRES);
private static final QName RENEW =
new QName(EventingConstants.WSE_EVENTING_NS, EventingConstants.WSE_EN_RENEW);
private static String errorSubCode = null;
private static String errorReason = null;
private static String errorCode = null;
/**
* (01) <s12:Envelope
* (02) xmlns:s12="http://www.w3.org/2003/05/soap-envelope"
* (03) xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"
* (04) xmlns:wse="http://schemas.xmlsoap.org/ws/2004/08/eventing"
* (05) xmlns:ew="http://www.example.com/warnings" >
* (06) <s12:Header>
* (07) <wsa:Action>
* (08) http://schemas.xmlsoap.org/ws/2004/08/eventing/Subscribe
* (09) </wsa:Action>
* (10) <wsa:MessageID>
* (11) uuid:e1886c5c-5e86-48d1-8c77-fc1c28d47180
* (12) </wsa:MessageID>
* (13) <wsa:ReplyTo>
* (14) <wsa:Address>http://www.example.com/MyEvEntsink</wsa:Address>
* (15) <wsa:ReferenceProperties>
* (16) <ew:MySubscription>2597</ew:MySubscription>
* (17) </wsa:ReferenceProperties>
* (18) </wsa:ReplyTo>
* (19) <wsa:To>http://www.example.org/oceanwatch/EventSource</wsa:To>
* (20) </s12:Header>
* (21) <s12:Body>
* (22) <wse:Subscribe>
* (23) <wse:EndTo>
* (24) <wsa:Address>
* (25) http://www.example.com/MyEventSink
* (26) </wsa:Address>
* (27) <wsa:ReferenceProperties>
* (28) <ew:MySubscription>2597</ew:MySubscription>
* (29) </wsa:ReferenceProperties>
* (30) </wse:EndTo>
* (31) <wse:Delivery>
* (32) <wse:NotifyTo>
* (33) <wsa:Address>
* (34) http://www.other.example.com/OnStormWarning
* (35) </wsa:Address>
* (36) <wsa:ReferenceProperties>
* (37) <ew:MySubscription>2597</ew:MySubscription>
* (38) </wsa:ReferenceProperties>
* (39) </wse:NotifyTo>
* (40) </wse:Delivery>
* (41) <wse:Expires>2004-06-26T21:07:00.000-08:00</wse:Expires>
* (42) <wse:Filter xmlns:ow="http://www.example.org/oceanwatch"
* (43) Dialect="http://www.example.org/topicFilter" >
* (44) weather.storms
* (45) </wse:Filter>
* (46) </wse:Subscribe>
* (47) </s12:Body>
* (48) </s12:Envelope>
*
* @param mc
* @return
*/
public static SynapseSubscription createSubscription(MessageContext mc) {
SynapseSubscription subscription = null;
OMElement notifyToElem = null;
OMElement elem = mc.getEnvelope().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) {
subscription = new SynapseSubscription(
EventingConstants.WSE_DEFAULT_DELIVERY_MODE);
subscription.setAddressUrl(notifyToElem.getFirstElement().getText());
subscription.setEndpointUrl(notifyToElem.getFirstElement().getText());
subscription.setSubManUrl(mc.getTo().getAddress());
} else {
handleException("NotifyTo element not found in the subscription message");
}
} else {
handleException("Delivery element is not found in the subscription message");
}
OMElement filterElem = elem.getFirstChildWithName(FILTER_QNAME);
if (subscription != null && filterElem != null) {
OMAttribute dialectAttr = filterElem.getAttribute(ATT_DIALECT);
if (dialectAttr != null && dialectAttr.getAttributeValue() != null) {
subscription.setFilterDialect(dialectAttr.getAttributeValue());
subscription.setFilterValue(filterElem.getText());
} else {
handleException("Error in creating subscription. Filter dialect not defined");
}
}
OMElement expiryElem = elem.getFirstChildWithName(EXPIRES);
if (expiryElem != null) {
Calendar calendarExpires = null;
try {
if (expiryElem.getText().startsWith("P")) {
calendarExpires = ConverterUtil.convertToDuration(expiryElem.getText())
.getAsCalendar();
} else {
calendarExpires = ConverterUtil.convertToDateTime(expiryElem.getText());
}
} catch (Exception e) {
log.error("Error converting the expiration date ," + e.toString());
setExpirationFault(subscription);
}
Calendar calendarNow = Calendar.getInstance();
if ((isValidDate(expiryElem.getText(), calendarExpires)) &&
(calendarNow.before(calendarExpires))) {
subscription.setExpires(calendarExpires);
} else {
setExpirationFault(subscription);
}
}
} else {
handleException(
"Subscribe element is required as the payload of the subscription message");
}
return subscription;
}
/**
* create request for unsubscribr request
* (01) <s12:Envelope
* (02) xmlns:s12="http://www.w3.org/2003/05/soap-envelope"
* (03) xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"
* (04) xmlns:wse="http://schemas.xmlsoap.org/ws/2004/08/eventing"
* (05) xmlns:ow="http://www.example.org/oceanwatch" >
* (06) <s12:Header>
* (07) <wsa:Action>
* (08) http://schemas.xmlsoap.org/ws/2004/08/eventing/Unsubscribe
* (09) </wsa:Action>
* (10) <wsa:MessageID>
* (11) uuid:2653f89f-25bc-4c2a-a7c4-620504f6b216
* (12) </wsa:MessageID>
* (13) <wsa:ReplyTo>
* (14) <wsa:Address>http://www.example.com/MyEventSink</wsa:Address>
* (15) </wsa:ReplyTo>
* (16) <wsa:To>
* (17) http://www.example.org/oceanwatch/SubscriptionManager
* (18) </wsa:To>
* (19) <wse:Identifier>
* (20) uuid:22e8a584-0d18-4228-b2a8-3716fa2097fa
* (21) </wse:Identifier>
* (22) </s12:Header>
* (23) <s12:Body>
* (24) <wse:Unsubscribe />
* (25) </s12:Body>
* (26) </s12:Envelope>
*
* @param mc
* @return
*/
public static SynapseSubscription createUnSubscribeMessage(MessageContext mc) {
SynapseSubscription subscription = new SynapseSubscription();
OMElement elem = mc.getEnvelope().getHeader().getFirstChildWithName(IDENTIFIER);
String id = elem.getText();
subscription.setId(id);
subscription.setAddressUrl(mc.getTo().getAddress());
return subscription;
}
/**
* (01) <s12:Envelope
* (02) xmlns:s12="http://www.w3.org/2003/05/soap-envelope"
* (03) xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"
* (04) xmlns:wse="http://schemas.xmlsoap.org/ws/2004/08/eventing"
* (05) xmlns:ow="http://www.example.org/oceanwatch" >
* (06) <s12:Header>
* (07) <wsa:Action>
* (08) http://schemas.xmlsoap.org/ws/2004/08/eventing/Renew
* (09) </wsa:Action>
* (10) <wsa:MessageID>
* (11) uuid:bd88b3df-5db4-4392-9621-aee9160721f6
* (12) </wsa:MessageID>
* (13) <wsa:ReplyTo>
* (14) <wsa:Address>http://www.example.com/MyEventSink</wsa:Address>
* (15) </wsa:ReplyTo>
* (16) <wsa:To>
* (17) http://www.example.org/oceanwatch/SubscriptionManager
* (18) </wsa:To>
* (19) <wse:Identifier>
* (20) uuid:22e8a584-0d18-4228-b2a8-3716fa2097fa
* (21) </wse:Identifier>
* (22) </s12:Header>
* (23) <s12:Body>
* (24) <wse:Renew>
* (25) <wse:Expires>2004-06-26T21:07:00.000-08:00</wse:Expires>
* (26) </wse:Renew>
* (27) </s12:Body>
* (28) </s12:Envelope>
*
* @param mc
* @return
*/
public static SynapseSubscription createRenewSubscribeMessage(MessageContext mc) {
SynapseSubscription subscription = new SynapseSubscription();
OMElement elem = mc.getEnvelope().getHeader().getFirstChildWithName(IDENTIFIER);
String id = elem.getText();
subscription.setId(id);
subscription.setAddressUrl(mc.getTo().getAddress());
OMElement renewElem = mc.getEnvelope().getBody().getFirstChildWithName(RENEW);
if (renewElem != null) {
OMElement expiryElem = renewElem.getFirstChildWithName(EXPIRES);
if (expiryElem != null) {
if (!(expiryElem.getText().startsWith("*"))) {
Calendar calendarExpires = null;
try {
if (expiryElem.getText().startsWith("P")) {
calendarExpires = ConverterUtil.convertToDuration(expiryElem.getText())
.getAsCalendar();
} else {
calendarExpires = ConverterUtil.convertToDateTime(expiryElem.getText());
}
} catch (Exception e) {
setExpirationFault(subscription);
}
Calendar calendarNow = Calendar.getInstance();
if ((isValidDate(expiryElem.getText(), calendarExpires)) &&
(calendarNow.before(calendarExpires))) {
subscription.setExpires(calendarExpires);
} else {
setExpirationFault(subscription);
}
subscription.setExpires(calendarExpires);
} else {
setExpirationFault(subscription);
}
} else {
setExpirationFault(subscription);
}
}
return subscription;
}
/**
* (01) <s12:Envelope
* (02) xmlns:s12="http://www.w3.org/2003/05/soap-envelope"
* (03) xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"
* (04) xmlns:wse="http://schemas.xmlsoap.org/ws/2004/08/eventing"
* (05) xmlns:ow="http://www.example.org/oceanwatch" >
* (06) <s12:Header>
* (07) <wsa:Action>
* (08) http://schemas.xmlsoap.org/ws/2004/08/eventing/GetStatus
* (09) </wsa:Action>
* (10) <wsa:MessageID>
* (11) uuid:bd88b3df-5db4-4392-9621-aee9160721f6
* (12) </wsa:MessageID>
* (13) <wsa:ReplyTo>
* (14) <wsa:Address>http://www.example.com/MyEventSink</wsa:Address>
* (15) </wsa:ReplyTo>
* (16) <wsa:To>
* (17) http://www.example.org/oceanwatch/SubscriptionManager
* (18) </wsa:To>
* (19) <wse:Identifier>
* (20) uuid:22e8a584-0d18-4228-b2a8-3716fa2097fa
* (21) </wse:Identifier>
* (22) </s12:Header>
* (23) <s12:Body>
* (24) <wse:GetStatus />
* (25) </s12:Body>
* (26) </s12:Envelope>
*
* @param mc
* @return
*/
public static SynapseSubscription createGetStatusMessage(MessageContext mc) {
SynapseSubscription subscription = new SynapseSubscription();
subscription.setAddressUrl(mc.getTo().getAddress());
OMElement elem = mc.getEnvelope().getHeader().getFirstChildWithName(IDENTIFIER);
String id = elem.getText();
subscription.setId(id);
return subscription;
}
private static Endpoint getEndpointFromWSAAddress(OMElement address) {
AddressEndpoint endpoint = new AddressEndpoint();
EndpointDefinition def = new EndpointDefinition();
def.setAddress(address.getText().trim());
endpoint.setDefinition(def);
return endpoint;
}
private static void handleException(String message) {
log.error(message);
throw new SynapseException(message);
}
private static void handleException(String message, Exception e) {
log.error(message, e);
throw new SynapseException(message, e);
}
public static String getErrorSubCode() {
return errorSubCode;
}
public static void setErrorSubCode(String errorCode) {
errorSubCode = errorCode;
}
public static String getErrorReason() {
return errorReason;
}
public static void setErrorReason(String errorReasons) {
errorReason = errorReasons;
}
public static String getErrorCode() {
return errorCode;
}
public static void setErrorCode(String errorCodes) {
errorCode = errorCodes;
}
private static void setExpirationFault(SynapseSubscription subscription) {
setErrorCode(EventingConstants.WSE_FAULT_CODE_SENDER);
setErrorSubCode("InvalidExpirationTime");
setErrorReason("The expiration time requested is invalid");
subscription.setId(null);
}
/**
* Check is a valid date, this check required due to Java calendar use the Julion date to create
* dates, so feb-31 take as a valid date and converts to march-03, ConverterUtil wont validate.
*
* @param original
* @param converted
* @return true || false
*/
private static boolean isValidDate(String original, Calendar converted) {
try {
String check = ConverterUtil.convertToString(converted);
if (original.equals(check)) {
return true;
} else {
return false;
}
} catch (Exception e) {
log.error("Converting the date to string, " + e.toString());
return false;
}
}
}