PROX-146: validate error mapping (#23)

* PROX-146: validate error mapping
This commit is contained in:
Anatoly Cherkasov 2018-03-23 17:27:22 +03:00 committed by GitHub
parent d4d1b31d9f
commit ab4922f625
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 122 additions and 60 deletions

View File

@ -42,10 +42,6 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>

View File

@ -20,6 +20,8 @@ public class ErrorMappingConfiguration {
@Bean
ErrorMapping errorMapping() throws IOException {
ErrorMapping errorMapping = new ErrorMapping(filePath.getInputStream(), patternReason);
errorMapping.validateMappingFormat();
return new ErrorMapping(filePath.getInputStream(), patternReason);
}

View File

@ -1,49 +0,0 @@
package com.rbkmoney.proxy.mocketbank.configuration;
import org.eclipse.jetty.server.NetworkTrafficServerConnector;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.embedded.jetty.JettyEmbeddedServletContainerFactory;
import org.springframework.boot.context.embedded.jetty.JettyServerCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.List;
@Configuration
public class JettyEmbeddedConfiguration {
private final static Logger LOGGER = LoggerFactory.getLogger(JettyEmbeddedConfiguration.class);
@Value("${server.port}")
private String mainPort;
@Value("#{'${server.secondary.ports}'.split(',')}")
private List<String> secondaryPorts;
@Bean
public JettyEmbeddedServletContainerFactory jettyEmbeddedServletContainerFactory() {
final JettyEmbeddedServletContainerFactory factory = new JettyEmbeddedServletContainerFactory(Integer.valueOf(mainPort));
// Add customized Jetty configuration with non blocking connection handler
factory.addServerCustomizers((JettyServerCustomizer) server -> {
// Register an additional connector for each secondary port.
for(final String secondaryPort : secondaryPorts) {
final NetworkTrafficServerConnector connector = new NetworkTrafficServerConnector(server);
connector.setPort(Integer.valueOf(secondaryPort));
try {
connector.join();
} catch (InterruptedException e) {
LOGGER.error("Exception in JettyConfiguration", e);
}
server.addConnector(connector);
}
// Additional configuration
});
return factory;
}
}

View File

@ -0,0 +1,50 @@
package com.rbkmoney.proxy.mocketbank.configuration;
import org.apache.catalina.connector.Connector;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory;
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.ArrayList;
import java.util.List;
/**
* This is the configuration class for configuring the {@link EmbeddedServletContainerFactory}
*
* @author Anatoly Cherkasov
* @see Connector
* @see EmbeddedServletContainerFactory
*/
@Configuration
public class TomcatEmbeddedConfiguration {
@Value("${server.port}")
private String mainPort;
@Value("#{'${server.secondary.ports}'.split(',')}")
private List<String> secondaryPorts;
@Bean
public EmbeddedServletContainerFactory servletContainer() {
TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
Connector[] additionalConnectors = this.additionalConnector();
if (additionalConnectors.length > 0) {
tomcat.addAdditionalTomcatConnectors(additionalConnectors);
}
return tomcat;
}
private Connector[] additionalConnector() {
List<Connector> result = new ArrayList<>();
for (String port : secondaryPorts) {
Connector connector = new Connector();
connector.setPort(Integer.valueOf(port));
result.add(connector);
}
return result.toArray(new Connector[]{});
}
}

View File

@ -1,4 +1,4 @@
package com.rbkmoney.proxy.mocketbank.utils.model;
package com.rbkmoney.proxy.mocketbank.utils.error_mapping;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

View File

@ -6,10 +6,12 @@ import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.rbkmoney.damsel.domain.Failure;
import com.rbkmoney.proxy.mocketbank.utils.model.Error;
import com.rbkmoney.woody.api.flow.error.WUndefinedResultException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import static com.rbkmoney.geck.serializer.kit.tbase.TErrorUtil.toGeneral;
@ -20,6 +22,9 @@ import static com.rbkmoney.geck.serializer.kit.tbase.TErrorUtil.toGeneral;
*/
public class ErrorMapping {
private final Logger log = LoggerFactory.getLogger(this.getClass());
// ------------------------------------------------------------------------
// Constants
// ------------------------------------------------------------------------
@ -35,7 +40,7 @@ public class ErrorMapping {
/**
* List of errors
*/
private final List<com.rbkmoney.proxy.mocketbank.utils.model.Error> errors;
private final List<Error> errors;
// ------------------------------------------------------------------------
// Constructors
@ -59,7 +64,7 @@ public class ErrorMapping {
this.errors = errors;
}
public static List<com.rbkmoney.proxy.mocketbank.utils.model.Error> initErrorList(InputStream inputStream, ObjectMapper objectMapper) {
public static List<Error> initErrorList(InputStream inputStream, ObjectMapper objectMapper) {
try {
return objectMapper.readValue(inputStream, new TypeReference<List<Error>>() {});
} catch (JsonParseException e) {
@ -84,7 +89,7 @@ public class ErrorMapping {
* @return Failure
*/
public Failure getFailureByCodeAndDescription(String code, String description) {
com.rbkmoney.proxy.mocketbank.utils.model.Error error = findMatchWithPattern(errors, code, description);
Error error = findMatchWithPattern(errors, code, description);
Failure failure = toGeneral(error.getMapping());
failure.setReason(prepareReason(code, description));
@ -99,7 +104,7 @@ public class ErrorMapping {
* @param description String
* @return com.rbkmoney.proxy.mocketbank.utils.model.Error
*/
private com.rbkmoney.proxy.mocketbank.utils.model.Error findMatchWithPattern(
private Error findMatchWithPattern(
List<Error> errors,
String code,
String description
@ -133,4 +138,11 @@ public class ErrorMapping {
return String.format(this.patternReason, code, description);
}
/**
* Validate mapping formate
*/
public void validateMappingFormat() {
errors.forEach(error -> StandardError.findByValue(error.getMapping()));
}
}

View File

@ -0,0 +1,51 @@
package com.rbkmoney.proxy.mocketbank.utils.error_mapping;
import java.util.Arrays;
public enum StandardError {
PRE_AUTHORIZATION_FAILED("preauthorization_failed"),
REJECTED_BY_INSPECTOR("rejected_by_inspector"),
AUTH_FAILED_OPERATION_BLOCKED("authorization_failed:operation_blocked"),
AUTH_FAILED_MERCHANT_BLOCKED("authorization_failed:merchant_blocked"),
AUTH_FAILED_ACCOUNT_NOT_FOUND("authorization_failed:account_not_found"),
AUTH_FAILED_ACCOUNT_BLOCKED("authorization_failed:account_blocked"),
AUTH_FAILED_INSUFFICIENT_FUNDS("authorization_failed:insufficient_funds"),
AUTH_FAILED_ACCOUNT_STOLEN("authorization_failed:account_stolen"),
AUTH_FAILED_UNKNOWN("authorization_failed:unknown"),
AUTH_FAILED_ACCOUNT_EXCEEDED_AMOUNT("authorization_failed:account_limit_exceeded:amount"),
AUTH_FAILED_ACCOUNT_EXCEEDED_NUMBER("authorization_failed:account_limit_exceeded:number"),
AUTH_FAILED_ACCOUNT_EXCEEDED_UNKNOWN("authorization_failed:account_limit_exceeded:unknown"),
AUTH_FAILED_PROVIDER_EXCEEDED_AMOUNT("authorization_failed:provider_limit_exceeded:amount"),
AUTH_FAILED_PROVIDER_EXCEEDED_NUMBER("authorization_failed:provider_limit_exceeded:number"),
AUTH_FAILED_PROVIDER_EXCEEDED_UNKNOWN("authorization_failed:provider_limit_exceeded:unknown"),
AUTH_FAILED_BANK_CARD_CARD_EXPIRED("authorization_failed:payment_tool_rejected:bank_card_rejected:card_expired"),
AUTH_FAILED_BANK_CARD_CARD_NUMBER_INVALID("authorization_failed:payment_tool_rejected:bank_card_rejected:card_number_invalid"),
AUTH_FAILED_BANK_CARD_CARD_HOLDER_INVALID("authorization_failed:payment_tool_rejected:bank_card_rejected:card_holder_invalid"),
AUTH_FAILED_BANK_CARD_CVV_INVALID("authorization_failed:payment_tool_rejected:bank_card_rejected:cvv_invalid"),
AUTH_FAILED_BANK_CARD_CARD_UNSUPPORTED("authorization_failed:payment_tool_rejected:bank_card_rejected:card_unsupported"),
AUTH_FAILED_BANK_CARD_ISSUER_NOT_FOUND("authorization_failed:payment_tool_rejected:bank_card_rejected:issuer_not_found");
private final String error;
StandardError(String action) {
this.error = action;
}
public String getError() {
return error;
}
public static StandardError findByValue(String value) {
return Arrays.stream(StandardError.values()).filter((error) -> error.getError().equals(value))
.findFirst()
.orElseThrow(()->new IllegalStateException(String.format("Unsupported error '%s' does not match standard", value)));
}
}