Пример #1
0
 private boolean isSOAP12(Message message) {
   if (message.getExchange().getBinding() instanceof SoapBinding) {
     SoapBinding binding = (SoapBinding) message.getExchange().getBinding();
     if (binding.getSoapVersion() == Soap12.getInstance()) {
       return true;
     }
   }
   return false;
 }
Пример #2
0
 @Test
 public void createSoap12Fault() {
   SoapBinding sb = control.createMock(SoapBinding.class);
   EasyMock.expect(sb.getSoapVersion()).andReturn(Soap12.getInstance());
   setupJMSFault(true, SoapJMSConstants.getMismatchedSoapActionQName(), null);
   control.replay();
   SoapFaultFactory factory = new SoapFaultFactory(sb);
   SoapFault fault = (SoapFault) factory.createFault(jmsFault);
   assertEquals("reason", fault.getReason());
   assertEquals(Soap12.getInstance().getSender(), fault.getFaultCode());
   assertEquals(SoapJMSConstants.getMismatchedSoapActionQName(), fault.getSubCode());
   assertNull(fault.getDetail());
   assertNull(fault.getCause());
   control.verify();
 }
  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;
  }