package org.talend.esb.mep.requestcallback.sample.internal;
import java.util.Map;
import java.util.concurrent.BlockingQueue;
import javax.annotation.Resource;
import javax.xml.namespace.QName;
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 ClientProviderHandler 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 Map<String, IncomingMessageHandler> callbackMap;
public ClientProviderHandler(BlockingQueue<Throwable> errorTransfer,
BlockingQueue<String> messageTransfer,
Map<String, IncomingMessageHandler> callbackMap) {
this.errorTransfer = errorTransfer;
this.messageTransfer = messageTransfer;
this.callbackMap = callbackMap;
}
@Override
public StreamSource invoke(StreamSource request) {
try {
CallContext context = CallContext.getCallContext(wsContext);
assertNotNull("CallContext missing", context);
QName opName = context.getOperationName();
assertNotNull("Response action missing", opName);
IncomingMessageHandler businessHandler = callbackMap.get(opName.getLocalPart());
if (businessHandler == null) {
throw new RuntimeException("Unknown callback operation: " + context.getOperationName().getLocalPart());
}
businessHandler.handleMessage(request, context);
} catch (Exception e) {
addError(e);
} catch (AssertionError e) {
addError(e);
}
return null;
}
public void addError(Throwable error) {
errorTransfer.offer(error);
messageTransfer.offer("ERROR");
}
}