diff --git a/src/main/java/ru/nbch/credit_tracker/enums/SignalError.java b/src/main/java/ru/nbch/credit_tracker/enums/SignalError.java index 401e24f..c6d21dc 100644 --- a/src/main/java/ru/nbch/credit_tracker/enums/SignalError.java +++ b/src/main/java/ru/nbch/credit_tracker/enums/SignalError.java @@ -14,7 +14,8 @@ public enum SignalError { ERROR_008("008", "PackageName не соответствует допустимому формату"), ERROR_009("009", "Превышен допустимый размер пакета"), ERROR_010("010", "Идентификатор субъекта (Id) не соответствует допустимому формату"), - ERROR_011("011", "Получен невалидный XML"); + ERROR_011("011", "Получен невалидный XML"), + ERROR_100("100", "Непредвиденная ошибка"); private final String code; private final String message; diff --git a/src/main/java/ru/nbch/credit_tracker/facade/SignalFacade.java b/src/main/java/ru/nbch/credit_tracker/facade/SignalFacade.java index 638cf19..c241a70 100644 --- a/src/main/java/ru/nbch/credit_tracker/facade/SignalFacade.java +++ b/src/main/java/ru/nbch/credit_tracker/facade/SignalFacade.java @@ -9,7 +9,7 @@ import org.springframework.web.multipart.MultipartFile; import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings; import ru.nbch.credit_tracker.entities.monitoring_request.MonitoringRequest; import ru.nbch.credit_tracker.enums.SignalError; -import ru.nbch.credit_tracker.exceptions.ValidationException; +import ru.nbch.credit_tracker.enums.Status; import ru.nbch.credit_tracker.service.FailureAnswerGenerator; import ru.nbch.credit_tracker.service.SignalService; import ru.nbch.credit_tracker.service.scoring.AuthorizationService; @@ -87,60 +87,92 @@ public class SignalFacade { } catch (Exception e) { log.error(e.getMessage(), e); - String errorPath = failureAnswerGenerator.generateFailureAnswer(SignalError.ERROR_001); + String errorPath = failureAnswerGenerator.generateFailureAnswer(SignalError.ERROR_100); return ResponseEntity.internalServerError().body(new PathResource(errorPath)); } // Теперь знаем, что в архиве лежит ровно один файл с раширением xml и он весит меньше 2гб. Можно валидировать сам xml - try (ZipInputStream zipInputStream = new ZipInputStream(file.getInputStream())) { - zipInputStream.getNextEntry(); - validateRequestByXsd(zipInputStream); - - } catch (ValidationException e) { - // записать REJECTED - return getBadResponse(SignalError.ERROR_011); // TODO вычленять конкретный элемент - } catch (Exception e) { - log.error(e.getMessage(), e); - String errorPath = failureAnswerGenerator.generateFailureAnswer(SignalError.ERROR_001); - return ResponseEntity.internalServerError().body(new PathResource(errorPath)); - } - + // Пробуем распарсить xml MonitoringRequest monitoringRequest; - // Xml валиден. Производим анмаршаллинг try (ZipInputStream zipInputStream = new ZipInputStream(file.getInputStream())) { zipInputStream.getNextEntry(); IXmlProcessor processor = xmlUtilService.createJaxbProcessor(); monitoringRequest = processor.read(zipInputStream, MonitoringRequest.class); + } catch (Exception e) { + log.error(e.getMessage(), e); + String errorPath = failureAnswerGenerator.generateFailureAnswer(SignalError.ERROR_100); + return ResponseEntity.internalServerError().body(new PathResource(errorPath)); + } + + // валидация xml + ResponseEntity errorResponse = validateMonitoringRequest(monitoringRequest); + if (errorResponse != null) { + return errorResponse; + } + + try { if (!authorizationService.hasAuthorization(monitoringRequest.getUserId(), monitoringRequest.getPassword())) { - // записать REJECTED + signalService.insertPackage(monitoringRequest, Status.REJECTED); return getBadResponse(SignalError.ERROR_005); } if (signalService.isPackageNotUnique(monitoringRequest)) { - // записать REJECTED -// signalService.insertPackage(monitoringRequest, Status.REJECTED); + signalService.insertPackage(monitoringRequest, Status.REJECTED); return getBadResponse(SignalError.ERROR_007); } signalService.registerPackage(monitoringRequest); - } catch (Exception e) { log.error(e.getMessage(), e); - String errorPath = failureAnswerGenerator.generateFailureAnswer(SignalError.ERROR_001); + String errorPath = failureAnswerGenerator.generateFailureAnswer(SignalError.ERROR_100); return ResponseEntity.internalServerError().body(new PathResource(errorPath)); } return ResponseEntity.ok().body(new PathResource("D:\\folder_name\\legal.xml")); // TODO generate success response } - private void validateRequestByXsd(ZipInputStream inputStream) throws ValidationException { - try { - xmlUtilService.validateXMLByXSD(inputStream, config.getXsdValidation().monitoringRequestPath()); - } catch (Exception e) { - throw new ValidationException(); + private ResponseEntity validateMonitoringRequest(MonitoringRequest request) { + if (request == null) { + return getBadResponse(SignalError.ERROR_011); } + + ResponseEntity errorResponse = validateReruqredTags(request); + if (errorResponse != null) { + return errorResponse; + } + + return validateTagsTypes(request); + } + + ResponseEntity validateReruqredTags(MonitoringRequest request) { + if (request.getUserId() == null) { + return getBadResponse(SignalError.ERROR_002); // + userId + } + + if (request.getPackageName() == null) { + return getBadResponse(SignalError.ERROR_002); // + packageName + } + + if (request.getPassword() == null) { + return getBadResponse(SignalError.ERROR_002); // + password + } + + if (request.getSubjects() == null) { + return getBadResponse(SignalError.ERROR_002); // + subjects + } + + if (request.getSubjects().getSubject().isEmpty()) { + return getBadResponse(SignalError.ERROR_002); // subject + } + + return null; + } + + private ResponseEntity validateTagsTypes(MonitoringRequest request) { + // TODO проверка на типы тут уже можно регистрировать в бд REGECTED реквесты + return null; } private boolean isZipFile(MultipartFile file) {