package ru.codeinside.gses.webui.form;
import org.osgi.framework.ServiceReference;
import ru.codeinside.gses.service.Fn;
import ru.codeinside.gses.webui.Flash;
import ru.codeinside.gses.webui.osgi.Activator;
import ru.codeinside.gses.webui.wizard.ResultTransition;
import ru.codeinside.gses.webui.wizard.TransitionAction;
import ru.codeinside.gws.api.Client;
import ru.codeinside.gws.api.ClientProtocol;
import ru.codeinside.gws.api.ClientRequest;
import ru.codeinside.gws.api.Enclosure;
import javax.xml.soap.SOAPMessage;
import java.io.ByteArrayOutputStream;
import java.util.Collections;
/**
* Действие для получения SOAP-сообещения
*/
public class CreateSoapMessageAction implements TransitionAction {
private final DataAccumulator dataAccumulator;
public CreateSoapMessageAction(DataAccumulator dataAccumulator) {
this.dataAccumulator = dataAccumulator;
}
@Override
public ResultTransition doIt() throws IllegalStateException {
ServiceReference reference = ProtocolUtils.getServiceReference(dataAccumulator.getServiceName(), Client.class);
if (reference == null) {
throw new IllegalStateException("Не удалось получить ссылку на сервис " + dataAccumulator.getServiceName());
}
final Client client = ProtocolUtils.getService(reference, Client.class);
if (client == null) {
throw new IllegalStateException("Клиент " + dataAccumulator.getServiceName() + " недоступен");
}
try {
//если отсутствовал шаг подписания AppData, дёргаем потребителя и получаем request
if (dataAccumulator.getClientRequest() == null) {
clientRequest(client);
}
validateState();
ClientProtocol clientProtocol = ProtocolUtils.getClientProtocol(client);
ByteArrayOutputStream normalizedSignedInfo = new ByteArrayOutputStream();
SOAPMessage message = clientProtocol.createMessage(client.getWsdlUrl(),
dataAccumulator.getClientRequest(), null, normalizedSignedInfo);
dataAccumulator.setSoapMessage(message);
return new ResultTransition(new SignData(normalizedSignedInfo.toByteArray(), Collections.<Enclosure>emptyList()));
} catch (RuntimeException e) {
e.printStackTrace();
throw new IllegalStateException("Ошибка получения подготовительных данных: " + e.getMessage(), e);
} finally {
Activator.getContext().ungetService(reference);
}
}
private void clientRequest(Client client) {
ClientRequest request = Fn.withEngine(new GetAppDataAction.GetClientRequest(), Flash.login(), dataAccumulator, client);
dataAccumulator.setClientRequest(request);
}
private void validateState() {
if (dataAccumulator.getClientRequest() == null) {
throw new IllegalStateException("Отсутствуют данные клиента.");
}
}
}