/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
* Copyright (c) 2013, MPL CodeInside http://codeinside.ru
*/
package ru.codeinside.gws.p.adapter;
import ru.codeinside.gws.api.ServerLog;
import ru.codeinside.gws.api.ServerRequest;
import ru.codeinside.gws.api.ServerResponse;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.xml.soap.SOAPMessage;
import javax.xml.ws.BindingType;
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 javax.xml.ws.handler.MessageContext;
import javax.xml.ws.soap.SOAPBinding;
@ServiceMode(Service.Mode.MESSAGE)
@WebServiceProvider
@BindingType(value = SOAPBinding.SOAP11HTTP_MTOM_BINDING)
public class Adapter implements Provider<SOAPMessage> {
final ProviderEntry entry;
@Resource
WebServiceContext context;
public Adapter(ProviderEntry entry) {
this.entry = entry;
}
//TODO если есть уже подготовленное сообщение, жить надо не так
@Override
public SOAPMessage invoke(final SOAPMessage request) {
final ServerLog serverLog = getServerLog();
final ServerRequest serverRequest = entry.protocol.processRequest(request, entry.wsService, entry.wsPortDef);
if (serverLog != null) {
serverLog.logRequest(serverRequest);
}
final ServerResponse serverResponse;
try {
serverResponse = entry.declarant.processRequest(serverRequest, entry.name);
} catch (RuntimeException e) {
if (serverLog != null) {
serverLog.log(e);
}
throw e;
}
return entry.protocol.processResponse(serverRequest, serverResponse, entry.wsService, entry.wsPortDef, serverLog);
}
private ServerLog getServerLog() {
final HttpServletRequest httpServletRequest = (HttpServletRequest) context
.getMessageContext()
.get(MessageContext.SERVLET_REQUEST);
return (ServerLog) httpServletRequest.getAttribute(ServerLog.class.getName());
}
}