package server.mcsv1002;
import ru.codeinside.gws.api.*;
import server.mcsv1002.parser.RequestParser;
import server.mcsv1002.request.HouseBookExtractionRequest;
import server.mcsv1002.response.HousebookExtractionResponse;
import server.mcsv1002.response.message.ProcessCanonicalServiceResponseMessageType;
import javax.xml.namespace.QName;
import java.net.URL;
import java.util.Map;
import java.util.UUID;
import java.util.logging.Level;
import java.util.logging.Logger;
import static java.util.Arrays.asList;
public class Declarer implements Server {
private static final long PROCEDURE_CODE = 5000000000000001002L;
final private Logger logger = Logger.getLogger(getClass().getName());
@Override
public Revision getRevision() {
return Revision.rev111111;
}
@Override
public URL getWsdlUrl() {
return getClass().getClassLoader().getResource("mvvact/mvvact.wsdl");
}
@Override
public ServerResponse processRequest(final RequestContext ctx) {
if (ctx.isFirst()) {
return processFirstRequest(ctx);
} else {
return processContinueRequest(ctx);
}
}
private ServerResponse processContinueRequest(final RequestContext ctx) {
final ServerRequest request = ctx.getRequest();
if ("processCanonicalService".equals(request.action.getLocalPart())) {
if (request.packet.status != Packet.Status.PING) {
throw new IllegalStateException("Illegal status "
+ request.packet.status);
}
final ServerResponse result = ctx.getResult();
if (result != null) {
if (result.packet != null) {
result.packet.oktmo = request.packet.oktmo;
if (request != null && request.packet != null){
result.packet.serviceCode = request.packet.serviceCode;
result.packet.caseNumber = request.packet.caseNumber;
result.packet.testMsg = request.packet.testMsg;
}
// если нет ничего
if (request != null && request.routerPacket == null && request.packet != null && request.packet.requestIdRef==null) {
result.packet.requestIdRef = request.packet.originRequestIdRef; //UUID.randomUUID().toString();
}
}
return result;
}
return createResponse(request, Packet.Status.PROCESS, ctx.getBid(), 0, null);
}
switch (request.packet.status) {
case REQUEST:
case PING:
// проверка состояние это либо запрос либо опрос.
break;
default:
throw new IllegalStateException("Illegal status " + request.packet.status);
}
final ServerResponse result = ctx.getResult();
if (result != null) {
result.packet.oktmo = request.packet.oktmo;
if (request != null && request.packet != null){
result.packet.serviceCode = request.packet.serviceCode;
result.packet.caseNumber = request.packet.caseNumber;
result.packet.testMsg = request.packet.testMsg;
}
// если нет ничего
if (request != null && request.routerPacket == null && request.packet != null && request.packet.requestIdRef==null) {
result.packet.requestIdRef = request.packet.originRequestIdRef; //UUID.randomUUID().toString();
}
return result;
}
final ServerResponse state = ctx.getState();
if (state != null) {
state.packet.oktmo = request.packet.oktmo;
if (request != null && request.packet != null){
state.packet.serviceCode = request.packet.serviceCode;
state.packet.caseNumber = request.packet.caseNumber;
state.packet.testMsg = request.packet.testMsg;
}
// если нет ничего
if (request != null && request.routerPacket == null && request.packet != null && request.packet.requestIdRef==null) {
state.packet.requestIdRef = request.packet.originRequestIdRef; //UUID.randomUUID().toString();
}
return state;
}
return createResponse(request, Packet.Status.PROCESS, ctx.getBid(), 0, null);
}
private ServerResponse processFirstRequest(final RequestContext ctx) {
final ServerRequest request = ctx.getRequest();
if (request.packet.status != Packet.Status.REQUEST) {
throw new IllegalStateException("Illegal status "
+ request.packet.status);
}
try {
Map<String, Object> values = processInitialRequestAttachment(request);
final DeclarerContext declarerContext = ctx.getDeclarerContext(PROCEDURE_CODE);
addRequestParamsToContext(declarerContext, values);
String bid = declarerContext.declare();
return createResponse(request, Packet.Status.ACCEPT, bid, 0, null);
} catch (DeclarerException err) {
return createResponse(request, Packet.Status.FAILURE, null, err.getCode(), err.getMessage());
}
}
private void addRequestParamsToContext(DeclarerContext declarerContext, Map<String, Object> values) {
for (String key : values.keySet()) {
declarerContext.setValue(key, values.get(key));
}
}
private Map<String, Object> processInitialRequestAttachment(final ServerRequest request) throws DeclarerException {
if (request.attachmens == null) {
throw new DeclarerException(4, "В запросе должно быть вложение");
} else if (request.attachmens.size() != 1) {
throw new DeclarerException(4, "В запросе должно быть только одно вложение");
}
try {
Enclosure enclosure = request.attachmens.get(0);
return parseEnclosureData(enclosure.content);
} catch (Exception err) {
logger.log(Level.SEVERE, err.getMessage(), err);
throw new DeclarerException(4, "При анализе вложения произошла ошибка " + err.getMessage());
}
}
private Map<String, Object> parseEnclosureData(byte[] content) {
RequestParser parser = new RequestParser();
final HouseBookExtractionRequest request = parser.parseRequest(content);
request.checkRequiredFields();
return request.makeMapValue();
}
private ServerResponse createResponse(ServerRequest request,
Packet.Status status, String taskId, int code, String message) {
ServerResponse response = new ServerResponse();
response.packet = new Packet();
response.packet.status = status;
response.packet.exchangeType = "1";
response.packet.typeCode = Packet.Type.SERVICE;
response.packet.serviceName = "10000001022";
response.action = request.action;
if(request.packet.oktmo != null){
response.packet.oktmo = request.packet.oktmo;
}
if (request != null && request.packet != null){
response.packet.serviceCode = request.packet.serviceCode;
response.packet.caseNumber = request.packet.caseNumber;
response.packet.testMsg = request.packet.testMsg;
}
// если нет ничего
if (request != null && request.routerPacket == null && request.packet != null && request.packet.requestIdRef==null) {
response.packet.requestIdRef = request.packet.originRequestIdRef; //UUID.randomUUID().toString();
}
response.appData = createAppData(taskId, code, message);
return response;
}
private String createAppData(String taskId, int code, String message) {
ProcessCanonicalServiceResponseMessageType obj = new ProcessCanonicalServiceResponseMessageType();
obj.setTaskId(taskId);
obj.setErrorCode(code);
obj.setErrorDescription(message);
return XmlTypes.beanToXml(obj);
}
@Override
public ServerResponse processStatus(String statusMessage,
ReceiptContext receiptContext) {
ServerResponse response = new ServerResponse();
response.packet = new Packet();
response.packet.status = Packet.Status.PROCESS;
response.packet.exchangeType = "1";
response.packet.typeCode = Packet.Type.SERVICE;
response.appData = null;
response.action = new QName("http://canonicalRequests.gov.ru",
"processCanonicalService");
return response;
}
@Override
public ServerResponse processResult(String resultMessage,
ReceiptContext receiptContext) {
ServerResponse response = new ServerResponse();
response.packet = new Packet();
response.packet.status = Packet.Status.RESULT;
response.packet.exchangeType = "1";
response.packet.typeCode = Packet.Type.SERVICE;
response.packet.oktmo = "56701000";
response.action = new QName("http://canonicalRequests.gov.ru", "processCanonicalService");
try {
ResponseExtractor extractor = new ResponseExtractor();
HousebookExtractionResponse housebookExtraction = extractor.convertToResponseObject(receiptContext);
String xml = XmlTypes.beanToXml(housebookExtraction);
String enclosureName = UUID.randomUUID().toString();
Enclosure enclosure = new Enclosure(enclosureName.concat(".xml"), enclosureName, xml.getBytes());
receiptContext.setEnclosure(enclosureName, enclosure);
response.docRequestCode = enclosureName;
response.attachmens = asList(enclosure);
response.appData = createAppData(null, 0, null);
} catch (Exception err) {
logger.log(Level.SEVERE, err.getMessage());
response.packet.status = Packet.Status.REJECT;
response.appData = createAppData(null, 4, err.getMessage());
}
return response;
}
}