/* * 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.gws3564c; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import ru.codeinside.gws.api.Client; import ru.codeinside.gws.api.ClientRequest; import ru.codeinside.gws.api.ClientResponse; import ru.codeinside.gws.api.Enclosure; import ru.codeinside.gws.api.ExchangeContext; import ru.codeinside.gws.api.InfoSystem; import ru.codeinside.gws.api.Packet; import ru.codeinside.gws.api.Revision; import ru.codeinside.gws.api.XmlTypes; import ru.codeinside.gws3564c.enclosure.EnclosureRequestBuilder; import ru.fccland.portal.types.CreateRequestBean; import ru.fccland.portal.types.StatusResponseBean; import javax.xml.namespace.QName; import java.math.BigInteger; import java.net.URL; import java.util.Date; import java.util.UUID; import java.util.logging.Logger; public class RRclient implements Client { private final Logger logger = Logger.getLogger(getClass().getName()); public static final String SMEV_INITIAL_REG_NUMBER = "smevInitialRegNumber"; public static final String SMEV_INITIAL_REG_DATE = "smevInitialRegDate"; @Override public Revision getRevision() { return ru.codeinside.gws.api.Revision.rev111111; } @Override public URL getWsdlUrl() { return getClass().getClassLoader().getResource("rr_wsdl/RR.wsdl"); } @Override public ClientRequest createClientRequest(ExchangeContext ctx) { InfoSystem pnzr01581 = new InfoSystem("PNZR01581", "Комплексная система предоставления государственных и муниципальных услуг Пензенской области"); 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.sender = packet.originator = pnzr01581; packet.recipient = new InfoSystem("RRTR01001", "Росреестр"); packet.typeCode = Packet.Type.SERVICE; packet.exchangeType = "2"; // 1 - Запрос на оказание услуги packet.originRequestIdRef = originRequestId; packet.serviceCode = "10000013628"; packet.testMsg = (String) ctx.getVariable("smevTest"); final ClientRequest request = new ClientRequest(); if (Boolean.TRUE == smevPool) { logger.info("PING smevPool " + smevPool); request.action = new QName("http://portal.fccland.ru/rt/", "GetStatus"); packet.status = Packet.Status.PING; packet.requestIdRef = requestId; packet.caseNumber = (String) ctx.getVariable(SMEV_INITIAL_REG_NUMBER); packet.date = (Date) ctx.getVariable(SMEV_INITIAL_REG_DATE); request.appData = createAppData(ctx); } else { packet.status = Packet.Status.REQUEST; request.action = new QName("http://portal.fccland.ru/rt/", "CreateRequest"); request.appData = createAppData(ctx); BigInteger caseNumber = generateCaseNumber(); ctx.setVariable(SMEV_INITIAL_REG_NUMBER, caseNumber.toString()); ctx.setVariable(SMEV_INITIAL_REG_DATE, new Date()); packet.caseNumber = (String) ctx.getVariable(SMEV_INITIAL_REG_NUMBER); packet.date = (Date) ctx.getVariable(SMEV_INITIAL_REG_DATE); String id = UUID.randomUUID().toString(); EnclosureRequestBuilder enclosureBuilder = EnclosureBuilderFactory.createEnclosureBuilder(ctx); String xml = enclosureBuilder.createEnclosure(id); System.out.println("enclosure: " + xml); String zipName = "req_" + id; Enclosure enclosure = new Enclosure(zipName + ".xml", xml.getBytes()); enclosure.fileName = zipName + ".xml"; request.enclosures = new Enclosure[]{enclosure}; request.enclosureDescriptor = zipName; } request.packet = packet; return request; } 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)); } @Override public void processClientResponse(ClientResponse response, ExchangeContext ctx) { Boolean pooled = (Boolean) ctx.getVariable("smevPool"); logger.info("smevPool " + pooled); logger.info("response.action " + response.action); logger.info("response.verifyResult.error " + response.verifyResult.error); logger.info("response.packet.status " + response.packet.status); if (response.verifyResult.error != null) { logger.info("response.verifyResult.error " + response.verifyResult.error); ctx.setVariable("smevPool", false); ctx.setVariable("smevError", response.verifyResult.error); } else if (!((new QName("http://portal.fccland.ru/rt/", "getStatusResponse").equals(response.action)) || (new QName("http://portal.fccland.ru/rt/", "createRequestResponse").equals(response.action)))) { logger.info("!!!!!!!! Неизвестный ответ "); ctx.setVariable("smevPool", false); ctx.setVariable("smevError", "Неизвестный ответ " + response.action); } if ((new QName("http://portal.fccland.ru/rt/", "createRequestResponse")).equals(response.action)) { if (response.packet.status == Packet.Status.ACCEPT) { logger.info("RequestResponse.appdata " + response.appData); ctx.setVariable("smevPool", true); if (Boolean.TRUE != pooled) { ctx.setVariable("smevRequestId", response.packet.requestIdRef); ctx.setVariable("smevOriginRequestId", response.packet.originRequestIdRef); Element appData = response.appData; if (appData.getElementsByTagNameNS("http://portal.fccland.ru/types/", "requestNumber") != null) { NodeList requestNumberList = appData.getElementsByTagNameNS("http://portal.fccland.ru/types/", "requestNumber"); Element requestNumber = (Element) requestNumberList.item(0); logger.info(" requestNumberList Length " + requestNumberList.getLength()); String requestNumberString = requestNumber.getTextContent(); ctx.setVariable("requestNumber", requestNumberString); logger.info("requestNumber " + requestNumberString); } } } else { ctx.setVariable("smevPool", false); ctx.setVariable("status", response.packet.status); } } else if ((new QName("http://portal.fccland.ru/rt/", "getStatusResponse")).equals(response.action)) { ctx.setVariable("smevPool", false); System.out.println(response.appData); Element appData = response.appData; if ((appData.getElementsByTagNameNS("http://portal.fccland.ru/types/", "errorMessage")).getLength() != 0) { logger.info("ErrorMessage != NULL!!!!! " + appData.getElementsByTagNameNS("http://portal.fccland.ru/types/", "errorMessage")); NodeList errorMessageList = appData.getElementsByTagNameNS("http://portal.fccland.ru/types/", "errorMessage"); Element errorMessage = (Element) errorMessageList.item(0); logger.info("response.appdata " + response.appData); String errorMessageString = errorMessage.getTextContent(); ctx.setVariable("statusMessage", errorMessageString); ctx.setVariable("smevPool", false); } else { NodeList statusResponseBeanList = appData.getElementsByTagNameNS("http://portal.fccland.ru/types/", "statusResponseBean"); Element statusResponse = (Element) statusResponseBeanList.item(0); StatusResponseBean statusResponseBean = XmlTypes.elementToBean(statusResponse, StatusResponseBean.class); /*if (!getStatusResponseMessageType.getErrorMessage().equals("ОК")){ ctx.setVariable("status", "ошибка"); ctx.setVariable("smevError", getStatusResponseMessageType.getErrorMessage()); } else{ */ // String status = appData.getStatusResponseBean().getStatus(); final OrderStatus status = OrderStatus.findByCode(statusResponseBean.getStatus()); logger.info("Message status " + status); logger.info("Status message " + statusResponseBean.getStatusMessage()); switch (status) { case OK: case VERIFICATION: case PROCESSING: case PAYMENT_PENDING: case PAYMENT: ctx.setVariable("status", status.code); ctx.setVariable("result_request", statusResponseBean.getStatusMessage()); ctx.setVariable("smevPool", true); break; default: ctx.setVariable("status", status.code); ctx.setVariable("result_request", statusResponseBean.getStatusMessage()); ctx.setVariable("smevPool", false); if (response.enclosures != null) { saveEnclosuresToContext("enclosureData", ctx, response.enclosures); } } } } } private void saveEnclosuresToContext(String varName, ExchangeContext ctx, Enclosure[] enclosures) { if (enclosures == null) return; StringBuilder enclosureVars = new StringBuilder(); for (int i = 0; i < enclosures.length; i++) { String enclosureVar = varName + "_" + i; if (i > 0) { enclosureVars.append(';'); } enclosureVars.append(enclosureVar); ctx.addEnclosure(enclosureVar, enclosures[i]); } ctx.setVariable(varName, enclosureVars.toString()); } private String createAppData(ExchangeContext ctx) { if (ctx.getVariable("requestNumber") != null) { String xmlRequestNumber = "<requestNumber xmlns=\"http://portal.fccland.ru/types/\">" + ctx.getVariable("requestNumber") + "</requestNumber>"; logger.info("xmlRequestNumber " + xmlRequestNumber); return xmlRequestNumber; /* final GetStatusRequestMessageType getStatusRequestMessageType = new GetStatusRequestMessageType(); getStatusRequestMessageType.setRequestNumber((String)ctx.getVariable("requestNumber")); logger.info("getStatusRequestMessageType : " + new XmlTypes(GetStatusRequestMessageType.class).toXml(getStatusRequestMessageType) ); return new XmlTypes(GetStatusRequestMessageType.class).toXml(getStatusRequestMessageType); */ } final CreateRequestBean requestBean = new CreateRequestBean(); requestBean.setOkato((String) ctx.getVariable("okato")); requestBean.setOktmo((String) ctx.getVariable("oktmo")); requestBean.setRequestType((String) ctx.getVariable("requestType")); return new XmlTypes(CreateRequestBean.class).toXml(requestBean); } }