package com.genpt.net.barcode.service; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.genpt.common.SplunkLogger; import com.genpt.net.barcode.config.EliteConfig; import com.genpt.net.barcode.config.TamsConfig; import com.genpt.net.barcode.model.*; import lombok.Getter; import lombok.Setter; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.*; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.http.client.support.BasicAuthorizationInterceptor; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; import javax.net.ssl.SSLContext; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import com.genpt.common.NFuseSSLHttpConnection; @Getter @Setter @Service("BarcodeService") public class BarcodeServiceImpl implements BarcodeService { private SiteService siteService; private static final Logger LOGGER = LoggerFactory.getLogger(BarcodeServiceImpl.class); @Autowired TamsConfig tamsConfig; @Autowired EliteConfig eliteConfig; @Autowired public void setSiteService(SiteService siteService){ this.siteService = siteService; } @Override public boolean lookup(LookupBarcodeServiceRequest lookupBarcodeServiceRequest) { String storeIP = null; long time = System.currentTimeMillis(); boolean needRetry = false; //initialize splunk logger SplunkLogger splunkLogger = new SplunkLogger(); splunkLogger.addKVP("Correlation ID", lookupBarcodeServiceRequest.getHeader().getCorrelationId()); splunkLogger.addKVP("RequestorApplication", lookupBarcodeServiceRequest.getHeader().getRequestor().getRequestorApplication()); splunkLogger.addKVP("Component", "LookupBarcodeService"); //get the POS type first Site site = null; try { site = siteService.getSite("9 Digit Store Number", lookupBarcodeServiceRequest.getHeader().getResponder().get(0).getResponderIdentifiers().getValue(), null); }catch(Exception exSite){ LOGGER.error(splunkLogger.toString() + " Lookup barcode NSight Site Cassandra Exception: {} , Time Taken {} ms ",exSite.getMessage(), ( System.currentTimeMillis() - time)); return true;// exit } if (site != null && site.getSiteDTO()!=null && site.getSiteDTO().size() >0) { //implemented only for TAMS if (site.getSiteDTO().get(0).getPosType().compareToIgnoreCase("TAMS") == 0) { // get the store ip try { storeIP = siteService.getStoreIP(site.getSiteDTO().get(0).getAliasValue()); }catch (Exception exStoreIP){ LOGGER.error(splunkLogger.toString() + " Lookup barcode NSight Store IP Cassandra Exception: {} , Time Taken {} ms ",exStoreIP.getMessage(), ( System.currentTimeMillis() - time)); return true;// exit } splunkLogger.addKVP("StoreNumber", site.getSiteDTO().get(0).getAliasValue()); if (storeIP != null) { String finalURL = "http://" + storeIP + ":" + tamsConfig.getPort() + tamsConfig.getLookupUri(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON)); HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(); factory.setReadTimeout(tamsConfig.getTimeout()); factory.setConnectTimeout(tamsConfig.getTimeout() / 2); RestTemplate restTemplate = new RestTemplate(factory); ObjectMapper objectMapper = new ObjectMapper(); objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); String jsonStr = null; try { jsonStr = objectMapper.writeValueAsString(lookupBarcodeServiceRequest); HttpEntity requestToTams = new HttpEntity(jsonStr, headers); LOGGER.info(splunkLogger.toString() + " lookup barcode to TAMS URL: {} , Request: {} , Timeout: {} ", finalURL, jsonStr, tamsConfig.getTimeout()); String response = null; try { response = restTemplate.postForObject(finalURL, requestToTams, String.class); } catch (Exception ex) {// need retry LOGGER.error(splunkLogger.toString() + " Lookup barcode TAMS Exception: {} , Time Taken {} ms ", ex.getMessage(), (System.currentTimeMillis() - time)); needRetry = true; } LOGGER.info(splunkLogger.toString() + " Lookup barcode from TAMS Response: {} , Time Taken {} ms ", response, (System.currentTimeMillis() - time)); TamsBarcodeServiceResponse barcodeServiceResponseTams = objectMapper.readValue(response, TamsBarcodeServiceResponse.class); // send the response to elite needRetry = invokeElite(barcodeServiceResponseTams, splunkLogger);// if true that means it failed } catch (Exception e) { TamsBarcodeServiceResponse tamsBarcodeServiceResponse = new TamsBarcodeServiceResponse(); populateLookupHeader(tamsBarcodeServiceResponse, lookupBarcodeServiceRequest); //populate Tracking tamsBarcodeServiceResponse.setCorrelationId(lookupBarcodeServiceRequest.getHeader().getCorrelationId()); tamsBarcodeServiceResponse.setTracking(new TamsBarcodeServiceResponse.Tracking()); tamsBarcodeServiceResponse.getTracking().setIsSuccess(false); tamsBarcodeServiceResponse.getTracking().setFault(new TamsBarcodeServiceResponse.Tracking.Fault()); tamsBarcodeServiceResponse.getTracking().getFault().setCode(e.getMessage()); tamsBarcodeServiceResponse.getTracking().getFault().setStackTrace(e.getStackTrace().toString()); invokeElite(tamsBarcodeServiceResponse, splunkLogger); LOGGER.error(splunkLogger.toString() + " Lookup barcode Exception: {} , Time Taken {} ms ", e.getMessage(), (System.currentTimeMillis() - time)); //e.printStackTrace(); } }else{//non retriable TamsBarcodeServiceResponse barcodeServiceResponse = new TamsBarcodeServiceResponse(); populateLookupHeader(barcodeServiceResponse,lookupBarcodeServiceRequest); barcodeServiceResponse.setCorrelationId(lookupBarcodeServiceRequest.getHeader().getCorrelationId()); barcodeServiceResponse.setTracking(new TamsBarcodeServiceResponse.Tracking()); barcodeServiceResponse.getTracking().setIsSuccess(false); barcodeServiceResponse.getTracking().setLog(new TamsBarcodeServiceResponse.Tracking.Log()); barcodeServiceResponse.getTracking().getLog().setName("3003"); barcodeServiceResponse.getTracking().getLog().setValue("TAMS Store IP does not exist"); invokeElite(barcodeServiceResponse,splunkLogger); } }else{ //non Tams or non rpm TamsBarcodeServiceResponse barcodeServiceResponse = new TamsBarcodeServiceResponse(); populateLookupHeader(barcodeServiceResponse,lookupBarcodeServiceRequest); barcodeServiceResponse.setCorrelationId(lookupBarcodeServiceRequest.getHeader().getCorrelationId()); barcodeServiceResponse.setTracking(new TamsBarcodeServiceResponse.Tracking()); barcodeServiceResponse.getTracking().setIsSuccess(false); barcodeServiceResponse.getTracking().setLog(new TamsBarcodeServiceResponse.Tracking.Log()); barcodeServiceResponse.getTracking().getLog().setName("3001"); if (site.getSiteDTO().get(0).getPosType().compareToIgnoreCase("RPM")==0) barcodeServiceResponse.getTracking().getLog().setValue("Barcode Services do not exist for RPM"); else barcodeServiceResponse.getTracking().getLog().setValue("Not a TAMS or RPM store"); invokeElite(barcodeServiceResponse,splunkLogger); } }else{ //site not found TamsBarcodeServiceResponse barcodeServiceResponse = new TamsBarcodeServiceResponse(); populateLookupHeader(barcodeServiceResponse,lookupBarcodeServiceRequest); barcodeServiceResponse.setCorrelationId(lookupBarcodeServiceRequest.getHeader().getCorrelationId()); barcodeServiceResponse.setTracking(new TamsBarcodeServiceResponse.Tracking()); barcodeServiceResponse.getTracking().setIsSuccess(false); barcodeServiceResponse.getTracking().setLog(new TamsBarcodeServiceResponse.Tracking.Log()); barcodeServiceResponse.getTracking().getLog().setName("3003"); barcodeServiceResponse.getTracking().getLog().setValue("Site ID does not exist"); invokeElite(barcodeServiceResponse,splunkLogger); } return needRetry; } public boolean invokeElite(TamsBarcodeServiceResponse barcodeServiceResponseTams, SplunkLogger splunkLogger ){ long time = System.currentTimeMillis(); boolean needretry = false; String finalURL = eliteConfig.getUrl(); String username = eliteConfig.getUsername(); String password = eliteConfig.getPassword(); CloseableHttpClient httpClient = null; try { //create an instance of nsight common and get an instance of httpclient and set this in the HttpComponentsClientHttpRequestFactory NFuseSSLHttpConnection nFuseSSLHttpConnection = new NFuseSSLHttpConnection(); httpClient = nFuseSSLHttpConnection.getTrustAllHttpsClient(); if (httpClient != null) { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(); factory.setHttpClient(httpClient); factory.setReadTimeout(eliteConfig.getTimeout()); factory.setConnectTimeout(eliteConfig.getTimeout()); RestTemplate restTemplate = new RestTemplate(factory); restTemplate.getInterceptors().add(new BasicAuthorizationInterceptor(username, password)); ObjectMapper objectMapper = new ObjectMapper(); objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); String jsonStr = objectMapper.writeValueAsString(barcodeServiceResponseTams); LOGGER.info(splunkLogger.toString() + " Lookup Barcode Elite URL: {} , Request: {} , Timeout: {} ", finalURL, jsonStr, eliteConfig.getTimeout()); HttpEntity httpEntity = new HttpEntity(jsonStr, headers); ResponseEntity responseEntity = null; try { responseEntity = restTemplate.exchange(finalURL, HttpMethod.POST, httpEntity, String.class); String response = responseEntity.getBody(); LOGGER.info(splunkLogger.toString() + " Lookup Barcode Elite Response: {} , Time Taken {} ms ", response, (System.currentTimeMillis() - time)); } catch (Exception ex) {//retriable LOGGER.error(splunkLogger.toString() + " Lookup Barcode Elite Http Exception: {} , Time Taken {} ms ", ex.getMessage(), (System.currentTimeMillis() - time)); needretry = true; } }else{ LOGGER.error(splunkLogger.toString() + " Not able to create a https connection for Lookup Barcode Elite, Time Taken {} ms ", (System.currentTimeMillis() - time)); } }catch(Exception e){//non retriable LOGGER.error(splunkLogger.toString() + " Lookup Barcode Elite Exception: {} , Time Taken {} ms ", e.getMessage(), (System.currentTimeMillis() - time)); }finally{ if (httpClient!=null) { try { httpClient.close(); } catch (IOException e) { LOGGER.error(splunkLogger.toString() + " HttpClient close Exception: {} ", e.getMessage()); } } } return needretry; } @Override public ScanBarcodeServiceResponse scan(BarcodeServiceRequest request) { String storeIP = null; long time = System.currentTimeMillis(); ScanBarcodeServiceResponse scanBarcodeServiceResponse = null; SplunkLogger splunkLogger = new SplunkLogger(); splunkLogger.addKVP("Correlation ID", request.getHeader().getCorrelationId()); splunkLogger.addKVP("RequestorApplication", request.getHeader().getRequestor().getRequestorApplication()); splunkLogger.addKVP("Component", "ScanBarcodeService"); //get the POS type first Site site = siteService.getSite("9 Digit Store Number", request.getHeader().getResponder().getResponderIdentifiers().get(0).getValue(), null); if (site != null && site.getSiteDTO()!=null && site.getSiteDTO().size() >0) { //implemented only for TAMS if (site.getSiteDTO().get(0).getPosType().compareToIgnoreCase("TAMS") == 0) { // get the store ip storeIP = siteService.getStoreIP(site.getSiteDTO().get(0).getAliasValue()); splunkLogger.addKVP("StoreNumber", site.getSiteDTO().get(0).getAliasValue()); String finalURL = "http://"+storeIP+":"+tamsConfig.getPort()+tamsConfig.getScanUri(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON)); HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(); factory.setReadTimeout(tamsConfig.getTimeout()); factory.setConnectTimeout(tamsConfig.getTimeout() / 2); RestTemplate restTemplate = new RestTemplate(factory); ObjectMapper objectMapper = new ObjectMapper(); objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); try { //create a request for TAMS since it expects responder identifier not as an array BarcodeServiceRequestTams barcodeServiceRequestTams = new BarcodeServiceRequestTams(); barcodeServiceRequestTams.setDetailRequest(request.getDetailRequest()); barcodeServiceRequestTams.setAction(request.getAction()); barcodeServiceRequestTams.setHeader(new HeaderTams()); barcodeServiceRequestTams.getHeader().setRequestor(request.getHeader().getRequestor()); barcodeServiceRequestTams.getHeader().setCorrelationId(request.getHeader().getCorrelationId()); barcodeServiceRequestTams.getHeader().setCountryCode(request.getHeader().getCountryCode()); barcodeServiceRequestTams.getHeader().setTimestamp(request.getHeader().getTimestamp()); barcodeServiceRequestTams.getHeader().setLanguageCode(request.getHeader().getLanguageCode()); barcodeServiceRequestTams.getHeader().setResponder(new ArrayList<>()); ResponderTams responderTams = new ResponderTams(); barcodeServiceRequestTams.getHeader().getResponder().add(responderTams); barcodeServiceRequestTams.getHeader().getResponder().get(0).setResponderType(request.getHeader().getResponder().getResponderType()); barcodeServiceRequestTams.getHeader().getResponder().get(0).setResponderApplication(request.getHeader().getResponder().getResponderApplication()); barcodeServiceRequestTams.getHeader().getResponder().get(0).setResponderIdentifiers(new ResponderIdentifier()); barcodeServiceRequestTams.getHeader().getResponder().get(0).getResponderIdentifiers().setType(request.getHeader().getResponder().getResponderIdentifiers().get(0).getType()); barcodeServiceRequestTams.getHeader().getResponder().get(0).getResponderIdentifiers().setValue(request.getHeader().getResponder().getResponderIdentifiers().get(0).getValue()); String jsonStr = objectMapper.writeValueAsString(barcodeServiceRequestTams); HttpEntity requestToTams = new HttpEntity(jsonStr, headers); LOGGER.info(splunkLogger.toString() + " Scan barcode to TAMS URL: {} , Request: {} , Timeout: {} ",finalURL, jsonStr, tamsConfig.getTimeout()); String response = restTemplate.postForObject(finalURL, requestToTams, String.class); ScanBarcodeServiceResponseTams scanBarcodeServiceResponseFromTams = objectMapper.readValue(response, ScanBarcodeServiceResponseTams.class); //transform from tams response to service response scanBarcodeServiceResponse = new ScanBarcodeServiceResponse(); populateScanHeader(scanBarcodeServiceResponse,request); scanBarcodeServiceResponse.setDetailResponse(scanBarcodeServiceResponseFromTams.getDetailResponse()); scanBarcodeServiceResponse.setCorrelationId(scanBarcodeServiceResponseFromTams.getCorrelationId()); scanBarcodeServiceResponse.setTracking(new ScanBarcodeServiceResponse.Tracking()); scanBarcodeServiceResponse.getTracking().setIsSuccess(scanBarcodeServiceResponseFromTams.getTracking().getIsSuccess()); LOGGER.info(splunkLogger.toString() + " Scan barcode from TAMS Response: {} , Time Taken {} ms ",response, ( System.currentTimeMillis() - time)); } catch (Exception e) { scanBarcodeServiceResponse = new ScanBarcodeServiceResponse(); populateScanHeader(scanBarcodeServiceResponse,request); //populate Tracking scanBarcodeServiceResponse.setCorrelationId(request.getHeader().getCorrelationId()); scanBarcodeServiceResponse.setTracking(new ScanBarcodeServiceResponse.Tracking()); scanBarcodeServiceResponse.getTracking().setIsSuccess(false); scanBarcodeServiceResponse.getTracking().setFault(new ScanBarcodeServiceResponse.Tracking.Fault()); scanBarcodeServiceResponse.getTracking().getFault().setCode(e.getMessage()); scanBarcodeServiceResponse.getTracking().getFault().setStackTrace(e.getStackTrace().toString()); //e.printStackTrace(); LOGGER.error(splunkLogger.toString() + " Scan barcode Exception: {} , Time Taken {} ms ",e.getMessage(), ( System.currentTimeMillis() - time)); } } else { //this is a RPM or non napa store scanBarcodeServiceResponse = new ScanBarcodeServiceResponse(); populateScanHeader(scanBarcodeServiceResponse,request); scanBarcodeServiceResponse.setCorrelationId(request.getHeader().getCorrelationId()); scanBarcodeServiceResponse.setTracking(new ScanBarcodeServiceResponse.Tracking()); scanBarcodeServiceResponse.getTracking().setIsSuccess(false); scanBarcodeServiceResponse.getTracking().setLog(new ScanBarcodeServiceResponse.Tracking.Log()); scanBarcodeServiceResponse.getTracking().getLog().setName("3001"); if (site.getSiteDTO().get(0).getPosType().compareToIgnoreCase("RPM")==0) scanBarcodeServiceResponse.getTracking().getLog().setValue("Barcode Services do not exist for RPM"); else scanBarcodeServiceResponse.getTracking().getLog().setValue("Not a TAMS or RPM store"); } }else{ //site not found scanBarcodeServiceResponse = new ScanBarcodeServiceResponse(); populateScanHeader(scanBarcodeServiceResponse,request); scanBarcodeServiceResponse.setCorrelationId(request.getHeader().getCorrelationId()); scanBarcodeServiceResponse.setTracking(new ScanBarcodeServiceResponse.Tracking()); scanBarcodeServiceResponse.getTracking().setIsSuccess(false); scanBarcodeServiceResponse.getTracking().setLog(new ScanBarcodeServiceResponse.Tracking.Log()); scanBarcodeServiceResponse.getTracking().getLog().setName("3003"); scanBarcodeServiceResponse.getTracking().getLog().setValue("Site ID does not exist"); } //finally return the response return scanBarcodeServiceResponse; } public void populateScanHeader(ScanBarcodeServiceResponse scanBarcodeServiceResponse, BarcodeServiceRequest request){ scanBarcodeServiceResponse.setHeaderResponse(new ScanBarcodeServiceResponse.HeaderResponse()); scanBarcodeServiceResponse.getHeaderResponse().setCountryCode(request.getHeader().getCountryCode()); scanBarcodeServiceResponse.getHeaderResponse().setLanguageCode(request.getHeader().getLanguageCode()); scanBarcodeServiceResponse.getHeaderResponse().setTimestamp(request.getHeader().getTimestamp()); scanBarcodeServiceResponse.getHeaderResponse().setResponder(new ScanBarcodeServiceResponse.HeaderResponse.Responder()); scanBarcodeServiceResponse.getHeaderResponse().getResponder().setResponderType(request.getHeader().getResponder().getResponderType()); scanBarcodeServiceResponse.getHeaderResponse().getResponder().setResponderApplication(request.getHeader().getResponder().getResponderApplication()); scanBarcodeServiceResponse.getHeaderResponse().getResponder().setResponderIdentifier(new ScanBarcodeServiceResponse.HeaderResponse.Responder.ResponderIdentifier()); scanBarcodeServiceResponse.getHeaderResponse().getResponder().getResponderIdentifier().setType(request.getHeader().getResponder().getResponderIdentifiers().get(0).getType()); scanBarcodeServiceResponse.getHeaderResponse().getResponder().getResponderIdentifier().setValue(request.getHeader().getResponder().getResponderIdentifiers().get(0).getValue()); scanBarcodeServiceResponse.getHeaderResponse().setRequestor(new ScanBarcodeServiceResponse.HeaderResponse.Requestor()); scanBarcodeServiceResponse.getHeaderResponse().getRequestor().setRequestorType(request.getHeader().getRequestor().getRequestorType()); scanBarcodeServiceResponse.getHeaderResponse().getRequestor().setRequestorApplication(request.getHeader().getRequestor().getRequestorApplication()); } public void populateLookupHeader(TamsBarcodeServiceResponse lookupBarcodeServiceResponse, LookupBarcodeServiceRequest request){ lookupBarcodeServiceResponse.setHeaderResponse(new TamsBarcodeServiceResponse.HeaderResponse()); lookupBarcodeServiceResponse.getHeaderResponse().setCountryCode(request.getHeader().getCountryCode()); lookupBarcodeServiceResponse.getHeaderResponse().setLanguageCode(request.getHeader().getLanguageCode()); lookupBarcodeServiceResponse.getHeaderResponse().setTimestamp(request.getHeader().getTimestamp()); lookupBarcodeServiceResponse.getHeaderResponse().setResponder(new ArrayList<>()); TamsBarcodeServiceResponse.HeaderResponse.Responder responder = new TamsBarcodeServiceResponse.HeaderResponse.Responder(); lookupBarcodeServiceResponse.getHeaderResponse().getResponder().add(responder); responder.setResponderType(request.getHeader().getResponder().get(0).getResponderType()); responder.setResponderApplication(request.getHeader().getResponder().get(0).getResponderApplication()); responder.setResponderIdentifier(new TamsBarcodeServiceResponse.HeaderResponse.Responder.ResponderIdentifier()); responder.getResponderIdentifier().setType(request.getHeader().getResponder().get(0).getResponderIdentifiers().getType()); responder.getResponderIdentifier().setValue(request.getHeader().getResponder().get(0).getResponderIdentifiers().getValue()); lookupBarcodeServiceResponse.getHeaderResponse().setRequestor(new TamsBarcodeServiceResponse.HeaderResponse.Requestor()); lookupBarcodeServiceResponse.getHeaderResponse().getRequestor().setRequestorType(request.getHeader().getRequestor().getRequestorType()); lookupBarcodeServiceResponse.getHeaderResponse().getRequestor().setRequestorApplication(request.getHeader().getRequestor().getRequestorApplication()); } }