public Binding createBinding(BindingInfo binding) { // TODO what about the mix style/use? // The default style should be doc-lit wrapped. String parameterStyle = SoapBindingConstants.PARAMETER_STYLE_WRAPPED; String bindingStyle = SoapBindingConstants.BINDING_STYLE_DOC; boolean hasWrapped = false; org.apache.cxf.binding.soap.SoapBinding sb = null; SoapVersion version = null; if (binding instanceof SoapBindingInfo) { SoapBindingInfo sbi = (SoapBindingInfo) binding; version = sbi.getSoapVersion(); sb = new org.apache.cxf.binding.soap.SoapBinding(binding, version); // Service wide style if (!StringUtils.isEmpty(sbi.getStyle())) { bindingStyle = sbi.getStyle(); } boolean hasRPC = false; boolean hasDoc = false; // Operation wide style, what to do with the mixed style/use? for (BindingOperationInfo boi : sbi.getOperations()) { String st = sbi.getStyle(boi.getOperationInfo()); if (st != null) { bindingStyle = st; if (SoapBindingConstants.BINDING_STYLE_RPC.equalsIgnoreCase(st)) { hasRPC = true; } else { hasDoc = true; } } if (boi.getUnwrappedOperation() == null) { parameterStyle = SoapBindingConstants.PARAMETER_STYLE_BARE; } else { hasWrapped = true; } } if (Boolean.TRUE.equals(binding.getService().getProperty("soap.force.doclit.bare"))) { hasDoc = true; hasRPC = false; parameterStyle = SoapBindingConstants.PARAMETER_STYLE_BARE; bindingStyle = SoapBindingConstants.BINDING_STYLE_DOC; } if (hasRPC && hasDoc) { throw new RuntimeException( "WSI-BP prohibits RPC and Document style " + "operations in same service."); } // jms if (sbi.getTransportURI().equals(SoapJMSConstants.SOAP_JMS_SPECIFICIATION_TRANSPORTID)) { sb.getInInterceptors().add(new SoapJMSInInterceptor()); } } else { throw new RuntimeException( "Can not initialize SoapBinding, BindingInfo is not SoapBindingInfo"); } sb.getOutFaultInterceptors().add(new StaxOutInterceptor()); sb.getOutFaultInterceptors().add(new SoapOutInterceptor(getBus())); sb.getInInterceptors().add(new AttachmentInInterceptor()); sb.getInInterceptors().add(new StaxInInterceptor()); sb.getInInterceptors().add(new SoapActionInInterceptor()); sb.getOutInterceptors().add(new AttachmentOutInterceptor()); sb.getOutInterceptors().add(new StaxOutInterceptor()); sb.getOutInterceptors().add(SoapHeaderOutFilterInterceptor.INSTANCE); if (SoapBindingConstants.BINDING_STYLE_RPC.equalsIgnoreCase(bindingStyle)) { sb.getInInterceptors().add(new RPCInInterceptor()); sb.getOutInterceptors().add(new RPCOutInterceptor()); } else if (SoapBindingConstants.BINDING_STYLE_DOC.equalsIgnoreCase(bindingStyle) && SoapBindingConstants.PARAMETER_STYLE_BARE.equalsIgnoreCase(parameterStyle)) { // sb.getInInterceptors().add(new BareInInterceptor()); sb.getInInterceptors().add(new DocLiteralInInterceptor()); if (hasWrapped) { sb.getOutInterceptors().add(new WrappedOutInterceptor()); } sb.getOutInterceptors().add(new BareOutInterceptor()); } else { // sb.getInInterceptors().add(new WrappedInInterceptor()); sb.getInInterceptors().add(new DocLiteralInInterceptor()); sb.getOutInterceptors().add(new WrappedOutInterceptor()); sb.getOutInterceptors().add(new BareOutInterceptor()); } sb.getInInterceptors().add(new SoapHeaderInterceptor()); sb.getInInterceptors().add(new ReadHeadersInterceptor(getBus(), version)); sb.getInInterceptors().add(new StartBodyInterceptor()); sb.getInInterceptors().add(new CheckFaultInterceptor()); sb.getInInterceptors().add(new MustUnderstandInterceptor()); sb.getOutInterceptors().add(new SoapPreProtocolOutInterceptor()); sb.getOutInterceptors().add(new SoapOutInterceptor(getBus())); sb.getOutFaultInterceptors().add(new SoapOutInterceptor(getBus())); sb.getOutFaultInterceptors().add(SoapHeaderOutFilterInterceptor.INSTANCE); // REVISIT: The phase interceptor chain seems to freak out if this added // first. Not sure what the deal is at the moment, I suspect the // ordering algorithm needs to be improved sb.getInInterceptors().add(new URIMappingInterceptor()); if (version.getVersion() == 1.1) { sb.getInFaultInterceptors().add(new Soap11FaultInInterceptor()); sb.getOutFaultInterceptors().add(new Soap11FaultOutInterceptor()); } else if (version.getVersion() == 1.2) { sb.getInFaultInterceptors().add(new Soap12FaultInInterceptor()); sb.getOutFaultInterceptors().add(new Soap12FaultOutInterceptor()); } if (binding.getService() != null) { for (EndpointInfo ei : binding.getService().getEndpoints()) { if (ei.getAddress() != null && ei.getAddress().startsWith("soap.udp")) { setupUDP(sb, ei); } } } return sb; }
public void createPortExtensors(Bus b, EndpointInfo ei, Service service) { if (ei.getBinding() instanceof SoapBindingInfo) { SoapBindingInfo bi = (SoapBindingInfo) ei.getBinding(); createSoapExtensors(b, ei, bi, bi.getSoapVersion() instanceof Soap12); } }
private void createSoapBinding(final SoapBindingInfo bi) throws WSDLException { boolean isSoap12 = bi.getSoapVersion() instanceof Soap12; Bus bs = getBus(); WSDLManager m = bs.getExtension(WSDLManager.class); ExtensionRegistry extensionRegistry = m.getExtensionRegistry(); SoapBinding soapBinding = SOAPBindingUtil.createSoapBinding(extensionRegistry, isSoap12); soapBinding.setStyle(bi.getStyle()); soapBinding.setTransportURI(bi.getTransportURI()); bi.addExtensor(soapBinding); for (BindingOperationInfo b : bi.getOperations()) { for (BindingFaultInfo faultInfo : b.getFaults()) { SoapFault soapFault = SOAPBindingUtil.createSoapFault(extensionRegistry, isSoap12); soapFault.setUse("literal"); soapFault.setName(faultInfo.getFaultInfo().getFaultName().getLocalPart()); faultInfo.addExtensor(soapFault); } SoapOperationInfo soi = b.getExtensor(SoapOperationInfo.class); SoapOperation soapOperation = SOAPBindingUtil.createSoapOperation(extensionRegistry, isSoap12); soapOperation.setSoapActionURI(soi.getAction()); soapOperation.setStyle(soi.getStyle()); boolean isRpc = "rpc".equals(soapOperation.getStyle()); b.addExtensor(soapOperation); if (b.getInput() != null) { List<String> bodyParts = null; List<SoapHeaderInfo> headerInfos = b.getInput().getExtensors(SoapHeaderInfo.class); if (headerInfos != null && headerInfos.size() > 0) { bodyParts = new ArrayList<String>(); for (MessagePartInfo part : b.getInput().getMessageParts()) { bodyParts.add(part.getName().getLocalPart()); } for (SoapHeaderInfo headerInfo : headerInfos) { SoapHeader soapHeader = SOAPBindingUtil.createSoapHeader(extensionRegistry, BindingInput.class, isSoap12); soapHeader.setMessage(b.getInput().getMessageInfo().getName()); soapHeader.setPart(headerInfo.getPart().getName().getLocalPart()); soapHeader.setUse("literal"); bodyParts.remove(headerInfo.getPart().getName().getLocalPart()); headerInfo.getPart().setProperty(HEADER, true); b.getInput().addExtensor(soapHeader); } } SoapBody body = SOAPBindingUtil.createSoapBody(extensionRegistry, BindingInput.class, isSoap12); body.setUse("literal"); if (isRpc) { body.setNamespaceURI(b.getName().getNamespaceURI()); } if (bodyParts != null) { body.setParts(bodyParts); } b.getInput().addExtensor(body); } if (b.getOutput() != null) { List<String> bodyParts = null; List<SoapHeaderInfo> headerInfos = b.getOutput().getExtensors(SoapHeaderInfo.class); if (headerInfos != null && headerInfos.size() > 0) { bodyParts = new ArrayList<String>(); for (MessagePartInfo part : b.getOutput().getMessageParts()) { bodyParts.add(part.getName().getLocalPart()); } for (SoapHeaderInfo headerInfo : headerInfos) { SoapHeader soapHeader = SOAPBindingUtil.createSoapHeader(extensionRegistry, BindingOutput.class, isSoap12); soapHeader.setMessage(b.getOutput().getMessageInfo().getName()); soapHeader.setPart(headerInfo.getPart().getName().getLocalPart()); soapHeader.setUse("literal"); bodyParts.remove(headerInfo.getPart().getName().getLocalPart()); b.getOutput().addExtensor(soapHeader); } } SoapBody body = SOAPBindingUtil.createSoapBody(extensionRegistry, BindingOutput.class, isSoap12); body.setUse("literal"); if (isRpc) { body.setNamespaceURI(b.getName().getNamespaceURI()); } if (bodyParts != null) { body.setParts(bodyParts); } b.getOutput().addExtensor(body); } } }