/* * 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.OMAbstractFactory; import org.apache.axiom.om.OMElement; import org.apache.axiom.om.OMNamespace; import org.apache.axiom.soap.*; import org.apache.axis2.AxisFault; import org.apache.axis2.addressing.AddressingConstants; import org.apache.axis2.addressing.EndpointReference; import org.apache.axis2.addressing.EndpointReferenceHelper; 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.eventing.SynapseSubscription; import org.wso2.eventing.EventingConstants; import org.wso2.eventing.Subscription; import javax.xml.namespace.QName; public class ResponseMessageBuilder { private SOAPFactory factory; private static final Log log = LogFactory.getLog(ResponseMessageBuilder.class); public ResponseMessageBuilder(MessageContext messageCtx) { factory = (SOAPFactory) messageCtx.getEnvelope().getOMFactory(); } /** * (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) xmlns:ow="http://www.example.org/oceanwatch" > * (07) <s12:Header> * (08) <wsa:Action> * (09) http://schemas.xmlsoap.org/ws/2004/08/eventing/SubscribeResponse * (10) </wsa:Action> * (11) <wsa:RelatesTo> * (12) uuid:e1886c5c-5e86-48d1-8c77-fc1c28d47180 * (13) </wsa:RelatesTo> * (14) <wsa:To>http://www.example.com/MyEventSink</wsa:To> * (15) <ew:MySubscription>2597</ew:MySubscription> * (16) </s12:Header> * (17) <s12:Body> * (18) <wse:SubscribeResponse> * (19) <wse:SubscriptionManager> * (20) <wsa:Address> * (21) http://www.example.org/oceanwatch/SubscriptionManager * (22) </wsa:Address> * (23) <wsa:ReferenceParameters> * (24) <wse:Identifier> * (25) uuid:22e8a584-0d18-4228-b2a8-3716fa2097fa * (26) </wse:Identifier> * (27) </wsa:ReferenceParameters> * (28) </wse:SubscriptionManager> * (29) <wse:Expires>2004-07-01T00:00:00.000-00:00</wse:Expires> * (30) </wse:SubscribeResponse> * (31) </s12:Body> * (32) </s12:Envelope> * Generate the subscription responce message * * @param subscription * @return */ public SOAPEnvelope genSubscriptionResponse(SynapseSubscription subscription) { SOAPEnvelope message = factory.getDefaultEnvelope(); EndpointReference subscriptionManagerEPR = new EndpointReference(subscription.getSubManUrl()); subscriptionManagerEPR.addReferenceParameter(new QName(EventingConstants.WSE_EVENTING_NS, EventingConstants.WSE_EN_IDENTIFIER, EventingConstants.WSE_EVENTING_PREFIX), subscription.getId()); OMNamespace eventingNamespace = factory.createOMNamespace(EventingConstants.WSE_EVENTING_NS, EventingConstants.WSE_EVENTING_PREFIX); OMElement subscribeResponseElement = factory.createOMElement( EventingConstants.WSE_EN_SUBSCRIBE_RESPONSE, eventingNamespace); try { OMElement subscriptionManagerElement = EndpointReferenceHelper.toOM( subscribeResponseElement.getOMFactory(), subscriptionManagerEPR, new QName(EventingConstants.WSE_EVENTING_NS, EventingConstants.WSE_EN_SUBSCRIPTION_MANAGER, EventingConstants.WSE_EVENTING_PREFIX), AddressingConstants.Submission.WSA_NAMESPACE); subscribeResponseElement.addChild(subscriptionManagerElement); message.getBody().addChild(subscribeResponseElement); } catch (AxisFault axisFault) { handleException("unable to create subscription response", axisFault); } return message; } /** * (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) <s12:Header> * (05) <wsa:Action> * (06) http://schemas.xmlsoap.org/ws/2004/08/eventing/UnsubscribeResponse * (07) </wsa:Action> * (08) <wsa:RelatesTo> * (09) uuid:2653f89f-25bc-4c2a-a7c4-620504f6b216 * (10) </wsa:RelatesTo> * (11) <wsa:To>http://www.example.com/MyEventSink</wsa:To> * (12) </s12:Header> * (13) <s12:Body /> * (14) </s12:Envelope> * * @param subscription * @return */ public SOAPEnvelope genUnSubscribeResponse(SynapseSubscription subscription) { SOAPEnvelope message = factory.getDefaultEnvelope(); OMNamespace eventingNamespace = factory.createOMNamespace(EventingConstants.WSE_EVENTING_NS, EventingConstants.WSE_EVENTING_PREFIX); OMElement dummyBody = factory.createOMElement("UnsubscribeResponse", eventingNamespace); message.getBody().addChild(dummyBody); return message; } /** * (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/RenewResponse * (09) </wsa:Action> * (10) <wsa:RelatesTo> * (11) uuid:bd88b3df-5db4-4392-9621-aee9160721f6 * (12) </wsa:RelatesTo> * (13) <wsa:To>http://www.example.com/MyEventSink</wsa:To> * (14) </s12:Header> * (15) <s12:Body> * (16) <wse:RenewResponse> * (17) <wse:Expires>2004-06-26T12:00:00.000-00:00</wse:Expires> * (18) </wse:RenewResponse> * (19) </s12:Body> * (20) </s12:Envelope> * * @param subscription * @return */ public SOAPEnvelope genRenewSubscriptionResponse(SynapseSubscription subscription) { SOAPEnvelope message = factory.getDefaultEnvelope(); OMNamespace eventingNamespace = factory.createOMNamespace(EventingConstants.WSE_EVENTING_NS, EventingConstants.WSE_EVENTING_PREFIX); OMElement renewResponseElement = factory.createOMElement(EventingConstants.WSE_EN_RENEW_RESPONSE, eventingNamespace); OMElement expiresElement = factory.createOMElement(EventingConstants.WSE_EN_EXPIRES, eventingNamespace); factory.createOMText(expiresElement, ConverterUtil.convertToString(subscription.getExpires())); renewResponseElement.addChild(expiresElement); message.getBody().addChild(renewResponseElement); return message; } /** * (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/GetStatusResponse * (09) </wsa:Action> * (10) <wsa:RelatesTo> * (11) uuid:bd88b3df-5db4-4392-9621-aee9160721f6 * (12) </wsa:RelatesTo> * (13) <wsa:To>http://www.example.com/MyEventSink</wsa:To> * (14) </s12:Header> * (15) <s12:Body> * (16) <wse:GetStatusResponse> * (17) <wse:Expires>2004-06-26T12:00:00.000-00:00</wse:Expires> * (18) </wse:GetStatusResponse> * (19) </s12:Body> * (20) </s12:Envelope> * * @param subscription * @return */ public SOAPEnvelope genGetStatusResponse(Subscription subscription) { SOAPEnvelope message = factory.getDefaultEnvelope(); OMNamespace eventingNamespace = factory.createOMNamespace(EventingConstants.WSE_EVENTING_NS, EventingConstants.WSE_EVENTING_PREFIX); OMElement renewResponseElement = factory.createOMElement( EventingConstants.WSE_EN_GET_STATUS_RESPONSE, eventingNamespace); OMElement expiresElement = factory.createOMElement(EventingConstants.WSE_EN_EXPIRES, eventingNamespace); if (subscription.getExpires() != null) { factory.createOMText(expiresElement, ConverterUtil.convertToString(subscription.getExpires())); } else { factory.createOMText(expiresElement, "*"); } renewResponseElement.addChild(expiresElement); message.getBody().addChild(renewResponseElement); return message; } /** * <S:Envelope> * <S:Header> * <wsa:Action> * http://schemas.xmlsoap.org/ws/2004/08/addressing/fault * </wsa:Action> * <!-- Headers elided for clarity. --> * </S:Header> * <S:Body> * <S:Fault> * <S:Code> * <S:Value>[Code]</S:Value> * <S:Subcode> * <S:Value>[Subcode]</S:Value> * </S:Subcode> * </S:Code> * <S:Reason> * <S:Text xml:lang="en">[Reason]</S:Text> * </S:Reason> * <S:Detail> * [Detail] * </S:Detail> * </S:Fault> * </S:Body> * </S:Envelope> * * @param code * @param subCode * @param reason * @param detail * @return */ public SOAPEnvelope genFaultResponse(MessageContext messageCtx, String code, String subCode, String reason, String detail) { SOAPFactory soapFactory = null; if (messageCtx.isSOAP11()) { soapFactory = OMAbstractFactory.getSOAP11Factory(); SOAPEnvelope message = soapFactory.getDefaultFaultEnvelope(); SOAPFaultReason soapFaultReason = soapFactory.createSOAPFaultReason(); soapFaultReason.setText(reason); message.getBody().getFault().setReason(soapFaultReason); SOAPFaultCode soapFaultCode = soapFactory.createSOAPFaultCode(); QName qNameSubCode = new QName(EventingConstants.WSE_EVENTING_NS, subCode, EventingConstants.WSE_EVENTING_PREFIX); soapFaultCode.setText(qNameSubCode); message.getBody().getFault().setCode(soapFaultCode); return message; } else { soapFactory = OMAbstractFactory.getSOAP12Factory(); SOAPEnvelope message = soapFactory.getDefaultFaultEnvelope(); SOAPFaultDetail soapFaultDetail = soapFactory.createSOAPFaultDetail(); soapFaultDetail.setText(detail); message.getBody().getFault().setDetail(soapFaultDetail); SOAPFaultReason soapFaultReason = soapFactory.createSOAPFaultReason(); SOAPFaultText soapFaultText = soapFactory.createSOAPFaultText(); soapFaultText.setText(reason); soapFaultReason.addSOAPText(soapFaultText); message.getBody().getFault().setReason(soapFaultReason); SOAPFaultCode soapFaultCode = soapFactory.createSOAPFaultCode(); SOAPFaultValue soapFaultValue = soapFactory.createSOAPFaultValue(soapFaultCode); soapFaultValue.setText(code); soapFaultCode.setValue(soapFaultValue); SOAPFaultSubCode soapFaultSubCode = soapFactory.createSOAPFaultSubCode(soapFaultCode); SOAPFaultValue soapFaultValueSub = soapFactory.createSOAPFaultValue(soapFaultSubCode); QName qNameSubCode = new QName(EventingConstants.WSE_EVENTING_NS, subCode, EventingConstants.WSE_EVENTING_PREFIX); soapFaultValueSub.setText(qNameSubCode); soapFaultSubCode.setValue(soapFaultValueSub); soapFaultCode.setSubCode(soapFaultSubCode); message.getBody().getFault().setCode(soapFaultCode); return message; } } private void handleException(String message, Exception e) { log.error(message, e); throw new SynapseException(message, e); } }