/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.cxf.jaxws.logging; import java.net.MalformedURLException; import java.nio.charset.StandardCharsets; import java.util.Collections; import java.util.List; import javax.jws.WebService; import javax.xml.namespace.QName; import javax.xml.ws.Endpoint; import org.apache.cxf.binding.Binding; import org.apache.cxf.binding.soap.SoapBinding; import org.apache.cxf.ext.logging.LoggingFeature; import org.apache.cxf.ext.logging.event.DefaultLogEventMapper; import org.apache.cxf.ext.logging.event.EventType; import org.apache.cxf.ext.logging.event.LogEvent; import org.apache.cxf.feature.Feature; import org.apache.cxf.jaxws.AbstractJaxWsTest; import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; import org.apache.cxf.message.ExchangeImpl; import org.apache.cxf.message.Message; import org.apache.cxf.message.MessageImpl; import org.apache.cxf.service.model.BindingInfo; import org.apache.cxf.service.model.BindingOperationInfo; import org.apache.cxf.service.model.OperationInfo; import org.apache.cxf.service.model.ServiceInfo; import org.junit.Assert; import org.junit.Test; public class SOAPLoggingTest extends AbstractJaxWsTest { private static final String SERVICE_URI = "http://localhost:5678/test"; @WebService(endpointInterface = "org.apache.cxf.jaxws.logging.TestService") public final class TestServiceImplementation implements TestService { @Override public String echo(String msg) { return msg; } } @Test public void testSoap() { DefaultLogEventMapper mapper = new DefaultLogEventMapper(); Message message = new MessageImpl(); ExchangeImpl exchange = new ExchangeImpl(); ServiceInfo service = new ServiceInfo(); BindingInfo info = new BindingInfo(service, "bindingId"); SoapBinding value = new SoapBinding(info); exchange.put(Binding.class, value); OperationInfo opInfo = new OperationInfo(); opInfo.setName(new QName("http://my", "Operation")); BindingOperationInfo boi = new BindingOperationInfo(info, opInfo); exchange.put(BindingOperationInfo.class, boi); message.setExchange(exchange); LogEvent event = mapper.map(message); Assert.assertEquals("{http://my}Operation", event.getOperationName()); } @Test public void testSlf4j() throws MalformedURLException { TestService serviceImpl = new TestServiceImplementation(); LoggingFeature loggingFeature = new LoggingFeature(); loggingFeature.setPrettyLogging(true); // Setting the limit should omit parts of the body but the result should still be well formed xml loggingFeature.setLimit(140); Endpoint ep = Endpoint.publish(SERVICE_URI, serviceImpl, loggingFeature); TestService client = createTestClient(loggingFeature); client.echo("test"); ep.stop(); } @Test public void testEvents() throws MalformedURLException { TestService serviceImpl = new TestServiceImplementation(); LoggingFeature loggingFeature = new LoggingFeature(); TestEventSender sender = new TestEventSender(); loggingFeature.setSender(sender); Endpoint ep = Endpoint.publish(SERVICE_URI, serviceImpl, loggingFeature); TestService client = createTestClient(loggingFeature); client.echo("test"); ep.stop(); List<LogEvent> events = sender.getEvents(); Assert.assertEquals(4, events.size()); checkRequestOut(events.get(0)); checkRequestIn(events.get(1)); checkResponseOut(events.get(2)); checkResponseIn(events.get(3)); } private void checkRequestOut(LogEvent requestOut) { Assert.assertEquals(SERVICE_URI, requestOut.getAddress()); Assert.assertEquals("text/xml", requestOut.getContentType()); Assert.assertEquals(EventType.REQ_OUT, requestOut.getType()); Assert.assertEquals(StandardCharsets.UTF_8.name(), requestOut.getEncoding()); Assert.assertNotNull(requestOut.getExchangeId()); Assert.assertNotNull(requestOut.getMessageId()); Assert.assertTrue(requestOut.getPayload().contains("<arg0>test</arg0>")); Assert.assertEquals("TestServicePort", requestOut.getPortName().getLocalPart()); Assert.assertEquals("TestService", requestOut.getPortTypeName().getLocalPart()); Assert.assertEquals("TestServiceService", requestOut.getServiceName().getLocalPart()); } private void checkRequestIn(LogEvent requestIn) { Assert.assertEquals(SERVICE_URI, requestIn.getAddress()); Assert.assertTrue(requestIn.getContentType(), requestIn.getContentType().contains("text/xml")); Assert.assertEquals(EventType.REQ_IN, requestIn.getType()); Assert.assertEquals(StandardCharsets.UTF_8.name(), requestIn.getEncoding()); Assert.assertNotNull(requestIn.getExchangeId()); Assert.assertNotNull(requestIn.getMessageId()); Assert.assertTrue(requestIn.getPayload().contains("<arg0>test</arg0>")); Assert.assertEquals("TestServiceImplementationPort", requestIn.getPortName().getLocalPart()); Assert.assertEquals("TestService", requestIn.getPortTypeName().getLocalPart()); Assert.assertEquals("TestServiceImplementationService", requestIn.getServiceName().getLocalPart()); } private void checkResponseOut(LogEvent responseOut) { // Not yet available Assert.assertNull(responseOut.getAddress()); Assert.assertEquals("text/xml", responseOut.getContentType()); Assert.assertEquals(EventType.RESP_OUT, responseOut.getType()); Assert.assertEquals(StandardCharsets.UTF_8.name(), responseOut.getEncoding()); Assert.assertNotNull(responseOut.getExchangeId()); // Not yet available Assert.assertNull(responseOut.getHttpMethod()); Assert.assertNotNull(responseOut.getMessageId()); Assert.assertTrue(responseOut.getPayload().contains("<return>test</return>")); Assert.assertEquals("TestServiceImplementationPort", responseOut.getPortName().getLocalPart()); Assert.assertEquals("TestService", responseOut.getPortTypeName().getLocalPart()); Assert.assertEquals("TestServiceImplementationService", responseOut.getServiceName().getLocalPart()); } private void checkResponseIn(LogEvent responseIn) { Assert.assertNull(responseIn.getAddress()); Assert.assertTrue(responseIn.getContentType(), responseIn.getContentType().contains("text/xml")); Assert.assertEquals(EventType.RESP_IN, responseIn.getType()); Assert.assertEquals(StandardCharsets.UTF_8.name(), responseIn.getEncoding()); Assert.assertNotNull(responseIn.getExchangeId()); // Not yet available Assert.assertNull(responseIn.getHttpMethod()); Assert.assertNotNull(responseIn.getMessageId()); Assert.assertTrue(responseIn.getPayload().contains("<return>test</return>")); Assert.assertEquals("TestServicePort", responseIn.getPortName().getLocalPart()); Assert.assertEquals("TestService", responseIn.getPortTypeName().getLocalPart()); Assert.assertEquals("TestServiceService", responseIn.getServiceName().getLocalPart()); } private TestService createTestClient(Feature feature) throws MalformedURLException { JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); factory.setAddress(SERVICE_URI); factory.setFeatures(Collections.singletonList(feature)); return factory.create(TestService.class); } }