package org.talend.esb.mep.requestcallback.sample.internal; import java.util.concurrent.BlockingQueue; import javax.annotation.Resource; import javax.xml.transform.stream.StreamSource; import javax.xml.ws.Provider; import javax.xml.ws.Service; import javax.xml.ws.ServiceMode; import javax.xml.ws.WebServiceContext; import javax.xml.ws.WebServiceProvider; import org.talend.esb.mep.requestcallback.feature.CallContext; import static org.junit.Assert.*; @WebServiceProvider @ServiceMode(value = Service.Mode.PAYLOAD) public class ServiceProviderHandler implements Provider<StreamSource> { public interface IncomingMessageHandler { void handleMessage(StreamSource request, CallContext callContext) throws Exception; } @Resource private WebServiceContext wsContext; private final BlockingQueue<Throwable> errorTransfer; private final BlockingQueue<String> messageTransfer; private final IncomingMessageHandler businessHandler; private final String expectedOperation; public ServiceProviderHandler(BlockingQueue<Throwable> errorTransfer, BlockingQueue<String> messageTransfer, IncomingMessageHandler businessHandler, String expectedOperation) { this.errorTransfer = errorTransfer; this.messageTransfer = messageTransfer; this.businessHandler = businessHandler; this.expectedOperation = expectedOperation; } @Override public StreamSource invoke(StreamSource request) { try { System.out.println("Service is invoked!!!"); CallContext callContext = CallContext.getCallContext(wsContext); assertEquals(callContext.getOperationName().getLocalPart(), expectedOperation); businessHandler.handleMessage(request, callContext); } catch (Exception e) { addError(e); } catch (AssertionError e) { addError(e); } return null; } public void addError(Throwable error) { errorTransfer.offer(error); messageTransfer.offer("ERROR"); } }