package org.jentrata.ebms.as4.internal.routes; import org.apache.camel.EndpointInject; import org.apache.camel.Exchange; import org.apache.camel.LoggingLevel; import org.apache.camel.Message; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; import org.apache.camel.impl.DefaultExchange; import org.apache.camel.impl.JndiRegistry; import org.apache.camel.test.junit4.CamelTestSupport; import org.apache.commons.io.IOUtils; import org.hamcrest.Matchers; import org.jentrata.ebms.EbmsConstants; import org.jentrata.ebms.cpa.PartnerAgreement; import org.jentrata.ebms.cpa.pmode.BusinessInfo; import org.jentrata.ebms.cpa.pmode.Party; import org.jentrata.ebms.messaging.UUIDGenerator; import org.jentrata.ebms.utils.EbmsUtils; import org.junit.Test; import org.w3c.dom.Document; import javax.xml.soap.AttachmentPart; import javax.xml.soap.MessageFactory; import javax.xml.soap.MimeHeaders; import javax.xml.soap.SOAPConstants; import javax.xml.soap.SOAPHeader; import javax.xml.soap.SOAPMessage; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.util.Iterator; import static org.hamcrest.CoreMatchers.endsWith; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.Matchers.hasXPath; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.not; /** * Unit test for EbmsOutboundMessageRouteBuilder * * @author aaronwalker */ @SuppressWarnings("unchecked") public class EbmsOutboundMessageRouteBuilderTest extends CamelTestSupport { @EndpointInject(uri = "mock:mockEbmsOutbound") protected MockEndpoint mockEbmsOutbound; @EndpointInject(uri = "mock:mockMessageStore") protected MockEndpoint mockMessageStore; @EndpointInject(uri = "mock:mockUpdateMessageStore") protected MockEndpoint mockUpdateMessageStore; @EndpointInject(uri = "mock:mockWSSEAddSecurityToHeader") protected MockEndpoint mockWSSEAddSecurityToHeader; @EndpointInject(uri = "mock:mockErrorQueue") protected MockEndpoint mockErrorQueue; @Test public void testWrapPayloadAsMimeMessage() throws Exception { mockEbmsOutbound.setExpectedMessageCount(1); mockMessageStore.setExpectedMessageCount(1); mockUpdateMessageStore.setExpectedMessageCount(1); mockWSSEAddSecurityToHeader.setExpectedMessageCount(1); mockErrorQueue.setExpectedMessageCount(0); Exchange request = new DefaultExchange(context()); request.getIn().setHeader(EbmsConstants.MESSAGE_FROM,"123456789"); request.getIn().setHeader(EbmsConstants.MESSAGE_TO,"987654321"); request.getIn().setHeader(EbmsConstants.CONTENT_TYPE,"text/xml"); request.getIn().setHeader(EbmsConstants.CPA_ID,"testCPAId"); request.getIn().setHeader(EbmsConstants.PAYLOAD_ID,"testpayload@jentrata.org"); request.getIn().setHeader(EbmsConstants.MESSAGE_CONVERSATION_ID,"MESSAGE_CONVERSATION_ID"); request.getIn().setHeader(EbmsConstants.MESSAGE_PAYLOAD_SCHEMA,"http://jentrata.org/schema/example"); request.getIn().setHeader(EbmsConstants.MESSAGE_AGREEMENT_REF,"http://jentrata.org/agreement"); request.getIn().setHeader(EbmsConstants.MESSAGE_PART_PROPERTIES,"PartID=testpayload@jentrata.org;SourceABN=123456789;test="); request.getIn().setHeader(EbmsConstants.MESSAGE_DIRECTION,EbmsConstants.MESSAGE_DIRECTION_OUTBOUND); request.getIn().setBody(new FileInputStream(fileFromClasspath("sample-payload.xml"))); Exchange response = context().createProducerTemplate().send("direct:testDeliveryQueue",request); assertMockEndpointsSatisfied(); Message msg = mockEbmsOutbound.getExchanges().get(0).getIn(); System.out.println(msg.getBody(String.class)); MimeHeaders mimeHeaders = new MimeHeaders(); MessageFactory messageFactory = MessageFactory.newInstance( SOAPConstants.SOAP_1_2_PROTOCOL); mimeHeaders.addHeader(Exchange.CONTENT_TYPE, msg.getHeader(Exchange.CONTENT_TYPE, String.class)); SOAPMessage message = messageFactory.createMessage(mimeHeaders, msg.getBody(InputStream.class)); SOAPHeader soapHeader = message.getSOAPPart().getEnvelope().getHeader(); assertThat(soapHeader.getOwnerDocument(),hasXPath("//*[local-name()='Timestamp']")); assertThat(soapHeader.getOwnerDocument(),hasXPath("//*[local-name()='MessageId']")); assertThat(soapHeader.getOwnerDocument(),hasXPath("//*[local-name()='PartyId' and text()='123456789']")); assertThat(soapHeader.getOwnerDocument(),hasXPath("//*[local-name()='PartyId' and text()='987654321']")); assertThat(soapHeader.getOwnerDocument(),hasXPath("//*[local-name()='AgreementRef' and text()='http://jentrata.org/agreement']")); assertThat(soapHeader.getOwnerDocument(),hasXPath("//*[local-name()='Schema' and @*[local-name()='location']='http://jentrata.org/schema/example']")); assertThat(soapHeader.getOwnerDocument(),hasXPath("//@name[.='MimeType' and ../text()='text/xml']")); assertThat(soapHeader.getOwnerDocument(),hasXPath("//@name[.='CharacterSet' and ../text()='UTF-8']")); assertThat(soapHeader.getOwnerDocument(),hasXPath("//@name[.='PartID' and ../text()='testpayload@jentrata.org']")); assertThat(soapHeader.getOwnerDocument(),hasXPath("//@name[.='SourceABN' and ../text()='123456789']")); assertThat(soapHeader.getOwnerDocument(),not(hasXPath("//@name[.='test']"))); assertThat(message.countAttachments(), equalTo(1)); AttachmentPart part = (AttachmentPart) message.getAttachments().next(); assertThat(part.getContentId(),equalTo("<testpayload@jentrata.org>")); assertThat(part.getContentType(),equalTo("text/xml")); assertThat(part.getMimeHeader(EbmsConstants.CONTENT_TRANSFER_ENCODING)[0],equalTo("binary")); assertThat(part.getMimeHeader(EbmsConstants.CONTENT_DISPOSITION)[0].matches("attachment;\\sfilename=(.*)\\.xml"),is(true)); } @Test public void testWrapPayloadAsMimeMessageWithCustomMimeHeaders() throws Exception { mockEbmsOutbound.setExpectedMessageCount(1); mockMessageStore.setExpectedMessageCount(1); mockUpdateMessageStore.setExpectedMessageCount(1); mockWSSEAddSecurityToHeader.setExpectedMessageCount(1); mockErrorQueue.setExpectedMessageCount(0); Exchange request = new DefaultExchange(context()); request.getIn().setHeader(EbmsConstants.MESSAGE_FROM,"123456789"); request.getIn().setHeader(EbmsConstants.MESSAGE_TO,"987654321"); request.getIn().setHeader(EbmsConstants.CONTENT_TYPE,"text/xml"); request.getIn().setHeader(EbmsConstants.CPA_ID,"testCPAId"); request.getIn().setHeader(EbmsConstants.PAYLOAD_ID,"testpayload@jentrata.org"); request.getIn().setHeader(EbmsConstants.MESSAGE_CONVERSATION_ID,"MESSAGE_CONVERSATION_ID"); request.getIn().setHeader(EbmsConstants.MESSAGE_PAYLOAD_SCHEMA,"http://jentrata.org/schema/example"); request.getIn().setHeader(EbmsConstants.MESSAGE_AGREEMENT_REF,"http://jentrata.org/agreement"); request.getIn().setHeader(EbmsConstants.PAYLOAD_FILENAME,"test.xml"); request.getIn().setHeader(EbmsConstants.CONTENT_TRANSFER_ENCODING,"base64"); request.getIn().setHeader(EbmsConstants.MESSAGE_PART_PROPERTIES,"PartID=testpayload@jentrata.org;SourceABN=123456789;test="); request.getIn().setHeader(EbmsConstants.MESSAGE_DIRECTION,EbmsConstants.MESSAGE_DIRECTION_OUTBOUND); request.getIn().setBody(new FileInputStream(fileFromClasspath("sample-payload.xml"))); Exchange response = context().createProducerTemplate().send("direct:testDeliveryQueue",request); assertMockEndpointsSatisfied(); Message msg = mockEbmsOutbound.getExchanges().get(0).getIn(); System.out.println(msg.getBody(String.class)); MimeHeaders mimeHeaders = new MimeHeaders(); MessageFactory messageFactory = MessageFactory.newInstance( SOAPConstants.SOAP_1_2_PROTOCOL); mimeHeaders.addHeader(Exchange.CONTENT_TYPE, msg.getHeader(Exchange.CONTENT_TYPE, String.class)); SOAPMessage message = messageFactory.createMessage(mimeHeaders, msg.getBody(InputStream.class)); SOAPHeader soapHeader = message.getSOAPPart().getEnvelope().getHeader(); assertThat(soapHeader.getOwnerDocument(),hasXPath("//*[local-name()='Timestamp']")); assertThat(soapHeader.getOwnerDocument(),hasXPath("//*[local-name()='MessageId']")); assertThat(soapHeader.getOwnerDocument(),hasXPath("//*[local-name()='PartyId' and text()='123456789']")); assertThat(soapHeader.getOwnerDocument(),hasXPath("//*[local-name()='PartyId' and text()='987654321']")); assertThat(soapHeader.getOwnerDocument(),hasXPath("//*[local-name()='AgreementRef' and text()='http://jentrata.org/agreement']")); assertThat(soapHeader.getOwnerDocument(),hasXPath("//*[local-name()='Schema' and @*[local-name()='location']='http://jentrata.org/schema/example']")); assertThat(soapHeader.getOwnerDocument(),hasXPath("//@name[.='MimeType' and ../text()='text/xml']")); assertThat(soapHeader.getOwnerDocument(),hasXPath("//@name[.='CharacterSet' and ../text()='UTF-8']")); assertThat(soapHeader.getOwnerDocument(),hasXPath("//@name[.='PartID' and ../text()='testpayload@jentrata.org']")); assertThat(soapHeader.getOwnerDocument(),hasXPath("//@name[.='SourceABN' and ../text()='123456789']")); assertThat(soapHeader.getOwnerDocument(),not(hasXPath("//@name[.='test']"))); assertThat(message.countAttachments(), equalTo(1)); AttachmentPart part = (AttachmentPart) message.getAttachments().next(); assertThat(part.getContentId(),equalTo("<testpayload@jentrata.org>")); assertThat(part.getContentType(),equalTo("text/xml")); assertThat(part.getMimeHeader(EbmsConstants.CONTENT_TRANSFER_ENCODING)[0],equalTo("base64")); assertThat(part.getMimeHeader(EbmsConstants.CONTENT_DISPOSITION)[0],equalTo("attachment; filename=test.xml")); } @Test public void testPayloadCompressionUsingOverrideHeader() throws Exception { mockEbmsOutbound.setExpectedMessageCount(1); mockMessageStore.setExpectedMessageCount(1); mockUpdateMessageStore.setExpectedMessageCount(1); mockWSSEAddSecurityToHeader.setExpectedMessageCount(1); mockErrorQueue.setExpectedMessageCount(0); Exchange request = new DefaultExchange(context()); request.getIn().setHeader(EbmsConstants.MESSAGE_FROM,"123456789"); request.getIn().setHeader(EbmsConstants.MESSAGE_TO,"987654321"); request.getIn().setHeader(EbmsConstants.CONTENT_TYPE,"text/xml"); request.getIn().setHeader(EbmsConstants.CPA_ID,"testCPAId"); request.getIn().setHeader(EbmsConstants.PAYLOAD_ID,"testpayload@jentrata.org"); request.getIn().setHeader(EbmsConstants.MESSAGE_CONVERSATION_ID,"MESSAGE_CONVERSATION_ID"); request.getIn().setHeader(EbmsConstants.MESSAGE_PAYLOAD_SCHEMA,"http://jentrata.org/schema/example"); request.getIn().setHeader(EbmsConstants.MESSAGE_AGREEMENT_REF,"http://jentrata.org/agreement"); request.getIn().setHeader(EbmsConstants.MESSAGE_PART_PROPERTIES,"PartID=testpayload@jentrata.org;SourceABN=123456789"); request.getIn().setHeader(EbmsConstants.MESSAGE_DIRECTION,EbmsConstants.MESSAGE_DIRECTION_OUTBOUND); request.getIn().setHeader(EbmsConstants.PAYLOAD_COMPRESSION,EbmsConstants.GZIP); byte [] expectedPayload = IOUtils.toByteArray(new FileInputStream(fileFromClasspath("sample-payload.xml"))); request.getIn().setBody(expectedPayload); Exchange response = context().createProducerTemplate().send("direct:testDeliveryQueue",request); assertMockEndpointsSatisfied(); SOAPMessage soapMessage = EbmsUtils.parse(mockEbmsOutbound.getExchanges().get(0)); SOAPHeader soapHeader = soapMessage.getSOAPPart().getEnvelope().getHeader(); System.out.println(EbmsUtils.toString(soapMessage)); assertThat(soapHeader.getOwnerDocument(),hasXPath("//*[local-name()='Timestamp']")); assertThat(soapHeader.getOwnerDocument(), hasXPath("//*[local-name()='MessageId']")); assertThat(soapHeader.getOwnerDocument(),hasXPath("//*[local-name()='PartyId' and text()='123456789']")); assertThat(soapHeader.getOwnerDocument(),hasXPath("//*[local-name()='PartyId' and text()='987654321']")); assertThat(soapHeader.getOwnerDocument(),hasXPath("//*[local-name()='AgreementRef' and text()='http://jentrata.org/agreement']")); assertThat(soapHeader.getOwnerDocument(),hasXPath("//*[local-name()='Schema' and @*[local-name()='location']='http://jentrata.org/schema/example']")); assertThat(soapHeader.getOwnerDocument(),hasXPath("//@name[.='MimeType' and ../text()='text/xml']")); assertThat(soapHeader.getOwnerDocument(),hasXPath("//@name[.='CharacterSet' and ../text()='UTF-8']")); assertThat(soapHeader.getOwnerDocument(),hasXPath("//@name[.='PartID' and ../text()='testpayload@jentrata.org']")); assertThat(soapHeader.getOwnerDocument(),hasXPath("//@name[.='SourceABN' and ../text()='123456789']")); assertThat(soapHeader.getOwnerDocument(),hasXPath("//@name[.='CompressionType' and ../text()='application/gzip']")); assertThat(soapMessage.countAttachments(),equalTo(1)); Iterator<AttachmentPart> attachments = soapMessage.getAttachments(); while (attachments.hasNext()) { AttachmentPart part = attachments.next(); assertThat(part.getContentId(),equalTo("<testpayload@jentrata.org>")); assertThat(part.getContentType(),equalTo(EbmsConstants.GZIP)); byte [] payload = EbmsUtils.decompress(EbmsConstants.GZIP,part.getRawContentBytes()); System.out.println(new String(payload)); assertThat(payload,equalTo(expectedPayload)); } } @Test public void testUnknownCPA() throws Exception { mockEbmsOutbound.setExpectedMessageCount(0); mockMessageStore.setExpectedMessageCount(0); mockUpdateMessageStore.setExpectedMessageCount(0); mockWSSEAddSecurityToHeader.setExpectedMessageCount(0); mockErrorQueue.setExpectedMessageCount(1); Exchange request = new DefaultExchange(context()); request.getIn().setHeader(EbmsConstants.MESSAGE_FROM,"123456789"); request.getIn().setHeader(EbmsConstants.MESSAGE_TO,"987654321"); request.getIn().setHeader(EbmsConstants.CONTENT_TYPE,"text/xml"); request.getIn().setHeader(EbmsConstants.CPA_ID,"crappyCPAID"); request.getIn().setHeader(EbmsConstants.PAYLOAD_ID,"testpayload@jentrata.org"); request.getIn().setHeader(EbmsConstants.MESSAGE_CONVERSATION_ID,"MESSAGE_CONVERSATION_ID"); request.getIn().setHeader(EbmsConstants.MESSAGE_PAYLOAD_SCHEMA,"http://jentrata.org/schema/example"); request.getIn().setHeader(EbmsConstants.MESSAGE_AGREEMENT_REF,"http://jentrata.org/agreement"); request.getIn().setHeader(EbmsConstants.MESSAGE_PART_PROPERTIES,"PartID=testpayload@jentrata.org;SourceABN=123456789"); request.getIn().setHeader(EbmsConstants.MESSAGE_DIRECTION,EbmsConstants.MESSAGE_DIRECTION_OUTBOUND); request.getIn().setHeader("test","unknownCPA"); request.getIn().setBody(new FileInputStream(fileFromClasspath("sample-payload.xml"))); Exchange response = context().createProducerTemplate().send("direct:testDeliveryQueue",request); assertMockEndpointsSatisfied(); } @Test public void testOverrideMessageID() throws Exception { mockEbmsOutbound.setExpectedMessageCount(1); mockEbmsOutbound.expectedHeaderReceived(EbmsConstants.MESSAGE_ID, "test-exchange-id@jentrata.org"); mockMessageStore.setExpectedMessageCount(1); mockUpdateMessageStore.setExpectedMessageCount(1); mockWSSEAddSecurityToHeader.setExpectedMessageCount(1); mockErrorQueue.setExpectedMessageCount(0); Exchange request = new DefaultExchange(context()); request.getIn().setHeader(EbmsConstants.MESSAGE_ID,"test-exchange-id@jentrata.org"); request.getIn().setHeader(EbmsConstants.MESSAGE_FROM,"123456789"); request.getIn().setHeader(EbmsConstants.MESSAGE_TO,"987654321"); request.getIn().setHeader(EbmsConstants.CONTENT_TYPE,"text/xml"); request.getIn().setHeader(EbmsConstants.CPA_ID,"testCPAId"); request.getIn().setHeader(EbmsConstants.PAYLOAD_ID,"testpayload@jentrata.org"); request.getIn().setHeader(EbmsConstants.MESSAGE_CONVERSATION_ID,"MESSAGE_CONVERSATION_ID"); request.getIn().setHeader(EbmsConstants.MESSAGE_PAYLOAD_SCHEMA,"http://jentrata.org/schema/example"); request.getIn().setHeader(EbmsConstants.MESSAGE_AGREEMENT_REF,"http://jentrata.org/agreement"); request.getIn().setHeader(EbmsConstants.MESSAGE_PART_PROPERTIES,"PartID=testpayload@jentrata.org;SourceABN=123456789;test="); request.getIn().setHeader(EbmsConstants.MESSAGE_DIRECTION, EbmsConstants.MESSAGE_DIRECTION_OUTBOUND); request.getIn().setBody(new FileInputStream(fileFromClasspath("sample-payload.xml"))); Exchange response = context().createProducerTemplate().send("direct:testDeliveryQueue",request); assertMockEndpointsSatisfied(); Exchange exchange = mockEbmsOutbound.getExchanges().get(0); System.out.println(exchange.getIn().getBody()); SOAPMessage message = EbmsUtils.parse(exchange); Document ebmsMessage = message.getSOAPPart().getEnvelope().getHeader().getOwnerDocument(); assertThat(ebmsMessage, hasXPath("//*[local-name()='MessageId' and text()='test-exchange-id@jentrata.org']")); } @Test public void testShouldUseCPADefaults() throws Exception { mockEbmsOutbound.setExpectedMessageCount(1); mockMessageStore.setExpectedMessageCount(1); mockUpdateMessageStore.setExpectedMessageCount(1); mockWSSEAddSecurityToHeader.setExpectedMessageCount(1); mockErrorQueue.setExpectedMessageCount(0); Exchange request = new DefaultExchange(context()); request.getIn().setHeader(EbmsConstants.CONTENT_TYPE,"text/xml"); request.getIn().setHeader(EbmsConstants.CPA_ID,"testCPAId"); request.getIn().setHeader(EbmsConstants.PAYLOAD_ID,"testpayload@jentrata.org"); request.getIn().setHeader(EbmsConstants.MESSAGE_PAYLOAD_SCHEMA,"http://jentrata.org/schema/example"); request.getIn().setHeader(EbmsConstants.MESSAGE_PART_PROPERTIES,"PartID=testpayload@jentrata.org;SourceABN=123456789;test="); request.getIn().setHeader(EbmsConstants.MESSAGE_DIRECTION, EbmsConstants.MESSAGE_DIRECTION_OUTBOUND); request.getIn().setBody(new FileInputStream(fileFromClasspath("sample-payload.xml"))); Exchange response = context().createProducerTemplate().send("direct:testDeliveryQueue",request); assertMockEndpointsSatisfied(); Exchange exchange = mockEbmsOutbound.getExchanges().get(0); System.out.println(exchange.getIn().getBody(String.class)); SOAPMessage message = EbmsUtils.parse(exchange); Document ebmsMessage = message.getSOAPPart().getEnvelope().getHeader().getOwnerDocument(); assertThat(ebmsMessage, hasXPath("//*[local-name()='PartyId' and text()='jentrata']")); assertThat(ebmsMessage, hasXPath("//@*[name()='type' and .='urn:mypartyidtype']")); assertThat(ebmsMessage, hasXPath("//*[local-name()='Role' and text()='buyer']")); assertThat(ebmsMessage, hasXPath("//*[local-name()='Role' and text()='seller']")); } @Override protected JndiRegistry createRegistry() throws Exception { JndiRegistry registry = super.createRegistry(); registry.bind("uuidGenerator", new UUIDGenerator()); return registry; } @Override protected RouteBuilder [] createRouteBuilders() throws Exception { EbmsOutboundMessageRouteBuilder routeBuilder = new EbmsOutboundMessageRouteBuilder(); routeBuilder.setDeliveryQueue("direct:testDeliveryQueue"); routeBuilder.setOutboundEbmsQueue(mockEbmsOutbound.getEndpointUri()); routeBuilder.setMessgeStoreEndpoint(mockMessageStore.getEndpointUri()); routeBuilder.setMessageInsertEndpoint(mockUpdateMessageStore.getEndpointUri()); routeBuilder.setWsseSecurityAddEndpoint(mockWSSEAddSecurityToHeader.getEndpointUri()); routeBuilder.setErrorQueue(mockErrorQueue.getEndpointUri()); return new RouteBuilder [] { routeBuilder, new RouteBuilder() { @Override public void configure() throws Exception { from("direct:lookupCpaId") .choice() .when(header("test").isEqualTo("unknownCPA")) .setHeader(EbmsConstants.CPA, constant(null)) .setHeader(EbmsConstants.CPA_ID, constant(EbmsConstants.CPA_ID_UNKNOWN)) .otherwise() .setHeader(EbmsConstants.CPA,constant(getAgreement())) .routeId("mockLookupCpaId"); from(EventNotificationRouteBuilder.SEND_NOTIFICATION_ENDPOINT) .log(LoggingLevel.INFO, "mock event notification: ${headers}") .routeId("mockEventNotification"); } } }; } private PartnerAgreement getAgreement() { PartnerAgreement partnerAgreement = new PartnerAgreement(); partnerAgreement.setCpaId("testCPAId"); Party from = new Party(); from.setPartyId("jentrata"); from.setPartyIdType("urn:mypartyidtype"); from.setRole("buyer"); partnerAgreement.setInitiator(from); Party to = new Party(); to.setPartyId("other"); to.setPartyIdType("urn:mypartyidtype"); to.setRole("seller"); partnerAgreement.setResponder(to); partnerAgreement.setBusinessInfo(new BusinessInfo()); return partnerAgreement; } protected static File fileFromClasspath(String filename) { return EbmsUtils.fileFromClasspath(filename); } }