Commit e5751176 authored by Kali Padhi's avatar Kali Padhi

Exception logic new format added

parents 420d3e53 6c0102d2
...@@ -15,6 +15,9 @@ configurations { ...@@ -15,6 +15,9 @@ configurations {
} }
repositories { repositories {
flatDir {
dirs 'C:\\Users\\kpadhi\\.m2\\repository\\com\\nisum\\exceptionservice\\0.0.1'
}
mavenCentral() mavenCentral()
} }
...@@ -29,6 +32,14 @@ dependencies { ...@@ -29,6 +32,14 @@ dependencies {
testImplementation('org.springframework.boot:spring-boot-starter-test') { testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
} }
compile 'com.nisum:exceptionservice:0.0.1'
implementation group: 'junit', name: 'junit', version: '4.12'
testImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: '2.0.3.RELEASE'
testImplementation group: 'junit', name: 'junit', version: '4.12'
testImplementation 'org.junit.platform:junit-platform-commons:1.5.2'
} }
test { test {
......
package com.nisum.offertransactionservice.config; package com.nisum.offertransactionservice.config;
import com.nisum.offertransactionservice.handler.MyResponseErrorHandler;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.web.client.*; import org.springframework.web.client.*;
@Configuration @Configuration
...@@ -9,6 +12,9 @@ public class OfferTransactionConfig { ...@@ -9,6 +12,9 @@ public class OfferTransactionConfig {
@Bean @Bean
public RestTemplate getRestTemplate() { public RestTemplate getRestTemplate() {
return new RestTemplate();
return new RestTemplateBuilder()
.errorHandler(new MyResponseErrorHandler())
.build();
} }
} }
package com.nisum.offertransactionservice.dao;
import com.nisum.offertransactionservice.model.OfferTransactionRequest;
import com.nisum.offertransactionservice.model.OfferTransactionResponse;
import com.nisum.offertransactionservice.model.PERequest;
import com.nisum.offertransactionservice.model.PEResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.http.*;
import org.springframework.web.client.*;
@Component
public class OfferDao {
@Autowired
private RestTemplate restTemplate;
@Value("${promotion.engine.calculate.discount.url}")
private String promotionEngineUrl ;
public PEResponse callPE(PERequest peRequest) {
//TODO validate PERequest and rest template is successful or not
ResponseEntity<PEResponse> peResponse = restTemplate.postForEntity("http://localhost:8081"+promotionEngineUrl,peRequest,PEResponse.class);
return peResponse.getBody();
}
}
package com.nisum.offertransactionservice.genericexception;
public class GlobalApiGenericException extends Exception {
private static final long serialVersionUID = -3841677326659278730L;
private String statusCode;
private boolean isHttpError;
public GlobalApiGenericException(String debugMessage, Throwable ex, String statuCode, boolean isHttpError) {
super(debugMessage, ex);
this.statusCode =statuCode;
this.isHttpError = isHttpError;
}
public String getStatusCode() {
return statusCode;
}
public void setStatusCode(String statusCode) {
this.statusCode = statusCode;
}
public boolean isHttpError() {
return isHttpError;
}
public void setHttpError(boolean httpError) {
isHttpError = httpError;
}
}
package com.nisum.offertransactionservice.handler;
import com.nisum.offertransactionservice.genericexception.GlobalApiGenericException;
import com.safeway.epe.exception.ExceptionResponseHandlerImpl;
import com.safeway.epe.model.Response;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.context.request.ServletWebRequest;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
@Order(Ordered.HIGHEST_PRECEDENCE)
@ControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
@Autowired
ExceptionResponseHandlerImpl exceptionResponseHandler;
@ExceptionHandler(GlobalApiGenericException.class)
protected ResponseEntity<Response> handleEntityNotFound(GlobalApiGenericException ex, WebRequest webRequest) {
Response ErrorResponse;
if(ex.isHttpError()){
ErrorResponse = exceptionResponseHandler.
createHttpErrorResponse(ex.getStatusCode(), "Http Error In Application",
ex, getUri((ServletWebRequest) webRequest), getHttpStatus(ex.getStatusCode()));
}else{
ErrorResponse = exceptionResponseHandler.
createApiErrorResponse(ex.getStatusCode(), "Search Result Not Found On Database",
ex, getUri((ServletWebRequest) webRequest), getHttpStatus(ex.getStatusCode()));
}
return new ResponseEntity<>(ErrorResponse,getHttpStatus(ex.getStatusCode()));
}
@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex,
HttpHeaders headers, HttpStatus status,
WebRequest request) {
final Response apiErrorResponse = exceptionResponseHandler.
createApiErrorResponse("400", "Search Result Not Found On Database",
ex, getUri((ServletWebRequest) request), getHttpStatus("400"));
return handleExceptionInternal(ex, apiErrorResponse, new HttpHeaders(), HttpStatus.BAD_REQUEST, request);
}
public HttpStatus getHttpStatus(String statusCode){
HttpStatus status = HttpStatus.INTERNAL_SERVER_ERROR;
if(statusCode.equalsIgnoreCase("400")){
status = HttpStatus.NOT_FOUND;
}
return status;
}
private String getUri(ServletWebRequest webRequest) {
return webRequest.getRequest().getRequestURL().toString();
}
}
package com.nisum.offertransactionservice.handler; package com.nisum.offertransactionservice.handler;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.client.ClientHttpResponse; import org.springframework.http.client.ClientHttpResponse;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
...@@ -7,27 +8,39 @@ import org.springframework.web.client.ResponseErrorHandler; ...@@ -7,27 +8,39 @@ import org.springframework.web.client.ResponseErrorHandler;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.net.URI;
import java.util.Scanner;
@Component @Component
public class MyResponseErrorHandler implements ResponseErrorHandler { public class MyResponseErrorHandler implements ResponseErrorHandler {
@Override @Override
public void handleError(ClientHttpResponse clienthttpresponse) throws IOException { public boolean hasError(ClientHttpResponse clientHttpResponse) throws IOException {
HttpStatus status = clientHttpResponse.getStatusCode();
InputStream body = clienthttpresponse.getBody(); return status.is4xxClientError() || status.is5xxServerError();
}
@Override
public void handleError(ClientHttpResponse clientHttpResponse) throws IOException {
String responseAsString = toString(clientHttpResponse.getBody());
throw new CustomException(responseAsString);
} }
@Override @Override
public boolean hasError(ClientHttpResponse clienthttpresponse) throws IOException { public void handleError(URI url, HttpMethod method, ClientHttpResponse response) throws IOException {
String responseAsString = toString(response.getBody());
throw new CustomException(responseAsString);
}
if (clienthttpresponse.getStatusCode() != HttpStatus.OK) { String toString(InputStream inputStream) {
return true; Scanner s = new Scanner(inputStream).useDelimiter("\\A");
return s.hasNext() ? s.next() : "";
}
static class CustomException extends IOException {
public CustomException(String message) {
super(message);
} }
return false;
} }
} }
...@@ -2,17 +2,22 @@ package com.nisum.offertransactionservice.service; ...@@ -2,17 +2,22 @@ package com.nisum.offertransactionservice.service;
import com.nisum.offertransactionservice.converter.OfferConverter; import com.nisum.offertransactionservice.converter.OfferConverter;
import com.nisum.offertransactionservice.converter.PEResponseToOfferTransactionResConverter; import com.nisum.offertransactionservice.converter.PEResponseToOfferTransactionResConverter;
import com.nisum.offertransactionservice.dao.OfferDao;
import com.nisum.offertransactionservice.dao.OfferLookupRepo; import com.nisum.offertransactionservice.dao.OfferLookupRepo;
import com.nisum.offertransactionservice.model.*; import com.nisum.offertransactionservice.model.*;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.client.RestClientResponseException;
import org.springframework.web.client.RestTemplate;
import java.util.List; import java.util.List;
import static com.google.common.collect.Lists.newArrayList; import static com.google.common.collect.Lists.newArrayList;
@Service @Service
@PropertySource("classpath:application.properties")
public class OfferCallingPEService { public class OfferCallingPEService {
@Autowired @Autowired
private OfferConverter offerConverter; private OfferConverter offerConverter;
...@@ -20,21 +25,41 @@ public class OfferCallingPEService { ...@@ -20,21 +25,41 @@ public class OfferCallingPEService {
@Autowired @Autowired
private OfferLookupRepo offerLookupRepo; private OfferLookupRepo offerLookupRepo;
@Autowired
private OfferDao offerDao;
@Autowired @Autowired
private PEResponseToOfferTransactionResConverter peResponseToOfferTransactionResConverter; private PEResponseToOfferTransactionResConverter peResponseToOfferTransactionResConverter;
@Autowired
private RestTemplate restTemplate;
@Value("${promotion.engine.calculate.discount.url}")
private String promotionEngineUrl ;
public OfferTransactionResponse getDiscountedItemList(OfferTransactionRequest offerTransactionRequest) { public OfferTransactionResponse getDiscountedItemList(OfferTransactionRequest offerTransactionRequest) {
List<OfferLookup> eligibleOffer = newArrayList(); List<OfferLookup> eligibleOffer = newArrayList();
offerLookupRepo.findAll().forEach(eligibleOffer::add); offerLookupRepo.findAll().forEach(eligibleOffer::add);
OfferTransactionResponse offerTransactionResponse ; OfferTransactionResponse offerTransactionResponse =null;
//TODO validate whether we got the offers from DB or not //TODO validate whether we got the offers from DB or not
//TODO DB call success or not //TODO DB call success or not
PERequest peRequest = offerConverter.apply(offerTransactionRequest); PERequest peRequest = offerConverter.apply(offerTransactionRequest);
peRequest.setEligibleOffers(eligibleOffer); peRequest.setEligibleOffers(eligibleOffer);
PEResponse peResponse = offerDao.callPE(peRequest); ResponseEntity<Object> peResponse = getPeResponseResponseEntity(peRequest);
offerTransactionResponse = peResponseToOfferTransactionResConverter.apply(peResponse); if(peResponse.getBody() instanceof PEResponse){
offerTransactionResponse = peResponseToOfferTransactionResConverter.apply((PEResponse)peResponse.getBody());
}
return offerTransactionResponse; return offerTransactionResponse;
} }
private ResponseEntity<Object> getPeResponseResponseEntity(PERequest peRequest) {
try{
restTemplate.postForEntity("http://localhost:8081"+promotionEngineUrl,peRequest,PEResponse.class);
}catch(RestClientResponseException e){
return ResponseEntity
.status(e.getRawStatusCode())
.body(e.getResponseBodyAsString());
}
return null;
}
} }
package com.nisum.offertransactionservice.converter;
import com.nisum.offertransactionservice.model.Item;
import com.nisum.offertransactionservice.model.OfferTransactionRequest;
import com.nisum.offertransactionservice.model.PERequest;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.MockitoAnnotations;
import org.mockito.junit.MockitoJUnitRunner;
import java.util.ArrayList;
import java.util.List;
@RunWith(MockitoJUnitRunner.class)
public class OfferConverterTest {
@InjectMocks
private OfferConverter offerConverter = new OfferConverter();
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
}
@Test
public void offerConverterTest() {
PERequest peRequest = offerConverter.apply(getOfferTransactionRequest());
Assert.assertEquals(peRequest, getPEReq());
}
private PERequest getPEReq() {
PERequest peRequest = new PERequest();
peRequest.setHhId("123");
List<Item> itemList = new ArrayList<>();
Item item1 = new Item("Coke", "12", 13.05, "cmsCoupons");
Item item2 = new Item("Thumpsup", "11", 14.05, "cmsCoupons");
itemList.add(item1);
itemList.add(item2);
peRequest.setItemList(itemList);
/*OfferLookup offerLookup1 = new OfferLookup("1","12","234","02","AND","BOGO");
OfferLookup offerLookup2 = new OfferLookup("2","13","234","02","OR","BXGY");
List<OfferLookup> offerLookups = new ArrayList<>();
offerLookups.add(offerLookup1);
offerLookups.add(offerLookup2);
peRequest.setEligibleOffers(offerLookups);*/
return peRequest;
}
private OfferTransactionRequest getOfferTransactionRequest() {
OfferTransactionRequest offerTransactionRequest = new OfferTransactionRequest();
offerTransactionRequest.setHhId("123");
List<Item> itemList = new ArrayList<>();
Item item1 = new Item("Coke", "12", 13.05, "cmsCoupons");
Item item2 = new Item("Thumpsup", "11", 14.05, "cmsCoupons");
itemList.add(item1);
itemList.add(item2);
offerTransactionRequest.setItemList(itemList);
return offerTransactionRequest;
}
}
package com.nisum.offertransactionservice.converter;
import com.nisum.offertransactionservice.model.Item;
import com.nisum.offertransactionservice.model.OfferTransactionResponse;
import com.nisum.offertransactionservice.model.PERequest;
import com.nisum.offertransactionservice.model.PEResponse;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.MockitoAnnotations;
import org.mockito.junit.MockitoJUnitRunner;
import java.util.ArrayList;
import java.util.List;
@RunWith(MockitoJUnitRunner.class)
public class PEResponseToOfferTransactionResConverterTest {
@InjectMocks
private PEResponseToOfferTransactionResConverter peResponseToOfferTransactionResConverter = new PEResponseToOfferTransactionResConverter();
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
}
@Test
public void offerConverterTest() {
OfferTransactionResponse offerTransactionResponse = peResponseToOfferTransactionResConverter.apply(getPeResponse());
Assert.assertEquals(offerTransactionResponse, retOfferTransRes());
}
private OfferTransactionResponse retOfferTransRes() {
OfferTransactionResponse offerTransactionResponse = new OfferTransactionResponse();
offerTransactionResponse.setHhid("123");
List<Item> itemList = new ArrayList<>();
Item item1 = new Item("Coke", "12", 6.05, "cmsCoupons");
Item item2 = new Item("Thumpsup", "11", 12.32, "cmsCoupons");
itemList.add(item1);
itemList.add(item2);
offerTransactionResponse.setDiscountedItemList(itemList);
return offerTransactionResponse;
}
private PEResponse getPeResponse() {
PEResponse peResponse = new PEResponse();
peResponse.setHhid("123");
List<Item> itemList = new ArrayList<>();
Item item1 = new Item("Coke", "12", 6.05, "cmsCoupons");
Item item2 = new Item("Thumpsup", "11", 12.32, "cmsCoupons");
itemList.add(item1);
itemList.add(item2);
peResponse.setDiscountedItemList(itemList);
return peResponse;
}
}
//package com.nisum.offertransactionservice.service;
//
//import com.nisum.offertransactionservice.converter.OfferConverter;
//import com.nisum.offertransactionservice.converter.PEResponseToOfferTransactionResConverter;
//import com.nisum.offertransactionservice.dao.OfferLookupRepo;
//import com.nisum.offertransactionservice.model.*;
//import org.junit.Assert;
//import org.junit.Before;
//import org.junit.Test;
//import org.junit.runner.RunWith;
//import org.mockito.*;
//import org.mockito.junit.MockitoJUnitRunner;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.context.annotation.PropertySource;
//import org.springframework.http.HttpStatus;
//import org.springframework.http.ResponseEntity;
//import org.springframework.test.context.ContextConfiguration;
//import org.springframework.test.context.TestPropertySource;
//import org.springframework.test.util.ReflectionTestUtils;
//import org.springframework.web.client.RestTemplate;
//
//import java.util.ArrayList;
//import java.util.List;
//import java.util.stream.Collectors;
//
//@RunWith(MockitoJUnitRunner.class)
//@PropertySource("classpath:application-test.yml")
//public class OfferServiceTest {
//
// @Mock
// private RestTemplate restTemplate;
//
// @Mock
// private OfferConverter offerConverter;
//
// @Mock
// private OfferLookupRepo offerLookupRepo;
//
// @Mock
// private PEResponseToOfferTransactionResConverter peResponseToOfferTransactionResConverter;
//
// @InjectMocks
// private OfferCallingPEService offerCallingPEService = new OfferCallingPEService();
//
// @Value("${promotion.engine.calculate.discount.url}")
// private String promotionEngineUrl ;
//
// @Before
// public void setUp() throws Exception {
// MockitoAnnotations.initMocks(this);
// }
//
// @Test
// public void serviceTest() {
// ReflectionTestUtils.setField(springJunitService, "securityKey", "it's a security key");
// OfferTransactionRequest offerTransactionRequest = getOfferTransactionRequest();
// Mockito.when(offerLookupRepo.findAll()).thenReturn(returnOffers());
// Mockito.when(offerConverter.apply(getOfferTransactionRequest())).thenReturn(getPEReq());
// Mockito.when(restTemplate.postForEntity("http://localhost:8081"+promotionEngineUrl,getPEReq(), PEResponse.class))
// .thenReturn(new ResponseEntity<PEResponse>(getPeResponse(), HttpStatus.OK));
// Mockito.when(peResponseToOfferTransactionResConverter.apply(getPeResponse())).thenReturn(retOfferTransRes());
//
// OfferTransactionResponse offerTransactionResponse = offerCallingPEService.getDiscountedItemList(offerTransactionRequest);
// Assert.assertEquals(offerTransactionResponse,retOfferTransRes());
// }
//
// private OfferTransactionResponse retOfferTransRes() {
// OfferTransactionResponse offerTransactionResponse = new OfferTransactionResponse();
// offerTransactionResponse.setHhid("123");
// List<Item> itemList = new ArrayList<>();
// Item item1 = new Item("Coke","12",6.05,"cmsCoupons");
// Item item2 = new Item("Thumpsup","11",12.32,"cmsCoupons");
// itemList.add(item1);
// itemList.add(item2);
// offerTransactionResponse.setDiscountedItemList(itemList);
// return offerTransactionResponse;
// }
//
// private PEResponse getPeResponse(){
// PEResponse peResponse = new PEResponse();
// peResponse.setHhid("123");
// List<Item> itemList = new ArrayList<>();
// Item item1 = new Item("Coke","12",6.05,"cmsCoupons");
// Item item2 = new Item("Thumpsup","11",12.32,"cmsCoupons");
// itemList.add(item1);
// itemList.add(item2);
// peResponse.setDiscountedItemList(itemList);
// return peResponse;
// }
//
// private PERequest getPEReq() {
// PERequest peRequest = new PERequest();
// peRequest.setHhId("123");
// List<Item> itemList = new ArrayList<>();
// Item item1 = new Item("Coke","12",13.05,"cmsCoupons");
// Item item2 = new Item("Thumpsup","11",14.05,"cmsCoupons");
// itemList.add(item1);
// itemList.add(item2);
// peRequest.setItemList(itemList);
// /*OfferLookup offerLookup1 = new OfferLookup("1","12","234","02","AND","BOGO");
// OfferLookup offerLookup2 = new OfferLookup("2","13","234","02","OR","BXGY");
// List<OfferLookup> offerLookups = new ArrayList<>();
// offerLookups.add(offerLookup1);
// offerLookups.add(offerLookup2);
// peRequest.setEligibleOffers(offerLookups);*/
// return peRequest;
// }
//
// private OfferTransactionRequest getOfferTransactionRequest() {
// OfferTransactionRequest offerTransactionRequest = new OfferTransactionRequest();
// offerTransactionRequest.setHhId("123");
// List<Item> itemList = new ArrayList<>();
// Item item1 = new Item("Coke", "12", 13.05, "cmsCoupons");
// Item item2 = new Item("Thumpsup", "11", 14.05, "cmsCoupons");
// itemList.add(item1);
// itemList.add(item2);
// offerTransactionRequest.setItemList(itemList);
// return offerTransactionRequest;
// }
//
// public Iterable<OfferLookup> returnOffers() {
// OfferLookup offerLookup1 = new OfferLookup("1", "12", "234", "02", "AND", "BOGO");
// OfferLookup offerLookup2 = new OfferLookup("2", "13", "234", "02", "OR", "BXGY");
// List<OfferLookup> offerLookups = new ArrayList<>();
// offerLookups.add(offerLookup1);
// offerLookups.add(offerLookup2);
// return offerLookups.stream().collect(Collectors.toList());
// }
//}
promotion.engine.calculate.discount.url=/promotionEngine/calculateDiscount
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment