| 1 | package edu.ucsb.cs156.dining.services; | |
| 2 | ||
| 3 | import com.fasterxml.jackson.databind.ObjectMapper; | |
| 4 | ||
| 5 | import java.time.OffsetDateTime; | |
| 6 | import java.time.format.DateTimeFormatter; | |
| 7 | import java.util.Arrays; | |
| 8 | import lombok.extern.slf4j.Slf4j; | |
| 9 | import org.springframework.beans.factory.annotation.Autowired; | |
| 10 | import org.springframework.beans.factory.annotation.Value; | |
| 11 | import org.springframework.boot.web.client.RestTemplateBuilder; | |
| 12 | import org.springframework.http.HttpEntity; | |
| 13 | import org.springframework.http.HttpHeaders; | |
| 14 | import org.springframework.http.HttpMethod; | |
| 15 | import org.springframework.http.HttpStatus; | |
| 16 | import org.springframework.http.MediaType; | |
| 17 | import org.springframework.http.ResponseEntity; | |
| 18 | import org.springframework.stereotype.Service; | |
| 19 | import org.springframework.web.client.HttpClientErrorException; | |
| 20 | import org.springframework.web.client.HttpServerErrorException; | |
| 21 | import org.springframework.web.client.RestTemplate; | |
| 22 | import org.springframework.web.server.ResponseStatusException; | |
| 23 | ||
| 24 | @Service | |
| 25 | @Slf4j | |
| 26 | public class DiningMenuAPIService { | |
| 27 |   @Value("${app.startDate:2024-01-01T00:00:00-08:00}") | |
| 28 |   private OffsetDateTime startDate; | |
| 29 | ||
| 30 |   @Value("${app.endDate:2024-12-31T23:59:59-08:00}") | |
| 31 |   private OffsetDateTime endDate; | |
| 32 | ||
| 33 |   @Autowired private ObjectMapper objectMapper; | |
| 34 | ||
| 35 |   @Value("${app.ucsb.api.key}") | |
| 36 |   private String apiKey; | |
| 37 | ||
| 38 |   private RestTemplate restTemplate; | |
| 39 | ||
| 40 |   public DiningMenuAPIService(RestTemplateBuilder restTemplateBuilder) throws Exception { | |
| 41 |     this.restTemplate = restTemplateBuilder.build(); | |
| 42 |   } | |
| 43 | ||
| 44 |   public static final String GET_DAYS = | |
| 45 |       "https://api.ucsb.edu/dining/menu/v1/"; | |
| 46 | ||
| 47 |   public static final String GET_COMMONS = | |
| 48 |       "https://api.ucsb.edu/dining/menu/v1/{date-time}"; | |
| 49 | ||
| 50 |   public static final String GET_MEALS = | |
| 51 |       "https://api.ucsb.edu/dining/menu/v1/{date-time}/{dining-common-code}"; | |
| 52 | ||
| 53 |   public String getDays() throws Exception { | |
| 54 |     HttpHeaders headers = new HttpHeaders(); | |
| 55 | 
1
1. getDays : removed call to org/springframework/http/HttpHeaders::setAccept → KILLED | 
    headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON)); | 
| 56 | 
1
1. getDays : removed call to org/springframework/http/HttpHeaders::setContentType → KILLED | 
    headers.setContentType(MediaType.APPLICATION_JSON); | 
| 57 | 
1
1. getDays : removed call to org/springframework/http/HttpHeaders::set → KILLED | 
    headers.set("ucsb-api-version", "1.0"); | 
| 58 | 
1
1. getDays : removed call to org/springframework/http/HttpHeaders::set → KILLED | 
    headers.set("ucsb-api-key", this.apiKey); | 
| 59 | ||
| 60 |     HttpEntity<String> entity = new HttpEntity<>("body", headers); | |
| 61 | ||
| 62 |     String url = GET_DAYS; | |
| 63 |     log.info("url=" + url); | |
| 64 | ||
| 65 |     String retVal = ""; | |
| 66 |     MediaType contentType = null; | |
| 67 |     HttpStatus statusCode = null; | |
| 68 | ||
| 69 |     ResponseEntity<String> re = restTemplate.exchange(url, HttpMethod.GET, entity, String.class); | |
| 70 |     contentType = re.getHeaders().getContentType(); | |
| 71 |     statusCode = (HttpStatus) re.getStatusCode(); | |
| 72 |     retVal = re.getBody(); | |
| 73 | ||
| 74 |     log.info("json: {} contentType: {} statusCode: {}", retVal, contentType, statusCode); | |
| 75 | 
1
1. getDays : replaced return value with "" for edu/ucsb/cs156/dining/services/DiningMenuAPIService::getDays → KILLED | 
    return retVal; | 
| 76 |   } | |
| 77 | ||
| 78 |   public String getCommons(OffsetDateTime dateTime) { | |
| 79 |     HttpHeaders headers = new HttpHeaders(); | |
| 80 | 
1
1. getCommons : removed call to org/springframework/http/HttpHeaders::setAccept → KILLED | 
    headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON)); | 
| 81 | 
1
1. getCommons : removed call to org/springframework/http/HttpHeaders::setContentType → KILLED | 
    headers.setContentType(MediaType.APPLICATION_JSON); | 
| 82 | 
1
1. getCommons : removed call to org/springframework/http/HttpHeaders::set → KILLED | 
    headers.set("ucsb-api-version", "1.0"); | 
| 83 | 
1
1. getCommons : removed call to org/springframework/http/HttpHeaders::set → KILLED | 
    headers.set("ucsb-api-key", this.apiKey); | 
| 84 | ||
| 85 |     HttpEntity<String> entity = new HttpEntity<>("body", headers); | |
| 86 | ||
| 87 |     DateTimeFormatter formatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME; | |
| 88 |     String formattedDateTime = dateTime.format(formatter); | |
| 89 | ||
| 90 |     String url = GET_COMMONS | |
| 91 |                 .replace("{date-time}", formattedDateTime); | |
| 92 | ||
| 93 |     log.info("url=" + url); | |
| 94 | ||
| 95 |     String retVal = ""; | |
| 96 |     MediaType contentType = null; | |
| 97 |     HttpStatus statusCode = null; | |
| 98 | ||
| 99 |     ResponseEntity<String> re = | |
| 100 |         restTemplate.exchange(url, HttpMethod.GET, entity, String.class); | |
| 101 |     contentType = re.getHeaders().getContentType(); | |
| 102 |     statusCode = (HttpStatus) re.getStatusCode(); | |
| 103 |     retVal = re.getBody(); | |
| 104 | ||
| 105 | 
1
1. getCommons : negated conditional → KILLED | 
    if (retVal.equals("null")) | 
| 106 |     { | |
| 107 |       retVal = "{\"error\": \"Commons doesn't serve meals on given day.\"}"; | |
| 108 |     } | |
| 109 | ||
| 110 |     log.info("json: {} contentType: {} statusCode: {}", retVal, contentType, statusCode); | |
| 111 | 
1
1. getCommons : replaced return value with "" for edu/ucsb/cs156/dining/services/DiningMenuAPIService::getCommons → KILLED | 
    return retVal; | 
| 112 |   }  | |
| 113 | ||
| 114 |   public String getMeals(OffsetDateTime dateTime, String diningCommonCode) { | |
| 115 |     HttpHeaders headers = new HttpHeaders(); | |
| 116 | 
1
1. getMeals : removed call to org/springframework/http/HttpHeaders::setAccept → KILLED | 
    headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON)); | 
| 117 | 
1
1. getMeals : removed call to org/springframework/http/HttpHeaders::setContentType → KILLED | 
    headers.setContentType(MediaType.APPLICATION_JSON); | 
| 118 | 
1
1. getMeals : removed call to org/springframework/http/HttpHeaders::set → KILLED | 
    headers.set("ucsb-api-version", "1.0"); | 
| 119 | 
1
1. getMeals : removed call to org/springframework/http/HttpHeaders::set → KILLED | 
    headers.set("ucsb-api-key", this.apiKey); | 
| 120 | ||
| 121 |     HttpEntity<String> entity = new HttpEntity<>("body", headers); | |
| 122 | ||
| 123 |     DateTimeFormatter formatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME; | |
| 124 |     String formattedDateTime = dateTime.format(formatter); | |
| 125 | ||
| 126 |     String url = GET_MEALS | |
| 127 |                 .replace("{date-time}", formattedDateTime) | |
| 128 |                 .replace("{dining-common-code}", diningCommonCode); | |
| 129 | ||
| 130 |     log.info("url=" + url); | |
| 131 | ||
| 132 |     String retVal = ""; | |
| 133 |     MediaType contentType = null; | |
| 134 |     HttpStatus statusCode = null; | |
| 135 | ||
| 136 |     ResponseEntity<String> re = | |
| 137 |         restTemplate.exchange(url, HttpMethod.GET, entity, String.class); | |
| 138 |     contentType = re.getHeaders().getContentType(); | |
| 139 |     statusCode = (HttpStatus) re.getStatusCode(); | |
| 140 |     retVal = re.getBody(); | |
| 141 | ||
| 142 | 
1
1. getMeals : negated conditional → KILLED | 
    if (retVal.equals("null")) | 
| 143 |     { | |
| 144 |       retVal = "{\"error\": \"Meals are not served at given commons on given day.\"}"; | |
| 145 |     } | |
| 146 | ||
| 147 |       log.info("json: {} contentType: {} statusCode: {}", retVal, contentType, statusCode); | |
| 148 | 
1
1. getMeals : replaced return value with "" for edu/ucsb/cs156/dining/services/DiningMenuAPIService::getMeals → KILLED | 
      return retVal; | 
| 149 |   }  | |
| 150 | } | |
Mutations | ||
| 55 | 
 
 1.1  | 
|
| 56 | 
 
 1.1  | 
|
| 57 | 
 
 1.1  | 
|
| 58 | 
 
 1.1  | 
|
| 75 | 
 
 1.1  | 
|
| 80 | 
 
 1.1  | 
|
| 81 | 
 
 1.1  | 
|
| 82 | 
 
 1.1  | 
|
| 83 | 
 
 1.1  | 
|
| 105 | 
 
 1.1  | 
|
| 111 | 
 
 1.1  | 
|
| 116 | 
 
 1.1  | 
|
| 117 | 
 
 1.1  | 
|
| 118 | 
 
 1.1  | 
|
| 119 | 
 
 1.1  | 
|
| 142 | 
 
 1.1  | 
|
| 148 | 
 
 1.1  |