/** * Handle message * @param smc SOAPMessageContext * @return boolean */ public boolean handleMessage(LogicalMessageContext smc) { Boolean outboundProperty = (Boolean) smc .get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); if (outboundProperty.booleanValue()) { startTime = new Date(); smc.put(HandlerName + "StartTime", startTime); } else { try { startTime = (Date) smc.get(HandlerName + "StartTime"); endTime = new Date(); long elapsedTime = endTime.getTime() - startTime.getTime(); smc.put("ELAPSED_TIME", elapsedTime); smc.setScope("ELAPSED_TIME", MessageContext.Scope.APPLICATION); logger.info("Elapsed time in handler " + HandlerName + " is " + elapsedTime); } catch (Exception x) { x.printStackTrace(); } } return true; }
private void doLog(LogicalMessageContext smc) { if (!(Boolean) smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY)) { try { TransformerFactory tff = TransformerFactory.newInstance(); Transformer tf = tff.newTransformer(); tf.setOutputProperty(OutputKeys.INDENT, "yes"); tf.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); Source sc = smc.getMessage().getPayload(); StreamResult result = new StreamResult(outputStream); tf.transform(sc, result); } catch (Exception e) { PrintWriter ps = new PrintWriter(outputStream); ps.println("Exception getting response message log: "); e.printStackTrace(ps); } } }
/** * Test to make sure we can get the payload multiple times from the same LogicalMessage. * @throws Exception */ public void testGetMultiplePayloadsAsSource() throws Exception { LogicalMessageContext lmc = createSampleContext(); LogicalMessage msg = lmc.getMessage(); assertTrue("The returned LogicalMessage was null", msg != null); int loopCount = 3; for (int i = 0; i < loopCount; ++i) { Source payload = msg.getPayload(); assertTrue("Attempt number " + i + " to get the payload (Source) was null", payload != null); String resultContent = _getStringFromSource(payload); assertTrue("The content returned in loop " + i + " was null", resultContent != null); assertTrue("The content returned in loop " + i + " was incomplete, unexpected element", resultContent.indexOf("echoString") > -1); assertTrue("The content returned in loop " + i + " was incomplete, unexpected content", resultContent.indexOf(INPUT) > -1); } }
public void testConvertMessageToFault() throws Exception { LogicalMessageContext lmc = createSampleContext(); LogicalMessage msg = lmc.getMessage(); assertTrue("The returned LogicalMessage was null", msg != null); Source payload = msg.getPayload(); assertTrue("The returned payload (Source) was null", payload != null); String resultContent = _getStringFromSource(payload); assertTrue("The content returned was null", resultContent != null); ByteArrayInputStream bais = new ByteArrayInputStream(sampleSOAP11FaultPayload.getBytes()); StreamSource faultSource = new StreamSource(bais); msg.setPayload(faultSource); Source newFaultSource = msg.getPayload(); assertTrue("The new fault content returned was null", faultSource != null); String newFaultContent = _getStringFromSource(newFaultSource); assertTrue("The new fault content returned was invalid", newFaultContent.equals(sampleSOAP11FaultPayload)); }
private LogicalMessageContext createSampleFaultContext() throws Exception { MessageFactory factory = (MessageFactory) FactoryRegistry.getFactory(MessageFactory.class); Message msg = factory.create(Protocol.soap11); XMLFaultReason reason = new XMLFaultReason(FAULT_INPUT); XMLFault fault = new XMLFault(XMLFaultCode.SENDER, reason); msg.setXMLFault(fault); MessageContext mc = new MessageContext(); mc.setMEPContext(new MEPContext(mc)); mc.setMessage(msg); LogicalMessageContext lmc = MessageContextFactory.createLogicalMessageContext(mc); return lmc; }
/** * A test that mimics the inbound flow through a handler chain. */ public void testInboundFaultFlow() throws Exception { MessageContext mc = createSampleFaultMessageContext(); LogicalMessageContext lmc = MessageContextFactory.createLogicalMessageContext(mc); LogicalMessage lm = lmc.getMessage(); Source payload = lm.getPayload(); assertTrue("The returned payload (Source) was null", payload != null); ByteArrayOutputStream baos = new ByteArrayOutputStream(); StreamResult result = new StreamResult(baos); Transformer t = TransformerFactory.newInstance().newTransformer(); t.transform(payload, result); String content = new String(baos.toByteArray()); assertTrue("The returned content (String) from the payload was null", content != null); assertTrue("The <faultcode> element was not found", content.indexOf("faultcode") > -1); assertTrue("The <faultstring> element was not found", content.indexOf("faultstring") > -1); assertTrue("The fault did not contain the expected fault string", content.indexOf(FAULT_INPUT) > -1); SoapMessageContext smc = MessageContextFactory.createSoapMessageContext(mc); SOAPMessage sm = smc.getMessage(); assertTrue("The returned SOAPMessage was null", sm != null); assertTrue("The SOAPMessage did not contain a SOAPBody", sm.getSOAPBody() != null); assertTrue("The SOAPBody did not contain a SOAPFault", sm.getSOAPBody().getFault() != null); }
/** * A test that mimics the outbound flow through a handler chain. */ public void testOutboundFaultFlow() throws Exception { MessageContext mc = createSampleFaultMessageContext(); SoapMessageContext smc = MessageContextFactory.createSoapMessageContext(mc); SOAPMessage sm = smc.getMessage(); assertTrue("The returned SOAPMessage was null", sm != null); assertTrue("The SOAPMessage did not contain a SOAPBody", sm.getSOAPBody() != null); assertTrue("The SOAPBody did not contain a SOAPFault", sm.getSOAPBody().getFault() != null); LogicalMessageContext lmc = MessageContextFactory.createLogicalMessageContext(mc); LogicalMessage lm = lmc.getMessage(); Source payload = lm.getPayload(); assertTrue("The returned payload (Source) was null", payload != null); ByteArrayOutputStream baos = new ByteArrayOutputStream(); StreamResult result = new StreamResult(baos); Transformer t = TransformerFactory.newInstance().newTransformer(); t.transform(payload, result); String content = new String(baos.toByteArray()); assertTrue("The returned content (String) from the payload was null", content != null); assertTrue("The <faultcode> element was not found", content.indexOf("faultcode") > -1); assertTrue("The <faultstring> element was not found", content.indexOf("faultstring") > -1); assertTrue("The fault did not contain the expected fault string", content.indexOf(FAULT_INPUT) > -1); }
@Override public boolean handleMessage(LogicalMessageContext context) { Boolean isOutbound = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); String operation = ((QName) context.get(MessageContext.WSDL_OPERATION)).getLocalPart(); if (!isOutbound && !operation.startsWith("getHandlerCounter")) { counter.incrementAndGet(); } else if (isOutbound && !operation.startsWith("getHandlerCounter")) { outboundCounter.incrementAndGet(); } return true; }
@Override public boolean handleFault(LogicalMessageContext context) { String operation = ((QName) context.get(MessageContext.WSDL_OPERATION)).getLocalPart(); if (!operation.startsWith("getHandlerCounter")) { outboundCounter.incrementAndGet(); } return true; }
private boolean appendHandlerName(MessageContext msgContext, String direction) { try { // Get the payload as Source LogicalMessageContext logicalContext = (LogicalMessageContext)msgContext; Source source = logicalContext.getMessage().getPayload(); TransformerFactory tf = TransformerFactory.newInstance(); ByteArrayOutputStream baos = new ByteArrayOutputStream(1024); tf.newTransformer().transform(source, new StreamResult(baos)); // Parse the payload and extract the value Element root = DOMUtils.parse(new ByteArrayInputStream(baos.toByteArray()), getDocumentBuilder()); Element element = DOMUtils.getFirstChildElement(root); String oldValue = DOMUtils.getTextContent(element); String newValue = oldValue + ":" + direction + ":LogicalSourceHandler"; element.setTextContent(newValue); log.debug("oldValue: " + oldValue); log.debug("newValue: " + newValue); // Set the updated payload source = new DOMSource(root); logicalContext.getMessage().setPayload(source); return true; } catch (RuntimeException rte) { throw rte; } catch (Exception ex) { throw new WebServiceException(ex); } }
public boolean appendHandlerName(MessageContext msgContext, String direction) { try { // Get the payload as Source LogicalMessageContext logicalContext = (LogicalMessageContext)msgContext; Source source = logicalContext.getMessage().getPayload(); TransformerFactory tf = TransformerFactory.newInstance(); ByteArrayOutputStream baos = new ByteArrayOutputStream(1024); tf.newTransformer().transform(source, new StreamResult(baos)); // Parse the payload and extract the value Element root = DOMUtils.parse(new ByteArrayInputStream(baos.toByteArray()), getDocumentBuilder()); String oldValue = DOMUtils.getTextContent(root); String newValue = oldValue + ":" + direction + ":LogicalSourceHandler"; root.setTextContent(newValue); log.debug("oldValue: " + oldValue); log.debug("newValue: " + newValue); // Set the updated payload source = new DOMSource(root); logicalContext.getMessage().setPayload(source); return true; } catch (RuntimeException rte) { throw rte; } catch (Exception ex) { throw new WebServiceException(ex); } }
public boolean appendHandlerName(MessageContext msgContext, String direction) { try { // Get the payload as Source LogicalMessageContext logicalContext = (LogicalMessageContext)msgContext; Source source = logicalContext.getMessage().getPayload(); TransformerFactory tf = TransformerFactory.newInstance(); ByteArrayOutputStream baos = new ByteArrayOutputStream(1024); tf.newTransformer().transform(source, new StreamResult(baos)); // Parse the payload and extract the value Element root = DOMUtils.parse(new ByteArrayInputStream(baos.toByteArray()), getDocumentBuilder()); String oldValue = DOMUtils.getTextContent(root); String newValue = oldValue + ":" + direction + "LogicalHandler"; root.setTextContent(newValue); log.debug("oldValue: " + oldValue); log.debug("newValue: " + newValue); // Set the updated payload source = new DOMSource(root); logicalContext.getMessage().setPayload(source); return true; } catch (RuntimeException rte) { throw rte; } catch (Exception ex) { throw new WebServiceException(ex); } }
@Override public boolean invokeLogicalHandlersHandleFault(boolean requestor, LogicalMessageContext context) { if (context.containsKey(KEY)) { return true; } return super.invokeLogicalHandlersHandleFault(requestor, context); }
private void storePayload(LogicalMessageContext context) { Boolean outboundProperty = (Boolean) context .get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); if (outboundProperty) { return; } LogicalMessage logicalMessage = context.getMessage(); Source payloadSource = logicalMessage.getPayload(); this.payload = toString(payloadSource); }
@Override public boolean handleMessage(LogicalMessageContext messageContext) { boolean outbound = (Boolean) messageContext .get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); LogicalMessage message = messageContext.getMessage(); if (outbound) { Source payload = message.getPayload(); Result result = new RequestTransformer().transform(payload); if (!(result instanceof StreamResult)) { LOGGER.error( "Expected javax.xml.transform.stream.StreamSource but got {}.", result.getClass().getName()); throw new WebServiceException( "Expected javax.xml.transform.stream.StreamSource but got " + result.getClass().getName()); } String xml = ((StreamResult) result).getWriter().toString(); try { message.setPayload(new StreamSource(new ByteArrayInputStream( xml.getBytes("UTF-8")))); } catch (UnsupportedEncodingException e) { LOGGER.error( "How the heck did this happen? UTF-8 is available in all JVMs", e); throw new WebServiceException( "How the heck did this happen? UTF-8 is available in all JVMs", e); } } return true; }
@Override public boolean handleMessage(LogicalMessageContext context) { Boolean outbound = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); if (!outbound) { this.inboundAttachments = (Map<String, DataHandler>) context .get(MessageContext.INBOUND_MESSAGE_ATTACHMENTS); LOGGER.debug("inbound attachments: {}", this.inboundAttachments.keySet()); } return true; }
/** * Test the javax.xml.transform.Source based APIs on the LogicalMessage interface. * @throws Exception */ public void testGetPayloadAsSource() throws Exception { LogicalMessageContext lmc = createSampleContext(); LogicalMessage msg = lmc.getMessage(); assertTrue("The returned LogicalMessage was null", msg != null); Source payload = msg.getPayload(); assertTrue("The returned payload (Source) was null", payload != null); String resultContent = _getStringFromSource(payload); assertTrue("The content returned was null", resultContent != null); assertTrue("The content returned was incomplete, unexpected element", resultContent.indexOf("echoString") > -1); assertTrue("The content returned was incomplete, unexpected content", resultContent.indexOf(INPUT) > -1); }
/** * Tests the setting of the payload and make sure we don't cache improperly. * @throws Exception */ public void testGetAndSetPayloadAsSource() throws Exception { LogicalMessageContext lmc = createSampleContext(); LogicalMessage msg = lmc.getMessage(); assertTrue("The returned LogicalMessage was null", msg != null); Source payload = msg.getPayload(); assertTrue("The returned payload (Source) was null", payload != null); String resultContent = _getStringFromSource(payload); assertTrue("The content returned was null", resultContent != null); assertTrue("The content returned was incorrect", resultContent.indexOf(INPUT) > 0); // Now manipluate the content and set it back on the message. int start = resultContent.indexOf(INPUT); int end = start + INPUT.length(); String newInput = "new content goes here"; String newContent = resultContent.substring(0, start) + newInput + resultContent.substring(end); ByteArrayInputStream bais = new ByteArrayInputStream(newContent.getBytes()); StreamSource newPayload = new StreamSource(bais); msg.setPayload(newPayload); // Check the payload to make sure the new content that we added // was insterted correctly. Source payload2 = msg.getPayload(); assertTrue("The returned payload (Source) was null", payload2 != null); String resultContent2 = _getStringFromSource(payload2); assertTrue("The updated content returned was null", resultContent2 != null); assertTrue("The updated content returned was incorrect, old content found", resultContent2.indexOf(INPUT) < 0); assertTrue("The updated content returned was incorrect, new content not found", resultContent2.indexOf(newInput) > -1); }
/** * Tests the setting of the payload when the original content is a fault. * @throws Exception */ public void testGetAndSetFaultPayloadAsSource() throws Exception { LogicalMessageContext lmc = createSampleFaultContext(); LogicalMessage msg = lmc.getMessage(); assertTrue("The returned LogicalMessage was null", msg != null); Source payload = msg.getPayload(); assertTrue("The returned payload (Source) was null", payload != null); String resultContent = _getStringFromSource(payload); assertTrue("The content returned was null", resultContent != null); assertTrue("The content returned was incorrect", resultContent.indexOf(FAULT_INPUT) > 0); assertTrue("The content returned was incorrect, no fault found", resultContent.indexOf("Fault") > 0); // Now manipluate the content and set it back on the message. int start = resultContent.indexOf(FAULT_INPUT); int end = start + FAULT_INPUT.length(); String newFaultInput = "new fault content goes here"; String newContent = resultContent.substring(0, start) + newFaultInput + resultContent.substring(end); ByteArrayInputStream bais = new ByteArrayInputStream(newContent.getBytes()); StreamSource newPayload = new StreamSource(bais); msg.setPayload(newPayload); // Check the payload to make sure the new content that we added // was insterted correctly. Source payload2 = msg.getPayload(); assertTrue("The returned payload (Source) was null", payload2 != null); String resultContent2 = _getStringFromSource(payload2); assertTrue("The updated content returned was null", resultContent2 != null); assertTrue("The updated content returned was incorrect, old content found", resultContent2.indexOf(FAULT_INPUT) < 0); assertTrue("The updated content returned was incorrect, no fault found", resultContent.indexOf("Fault") > 0); assertTrue("The updated content returned was incorrect, new content not found", resultContent2.indexOf(newFaultInput) > -1); }
private LogicalMessageContext createSampleContext() throws Exception { MessageFactory factory = (MessageFactory) FactoryRegistry.getFactory(MessageFactory.class); Message msg = factory.create(Protocol.soap11); // Create a jaxb object ObjectFactory objFactory = new ObjectFactory(); EchoString echo = objFactory.createEchoString(); echo.setInput(INPUT); // Create the necessary JAXBContext JAXBContext jbc = JAXBContext.newInstance("test"); JAXBBlockContext blockCtx = new JAXBBlockContext(jbc); // Create the Block JAXBBlockFactory blockFactory = (JAXBBlockFactory) FactoryRegistry.getFactory(JAXBBlockFactory.class); Block block = blockFactory.createFrom(echo, blockCtx, null); msg.setBodyBlock(block); MessageContext mc = new MessageContext(); mc.setMEPContext(new MEPContext(mc)); mc.setMessage(msg); LogicalMessageContext lmc = MessageContextFactory.createLogicalMessageContext(mc); return lmc; }
@Override public boolean handleOutbound(LogicalMessageContext msgContext) { return appendHandlerName(msgContext, "Outbound"); }
@Override public boolean handleInbound(LogicalMessageContext msgContext) { return appendHandlerName(msgContext, "Inbound"); }
@Override public boolean invokeLogicalHandlers(boolean requestor, LogicalMessageContext context) { checkAuthorization(context); return super.invokeLogicalHandlers(requestor, context); }
@Override public boolean handleMessage(LogicalMessageContext messageContext) { LogicalMessage msg = messageContext.getMessage(); return true; }
@Override public boolean handleFault(LogicalMessageContext messageContext) { return true; }
@Override public boolean handleMessage(LogicalMessageContext context) { storePayload(context); return true; }
@Override public boolean handleFault(LogicalMessageContext context) { storePayload(context); return true; }
@Override public boolean handleFault(LogicalMessageContext msgCtx) { boolean outbound = Boolean.TRUE.equals(msgCtx .get(MessageContext.MESSAGE_OUTBOUND_PROPERTY)); if (outbound) { LogicalMessage msg = msgCtx.getMessage(); DOMResult dom = new DOMResult(); try { Source payload = msg.getPayload(); Node node = null; // If payload is not a DomSource, need to transform if (!(payload instanceof DOMSource)) { Transformer tf = TransformerFactory.newInstance() .newTransformer(); tf.transform(payload, dom); node = dom.getNode(); } else { node = ((DOMSource) payload).getNode(); } Node fault = node.getFirstChild(); Node faultCode = fault.getFirstChild(); Node faultString = faultCode.getNextSibling(); Node detail = faultString.getNextSibling(); // Remove the detail stacktrace, client doesn't need to see it if (detail != null) { fault.removeChild(detail); } // If payload is not a DomSource, need to set back if (!(payload instanceof DOMSource)) { LOGGER.debug("Alas, payload is not a DomSource, it is {}.", payload.getClass().getName()); payload = new DOMSource(fault); msg.setPayload(payload); } } catch (Exception e) { LOGGER.error(e.getMessage(), e); return false; } } return true; }
@Override public boolean handleFault(LogicalMessageContext context) { return true; }
@Override public boolean handleMessage(LogicalMessageContext msgCtx) { return true; }
public boolean handleMessage(LogicalMessageContext smc) { doLog(smc); return true; }
public boolean handleFault(LogicalMessageContext smc) { doLog(smc); return true; }