use of javax.wsdl.Part in project carbon-business-process by wso2.
the class SOAPUtils method extractSOAPBodyParts.
private static void extractSOAPBodyParts(MessageExchange partnerRoleMessageExchange, org.apache.ode.bpel.iapi.Message messageToODE, SOAPBody omSOAPBody, List parts, String namespace, boolean isRPC) throws BPELFault {
List<Part> messageBodyParts = partnerRoleMessageExchange.getOperation().getOutput().getMessage().getOrderedParts(parts);
if (isRPC) {
String rpcWrapperElementName = partnerRoleMessageExchange.getOperationName() + "Response";
OMElement rpcWrapperElement = omSOAPBody.getFirstChildWithName(new QName(namespace, rpcWrapperElementName));
if (rpcWrapperElement == null) {
throw new BPELFault("Message body doesn't contain expected part wrapper: " + new QName(namespace, rpcWrapperElementName));
}
// children, since doc-lit rpc looks the same in ode and soap.
for (Part partDef : messageBodyParts) {
OMElement omPartElement = rpcWrapperElement.getFirstChildWithName(new QName(null, partDef.getName()));
if (omPartElement == null) {
throw new BPELFault("SOAP body doesn't contain required part: " + new QName(null, partDef.getName()));
}
messageToODE.setPart(omPartElement.getLocalName(), OMUtils.toDOM(omPartElement));
}
} else {
// In doc-literal style, we expect the elements in the body to correspond (in order)
// to the parts defined in the binding. All the parts should be element-typed,
// otherwise it is a mess.
Iterator<OMElement> omParts = omSOAPBody.getChildElements();
for (Part partDef : messageBodyParts) {
if (!omParts.hasNext()) {
throw new BPELFault("SOAP body doesn't contain required part.");
}
OMElement omPart = omParts.next();
if (partDef.getElementName() == null) {
throw new BPELFault("Binding defines non element document list parts.");
}
if (!omPart.getQName().equals(partDef.getElementName())) {
throw new BPELFault("Unexpected element in SOAP body: " + omPart.getQName());
}
Document doc = DOMUtils.newDocument();
Element domPart = doc.createElementNS(null, partDef.getName());
domPart.appendChild(doc.importNode(OMUtils.toDOM(omPart), true));
messageToODE.setPart(partDef.getName(), domPart);
}
}
}
use of javax.wsdl.Part in project carbon-business-process by wso2.
the class SOAPUtils method populateSOAPBody.
@SuppressWarnings("unchecked")
private static void populateSOAPBody(SOAPEnvelope soapEnvelope, ElementExtensible bindingInput, boolean soap12, SOAPFactory soapFactory, Operation operation, Message messageDefinition, org.apache.ode.bpel.iapi.Message messageFromODE, boolean isRPC, boolean isRequest) throws BPELFault {
if (soap12) {
SOAP12Body soapBodyDefinition = getSOAP12Body(bindingInput);
if (soapBodyDefinition != null) {
SOAPBody soapBody;
if (soapEnvelope.getBody() != null) {
soapBody = soapEnvelope.getBody();
} else {
soapBody = soapFactory.createSOAPBody(soapEnvelope);
}
OMElement partHolder;
if (isRPC) {
String rpcWrapperElementName;
if (isRequest) {
rpcWrapperElementName = operation.getName();
} else {
rpcWrapperElementName = operation.getName() + "Response";
}
partHolder = createRPCWrapperElement(soapBody, soapFactory, new QName(soapBodyDefinition.getNamespaceURI(), rpcWrapperElementName));
} else {
partHolder = soapBody;
}
List<Part> parts = messageDefinition.getOrderedParts(soapBodyDefinition.getParts());
for (Part p : parts) {
Element partContent = DOMUtils.findChildByName(messageFromODE.getMessage(), new QName(null, p.getName()));
if (partContent == null) {
throw new BPELFault("Missing required part in ODE Message: " + new QName(null, p.getName()));
}
OMElement omPartContent = OMUtils.toOM(partContent, soapFactory);
if (isRPC) {
partHolder.addChild(omPartContent);
} else {
for (Iterator<OMNode> i = omPartContent.getChildren(); i.hasNext(); ) {
partHolder.addChild(i.next());
}
}
}
}
} else {
javax.wsdl.extensions.soap.SOAPBody soapBodyDefinition = getSOAP11Body(bindingInput);
if (soapBodyDefinition != null) {
SOAPBody soapBody;
if (soapEnvelope.getBody() != null) {
soapBody = soapEnvelope.getBody();
} else {
soapBody = soapFactory.createSOAPBody(soapEnvelope);
}
OMElement partHolder;
if (isRPC) {
String rpcWrapperElementName;
if (isRequest) {
rpcWrapperElementName = operation.getName();
} else {
rpcWrapperElementName = operation.getName() + "Response";
}
partHolder = createRPCWrapperElement(soapBody, soapFactory, new QName(soapBodyDefinition.getNamespaceURI(), rpcWrapperElementName));
} else {
partHolder = soapBody;
}
List<Part> parts = messageDefinition.getOrderedParts(soapBodyDefinition.getParts());
for (Part p : parts) {
Element partContent = DOMUtils.findChildByName(messageFromODE.getMessage(), new QName(null, p.getName()));
if (partContent == null) {
throw new BPELFault("Missing required part in ODE Message: " + new QName(null, p.getName()));
}
OMElement omPartContent = OMUtils.toOM(partContent, soapFactory);
if (isRPC) {
partHolder.addChild(omPartContent);
} else {
for (Iterator<OMNode> i = omPartContent.getChildren(); i.hasNext(); ) {
partHolder.addChild(i.next());
}
}
}
}
}
}
use of javax.wsdl.Part in project carbon-business-process by wso2.
the class WSDLAwareSOAPProcessor method processMessageParts.
private WSDLAwareMessage processMessageParts(BindingInput bindingInput) throws AxisFault {
WSDLAwareMessage message = new WSDLAwareMessage();
message.setBinding(wsdlBinding);
List parts;
String namespace;
if (soap12) {
SOAP12Body soapBodyDef = getFirstExtensibilityElement(bindingInput, SOAP12Body.class);
if (soapBodyDef == null) {
String errMessage = "SOAPBody null for binding input.";
log.error(errMessage);
throw new AxisFault(errMessage);
}
parts = soapBodyDef.getParts();
namespace = soapBodyDef.getNamespaceURI();
} else {
SOAPBody soapBodyDef = getFirstExtensibilityElement(bindingInput, SOAPBody.class);
if (soapBodyDef == null) {
String errMessage = "SOAPBody null for binding input.";
log.error(errMessage);
throw new AxisFault(errMessage);
}
parts = soapBodyDef.getParts();
namespace = soapBodyDef.getNamespaceURI();
}
QName axisOperationName = inMessageCtx.getAxisOperation().getName();
/**
* Local part of the axis Operation's name equals to WSDL Operation name.
*/
Operation op = wsdlBinding.getPortType().getOperation(axisOperationName.getLocalPart(), null, null);
String rpcWrapper = op.getName();
List bodyParts = op.getInput().getMessage().getOrderedParts(parts);
if (isRPC) {
message.setRPC(true);
QName rpWrapperQName = new QName(namespace, rpcWrapper);
OMElement partWrapper = inMessageCtx.getEnvelope().getBody().getFirstChildWithName(rpWrapperQName);
if (partWrapper == null) {
String errMsg = "SOAP Body doesn't contain expected part wrapper.";
log.error(errMsg);
throw new AxisFault(errMsg);
}
/* In RPC the body element is the operation name, wrapping parts. Order doesn't really
* matter as far as we're concerned. All we need to do is copy the soap:body children,
* since doc-lit rpc looks the same in ode and soap.*/
for (Object partDef : bodyParts) {
OMElement srcPart = partWrapper.getFirstChildWithName(new QName(null, ((Part) partDef).getName()));
if (srcPart == null) {
throw new AxisFault("SOAP Body doesn't contain required part " + ((Part) partDef).getName() + ".");
}
message.addBodyPart(srcPart.getLocalName(), srcPart);
}
} else {
/**
* In doc-literal style, we expect the elements in the body to correspond (in order) to
* the parts defined in the binding. All the parts should be element-typed, otherwise
* it is a mess.
*/
message.setRPC(false);
Iterator srcParts = inMessageCtx.getEnvelope().getBody().getChildElements();
for (Object partDef : bodyParts) {
if (!srcParts.hasNext()) {
throw new AxisFault("SOAP Body does not contain required part" + ((Part) partDef).getName() + ".");
}
OMElement srcPart = (OMElement) srcParts.next();
if (((Part) partDef).getElementName() == null) {
throw new AxisFault("Binding defines non-element document literal part(s)");
}
if (!srcPart.getQName().equals(((Part) partDef).getElementName())) {
throw new AxisFault("Unexpected element in SOAP body.");
}
message.addBodyPart(((Part) partDef).getName(), srcPart);
}
}
processSoapHeaderParts(message, bindingInput, op);
return message;
}
use of javax.wsdl.Part in project carbon-business-process by wso2.
the class WSDLAwareSOAPProcessor method handleSoapHeaderPartDef.
private void handleSoapHeaderPartDef(WSDLAwareMessage message, SOAPHeader headerDef, Message msgType, org.apache.axiom.soap.SOAPHeader soapHeader) throws AxisFault {
boolean payloadMessageHeader = headerDef.getMessage() == null || headerDef.getMessage().equals(msgType.getQName());
boolean requiredHeader = payloadMessageHeader || (headerDef.getRequired() != null && headerDef.getRequired());
if (requiredHeader && soapHeader == null) {
throw new AxisFault("Missing required SOAP header element.");
}
if (soapHeader == null) {
return;
}
Message headerMsg = wsdlDef.getMessage(headerDef.getMessage());
if (headerMsg == null) {
return;
}
Part p = headerMsg.getPart(headerDef.getPart());
if (p == null || p.getElementName() == null) {
return;
}
OMElement headerEl = soapHeader.getFirstChildWithName(p.getElementName());
if (requiredHeader && headerEl == null) {
throw new AxisFault("Missing required SOAP header element.");
}
if (headerEl == null) {
return;
}
message.addHeaderPart(p.getName(), headerEl);
}
use of javax.wsdl.Part in project carbon-business-process by wso2.
the class SOAPHelper method createSoapBody.
public void createSoapBody(org.apache.axiom.soap.SOAPBody sb, SOAPBody soapBody, Message msgDef, Element message, String rpcWrapper) throws AxisFault {
OMElement partHolder = isRPC ? soapFactory.createOMElement(new QName(soapBody.getNamespaceURI(), rpcWrapper, "odens"), sb) : sb;
List<Part> parts = msgDef.getOrderedParts(soapBody.getParts());
for (Part part : parts) {
Element srcPartEl = DOMUtils.findChildByName(message, new QName(null, part.getName()));
if (srcPartEl == null) {
throw new AxisFault("Missing required part in ODE Message");
}
OMElement omPart = OMUtils.toOM(srcPartEl, soapFactory);
if (isRPC) {
partHolder.addChild(omPart);
} else {
for (Iterator<OMNode> i = omPart.getChildren(); i.hasNext(); ) {
partHolder.addChild(i.next());
}
}
}
}
Aggregations