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 + -
显示快捷键?