/*
* 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.gses.beans.export;
import ru.codeinside.adm.database.SmevChain;
import ru.codeinside.gses.beans.ActivitiRequestContext;
import ru.codeinside.gses.webui.gws.TRef;
import ru.codeinside.gses.webui.gws.TRefProvider;
import ru.codeinside.gws.api.Declarant;
import ru.codeinside.gws.api.Server;
import ru.codeinside.gws.api.ServerPipeline;
import ru.codeinside.gws.api.ServerRequest;
import ru.codeinside.gws.api.ServerResponse;
import java.util.UUID;
final public class DeclarantImpl implements Declarant {
public ServerResponse processRequest(final ServerRequest serverRequest, final String name) {
final TRef<Server> serverRef = TRefProvider.get().getServerByName(name);
final Server server;
if (serverRef == null) {
server = null;
} else {
server = serverRef.getRef();
}
if (server == null) {
throw new RuntimeException("Provider " + name + " not found");
}
SmevChain smevChain = createSmevChain(serverRequest);
ServerResponse serverResponse;
if (server instanceof ServerPipeline) {
serverResponse = ((ServerPipeline) server).processRequest(serverRequest);
} else {
serverResponse = server.processRequest(new ActivitiRequestContext(smevChain, serverRequest, name));
}
// согласование цепочки
{
serverResponse.packet.originRequestIdRef = smevChain.originRequestIdRef;
// дать возможность поставщику в режиме без СМЭВ сформировать идентификатор запроса в ответе
if (smevChain.hasMessageId || serverResponse.packet.requestIdRef == null) {
serverResponse.packet.requestIdRef = smevChain.requestIdRef;
}
}
return serverResponse;
}
private SmevChain createSmevChain(ServerRequest request) {
boolean hasMessageId = request.routerPacket != null && request.routerPacket.messageId != null;
// Идентификатор локальной цепочки (между sender и recipient).
// Если не указан, то формируем и обновляем в исходном запросе чтобы изменения были доступны поставщику:
// - если есть СМЭВ, копируем из идентификатора роутера;
// - если нет СМЭВ, генерируем.
String originRequestIdRef = request.packet.originRequestIdRef;
boolean originGenerated = false;
if (originRequestIdRef == null) {
if (hasMessageId) {
originRequestIdRef = request.routerPacket.messageId;
} else {
originRequestIdRef = UUID.randomUUID().toString();
originGenerated = true;
}
// изменяем запрос для использования внутри поставщика
request.packet.originRequestIdRef = originRequestIdRef;
}
// Идентификатор текущего запроса.
String requestIdRef;
if (hasMessageId) {
requestIdRef = request.routerPacket.messageId;
} else if (originGenerated) {
requestIdRef = originRequestIdRef; // согласованная генерация в начале цепочки
} else {
requestIdRef = UUID.randomUUID().toString();
}
return new SmevChain(hasMessageId, request.packet.originator, originRequestIdRef, request.packet.sender, requestIdRef, request.packet.recipient);
}
}