handlerchaininvoker.java

来自「RESIN 3.2 最新源码」· Java 代码 · 共 767 行 · 第 1/2 页

JAVA
767
字号
      if (_runtimeException != null)        return false;      if (! success)        return false;    }    return true;  }  public boolean invokeOutboundFaultHandlers()  {    for (_i--; _i >= 0; _i--) {      if (! handleFault(_i))        return false;      if (_runtimeException != null)        return false;    }    return true;  }  /**   * Invoke the handler chain for an inbound message.   **/  public boolean invokeInbound(InputStream in,                                Map<String,DataHandler> attachments)    throws WebServiceException  {    _outbound = false;    _source = null;    try {      DOMResult dom = new DOMResult();      getTransformer().transform(new StreamSource(in), dom);      // XXX The TCK seems to assume a source that will stand up to repeated      // reads... meaning that StreamSource and SAXSource are out, so DOM      // must be what they want.      _source = new DOMSource(dom.getNode());    }    catch (Exception e) {      throw new WebServiceException(e);    }    // Set the mandatory properties    _logicalContext.put(MESSAGE_OUTBOUND_PROPERTY, Boolean.FALSE);    _soapContext.put(MESSAGE_OUTBOUND_PROPERTY, Boolean.FALSE);    _logicalContext.put(INBOUND_MESSAGE_ATTACHMENTS, attachments);    _soapContext.put(INBOUND_MESSAGE_ATTACHMENTS, attachments);    // NOTE: the order is reversed for inbound messages    for (_i = _chain.size() - 1; _i >= 0; _i--) {      boolean success = handleMessage(_i);      if (_protocolException != null)        return false;      if (_runtimeException != null)        return false;      if (! success)        return false;    }    return true;  }  /**   * When a message direction is reversed within the chain, this method   * runs the message backwards through the previous handlers.  This   * method should only be invoked when a handler returns false, but   * does not throw any kind of exception.   **/  public boolean uninvokeInbound()    throws WebServiceException  {    // Set the mandatory properties    _logicalContext.put(MESSAGE_OUTBOUND_PROPERTY, Boolean.TRUE);    _soapContext.put(MESSAGE_OUTBOUND_PROPERTY, Boolean.TRUE);    for (_i++; _i < _chain.size(); _i++) {      boolean success = handleMessage(_i);      if (_protocolException != null)        return false;      if (_runtimeException != null)        return false;      if (! success)        return false;    }    return true;  }  public boolean invokeInboundFaultHandlers()  {    for (_i++; _i < _chain.size(); _i++) {      if (! handleFault(_i))        return false;      if (_runtimeException != null)        return false;    }    return true;  }  public void reverseDirection()  {    Boolean direction =       (Boolean) _logicalContext.get(MESSAGE_OUTBOUND_PROPERTY);    if (direction != null) {      if (Boolean.TRUE.equals(direction)) {        _logicalContext.put(MESSAGE_OUTBOUND_PROPERTY, Boolean.FALSE);        _soapContext.put(MESSAGE_OUTBOUND_PROPERTY, Boolean.FALSE);      }      else {        _logicalContext.put(MESSAGE_OUTBOUND_PROPERTY, Boolean.TRUE);        _soapContext.put(MESSAGE_OUTBOUND_PROPERTY, Boolean.TRUE);      }    }  }  public ProtocolException getProtocolException()  {    return _protocolException;  }  public RuntimeException getRuntimeException()  {    return _runtimeException;  }  public Source getSource()  {    return _source;  }  private boolean handleMessage(int i)  {    Handler handler = _chain.get(i);    boolean success = false;    _invoked[i] = true;    try {      if (handler instanceof LogicalHandler) {        _logicalContext.getMessage().setPayload(_source);        success = handler.handleMessage(_logicalContext);        _source = _logicalContext.getMessage().getPayload();      }      else if (handler instanceof SOAPHandler) {        try {          _soapContext.setMessage(_source);          success = handler.handleMessage(_soapContext);          _source = _soapContext.getMessage().getSOAPPart().getContent();        }        catch (SOAPException e) {          throw new WebServiceException(e);        }      }      else {        throw new WebServiceException(L.l("Unsupported Handler type: {0}",                                          handler.getClass().getName()));      }    }    catch (ProtocolException e) {      _protocolException = e;      serializeProtocolException();    }    catch (RuntimeException e) {      _runtimeException = e;      serializeRuntimeException();    }    return success;  }  private boolean handleFault(int i)  {    Handler handler = _chain.get(i);    boolean success = false;    _invoked[i] = true;    try {      if (handler instanceof LogicalHandler) {        _logicalContext.getMessage().setPayload(_source);        success = handler.handleFault(_logicalContext);        _source = _logicalContext.getMessage().getPayload();      }      else if (handler instanceof SOAPHandler) {        try {          _soapContext.setMessage(_source);          success = handler.handleFault(_soapContext);          _source = _soapContext.getMessage().getSOAPPart().getContent();        }        catch (SOAPException e) {          throw new WebServiceException(e);        }      }      else {        throw new WebServiceException(L.l("Unsupported Handler type: {0}",                                          handler.getClass().getName()));      }      _protocolException = null;    }    catch (ProtocolException e) {      _protocolException = e;      serializeProtocolException();    }    catch (RuntimeException e) {      _runtimeException = e;      serializeRuntimeException();    }    return success;  }  private void close(int i)  {    Handler handler = _chain.get(i);    if (! _invoked[i])      return;    _invoked[i] = false;    if (handler instanceof LogicalHandler) {      _logicalContext.getMessage().setPayload(_source);      handler.close(_logicalContext);      _source = _logicalContext.getMessage().getPayload();    }    else if (handler instanceof SOAPHandler) {      try {        _soapContext.setMessage(_source);        handler.close(_soapContext);        _source = _soapContext.getMessage().getSOAPPart().getContent();      }      catch (SOAPException e) {        throw new WebServiceException(e);      }    }  }  private void importAppProperties(boolean request)  {    if (_bindingProvider == null)      return;    if (request) {      _logicalContext.putAll(_bindingProvider.getRequestContext(),                              Scope.APPLICATION);      _soapContext.putAll(_bindingProvider.getRequestContext(),                            Scope.APPLICATION);    }    else {      _logicalContext.putAll(_bindingProvider.getResponseContext(),                              Scope.APPLICATION);      _soapContext.putAll(_bindingProvider.getResponseContext(),                            Scope.APPLICATION);    }  }  private void exportAppProperties(boolean request)  {    if (_bindingProvider == null)      return;    if (request) {       Map<String,Object> map = null;            map = _logicalContext.getScopedSubMap(Scope.APPLICATION);      _bindingProvider.getRequestContext().putAll(map);      map = _soapContext.getScopedSubMap(Scope.APPLICATION);      _bindingProvider.getRequestContext().putAll(map);    }    else {      Map<String,Object> map = null;            map = _logicalContext.getScopedSubMap(Scope.APPLICATION);      _bindingProvider.getResponseContext().putAll(map);      map = _soapContext.getScopedSubMap(Scope.APPLICATION);      _bindingProvider.getResponseContext().putAll(map);    }  }  private void serializeProtocolException()    throws WebServiceException  {    if (_protocolException instanceof SOAPFaultException) {      SOAPFaultException sfe = (SOAPFaultException) _protocolException;      SOAPFault fault = sfe.getFault();      try {        MessageFactory factory = _soapContext.getMessageFactory();        SOAPMessage message = factory.createMessage();        message.getSOAPBody().addChildElement(fault);        _soapContext.setMessage(message);        _source = _soapContext.getMessage().getSOAPPart().getContent();      }      catch (SOAPException se) {        throw new WebServiceException(se);      }    }    else {      throw new WebServiceException(L.l("Unsupported ProtocolException: {0}",                                        _protocolException));    }  }  private void serializeRuntimeException()    throws WebServiceException  {    try {      MessageFactory factory = _soapContext.getMessageFactory();      SOAPMessage message = factory.createMessage();      QName faultcode = new QName(message.getSOAPBody().getNamespaceURI(),                                   "Server",                                  message.getSOAPBody().getPrefix());      message.getSOAPBody().addFault(faultcode, _runtimeException.getMessage());      _soapContext.setMessage(message);      _source = _soapContext.getMessage().getSOAPPart().getContent();    }    catch (SOAPException se) {      throw new WebServiceException(se);    }  }  private static Transformer getTransformer()    throws TransformerException  {    if (_transformer == null) {      TransformerFactory factory = TransformerFactory.newInstance();      _transformer = factory.newTransformer();    }    return _transformer;  }  public String toString()  {    StringBuilder sb = new StringBuilder("HandlerChainInvoker[\n");    for (Handler handler : _chain) {      sb.append(handler.toString());      sb.append('\n');    }    sb.append(']');    return sb.toString();  }  public void printSource()  {    try {      StreamResult result = new StreamResult(System.out);      getTransformer().transform(_source, result);    }    catch (Exception e) {    }  }  public String getDirection()  {    return _outbound ? "Outbound" : "Inbound";  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?