/* * 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.gws3456c; import ru.codeinside.gws.api.*; import ru.tower.mvd.clients.common.requestid.HeaderType; import ru.tower.mvd.clients.giac.request.*; import ru.tower.mvd.clients.giac.response.message.ResponseInfoType; import javax.xml.datatype.DatatypeConfigurationException; import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.namespace.QName; import java.math.BigInteger; import java.net.URL; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.GregorianCalendar; import java.util.logging.Level; import java.util.logging.Logger; public class MvdClient3456 implements Client { public static final String SMEV_REG_TIME = "smevRegTime"; public static final String SMEV_REG_NUMBER = "smevRegNumber"; public static final String SMEV_INITIAL_REG_NUMBER = "smevInitialRegNumber"; private static final String SMEV_INITIAL_REG_DATE = "smevInitialRegDate"; private Logger logger = Logger.getLogger(getClass().getName()); public Revision getRevision() { return ru.codeinside.gws.api.Revision.rev111111; } public URL getWsdlUrl() { return getClass().getClassLoader().getResource("gws3456/GIACService.wsdl"); } public ClientRequest createClientRequest(ExchangeContext ctx) { final String originRequestId = (String) ctx.getVariable("smevOriginRequestId"); final String requestId = (String) ctx.getVariable("smevRequestId"); final Boolean smevPool = (Boolean) ctx.getVariable("smevPool"); final Packet packet = new Packet(); packet.recipient = new InfoSystem("MVDR01001", "МВД России"); packet.typeCode = Packet.Type.SERVICE; packet.date = new Date(); packet.exchangeType = "2"; // 1 - Запрос на оказание услуги packet.originRequestIdRef = originRequestId; packet.testMsg = (String) ctx.getVariable("smevTest"); packet.serviceCode = "12345678901"; final ClientRequest request = new ClientRequest(); if (Boolean.TRUE == smevPool) { packet.status = Packet.Status.PING; packet.requestIdRef = requestId; request.packet = packet; request.action = new QName("http://tower.ru/mvd/clients/giac", "getGIACResponse"); request.appData = createAppDataForGetResponseOperation(ctx); } else { BigInteger caseNumber = generateCaseNumber(); packet.caseNumber = caseNumber.toString(); ctx.setVariable(SMEV_INITIAL_REG_NUMBER, caseNumber); ctx.setVariable(SMEV_INITIAL_REG_DATE, new Date()); request.packet = packet; request.action = new QName("http://tower.ru/mvd/clients/giac", "sendGIACRequest"); packet.status = Packet.Status.REQUEST; request.appData = createAppDataForSendRequestOperation(ctx); } return request; } private String createAppDataForGetResponseOperation(ExchangeContext ctx) { ru.tower.mvd.clients.common.requestid.Message requestIdMessage = new ru.tower.mvd.clients.common.requestid.Message(); HeaderType header = new HeaderType(); HeaderType.RegNumber regNumber = new HeaderType.RegNumber(); regNumber.setValue((BigInteger) ctx.getVariable(SMEV_REG_NUMBER)); regNumber.setRegtime((XMLGregorianCalendar) ctx.getVariable(SMEV_REG_TIME)); header.setRegNumber(regNumber); header.setMsgType("REQUEST_ID"); header.setMsgVid((String) ctx.getVariable("MsgVid")); header.setFromFoivId("PNZR01581"); header.setFromFoivName("Комплексная система предоставления государственных и муниципальных услуг Пензенской области"); header.setFromSystemId("PNZR01581"); header.setFromSystem("Комплексная система предоставления государственных и муниципальных услуг Пензенской области"); header.setToFoivId("MVDR01001"); header.setToFoivName("МВД России"); header.setToSystem("ИС ГИАЦ"); header.setToSystemId("6"); header.setVersion("1.1"); header.setReason((String) ctx.getVariable("Reason")); ru.tower.mvd.clients.common.requestid.BaseHeaderType.InitialRegNumber initialRegNumber = new ru.tower.mvd.clients.common.requestid.BaseHeaderType.InitialRegNumber(); initialRegNumber.setValue((BigInteger) ctx.getVariable(SMEV_INITIAL_REG_NUMBER)); GregorianCalendar gregorianCalendar = new GregorianCalendar(); gregorianCalendar.setTime((Date) ctx.getVariable(SMEV_INITIAL_REG_DATE)); try { initialRegNumber.setRegtime(DatatypeFactory.newInstance().newXMLGregorianCalendar(gregorianCalendar)); } catch (DatatypeConfigurationException err) { logger.log(Level.SEVERE, err.getMessage(), err); } header.setInitialRegNumber(initialRegNumber); ru.tower.mvd.clients.common.requestid.BaseHeaderType.Service service = new ru.tower.mvd.clients.common.requestid.BaseHeaderType.Service(); service.setCode(1); // В документации предписано указывать только это значение service.setName("conviction_investigation"); // В документации предписано указывать только это значение service.setValue("Сведения о наличии (отсутствии) судимости и (или) факта уголовного преследования либо о прекращении уголовного преследования, сведения о нахождении в розыске");// В header.setService(service); ru.tower.mvd.clients.common.requestid.BaseHeaderType.Originator originator = new ru.tower.mvd.clients.common.requestid.BaseHeaderType.Originator(); originator.setCode("PNZR01581"/*(String) ctx.getVariable("OriginatorCode")*/); originator.setFio((String) ctx.getVariable("OriginatorFio")); originator.setName("Комплексная система предоставления государственных и муниципальных услуг Пензенской области"/*(String) ctx.getVariable("OriginatorName")*/); originator.setRegion((String) ctx.getVariable("OriginatorRegion")); header.setOriginator(originator); requestIdMessage.setHeader(header); return new XmlTypes(ru.tower.mvd.clients.common.requestid.Message.class).toXml(requestIdMessage); } private XMLGregorianCalendar convertToGregorianCalendar(Date time) { GregorianCalendar gregorianCalendar = new GregorianCalendar(); try { return DatatypeFactory.newInstance().newXMLGregorianCalendar(gregorianCalendar); } catch (DatatypeConfigurationException err) { logger.log(Level.SEVERE, err.getMessage(), err); } return null; } private BigInteger generateCaseNumber() { BigInteger value = BigInteger.valueOf(new Date().getTime()); value = value.multiply(BigInteger.valueOf(100000)); long randomValue = Math.round(Math.random() * 100000.0); return value.add(BigInteger.valueOf(randomValue)); } private String createAppDataForSendRequestOperation(ExchangeContext ctx) { BaseHeaderType header = new BaseHeaderType(); header.setMsgType("REQUEST"); header.setMsgVid((String) ctx.getVariable("MsgVid")); header.setFromFoivId("PNZR01581"); header.setFromFoivName("Комплексная система предоставления государственных и муниципальных услуг Пензенской области"); header.setFromSystemId("PNZR01581"); header.setFromSystem("Комплексная система предоставления государственных и муниципальных услуг Пензенской области"); header.setToFoivId("MVDR01001"); header.setToFoivName("МВД России"); header.setToSystem("ИС ГИАЦ"); header.setToSystemId("6"); header.setVersion("1.1"); header.setReason((String) ctx.getVariable("Reason")); BaseHeaderType.InitialRegNumber regNumber = new BaseHeaderType.InitialRegNumber(); regNumber.setValue((BigInteger) ctx.getVariable(SMEV_INITIAL_REG_NUMBER)); GregorianCalendar gregorianCalendar = new GregorianCalendar(); gregorianCalendar.setTime((Date) ctx.getVariable(SMEV_INITIAL_REG_DATE)); try { regNumber.setRegtime(DatatypeFactory.newInstance().newXMLGregorianCalendar(gregorianCalendar)); } catch (DatatypeConfigurationException err) { logger.log(Level.SEVERE, err.getMessage(), err); } header.setInitialRegNumber(regNumber); BaseHeaderType.Service service = new BaseHeaderType.Service(); service.setCode(1); // В документации предписано указывать только это значение service.setName("conviction_investigation"); // В документации предписано указывать только это значение service.setValue("Сведения о наличии (отсутствии) судимости и (или) факта уголовного преследования либо о прекращении уголовного преследования, сведения о нахождении в розыске");// В // значение header.setService(service); BaseHeaderType.Originator originator = new BaseHeaderType.Originator(); originator.setCode("PNZR01581"/*(String) ctx.getVariable("OriginatorCode")*/); originator.setFio((String) ctx.getVariable("OriginatorFio")); originator.setName("Комплексная система предоставления государственных и муниципальных услуг Пензенской области"/*(String) ctx.getVariable("OriginatorName")*/); originator.setRegion((String) ctx.getVariable("OriginatorRegion")); header.setOriginator(originator); GIACPrivatePersonType privatePerson = new GIACPrivatePersonType(); privatePerson.setDateOfBirth(formatDate((Date) ctx.getVariable("DateOfBirth"), "dd.MM.yyyy")); privatePerson.setFirstName((String) ctx.getVariable("FirstName")); privatePerson.setFathersName((String) ctx.getVariable("FathersName")); privatePerson.setSecName((String) ctx.getVariable("SecName")); privatePerson.setSNILS((String) ctx.getVariable("SNILS")); PlaceOfBirthType placeOfBirth = new PlaceOfBirthType(); placeOfBirth.setCode((String) ctx.getVariable("BirthRegionCode")); placeOfBirth.setValue((String) ctx.getVariable("PlaceOfBirth")); privatePerson.setPlaceOfBirth(placeOfBirth); GIACPrivatePersonType.Address address = new GIACPrivatePersonType.Address(); address.setRegion((String) ctx.getVariable("Region")); address.setRegistrationPlace((String) ctx.getVariable("RegistrationPlace")); address.setTypeRegistration((String) ctx.getVariable("TypeRegistration")); privatePerson.setAddress(address); DocumentType document = new DocumentType(); document.setPrivatePerson(privatePerson); Message message = new Message(); message.setHeader(header); message.setDocument(document); return new XmlTypes(Message.class).toXml(message); } private String formatDate(Date dateValue, String pattern) { DateFormat dateFormat = new SimpleDateFormat(pattern); return dateFormat.format(dateValue); } public void processClientResponse(ClientResponse response, ExchangeContext context) { if (response.verifyResult.error != null) { context.setVariable("smevPool", false); context.setVariable("smevError", response.verifyResult.error); } else if (new QName("http://smev.gosuslugi.ru/rev111111", "ResponseID").equals(response.action)) { processResponseOfPingOperation(response, context); } else if (new QName("http://smev.gosuslugi.ru/rev111111", "ResponseGIAC").equals(response.action)) { proceccResponseWithFinalData(response, context); } else { context.setVariable("smevPool", false); context.setVariable("smevError", "Неизвестный ответ " + response.action); } } private void proceccResponseWithFinalData(ClientResponse response, ExchangeContext context) { // разбираем конечный ответ ru.tower.mvd.clients.giac.response.AppDataType appData = XmlTypes.elementToBean(response.appData, ru.tower.mvd.clients.giac.response.AppDataType.class); ResponseInfoType.Subdivision subdivision = appData.getMessage().getResponseInfo().getSubdivision(); context.setVariable("codeDivision", subdivision.getCode()); context.setVariable("nameDivision", subdivision.getName()); context.setVariable("infoFound", subdivision.getFound()); String result = ""; if (subdivision.getResult() != null) { result = new String(subdivision.getResult()); } context.setVariable("infoTxt", result); context.setVariable("smevPool", false); } private void processResponseOfPingOperation(ClientResponse response, ExchangeContext context) { Boolean pooled = (Boolean) context.getVariable("smevPool"); if (response.packet.status == Packet.Status.ACCEPT) { context.setVariable("smevPool", true); if (Boolean.TRUE != pooled) { // разбираем ответ от первичного запроса context.setVariable("smevRequestId", response.packet.requestIdRef); context.setVariable("smevOriginRequestId", response.packet.originRequestIdRef); // получаем regNumber и regDate они понадобятся для отправки повторного запроса ru.tower.mvd.clients.common.responseid.AppDataType appData = XmlTypes.elementToBean(response.appData, ru.tower.mvd.clients.common.responseid.AppDataType.class); ru.tower.mvd.clients.common.responseid.message.HeaderType.RegNumber regNumber = appData.getMessage().getHeader().getRegNumber(); context.setVariable(SMEV_REG_NUMBER, regNumber.getValue()); context.setVariable(SMEV_REG_TIME, regNumber.getRegtime()); } else { context.setVariable("smevPool", false); ru.tower.mvd.clients.common.responseid.AppDataType appData = XmlTypes.elementToBean(response.appData, ru.tower.mvd.clients.common.responseid.AppDataType.class); context.setVariable("smevError", "Описание ошибки " + appData.getMessage().getAcknowledgement().getResult()); } } } }