Implemented FRQ1 in Spring Project

  • Completed all methods
  • used Random generated valued for methods where code was un-implemented
  • Created API endpoints for each method
  • Link to Spring Project

Complete/Enhance and Methods in APCalendar

public class APCalendar {
        
    public static boolean isLeapYear(int year) {

        if ( (year % 4 == 0) && (year % 100 != 0)){
            return true;
        }
        else if ( year % 400 == 0 ){
            return true;
        }
        else {
            return false;
        }

        }
    
    public static int numberOfLeapYears(int year1, int year2) {
       
        int numOfLeapYears = 0; // initialize final count variable
        for(int i = year1; i <= year2; i++){ // for loop that starts at the year1 number and goes until year 2 including it
            if(isLeapYear(i)){  // if the year is a leap year, add 1 to the count
                numOfLeapYears += 1;
            }
        }
        return numOfLeapYears; // return the count

        }
        
    public static int firstDayOfYear(int year) {

        return year = (int) Math.floor( Math.random() * 7 );

        }


    public static int dayOfYear(int month, int day, int year) {
        
        return (int) (Math.random() * (366 - 1)) + 1;
    
        }

    public static int dayOfWeek(int month, int day, int year) { 
      
        int startDay = firstDayOfYear(year);
        int selectedDay = dayOfYear(month, day, year);
        int returnDay = (startDay + selectedDay - 1) % 7;
        return returnDay;
        
        }

    /** Tester method */
    public static void main(String[] args) {
       
        // Private access modifiers
        System.out.println("\n \n firstDayOfYear: " + APCalendar.firstDayOfYear(2022));

        System.out.println("\n dayOfYear: " + APCalendar.dayOfYear(1, 1, 2022));

        // Public access modifiers
        System.out.println("\n Testing isLeapYear:");

        System.out.println("\n isLeapYear 2022: " + APCalendar.isLeapYear(2022));
        System.out.println("\n isLeapYear 2000: " + APCalendar.isLeapYear(2000));
        System.out.println("\n isLeapYear 3000: " + APCalendar.isLeapYear(3000));


        System.out.println("\n numberOfLeapYears: " + APCalendar.numberOfLeapYears(2000, 2022));

        System.out.println("\n dayOfWeek: " + APCalendar.dayOfWeek(1, 1, 2022));
    }

}

APCalendar.main(null);
 
 firstDayOfYear: 6

 dayOfYear: 317

 Testing isLeapYear:

 isLeapYear 2022: false

 isLeapYear 2000: true

 isLeapYear 3000: false

 numberOfLeapYears: 6

 dayOfWeek: 0

Enhance APIs and @RESTController - Work With all POJOs and Methods in APCalendar

@RestController
@RequestMapping("/api/calendar")
public class CalendarApiController {

    /** GET isLeapYear endpoint
     * ObjectMapper throws exceptions on bad JSON
     *  @throws JsonProcessingException
     *  @throws JsonMappingException
     */
    @GetMapping("/isLeapYear/{year}")
    public ResponseEntity<JsonNode> getIsLeapYear(@PathVariable int year) throws JsonMappingException, JsonProcessingException {
      // Backend Year Object
      Year year_obj = new Year();
      year_obj.setYear(year);  // evaluates Leap Year

      // Turn Year Object into JSON
      ObjectMapper mapper = new ObjectMapper(); 
      JsonNode json = mapper.readTree(year_obj.isLeapYearToString()); // this requires exception handling

      return ResponseEntity.ok(json);  // JSON response, see ExceptionHandlerAdvice for throws
    }

    @GetMapping("/firstDayOfYear/{year}")
    public ResponseEntity<JsonNode> getFirstDayOfYear(@PathVariable int year) throws JsonMappingException, JsonProcessingException {
      // Backend Year Object
      Year year_obj2 = new Year();
      year_obj2.setFirstDayOfYear(year);

      // Turn Year Object into JSON
      ObjectMapper mapper = new ObjectMapper(); 
      JsonNode json = mapper.readTree(year_obj2.firstDayOfYearToString()); // this requires exception handling

      return ResponseEntity.ok(json);  // JSON response, see ExceptionHandlerAdvice for throws
    }

    @GetMapping("/numberOfLeapYears/{year1}/{year2}")
    public ResponseEntity<JsonNode> getNumberOfLeapYears(@PathVariable("year1") int year1, @PathVariable("year2") int year2) throws JsonMappingException, JsonProcessingException {
      // Backend Year Object
      Year year_obj3 = new Year();
      year_obj3.setNumberOfLeapYears(year1, year2);

      // Turn Year Object into JSON
      ObjectMapper mapper = new ObjectMapper(); 
      JsonNode json = mapper.readTree(year_obj3.numberOfLeapYearsToString()); // this requires exception handling

      return ResponseEntity.ok(json);  // JSON response, see ExceptionHandlerAdvice for throws
    }

    @GetMapping("/dayOfYear/{month}/{day}/{year}")
    public ResponseEntity<JsonNode> getDayOfYear(@PathVariable("month") int month, @PathVariable("day") int day,  @PathVariable("year") int year) throws JsonMappingException, JsonProcessingException {
      // Backend Year Object
      Year year_obj4 = new Year();
      year_obj4.setDayOfYear(month, day, year);

      // Turn Year Object into JSON
      ObjectMapper mapper = new ObjectMapper(); 
      JsonNode json = mapper.readTree(year_obj4.dayOfYearToString()); // this requires exception handling

      return ResponseEntity.ok(json);  // JSON response, see ExceptionHandlerAdvice for throws
    }
    
    @GetMapping("/dayOfWeek/{month}/{day}/{year}")
    public ResponseEntity<JsonNode> getDayOfWeek(@PathVariable("month") int month, @PathVariable("day") int day,  @PathVariable("year") int year) throws JsonMappingException, JsonProcessingException {
      // Backend Year Object
      Year year_obj5 = new Year();
      year_obj5.setDayOfWeek(month, day, year);

      // Turn Year Object into JSON
      ObjectMapper mapper = new ObjectMapper(); 
      JsonNode json = mapper.readTree(year_obj5.dayOfWeekToString()); // this requires exception handling

      return ResponseEntity.ok(json);  // JSON response, see ExceptionHandlerAdvice for throws
    }
}

Creating Getters/Setters/ToString for all Methods

/* firstDayOfYear getter/setters */
public int getFirstDayOfYear(int year) {
    return APCalendar.firstDayOfYear(year);
 }
 public void setFirstDayOfYear(int year) {  // this is private to avoid tampering
    this.firstDayOfYear = APCalendar.firstDayOfYear(year);
 }

 public String firstDayOfYearToString(){
    return ( "{ \"firstDayOfYear\": "  + this.firstDayOfYear + " }" );
 }	

 /* numberOfLeapYears getter/setters */
 public int getNumberOfLeapYears(int year1, int year2) {
    return APCalendar.numberOfLeapYears(year1, year2);
 }
 public void setNumberOfLeapYears(int year1, int year2) {  // this is private to avoid tampering
    this.numberOfLeapYears = APCalendar.numberOfLeapYears(year1, year2);
 }

 public String numberOfLeapYearsToString(){
    return ( "{ \"numberOfLeapYears\": "  + this.numberOfLeapYears + " }" );
 }	

 /* dayOfYear getter/setters */
 public int dayOfYear(int month, int day, int year) {
    return APCalendar.dayOfYear(month, day, year);
 }
 public void setDayOfYear(int month, int day, int year) {  // this is private to avoid tampering
    this.dayOfYear = APCalendar.dayOfYear(month, day, year);
 }

 public String dayOfYearToString(){
    return ( "{ \"dayOfYear\": "  + this.dayOfYear + " }" );
 }	

 /* dayOfWeek getter/setters */
 public int dayOfWeek(int month, int day, int year) {
    return APCalendar.dayOfWeek(month, day, year);
 }
 public void setDayOfWeek(int month, int day, int year) {  // this is private to avoid tampering
    this.dayOfWeek = APCalendar.dayOfWeek(month, day, year);
 }

 public String dayOfWeekToString(){
    return ( "{ \"dayOfWeek\": "  + this.dayOfWeek + " }" );
 }

Testing API Using Curl

Testing API Using Browser

Testing API Using Postman

Using Debugger

  • Checking each iteration step to make sure numberOfLeapYears algorithm is correct
  • helped fix for loop count and syntax errors