From 55d29ff9f5e42684686119e66f73c337a0f24e2e Mon Sep 17 00:00:00 2001 From: mikeleo03 Date: Mon, 24 Jun 2024 23:49:22 +0700 Subject: [PATCH 01/23] [Refactor] Fix on Assignment 05 --- .../Lecture 03/Assignment 05/ListToMap.java | 14 ++-- Week 02/Lecture 03/Assignment 05/README.md | 14 +++- .../Assignment 05/RemoveDuplicates.java | 70 ++++++++++++++---- .../Lecture 03/Assignment 05/img/Task5.png | Bin 14919 -> 8283 bytes 4 files changed, 77 insertions(+), 21 deletions(-) diff --git a/Week 02/Lecture 03/Assignment 05/ListToMap.java b/Week 02/Lecture 03/Assignment 05/ListToMap.java index 686f587..de47030 100644 --- a/Week 02/Lecture 03/Assignment 05/ListToMap.java +++ b/Week 02/Lecture 03/Assignment 05/ListToMap.java @@ -1,7 +1,7 @@ import java.util.Arrays; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; +import java.util.TreeMap; // Assume Employee class with fields: int employeeID, String name, String department class Employee { @@ -46,11 +46,15 @@ public static void main(String[] args) { new Employee(3, "Charlie", "Finance") ); - // Convert List to Map using employeeID as key - Map employeeMap = employees.stream() - .collect(Collectors.toMap(Employee::getEmployeeID, emp -> emp)); + // Creating employeeMap using TreeMap + Map employeesMap = new TreeMap<>(); + + // Convert List to Map + for (Employee emp : employees){ + employeesMap.put(emp.getEmployeeID(), emp.getName()); + } // Print the resulting Map - employeeMap.forEach((id, emp) -> System.out.println("Employee ID: " + id + ", Employee: " + emp)); + employeesMap.forEach((id, emp) -> System.out.println("Employee ID: " + id + ", Employee: " + emp)); } } \ No newline at end of file diff --git a/Week 02/Lecture 03/Assignment 05/README.md b/Week 02/Lecture 03/Assignment 05/README.md index 6769ca7..55b8de1 100644 --- a/Week 02/Lecture 03/Assignment 05/README.md +++ b/Week 02/Lecture 03/Assignment 05/README.md @@ -80,7 +80,7 @@ To remove duplicate lines from a file: 4. **Writing Unique Lines**: Write only those lines to a new file that haven't been seen before (not in the `HashSet`). #### 📋 Case CSV Content -In this program, i use CSV file [`input.csv`](/Week%2002%20-%20Jun%2017-21/Lecture%2003/Assignment%205/data/input.csv) with content like this. +In this program, i use CSV file [`input.csv`](/Week%2002/Lecture%2003/Assignment%2005/RemoveDuplicates.java) with content like this. ```csv employeeID,name,department 1,Alice,HR @@ -106,6 +106,16 @@ Detail implementation is written on [this code](/Week%2002%20-%20Jun%2017-21/Lec The output of the program shows on this [`output.csv`](/Week%2002%20-%20Jun%2017-21/Lecture%2003/Assignment%205/data/output.csv) +Here is how to run the updated code of program +```bash +$ java RemoveDuplicates +``` + +for example. +```bash +java RemoveDuplicates data/input.csv data/output.csv 0 +``` +
### 🖨️ Task 4 - Get a Shallow Copy of a `HashMap` @@ -166,7 +176,7 @@ Here i implement class `BankAccount` and `BankAccountDemo`. 3. **Use Java Streams for Transformation**: Utilize Java Streams API to transform the `List` into a `Map`. 4. **Collect into Map**: Use the `Collectors.toMap()` method to collect elements of the `List` into a `Map` using the specified key and value mappings. -Detail implementation is written on [this code](/Week%2002%20-%20Jun%2017-21/Lecture%2003/Assignment%205/ListToMap.java), and the output of the program shows like this. +Detail implementation is written on [this code](/Week%2002/Lecture%2003/Assignment%2005/ListToMap.java), and the output of the program shows like this (updated based on comment). ![Screenshot](img/Task5.png) diff --git a/Week 02/Lecture 03/Assignment 05/RemoveDuplicates.java b/Week 02/Lecture 03/Assignment 05/RemoveDuplicates.java index f364dd0..19287f7 100644 --- a/Week 02/Lecture 03/Assignment 05/RemoveDuplicates.java +++ b/Week 02/Lecture 03/Assignment 05/RemoveDuplicates.java @@ -3,29 +3,42 @@ import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; +import java.util.ArrayList; import java.util.HashSet; +import java.util.List; import java.util.Set; public class RemoveDuplicates { public static void main(String[] args) { - String inputFileName = "data/input.csv"; - String outputFileName = "data/output.csv"; - String delimiter = ","; // Parse CSV format - - // Set to store unique keys (employeeID in this case) + if (args.length < 3) { + System.out.println("Usage: java RemoveDuplicates "); + return; + } + + String inputFileName = args[0]; + String outputFileName = args[1]; + int keyFieldIndex; + try { + keyFieldIndex = Integer.parseInt(args[2]); + } catch (NumberFormatException e) { + System.out.println("Invalid keyFieldIndex. It must be an integer."); + return; + } + + // Set to store unique keys Set seenKeys = new HashSet<>(); - + try (BufferedReader reader = new BufferedReader(new FileReader(inputFileName)); PrintWriter writer = new PrintWriter(new FileWriter(outputFileName))) { String line; while ((line = reader.readLine()) != null) { - // Split the line into fields - String[] fields = line.split(delimiter); - - // Ensure there are enough fields and key field is valid - if (fields.length > 1) { - String key = fields[0]; // Assuming employeeID is the first field + // Properly split the line respecting quoted commas + String[] fields = parseCsvLine(line); + + // Ensure key field index is valid + if (fields.length > keyFieldIndex) { + String key = fields[keyFieldIndex]; if (!seenKeys.contains(key)) { seenKeys.add(key); // Add the key to set (marks as seen) writer.println(line); // Write the line to output @@ -36,7 +49,36 @@ public static void main(String[] args) { System.out.println("Duplicates removed successfully. Output written to " + outputFileName); } catch (IOException e) { - System.out.println("I/O Error occured:" + e); + System.out.println("I/O Error occurred: " + e); } } -} + + // Function to parse CSV line while handling commas within quotes + private static String[] parseCsvLine(String line) { + boolean inQuotes = false; + StringBuilder field = new StringBuilder(); + List fields = new ArrayList<>(); + + for (char c : line.toCharArray()) { + switch (c) { + case '"': + inQuotes = !inQuotes; // Toggle the inQuotes flag + break; + case ',': + if (inQuotes) { + field.append(c); // Inside quotes, include comma + } else { + fields.add(field.toString()); + field.setLength(0); // Reset the field buffer + } + break; + default: + field.append(c); // Add character to field buffer + break; + } + } + fields.add(field.toString()); // Add last field + + return fields.toArray(new String[0]); + } +} \ No newline at end of file diff --git a/Week 02/Lecture 03/Assignment 05/img/Task5.png b/Week 02/Lecture 03/Assignment 05/img/Task5.png index ec754bd052f5acbafcd8bbdde0561e8ac5e71835..620f6598358a0dfb43ff00ee9ee38be7242eb3fa 100644 GIT binary patch literal 8283 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 S Date: Mon, 24 Jun 2024 23:49:28 +0700 Subject: [PATCH 02/23] [Refactor] Fix on Assignment 06 --- Week 02/Lecture 04/Assignment 06/README.md | 21 ++++-- .../Assignment 06/RemoveDuplicatesCSV.java | 65 +++++++++++-------- 2 files changed, 53 insertions(+), 33 deletions(-) diff --git a/Week 02/Lecture 04/Assignment 06/README.md b/Week 02/Lecture 04/Assignment 06/README.md index 7a36c3c..26cad3a 100644 --- a/Week 02/Lecture 04/Assignment 06/README.md +++ b/Week 02/Lecture 04/Assignment 06/README.md @@ -119,11 +119,22 @@ Here’s a detailed process on how to remove duplicate lines from files based on 4. **Write the Output**: Write the processed, duplicate-free data to a new file. #### 👨🏻‍💻 Implementation -Detail implementation is written on [this code](/Week%2002%20-%20Jun%2017-21/Lecture%2004/Assignment%206/RemoveDuplicatesCSV.java). Here’s what the program actually done. -1. **Read All Lines**: `Files.readAllLines(Paths.get(inputFilePath))` reads the CSV file into a list of strings. -2. **Extract Header**: The first line is treated as the header to determine the key field's index. -3. **Stream Processing**: The stream skips the header, then collects lines into a map using the key field (`id`). If a duplicate key is found, the first occurrence is retained. -4. **Write Results**: The header is re-added, and the list is written to the new file. +Detail implementation is written on [this code](/Week%2002/Lecture%2004/Assignment%2006/RemoveDuplicatesCSV.java). Here’s what the program actually done (updated based on comment). +1. **Initialize Readers and Writers** + - `BufferedReader` is used to read the input CSV file line by line. + - `BufferedWriter` is used to write the unique lines to the output CSV file. +2. **Extract and Write Header** + - The first line, which is the header, is read using `reader.readLine()`. + - This header is written immediately to the output file using `writer.write(header)`. +3. **Determine Key Field Index** + - The header is split to determine the index of the key field (`id`). + - This is done by iterating through the headers to find the matching field. +4. **Stream Processing and Duplicate Removal** + - A `Set` is used to keep track of the keys that have already been processed. + - For each subsequent line, the key field's value is checked against the `Set`. If the key is unique, the line is written to the output file. +5. **Read and Write Lines** + - The program continues to read each line from the input file, splits it to get the key field, and checks the key against the `Set`. + - If the key is not in the `Set`, the line is written to the output file and the key is added to the `Set`. **Best Practices Highlighted** 1. **`BufferedReader` for Large Files**: Using `BufferedReader` with `lines()` streams data efficiently. diff --git a/Week 02/Lecture 04/Assignment 06/RemoveDuplicatesCSV.java b/Week 02/Lecture 04/Assignment 06/RemoveDuplicatesCSV.java index 77d29de..01e728e 100644 --- a/Week 02/Lecture 04/Assignment 06/RemoveDuplicatesCSV.java +++ b/Week 02/Lecture 04/Assignment 06/RemoveDuplicatesCSV.java @@ -1,10 +1,10 @@ import java.io.BufferedReader; +import java.io.BufferedWriter; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; +import java.util.HashSet; +import java.util.Set; public class RemoveDuplicatesCSV { public static void main(String[] args) { @@ -12,35 +12,44 @@ public static void main(String[] args) { String outputFilePath = "data/unique.csv"; String keyFieldName = "id"; - try (BufferedReader reader = Files.newBufferedReader(Paths.get(inputFilePath))) { - List lines = reader.lines().collect(Collectors.toList()); - if (lines.isEmpty()) return; + try (BufferedReader reader = Files.newBufferedReader(Paths.get(inputFilePath)); + BufferedWriter writer = Files.newBufferedWriter(Paths.get(outputFilePath))) { + + String header = reader.readLine(); + if (header == null) return; - // Extract header and determine the key field index - String header = lines.get(0); - List headers = Arrays.asList(header.split(",")); - int keyIndex = headers.indexOf(keyFieldName); - if (keyIndex == -1) throw new IllegalArgumentException("Invalid key field name"); + // Write header to the output file + writer.write(header); + writer.newLine(); - // Process lines and remove duplicates based on the key field - List uniqueLines = lines.stream() - .skip(1) // Skip header - .collect(Collectors.toMap( - line -> line.split(",")[keyIndex], // Use the key field - line -> line, // Use the line as value - (existing, replacement) -> existing // Keep the first occurrence - )) - .values() - .stream() - .collect(Collectors.toList()); + // Determine the key field index + String[] headers = header.split(","); + int keyIndex = -1; + for (int i = 0; i < headers.length; i++) { + if (headers[i].trim().equals(keyFieldName)) { + keyIndex = i; + break; + } + } + if (keyIndex == -1) throw new IllegalArgumentException("Invalid key field name"); - // Add header back to the list - uniqueLines.add(0, header); + // Use a Set to track unique keys + Set seenKeys = new HashSet<>(); - // Write the results to a new file - Files.write(Paths.get(outputFilePath), uniqueLines); + // Read and process each line + String line; + while ((line = reader.readLine()) != null) { + String[] fields = line.split(","); + if (fields.length > keyIndex) { + String key = fields[keyIndex]; + if (seenKeys.add(key)) { // Add returns false if the key was already present + writer.write(line); + writer.newLine(); + } + } + } } catch (IOException e) { - System.out.println("I/O Error occured:" + e); + System.out.println("I/O Error occurred: " + e); } } -} +} \ No newline at end of file From 2fbcaf58bd9de3a162d1c31e2b0efab7988d03f2 Mon Sep 17 00:00:00 2001 From: mikeleo03 Date: Mon, 29 Jul 2024 11:18:02 +0700 Subject: [PATCH 03/23] [Feat] Finishing Assignment 01 --- .gitignore | 3 +- Week 08/Lecture 13/Assignment 01/README.md | 111 +++++++++++++++++++++ 2 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 Week 08/Lecture 13/Assignment 01/README.md diff --git a/.gitignore b/.gitignore index 1de5659..794c788 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -target \ No newline at end of file +target +HELP.md \ No newline at end of file diff --git a/Week 08/Lecture 13/Assignment 01/README.md b/Week 08/Lecture 13/Assignment 01/README.md new file mode 100644 index 0000000..7868ac9 --- /dev/null +++ b/Week 08/Lecture 13/Assignment 01/README.md @@ -0,0 +1,111 @@ +# 👨🏻‍🏫 Lecture 13 - Spring Advance Feature: Filter and Spring Interceptor +> This repository is created as a part of assignment for Lecture 13 - Spring Advance Feature: Filter and Spring Interceptor + +## 🔍 Assignment 01 - Research about `onceperrequestfilter` + +### 🧐 Detailed Overview + +#### **What is a Filter?** +In the context of a Java web application, a filter is a component that performs tasks before or after a request is processed by a servlet. Filters can modify request and response objects, and they are useful for cross-cutting concerns like logging, authentication, and response modification. + +#### **Purpose of `OncePerRequestFilter`** +The `OncePerRequestFilter` class is designed to handle cases where filters might be executed multiple times for a single request due to forwarding or including requests. This ensures that a filter’s logic is only executed once per request, preventing redundant processing and potential performance issues. + +#### **How `OncePerRequestFilter` Works** + +1. **Filter Lifecycle** + + Filters in a web application are managed by the servlet container (e.g., Tomcat). The `OncePerRequestFilter` ensures that the `doFilterInternal` method is called only once per request. + +2. **Request Wrapping** + + When a request is forwarded or included, it might be wrapped in additional `ServletRequest` objects. `OncePerRequestFilter` ensures that the filtering logic is applied only once, even if the request has been wrapped multiple times. + +3. **Thread Safety** + + The `OncePerRequestFilter` class is designed to be thread-safe, meaning that its instance can be safely used across multiple threads handling different requests. + +### 👨🏻‍💻 **Advanced Example: Authentication Filter** + +Let’s create an advanced example of a filter that checks for a specific header in requests to enforce custom authentication. This example will include detailed aspects, such as handling exceptions and configuring the filter in a Spring Boot application. + +#### **Authentication Filter Example** + +1. **Create the Filter Class** + + ```java + import org.springframework.web.filter.OncePerRequestFilter; + + import javax.servlet.FilterChain; + import javax.servlet.FilterConfig; + import javax.servlet.ServletException; + import javax.servlet.ServletRequest; + import javax.servlet.ServletResponse; + import javax.servlet.http.HttpServletRequest; + import javax.servlet.http.HttpServletResponse; + import java.io.IOException; + + public class CustomAuthenticationFilter extends OncePerRequestFilter { + + private static final String AUTH_HEADER = "X-Custom-Auth"; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) + throws ServletException, IOException { + // Check for the custom authentication header + String authHeader = request.getHeader(AUTH_HEADER); + if (authHeader == null || !authHeader.equals("expectedValue")) { + // If the header is missing or incorrect, respond with an unauthorized status + response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized"); + return; + } + + // Continue the request-response chain if authentication is successful + filterChain.doFilter(request, response); + } + } + ``` + +2. **Register the Filter in Spring Boot Configuration** + + In Spring Boot, we can configure the filter either by using `FilterRegistrationBean` or by annotating a configuration class. + + ```java + import org.springframework.boot.web.servlet.FilterRegistrationBean; + import org.springframework.context.annotation.Bean; + import org.springframework.context.annotation.Configuration; + + @Configuration + public class FilterConfig { + + @Bean + public FilterRegistrationBean customAuthenticationFilter() { + FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); + registrationBean.setFilter(new CustomAuthenticationFilter()); + registrationBean.addUrlPatterns("/api/*"); // Apply filter to specific URL patterns + return registrationBean; + } + } + ``` + +### 🚀 **Explanation** +Here is the explanation on what i already made on the previous segment. + +1. **Filter Logic (`doFilterInternal` Method)** + - **Header Check**: The filter checks if the custom header `X-Custom-Auth` is present and has the expected value. + - **Unauthorized Response**: If the header is missing or incorrect, it sends a `401 Unauthorized` response and halts further processing. + - **Continue Chain**: If the header is valid, the request is passed down the filter chain. + +2. **Filter Registration** + - **FilterRegistrationBean**: This bean registers the filter with the Spring context. + - **addUrlPatterns("/api/*")**: Specifies that the filter should be applied to URLs that start with `/api/`. + +### 🔑 **Key Points** + +1. **Execution Control**: `OncePerRequestFilter` ensures the filter logic is applied once per request even if the request is forwarded or included multiple times. + +2. **Thread Safety**: You should be cautious about mutable state within your filter. Since filters are often accessed by multiple threads, any mutable state should be handled carefully. + +3. **Exception Handling**: It’s essential to handle exceptions gracefully within filters, especially when dealing with authentication or authorization, to avoid exposing sensitive information. + +4. **Configuration**: Filters can be configured to apply to specific URL patterns or to all requests, depending on your needs. \ No newline at end of file From e4569e1af337fa615ac4040d85ff148ae6c8b1c9 Mon Sep 17 00:00:00 2001 From: mikeleo03 Date: Mon, 29 Jul 2024 11:25:06 +0700 Subject: [PATCH 04/23] [Init] Initiate SpringBoot project --- .../Assignment 02/lecture_13/.gitignore | 33 +++ .../.mvn/wrapper/maven-wrapper.properties | 19 ++ .../Lecture 13/Assignment 02/lecture_13/mvnw | 259 ++++++++++++++++++ .../Assignment 02/lecture_13/mvnw.cmd | 149 ++++++++++ .../Assignment 02/lecture_13/pom.xml | 54 ++++ .../lecture_13/Lecture13Application.java | 13 + .../src/main/resources/application.properties | 1 + .../lecture_13/Lecture13ApplicationTests.java | 13 + 8 files changed, 541 insertions(+) create mode 100644 Week 08/Lecture 13/Assignment 02/lecture_13/.gitignore create mode 100644 Week 08/Lecture 13/Assignment 02/lecture_13/.mvn/wrapper/maven-wrapper.properties create mode 100644 Week 08/Lecture 13/Assignment 02/lecture_13/mvnw create mode 100644 Week 08/Lecture 13/Assignment 02/lecture_13/mvnw.cmd create mode 100644 Week 08/Lecture 13/Assignment 02/lecture_13/pom.xml create mode 100644 Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/Lecture13Application.java create mode 100644 Week 08/Lecture 13/Assignment 02/lecture_13/src/main/resources/application.properties create mode 100644 Week 08/Lecture 13/Assignment 02/lecture_13/src/test/java/com/example/lecture_13/Lecture13ApplicationTests.java diff --git a/Week 08/Lecture 13/Assignment 02/lecture_13/.gitignore b/Week 08/Lecture 13/Assignment 02/lecture_13/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/Week 08/Lecture 13/Assignment 02/lecture_13/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/Week 08/Lecture 13/Assignment 02/lecture_13/.mvn/wrapper/maven-wrapper.properties b/Week 08/Lecture 13/Assignment 02/lecture_13/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..8f96f52 --- /dev/null +++ b/Week 08/Lecture 13/Assignment 02/lecture_13/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,19 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +wrapperVersion=3.3.2 +distributionType=only-script +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.7/apache-maven-3.9.7-bin.zip diff --git a/Week 08/Lecture 13/Assignment 02/lecture_13/mvnw b/Week 08/Lecture 13/Assignment 02/lecture_13/mvnw new file mode 100644 index 0000000..d7c358e --- /dev/null +++ b/Week 08/Lecture 13/Assignment 02/lecture_13/mvnw @@ -0,0 +1,259 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.3.2 +# +# Optional ENV vars +# ----------------- +# JAVA_HOME - location of a JDK home dir, required when download maven via java source +# MVNW_REPOURL - repo url base for downloading maven distribution +# MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +# MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output +# ---------------------------------------------------------------------------- + +set -euf +[ "${MVNW_VERBOSE-}" != debug ] || set -x + +# OS specific support. +native_path() { printf %s\\n "$1"; } +case "$(uname)" in +CYGWIN* | MINGW*) + [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")" + native_path() { cygpath --path --windows "$1"; } + ;; +esac + +# set JAVACMD and JAVACCMD +set_java_home() { + # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched + if [ -n "${JAVA_HOME-}" ]; then + if [ -x "$JAVA_HOME/jre/sh/java" ]; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACCMD="$JAVA_HOME/jre/sh/javac" + else + JAVACMD="$JAVA_HOME/bin/java" + JAVACCMD="$JAVA_HOME/bin/javac" + + if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then + echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2 + echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2 + return 1 + fi + fi + else + JAVACMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v java + )" || : + JAVACCMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v javac + )" || : + + if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then + echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2 + return 1 + fi + fi +} + +# hash string like Java String::hashCode +hash_string() { + str="${1:-}" h=0 + while [ -n "$str" ]; do + char="${str%"${str#?}"}" + h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296)) + str="${str#?}" + done + printf %x\\n $h +} + +verbose() { :; } +[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; } + +die() { + printf %s\\n "$1" >&2 + exit 1 +} + +trim() { + # MWRAPPER-139: + # Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds. + # Needed for removing poorly interpreted newline sequences when running in more + # exotic environments such as mingw bash on Windows. + printf "%s" "${1}" | tr -d '[:space:]' +} + +# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties +while IFS="=" read -r key value; do + case "${key-}" in + distributionUrl) distributionUrl=$(trim "${value-}") ;; + distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;; + esac +done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties" +[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties" + +case "${distributionUrl##*/}" in +maven-mvnd-*bin.*) + MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ + case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in + *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;; + :Darwin*x86_64) distributionPlatform=darwin-amd64 ;; + :Darwin*arm64) distributionPlatform=darwin-aarch64 ;; + :Linux*x86_64*) distributionPlatform=linux-amd64 ;; + *) + echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2 + distributionPlatform=linux-amd64 + ;; + esac + distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip" + ;; +maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;; +*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;; +esac + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}" +distributionUrlName="${distributionUrl##*/}" +distributionUrlNameMain="${distributionUrlName%.*}" +distributionUrlNameMain="${distributionUrlNameMain%-bin}" +MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}" +MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")" + +exec_maven() { + unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || : + exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD" +} + +if [ -d "$MAVEN_HOME" ]; then + verbose "found existing MAVEN_HOME at $MAVEN_HOME" + exec_maven "$@" +fi + +case "${distributionUrl-}" in +*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;; +*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;; +esac + +# prepare tmp dir +if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then + clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; } + trap clean HUP INT TERM EXIT +else + die "cannot create temp dir" +fi + +mkdir -p -- "${MAVEN_HOME%/*}" + +# Download and Install Apache Maven +verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +verbose "Downloading from: $distributionUrl" +verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +# select .zip or .tar.gz +if ! command -v unzip >/dev/null; then + distributionUrl="${distributionUrl%.zip}.tar.gz" + distributionUrlName="${distributionUrl##*/}" +fi + +# verbose opt +__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR='' +[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v + +# normalize http auth +case "${MVNW_PASSWORD:+has-password}" in +'') MVNW_USERNAME='' MVNW_PASSWORD='' ;; +has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;; +esac + +if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then + verbose "Found wget ... using wget" + wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl" +elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then + verbose "Found curl ... using curl" + curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl" +elif set_java_home; then + verbose "Falling back to use Java to download" + javaSource="$TMP_DOWNLOAD_DIR/Downloader.java" + targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName" + cat >"$javaSource" <<-END + public class Downloader extends java.net.Authenticator + { + protected java.net.PasswordAuthentication getPasswordAuthentication() + { + return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() ); + } + public static void main( String[] args ) throws Exception + { + setDefault( new Downloader() ); + java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() ); + } + } + END + # For Cygwin/MinGW, switch paths to Windows format before running javac and java + verbose " - Compiling Downloader.java ..." + "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java" + verbose " - Running Downloader.java ..." + "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")" +fi + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +if [ -n "${distributionSha256Sum-}" ]; then + distributionSha256Result=false + if [ "$MVN_CMD" = mvnd.sh ]; then + echo "Checksum validation is not supported for maven-mvnd." >&2 + echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + elif command -v sha256sum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then + distributionSha256Result=true + fi + elif command -v shasum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then + distributionSha256Result=true + fi + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2 + echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + fi + if [ $distributionSha256Result = false ]; then + echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2 + echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2 + exit 1 + fi +fi + +# unzip and move +if command -v unzip >/dev/null; then + unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip" +else + tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar" +fi +printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url" +mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME" + +clean || : +exec_maven "$@" diff --git a/Week 08/Lecture 13/Assignment 02/lecture_13/mvnw.cmd b/Week 08/Lecture 13/Assignment 02/lecture_13/mvnw.cmd new file mode 100644 index 0000000..6f779cf --- /dev/null +++ b/Week 08/Lecture 13/Assignment 02/lecture_13/mvnw.cmd @@ -0,0 +1,149 @@ +<# : batch portion +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.3.2 +@REM +@REM Optional ENV vars +@REM MVNW_REPOURL - repo url base for downloading maven distribution +@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output +@REM ---------------------------------------------------------------------------- + +@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0) +@SET __MVNW_CMD__= +@SET __MVNW_ERROR__= +@SET __MVNW_PSMODULEP_SAVE=%PSModulePath% +@SET PSModulePath= +@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @( + IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B) +) +@SET PSModulePath=%__MVNW_PSMODULEP_SAVE% +@SET __MVNW_PSMODULEP_SAVE= +@SET __MVNW_ARG0_NAME__= +@SET MVNW_USERNAME= +@SET MVNW_PASSWORD= +@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*) +@echo Cannot start maven from wrapper >&2 && exit /b 1 +@GOTO :EOF +: end batch / begin powershell #> + +$ErrorActionPreference = "Stop" +if ($env:MVNW_VERBOSE -eq "true") { + $VerbosePreference = "Continue" +} + +# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties +$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl +if (!$distributionUrl) { + Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" +} + +switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) { + "maven-mvnd-*" { + $USE_MVND = $true + $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip" + $MVN_CMD = "mvnd.cmd" + break + } + default { + $USE_MVND = $false + $MVN_CMD = $script -replace '^mvnw','mvn' + break + } +} + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +if ($env:MVNW_REPOURL) { + $MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" } + $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')" +} +$distributionUrlName = $distributionUrl -replace '^.*/','' +$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$','' +$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain" +if ($env:MAVEN_USER_HOME) { + $MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain" +} +$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join '' +$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME" + +if (Test-Path -Path "$MAVEN_HOME" -PathType Container) { + Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME" + Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" + exit $? +} + +if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) { + Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl" +} + +# prepare tmp dir +$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile +$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir" +$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null +trap { + if ($TMP_DOWNLOAD_DIR.Exists) { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } + } +} + +New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null + +# Download and Install Apache Maven +Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +Write-Verbose "Downloading from: $distributionUrl" +Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +$webclient = New-Object System.Net.WebClient +if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) { + $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD) +} +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum +if ($distributionSha256Sum) { + if ($USE_MVND) { + Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." + } + Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash + if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) { + Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property." + } +} + +# unzip and move +Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null +Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null +try { + Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null +} catch { + if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) { + Write-Error "fail to move MAVEN_HOME" + } +} finally { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } +} + +Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" diff --git a/Week 08/Lecture 13/Assignment 02/lecture_13/pom.xml b/Week 08/Lecture 13/Assignment 02/lecture_13/pom.xml new file mode 100644 index 0000000..bf54c33 --- /dev/null +++ b/Week 08/Lecture 13/Assignment 02/lecture_13/pom.xml @@ -0,0 +1,54 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.3.2 + + + com.example + lecture_13 + 0.0.1-SNAPSHOT + lecture_13 + Demo project for Spring Boot + + + + + + + + + + + + + + + 21 + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/Lecture13Application.java b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/Lecture13Application.java new file mode 100644 index 0000000..3a73dac --- /dev/null +++ b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/Lecture13Application.java @@ -0,0 +1,13 @@ +package com.example.lecture_13; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Lecture13Application { + + public static void main(String[] args) { + SpringApplication.run(Lecture13Application.class, args); + } + +} diff --git a/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/resources/application.properties b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/resources/application.properties new file mode 100644 index 0000000..ffec01a --- /dev/null +++ b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.application.name=lecture_13 diff --git a/Week 08/Lecture 13/Assignment 02/lecture_13/src/test/java/com/example/lecture_13/Lecture13ApplicationTests.java b/Week 08/Lecture 13/Assignment 02/lecture_13/src/test/java/com/example/lecture_13/Lecture13ApplicationTests.java new file mode 100644 index 0000000..14fdbea --- /dev/null +++ b/Week 08/Lecture 13/Assignment 02/lecture_13/src/test/java/com/example/lecture_13/Lecture13ApplicationTests.java @@ -0,0 +1,13 @@ +package com.example.lecture_13; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class Lecture13ApplicationTests { + + @Test + void contextLoads() { + } + +} From f49a043fdbfbc17f0e36ca6179dae14e1576afa0 Mon Sep 17 00:00:00 2001 From: mikeleo03 Date: Mon, 29 Jul 2024 14:23:05 +0700 Subject: [PATCH 05/23] [Feat] Basic Customer CRUD --- .../Assignment 02/lecture_13/env.properties | 4 + .../Assignment 02/lecture_13/pom.xml | 74 ++++++++- .../Assignment 02/lecture_13/run.bat | 3 + .../Assignment 02/lecture_13/run.sh | 3 + .../example/lecture_13/config/WebConfig.java | 9 + .../controller/CustomerController.java | 154 ++++++++++++++++++ .../lecture_13/data/model/Customer.java | 51 ++++++ .../example/lecture_13/data/model/Status.java | 6 + .../data/repository/CustomerRepository.java | 18 ++ .../example/lecture_13/dto/CustomerDTO.java | 19 +++ .../lecture_13/dto/CustomerSaveDTO.java | 27 +++ .../lecture_13/dto/CustomerShowDTO.java | 16 ++ .../exception/BadRequestException.java | 7 + .../exception/DuplicateStatusException.java | 7 + .../exception/GlobalExceptionHandler.java | 77 +++++++++ .../exception/ResourceNotFoundException.java | 7 + .../lecture_13/mapper/CustomerMapper.java | 40 +++++ .../lecture_13/service/CustomerService.java | 35 ++++ .../service/impl/CustomerServiceImpl.java | 129 +++++++++++++++ .../src/main/resources/application.properties | 27 +++ .../lecture_13/src/main/resources/data.sql | 40 +++++ 21 files changed, 751 insertions(+), 2 deletions(-) create mode 100644 Week 08/Lecture 13/Assignment 02/lecture_13/env.properties create mode 100644 Week 08/Lecture 13/Assignment 02/lecture_13/run.bat create mode 100644 Week 08/Lecture 13/Assignment 02/lecture_13/run.sh create mode 100644 Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/config/WebConfig.java create mode 100644 Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/controller/CustomerController.java create mode 100644 Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/data/model/Customer.java create mode 100644 Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/data/model/Status.java create mode 100644 Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/data/repository/CustomerRepository.java create mode 100644 Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/dto/CustomerDTO.java create mode 100644 Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/dto/CustomerSaveDTO.java create mode 100644 Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/dto/CustomerShowDTO.java create mode 100644 Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/exception/BadRequestException.java create mode 100644 Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/exception/DuplicateStatusException.java create mode 100644 Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/exception/GlobalExceptionHandler.java create mode 100644 Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/exception/ResourceNotFoundException.java create mode 100644 Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/mapper/CustomerMapper.java create mode 100644 Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/service/CustomerService.java create mode 100644 Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/service/impl/CustomerServiceImpl.java create mode 100644 Week 08/Lecture 13/Assignment 02/lecture_13/src/main/resources/data.sql diff --git a/Week 08/Lecture 13/Assignment 02/lecture_13/env.properties b/Week 08/Lecture 13/Assignment 02/lecture_13/env.properties new file mode 100644 index 0000000..4a1afe3 --- /dev/null +++ b/Week 08/Lecture 13/Assignment 02/lecture_13/env.properties @@ -0,0 +1,4 @@ +DB_DATABASE=jdbc:mysql://localhost:3308/week8_lecture13?allowPublicKeyRetrieval=true&useSSL=false +DB_USER=root +DB_PASSWORD=Michaeleon16606_ +PORT=8080 \ No newline at end of file diff --git a/Week 08/Lecture 13/Assignment 02/lecture_13/pom.xml b/Week 08/Lecture 13/Assignment 02/lecture_13/pom.xml index bf54c33..7db908d 100644 --- a/Week 08/Lecture 13/Assignment 02/lecture_13/pom.xml +++ b/Week 08/Lecture 13/Assignment 02/lecture_13/pom.xml @@ -10,7 +10,7 @@ com.example lecture_13 - 0.0.1-SNAPSHOT + 1.0-SNAPSHOT lecture_13 Demo project for Spring Boot @@ -30,15 +30,85 @@ 21 + org.springframework.boot spring-boot-starter - org.springframework.boot spring-boot-starter-test test + + + org.springframework.boot + spring-boot-starter-web-services + + + org.springframework.boot + spring-boot-devtools + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + mysql + mysql-connector-java + 8.0.33 + runtime + + + + + org.projectlombok + lombok + + + + + org.springframework.boot + spring-boot-starter-validation + + + org.hibernate.validator + hibernate-validator + 8.0.0.Final + + + javax.validation + validation-api + 2.0.1.Final + + + + + org.mapstruct + mapstruct + 1.5.3.Final + + + org.mapstruct + mapstruct-processor + 1.5.3.Final + provided + + + + + javax.servlet + javax.servlet-api + 4.0.1 + provided + + + + + org.springdoc + springdoc-openapi-starter-webmvc-ui + 2.2.0 diff --git a/Week 08/Lecture 13/Assignment 02/lecture_13/run.bat b/Week 08/Lecture 13/Assignment 02/lecture_13/run.bat new file mode 100644 index 0000000..7f578be --- /dev/null +++ b/Week 08/Lecture 13/Assignment 02/lecture_13/run.bat @@ -0,0 +1,3 @@ +@echo off +echo Building and running the project with Maven... +mvn clean install && java -jar target/lecture_13-1.0-SNAPSHOT.jar \ No newline at end of file diff --git a/Week 08/Lecture 13/Assignment 02/lecture_13/run.sh b/Week 08/Lecture 13/Assignment 02/lecture_13/run.sh new file mode 100644 index 0000000..1596d33 --- /dev/null +++ b/Week 08/Lecture 13/Assignment 02/lecture_13/run.sh @@ -0,0 +1,3 @@ +#!/bin/bash +echo Building the project with Maven... +mvn clean install && java -jar target/lecture_13-1.0-SNAPSHOT.jar \ No newline at end of file diff --git a/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/config/WebConfig.java b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/config/WebConfig.java new file mode 100644 index 0000000..9e643f3 --- /dev/null +++ b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/config/WebConfig.java @@ -0,0 +1,9 @@ +package com.example.lecture_13.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.data.web.config.EnableSpringDataWebSupport; + +@Configuration +@EnableSpringDataWebSupport(pageSerializationMode = EnableSpringDataWebSupport.PageSerializationMode.VIA_DTO) +public class WebConfig { +} diff --git a/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/controller/CustomerController.java b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/controller/CustomerController.java new file mode 100644 index 0000000..3ba54e7 --- /dev/null +++ b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/controller/CustomerController.java @@ -0,0 +1,154 @@ +package com.example.lecture_13.controller; + +import java.util.UUID; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.example.lecture_13.data.model.Status; +import com.example.lecture_13.dto.CustomerDTO; +import com.example.lecture_13.dto.CustomerSaveDTO; +import com.example.lecture_13.dto.CustomerShowDTO; +import com.example.lecture_13.service.CustomerService; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import jakarta.validation.Valid; + +@RestController +@RequestMapping("/api/v1/customers") +@Validated +public class CustomerController { + + @Autowired + private CustomerService customerService; + + /** + * Retrieves all customers from the database. + * + * @param page The index of the page to retrieve. Defaults to 0. + * @param size The number of customers to retrieve per page. Defaults to 20. + * @return A {@link ResponseEntity} containing a {@link Page} of {@link CustomerShowDTO} objects representing the customers on the specified page. + * @apiNote If no customers are found, a {@link ResponseEntity} with status status code 204 (No Content) is returned. + */ + @Operation(summary = "Retrieve all Active Customers.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Customers retrieved successfully"), + @ApiResponse(responseCode = "204", description = "Customers not found") + }) + @GetMapping + public ResponseEntity> getAllCustomer(@RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "20") int size) { + Pageable pageable = PageRequest.of(page, size); + Page customerPage = customerService.findAllActiveCustomer(pageable); + + if (customerPage.isEmpty()) { + return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); + } + + return ResponseEntity.status(HttpStatus.OK).body(customerPage); + } + + /** + * Creates a new Customer. + * + * @param customerSaveDTO The CustomerSaveDTO object containing the details of the new customer to be created. + * @return A ResponseEntity containing the newly created CustomerDTO object and an HTTP status code of 201 (Created) upon successful creation. + */ + @Operation(summary = "Create a new Customer.") + @ApiResponses(value = { + @ApiResponse(responseCode = "201", description = "Customer created successfully") + }) + @PostMapping + public ResponseEntity createCustomer(@Valid @RequestBody CustomerSaveDTO customerSaveDTO) { + CustomerDTO customer = customerService.createCustomer(customerSaveDTO); + return ResponseEntity.status(HttpStatus.CREATED).body(customer); + } + + /** + * Updates an existing Customer with the provided CustomerSaveDTO object. + * + * @param id The unique identifier of the customer to be updated. + * @param customerSaveDTO The CustomerSaveDTO object containing the details of the updated customer. + * @return A ResponseEntity containing the updated CustomerDTO object and an HTTP status code of 200 (OK) upon successful update. + * @apiNote If the Customer with the given ID is not found, a ResponseEntity with status code 204 (No Content) is returned. + */ + @Operation(summary = "Update existing Customer.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Customer updated successfully"), + @ApiResponse(responseCode = "204", description = "Customer not found") + }) + @PutMapping(value = "/{id}") + public ResponseEntity updateCustomer(@PathVariable("id") UUID id, @Valid @RequestBody CustomerSaveDTO customerSaveDTO) { + CustomerDTO customer = customerService.updateCustomer(id, customerSaveDTO); + return ResponseEntity.status(HttpStatus.OK).body(customer); + } + + /** + * Updates an existing Customer's status from Deactive to Active. + * + * @param id The unique identifier of the Customer to be updated. + * @return A ResponseEntity containing the updated CustomerDTO object and an HTTP status code of 200 (OK) upon successful update. + * @apiNote If the Customer with the given ID is not found, a ResponseEntity with status code 204 (No Content) is returned. + */ + @Operation(summary = "Update existing Customer status from Deactive to Active.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Customer successfully activated"), + @ApiResponse(responseCode = "204", description = "Customer not found") + }) + @PutMapping(value = "/active/{id}") + public ResponseEntity updateCustomerStatusActive(@PathVariable("id") UUID id) { + CustomerDTO customer = customerService.updateCustomerStatus(id, Status.Active); + return ResponseEntity.status(HttpStatus.OK).body(customer); + } + + /** + * Updates an existing Customer's status from Active to Deactive. + * + * @param id The unique identifier of the Customer to be updated. + * @return A ResponseEntity containing the updated CustomerDTO object and an HTTP status code of 200 (OK) upon successful update. + * @apiNote If the Customer with the given ID is not found, a ResponseEntity with status code 204 (No Content) is returned. + */ + @Operation(summary = "Update existing Customer status from Active to Deactive.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Customer successfully deactivated"), + @ApiResponse(responseCode = "204", description = "Customer not found") + }) + @PutMapping(value = "/deactive/{id}") + public ResponseEntity updateCustomerStatusDeactive(@PathVariable("id") UUID id) { + CustomerDTO customer = customerService.updateCustomerStatus(id, Status.Deactive); + return ResponseEntity.status(HttpStatus.OK).body(customer); + } + + /** + * Deletes an existing Customer. + * + * @param id The unique identifier of the Customer to be deleted. + * @return A ResponseEntity with status code 200 (OK) upon successful deletion. + * @apiNote If the Customer with the given ID is not found, a ResponseEntity with status code 204 (No Content) is returned. + */ + @Operation(summary = "Delete an existing Customer.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Customer deleted successfully"), + @ApiResponse(responseCode = "204", description = "Customer not found") + }) + @DeleteMapping(value = "/{id}") + public ResponseEntity deleteCustomer(@PathVariable("id") UUID id) { + customerService.deleteCustomer(id); + return ResponseEntity.status(HttpStatus.OK).build(); + } +} \ No newline at end of file diff --git a/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/data/model/Customer.java b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/data/model/Customer.java new file mode 100644 index 0000000..9068525 --- /dev/null +++ b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/data/model/Customer.java @@ -0,0 +1,51 @@ +package com.example.lecture_13.data.model; + +import java.util.Date; +import java.util.UUID; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Pattern; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "Customer") +public class Customer { + + @Id + @Column(name = "ID", columnDefinition = "BINARY(16)", updatable = false, nullable = false) + @GeneratedValue(strategy = GenerationType.UUID) + private UUID id; + + @NotBlank(message = "Name is mandatory") + @Pattern(regexp = "^[a-zA-Z\\s]+$", message = "Name can only contain letters and spaces") + @Column(name = "name", nullable = false) + private String name; + + @NotBlank(message = "Phone is mandatory") + @Pattern(regexp = "^\\+62[0-9]{9,13}$", message = "Phone number must start with +62 and contain 9 to 13 digits") + @Column(name = "phoneNumber", nullable = false) + private String phoneNumber; + + @Enumerated(EnumType.STRING) + @Column(name = "status", nullable = false) + private Status status = Status.Active; + + @Column(name = "createdAt", nullable = false) + private Date createdAt; + + @Column(name = "updatedAt", nullable = false) + private Date updatedAt; +} \ No newline at end of file diff --git a/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/data/model/Status.java b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/data/model/Status.java new file mode 100644 index 0000000..0fe8cb5 --- /dev/null +++ b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/data/model/Status.java @@ -0,0 +1,6 @@ +package com.example.lecture_13.data.model; + +public enum Status { + Active, + Deactive +} diff --git a/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/data/repository/CustomerRepository.java b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/data/repository/CustomerRepository.java new file mode 100644 index 0000000..54f6310 --- /dev/null +++ b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/data/repository/CustomerRepository.java @@ -0,0 +1,18 @@ +package com.example.lecture_13.data.repository; + +import java.util.UUID; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import com.example.lecture_13.data.model.Customer; +import com.example.lecture_13.data.model.Status; + +@Repository +public interface CustomerRepository extends JpaRepository { + + // Find customer data by considering the status. + Page findByStatus(Status status, Pageable pageable); +} diff --git a/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/dto/CustomerDTO.java b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/dto/CustomerDTO.java new file mode 100644 index 0000000..a3081d5 --- /dev/null +++ b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/dto/CustomerDTO.java @@ -0,0 +1,19 @@ +package com.example.lecture_13.dto; + +import com.example.lecture_13.data.model.Status; + +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; + +import java.util.UUID; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class CustomerDTO { + private UUID Id; + private String name; + private String phoneNumber; + private Status status; +} diff --git a/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/dto/CustomerSaveDTO.java b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/dto/CustomerSaveDTO.java new file mode 100644 index 0000000..276693f --- /dev/null +++ b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/dto/CustomerSaveDTO.java @@ -0,0 +1,27 @@ +package com.example.lecture_13.dto; + +import lombok.Data; +import lombok.NoArgsConstructor; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; +import lombok.AllArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class CustomerSaveDTO { + + @NotBlank(message = "Name is mandatory") + @NotNull(message = "Name can't be NULL") + @Pattern(regexp = "^[a-zA-Z\\s]+$", message = "Name can only contain letters and spaces") + @Schema(example = "Your Name") + private String name; + + @NotBlank(message = "Phone is mandatory") + @NotNull(message = "Phone can't be NULL") + @Pattern(regexp = "^\\+62[0-9]{9,13}$", message = "Phone number must start with +62 and contain 9 to 13 digits") + @Schema(example = "+62xxxxxxxxxxxxx") + private String phoneNumber; +} diff --git a/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/dto/CustomerShowDTO.java b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/dto/CustomerShowDTO.java new file mode 100644 index 0000000..1f4cb67 --- /dev/null +++ b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/dto/CustomerShowDTO.java @@ -0,0 +1,16 @@ +package com.example.lecture_13.dto; + +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; + +import java.util.UUID; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class CustomerShowDTO { + private UUID Id; + private String name; + private String phoneNumber; +} diff --git a/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/exception/BadRequestException.java b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/exception/BadRequestException.java new file mode 100644 index 0000000..645c68e --- /dev/null +++ b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/exception/BadRequestException.java @@ -0,0 +1,7 @@ +package com.example.lecture_13.exception; + +public class BadRequestException extends RuntimeException { + public BadRequestException(String message) { + super(message); + } +} diff --git a/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/exception/DuplicateStatusException.java b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/exception/DuplicateStatusException.java new file mode 100644 index 0000000..5f3f806 --- /dev/null +++ b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/exception/DuplicateStatusException.java @@ -0,0 +1,7 @@ +package com.example.lecture_13.exception; + +public class DuplicateStatusException extends RuntimeException { + public DuplicateStatusException(String message) { + super(message); + } +} diff --git a/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/exception/GlobalExceptionHandler.java b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..b1fc0b4 --- /dev/null +++ b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/exception/GlobalExceptionHandler.java @@ -0,0 +1,77 @@ +package com.example.lecture_13.exception; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.FieldError; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +@RestControllerAdvice +public class GlobalExceptionHandler { + + // Handle validation errors from @Valid annotated methods + @ExceptionHandler(MethodArgumentNotValidException.class) + public ResponseEntity>> handleValidationErrors(MethodArgumentNotValidException ex) { + List errors = ex.getBindingResult().getFieldErrors() + .stream().map(FieldError::getDefaultMessage).collect(Collectors.toList()); + return new ResponseEntity<>(getErrorsMap(errors), HttpStatus.BAD_REQUEST); + } + + private Map> getErrorsMap(List errors) { + Map> errorResponse = new HashMap<>(); + errorResponse.put("errors", errors); + return errorResponse; + } + + /** + * Handles generic exceptions by creating a response entity containing an error message. + * + * @param e the exception to handle + * @return a response entity containing a map with an error message + */ + @ExceptionHandler(Exception.class) + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + public ResponseEntity> handleException(Exception e) { + Map errorResponse = new HashMap<>(); + errorResponse.put("error", e.getMessage()); + return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR); + } + + // Custom exceptions + /** + * Handles {@link ResourceNotFoundException} by creating a response entity containing an error message. + * + * @param e the {@link ResourceNotFoundException} to handle + * @return a {@link ResponseEntity} containing a map with an error message + * @throws ResourceNotFoundException if the specified resource is not found + */ + @ExceptionHandler(ResourceNotFoundException.class) + @ResponseStatus(HttpStatus.NOT_FOUND) + public ResponseEntity> handleResourceNotFoundException(ResourceNotFoundException e) { + Map errorResponse = new HashMap<>(); + errorResponse.put("error", e.getMessage()); + return new ResponseEntity<>(errorResponse, HttpStatus.NOT_FOUND); + } + + /** + * Handles {@link BadRequestException} by creating a response entity containing an error message. + * + * @param e the {@link BadRequestException} to handle + * @return a {@link ResponseEntity} containing a map with an error message + */ + @ExceptionHandler(BadRequestException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public ResponseEntity> handleBadRequestException(BadRequestException e) { + Map errorResponse = new HashMap<>(); + errorResponse.put("error", e.getMessage()); + return new ResponseEntity<>(errorResponse, HttpStatus.BAD_REQUEST); + } +} + diff --git a/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/exception/ResourceNotFoundException.java b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/exception/ResourceNotFoundException.java new file mode 100644 index 0000000..ad0e756 --- /dev/null +++ b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/exception/ResourceNotFoundException.java @@ -0,0 +1,7 @@ +package com.example.lecture_13.exception; + +public class ResourceNotFoundException extends RuntimeException { + public ResourceNotFoundException(String message) { + super(message); + } +} diff --git a/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/mapper/CustomerMapper.java b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/mapper/CustomerMapper.java new file mode 100644 index 0000000..6ddfa82 --- /dev/null +++ b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/mapper/CustomerMapper.java @@ -0,0 +1,40 @@ +package com.example.lecture_13.mapper; + +import com.example.lecture_13.data.model.Customer; +import com.example.lecture_13.dto.CustomerDTO; +import com.example.lecture_13.dto.CustomerShowDTO; +import com.example.lecture_13.dto.CustomerSaveDTO; + +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; + +@Mapper(componentModel = "spring") +public interface CustomerMapper { + + CustomerMapper INSTANCE = Mappers.getMapper(CustomerMapper.class); + + // Customer - CustomerDTO + CustomerDTO toCustomerDTO(Customer customer); + + @Mapping(target = "createdAt", ignore = true) + @Mapping(target = "updatedAt", ignore = true) + Customer toCustomer(CustomerDTO customerDTO); + + // Customer - CustomerShowDTO + CustomerShowDTO toCustomerShowDTO(Customer customer); + + @Mapping(target = "status", ignore = true) + @Mapping(target = "createdAt", ignore = true) + @Mapping(target = "updatedAt", ignore = true) + Customer toCustomer(CustomerShowDTO customerShowDTO); + + // Customer - CustomerSaveDTO + CustomerSaveDTO toCustomerSaveDTO(Customer customer); + + @Mapping(target = "id", ignore = true) + @Mapping(target = "status", ignore = true) + @Mapping(target = "createdAt", ignore = true) + @Mapping(target = "updatedAt", ignore = true) + Customer toCustomer(CustomerSaveDTO customerSaveDTO); +} diff --git a/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/service/CustomerService.java b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/service/CustomerService.java new file mode 100644 index 0000000..d57b77e --- /dev/null +++ b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/service/CustomerService.java @@ -0,0 +1,35 @@ +package com.example.lecture_13.service; + +import java.util.UUID; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + +import com.example.lecture_13.data.model.Customer; +import com.example.lecture_13.data.model.Status; +import com.example.lecture_13.dto.CustomerDTO; +import com.example.lecture_13.dto.CustomerSaveDTO; +import com.example.lecture_13.dto.CustomerShowDTO; + +import jakarta.validation.Valid; + +public interface CustomerService { + + // Retrieves a paginated list of all customers. + Page findAllActiveCustomer(Pageable pageable); + + // Creating a new customer. + CustomerDTO createCustomer(@Valid CustomerSaveDTO customerSaveDTO); + + // Updates an existing customer with the provided customer details. + CustomerDTO updateCustomer(UUID id, @Valid CustomerSaveDTO customerSaveDTO); + + // Updates the status of an existing customer. + CustomerDTO updateCustomerStatus(UUID id, Status status); + + // Find customer by its id. + Customer findById(UUID id); + + // Deletes a customer from the repository. + void deleteCustomer(UUID id); +} \ No newline at end of file diff --git a/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/service/impl/CustomerServiceImpl.java b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/service/impl/CustomerServiceImpl.java new file mode 100644 index 0000000..a4ccaf7 --- /dev/null +++ b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/service/impl/CustomerServiceImpl.java @@ -0,0 +1,129 @@ +package com.example.lecture_13.service.impl; + +import java.util.Date; +import java.util.UUID; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import com.example.lecture_13.data.model.Customer; +import com.example.lecture_13.data.model.Status; +import com.example.lecture_13.data.repository.CustomerRepository; +import com.example.lecture_13.dto.CustomerDTO; +import com.example.lecture_13.dto.CustomerSaveDTO; +import com.example.lecture_13.dto.CustomerShowDTO; +import com.example.lecture_13.exception.DuplicateStatusException; +import com.example.lecture_13.exception.ResourceNotFoundException; +import com.example.lecture_13.mapper.CustomerMapper; +import com.example.lecture_13.service.CustomerService; + +import jakarta.validation.Valid; + +@Service +@Validated +public class CustomerServiceImpl implements CustomerService { + + @Autowired + private CustomerMapper customerMapper; + + @Autowired + private CustomerRepository customerRepository; + + /** + * Retrieves a paginated list of all active customers from the repository. + * + * @param pageable The pagination parameters, including the page number and size. + * @return A Page object containing a list of {@link CustomerShowDTO} objects representing the customers on the specified page. + */ + @Override + public Page findAllActiveCustomer(Pageable pageable) { + return customerRepository.findByStatus(Status.Active, pageable).map(customerMapper::toCustomerShowDTO); + } + + /** + * Retrieves a customer from the repository based on the provided unique identifier. + * + * @param customerId The unique identifier of the customer to be retrieved. + * @return A {@link Customer} object representing the customer with the given ID. + * @throws ResourceNotFoundException if no customer is found with the given ID. + */ + @Override + public Customer findById(UUID customerId) { + return customerRepository.findById(customerId).orElseThrow(() -> new ResourceNotFoundException("Customer not found")); + } + + /** + * Creates a new customer in the repository and returns the corresponding {@link CustomerDTO} object. + * + * @param customerSaveDTO The {@link CustomerSaveDTO} object containing the details of the new customer to be created. + * @return A {@link CustomerDTO} object representing the newly created customer. + */ + @Override + public CustomerDTO createCustomer(@Valid CustomerSaveDTO customerSaveDTO) { + Customer customer = customerMapper.toCustomer(customerSaveDTO); + customer.setCreatedAt(new Date()); + customer.setUpdatedAt(new Date()); + Customer savedCustomer = customerRepository.save(customer); + return customerMapper.toCustomerDTO(savedCustomer); + } + + /** + * Updates an existing customer in the repository with the provided details from the {@link CustomerSaveDTO} object. + * + * @param id The unique identifier of the customer to be updated. + * @param customerSaveDTO The {@link CustomerSaveDTO} object containing the details of the customer to be updated. + * @return A {@link CustomerDTO} object representing the updated customer. + * @throws ResourceNotFoundException if the customer with the given ID is not found. + */ + @Override + public CustomerDTO updateCustomer(UUID id, @Valid CustomerSaveDTO customerSaveDTO) { + Customer customer = customerRepository.findById(id) + .orElseThrow(() -> new ResourceNotFoundException("Customer not found")); + + customer.setName(customerSaveDTO.getName()); + customer.setPhoneNumber(customerSaveDTO.getPhoneNumber()); + customer.setUpdatedAt(new Date()); + Customer updatedCustomer = customerRepository.save(customer); + return customerMapper.toCustomerDTO(updatedCustomer); + } + + /** + * Updates the status of an existing customer in the repository. + * + * @param id The unique identifier of the customer whose status is to be updated. + * @param status The new status to be assigned to the customer. + * @return A {@link CustomerDTO} object representing the updated customer. + * @throws ResourceNotFoundException if the customer with the given ID is not found. + * @throws DuplicateStatusException if the customer already has the specified status. + */ + @Override + public CustomerDTO updateCustomerStatus(UUID id, Status status) { + Customer customer = customerRepository.findById(id) + .orElseThrow(() -> new ResourceNotFoundException("Customer not found")); + + if (customer.getStatus() == status) { + throw new DuplicateStatusException("Customer status is already " + status); + } + + customer.setStatus(status); + customer.setUpdatedAt(new Date()); + Customer updatedCustomer = customerRepository.save(customer); + return customerMapper.toCustomerDTO(updatedCustomer); + } + + /** + * Deletes a customer from the repository based on the provided unique identifier. + * + * @param id The unique identifier of the customer to be deleted. + * @throws ResourceNotFoundException if no customer is found with the given ID. + */ + @Override + public void deleteCustomer(UUID id) { + Customer customer = customerRepository.findById(id) + .orElseThrow(() -> new ResourceNotFoundException("Customer not found")); + customerRepository.delete(customer); + } +} \ No newline at end of file diff --git a/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/resources/application.properties b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/resources/application.properties index ffec01a..e40934e 100644 --- a/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/resources/application.properties +++ b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/resources/application.properties @@ -1 +1,28 @@ spring.application.name=lecture_13 + +# Datasorce connection data +spring.config.import=file:env.properties +spring.datasource.url=${DB_DATABASE} +spring.datasource.username=${DB_USER} +spring.datasource.password=${DB_PASSWORD} +spring.datasource.driver-class-name=com.mysql.jdbc.Driver +spring.jpa.hibernate.ddl-auto=update + +# Enable SQL logging and show the statements and params + formatting +spring.jpa.show-sql=true +spring.jpa.properties.hibernate.format_sql=true +logging.level.org.hibernate.SQL=DEBUG +logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE + +# Swagger API documentation docs path +springdoc.api-docs.path=/api-docs + +# Enable the restart feature but exclude certain paths from triggering a restart +spring.devtools.restart.additional-paths=src/main/java +spring.devtools.restart.exclude=static/**,public/** + +# Enable the LiveReload feature +spring.devtools.livereload.enabled=true + +# Port +server.port=${PORT} \ No newline at end of file diff --git a/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/resources/data.sql b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/resources/data.sql new file mode 100644 index 0000000..cfa4358 --- /dev/null +++ b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/resources/data.sql @@ -0,0 +1,40 @@ +-- Create the database +CREATE DATABASE week8_lecture13; + +-- Use the database +USE week8_lecture13; + +-- Initialize table with DDL +-- Create `Customer` table +CREATE TABLE Customer ( + ID BINARY(16) PRIMARY KEY, + name VARCHAR(255) NOT NULL, + phoneNumber VARCHAR(255), + status ENUM('Active', 'Deactivate') NOT NULL, + createdAt DATETIME, + updatedAt DATETIME +); + +-- Initialize data on table with DML +-- Insert 20 customers +INSERT INTO Customer (ID, name, phone_number, status, created_at, updated_at) VALUES +(UUID_TO_BIN(UUID()), 'Alice Smith', '1234567890', 'Active', NOW(), NOW()), +(UUID_TO_BIN(UUID()), 'Bob Johnson', '0987654321', 'Active', NOW(), NOW()), +(UUID_TO_BIN(UUID()), 'Charlie Brown', '1122334455', 'Active', NOW(), NOW()), +(UUID_TO_BIN(UUID()), 'David Wilson', '5566778899', 'Active', NOW(), NOW()), +(UUID_TO_BIN(UUID()), 'Eva Davis', '2233445566', 'Active', NOW(), NOW()), +(UUID_TO_BIN(UUID()), 'Frank Miller', '6677889900', 'Active', NOW(), NOW()), +(UUID_TO_BIN(UUID()), 'Grace Lee', '9988776655', 'Active', NOW(), NOW()), +(UUID_TO_BIN(UUID()), 'Hank Moore', '4455667788', 'Active', NOW(), NOW()), +(UUID_TO_BIN(UUID()), 'Ivy Taylor', '3344556677', 'Active', NOW(), NOW()), +(UUID_TO_BIN(UUID()), 'Jack Anderson', '7788990011', 'Active', NOW(), NOW()), +(UUID_TO_BIN(UUID()), 'Kara Thomas', '9988771122', 'Active', NOW(), NOW()), +(UUID_TO_BIN(UUID()), 'Leo Harris', '4455662233', 'Active', NOW(), NOW()), +(UUID_TO_BIN(UUID()), 'Mona Clark', '5566773344', 'Active', NOW(), NOW()), +(UUID_TO_BIN(UUID()), 'Nate Lewis', '3344558899', 'Active', NOW(), NOW()), +(UUID_TO_BIN(UUID()), 'Olivia Hall', '1122336677', 'Active', NOW(), NOW()), +(UUID_TO_BIN(UUID()), 'Paul Young', '8899001122', 'Active', NOW(), NOW()), +(UUID_TO_BIN(UUID()), 'Quinn Walker', '2233447788', 'Active', NOW(), NOW()), +(UUID_TO_BIN(UUID()), 'Rachel Allen', '6677883344', 'Active', NOW(), NOW()), +(UUID_TO_BIN(UUID()), 'Sam King', '9988773344', 'Active', NOW(), NOW()), +(UUID_TO_BIN(UUID()), 'Tina Scott', '5566778899', 'Active', NOW(), NOW()); \ No newline at end of file From 59184c1c10051a2e0dfcedd9fe99cd063769d027 Mon Sep 17 00:00:00 2001 From: mikeleo03 Date: Mon, 29 Jul 2024 15:23:22 +0700 Subject: [PATCH 06/23] [Feat] Implementation done --- .../lecture_13/Lecture13Application.java | 1 - .../lecture_13/config/FilterConfig.java | 19 ++++++++ .../config/filter/APIKeyFilter.java | 48 +++++++++++++++++++ .../example/lecture_13/data/model/APIKey.java | 31 ++++++++++++ .../data/repository/APIKeyRepository.java | 18 +++++++ .../src/main/resources/application.properties | 3 ++ .../lecture_13/src/main/resources/data.sql | 17 ++++++- 7 files changed, 135 insertions(+), 2 deletions(-) create mode 100644 Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/config/FilterConfig.java create mode 100644 Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/config/filter/APIKeyFilter.java create mode 100644 Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/data/model/APIKey.java create mode 100644 Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/data/repository/APIKeyRepository.java diff --git a/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/Lecture13Application.java b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/Lecture13Application.java index 3a73dac..e77dfa4 100644 --- a/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/Lecture13Application.java +++ b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/Lecture13Application.java @@ -9,5 +9,4 @@ public class Lecture13Application { public static void main(String[] args) { SpringApplication.run(Lecture13Application.class, args); } - } diff --git a/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/config/FilterConfig.java b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/config/FilterConfig.java new file mode 100644 index 0000000..83dc148 --- /dev/null +++ b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/config/FilterConfig.java @@ -0,0 +1,19 @@ +package com.example.lecture_13.config; + +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import com.example.lecture_13.config.filter.APIKeyFilter; + +@Configuration +public class FilterConfig { + + @Bean + public FilterRegistrationBean apiKeyFilter(APIKeyFilter apiKeyFilter) { + FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); + registrationBean.setFilter(apiKeyFilter); + registrationBean.addUrlPatterns("/api/v1/*"); // All Customer API + return registrationBean; + } +} \ No newline at end of file diff --git a/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/config/filter/APIKeyFilter.java b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/config/filter/APIKeyFilter.java new file mode 100644 index 0000000..2535b63 --- /dev/null +++ b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/config/filter/APIKeyFilter.java @@ -0,0 +1,48 @@ +package com.example.lecture_13.config.filter; + +import java.io.IOException; +import java.util.Optional; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +import com.example.lecture_13.data.model.APIKey; +import com.example.lecture_13.data.repository.APIKeyRepository; + +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +@Component +public class APIKeyFilter extends OncePerRequestFilter { + + @Autowired + private APIKeyRepository apiKeyRepository; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) + throws ServletException, IOException { + String requestApiKey = request.getHeader("api-key"); + + Optional apiKeyOpt = apiKeyRepository.findFirstByActiveTrueOrderById(); + response.addHeader("source", "fpt-software"); + if (apiKeyOpt.isPresent()) { + String storedApiKey = apiKeyOpt.get().getApiKey(); + + if (storedApiKey.equals(requestApiKey)) { + filterChain.doFilter(request, response); + } else { + response.setStatus(HttpStatus.FORBIDDEN.value()); + response.setContentType("application/json"); + response.getWriter().write("{\"error\": \"Invalid API Key\"}"); + } + } else { + response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value()); + response.setContentType("application/json"); + response.getWriter().write("{\"error\": \"API Key not configured or inactive\"}"); + } + } +} diff --git a/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/data/model/APIKey.java b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/data/model/APIKey.java new file mode 100644 index 0000000..8461e80 --- /dev/null +++ b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/data/model/APIKey.java @@ -0,0 +1,31 @@ +package com.example.lecture_13.data.model; + +import java.time.LocalDateTime; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "APIKey") +public class APIKey { + + @Id + @Column(name = "ID", columnDefinition = "BIGINT", updatable = false, nullable = false) + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + private String apiKey; + private String description; + private LocalDateTime createdAt; + private LocalDateTime updatedAt; + private boolean active; +} diff --git a/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/data/repository/APIKeyRepository.java b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/data/repository/APIKeyRepository.java new file mode 100644 index 0000000..e50c68b --- /dev/null +++ b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/java/com/example/lecture_13/data/repository/APIKeyRepository.java @@ -0,0 +1,18 @@ +package com.example.lecture_13.data.repository; + +import java.util.Optional; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import com.example.lecture_13.data.model.APIKey; + +@Repository +public interface APIKeyRepository extends JpaRepository { + + // Get the first API key, order by ID + Optional findFirstByOrderById(); + + // Find the first active API key + Optional findFirstByActiveTrueOrderById(); +} \ No newline at end of file diff --git a/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/resources/application.properties b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/resources/application.properties index e40934e..1aa55bc 100644 --- a/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/resources/application.properties +++ b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/resources/application.properties @@ -24,5 +24,8 @@ spring.devtools.restart.exclude=static/**,public/** # Enable the LiveReload feature spring.devtools.livereload.enabled=true +# Overriding bean +spring.main.allow-bean-definition-overriding=true + # Port server.port=${PORT} \ No newline at end of file diff --git a/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/resources/data.sql b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/resources/data.sql index cfa4358..3cfacc2 100644 --- a/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/resources/data.sql +++ b/Week 08/Lecture 13/Assignment 02/lecture_13/src/main/resources/data.sql @@ -15,6 +15,16 @@ CREATE TABLE Customer ( updatedAt DATETIME ); +-- Create `APIKey` table +CREATE TABLE APIKey ( + ID BIGINT AUTO_INCREMENT PRIMARY KEY, + api_key VARCHAR(255) NOT NULL, + description VARCHAR(255), -- Description or label for the API key + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- Timestamp of creation + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- Timestamp of last update + active BOOLEAN DEFAULT TRUE -- Status to enable or disable the API key +); + -- Initialize data on table with DML -- Insert 20 customers INSERT INTO Customer (ID, name, phone_number, status, created_at, updated_at) VALUES @@ -37,4 +47,9 @@ INSERT INTO Customer (ID, name, phone_number, status, created_at, updated_at) VA (UUID_TO_BIN(UUID()), 'Quinn Walker', '2233447788', 'Active', NOW(), NOW()), (UUID_TO_BIN(UUID()), 'Rachel Allen', '6677883344', 'Active', NOW(), NOW()), (UUID_TO_BIN(UUID()), 'Sam King', '9988773344', 'Active', NOW(), NOW()), -(UUID_TO_BIN(UUID()), 'Tina Scott', '5566778899', 'Active', NOW(), NOW()); \ No newline at end of file +(UUID_TO_BIN(UUID()), 'Tina Scott', '5566778899', 'Active', NOW(), NOW()); + +-- Prepare API Keys +INSERT INTO APIKey (api_key, description, created_at, updated_at, active) VALUES +('12345-ABCDE', 'Primary API Key for System Access', NOW(), NOW(), TRUE), +('67890-FGHIJ', 'Secondary API Key for Testing', NOW(), NOW(), FALSE); \ No newline at end of file From 41c874cbd5c51f17850aa82e623ce7503105d73a Mon Sep 17 00:00:00 2001 From: mikeleo03 Date: Mon, 29 Jul 2024 16:00:50 +0700 Subject: [PATCH 07/23] [Feat] README Assignment 02 --- Week 08/Lecture 13/Assignment 02/README.md | 275 ++++++++++++++++++ .../Lecture 13/Assignment 02/img/demo1.png | Bin 0 -> 92938 bytes .../Lecture 13/Assignment 02/img/demo2.png | Bin 0 -> 114024 bytes .../Lecture 13/Assignment 02/img/demo3.png | Bin 0 -> 108234 bytes 4 files changed, 275 insertions(+) create mode 100644 Week 08/Lecture 13/Assignment 02/README.md create mode 100644 Week 08/Lecture 13/Assignment 02/img/demo1.png create mode 100644 Week 08/Lecture 13/Assignment 02/img/demo2.png create mode 100644 Week 08/Lecture 13/Assignment 02/img/demo3.png diff --git a/Week 08/Lecture 13/Assignment 02/README.md b/Week 08/Lecture 13/Assignment 02/README.md new file mode 100644 index 0000000..3508d64 --- /dev/null +++ b/Week 08/Lecture 13/Assignment 02/README.md @@ -0,0 +1,275 @@ +# 👨🏻‍🏫 Lecture 13 - Spring Advance Feature: Filter and Spring Interceptor +> This repository is created as a part of assignment for Lecture 13 - Spring Advance Feature: Filter and Spring Interceptor + +## 🔐 Assignment 02 - Simple Filter + +### 🧐 Detailed Overview + +To complete the assignment, we need to add the following functionalities to the existing CRUD project: +1. **Store API key in the database**: Ensure we have a table to store the API key. +2. **Verify requests**: Filter to check for the "api-key" header in incoming requests. +3. **Include header in all responses**: Filter to add the "source" header to all responses. + +Here’s a step-by-step guide: + +### 📦 Storing API Key in the Database + +**Idea**: Create a table to store the API key. You can have a single record in this table that holds the API key. + +**Table Schema** +See the detail [here](/Week%2008/Lecture%2013/Assignment%2002/lecture_13/src/main/resources/data.sql). +```sql +-- Create `APIKey` table +CREATE TABLE APIKey ( + ID BIGINT AUTO_INCREMENT PRIMARY KEY, + api_key VARCHAR(255) NOT NULL, + description VARCHAR(255), -- Description or label for the API key + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- Timestamp of creation + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- Timestamp of last update + active BOOLEAN DEFAULT TRUE -- Status to enable or disable the API key +); +``` + +**Java Entity** +See the detail [here](/Week%2008/Lecture%2013/Assignment%2002/lecture_13/src/main/java/com/example/lecture_13/data/model/APIKey.java). +```java +@Data +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "APIKey") +public class APIKey { + + @Id + @Column(name = "ID", columnDefinition = "BIGINT", updatable = false, nullable = false) + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + private String apiKey; + private String description; + private LocalDateTime createdAt; + private LocalDateTime updatedAt; + private boolean active; +} +``` + +**Repository** +See the detail [here](/Week%2008/Lecture%2013/Assignment%2002/lecture_13/src/main/java/com/example/lecture_13/data/repository/APIKeyRepository.java). +```java +@Repository +public interface APIKeyRepository extends JpaRepository { + + // Get the first API key, order by ID + Optional findFirstByOrderById(); + + // Find the first active API key + Optional findFirstByActiveTrueOrderById(); +} +``` + +### 🔽 Filter for API Key Verification + +**Idea**: Create a filter that intercepts incoming requests, checks for the "api-key" header, and verifies it against the stored API key in the database. Use it also to add the "source" header to all responses. + +**Filter Implementation** +See the detail [here](/Week%2008/Lecture%2013/Assignment%2002/lecture_13/src/main/java/com/example/lecture_13/config/filter/APIKeyFilter.java). +```java +@Component +public class APIKeyFilter extends OncePerRequestFilter { + + @Autowired + private APIKeyRepository apiKeyRepository; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) + throws ServletException, IOException { + String requestApiKey = request.getHeader("api-key"); + + Optional apiKeyOpt = apiKeyRepository.findFirstByActiveTrueOrderById(); + response.addHeader("source", "fpt-software"); + if (apiKeyOpt.isPresent()) { + String storedApiKey = apiKeyOpt.get().getApiKey(); + + if (storedApiKey.equals(requestApiKey)) { + filterChain.doFilter(request, response); + } else { + response.setStatus(HttpStatus.FORBIDDEN.value()); + response.setContentType("application/json"); + response.getWriter().write("{\"error\": \"Invalid API Key\"}"); + } + } else { + response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value()); + response.setContentType("application/json"); + response.getWriter().write("{\"error\": \"API Key not configured or inactive\"}"); + } + } +} +``` + +### ✔️ Register Filters +**Configuration** +See the detail [here](/Week%2008/Lecture%2013/Assignment%2002/lecture_13/src/main/java/com/example/lecture_13/config/FilterConfig.java). +```java +@Configuration +public class FilterConfig { + + @Bean + public FilterRegistrationBean apiKeyFilter(APIKeyFilter apiKeyFilter) { + FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); + registrationBean.setFilter(apiKeyFilter); + registrationBean.addUrlPatterns("/api/v1/*"); // All Customer API + return registrationBean; + } +} +``` + +--- + +### 🌳 Project Structure +```bash +lecture_13 +├── .mvn/wrapper/ +│ └── maven-wrapper.properties +├── src/main/ +│ ├── java/com/example/lecture_13/ +│ │ ├── config/ +│ │ │ ├── filter/ +│ │ │ │ └── APIKeyFilter.java +│ │ │ ├── FilterConfig.java +│ │ │ └── WebConfig.java +│ │ ├── controller/ +│ │ │ └── CustomerController.java +│ │ ├── data/ +│ │ │ ├── model/ +│ │ │ │ ├── APIKey.java +│ │ │ │ ├── Customer.java +│ │ │ │ └── Status.java +│ │ │ └── repository/ +│ │ │ ├── APIKeyRepository.java +│ │ │ └── CustomerRepository.java +│ │ ├── dto/ +│ │ │ ├── CustomerDTO.java +│ │ │ ├── CustomerSaveDTO.java +│ │ │ └── CustomerShowDTO.java +│ │ ├── exception/ +│ │ │ ├── BadRequestException.java +│ │ │ ├── DuplicateStatusException.java +│ │ │ ├── GlobalExceptionHandler.java +│ │ │ └── ResourceNotFound.java +│ │ ├── mapper/ +│ │ │ └── CustomerMapper.java +│ │ ├── service/ +│ │ │ ├── impl/ +│ │ │ │ └── CustomerServiceImpl.java +│ │ │ └── CustomerService.java +│ │ └── Lecture13Application.java +│ └── resources/ +│ ├── application.properties +│ └── data.sql +├── .gitignore +├── env.properties +├── mvnw +├── mvnw.cmd +├── pom.xml +├── run.bat +└── run.sh +``` + +### 🧩 SQL Query Data +Here is the SQL query to create the database, table, and instantiate some data. +```sql +-- Create the database +CREATE DATABASE week8_lecture13; + +-- Use the database +USE week8_lecture13; + +-- Initialize table with DDL +-- Create `Customer` table +CREATE TABLE Customer ( + ID BINARY(16) PRIMARY KEY, + name VARCHAR(255) NOT NULL, + phoneNumber VARCHAR(255), + status ENUM('Active', 'Deactivate') NOT NULL, + createdAt DATETIME, + updatedAt DATETIME +); + +-- Create `APIKey` table +CREATE TABLE APIKey ( + ID BIGINT AUTO_INCREMENT PRIMARY KEY, + api_key VARCHAR(255) NOT NULL, + description VARCHAR(255), -- Description or label for the API key + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- Timestamp of creation + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- Timestamp of last update + active BOOLEAN DEFAULT TRUE -- Status to enable or disable the API key +); +``` + +There are also query to insert some generated dummy data. All the MySQL queries is available on [this file](/Week%2008/Lecture%2013/Assignment%2002/lecture_13/src/main/resources/data.sql). Here is the query to drop the database. +```sql +-- Drop the database +DROP DATABASE IF EXISTS week8_lecture13; +``` + +Don't forget to add this to re-update the SQL DDL queries. +```java +spring.jpa.hibernate.ddl-auto=update +``` + +finally, don't forget to add this for hibernate SQL logging. +```java +spring.jpa.show-sql=true +spring.jpa.properties.hibernate.format_sql=true +logging.level.org.hibernate.SQL=DEBUG +logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE +``` + +### ⚙️ How to run the program +1. Go to the `lecture_13` directory by using this command + ```bash + $ cd lecture_13 + ``` +2. Make sure you have maven installed on my computer, use `mvn -v` to check the version. +3. Setup your credential. You can configure it by creating file `env.properties` on the **root of the project** (aligned with [pom.xml](/Week%2008/Lecture%2013/Assignment%2002/lecture_13/pom.xml)), then fill it with this format. + ```java + DB_DATABASE= + DB_USER= + DB_PASSWORD=M + PORT= + ``` +4. If you are using windows, you can run the program by using this command. + ```bash + $ ./run.bat + ``` + And if you are using Linux, you can run the program by using this command. + ```bash + $ chmod +x run.sh + $ ./run.sh + ``` + +If all the instruction is well executed, Open [localhost:8080](http://localhost:8080) to see that the REST APIs is now works. + +### 🔑 List of Endpoints +| Endpoints | Method | Description | +|--------------------------------------------------------------------------------------------|:------:|-------------------------------------------------------------------------------------------------| +| /api/v1/customers | GET | Retrieve all customers with default pagination (page 1 with size 20 elements/page). Consider only active customers. | +| /api/v1/customers?page={X}&size={Y} | GET | Retrieve all customers with custom pagination (page X (0-based index) with size Y elements/page). Consider only active customers. | +| /api/v1/customers | POST | Create a new customer. Validate POST request format. | +| /api/v1/customers/{id} | PUT | Update an existing customer by customer ID. Make sure the customer ID exists. | +| /api/v1/customers/active/{id} | PUT | Activate the existing customer by their customer ID. Make sure the customer ID exists and is currently inactive. | +| /api/v1/customers/deactive/{id} | PUT | Deactivate the existing customer by their customer ID. Make sure the customer ID exists and is currently active. | +| /api/v1/customers/{id} | DELETE | Delete an existing customer by customer ID. Make sure the customer ID exists. | + + +### 🚀 Demonstration +![Screenshots](/Week%2008/Lecture%2013/Assignment%2002/img/demo1.png) + +Result if API Key not exists or not configured on the header. + +![Screenshots](/Week%2008/Lecture%2013/Assignment%2002/img/demo2.png) + +Result if API Key well-configured on the header. + +![Screenshots](/Week%2008/Lecture%2013/Assignment%2002/img/demo3.png) + +Result header returning source from fpt-software. \ No newline at end of file diff --git a/Week 08/Lecture 13/Assignment 02/img/demo1.png b/Week 08/Lecture 13/Assignment 02/img/demo1.png new file mode 100644 index 0000000000000000000000000000000000000000..087f503efdeaf9a88eb403a0a41c2f1b921e34a7 GIT binary patch literal 92938 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 ND`qyAsxRJn@L$Crt-}BS literal 0 HcmV?d00001 diff --git a/Week 08/Lecture 13/Assignment 02/img/demo2.png b/Week 08/Lecture 13/Assignment 02/img/demo2.png new file mode 100644 index 0000000000000000000000000000000000000000..6977fbee7de270b6d3a5801ee0084112280afcb5 GIT binary patch literal 114024 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 literal 0 HcmV?d00001 diff --git a/Week 08/Lecture 13/Assignment 02/img/demo3.png b/Week 08/Lecture 13/Assignment 02/img/demo3.png new file mode 100644 index 0000000000000000000000000000000000000000..0fcdb9901bbfad64602e93ab24cd50b758cd4cb5 GIT binary patch literal 108234 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 z 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 fW0e>^`<^1V=Ld`F_@g^V;2$kDy^AF() Date: Mon, 29 Jul 2024 16:03:24 +0700 Subject: [PATCH 08/23] [Init] Copying Assignment 02 to 03 --- Week 08/Lecture 13/Assignment 03/README.md | 275 ++++++++++++++++++ .../Lecture 13/Assignment 03/img/demo1.png | Bin 0 -> 92938 bytes .../Lecture 13/Assignment 03/img/demo2.png | Bin 0 -> 114024 bytes .../Lecture 13/Assignment 03/img/demo3.png | Bin 0 -> 108234 bytes .../Assignment 03/lecture_13/.gitignore | 33 +++ .../.mvn/wrapper/maven-wrapper.properties | 19 ++ .../Assignment 03/lecture_13/env.properties | 4 + .../Lecture 13/Assignment 03/lecture_13/mvnw | 259 +++++++++++++++++ .../Assignment 03/lecture_13/mvnw.cmd | 149 ++++++++++ .../Assignment 03/lecture_13/pom.xml | 124 ++++++++ .../Assignment 03/lecture_13/run.bat | 3 + .../Assignment 03/lecture_13/run.sh | 3 + .../lecture_13/Lecture13Application.java | 12 + .../lecture_13/config/FilterConfig.java | 19 ++ .../example/lecture_13/config/WebConfig.java | 9 + .../config/filter/APIKeyFilter.java | 48 +++ .../controller/CustomerController.java | 154 ++++++++++ .../example/lecture_13/data/model/APIKey.java | 31 ++ .../lecture_13/data/model/Customer.java | 51 ++++ .../example/lecture_13/data/model/Status.java | 6 + .../data/repository/APIKeyRepository.java | 18 ++ .../data/repository/CustomerRepository.java | 18 ++ .../example/lecture_13/dto/CustomerDTO.java | 19 ++ .../lecture_13/dto/CustomerSaveDTO.java | 27 ++ .../lecture_13/dto/CustomerShowDTO.java | 16 + .../exception/BadRequestException.java | 7 + .../exception/DuplicateStatusException.java | 7 + .../exception/GlobalExceptionHandler.java | 77 +++++ .../exception/ResourceNotFoundException.java | 7 + .../lecture_13/mapper/CustomerMapper.java | 40 +++ .../lecture_13/service/CustomerService.java | 35 +++ .../service/impl/CustomerServiceImpl.java | 129 ++++++++ .../src/main/resources/application.properties | 31 ++ .../lecture_13/src/main/resources/data.sql | 55 ++++ .../lecture_13/Lecture13ApplicationTests.java | 13 + 35 files changed, 1698 insertions(+) create mode 100644 Week 08/Lecture 13/Assignment 03/README.md create mode 100644 Week 08/Lecture 13/Assignment 03/img/demo1.png create mode 100644 Week 08/Lecture 13/Assignment 03/img/demo2.png create mode 100644 Week 08/Lecture 13/Assignment 03/img/demo3.png create mode 100644 Week 08/Lecture 13/Assignment 03/lecture_13/.gitignore create mode 100644 Week 08/Lecture 13/Assignment 03/lecture_13/.mvn/wrapper/maven-wrapper.properties create mode 100644 Week 08/Lecture 13/Assignment 03/lecture_13/env.properties create mode 100644 Week 08/Lecture 13/Assignment 03/lecture_13/mvnw create mode 100644 Week 08/Lecture 13/Assignment 03/lecture_13/mvnw.cmd create mode 100644 Week 08/Lecture 13/Assignment 03/lecture_13/pom.xml create mode 100644 Week 08/Lecture 13/Assignment 03/lecture_13/run.bat create mode 100644 Week 08/Lecture 13/Assignment 03/lecture_13/run.sh create mode 100644 Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/Lecture13Application.java create mode 100644 Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/config/FilterConfig.java create mode 100644 Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/config/WebConfig.java create mode 100644 Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/config/filter/APIKeyFilter.java create mode 100644 Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/controller/CustomerController.java create mode 100644 Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/data/model/APIKey.java create mode 100644 Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/data/model/Customer.java create mode 100644 Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/data/model/Status.java create mode 100644 Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/data/repository/APIKeyRepository.java create mode 100644 Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/data/repository/CustomerRepository.java create mode 100644 Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/dto/CustomerDTO.java create mode 100644 Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/dto/CustomerSaveDTO.java create mode 100644 Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/dto/CustomerShowDTO.java create mode 100644 Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/exception/BadRequestException.java create mode 100644 Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/exception/DuplicateStatusException.java create mode 100644 Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/exception/GlobalExceptionHandler.java create mode 100644 Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/exception/ResourceNotFoundException.java create mode 100644 Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/mapper/CustomerMapper.java create mode 100644 Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/service/CustomerService.java create mode 100644 Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/service/impl/CustomerServiceImpl.java create mode 100644 Week 08/Lecture 13/Assignment 03/lecture_13/src/main/resources/application.properties create mode 100644 Week 08/Lecture 13/Assignment 03/lecture_13/src/main/resources/data.sql create mode 100644 Week 08/Lecture 13/Assignment 03/lecture_13/src/test/java/com/example/lecture_13/Lecture13ApplicationTests.java diff --git a/Week 08/Lecture 13/Assignment 03/README.md b/Week 08/Lecture 13/Assignment 03/README.md new file mode 100644 index 0000000..894235f --- /dev/null +++ b/Week 08/Lecture 13/Assignment 03/README.md @@ -0,0 +1,275 @@ +# 👨🏻‍🏫 Lecture 13 - Spring Advance Feature: Filter and Spring Interceptor +> This repository is created as a part of assignment for Lecture 13 - Spring Advance Feature: Filter and Spring Interceptor + +## 👀 Assignment 03 - Simple Interceptor + +### 🧐 Detailed Overview + +To complete the assignment, we need to add the following functionalities to the existing CRUD project: +1. **Store API key in the database**: Ensure we have a table to store the API key. +2. **Verify requests**: Filter to check for the "api-key" header in incoming requests. +3. **Include header in all responses**: Filter to add the "source" header to all responses. + +Here’s a step-by-step guide: + +### 📦 Storing API Key in the Database + +**Idea**: Create a table to store the API key. You can have a single record in this table that holds the API key. + +**Table Schema** +See the detail [here](/Week%2008/Lecture%2013/Assignment%2002/lecture_13/src/main/resources/data.sql). +```sql +-- Create `APIKey` table +CREATE TABLE APIKey ( + ID BIGINT AUTO_INCREMENT PRIMARY KEY, + api_key VARCHAR(255) NOT NULL, + description VARCHAR(255), -- Description or label for the API key + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- Timestamp of creation + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- Timestamp of last update + active BOOLEAN DEFAULT TRUE -- Status to enable or disable the API key +); +``` + +**Java Entity** +See the detail [here](/Week%2008/Lecture%2013/Assignment%2002/lecture_13/src/main/java/com/example/lecture_13/data/model/APIKey.java). +```java +@Data +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "APIKey") +public class APIKey { + + @Id + @Column(name = "ID", columnDefinition = "BIGINT", updatable = false, nullable = false) + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + private String apiKey; + private String description; + private LocalDateTime createdAt; + private LocalDateTime updatedAt; + private boolean active; +} +``` + +**Repository** +See the detail [here](/Week%2008/Lecture%2013/Assignment%2002/lecture_13/src/main/java/com/example/lecture_13/data/repository/APIKeyRepository.java). +```java +@Repository +public interface APIKeyRepository extends JpaRepository { + + // Get the first API key, order by ID + Optional findFirstByOrderById(); + + // Find the first active API key + Optional findFirstByActiveTrueOrderById(); +} +``` + +### 🔽 Filter for API Key Verification + +**Idea**: Create a filter that intercepts incoming requests, checks for the "api-key" header, and verifies it against the stored API key in the database. Use it also to add the "source" header to all responses. + +**Filter Implementation** +See the detail [here](/Week%2008/Lecture%2013/Assignment%2002/lecture_13/src/main/java/com/example/lecture_13/config/filter/APIKeyFilter.java). +```java +@Component +public class APIKeyFilter extends OncePerRequestFilter { + + @Autowired + private APIKeyRepository apiKeyRepository; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) + throws ServletException, IOException { + String requestApiKey = request.getHeader("api-key"); + + Optional apiKeyOpt = apiKeyRepository.findFirstByActiveTrueOrderById(); + response.addHeader("source", "fpt-software"); + if (apiKeyOpt.isPresent()) { + String storedApiKey = apiKeyOpt.get().getApiKey(); + + if (storedApiKey.equals(requestApiKey)) { + filterChain.doFilter(request, response); + } else { + response.setStatus(HttpStatus.FORBIDDEN.value()); + response.setContentType("application/json"); + response.getWriter().write("{\"error\": \"Invalid API Key\"}"); + } + } else { + response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value()); + response.setContentType("application/json"); + response.getWriter().write("{\"error\": \"API Key not configured or inactive\"}"); + } + } +} +``` + +### ✔️ Register Filters +**Configuration** +See the detail [here](/Week%2008/Lecture%2013/Assignment%2002/lecture_13/src/main/java/com/example/lecture_13/config/FilterConfig.java). +```java +@Configuration +public class FilterConfig { + + @Bean + public FilterRegistrationBean apiKeyFilter(APIKeyFilter apiKeyFilter) { + FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); + registrationBean.setFilter(apiKeyFilter); + registrationBean.addUrlPatterns("/api/v1/*"); // All Customer API + return registrationBean; + } +} +``` + +--- + +### 🌳 Project Structure +```bash +lecture_13 +├── .mvn/wrapper/ +│ └── maven-wrapper.properties +├── src/main/ +│ ├── java/com/example/lecture_13/ +│ │ ├── config/ +│ │ │ ├── filter/ +│ │ │ │ └── APIKeyFilter.java +│ │ │ ├── FilterConfig.java +│ │ │ └── WebConfig.java +│ │ ├── controller/ +│ │ │ └── CustomerController.java +│ │ ├── data/ +│ │ │ ├── model/ +│ │ │ │ ├── APIKey.java +│ │ │ │ ├── Customer.java +│ │ │ │ └── Status.java +│ │ │ └── repository/ +│ │ │ ├── APIKeyRepository.java +│ │ │ └── CustomerRepository.java +│ │ ├── dto/ +│ │ │ ├── CustomerDTO.java +│ │ │ ├── CustomerSaveDTO.java +│ │ │ └── CustomerShowDTO.java +│ │ ├── exception/ +│ │ │ ├── BadRequestException.java +│ │ │ ├── DuplicateStatusException.java +│ │ │ ├── GlobalExceptionHandler.java +│ │ │ └── ResourceNotFound.java +│ │ ├── mapper/ +│ │ │ └── CustomerMapper.java +│ │ ├── service/ +│ │ │ ├── impl/ +│ │ │ │ └── CustomerServiceImpl.java +│ │ │ └── CustomerService.java +│ │ └── Lecture13Application.java +│ └── resources/ +│ ├── application.properties +│ └── data.sql +├── .gitignore +├── env.properties +├── mvnw +├── mvnw.cmd +├── pom.xml +├── run.bat +└── run.sh +``` + +### 🧩 SQL Query Data +Here is the SQL query to create the database, table, and instantiate some data. +```sql +-- Create the database +CREATE DATABASE week8_lecture13; + +-- Use the database +USE week8_lecture13; + +-- Initialize table with DDL +-- Create `Customer` table +CREATE TABLE Customer ( + ID BINARY(16) PRIMARY KEY, + name VARCHAR(255) NOT NULL, + phoneNumber VARCHAR(255), + status ENUM('Active', 'Deactivate') NOT NULL, + createdAt DATETIME, + updatedAt DATETIME +); + +-- Create `APIKey` table +CREATE TABLE APIKey ( + ID BIGINT AUTO_INCREMENT PRIMARY KEY, + api_key VARCHAR(255) NOT NULL, + description VARCHAR(255), -- Description or label for the API key + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- Timestamp of creation + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- Timestamp of last update + active BOOLEAN DEFAULT TRUE -- Status to enable or disable the API key +); +``` + +There are also query to insert some generated dummy data. All the MySQL queries is available on [this file](/Week%2008/Lecture%2013/Assignment%2002/lecture_13/src/main/resources/data.sql). Here is the query to drop the database. +```sql +-- Drop the database +DROP DATABASE IF EXISTS week8_lecture13; +``` + +Don't forget to add this to re-update the SQL DDL queries. +```java +spring.jpa.hibernate.ddl-auto=update +``` + +finally, don't forget to add this for hibernate SQL logging. +```java +spring.jpa.show-sql=true +spring.jpa.properties.hibernate.format_sql=true +logging.level.org.hibernate.SQL=DEBUG +logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE +``` + +### ⚙️ How to run the program +1. Go to the `lecture_13` directory by using this command + ```bash + $ cd lecture_13 + ``` +2. Make sure you have maven installed on my computer, use `mvn -v` to check the version. +3. Setup your credential. You can configure it by creating file `env.properties` on the **root of the project** (aligned with [pom.xml](/Week%2008/Lecture%2013/Assignment%2002/lecture_13/pom.xml)), then fill it with this format. + ```java + DB_DATABASE= + DB_USER= + DB_PASSWORD=M + PORT= + ``` +4. If you are using windows, you can run the program by using this command. + ```bash + $ ./run.bat + ``` + And if you are using Linux, you can run the program by using this command. + ```bash + $ chmod +x run.sh + $ ./run.sh + ``` + +If all the instruction is well executed, Open [localhost:8080](http://localhost:8080) to see that the REST APIs is now works. + +### 🔑 List of Endpoints +| Endpoints | Method | Description | +|--------------------------------------------------------------------------------------------|:------:|-------------------------------------------------------------------------------------------------| +| /api/v1/customers | GET | Retrieve all customers with default pagination (page 1 with size 20 elements/page). Consider only active customers. | +| /api/v1/customers?page={X}&size={Y} | GET | Retrieve all customers with custom pagination (page X (0-based index) with size Y elements/page). Consider only active customers. | +| /api/v1/customers | POST | Create a new customer. Validate POST request format. | +| /api/v1/customers/{id} | PUT | Update an existing customer by customer ID. Make sure the customer ID exists. | +| /api/v1/customers/active/{id} | PUT | Activate the existing customer by their customer ID. Make sure the customer ID exists and is currently inactive. | +| /api/v1/customers/deactive/{id} | PUT | Deactivate the existing customer by their customer ID. Make sure the customer ID exists and is currently active. | +| /api/v1/customers/{id} | DELETE | Delete an existing customer by customer ID. Make sure the customer ID exists. | + + +### 🚀 Demonstration +![Screenshots](/Week%2008/Lecture%2013/Assignment%2002/img/demo1.png) + +Result if API Key not exists or not configured on the header. + +![Screenshots](/Week%2008/Lecture%2013/Assignment%2002/img/demo2.png) + +Result if API Key well-configured on the header. + +![Screenshots](/Week%2008/Lecture%2013/Assignment%2002/img/demo3.png) + +Result header returning source from fpt-software. \ No newline at end of file diff --git a/Week 08/Lecture 13/Assignment 03/img/demo1.png b/Week 08/Lecture 13/Assignment 03/img/demo1.png new file mode 100644 index 0000000000000000000000000000000000000000..087f503efdeaf9a88eb403a0a41c2f1b921e34a7 GIT binary patch literal 92938 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 ND`qyAsxRJn@L$Crt-}BS literal 0 HcmV?d00001 diff --git a/Week 08/Lecture 13/Assignment 03/img/demo2.png b/Week 08/Lecture 13/Assignment 03/img/demo2.png new file mode 100644 index 0000000000000000000000000000000000000000..6977fbee7de270b6d3a5801ee0084112280afcb5 GIT binary patch literal 114024 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 literal 0 HcmV?d00001 diff --git a/Week 08/Lecture 13/Assignment 03/img/demo3.png b/Week 08/Lecture 13/Assignment 03/img/demo3.png new file mode 100644 index 0000000000000000000000000000000000000000..0fcdb9901bbfad64602e93ab24cd50b758cd4cb5 GIT binary patch literal 108234 zcmce;1yEc|yEckLa0~7Pg1fszNO1Sy?k8e>%Yi7OOUA^A!e*1Zz?l5^-NhEkYcrY+9q%TrpieO++*I;0f9&j-4zkJBY z{__3>?x-j!0#-3baPWQuWhyKq3yeg zC-^8@#xKN57&2H`BFcP?QZ-|@h&1~)K^3aNhTc0uMpHZ}ZVY|nGj>dO%n;!#Vs!K5 zp6Qpd_>=YLPg9fq=UZ*<=a&~--_U=hQ<{_I2DR6ugaoR$Fwp6w^oyL>KS|aXoS*EU z^ts!Y2<`6_hoLVN^LGZJgJDeBlK+_Oh~Z3-|6}4nh6wuGVl~fZr7=fYM|C3{AIvk|OKRJrY2L2zb1sWPR+J9M0Z{Pa*TkvCY=qcKJ zlSqE~62>Dbc1NZQ`(CY6@5?7$i?OrkXhPmx6`(4Y>nXwG%~6QWYIDgr+gc*6T5L*6 zSa>+R^9QuqAaMR%PgI0UvECyvG_=Xp$|gt;>*e~sN}m@?r_&W&+qN65;gJz$&)ef= z_`{Fb*oH%YQ6L_o%?A8q=u}hzc}c0K+3wYJne|?Ls+=S2bv_Zl$HqZXmMYOmc4k?L zD-Z$#g2{4@?h^&Y=0uL@p(2?>AmE?&o}}k?zx=f3^9IU(IDp=0-xXzLglYSN)&N4zMS zT8?6@9<98fK2Jc2@iQZ^7Rm^zhZ3*M7Nw`UqIMHS2?gF<%QHcEwQiJBlD@zH+#hnc zX=>`~3r50iTAxqT`uL5Lb%A5^d)Q>B+>$U|Uo%{>Dp0D1m|Wa0N1d zkQ!Zz&Tl*jMMMc=81%IljOfbEA6;l?f$?D1Fcf3Z4j3JZKrI>Llv1ZN5&Rf7n8hFV z*|c<|3<*DEka`=nbZjp5bF*nv?!Y|`ojPhj@r6Fz?VYHQ9S-F;jFBx9Qti7QpOm|& z3%XyA_JYo*91qAM3n05dExGMHCQDrc^j^=*(vG^Sf_2f!N)&DA%?s)uX#{*!p?sDVS?no_-d@1lLX9LQ-KKXTqS8m%Pr;%2hwA- zSmmu^LVz77!+QqY#$~=nRhTdv_t?xLM3sMuTiu2odR8g+j2r(;rCf-vQsA|Ueex&S z*LDCTDib#mH8&-w+c54rt_dZt|NI0uw3CDo&+!BEvm9IkkKcSN8jpa4hJ;hmz00kT z-MTE?Ag1Gp;U65WAYrv?-$nrJ*rESTW>+XdR52_gY9gp$` zLqUxqXE9z2EEE1u?KQIb`m?!it?B19TiCsZlajm&8(6-fDL+y7$|+y{?p?6w<4$Ef zG3*_#M%*5ZN3Lnso;~p{Xeq)5CXm;S%CEUi_chU z!>-Vb*2p=qeLnVe4^!-on^64F0nyAK^A-|gXl5T69; zzbtj#tQzG5$7#q4x0}3$ZkK@e%g#K(fy><(Tk#pO@10KTH9)ilq$RS{}L?nQ#EhN!$06S9azI+D%sOx~Kys zdLU7pnT9)==$^K1Sshpr(NX6rR#w);w|5_N#dzR%eY`ezKHbBMzf~PN^DN=+xO#bc zN$jF)zu!VI)8NGG2Zp$H3Z#~>j?q{wz1nPc2mt8k%ZxW%f6`tE*mY&2J5jzAV-R*;%0>R+cO=Np02i&XS3mv*sM)lc=6z(QOske;lv8b zLJ>b52K(kA1JLyVuwE8|4}lw^?VDw$_O%B8#QWV~u*3?s*j+u1( zdrl1lZs(Q7JPd3*Z-~JK#m>n=A>G;9EQUbFQny<(!9Ihw!jF%c9sYzZgm2w@Jcs6= zB4-WW^sq^})pX2y5Xgxl{9iS({(8;ugO7VfG1RH{$-?#*{l)J;m}+}w3tO8rnao~5 zTwCr-b8&J&L)(_POL7ySvfwQI#o{!6+ee~PO*^l&LNyfn)XrMPul0?tE8NN64?a?4 zrPAN}36I&PYvimT3|15I^?~l&38N2WxyY=u+J$Cy7RFr!>cmGZyg4e0-J( z0m1t?B;BVyJl}Q~onC_Pf{pS9&C|Y3x@pqRc00T@S4T?oukiFzJHD3?xNCXca+>9s zj}d>xeYU~!_a+F)!s|s!U6I_S4~MkpMkyIlRVEJcM3QWxAS1KTtm%ARFpQxV)C4>p z6dfuK81ba&7Fv!GH+hFD*buw#pi#hm*3wpw&s!f$W`;~+(CL;W1_WMSI_wH`DyGS4 zRvU=l2;pG)-1iVyIUmg(g6a39oWa&Tsp?xFl_WEx4x-*oTb7>|_4vHNiaAxSkV{9O z8Pm#Ibv@Be%bQ_9|J*H2^DXkhg%QMMty?iu!!(%h_(68VdxemAqA%#ue1t|BzWn1R zj|&orJ|FI>F8B>V3KLLy+MC;973h3#-&={!R5Jf1zn$h(&2z|eA8bcs71S^cEh!aM=Z)pP{lItLP1O>$8jeBBl2*H+oQkO-@dYW|{bc zBBZ=R2bKOyNa3stE*9y>PJ2Y#%G({LvP@|Icc4Y=M|b?VMg!9u&*BaO1C2L^^jl&- z5?A|Yt*~wK%(wxcAz1TVy3Ko{H{*+kRdf1HFH@v8%0hQ@8kn2g&fT&Oa%&q(=??Cw zn#zuWk}@EOi4-iOxoK- zFI*o9Ze5M8xt*(_kj}J_&%N@O7n%@Tf>zP)ERfoKiPk`itN6yoY8Uf9fDqAj>}_># zT>t0gp06Aw&VFuX;%OY^7qe@u_wzoEiEN&?*tw1a^`N~YaNBVXst)BKKNKhbG^qyO zBgA@dXZV3g<3{fnnAWAHO^aEiXHTWfOHJ+}Ja$T5S+v~6!jSQzMJH%@tfb|THx9(X>xc=+Y=!#Rx>f0WQd#+ta$MS~gElR_=?@ohq zJvAL(p)=zhozcfY5VsMO1fp5U*_2~1whe0G=qs~_9&cdX8DrP_TUu}}BTBCG1Y98E zwfNBO3m1SCpSKTb_9mMdq|*$|*wK!zcg)YwfOv9W#B6B>o4!(y=%bMtKHhNBDXb)i z$Qo&P4>V&BVZXM}7Mvz}oCIt*-f+1PF$6yqzOxg(H{&& zy|%a_bn)>4!!;m|aU}?rA3v+wdTR@iqwi?FO$q+&vw}bWbAGF>z-Pc`daBpnEJ|Rj zF2GAVw!XvN2iLYlUG#lHR%|}B#F^_=?lnL37J@>onpJH~y)tsv-49!iw=X+0@iSJq zcY7d4ZGI+xz;M1or?|9K(PDjQ9uqs_$-X7ktwBq)@+1YZOwU!!`~q#NlJ(Nnbh}m4 z`B!^z=B}=4(}0&x#)EEs8G^rLsOP5a!$KmU-KCs$h#f~TCdJox_(jUw68E+J0Kx0x z2G-FyThER|fhVOY45$)vJ3 z%Rxa9N9m~NdRa%Q+A*}R%u<0^^%b5#!G)_li$8zVdkq`a^NM2C5kXrTK&c4nkcch| znaOqtZGJt?us45Fe0JaU5hp@Fx{N!zlnm)6X3q=xKlXs0uEJWQwdcco7sFCSW{Vv2sRwTCcZ4+__A~a-T!lI32_zF6y+>7oiz4%*+-# z8=7Bw(}b-n8wZ=EP|wJ_3#!XJ=d148?TXOjE;eSXc#YZ$L8=T4(m%CdUiNfdr&-6p zA4tN+ezGC437OMcaZ^!UdKOXZU^#wsMQ5SwX#M~m1J%<&21`BCkS+8=n0Q`qjhgi=TEq{44Q$x9j3}} z!-kNrN^18>uY6yyivkIF%{&wiuD+lv+v(tzQigX0XeSP=w#1&C1>xF zw{%_P&=rwYJ1sZN0=d0OwI!p41Y<;wpP6uRTuee$WU z&mguAG`62zMEvxkX0=X>lUIKC^>{L8bcjnig8^x|9fNmH=D5Q>Zn328em_&>s_h{N z(JO`aD>d}OP022Q*v;{f5`>et@UTD34^d^)yREb3nVS)3K=aqKRl;Tg`ZtCb*{m}} z5IePNqx;}nl6+ha9V(9yuPf7YX_5E&ae)9uCW6JW1ST78(VQI8@ znXpY>>Hj1q$ojDcnn82czR0*hy0w0I1RI=Gf2$4y^+pU)V({)v@y)X2LR(w=FrAKo z-<1CyrQ!xQ!#~_9GRf5tz0C0xo8nUCH9et}Ju=`9r5K;Xr-YY8!)Pg;86(s*%s!I7 z$k!vDn{R6AxHJ@WjH|7rtL9i2-|$x@KMtoU2^|?aV{1FX*Xwh$gPApj(60s&*i+R4 zV1Rjz%?45(M0WJN{?`G+{yYge_X*7mK^|{DH2BNMye)!m@*mC@kFnwHr4N=0B@&Ol zzg7uo8t=<$-Y$fzD|+UXqV1yQlx>8bTr`v|eX)T(+j$uC)s43}+3>v;>y+y^kiTJr z*Ev(mLSL*s{zaWGXwII|o-g1Up^DdM{^5SjRISqHM&wsShH0kmSKxt>Zu#W?v@Jn@ z)XxmWRU;We44VQ67pq1hybHl|ACB$wuAaSvI~Zd(JDov{?@}?RpSb-`h;<2azM-Jp zDOoHHbuqw?&8=&kMd5SyVy_|@5m0rv08tFIJldx?Gqo9>hM$JGe2jaSm+ddp@1^6r zs+PmqA3DFjc21Cjkt32@6@e4>AxS~gB(xhDzd4NS3yTnBrhN>8yYRAemD6rr@NMpG z*NtrhSU?`nF;W6PH+`r^avbi*a80ZBJ`)E#m`ux`EjLNoS~JWA>t-~%RdT5$@H z7JV&IDPK&$(YG>t%1Y3->bgLC?r43^&f?My;-7jS3Far$OmtzcOd$ z>Fp@mz}mP59JQ5aZU(|i0Es?ih5vNs&x>q^ibqE=L#c!__KS_O)zb_vX9R>=8H+8_ zD62N?&<-s6P?8_v0uSVndEzY+D&rW3JJud2>t&2l@=1+#!dXtHAE^A;<0F@B>HUw1 zW*hbC9&gW%zNZGdJv{b~5g;G!IG@GxExE$_-c@Ed)0P-dm9T$*V12(0 ztlUz8ou*l25wxQz#Pd=}X~VJ|=!kTy_EOkV{6tv)mNDhG9W-2N4$b=tvU{m)Z-#IA zMU6jd>qcy*5ZU_TfKUM!lNv}O1MX7c_K|U5Ai}vLtbo|M=KyAf4*J=MM#8D2H^-+V z>K^*CF5>*Qnz3xK_aZLBZg`suPdSMqF zG3c{INlBQu8w={)*m}E4VaMwc)2){!QNit#A-001iQ?lB!em++gj6a=IkTH@B|0d+ zi;ufwgHx1A&;;%g)>&~Xxk9(+VGG{aX=Uy`kXX{XJ>f9Yu@jFuA3(D?%^VMQQHJsd zXe%VA*~jDAsSHw6!JHyU1itVf< zO$Rty72bw48j}@-#PvmKUdLZ)j`Nb6VL6)084E#d1r!n}_b#Y!VQpX)Vr7D8hL z7*X#!F_@N``!gDo_}#(JXG4H8I`rDi20|!}svkG=Ws*49FJ-ZEhJh%-$h9rYH^>tA zd0l&Pw)lA#*tbL_zN#xllD8+|>1&m1u$;k-Z-Ue|V=W*wo7sF7mb)RfpxpQ<1h%!* z_bK{RMDQJx@zup(rC&u{OlsHKP>+1QSHpR>!GxiI``F(q056aW0=P`O6iB3}d~SYL z=3|^zmP4VD`EDC>QP(FWpbT%@<7Ks04KuQ3h{|ouV}M=RbvwS-lg&=bY0UhCrX+q8 zyz_KB_FjX`pfHf!>)R&-EZhDS+-=m4+?rn~KI;Ae93C*c>mwGv(bYr?WeJxftjrVKV9Y8qMvoC?1t#lQfj| zd*nt=j|9Bhl*(gcVsr3J%vOC!pt>KyUVqt!@VNi_Fj@lE7Hkfwk8$GIZt z7Tza_*0gG<8y@Gw9j4+2=OfkkzEG&#dUCd40;RoNjDQKfa9?0`$OG|nr>!goyR{Y^ zhnXG*qgTd6|8a>&D^0n;ws#HT6vQcx41)`%XPKGLb za$$mr@OKd&W4IA$w1*dnzkAb+yf0{dy9-K6!UC^3=H~#bFm=^G;k4*Bnag&NB41eF zZZH!369*{K3I?sD5R=jFlWi=1)baP|sZ>*I)DZ|U%zFNaJ5sjn)|3liylDNV#DCNL z1*17wTJ$+453Pd%yU->Fhm#!ZJt#zFrNC?+X_ESq99(^6dDw`j=Ly3|VGP+uj@IHv zq3WF+x+2cOQdw&);C;<&7Nn#U^ZJ2OVyM%f)a=kG8&9@kiU%jM3Cxa1>_rmay*H z&DTnF2+{jL^LEbGeT>ee>MCTUHyyQZj1B&HR^Ipe(`M_dI!vl_*;tRjo3>&2n?cR( zj~8ycTldlXaLE7me8nNm&kbRttE)8siB>}Mk|VwLsAY6d*F~3LOE)>_OV=9J{Uw0z z<=Dh^8CpswH8ApOZR^zuD-+{xaeOp2@O!1m@tYI0qFl)k-u8E%=s`~{`^wCVzVg5; zsI;fIeN^l_2oo9P;Jd{Px3|@(n1vk+DkH>6~4~313VKF zW@bK84D4*+>hL!7r8ug|yNzA=;-0iEW$y!Y8@&ndU+={!7Up-f+cu82q36R9sHocO z^eMI5yf%*x!b>kjFg1hc8cY@?RB+)VhHdad9p@jr%ga#ff%ZX3F^sL+KzUW8H|=Tr z`Ny0*Ub})uFiu{~%NGw7tfl;tJDe56(-~)>+Z=NH4TSf`-TT~eRe+C>0;yc;yM zIx$jSnL~22++bR2Y6apy!i6~2ccBA_q4OW~}yGo#A?VtPihw2cIe?xEoO8<|v z5dZ%+=ihzxZ>JM;ilCvP**HC|7<-2bTu#DeGk9{|#Rzux_6kXgqATx?tyZDk^>DRs zzxNB**?ju@e+WB@Kdi`r^G8Vpbao2u@_)p_+L|i(`i{^xKhm*_0aeQIg^`(-hzyJ8})F1z~8`~fHW}5cKB>WBp{v?p@=GNJnk0{{S ziHHAG3gjz3Z!g2O`aLktADHa7#Jt{K?uLyjY2Y&J!Rer+h(a7FUw}+~%@s4?HG@8CblB1?4~h{*=CQ=AV%x zmw4&~>N>v=<*?2_t$%c7^X*1D8BbB(S{P@-671;m`+-8f)u<}gI&C^n_P!M#ByoR_ zaOR=5^)5GW6?ua;-=TjO25dw}oera5M32UkU9NH)jyufOW=Meiou*0=YnA@GhI79z zdA(^tVhHiID2&LyIX~sFb3&Ftc5m0slnj2TFsa|UeS^m+62_QMR@kqVEiL3; zaLsE#uP?&`Z|o2982xQC9%zH_b|)`10=M)mF_>L5=}pVxUX!)32#!6?t0|OG{h`7 zxnd?xkUQ_}qQxINlttw<6)f_l+>Jyxsi>6!`#0nHIsQ*);Z9jb0)3Iem~jl?utODr z1Y}n;l%|f6e`dvK>KjvdiUDs+15pnLobghj{MaMgjnYU?GAh|)#{Z&mrB5X-A=JC7 zHf2$2XbDK2kV&z-ZJ{$d0rC?HIBLk`HM@0ljQSB^)*V8;NI^o-qqWkS+AZ*mwqsCX zMaY;UYtds&SHmd#Sq$DP+q6TTpBD>HG$n5I=B(aZ9I0BZHsOcJ{pc(Q5|K-yh+uQF zR|lDr1V_P%6qPD*ojc>z56|ZpYS(oq;q*s#3F$e%66MUgfQ655dKm_| z8)E4@I{1(FEgLBk*WOBOBtU(7`3$~!nA@L9loZ6@WE z@jH_9zP3-R&~D0wdN2YT_o(4Bl|zoaIB8h#US7uU2|)=-O9SN8cxU?ce1|&>9QKEl zlEW~TE%0&$>zAhYM3lg{N)@G$hDVUM zYra)hwo&6h8s=VR>(@5&N(}m`a)Ng4oAr>bM=KfUoI1U4r$SdjM_;2!Ss3vnbU=p9 z$Wzgh7!=@qPBqe}wmcOFc;=J-Mwu)W?NLbmstF1rqlm@f?Kf%g}(sWx2bJa1w<;#aGE-Ml~)3b$0@lKGt2&$QtX} zjFZ&ot<$dVy8_^?vR>EFwj_QZ3lpVVXN+pkZ|p_gC*9ddOf^3Y)Z9}+r5-7hyXx>! zLPKTSu7g2+iykP%*sF8Dix4@c<=MSJAv-RDJ23Y)`@nE0k_jgIN5tpExLjwc<}AZ^ z^abX`=zI+A=v}^6Jx|4;GqL}ATl{OhGuk$as-12)UHV}x6f(EfwCviqqa&~0e22|M zAnc-zok}`lptzWePAAD9lbJq45GfBUKL?Hn$7DCIasLSBf5a0tGktT0AImX9H)|y5nQh4MJwB` zwY|MfuBsTCD=~L_xN{bBYXDp)q_bNnn{#?3aroN1e3qk>#_pNDU&V|wt!FhJE$371 zr7joO9bSm>EGl8}i|gU*jGGuAAEw_@s$NRMJR*wn+zG1?pSKZW@Li3rD6QK{QOM>d zTx3#*NfdrS9OTP}zGMIFalF+OpVPJ5RlNkVZx#XbS|6l0ljt0@Nldh2wXqtN4jE~ zYc@aen@wi*V4nKA8wvBMz`UiXE6QmuplUPJy?J&Oo0JsNqtO!A?8b9_cqIg(h(grA zqkCvoImAV`hf*mgk3BPbE=YPC>9CHiM6;~7^Lv`>|-rp7ehec1{G z0xvtdmfUkPBB%y*Ds-MuIKyM78kGzJy)+^tve^r!o;4N+1V!s0a_1KYdq_ z#Sar|nalXg)K{2~6Q}u*EYteI+N-yR>AHcjgT2yxy09eXa6Y+~z8_K`mRNkK$>^%J zjy>W+@tE&Xl_J)!Cjo@z_&svP@&tu)(@%SqE0JYAdn|@)n{>yz zS)m7zGy4U&wADHZ7)sa@WcqEI?Z2c&oZ%E)Q0ly0Z+I+{c(pQl(I;9`woumk#hJfc zcBCf-Xk+$|s{GKY@t_-Gb9nu=g4@`7^wr7jlJk(&2>8*9*V6CO3&(aUyy5v9`0yl= zPKzc(;4YU>j-vL(^Tf1(^d}u);E)qAK;8-c>64Z%R<6CyM2cnD=C3a}N5>Lffrfh4 zoxy}nTZB^O8+#Rg{d^9=NZi@M{W>R3Di$XJ!YC+`>(MGyT%XdIP0811x(ZWW&0qBi z1XS~96lu9Bh={SUlN~?qeTE(vg6s}(wxi_@J_cxT*LL0pc<>&2ULS`|Yyu|gkD-u>d4e60+i8#T4vrzmhea?s9GD^($stAw zGj&J$3!BV`S+qvb_^H6a!41MgfkY&tcgpCB>zPsKYikp=9P_!;Zcjpj6yTQibc$*F z;dgtalozeJbv%rPX{;MzsO(N|Y#0$qresg4>64^R68SaBf1)&Ru-$!oU22!xG8Jy& zzXG^4QKBb@T~Yf3QAFgTK0MS|mX(on1w?~*pY;(@jlY##I+04RF6XuAd0zQjoa7vp z1nmuTW0vlIdAiiPt^R6v#4v0-x*8QP4Fl5kd2u!_9mltA&B=Fc&enZYC?J#H2sN(v z;}GYVGK%7VYM)rfJwLTY>~uAk(ntzEM!*9h{=6s>9MDvOc-K_bg(VYK1RRL*aD?4h z4b%CV2z^5TQ7M*?D*XdvIf5nEX6vozdW{mN5FQPAmuAt5j+O3%aV~5V3v$R1V#rPRR9&=~ddiQ(mM(Sm z``}S!LaM5TFpY=uy1`$!vO*+ftbcBiYcT2Fij8j?GQDo*fR;yKm+EC=oq6uN=gSGi z_wnZ4Fw7uPT$_Lna%q0HCCo2RtclYQCzLOgo{NCxr*9QpQgpDTdTxy5qA!u z9hLSE3+LAW%%6(+haFuF2HLf8`W*XL5RVt^ar!EBn9luV_nffSgu2x9NS_+j$1flk zs-K{~+2~|j-VnAAvvs^KH1JkEHFC+eugdETRMio~1UV_d$Sz(ub3_mA%?Wgj*u|K}oPp48y;!MWF6i^H8ua8B(R`J2&&4{tylSE>|kH}=E z>exz-F8sb`=7_QS#kN3Hb#MAQvy5Xrs%OC$>=SWfC0aD48Z3;h#c({FiY3zCsTTZp z*zO>oLFOIqeS9i{;GcMn{ingsG3S;;OD4|ipc@}wKI1c>?!4;R%r@^M-wKU_ZgK$O zvUrNjk33mo(c5`X``m7%=BF8li8>`N6{_L-)#vXRQ&+d5N%caLU-FvpN$Z|f|1wnb zUQUT{I3t0216$=P*Z2vO^$tZif3IXABOv{J}79|GVz-w{Lg?uxXd#8g}2gNb`Z3wL{3w=aRdbL91ZsM zWv{7zEh~S5cgacS6O}2tZ2u7zB#6f_$Bi*5*Gno+7vWBh1!GM;1#Do4okWYTVrs)& z3;rB8A!1nMN|#;4mQ#25cIr}Rv0uX0(&j;@rZY9ew;||-*dJM)h6r9KS!%u7PYK$e z>_P#A4Ea&f==0fF8CloDm`&U+<(A8&O*L!3>m={J*sN#Vb86sV>wSU=pJFzj>ySZ< zwp55Ui+hbB%o_qRT4Q3F8G!5(s_uvW=n&F1sh`ofPBN;~4gqSOM+mOmvd7~hrw@+- zF-xc3=Z*GQlI;zihDkA`pF7ZPbY9*YnRYm&y3iquYmJgZUfp}r<$7Zap+-}i*R2G% zLZ#tpV_PxstexMIci7Gt{8Bb$W3B*r;zDy7=h{zcygf)#ZAGf%1Vk!>R{CH?qtKCR zVMAoeS|DOh_jK$QNMkQVK83zVx*O<)Xw-obHT$%)pY7)@W(d<+^^se_7CAZ`!Q)X; z@%rXWb1P4{XhOA$Z56qjxTCXzi zIiWFRJuSlF=!XI4uma7ISFLU3kIBkBlD9G{!N;y~3!$i6ZyhoBa=4%)%rW%BuFbF(W;#VKv~TM?W{hZ?X~MwchlKeXbH6=bL4JLrr$)le9kG zvBH^7`rf2j&lb@K^2STPEtjYrt?zwh_=@cV$R?g=(Xv~u_RX|Z6Qn3MO|eO|GN64L zJIZYRQj+1iIbQj`TcU1+tA3epDta^_Q>~>x?F=j}Tkk#~U}L>25W~}T!}oZ;qJ-Vd zQ_Zf=hDmo|DW|RRG3A>>C^9YQj`-C(ZB+-I1*nJC132P*9$v{tKpsf`o~1P?Ri1r9 z!r}C)y=_Ss&S^mSX5k>-G)Qe8#n5HQBw+9<_!b3I4~)ocwzG83nr+L$rvxgAfK61u z=M-XN52@VQ?q+FL3;xohaU}YdXVXt%%h9LT1%5URU}p)LmPuPmV-4vOHQP?k)0mKb z-)$Y3&wgSJn;t7{R_9(e`YCJL9jKSi6WC#jf1SoJ{~|qG%>IT)4=;#Y{OaKPOjRRF zj>b)aPAVBqre^MP6fi-39Gm!ingYQ(mlHs*pLD5d3G|q1wRfM2ewN=V?8!c7#@Vsd zI<(rY2$HL8$HC;oBsbe8{Z*@oIFNhel>E&c%un z=<+-ZkFo&s(%Wa&Q%E?-U}ZHu1!FOB%McMs`)bY`{&hjd%_Aq{UQN>@{x*4@R>475 z)qE|SuxZz>g%J)Msr1FPPjUIk%MjmITFt&m{Mxr5)$zzD!KE8LGXQ0ABE2NB8FTg-In$cS}K) z&OWx?bUL@;{9$n^Vgd57 zig=Ay-p{>?AKp~A!fh?o$)+Qr*FJRpt)Ob0>my8@O7|YrIw?Q}T0dR)-uPckKK)#Q zF7u(6`DiKTN7YU$g;Od@0f|`M$+l(eyL&ricY#yWx)F{85FRqSQ*%*NFL#0p7uJ*& zdKOm8qb3d~7B9jbg)`YFIs+xsTe-VygsZc%B7~E-AY{3OjTLTZ!gBu2=}{Dc%;=xe z?+ZkGd&`*HsB)^=A#6gOa0PWI+JQnGXy_#Htka3v#amU#w>S*u3;ipp+F5M^mu~sA zvN$(N>_yKGMTq>Y0^_`5mCqpJD#C>BxKbMXrukaudrRM<1_G9QbOui0JD)@cUIU#6 z*q^a=>yu6*UVq7m2gnL!7SqwR76_22oeiv;I3f(c7%z?aGa{dol1oI|;j}uk4b?UP z6N^xun;$x-73@!fk6m>V0IkcSKMIYaN;|V}8(k<7v^WY#`IQm??YzPMj=S=-tBYJd zWW-6U&E0Yd0lWvzqDpZwUcmcEMei0D@FwIDWdj}qBE*XjBf^;$Eq`|f#$jp9>gXq$ z^+#KRznJGLnkCdqlLZXD@ma`yDLK94PByQHt!I_AEi3;%Q*wt!Z?qe0AwJp zWuN#wQXkj+AXUuVJhsiQxS3Fr6LKPfAZ2}Nkay^|LI@vZNVctKHq}|+(x+yEq}>47 zj19w#wb4pdU!`eo)PTpQMW~$$J&vtNuNWet*$#M(T8BFRsIe^m0O^aMNnqM4n&YI1 zYnGeyrg?f(fr6iP%2>K^*geY;L)!e(BYVHx|rTOQbB(wgBne z9s3EBicZeABT|GpD647s(hI;Y0vizxYq5-Zl*~)4N1Nt!CPv$b%9S;Jf2yra%vLf! zH#cuO2>Z!UKo>mkRc%GU=n#Pr-jJh9E!YIV%AeVkr0nxk5yUB(kRQ6k0(PSws2`m_ zzFqySUTMwmVv|N~M3qQ;J@Z}6yB-FMxX~&{j4nRFj((UcAIdk6sG@YIFyN+=hzf^% zvMUFby@N?@#~$t}ER1hjmQr}lVfg#@B>b=x??JQMuO1wN;sCvUSm2 zQ31DPTz z!Y!!VQ{D*aGZMb%Q1C}x?{l=XzM?e2Yn14&9^n%OcOFQM2lk|UR?`SDPC^(#Hn7*# z=Z*QVC_O#G=cS4m>VtYA9*Ets-WeODPj1t0*-9Jod>aS}*y$yU`1XgZCF8A{G|`*9h7`3gME&Qm&Dm`= zl_z~kV|LYN{G0m}V;JlQ)>junDB<#MBis7<N|8 zFe!|61qTrqzbp@f?#1}9Dp}``uQ+}U+(w=(JTICY3pAp~wHfPqZh2%iEv2gt(ks&{ zyAp@w_k>h?8WTdA@V(0%*=f?+Oq;mf%w()MbqG&Xr)}8`Mp6C@48=|9-2Mdiyl1RT z1msUodGQTR1cfJ9pY|4)yZn>_{35?8JNq{;P08WUW=xK z?B=MCR;5&slw>Z!#{+yYA83`TJ%_kJ^5NHY2(vRt4b+l9KoHE{FJ!&n;*Qdz1M^oy zk*v)~=0fi~3UZ|K299sis*n2)q~8vw^|XUWE5%6J@;RLvroNrP+DSrq)Qq=Y(!Z(f z|0+uw@;={b1^BojeG$E(8t+rnJC+#Z=DdeO>de;fVdgUe^KWj<*)hVJYOlekmZB0& zjjlw_3>pG{eniIC;6Im$wY9|DJ?@XTjljd^nsV}wF{OYDw?;?F`iLYGidJ=f7WF z;9+p!@Qk_>ywVWf27F$PzJi_VZT}I@__GVAI;X*evXEX%m;r*> zM%I6-!=pRh-az(v{>;bEU2E2fJ~E=C!v}-ymAq(Y3f{(gW#Z7oIN<5Qa<|Yg4ISo3 zK%nxPB2ty=YKXye=h5I&vY&t9Fra)TJC1iQ`;Kg_0bgE2k7wi}?(C-2t&($bUUl!| zoB&bOQspw~t;%#2z?zT#QNTbb>6uWXJ*HCt3!fMk zobgbj2Zc63&1}W`+`pqNveJM8M!vt@X0AyG%Km4haQb9&J;B zl+-pFN#M5Cty;hNwmTkPPggwA5ahm0e$SaE%EE-jU*)xj^y};i#u30tAV=N8LTyado60NHBWec z!8$ZY|Kk*BtA_8Km?k1f0q{Pff7bB#sL^Xh2#Y#%OtPA~5)HXZf|F>=Uv+sNU{Zz|wSS&35#opc@ z{MKLoP6~CjY8BZ!EiQ)y>>vLx1a95c{&>&)yjn(HAz4fbU%iaqzmEVYb$KVM8(UiP zEaxi@(VKPtZ#ZMCoxQzWr6O6-Y71v;YwJSM8hz}*HzHnl#NFzIf!dPB`==*P8C$P^ zIP$xy_nrF%SaYjlb9C`t#r4+9-F~r_yU;kMD zj~!6(UsKfoyQeYyk0=miD&F1ko&Sezb~=Did)J}0v;fEddH?J&_?$Ky?}7p@&s#d# zOun#pcPJiTX}7elH3QVCXONd_IqoHzAb<{>cz*NRTy`5^4BCypNAs1mpE3XCLud+) zmb0ZFd0bB;y8>XhH@X6t@S+Y`qdr5jCOs2%8S6n-)K70pSgNWw8;%)4=!njy{21NU zgkI8S>CR&!Jb`aFo7&L*33YA6BnO<`I^XOmE-O<`La#$)sXE@;${qVxF_Wuh?;9F% zSd8G{;o)tli`6Enp(yyt`h51`$X0LCsj^K+U%V)nvc93c-IaW`k&C~}`JA>moa&Ca zr|`A!`@cy2$+qpKI?II?SH{P?v&vpNJkhydhDD>~F;n@nKR^A7AGN~$ z_4oN1xj%$pZdh1Y5|YIY2TkhVb5n|Q|FTz7II#oH&kYuQ%=(Y)q_}{~^)wy*r`c~k zgo2VqDc|hxM^eiPzykgrMv4n!tHWJRmP#CN;$_Hp!EnT6N=h!3<6*B?R#)HU5`VX7 z9aq$Wl1{YL@T65q3A;+B#pQn<4v7EDvoro%*F62;?d|<8tob|b_y0T3|NVnR{@=K+ z!q<(XuoR`{?d=pE=gXewjrzlQdKs;6IFsOlNlFo`11(7y(AV0V9F34{!!yxwQn~%f zHHgb7CihaDvY3oEqV@lIgA44 z%c4^23qXOKbbbQ^JS8Kbkgb2|QC2=t%BF`R;d2x_%5?sOlbp)HKmrwxe4oj^)JM%ua-AJg zr}qYgR-Jh*Cu#7HMny%Xcmy0C|NgVnSa9cG07Kh3#n0S=<|3FE_JY0=dX-yNL){W& z*?;fb*2baaYjLcok~n;DAo&vb!lR|_zx9E`x~woWM4uv?_DM!53E-i{Oj?2aF`oZO zzn@6o*lO)*27Jh3-Brp#pmGrp-EZH_0FWi(dc+v!CU^FfB!1=G_DmEIrIE!VSCx}8 zVriQE{$M^*V`Q#qfefoJ^3<$D)u4$k~pI4uji6_HRg}&VrmfDWm?0OZe@mB1ZrxE|&a}xg3 z*9(I3>E>pWiSGmstT+&;j;FIc3Ib%P_I&nT$w@^F{W%ux^^He16}kkGe=pV34xQ-P z-yAUyzi*7NqyPXJdL|~Al!SWK{8suOJk>;-$4lCoXjNN+18i6=?WG{)LRcDs;huz- zg(sdW9wfgUF@vYSvP{|^23>UxE14r-+Cs}%CQFZw5*8$yt4uXqKpn_|V@HN9xfH1y zT1p{jH$pTD-~-g|&VzW*oQmh@;vID=HMNz(0R`x+TEEV_O4>8cWy8$#D|L050?J0{ ziDS5=E+zB1xYZudXc9mD`a$_M(sXrsVEKEO$!E&R zp@xX9_9Pg}TLQLx9o z3=kk5O6?uK!-hv5<>M&4C6m~ost+4xaqgyXriM%9=c7{Iw3K>t8gChV8RELWoK1CB zdXT0qLcR_>QDokwP$=V4_fM-Xvd9=0V2~Kylr4C*Ep6LJI>QNnl4`G|(AOW6Jr(xe z(QMF#0?7{RHEVV*+Wx9_B_8Zle$fV7$?V_u^F6XG^mJG+-*1_~yxs{lL~;cz`VS9D z=X(X674_`x`Ao!~WG&@=_FCOi5K}aNDuFzjTQWXVcn8o4_ZDnka7T`SzM#{_ZAq(c%vtMuq{6jcn6E@HL{4Elxtxwz9t^} zMWefhr$L}SKYkjjuhrHQmNW7CN#&y$EZ2<@a&7tpJg)q;06UYK45XpAfs*wTlcN$H zd zj+Wnr_pGNud1S8yKbA&!P_VNfoNjb6n1?VxR-U8Y?GL?ABl3sLu<3{%Tt{5 ztXN{aZeo}_Bdmj$$<$V2mL`tP_ibD=`~n);#EId0c`ZQm`tfg%>UY3O@ZIipB-HR? zLSVxFP2ci+uC~F^f+|xt0gZXEiQlZ-PhWfekDaIq&3l^*{-mD?(|;jOqZ-q4VQv{o z+^c<^i$;z&2p9>q3>4(Z`HC3i2QI^mYy#ylKBNY2f12y z({H&-sOm|_mi_QmbSmNFfX zl+$0;TEWyT`J=c^~@}k(Z*a8AAHp^yOktjX=Qu*>pjry_jz0FP9m^-`geC6Y-shv*E9(F9>lBg3} zC3Swly@Thhu6z@V=E$(Y;9EGetrax4N34#zahFYzMebqHyvD+l6|7_m zXsAS?ygHnqDB~%$V*iI{ReE-kOTwYa0cN>#zY>4-CS|#Gu-bdlM1A>#(Ei5-jmhcM z2kFM;-Tl#nOT{|Lz2h6HXvA6kQ^u%pJo(4GW0l&~889Rjiw7G1!z|rihT6v3oQ(om z3b88&aHmBi12Q-AR9G;t)B0R(6g@laT>H0~4aiC4MuN;YCG=n_dZ2`>{LIFRUqBW)nzMRts|N7}PeAk6t&d|R zyw~5wU+LfjkbF*%MEdEreq%2r!qXi@gP*kQhd07iS!5w>?A>7Lmg~@KSchSYLQt16 z^X*kIhjEa@DMwcmMBAVH1z(Wd$rhsb(HWzEFs1PRnU~k@5n7vxxsSW7VuFtBqZaY~ zpj#iy8(-qx1LE!AD^91QL#P^>5hdH6P~~%pU$oSVh(#+zCu|_&1EDk05WnO6eHo;= z{~HuL@3Vx>Z{OWgnUl%i5N$(*-m+<@CQ|OrU+z|8J+Nw_h`p`hlxORd3TAp3K?)vc zo{gHGx7G!=tHI~+yVs^lf~c_^w#*M{Nu4UZ@>3zST^I!MV;m&53RONyRJ9g4*A}sx z-IDz_ovLVh0Ts#vKTHe(E3Au7GPl5K0n98TGN`x^ex?3Ko~A;&MEl}~qVFQwV^9hQip z>WMeLJ1ILC$t(SV3~WEb*Kxp9&A*SF*WNLGV9s-VX3ONH5b4j~c52pjVkt3D-ic}f zP)cKc0f=ARhRpSClth7;E% zgr6;!Ms+<+#_UI~F0X!VY;-Rq`!wk1By^X<8sz!0t-j)JzeLz zWAdi^pmUK|j!vtb6#Dq&igG5K>{$Omv=GJ%hc*q<8)6xlsU%4kd6()K`m=cI z{i>Xiu+hh)Lt8z$SIK6<@UZ4rJkb98N`l|qNYg?;`!fECv%qFFbYv)C#lBjo;v3bZ z`i<(duaM`K#SZW(A9#6PGayKJkeG`4hdh&8}<)}YBT5#rl z&u&R$$&{4P_F|73xZx^yrqjDDUxvO;qMK@rO-Y?%HEHug()Le6PK_PusRK2TmS}W{ zALK$ANc4jT3!?aA`o;oXaW5pZLJa(CC&zSK2@6Mu$89^uxQm+6d{`>#wkrG#BC_9% zvkk&8WJm{|QX==o92-F`Hj@?m7>@Y+?!n7P=VPSRyp0Ifv`hWkp3PrE%%d0&*W^Rg zZah8}k&aQ$PQT7b(qI`IolZ7syZpqKfw;On_Ag(f1UmuPJ2J-Q|@4a4Mb0WJW#busxI2=a7hAE^u$XX^J|EhXx-xgqs2~vFj z%tO-u21SncY$%WPJ>N=>kFs=1C1G@YT$MrwjL#$s zW|6;b{2AgQf~SlXyIuE8<#7HMI<@f~P7gOYM#-A%TsP)%*>gBat-dVcZ{w=Ja$Tz0 zv&NcM!IxX6*Atr@Y?waJ@ar;&!ErCjSpoT<8AxiEzS5scr?4IGg+1*Vj{FyK%f)Mhls^E(_XF zg{;!~;qaK$;KCQ#zwEp};6j+ysBSN0sU{S#t}M}uCK9haDJaA$F+&uU9FWSpanw48 zbV@c;I4F#4ZZl4O!xd+y*9Ev6D@O+nnUaF{$iCrRpde6w~dFzym!C(-#8;x^RLP@w4hlcre_ zQ`c9KZ*mIg;X`#3Ih86lyc!>D8ks_JQoo_eE*6&8SzhZA2b7NnhPDGfm-ybaM(8qAH*t zv%QJ0L6v0_Aa;gvPPX&g=+3Rzz#h}F$9WH*+Q7(&_Of1g#Zs6Y61V%1-}6ZCUk}dg z6o(30fX&4ocPvL8Q#ssmL%VBXTc0Q_phj6oqy?-Du&B-XosxJlVh?x@oT0vVeG3uP zAX7d>8u~uQ#q5KtPNY0VUM^U+A7s;yoE@BI%*QgM(0lXQn5Xk@*EuUpN%}qeM-|@K z02jr5RkqsarM5}?r!-4M59UpF2U>cGVLy?Kt-X9E7H(We=4@Vaet1U(6Is+FU|qEn z(IK&?J$*#g*9ev__P2VPT0YOFM}z^cXS)nr#&#jklAWcvr|z^U!RWh2Ly96k+A5hL z*Xa?sc=gjZJ6c(WO4s#b|CSA-3-+;}dI|M2N4t}pw6YT+Qa(^jQ=uZ}qhh1h^(f{7 zsWFCjleG6wbdLBxH!)s#FM0-+6HS6k_4E+Ulu@wQFinP*Wa}3(b2~W+DID#_fz^J{ zY!v<_jh_ez;7#kQVLerF1qthCg~N^>idaTb%S(H}wv8?voIm^P4bl{IC*4}6@Ib{c zWDlM1oFB!+KK%9YW{b~EV=A!EKLVT1G_FTR@z)>xxsJ1c2mJ{Vui&ZvF1!Sh`8OuW z?qS^#gC>PQv^Yid`D3Do;eG*uaN9qd+-C{u3VYrb1}ioL(=wK7t>tQE@3CN6tYXNs z^0^J0s1Qp7`u>zO$WsBkL0bC>n4Bl}kXziM9U^^~YdlYd@G%9#Heq>#+T0$C%;a+1cISuDl+wS94HI z^goN_EiVk^u%}0XnWsDyw_BF}m8b@*{@tyyU)LWyBIJHFO%Lne5&St8OqJ8B<|Uiwuy{jMbmy}*9SE5kX8bJ7fxk|)+&K&e6rhed0|D`UjQ{iQ9~Cuz?R z<|c4ZHCQ-bvl%E3cm5Nrvc@g17ynb!4wXWI;SL&e0Gj!lD&rEMcg&cmZG}UWmDD#) zPydM+DLb4XL8w*JHBAHwWW|j+hFiYqsR!_sJd`23e>*d4l(C)@yT|kt#V<|-(qa2i zSaT$kg3#I@T3ktXe+KMV4#rrS1<%Ge=(*oE+tsx@Aq~dF4)&_LcF`Lt5R0x?B>C0j zf@~l;R{#caRbQ0v_9|Ya(RJ2AxeJ~Q{OL}up9_bl8oVSZF-dhQuPwQT5#ijoZ`Dt4oEk2el1mU3OqTt!a&tESVvJOlOVoAwDlpn{BisHe6d7*wcyp+&^xA10b*b=p2^ahF5+}0R&m_RTmUGJ( zQ=RBV{2+E#7@dm~X+b4$kBAN*K6pwFDeYRjl1v<2KN`y|)X+vBEdbvEw#I|$(XRvz zxKV^Vk;wi_$k66)Wu>S~)oA_3VguKaj{_X)`JR~i{SCevPRdb4nM|U16=$1R(*bE z+tx{CxaMj#J_D$B8yAJDZ(j~R+aqfgjWzyw{DG93zNO94Jf{#jkOwvveyYD1j&J1X zG6;9nTcA8s`nc{I=`v)C8MSuc=)?u+Mk6;L_U;ozEZ=z!KYOt(R>%sDrw-nxnu^{- ztkI>VU!NL2n{gdRBMAx$ei9dB=r1w`w}qrdXH~3bypvF)e;fkSop7h$Md5ZS)0glV zxsb|{N6Z32wYzt~!T#1G)1UcBd;_j3zM7SjytzR;rC(@eqz4Y^+9$G?j_TZ!o*Nox zeST6kj#uDJup#nw3{X0wx$dj&&AK?Fu#bO3QvKW%He1uO*kngv*35Z1@btKP>grWl zfv68-Qi5*RZ$GpXbs;GyEqXp>^P*Lu@|z=(kNbdlzU$Ju zu&5;VQphzh?ZjyhG97dD=>j!kWs$8k(UQFPpiwNp7LhYuTG3jjoWI|ki^2mrTVb1A=0JiWc*&C9E&eVjdc3bqScH2PLp=KiHNK zoF@d!`FXb##J%DwN>czAb=m!QQj$JQaG_8f5=r?Zlj0>|kFtK&c*M4<@0wU)mPj!o zcdW%sWao!@#}r|*OKpn_kzks!s`d(=EVRP~rSii8f6A@{U`tuGo5zg}rQImLg}U*Z zyKjuwzng}3KxE*v+LWoPO>BxQ<*#Gl2@4ZL2p zofs9YY9TtE^0fu#-}qf>Vkqoaq6q4?c)94-s^9DMerX@1MGh&|e9vE0eT{zRWy5>P z+1$V%e-TO@0;?YvK7XoE#wsbZrnXhYTK{#b{Vns>juINEU zkj{_!RRdb6ugF|9gg47Ln@+5^VJl{!VT*pCsI!&P^B4t}pP-hgh}7Emmz;q&A_q|d z;^v=lxl}AYP*>E+7}HToom377!UtMDl)JQ18<6f8#Il7*H_PxqlOml;a!|y(;uX z<2USwVxu?c@;J`~$cM@jn(AFq-r3k;L75iLx?T_zd1`9sP}8E~+dM8{h$Y?ii^0gF z5Ni=%Ey~Er3RN%zWSAJKnb9})D^1U{w-_z!c`l7u>q06Q)%;TndM9VxZw~Sz>yMTI zohI0{A-QQ6WU?67Rd`dIVd#(RwCOLvyPZV%td}oNP-YYg- zXL|82Qi)DXPm2v+S?wBpkQsxxS8anZrr;&eW8CpJZQbp?1tX;H0mjkjwy~0=40oxqikKIy ztJm8X#o5#|@6Y$={3YK#IZ*#nRW<>Z$#4|Zx8Cc9EwWAM>9qdQGvQd7kFtVXve#Ug zY=2pXzSH&sub@`8TXrIi^gb8y?Wq^4*mFz7&WVtlS!b$)5^TB%SH;+#jlW7d^m#iHI>a;bY5?Hq9-|Z0ZiQ9gyzF}ivCPG>Mh>o=qg_+iA#&jqeJ@8k^7nRYAFqw!d zTO0K{ zZWzzP>{@5nL}zD6W$aYQY`5ITt(eF2pW2dY1Rs~@nc0fj2oxNBX!}`h{U&BoGYevR zb%q+AT-kD`Q=Mlta0zid4DKqt`> z6;Q%VD%BY3L8aiS^#V@FaQhE1}&n%|~`wh25pswPK*> zmv!!<_j>{07MubHZ$5v;;o0uI@9|1K(rM$ZVb;9UXRo2|o*ftGdzUi~jGZf_P;+Ec z%;R;4O#L^EPz2`K4&{uv5hXhvVj1v)rO#!;mQ>yL>S zsg-I9P|P-^rRPI@LI=0@$wx(64VH8?4LT|DEGmau2HeKDg_xig=o^W^U?FV;))@skqPa%b%+HE3YjhK!#+S`BWs6KQZXA#9J)~*fOe^^%S zd}GHOi{~I4@lqW}`=OaiAwjq}{QhLi_52DJf7|7`I!m(wa`1H9L$^{XQH{|GWQHVO z`m;QONk=cS!x(U&eXWVTkCYqPW3;Ucb#l0s%aXF{uMK~L>y&8{KM5nIJE2y zG^jYH211P<{NNRTmh~nM=J`seaC<^zpd#`KWT1>atCy zZmc%|8zaCq4awFS`>`FTFLm=Tss!bl9h%b@ZPS2QOSk;gh`q#y7e*xiGIl#vXol&# zS~;w)WknW?a8fu}sr0z#rn`V|E1H=ul3bw|JZl_Bn4Y8D7PXfwg+)nI)7gt<6Ikzg zo~(Q8dPu;%O~`}S`)RU{#p78e&D#^)3ZEG}MFi-?8P(?RMqLYCxGGrG`4^)Ubxqdt zLq&*qwT?#{}aV}WP6LDKY9E3a{^wVDkM@Mb;7uzuJ{RYcbd+)n~D z;-Zszzj#sQ8!s{0*4ZIW1Dt2@4HrqKz2+|~9aHa;@d3Ti{FRZv@0&wT(RLFe6nYQu z!gtZi<2p~t@Z$y00k^Jhgv1ice$?o|T^HKgGqQy|r6)3TyhWaWmiOTx;;%+dI-PwN zg5IO$Ec>>j?0~1=mED#f)!<(4r1+XvP}jrA2%d_+*;aPy_8JrcZCw4?(nMf~y*04i z?f5)!=5)`BtbIEZmf$Z4Rlmf#q~ckx2S=u6V2%JyqAXS|pNucVD^W*+R;V+Xa6CcV zg~;o`{}~G@gH?m}4hA9f9vBSkBFiQiPTHGdd8SN@T0&!<5^g$N5b_ zMsz$;QdB-%iBKX!*vRtPt6vA0!q*OE%`e+Ox*)Z{W{i*cDJK;tLJ%3v>0!|TpP8aU z9Jp+|A~1J2z-0VlOms*qY~_R?d;pV_O{;F5i-Y>n%!=N)NaA#DM(gd^7SAruE1!W5 zGZ7;4cqH(%O?E%>&NECND@4c{ILu|dAwwbJjwcssyK*VBi|@JqGhs-z!gEkJK<~|* zEywUy>;WQ>QPe-m)Qa2G-wfaaZVFpsY&g9>;rxDV{!XhC9~_IN16c=Ot4-K&xmRN| zg!`TP${B3?MQQZ1D|xIPxp&VX^BYO>17robf&($>V@96rvdBML@FdHjKjly%mX}-S z6%zBSp*!&jqt^S?&nl$dbnR+HOo63b_Sb24@6%RCv5*t*P!L)vco7j?<)p<<-e^ck8t`1oPl4HAbWh984#P0 zY@{_iBw3*bl3vL9=MV`%h2PSS)lJ|)a7?fD9y7Cfw_#~AFEDOung&<KxmViqT7H<~c*Ou9B^#r3s)n_?z33NMpjgV!BsQC*OZbF>3=-J!mWQz{dNSr zYN7jS>*eSH28hh_8}x{KO?Pa|T=n3Umc9L%>Kfzn7|GyuY5@qde^Q&UXB0Fs7UhuK(|K$Wc6 zdY}K{TI1Q>q={LdEH&|2Br2s6q8_^o0FdPso<{NskGq@}_q2mWMIHJPzG+Q@Hqe0p z^snZo27X0h50gDBCQau0uhPeMoap{lB>YT;6Lb74!z z2|P(ZC*0koa7dqKMNw+-FdAJFaXNf2E8ft3J(0q7EH0~BXuAdbJ7CJgD;0r1+&9yf z$Ex=kY$;?D(qyJ9es|9(p#6PI}# z@3F=9qG+DQi5fdV(|`YySOr|9-P8GhiNL1^jr6Z z-xS*;ct7R1dy34AMC8J{Qan!Lq8rnN#&Q(KWi);NeCJ=I0(oKz5I_-eQT51pywi<2 zN)L4`C6lQ@#s30VXdKLy)-O4G8|5Hb%-xJM`*&Uu^AgVvFW-+a&NE+s+uCKj(zdRX zRNjS-IDfgSEtq>4eA`U~;BPCE6Y=J<#Gu0g|$a}`@XUOywtdr!2% zr7WhS+RMFp>%;}mk8Ve|q4r+gG1b@F^_s<5a3uoHh8H=blCB)>Nmw^rrd=OGy#3&I zi;HR4=xsIiIKTxM%(d5_!D;XR0pG3^hF6?>MCvwZl-xm~cONJ;A>c$be&m6VSseLl z45%dhMENw5Qp39eBRA{OXJKqO-f+;piciJa}O+KTifetpXy=t(A`KVzA(v|FA zaRV6*k|c@>*&m88b?p&fX{HR*m4ha~>b<<|f|j7RXJ;XXqwfYR8Y$)m$izJEX+V2A zwKqg!r|e%8ka=0iP?q?QgQooVL#hfj9L0Sj{5<|~b5b`U-RcTQqcrXdT|2h?F!O2% z8XQ7gilooGDQJr-fp~p=Ra8{WncOh?+{-ixqGAshPNgG2K=aOb5dnHOtS)ho*#jA7 z4e$!kf0`z&Zf;Vbo36%S>(~YmKA*!_}SHHVv}4dPh-eZ}^Lzb?rl(-J8D_F`-%rE&FAe)n{eLlmG* zwxP}H@&Z?D=NW|;ul_HF3O9A~-1&FPdFc?I*m5(;#-+2pWY#norL$Lht>*clTa6E+ z%66f}M~^;8zNL^@tJl!bw-uhM?%6T_9M>wDAwyI$h95UkECN;o+jmzJ=a_RxvO%tbE98Xs)k179x4~;HXEgB&J?f|tT?-ah!<^t+jay=v>vz#O^eUkdB?IRo?8=YoAJ&%Z{b{l}qX@^m^12gY8|)jxitYm52-A$F6~^DWp+e&c6|Y3QgGMldeyl$SKC-aAzId1f ztJ^ASX@%(F93WyFHPKN-P3Hvpcnkz9+#4t*vzKP+KYBJVPBg!V8Vf4)1Q2eZUA6`g z&LCHC{bF*lw~XN}@TP_>b%ZJ`GO#nFK+2rSc@gBh?etB2XT_4oShJc0#)6+g=XW_p zz(!X+0aIAiDjjDs|x^V{4CH~l7Nr!-B$T$Lk!Gfb?GCG6L zdJdd}(JX>jWXZ*pWSeaQa{ppYDf@7}TofEe!4`Y}y5{aoDXZ z5-nV5sg*d3%H{u?=PfHMn=ZqkdH>JbD~*wuV1VOVl#foAo~@X`>~q2Odfb2kw~5&f_T?0|CR*kxE6xh|2&CU z!sFROcrdR$BnbDPe{ls%s#XO4kiINj}(l=8oz>H^53 z0V8!l3b*-z*H<`X+dj&V)$m?wR~#o{MPbct9R9>xZ(~IW?wBsD;q+EuyyYr?31!6ikC<{CfF}5FO>skKb z!a7(+Ys3^gI2CRPx?i9Q#%&YMrw`;TA4Pu0IsqZ&D(gW``C2lc8phj9-dR>%%pvJz8Ioxcw{lkKiPLomz^$7fpM@Wqh>ls4BQK3CxCnc*9` zFrSvqh?IZVx46ioN3&B+%Do*UrhT9p?e+C% zCbpnWYDeYS5~Zc^gqv06Y6Sk`vy@y@XSsNOhvUA_4oF?uc~x6Jc{CEuc~Wskgb~+7 zn?J<9p2O}R2L=$HzGgbY;IW%+PiN6B&)S3lQ2{`_ptQa7&65LL$+uS&B;PJno&_;c zjwQ6f{L8+B&p7Hmyn>*cJx1)dyxnampSxLR8{d=a$;Clko`Gekqs_+v@2CpJg zwo?AIzTSQYzHfJ84-GM7y;*3FP)n?86|(5g$G<7603Kuuca@*&dJh zF_RsI@u7G)`l27;>Ypgqwxfm@zSXIB0-w+GhMS1nWl~SjSQ-osM08o{*zo0?TbZtI z7}7C`JEtLiR8NDgzdV&$z?+AXi{d)1pFT^WUm~Euer&tU8wTyAeB_cTrRaI5m*|e_ znOO9R;V4u1V`e%sUc9GAgbGcJ=8eo-ZZ1<>8t-hb6(A+-*V7#K~bV~7Z+SY zF(IE{DZPVqOt-SBg0_N@{!>fn%>@^9kryec@7Q3y)It#40=JKO+OpmYYJsh z*>)At%y)rh&GptZ>oK&y!!WlNDp65M_GBkxB8Mja&nRwwH|*-?s1hYIjHHkY{S#5y z|41&`Dj8c8fROfD8yDg@(#>zEgZ+jXz8u(3GVg%i4rcP2;uDaH$JdSGj@`+%@N&Ff z2e*YOhXq(X1~%t}HEtl~S8&=2Zt6Af@}Atr+g68T|^7*)nZaQDTA1Kr44Y$}c+SJRTR zI2Z^5X@_1IqmyPPV_OMvjzV%yXjldvL`e@zmz|>*FHSBVd)}^9rl${}uYgMf0Nu6D z_De7Amy}|onRq%Xm23|9KLuN&Ces6S9(VbAr_A-J3bcZvVYJ`h$T2)mkEUy*d2|P^ ztIJRlY}}qtsfRVRfa_Jy))1lZKCHidM7ayOHsmYh>PFEbxcL+OE5!!2${Ev)pfGt? zA+$bLA)6(LL>xG3<@Yc zB@yfW**`+zt07z85bLTc6Anpr=ymcr<6Giu+KH_Ymc* z|EOj}-nz=5d}zbjsDzrlk3IpIzx3)fsnM~Kz7btB#%P`7j8qcNVKMZsGX?&Q3zsXT z8kOpc*Elq~gJ6R#GC7C==O0!N$!wioe-xbzc*(@QuM&$^qbneT%|Mq9NqL8dI{0d1 z))6C_Xxth%{J0iR7#NH_ww2DaS}>0mOzRf)w?250K3)-*|DL^_GP6vDOzrL%9mQQA zZ#k;#LEZKQAgau;xzjbh9s=6NJ=bqvOy}nw`!sDUk96A+#P<_tb~~`P@NQITX$0>V z{f#QUvKGO)3o|pRH-?{l_{NV^He-JJteiNG*Q^#@Eo1ZYb335a0q3YIJ>ck%SGpTi0&;%ZM?)8& zx~%mYa~7+prb0IG0|v9^Z=~hHOWc|uljJi(kjE(XSfqgYLhqPDF@F*l!PpyAB(?c)LFNT3~PzZIXrc ziX>i(&d9C*I?6pSM|R+H&*zeAger1f-e*U!rJ(=SRNUg&;f6$RO_8_Td$rAG4#(SH zpVEyTT6dZk_vR+cm^mggQuHM?0;$}xpv!`fijW`_N^nkoBU|Rk!Sf-E>ZR!^9kcnj z5ECRL+dY>o!722-ji+kbAbnctl$8>9chu*#D}Xr;U#l4b4k^cmG{)`NKDm z>(35BXt4n>HsiQBV) z=P0|_?~FbU#{QG_RP4VXAh+aG+Y7j<9~d3E4+u6J2D__dH_a~g5nLMAQKqzdH?U1* z@cfE$ag1V!7{UlyW+1$hp86)nX1&3t_7%QBu9&%~4KGBidtmW|+lG0b;an;G{@m8!EVX+fC)i z3LzeY!*%vmn{5({tyLgnu7Q(qi=5gow?S{Y7hK+BFkY0r<9R6BLfh>U>XgSc9hp+~ zIm)(+43NkcAAi)bZg>_M=K2vEPV~zkKj(JAI6qIbv{nOc-1+ZYavJm_!r;6?my=DtwG zEBEl-F@nFBF!p`P?qziMA{z4td{r5_0aqhU>cujDOb%b?nk=esxC%`%b1rPz7%2Y9 zG#_T8`m>(meqf|qhB2PN-+K^!rr2Uj7J+nBI$?Jebaw3DYp;ym!43RuyfiRhWb%ny zPCIxKnJ>41*;-cH8yrNmy*31I%c`N2_57VW5l+jP?-JJ$@B4eR(l@xKHA~lt;PNHW zr^#XlAOBi70;u59lYm8JUw~cyOK+b_2dJEMLrrP$<~$0?#4jvHq`0IMI7I+^{B(B( z!JxW*E7jNlZ)%f?53o)!si|d*hY*pdGFS3To|+fXpu5@e9qSZis4{-9Wk~&D;s( zcAGbBa@7izel~TMK_tE-(K!~Qrf(7r6!b%Y^@`ssh(T)9&u-;+aC3qi>D4$!i*~c6 z^B>mR!{(|xK7Yzq+}qq=VTWZvZL zD-HfJD}4eba{gEjf%xnr@$cOa6!E4L(ez%yT9DzJs2)Bx$lLRnv|2Xryv-E`Askzh zVw-9VUp_2^!O`?2aJX2_B-aWuaSi+!QXgCe^v%wSKJPT@nsU~T4M`~;u1s#e9gDi@ zLgP;j<$prva5V3Vn+Klvy(I_A`qAU;bx|3IGtNe1&e6vdsMv65;OqNM;_R{~cp7J} z{6zzo+Yw$8Hv3~M^agQzL^b9_I0EsF#6cRMO6g?y!asw74`nZe-HJJl>hwbnD<=}Hcr$e|y5QpW~_2;C`^#>Wy0#5EJJ_#Ri*?Y9_I z4CqJk?&h33hVs-LkGHXc{rSn3ka_+fQi|g$;v<0($#Nt~Pmc zW(Bd(vs6R!JB6mzt9PupC;+Q0ift(&+FE^k!rg5rV%F`C^ocw^H(i~BAdHQ$*P95+ zHc3?+^sG&_Ii2L7KRfAF9o8?u8+^dU6L_`dk{KhRTADT6T;o7?2(o^$o}G8? zuC0oj{F}EX7kD`ByFbT24vA>a-eZ3J@w?_MS40X|2}K*dUJK7qX40W#@X&jjrTzft zT28?$E)+rkg4S^Y5Rnc-_nn=N0G*|M{Af01`|0B*HRMb&gGnB|e{9XzS21p-+iHFA zf8)Rx7E;1!xH)q8=Nw4WU}yiN)Rbc;$j`$8=ZCDKjxQS~pbXr~8@tLS*f0F@K;5O6 z$2!B8^vII&zPQfYe6fvVQT`5CDQR%ig`yQQKWL;#w2kg7oGYF;$1mB8;j(?_>2tUz z7;|I&>t#W|N;NaA*#OUeHI>xqFWS>iy3vlNR0Be{0}wc!@yuMmxuRL!2V|u;6TP-+ z75QN^Jz0*&2bRNYE#FrHk8Pk9yB^rpZJKR~HQf&LsNB4IhT4Rq6%`jSZ zYN#E5Ec%(hiDKMLj`3*Fy`Dc8{1|Vdw^7S|jCcxtaH(40S2f)Zt}vSE!8%MePO|wy z>J)+O;!A?JL{?xe}(lcFS=YrhY7G$DE2q)A35#wjoWf^4{{3RkU(@~?c z!{=s;Cr;xag7BH-lzAb<=Da~(Cn>1HggKA$rn9Z2@CGR@x_=-Xsd$B?36-sHN;oG7 z)e_dRNp7KOQe?E5B1eI$hz6dy_O(?C``v*xS;w8leb;(_Y)nXlz$`t5m|d5Fex&u$ z=G`g%uxhZGU${;0f|~r|K(->LN#>>JTfxz1Ff|QOP5E&%SG)hYUA)0cwX&1`n-@rg zguqeBgz2L7z@su4`BoDFmjHpt5oT;EL%22Q@)LFS zur^PX#oQS0mCyPP2P^(gKAj5ov#XhEt#@FE$(?(>vi4Z-_>tZp@ z#tRg<>ZiP|8d$)yEB?3sR<<*xHK0k)=Yv?N+vxyF7-;UKMY;59yKy`BhElmB?>3@cok-Rz_guSI5{X#6_A^rcY2-(qYN&-Scc01!i>al_thO^w4U%3zUsXC)l-_FN z7cAs;A5Q5dh*LNDE76hWWU~%q9-WWC$QufkIjqZv^c3xe)9qMw>EBoARaa>MpB49Q z35C@SEVfQFq+`$AEfXd{nsr(plVxfP32$a#L1AfABbII_%6E7Sg>m8W4o+Il-vPlx z754Mis=B55Is2Dk+hG(WUdft6@bERn{16OL4R4jpd6Ta5CQC60=*>4GkM{lVohU&# zbEKzLD~82)Pvxg%L#N*FG1r8Mo$~9+L;}AO7J9U{hm{;7s~1dMoDuCv`N_`mj1d_u z+Ea<1JVpJ723_}JplkSUjl??0a&>YjYZec~$jLf96 z(LgcKY7)Z@Fc8abbPvw;s{DMebB=iqSdGj#A9#OU{R+pBw2~zwyufxR1h3I%->NJ# zG1K6aZOitpQ(fHA6~_OH5s9cF(+qhYfF?;sGobeWfY49=VbIlsI;EurJPO5z8Pv+ECZ^)T<(k-)rfZM@zFZM`bqCzXwNt6plJ3? zQ1}IX-;-U%w%faVbM!HW^=c9D2;cIVeZg8)-D_`@(5={z;=ZQFi=5gQW+y_^<&UM5 z>zlFU6Sa<~2Uc{iJCXkCBcu4j#ms7~#B$NNLIH;Vi?_FoimPe2MMH3h;BE;JT!L%R z2=4Bd#@!{s8i(NS5~Oi=cXxMpmqu=rZ|`rv=bXFGxa0oV>u)p0TCA$)Sygk+nv*`i zn?u?I$80*JYZyc`pKmTHUevM>(M0DAbA_%Fp8$QK>`E}_G^ruSD6C9iCn(!7!L@mQ zQDjZ|p{R zZS;Yzc-OKMgoSfLRl=3OvO<`~e_4m(bQGS)p1^qp#>i)ZCz|xxZViRz7hZ2tICg z^*cq<17Gl4EIPi!*=P#Iy>&$1=_kyj8XM&iq;VE&9pYpDf7s6BoOxJ$pR)Vc(nmoGIXvEd`#0MCv!zFi`RKWS+!w?CPx6rNw8 z<143s3cmFY0Ph@2&eGIob#|d=?sG~}n>h^=kI{E#%ElY)|4!N;R@Ln(`aZJ}c|E#I z(s_P$y1`;-2ien{6wva8Q4wfHHtB@tEwF&lrMi)sd&vQh7%(nDj@Y{thecs()ywUu zyOsqHR*dg-b^XJ@c5=XQ1Ozly0O#WgS2W<^U7@c;xSlf>WPO|O5{94vaI1%tDMK3R z(d&^TXuBKW2q0te4jtuIALmP`bEZBhfL4s5CnM$Q!e$PFC zBI|rQgy^&eO@Vbn&;|PY>`_-{WvuBk&HG32wY-#WOkS;lCS#Ol4}$WtW3t!<#`CqGtz_T%2cD(kFRr!ilmKq1 zYh!aab}k);jh5#t#oP8U_ttd+o{BaxUv?CV)yk3jiJS~t6|5`tCHVRA7Y&k#)gE?=fVyXNDmi!^)q@CP{0i(Y0aV8`xU|{xyp-{S zyPBjze&}b=OuOXMbS&m+Dtfc(ZBJ05C4xxCBM%fEGB`LDVtcU6$tKk%AYQU_DT3g` zA4u9;;~0Ww9m>-PbWylkxyJ+(W<8DP}fCrNshJG zc1o3>5L!sOS|>yr+eJ@M{o{>&N-z>j!@B3r!}EC53Ufj~D02-k-9b4?lMm+hkL0eA!{SjKt?0N;(aSC{3K<7q1@`5P&X@{ z3T9W)7a{xZwAp-xdE-$Tr&Ljw`c70ld5g>MK?floeFFx^j}}EV4b`z6Muj%hZfC&8 zc7G~v#*+_A&C_!2x%A(b`XDPMXop$SGtBtogCvP>i*I^ou{^nYN$idmqJ5FdNuOA3 z#qo(@Zi9)BsvV@q-nqh49E~IRUE5xHD*LCL%7(OZXlpC=37cp#!|(PT|6a5?V;q;C zDJT}1#&LYkqmwJMrux0&Nfh#~>#0+BhR*jbtN`11jczAyCwhBDt7LUhZS%&H>$hW0 zOD_9Q(~nOo!71MAx4Qs=+zpdvY>1AUC)e>z(9N;x&qqsnTYwO!R|U2;^SgA#$3-=; zc4FOpSXpGAO&7O5K&ZzPlbdAf(VhwqYZcj(!v5ZE!; z%fx*xc8w34_s;%%a!*c)d;s!GXlFgv4xYQfZ#h#Tcigz+x|HX)rtzru+|!`}?)bBi zgFW5Koi^0Alovu;zp~z5B7O3t4rU9wD4YM}E?oLKrp%ZX$?^dO`t1WeQ1dy!HuiMu z8>Y-c)%Dps|F}GcfII!JD)j``nFs2cx2}A4G08T}ry89GGZX7!r|akQ^9MWCuW=}Y znmJ&JjEKH7W672-rlPiD*MZKSCz@E1@)f<038`Y4p`;G`VH7jQ)#2+|!o`9$yE`*$ zqw_lLf|qN=4}m3;g)vn?xwlag#E&xCQ?zzQz4@3kxkxmVzmFdfD_E@0zpZ~QM^|a; z9Lo=e!r_0q&`xC_?!#0>Arf!K-qE5*@Zaxsc`sgimiD5x8MCV)yCVNDgQ5gbW9JVD;ud(`D06DX>~IN)y=~LbaFvx zV>hJ&UH*%s4?t5ff+pdTK#)yfKC$Cg$2{EZFDF70a7Hq>EZw*1$_od$i!M>imokm& zg6askkRmtO(0QH#kF-8?oNy2gh>B(FnKuc6bSbcD5VXgt2Y1!1B_Gv@4xY}}$Qkq+ zi$Lr3v(-lfNY+!{{UqJ6W3!<|PBjaCSa_mLmZ`Ok{@G8D3azcKD6Pr8s z#a$Qex-s@Hxgq(s;3?~Jo#?Y?nrGlQ4X^CT39U{;-&Magj{?<~w-zoa+JPx(Th%Fl zUfubt%S$zLFXvuj>hWoZ{sIyaC*>g%ZAuPskSjSIX=pWE8n5|dMcd7jdzDGV-+$vi zFpY=R0iNfCzCr8oOYfaS+fh;mhCW?rVa;Z`!C}3+!qFIL{d!j|9@BfankhP`RaFt{ zvAXVTc6&*ap&U$49b^0?ukOKdTUKweXiM8vA`#(8zyhoDE&emL)(9(Cv?XM{AYQ=R zjG6ah#iBZ9vmYuGE#!A7T{xm_o$rpn;8=OJNmZrkhgPwF98I*wBq}8MeO&%Wa3c=s zxBC}ts~B%!uz)Lzr28kEa>Dyoo+_ZvO26U;c{aQRKLsCi{8J^YURTvFMoE0@B$w0( zfxN-xgkcAS(JFwp5##4TM_;znH3`4JLJ=M-purGefFOigZ3tq+#1vNbgOTyu84=X* zM$%2;t%E%;rl(eGS%nubKfRS~Fkr>RF+Xp8M(u;|g8zawL0&ng^sG{0lBu2ts!~si zH3pT$9xs@fo13VI#0m|^sG!a&OtxXS!?U2u!N`9W7mmW5df{!G%egzj%&QD@UeM+C-PmG`f3XRx(+4i$HtSIE2YPd znBU+ELe@H~J%D^6A(8UTtmbaXqJd(oKM>QcwKNgVghR%vZKR5A?mDz<3Mjm6dODB1 z&MY+vyXj=r^oJD137Upd0pyhEj7>1(iK;RYvq*02C~kYzr`Y0zPPL@_BzPAjadHJ- zSI8VZmEQuwMM}?Nh@qi(lh;rEQ8)fF*MxVk!i11|K`ipLJz#U6D^Io3ouVc6 zlxQgAU9_HNz2{2Nn4ei5ZbocyO+;^c*Jj3G+}n+xxlufZNM?4$p&#ivN;^nO7NK(U zEA{K`Cz3&SM8Rh?`35&3zGAK^5nIO(Wg2LlM}5MH+RS1yL?Obm_gvdSI#l@v3s1-L zao5P4qzaX!3qI-W(gRqnpEq1HZRq|SoigDFKX)>l~0Rme8Q zqxoV8*#BZXO<^$Pe-dTA@mFP?8HF=WM4WT_HcZ-z=sv31zTN)A#i~xDb->Q*8v^el zHs$7Q@-Z{yn}F-dYH3%XaXQHBPAI~sp1IdH`i13AlS5Tj%gN?*tqhdQ-F@KnZiwAQ z`!0(JsrL-#`-8NFHY2@BW*Rw@!;tdIJcA?Ohf4zBS-uISh6fqNz+JkxVr9{Fvf-G0 z!gm$w+@|H(<>p#6^NRQp%RLp5{+B%dMoHl^=nt=H@&-_h(T zf3>SR-)g0CVkoT6f!$U5$ErxX_bt5uLUPp!dM}0S{>1Qjs|*%jm8%C;N}3vc;JD`a z^L(JbY4%UY`L8hpu-KPQ**RjqJDkU3H~pzL#2+uhmVh@@9^~ZQ^iOC(^g!R$Hoh!C6&XZW&vdMO|xp_R_+xzNt6@FPWwJT4W$L88m z;_HL#mzby(PA~i|YnxSJc@0ibJvigG*>lSC%CFLixn&vp>c&Fei#YZuyJGWr!kMKS!KjQz}wnsq1V1M={10 zm(kO6e0dT}yD8Py^3*CP$P+)^8Cv_npdcO^$;!iPHZrw|4A!z?UFSvcz;pv%b#ZWm zT|FSSHHH2~DrT3^0}mykCGF5h?&`SU^JJXN9_6a<_)aLbcb_NrdPK3g&Fyg*>BH>F zI?C~ib<|jKZT~qQ1y$>ZM~}wr5K}w{OK((nr~LI`v!n;q1L)n~D34XDBw#fM?A9lW z8~T>PXHUn~%Cr^B@hu0+7VQSO)>VYiBv;V4TTiCXJ+eV&kyLa~y=(XFR>C*TcUydy z=8ZQ5m;5KrjearctsO5hF(Qu@bg+!uuB0|(C*EfG0Rj$Wk6OhxbkE2`;g1*%{*{Vl zrxoxgWMgEWa028PKo97~wTTh*vdaCZy%jd1R*#F+hO8q&kN6b@57UQ?Ss!q06Z(~X zr*hP7^shJ3v$E|EjJxZ$tDXq&T*)HAsQc)rGa5N1-te-mRi6nK=)#E&(^|=_xFRN4IY+kVMF-2-x2hwL;pql~oi7!G-#5)^qRU=H_#7H*XTx}VN)?f{1TU!KN|t`w zb5-cH2R#vd)1H{D4P>&80G07oBYsEcU2FL^5RpY`dbPj%3-|ty+O6RSV`J#w-Y(2C zi!N=0i>0uX!h2x~m@4R6%%O2~SMQN?1+G{o(@IggF z;>BLop&Buz4Nb%6-~$fs$xT*%YzCp|w7rQ2lzR7;?%u;t)hS4~A|B=jh8~`r?T;gS zcCR)l$hdK594S#gTX$2Z6z`Y*teuZ7e)=-)G}ass@;bObVrpresf#Ixe!0JD?W?mr zg1gpae!7;ImG}PCIiG{7cJ3XB^7bNjnzf^Ulh*baN{E^H+<60PafyW6C9h(%d&zVT z)-%v8vwQ#jk<|3G*{s<5r6vICNZfU6V*;(@*yopT^4UF;`4!Hr+SqP$T$nFGgIh(s zM*8yIbMZZKas|;Iyf~zPapiv^RlPCI>gs`?Avp?j>(Fj?c!%fZ0T0`6K8?K(1A0zF zE!liCS2f+%kW2N6v1Dwk0T=JKwBvr*n_Z2y7T1-J9|~Uf9@4Qg+l&0UW)eKA4 zw(@{jF_Q<^pck^xI{e z)kemFH!@CT4aez0I7cZ9oiZLIOuNbHG!v0whVE*3+ga4s(>>#`mKK1T)y5Dq5ee6J zQjM)+Fy=WmlotsX4C-xQG;J#KB&XiuXO8-JR-e(^b+J!4`jKzR`KKh&+!@6l8Z5ua zN1MxdKXUMK8lIfpdl73*sOTR`*;_9m%|MlmDS^0?%$_CT0-f^>^==)G+$^Y&rm7l! zpRKEM*z85ocM0g28;x{JFY_ zBvZg5Y-KF7TQMnOGUH2Enzxn$*8Yxq=HezhYo;k?O*5FaX0PFgg0j?GH=`fLV=b$j zE)y^BTXf1%>$%dO=<9rh}EV*ZVmP&b_Lw3ugE+d7q&i ztk7bNobU=XaNYk(6sN2pm!9_icg%O+Tb2yS8IXTnMv(04e>+%LkpCl7Tpi;duGkF!lrZD| zQz?zy@n353DA<1*w*UI?ZzIjm&kri94FVo4hk|Mj7%O1NAO|d0AbTdrl@;*nNZ(Mx zM*5?4h4TB_{i@bAE<_jwxj3+|-;LSZ*a(0A3{_lGG9AN5^XU`z_c#XmQ{}6RL1x3_ zh3WxIGBPrcr|a3W+FI3<*`BH&lV!$(xYuc{nwpx}c&kA=Odtf}9dw#7T-ScvFMUeU z^aVcz+nm2}Hyyn>-hbb9Jffngd}`4Z#VYgVPE$zgP9(kd!E<9p&#zjlv`&aJi+AVf zC^SFaOQXKo_0r@$4Gn#*^!3RyQD*?EqLue~Hy*d=LzUfP$^+wO_PO)~whM^|-cy=J zW*$T|d~CA|S`PviQ2f6B73#==?d&NmnVJ^+8Lao9-M`h26itfE3e@jypioggban_%qq;06N_WvM^Sg$+o<^%d@Pi`xC9 z-$zHftQ~S!?s5-^0iGx-W5(>z`1m>FwNq-808y0&V-kmXUfvQ2p>Ip5EBc-8+4(}>IvHB z!^9*2n2A~uJ!RnsY{Bd?F)^9VSL7zyT{3Am!SNDflinLkUPxYr(>d z$_%KX?a{^=YgBY$75?9U!W}cevfumHRDPY!)c-@}_RrfyQj?OB&Q32n_O!P{!NS50 zwEp{L#mV$E5C*%U?x|~P7JYQ)`dcq}MYoWC#HtS&rvIE66*^{LpajtB|Axc8R_y;+ z-}t}%BV{!;DvE>wkg;j&?uKR5tWi?5TFLz$9~m9(yV)C2^f9)wx?0@Uw%iTUU0?d*ooY zl#JBl?6Xw5Ac^Hd)#u5)TFwbILERG?Zf>>xKQ#0Y#l;NQ4Ud*lP=J8Pq$Q^qc5dJUELe}a7X9)CSRwGRmp#yW zyJU~9rL8TmprG(0(JI)OA5(s_>mn5hL}ATvPQHJ5FgTd{^DUy`Vd9S>jq#kNar4#R z32Vd6#|QZyh#;<2TP+isj-<3_iU!8~!8UR|K0XeER0tw#{=0i zyVz5$k44t&lTi2k4K5Aw=iEENdF-I{xLU!6DY^|R@aofBnUobOc?3V*t{Sd)_}@Jo zmX=#CavDe18Yg)Sv6Ox&f4q2)uNddy8zyAgJww*g{woT=_P1h|$M&GzCQ2B5GF8>o zfV=75q~1@5y3;Xsj^!^&!FLXL;lw<@s8&b)i;_(Kcm(=Ud8p}?toHtr-gp|cm+P-N zC*d#@y}tT(gxOoaJ4nl+kCewx6kZl34|LOzhBWnj^s)ZTs&tQwpoz)`whPuo$(`!r zjFnVoSqI}Q2?n{-*>HLj&lk)r(Wmw45kwghv8P6z_eI+~!?C9=2&5lJ`h6ZsIkH=p zs8+zF#YXCoh9)LF(C=4#siWj#ZtKw5mn$yRVsCzC!H6c3zhL zj&pxO$&e%jtAFscz!Q>lT@K`^?EX-w&d{U4pj}P!m2XC`8xQafbGlx?GvMQk*X1x5 z&Q9;)N^@fc!EaY1ov$xT0izRx(O+PkCf^X4vs9VNULD=StSFP!yGA8kuTU~1xY<{u zzP?F$(Jmhyj;r>jsVOB6ShY%%FtzYM|`>Ae5Y9Q3z0ELYy1ZE{o z_2=^hxFZXR0^G>;sp6Umb@W}#Q+M3WNzmR~c2}IYCtPo<9I^I+$B|nA)cTKX7Sg;v zHuIfhf*9i)H$QV66N=ocP6|pZPZ)Kj?v;o~p?nR!=ZB6IZY2!H7qqwUZ;m<|ZYlL` zws@)U!-?m7!*(tZL9$F84aar}aeeV_Z`{4q{JyYLRqcXscGvQafl8;V-0`x3A-w~m z;I!kzvc0eDojn2g-h%F48bRu!l;uY><*U_>UM4{dGLTPOY^?b(Y9%8rZ5!nHVT|+& z=ZAEvboyI)A+f~!{hkXp<587jY-6RZiIN`UYz3yii-{$bw9*O4dFP7ynIW=TR}g}? zBLOEh@z{3k_IjRi!nK*JYo2@S`q{hMW3a^GO8h#wplwLdn1H9{Q6O<_0qIR z&To?a%T@^2Y~IG1fP^hB)Y}9QA)Rv!5LEh-lf9-2X=q|TiM909kJ*HPF z3Fxt0yQ!D^eX1qeYLtEX#bCijTdrWbto_!9L3`Xlzi6NMzT4qESc&MdMj4GDM{EDi z*>fZXXW;D0Z$JKCmZ7Bg(3L%(Hn=&Q3=~ffM{`#zkula&!u-e#Fl+gUY;KeZ%aGv; z@86%_TWDEa@B~W$rud@HeuJ^W)D4UMJZEg|?9=YsTXeN{)r*iwruE1BO8`LpqW+pa zLWc#{;sHV4x7jBe5vWNPa_s%4Wt2fAC%zeEA!kp?MKn(%T{9`}GnCEPG@e~jagno7 zQLjQLbi(3jf*{&{3bZ@i*Q?W!?sei3=m0rr?PD_xe2fwli>DE=Z7e`mpa5{0v3Cm^ zFPBk$jxpU4FHs8=9}pBLs8?6*!CeSuySSDuw+Lm5nD;!HnB@ckAM8HtgkOnYR(>6D z2Yw$BwTB4vwOiiFa|x9A!?i@4P&A2>{@$v`y&l1lwAHdM=^XgF{aIk!-tMY5X4h9= zH^%Rn?|0;gRnTk8QWAAGeqB`!kANNv=e1ZyM@D24$)84GF2yQ0uZ8b8p%rdHa)g%V zocTbwZ+v$G05|@hYM=Pt>SQ5SnP>>1cmsG%TG$A(;bbJ2zM?jfhV&FC590}7WT(Y; zYB=5-ush!G5OTO3tuHX)oJyed`Vml`h9csVo-@6>5MPnZW)(M?uYPOY%7(S?zu}}# z`YtB3B1FFN=Mdps1d3$czKKaxnA7m&K*a7m00-^T6O)7hKh$LR>cf_; zDC@!MzKtW-J@oUe1B$mpUHc8wZ#|lU=*qe0XP9ES%0yM)ih53+1ciNDbE(19pCK&H zq48|YX)XNG#^-H&YDSt6?dfQPc-p(TR>px+hd#mI3r#S#np^JXuqjqcKRKwRC~!RpWgX6%I;DH7nkVDoQn>jvkGm&4PuYY%G!{@1L$jV=CzqUxKPfel zM1x~z`Jl6B$+gWR+RiJxqKL|-$xj3O_qetYrMzwsrC#Eb{(je#!Wx+}xV)b|jO9Zh z8C6sinFj2c6?!YPy53=BWqcf&HS~EXSFoTw%JotJxt%40!pPfWk50X*Eqr`LZ|8Ht z-?MAg=~JJ&otnT04nrP}tOnc58aso}_s2;0CeK`m3nndRWck#8D!jFWaRNy6*;IkM zc_9HI%)d+ve#8>s``4c`c2GuJp1hwVeGfulj~-p3Br?4PvGS%JZ7;@B4Bp7tVZ>pF z>5+w*S@f(|ZwLHbv0zAJhBmq^6Cub|b!|y7glmDGYS&jzS>4wJtl+U;?RG;Ue?{C|;5%I1W`G$m(#Vw&V6*J8G2{jC=qj9ZoTJK zJU;l$0*5&L2nFxWjfa^g{II~2pygXHYW>H86O*Jk`7I>~u9t*+MmJ_|e(rg8Hgtgf z@e@`#e6=vw3thmp3N`Mj1Zr=ar1VWc^gWlX=jT8q-YE90SR z_L?SRj#Z-7g^q4#l9Bv5H<)s$EYQ)GZevGn$0G2xejQAg9if^>g zZ4>|Tw(>8-oX_T5?*p%x33rezFOZ}_^1^$#gCqn*K&v3RKq-jsvXUOEKdmYGs5d1PW9oiw3 zKUfW|>|?)d91cF>KlhgBa+qFLjrq}i57`_;(i)o~6>vMmK3Y&~gdv94wpd{t!Uj|O z8KUlL8?SJN&NvTZISAu4FH0%-0=@dVnv_A=e8Iz)C;4hI$RX#2f^+hVLgK^e@SVZi z2glR!6Kc)Yd?{$dEX?=2`fSTvO>%(nMS7xzqK$Nu3#>m9IAIQyg=B2_yC+tkgoI1_ zc4s7oPxJa*rC*2hEtUdFb=gH4(rlg%^b%t4`(S$$P#QJMiD(m$T{B%!cE7F`4J zRG2f1I7vmYeS&o)<%5QiO34WG(;{2SZd&t^6m<*qKWipdV(kP)uc=?x3FC})hi~1i zo6g~SLgh^dagF3o>vz)>1J*dZ^wLsjXz3uS2XR=6nUV{OK)#Pj@Xei5_a}ZHj3A&l zF>w(AtN|X=g>8^yJteS5Vh)uJ#(WByp%bc_X>Tn080xCx}oUV-0yhCeI<{x zXEhY}#P?eE^jj;1A_QQ-$AMv_@*ZIqozWVZ!Tu}qI zZ%+0`x|P0K4ydL8@3CFNmZ@eVyZl0D`(De`uU)q(>d4pJK|s3Yo3LB?{UzV`ln{XX z`Lr6!yYOI@KeF7o_{C`mcLp=Mzv$uafhP)f;r#WGq%|pZ1kuwDf8&a;u%Q^%1v4W!4LJzh_9!OgB6lZio(Lv{+fUcRuS{XBb= ztha;Km>j~NsKcoX=qYB{bQ|@CmO-O<;U6zs+iNS*GE7aZ8Hxech!6t|g1IKw%8OGhS$en)$d@pVpB^^;*y2-~|f+$ZXWxu7O_v#6vQlb#h5qaU#)-egE+7=plqQWSVqh z`&}d>l4#iIOD7i@Q^zknhid5?UBj}cVz?IB($1a_-3zjvf zf9>zW$fk^Ji$%;*sm@EDo5RyXVs#~`#&qBe@Mc@MC|_Gu6oIp)uq+$u!M?BS&5d)* zXo8L!x-ElgGzQo|NsrFnA2gdF%aS$Sqjj^Iw^?1PnCW;S*`@1%+S~_qoFRbiJBzZT zS?Jm#pU}b&%*zQBS4~t(!n6OxEn7rcgTInaGVGA7Gv4Wq~(dS2ji&2)_{$;y62P>Ojn9XFY zdN+iKidASY1fEqGCf5DWh;}>hobtt6zV_@=u7~xzID0m5xBkq^{KJQbscm0wBC{kt zGN=@kuG4vDYfZ(;iawmGy}rykNr&*AZ zXKat%#A}{WuR%LdUs&Ac$3q`!qX1nRHU3SV`?g+>`$#)9w_>&|%AyH8=TJPC3g74h zBq}At)C+7{re~Qnik&Cy_aF)pk`=BgISq6Bal);;1q%N>@quF$HH-gIE9SIf1s^vY z2t=rsTqBfrO%$^;^LyEYCTH;!66_=Zrc_XG^Fe8MMOo*jr!kR zr@2BBcU5t_BcWQ7QFo-1Ii=OLI*I>-2-ud;#^fF%lObfh_}=#^&P2^MI# z+QhHfQC8@y=Va^Irbp$F#KE$u4Ax`t1+NEtKc2YIa97($F0N`mc|&Sw=L(uMl#PDr z-|c+${je+mUeguE*z;S7jqFy*_Gj>Z!Wpw~~frD_S;Y+H#xP zdax=9?$Sy zKT9-gDe39IOS4kD)5XQb72Xn-pZvsMQ3=UzoLS4K0uW9&c6hEDPM*i@*~y~cxw*Cv z4&umgszNj)nBPsLd*i(e2!aZ9mJ|qdBmGWmjk0pxov-Th8}Go^zlx&aR4by(Z1<(4 zUa}4nj{rHi#+8TN{KSu|w`#VCxKn!}?J3+KzE#>84Ab2i_r<)yI8 zqE*I*SRO6b$|mwR7oOZ5fgoJLKS>b^wEAY>tuswLJiIE4c?IcuSBPVO(nA=YI z|M5743z3VBbQ#Y1XRomKxxxRAG4K8tVF{4>A7d{YQG-K5rZpjy^<3G%=^lB}8Hh|^ zv%#%#gqxc?BO^ojKK|cMQ4{@Ys-p6xPy*)W<{aB65W(Z1?j3}B`1rq25B>qzW1Eqh zuUm@0*Z(g*^`E@R|3}((;(vYcH#0LcfNz~+kfn89U0sIpU>smzxY1$%ot>SX&EuUd zN3LB>O${v*lM2N9NZzpHAJgYwtX;P@=2$dMv-9Z+#wpHbPnhCccNGJnf%@x#$Lb3Q;h5sj4_1f{W#z!+D^htl3YgAMeq#S;O zW5MyIqOV_&*Gp-Y&=XxiS65dml~;LRUR9UZ@gN7Kv7|Vj)O(qV65z6h&PqW+F>te& z9YOc9Vm~TiXnt`97%K82+|}q(Zq3gcYnN^lQwJWeZzMPF3JXs-MAZVv*7tys;OG7nwPVPj~P&5jIIUQM9$qtzj zF>iDZXG&}#+3>`?4qp<9l;dVsR#x^FYfImq@p(RcV$x|U5S--ayt8VL{HTWg1k(iS z(m!S82m==U)cafBgc`!7+1D0E){>HjY z!c%Wl&DgOpz^ApWm$9|w4xVo(s*l%RwkSOsDUm>co1TyFDpxf9U==&3z`S2yw0_QY zz3=j>SCXcnWRoQuiWdDL1feXx`MUo0kb28u(9J?@$81U;tZ(` zX{Gs8n!&$B$pf;sg3nar^$k0qhs)uLaBE)EoUY=}Mfg zi;+Y0>Dk`T$Cwb%0(e3H15ah-Om*@AB&EDW`=W(;zao*{wAy5>pfUqY+>E~NbIDdM z`JxLS7Vq3qW)@Am>Ri%=z5Q8KUadx(zvf3&U+yk_xF?CzvApi3j|SOtk)YIT#ZLiQ zGgM*i+aY}K?TVuHGF%obB)sH{tP9@abPm#tOi$a%a@Y2-Xfq`CqVGCA^pX|z5WIt zrkOVzRQcg%BzZ+mBNuU{ppK6)N4n9?H6JY1w>)%t_OB=MYV{sW9jDcuu|hTUU@6{3 z;ufl1gYEbR{jU9>Mawp_u9knIm?>EMmt-jsKNzJv4OhaRccXBbpe&w}t`rvw^GU&y1!@JUj~E@hrgIg|MX zj-j(yAFXetgqi->VUpVea0e}aouyLTNx6L|CQzY%Wd8jflBKx7#Y4WDit?##HQK~5 zDp4SZ-H0{37|FqAi~wO%)Zp-t2jQ2M4)MN0_CZF&)AT{LS zgbf!S^0{z^^ylc1|2bcoWaD>Rt_vA&0IdlKuQdN$WbI3|7vasZT!kwyTzFz=VyRTG zUs)n>7+bv&j#6aRM?qJYNlE|eVZ6Mr=0c<^eRsu7N#zy zWn?V!pJsggw(UmR9QsUZIGH~$;ex^L#?9}c%gvl%nu;qhiC$?B99P}MPG%E3D9h73|WvaN7 zk&5zCst2HT{A*`BsiNE6jmZ$~-enCt|)<(^8u{o`EYp!P=(c$Rp_bRMVf74@P@jYrPqWlzo~j&ndC%l7j10L+uP~ zD}H0ipzkR-l%|IrdwUMwU3(`5&G~9%BnvqVH=4nK&BUlU&`KG(9{DTEU0N)FBb~tm zyTx4AdhZ{XyG`r3;Ml`8Qp&d)NxcX83oX)>nbe$Mh!U)5EMkEpIx^dcth^sG@C+XJ) zI5A3yz-62xLePEdU=XNJsv}9eA!bic*X$M8pF%os88Bwn4fc!9O1eb#J?Hx?sR3x6 zH2ADQ_{LaqMu-n>sGlDUN41u5dsAuaGoijdb$iL8p0v(!yx5In72eCJ=nY;2IKTjF zQcSdjL{&GzaE(9qzJE~ZJz#2jXMydJq% z+zuJHSNSBNXCd70^djkks5#3rc>>LJjnwoNurTtp?YCYze1_|Hnh*IpI(dmJBf3WP z+fB{cgup|>(6gv@oZ9w)pS-FtGD#s3En0zL$xiwa9>cFle6J$kyc%7;QrWfm8Vbh` ziL#3HDUy)P((2TsZg9=DWXwKTN+XYf@LIq(=kFFHNNeV}= zv&3UXr5@NTQS8CKOjz{@7esVLMdSFrHx_R>&mmmApOsm zhk-4%Qe4W>A@EcxmbTpQ*F{G`c>@G>ALYLcbt~fcsf7p^jS;MTk$1k5SxEv|*A}=2 zj8^!d4de7@qp0RCbFD^do4%`dy^yRKu@$S>T|4>pbHkRC zdu2y_`oq zo<|q$J`8mO@allwYwpulrrq#t`|W6L$xVV@ez}`v2-J~S6J5t)a_F<-L7fB6SyMQ+ zhLH|RkCTijAte9j%;gNsuJcoHjY?H>@y>&JGkwf4CdRDF?U zVJC((432t*lCUsof7go!hy5&+`q&r370&k%ZHKv)|58JyxV{c&Wc^#Lo#M|8T1|WR z7Z4Kw&Afs8U6aHfre20NuA(@K1tWPBFsVL}bKo$zfb}^GjwdAMWt!!E-i=$FA_@L= zraLcw%QW_Uta<}G4ut+hc;v)r8Ls-W+@j_wMq^THrDkl)_bE~@Z6xWVeT*{vG5k#F?#Zf4(mP0L$2jR?MS{U?3OVUfsaUV^6rwXUi3t7v(4JK}rp4FG6Dmd#Ga>8FXKY`D$qJ{WUlAt}=+Kp^|(3nY=!G7yh zF{H;t+Hdt+&Xws8h~T?H6mD%0^XgE}#5|hIf!)1y-BT|&)adPRi{V))U?ZrQ-=G@f z!X7+%^MS#szE%&vuu7`6)kS2`{kI+>q-q@?8!i2=*L_KaTk%bVrCPbluu^LJWRxe) z8DRw)a#}PPv-Dpmwa_QZr@TjV)GcfEmS%AQtpq>rXgfY|DeIh<3iN9Jtp4WjJ)-L+ zNuePTF>7xZ9{V?~n05P`VhwQ1(jFV*ReA zm+8IPo@Dh1Uw?lv?{ZtduU5{7?gT9cEe-l|_ka!42#9*9He(>%EW-Q)i zCI&M{VSS4<^hqn$=GcfIyzcbM{2$drHqb%iRLvPY^&}xL{L6aXU208F^?fw%q-e;h zDnuX)mG-07u#T&3#6B$4jlS7!^U>~@cF-7UaJ%_va&ZTw-ou8Ix#(X6&%3a=ez_^b zUcJJ_6GFF6eLByCaVJcEJ?w8oV$$ZT=@rSm>2ddInH6^h@u*L7shpl+qH!#L^4BX^ zMZJVou-OUoX{+;GR}&%2DbZhAGCcD`&DXR5??RR$T!w91`m{-WbG`%8G&FtdrYZ+Y zD*MX|=1SdAsUzHp%Dvy{WGY%s+3Q2t@`qa1b~6sAfA#bHpuoUhM~Ld!_W!2z*3jmH z@njiYX}K}<%acyd8|pR937I5q5h$YVkp}8DJ^B8h;weGM7JV1goVAgLWAho%b*c(RBDicHn7V8eE@KQ6`i* zLscL!m%wEXbIV=U!2RVxLujeS@SxHxl>V9X%p382;L{(EZ;0KK5VUhzc&p?%eBFNF za;8A%kJ4~NiOl{X4>qOelT$*IB4t*xll!ai6tMT7&SKt4H3Xc zVd`{3WYQGs%zY4aY<$msZ+mM?Z@N(Vp!tE~mRUCt2<)RQ_WpmUd&{W0zI4qu1P>P6 zEhNF+Ho=_)4*`O^2X{8^?ykYz-GjTkySqE|;$Kx=b?!O0M|btOw@1$p`vYSSV9&MZ zT5~?{?|EJ%X|68>6ZQM-uS+aK*!U8Hn*(;dT&L$fI(lZ#ByGLMD;55FlKX3175@YC zmM{eW9rI40F8$A#w>(pi|A!Qe zr`-I9wDup=OtuQ$Edk#Ro_5YAS^ zP51A%_xhd&W=Q|`bAUB5f5pGC|Abp_Pm$NZH2gH&xVG%Ly%R6DxpuGw`qR<~guM^O zVHNm=LfWe)Sr|<$5Z$DWzn`14)cojMu#+LO0~FnW&E=ZOWso)^F%Q9CmYJod_I81$ z^M2}Y(oF!kr6x(sZaUBMYq3tY*`TORGH=12v8I#=f;~&C+5kttuutBJ9vK()2=!%V z*andf|lpFebPW~E0v`6Z7&Xw@NZvcWK=K_GN*?BJU?i7d+~=E@Cs zy{|^LeLnM}^WC89Knh@Z3E`oUTxM`W_^Et(qDy=nv#xR7xySyFBhHS#qfyApH+VRAl@#_ z2;6mK1PieN8MwKD#LE%TuLV_A2^5NcrbAuR%rB#qIWO@Xs@!1mC`19xV~}?liGtXB zv@N3%qZ86J?Z@MS81qZH&(~Yqljw!X?z2(KNYxN()9KeLZv<=-e(;|-`*LJ9rS~oS zhVAq;$F()}FK%QJ=*-t3&6W-81})_37c`f5JpJ~j zO1dL8G?strrf#{enG`T=2>FxjMlTeeDBgn<#iQnB-{ojaEiU-j5Ef&7vptUFkG(UT zUkW-Y)M3aMFmL9PWyfpjW;+~!Z1U>XS-$@{h+m-3tbLz+e$=xvN%PlQw+-gLEJ#P$ z&d$jxp!@<@diH4vgZ9(ynP1&#y+taN8!@Q{Pt~)vRuJk{X}(9O%b%MYwn?tTzMgWP zV|o(1O#Eh7hl_n~c#Fci;JXVUJNr8;jr#aGBlHtETgZ;y)aM%AJ`5Ip>r zeufd^c^~3%CCjab!X2OQb=myRIwVZ|NHXv1in~%&Mu^ioCHD=_E#gV&xyah|9L{Oc zvBaL!Lc&S?F*`R5BRxzT&x5ECQtF4{GAa2H(hmbYL_q%>U4QON8ZqE-4RGnw&9+H( zVSkb_EyZ|})1lCqk;!##?z?bS1YJ}aiKy)ey4S8QRoNiN8&tO?O(q+Kt8f^fJ)>EBlCjM*Q;NEe&trz8>Tx6=*W~7?&4*z{ z+PI9al&;!4G;vDOzh2~$_VS=CJlEs;7$@dm)9RgY)4toMi6@tEd*fQeH=l}K&LP}X z(a1|goW-L+rgTf9mWm5IYd?`KW-T&66s9y=Gs+TAuBX)@K7g7A3%bG&_-bq{|D7kW zlXIaHT~&}_NMh;Lw<~1R2#BQt07M8pi}#xsw9vF$RD!>fnvLprZ-{bu8)!hVaEoXz zpJU<_Zle`{F+A+r#_%3dcY{NoJL|VdGZn2aQ}o3uW-zSEb2Kf)QI;=$Klq@<*c}M- zWBz4GV3XITqgY`10r5n{he9y9rjJy#HH)7bk1tB-UcfeQJnSVdR8@uivfizLZp}9z zXLYH9h$XC8Pdno%`z2D+VJglCAquXx`o z8{McfAZH^`R+q+Z!HQtCy*(QA)58FEF4JNs*Izj^Cjr=)BVlZlnzVBj{Ur3O1H}CM zZHLAFNPKIeeaN9Hj83=YYzgQHSav8$oOB*#bl3P9xhD3_4+q^~FucpA^3T09`9a(| zJXuJtwK-0-fvM>IBK30VWG$qohY-cTc_5CH8<~FB>JQ=R8WcT+T67w;?KXc&&isDsLdH3tz+G&=c!l8OK_$CNKN zhP}H5B+WAAoucu95`FZRha@ozW-=8|2|lf$qX&3Cd|;Odbi{J`RV_Am&+oIA|3&9) z95$%j;Va_09eo$vjX>7p4kR;zl(*(yn&9dWoUl*kKQQMLq1ZXbQe57vJ6UrHIMuZc zvBRNA#{11KnK1MmE?P}lr1||mUSA=5C{rbxNgNW3kXIS$L3Ax*%JPWHGr$_S$^Io? zuHSk2UxJ_>54oumJO-Ncjl~ zlg*oU^|6uJ%&61^1lq$j-T4xVWj`c(+?}QCe&a**koW8_xe}j|=-IFJIz%E}!F>{$ zR8ZE_iSXO-{L;5U-Qrj^LrE?=uB2VlhQC0+p&M>IN;CwycxIzuX7ATLuw$UQCLf-J zDk%`Yz8JJPeiIUENFAkzp37u-hHN^W=@(FNISt4Aac=kaJoH%bvBl=9+=`TVutTuK z3b}Qz;kR-Bq9VVA8LO zUtN!5>Zb1-i!K%&xxBb;Mv;uz1H(VN-y2r3ia-TA^CIRNUp{VyBL`12`dWwG; znRt#ybc*Tty>`v3Avx`Jom(amcy$>|@9v7p))ekx4vEC)l5=r;q1Ib)Tcrpv>~;L? z6v{^t_rlU1wqQ4uYi$pD$t$5>fN?(k#*&edQO>2F#ty9^d50cLZUj*ZdwNL0TE75^ zqm<5r>k-lB%PR9;J+i~Sno{g5<%riU#%3Elzm8*p1bRCo?CNrc9;V&mpHh1W)_+eO0j zMzk#4-5bDWV$w!X8AIQIbihVjT5x{s@?2-Y8U0MOlL+jq8QS!s9nQ4KrY9|r^aIER zj9b{m{7I&$JQUUg8ztc+ph$&qHlR=T7(?7e3x*0&_@+t zOqtvd4leZoN8`Y9*)+$)KoAKY&fDnR>gGr2rxq5D<^^xBJANQiGBmUc=7 z^L1L-mmMH=0J!*M&(mpy`z9H{r`rI4^9uKoEUy}=DwLgjE=&qkwB?xlsP2cfM z>&Z7=Z15NYo2Xq|&EZj=QH+z08pmJH?@{F$Y)E;)j8IZtXSb_+Viz4cOJ31hH7L*t z3H7FhX3y+~mrq%u8Pe=?*7Nu}tv?iH6l*x(B9)rDscxclCh@WZT^d=Vp1KfZe+IqN z?}XxLO)ip?aH+7-C8{`9$L z(lAD4?%^?;7rG7Jakh4i8mQX8Zqr>~4Y;*b4b<3O4glX2;^~y*?Cgvu#2`J+67@17 zJk7MhHQ3Gd?vd{k)O(tR^u&dB>2M2Y|ENPb*pcV*Eyd~%vZp$L zu_evkM?`WjbT;>~GJ{VEQ|zG@v=>yTEzRuj6Bgbk5h4(n9+oyK>o3L^aX!WUd}s2T z`<|JnSo@RaUk`zXk2?c}66h!>VFv)WwXwSD?&*1-(3Vr-B|3@KD|CI}1xgm0uTCT!DY-ZlA{Q$*_L8KZY-Fl0uWWmSR$r5~|gAyX*RmGYL z2NvE=_Kx2Ku72}J7UeAGN~jeg3U|Sg9>yd1xk5e`s5GRGUwW=zSk0G#;|m^2LGdKm zve(}*?6&nU`Wby!|o!xsDD|wajG}DYR<{dwf#5tyETl2x$*37xXlEq4tw3e<0 zx#7kNe_da)w2tCox4>Khnq;YIDIy;R{x>0At^J~5xqc;cFDo?*?5!*Nj3zr8q4{Z3 zv0{c90SM$`F#14Dg&ItOHgGN?nm=^8WwhgV{Z=W;cPkd$w1R)Fmq8T&dEcYBADvoO z=}D&Lq&;(?%=PI;tkcC|zb~TS=DnkefzF>wOalv6YATq%Qdo!#DF!@WuowRJQyJk# zWA17pY)4FtBYD@ypcyRN-RwgBggxWDuZNIocaPaS_C)hFtPt&gGi zl%>GqSi#WV+$7mdgt-(VqoK+VD?!cF#nOFdSO1e#elMfE1a%pV=fLi1s~?K3tlQ=0 z!%nu6589FY`{B}YfdR}HodC@ZFj_T$3qHTCwBO`Yy^Ob3Jx%{ArZs~C%xN^y@|V|R z>(%qGChJV1JPG+LFXfgS?5#%E6-9)Inl(rX=eqs-P=CB`uvN7FA4!cDkxXK;_7X}Wozx!x`_k>rwx-Nj8gkoVU~jYIEDa>7*I z8O`2oC^{GnD>9^TmsafT_BD(-k4E~_K)iNg)b$5)B8nQ^Q(6ABeIX<`wHPzpxX7P)c zKMnY~hh&Vgg*4;%_nxy%!lbQ?qMlZi<{-9En!({6mkyE}wD1_aU)t^x7NQ6AqA|Xv zi2M~YVT?9fh;T(TS~x9v+0eLg$^H1QY%O0?h+424&?XS@f%LM!TkZdbd1m0~>FMnk z-^;E%m5Z}FZv^IcSl7V!KH@Wi-fJ=Bb;xeLvWn8u(u-~{PY!@hdMdhs-F%q~SpW2Y zL$Llcarj>XkTKAIqkvxT$ot>_vktViwUwTg1@&-q;#XK$SP^MDk;6_r5N*BP_hwm? z*u}fEQ|NH15gX|9xu1#2T6MuMBxLLNFFyRG0H-#7E6XI3;OVk8^{+q3TNt!sedzsw;`o1m~TKE1W90*_|F1 zg$4Rk`MMPfJX+pICgvEAzgzYq68fzHX6fS$u%18I2gpd9#zh<46`|-8l%VsaVTn6e zFNz)5AgkqSMDhx{)q+IjY=vc%qI^y>?syNAgop~ov1n|3WkMz8m%@_+!(4v zpRcY9%y<+qEX_~A&&x@1BCE@VRW&UrC@dJwqAX$^8aup~S7kOV0NEf2ynq)+xA!S^ zQ(H4~&`?=_*?*YUGcd?qE_fA3KKW)sBRv|s1N#FtUN3ZVafqE^ z3!|KzgbI5v6YAfqy2!W8xTq1I#@7c=`oyHh&0#GstFUU!xEUC9-z*B_u7s-%eC4<5 zX8ic#3XsOxv8ix)Uof~A3UB10_Z}=k8w|+$=W)Q~C3U%{3Rj5uEklk8{s=a>HWgeq z8YB7m;X_bVoHbsyWb$a=oU`rW>NrGAujnpgejt*uv zL}+#8vG|ptZ|YxyO}2B>(OX}%TuPmN2fBV>+^obE6ax4q0DrElz8HH)r=~W#zn+i3 zw5S4PDCY&S4rh1kNZSQO>WfWGLpDD^{hn#&+1;MPJv#DOe?+J&3Z1I3L;3^h!aa7V ziZz@>pg=uBvUsurp*NQ+(<|jBBsA5K&D8P}A;iSM#@H2ikHd!{71Rci%H6aY?*{cy z5oi;}I`-Q%Zh04d6oK2hp{-C{6f_sR{y6s`dOvNk32AX@A>%UIwYQjd@c~6dqbCRy zt5T#pX5C<)mnU7aHrV%eY;)4&-GWrh?!gNF&HWOjxpgVOkPUX-6r1D)+wuD@#$i4E zjP|_oLg9?y8h&hh`&q19vfSR^?o(Ahq9Z(TyHk)nOHHHoUS4_h!yBH@+Ug?=8us)y zd%ONQK8_#_Z7Wobqv!sE00IY+)0Q`vbv@8C(g7PaRz2?`$& z2hQRU1hnWz`GZ3j-Tw421P<39*y7T(?ubp@kHj1yCZ^5|nig-qT z3F(=2LYN(gj;itmsXi-<2-)CcknH>@H%ta)M(vd?Ow(ByL2Ra=ZPi7NzFUU$({?w< zU;TxL{P`2v*6b(4MJF;{cTSdXMAnJz^CFNTwp~=M`PE{zKi=fRmQ!|V!&5Y(u{4>{6gwzz5w3S7Fha3Z_?OiEbjg5Vx@UJCuUSS4E|_B zf$)n+#s=Y=W1RJRzs3kU%7qu3hM4g~u1zQpk?q~gq~p?M5f|yY8FP~^Ai5-5(y}A@ zg>CP?HI*zD=1%t*3JDY#TBu-tdwjuP=*dFx-nJ`3F1ze%*AMpi;(c|Dl-9Kt0Z(kM z1g@;b_eCCO99)B`VK_G&{+xNznj>3#jyDu1$jNG_{d-Gd?f zK)0f)dF)GLU>S3eJX;7fpjmdfr$R@>sLHUzs&Wy9t&9&2vX2cyH$QQ{$we#Qn86^3 zTDlL*C2{pT9AAOpc1gCmD@pC_1B&>W2*CnQ*L1ri_+jJ~AVqZ4F;k#ZMM#i^XJL}1 zSV?gbHA}VUAmLPB^EOy3Feg6Ui(F=m|eR zK>nBp^X0M*R_dNuVcy<1$d+;3?xcH-W=Uqbqp{0cN}bP$*+t2;thJakJU-S|#|_rH zIOYl08_gqDF{09%dR>^%nuZq1QJxiUz6RpEJ<0PZWBCXH0Vf9ieh72j{wideRKw?- zYfn&#sv62E_0AUKHpz+hCqehiqxgxw?xXm$8AC-Wu)PJc~su!#pwftY(l>`b+QA{Rg;Tlowixd zFEh)kcEV#Z!n{6T^SQ(ALGT8_^xF|p5lF?=%*j`%b%j=l1+0ezh~is8y^CqVRo2EIrIuE@ zbVR8R>8XtnYL0IS?~DUKoIo)dH;4#-Wn+>`m=w(oTa9;Ui873utcl1s=~3-0&*T7R z$HWnI?+5xOiVeb-=gS7Uw1dp|_T)hH&!%$~9;GY-LO(=tMk_IBe`%@MU^HIqr%$%v z-`|4@P@*fVjYywYux_AGx<*O6Rfy*UY8Ywx=30brR8zLaPy45ge21w? zZv7#2o~0;p)EC{|a99gz&WN^oD#LpSmC;jSb2D(g9N3bd90$ZDwmjt2p+M&|XQbKq0Msu8oXZv$k_9752Me zFOR?=3M#ahS!0<6sf`A^!A}?o96yfctSPWeF-0@eg_Tv=QocQY!Dke*vDe}o`K~I_ zQKB&+6ApfVCW@fBkX?Glg~uMfx?XP$GH6H{Mn&qbT$i1?;@V86^T~-SESXU^F&GQS z2#xK)^qu^c!#N!iK6j&2gS{}ba z-pKNYT9z^I0zo}t3KqGr&Av5h14Qf*pwy|d;Xi#|d*%5y)2eAxyNl^|ac*K=nFrS3 zs&GiX)xSz(qfBQ-R(A{Xny`87q2)ayKGU1y+Dxx`Q>0Wixwj!hvsRxzFtuxseaFE3 z&G*!Is6DTqwW*Tn<>rC-Rr> zP5}xUkg#Wc#Uiy0QM|agI+_Kkn&Po8$04FuV`^YtXD9?|)}#Mxt{T7yDa8i*1zo=) zQD1zX8bMS4d=OE%6QN&&jJkljw7Csz!VZemxYzX60*mDKQTDU5`@=rRRUpUHdv(Pc z{bW>a^$p6M2(Pfmt}&Yn9$NSwK2t^ecx*W~g|PpexG*WtYX-@_{luK*5prl$(qd-1 zJI^?zbuDwWX@Z$_1cZFqufh%@+XUsytrIucr;%*Dr8PD!+E58Bg=?<%TXM87stAgP8U)dj^=r2?%67 zBo;i_F*tnpmX>3S@+e6WLFitP!W$DslsYBFUtGW?H;pF8Q_rrkIQf9*0L{_Mn1H{l zt;O?g3}X3af52X)>Wau6f+*1#ERf6-MLsWN23OY#%k`z-$SPYwu!bLKV@vt9JtKxzzJjd1r@!gr8OBD+rc7?ypd!baQ$Co&`h8t7*;R z6Kp^uQm*9a`YfuY%gL@^8>I7Sn|kaO9tiZH$;ZoE*9f$P9jvwT6yI51$7?MvDN@+? zcC8bo^Ng@oUdnA~Ral1GFI`D1Io>@uaxXNnvXJVtN2iO;ko@z;p|(;!bgU+Y9R|uV zQ{D(UR3F#-f^M5k#TM72M7k=r9+le!Kv(IFz{m@#cT%aH*;s^YQ}Qk;bY{Dw z--3!Zm&ACw8dCg^iE5Qw*v&VPZ)$1`r=+4AD-L6lq99om>DM?TorK~Qcffs5 zzA!w~%~Rl$!K6fF!p{EgyyVb`-iL`>2q2fvl3ZKO&dzSXIPlf#j6)ZzPEJ5TAS3f< zMdtE&@Xqj^Nl5kW3v0AGWmk1S&z8Q~?u`t}>L2~XKK&5{;L0={={d`p7y=PAGvCr_ zi%sik_hC#pnq`qvXM{FQOQy+ks7ZmF0Q9jmGi zr>3CxY#th8G*fZ!XG-~(tcpLkapnK@H8iz&A&Q6^J@S4 zyss}b8vOhoP6yW(mX@;S@;~Tb$-}>o21kGm1rA;RcyI6jAkz2W_=oeV|w*RE;Ikjm6V12 z0pv$MK02$`TL~w~Nt>P9y;ctT4QBs)4sr&J5BEQRHH}!*ax=K{pUPT;IPt%Kyf6|NZ(W{WUvqK)qZDFqWZ7dY-T4;cKI#<2->=oNRfVWJz~d=b8F~Quli6c*;PE20Mg{n7 z?(<%3Zp!pwY23*R0$b)iO)2*KWMGcsbn$@p%yH7jfD&tXSzaEOs~xuFZWyfQBJG+M8jX-C78CMwzU5u z^NeaI+G%ld4r1(j)LW^h>3MucM}uaWuQ@l>exPUbL+qZ#G1Sc!-uRdp-00ja;76nt ze1?;HamIa8Ht&hebrsA{RCwWHw7V9%WRg3?;q;&_eZpUu1ltP3>@EDnBxNs!n|i|a z<7$1AZnjS-sQ0OtqYkxj`r`);$p)RK9_?%9=5XR0yys>$$;t{ru;rRuVw#upGv7BM z8^uT@6WsU-_NpzJg#=~;s^$}2X>P%mmi0s?CbS?d+V8&0{i$qBlGj!FH>pl3oask! z=2bVQ0g;cbrmgU?^^PbHy)vy)YQoQXZBgFjnHAR7Py9roF7b|YxKkZ% zW#&!QQ65hY6}K%Kc1@Z{etoNtlNB}h<>h`(ZYtT^58YZ0^w_gFc5+mGUC%GB0aFjh zw^Qs>ad=&P$H+rM*-wCm{4KP_YczMmcJpv9pfj__^0Cg0Q*9qEti*M9!x1_lfZRfO zNCVrZ6h8UuazONjv9_0%k6D;hSEmd;NR`LqsrA|a<=GxTQVJt8K@HXhb?2kZ4~Mx{ z!tQ#LeYt(XxE7rKsf*vsB*R91dmuo)5?;GI_<$RLp&R|l_XNEde@t(Gk z>5b7usO0`y(F0f4Q=;E(`7fMy8z=R%1*~6uuH8SsuqSgDe4cJ(idLuZ@Hsp`-wqVS zt}>1E>eN89{2|Hd`UvMb0`mHBrDUr&I#GGn>0;MAOG$S+Rn>2^$BChidr9ioCI_58hq`ke;-t@9<u+FvL; z;HOod3gY>?wDx>LXo?foF+$f9f0L4&RlH4bC>Cw zhz@Qv&i4%+Et1r;_4a-bt0Yx7=qDF$zC8xe3%ICoiFk-8#A7v#9QAD)Id9(NlzbK9 z|1q4S({8b{BJyXUHWT!6e=(0jt3uSd*TA#QnQm|I(0W4-wYWk!d{ZUx90zOp)umTV z?@oj(_(2rbpM}0MY446@@_Y{t5zbWcjCIT4#tMgvQ=M<#uXQ7^j>4RM!|1Yp#9<}n z{;q>MgZOYEXYGeT`Tgeo*4i2bP^-%%QRCxtM_Y{Z;OUTzv^GnGdE9cD+o*MWdET8a z#z!UqxmQ%oLrn^+aIKFxjJFcf5ibN>t#oNGl!7fzJ29)SPd%hhcy=AG6$!YkMN3=q zTP7)BtnBl)!WX`863%u_gkShl zON^Uq6&_IqUC68Cjq+muRxcC+hf$)IX*MOc^@Ow2dF720{MgY=?wh(As4mKlF&Dc-h5YD@+1k#E$9AWsV7@K) zU?rH}KFnUJz|ZqAyj^BZ&=!J$TERm=d6)p*cYXimD$}z3Fnini{ZOh2u4mN}E^+1S zkZQfcMVbJw26gg-BP&{5A`2{#g0w64UpD-6h@KY84=ndl3;Up`HXC*LUd9C0hohaafoO+!{ zB@38V#^q;kS68Uah>t}X`z0Y57ZpIg=VQ2ksP5SsBm>#@k>t+pR*?yO7SVY;eFNG#5&dR{`!>x9 zas-N#1bidw^*a@bi#WJbPN&P!?Pu!E^X}U6TSrl*aPv#ZfUhm9nwMv9D^Q3;+m7zX zHgdqb^;(?=L1$w?H}U1eI0l{h3kQ9nH}k5qej1@z1&%ha+(KYB0;BykwZmQ)uETS_ z==;%@HxG6M9+t!J2bIbZiD{Gl6x9{wMLGzn2F7={b}>mda)k&KCu~Yc7g`!`@oiDDHF-%H#U)ERTDdRW7S>IJ zlRb=dPAGZJqKKUOFJL$`^(u2LEb#q3yu8*<;zO21ZNQ8w3YfX1ThYSTXMolFHQ%KS zd}EfKJ7nJalye!sH&>ame?ytdvVtq;J0L4!qAd zuqJpo1aA^4Oq5_`mKmAY5bcJJ%YiL<1hag2+?P=re`{{+fGX6BB}$`z?~bxo5pAK6 z`>jM&XW|%6A-ImY8YbQnqVZ18B+vX_N`x&Ods;nqCc;gk@~uWR(&zSYeHS79R_t@$JnwcP8eo~dGu;+ajqsGy(m0x0*n&O<98>>GLLVRc2-E}MPpJxC4 zYoQ!J_u7>^^RRhfTY$zS%i8{Nj)ikSN^xoKUTF5pn_I*tf3H#(kIX{Tv9V1M>O2Zh z8(r_q880aP#bL{lwpujTV`;3(hP+c$Q@t^E^p>UPN-o=Qdr*jwc9Bzg3?4 z%_Ex=vthd7Vk7Qcv<6;R9&B5y2O3J{6eefxn@&Q(1iY%>9f*gh!=5BR6ALKS>ESBH;=X*0+H=a%0IA=GD3r zBW;So0%6XD{?_j>vkbq0hxdoQnKDKe3GK*gXJUxQ_an@V*Qo`rCKf`g%oFeTjY5*s zS~~Xy8w8fRr$v6zMlXChZxYp6hg=$67kFn^0QBQlv!}lZdgl@LzyG>#LhH z(k@Eu$EFvY3qhr{eW+DDGgr}D64%6K%X+ne|} z*C@h!64OKr>9Xx~wN!EP98_GXKw=u_q*3YZ+8GUu zkas!|+XtSi6hSDfb~;c(L=S@%M)Vyy9mBaTjYB<`*1)MjK4?!+eD+wnU`Fz!*q&lp zL0S_WEw;uT{xzrNjHHe^cX6SyvAXmv^tX}^bGO`2g%UO9EoNG3w!33?eWN|lr|0XV zrV~*<*a?#fCXB5uk{(T>UyU9kYf}NFyVK`Pp~o>ZHDF=|8`jQN@$HoDFtj%!it6I)D!#KS`l2&h7sqI+IfY(0v&%h0 zhP#;xvdmyI&q_9#F5`(dtyt^uqrRBvmxL)tlD}HqpJe)NfRqasM7{s*3dV_WbHznz z44~gYDJ(w{8J$E<-w+s6az?FjZi1tp8CWwY|9RK;(0|Iz>E=Zr@&pMNv!qv9quB>b zjr!0^J6pBQOmj~G5qA_q9h#vb7eSV}_SsFhg_}#*82S37P7U&eVC%7h;tM!~D?_z- zJ~>Jz7~udhnTD5KWxBL8<3=aKvJ1JH$g%DbrNh z->CL$UZ*n;RloK+CnAVHh>>0(Irwrao{5A&7O*FN`Byg(N`s6V@on{F1_LM2Nid>_ zP;~FjcZ~KPSD$EYq(>M@c`M2s=?*b^q;~+A>|ppY$KORH1WDw!b^JFY;dhQFVh76J zWr~yNUIy=0;xK_860V2spRAeRxOlf*EYq23&}7$99IwAbu-!r21{C%eA+5p5g^D*V zmr?#~W=C>VZ0?Fs%;i=Ncw2P&XtWVv*I4W0Ro66HLlo#ynA+y9$y;@_h_uvhi~VC6 zCI1dlmD5t;Fq4&_lhV{;|NKGK0fSSx;p}udiE#SBf0XFF+S+p6UhSLU-NL|Evl<*Tv1UsU!A$(oTQG}EvY^|3U7ytN>^Kwalr6x2^W-ALNYkXs&*E%@U8*<$1 z-Edk+bxr&GeWLr1n)*Irs}=RfD12 zx>*(>t%uz1&pPg`##ys3d7REfC(uK8kiFxy-m1{{b&a{2J?L&7+hwg<3t{9CCu?wy zo$ve%_Q%`swSO2FR?aqba~Lz-r@XK`}yshadmKNq?9wLdVb#eR{SFjNW2 zw2DMh6}j>>U2`Q+Ql21D5x4otg0(cS`ezJ9ku2j)dWx2O74gb5vxs8|ExyjF)}WMbatmT% zjWL_`WjU1BZ6KQXtpkEpqFpy+=G(62Y^FnvW@ubRf-!qtf5YltlJ%cZb`%`}FU2CB zJfma$T;Ickg6q06Bs1JviFNu)RP~@_G#%xCTXdp2*NELTl&8_Q+qcI3=^sK@XpCFk zU`>j?d6>&M>3qPn4b9z?G2yJM8s-a59+#-$XDjJ$?P|Hkp8vzF>wUJPo!5O*@7miS z4YLl2$eD<&aklxYT}m3{{clo}-4s@=ZF|E>9X2CGqk9U#X12z-qv$?Bso9(B_XaJt%7B5l&Yx8=8urI>whKkwfs^P;d>}{e^t(SXi&)1t$3R!=fZo%FcxO`Zu*^Bu zNrz&@XU8~NerLATO?E`GNfu!{u2>r8LCQQ?5Ns{#>BJJoIwSZO&If%OY*BSW6BhKB z87v%>LSbg5tZFQ5VQ$&$0V+$z?BS;jbs5_vMl7iu>kN$8gcqM02t%Beo$Fmz%Z&4b zK(nMkT=T)s-^ki84?OK#nj#Pr^e zK-kHLi0sZQPlhv@%eO^UQbf)?6e|ZEbX!SsBDejCgY2YM<=bv}>bIRb8Z~~#Kzvy# z#JMib9nF;geBD%u=h$uS{UaU9(Ym#}Z3Fofd?&o*x{QYu7kM;$)jo~aS>FkMx>m#} zEG)xnZ6!XR#2}tkC#w1;C3FpcHdoiL9_uM;a%K)6=&I-yDzG;`HGAJF3VLi#91Wjp zuup|4Ns|z9uSNP6_ToGE&B>MO5R&1iGt9ZQObw=VTj><)VQ9&a!8~ZQ$IZ8uRyDxX z&q{WB8r!3zd%b?{g28-R$h-gc57MVzf0Y1~IA_015$qM*-WbU&HoDQStiaO?{xjjK zD{nXHPyFd8TsAEH*e7{+)lD3%+*o7CGITvDt7fy1jHc*34~Lu|184Gs>0-l!yybJw zVoYZpv!E1Go<ZW^#zr#!(vZOkvu#+{W??JwO^_ccQLhIc1kJ5 ze;m}@{ro7UT#`aBkQOFV*W#xH=FH9*7-?jjty;_{1Ch26htf5K4d=&1qSx!k;!APp zVcenhmsz{P^#9_rEPd`cq$Jzc>lJ%cB3Lqwv~9UAl^5OlNPgt)U@DrYBtN|iI^+nx zt`wY$2>Gcb$slbN-AruSpmm9FzKWDdi|1jrn@3QRyE*u0WE~|>$hkYhe6Rz5Ob(TU z>3vJ6ug~U@Tzr-4UbeoON~$iw*p+qk#K%U`&8QBLbFV|vq@1cc>qM`VCHt*#leZ7` zG>O@T-NylEx1v9SpJ%eAuGbxX9L1OkvptZ+`qO9_jiT%D=dYGYsHAQQjG1`_L!L@ll9 zZE*FTna##>&h_q2qJ7U?YEW&GNjr$qLV}1 z+UCfL)=bd|Dsdw*_5zg7DmJSl3N*!h#xje=(Z2juEUu+rxOFyWQ!a1N^2LeZf~az! zNa5|{XpKPuJLcN#`6#g=PlLue3Z9B3VVd z6gAFIj95cpqzfS2_PREc!uU8KJfL))BZ@SUEyYP|v{!6P^d@0_9=y!8gmU8BZ+E1K zHF?^kxZ(nI^k_DfiH-12o66B2D&3-1jMDi!8{z+$LkD+v!8Mq~frU~FKhWIk2D z;imu?YM6n$g`J_H5yV7Iow-3hU;R#{Q*q>CZ0xl9i$~hbVG+(jS%qNjGm6fk96BSb zQ_XA~D2H)ruw^82pcXBLvORwTGfl&eNrOwV2A9ZUl(F2v3ao|%Dt^~~ ztVi&k)Mh(sv)91Gkh~O9E!D+0`J;+y29`oOtTa#b^{^rp_YzLyQZTocoZVYWFx7T3 z?_C{5zX505arH^Qfx^&808inWMg`J*ZF4ZXqh8rQ&s%galWA^ry|{>^sLUb-{kjxT zsz>l3!P(yaruhr|^2?0zAy;&eK+^Sk7zaTF^U9yY+_zo1u1PVQR2RJo3!8?4ftxb( zG`b09dq!fMi6z&`)*V^&_GH)1`8eQKc7jBsi2p|0TL8tiZC#@$LV`Pu>zkRy;o%jdw>TO$KapFh#d zrwZ$S#`==yccpR`mvk(-S1zn6B1H12t0sf@PG;wIyxZRBWzZXY#&Y|DN>fIEnBE71 z(>fOkr*EaA_8ed7<}i=C{yfCXZF3ozwUf|nNXwE@ZNw4S%oe2Q-b_`E3~jG&YHM-k zUO{gdc5`Aa@6w(sx{V7=qWRwKDuVf4!Q*>H(C)CMdx_$HORs6R-=^B*yN~pkEWF;{ z?PJ~dHZPo-pZRmhHU8lNrw*@ZI|}0W*f+I74js(|o@>NATWicaoFwi$Y7b5^6Win3 z!%>g~)L*be@mFB1zahiFdcWDL4^k_Dg)wlz;n8qk$h~Ksz(jZw1Xrn^aG--&Mz7{j zzr`%SnUmgOEfa;mO*h+TWpp6rz_o5*BfvU8e8(tWy-J+}-JS;I7<4rxi$})87rqWwQPBRDk37?$VKyM_u{h${Ozu zi|0xh6ShZv5bH!l#mvs349P_y}v2IIX|DSFA8!IFL(Hh2F#HxeZyUyi}fbK2+j zkABvjb$5qozx^P=KVqUC83fsLu%JCjlG=;8FHz190_|= zvDj-lNLJ4I;QqqvbcF)*1|ky^n1uA>ho1+jc{@1lBBAbqjh|e+n&P0$j*kujj=J+ z_aHvIyLx$3^2}HBf6$*2y9p#0qLtj(5_D{QnKbq!th6VX5{D0|jJ+44COKNM>nYB$ za{0w)2yGG9AxIIi5FA?U$Rw}x#Z(g4Ub%KKVyV45X0((Y4-2A=h@vifnA}mT6qPqR zE0)yI>aZH8N09SsXry2|Zt6<6)Uck@B3mt6`-8!OSCDctZ4r%ZPi!Wv9D4K`L54=2v8L zrOSyLmY5F#8TTf3Iy_YxM1Fw`I%*e zIAsvLxP2=`ptQL}_!UODn9D$g*=+YnsL|_CGd0U4d)=r9ynHHZMR+3b+`HDow2zu( zV^=?D)uJ{exv5#%6$#!lj3AJhBkr*I7&&=|b6)0$!gd83YO#5T2KAeWcz23WtUy#u znr>;ny!j#CNSZyqR_l^O!l!CqH|8eXza~T3#LgwT7qOBHrNeDMHeYq`M%BF_28W6M z7KzvHktlLM#(VhgdqQFZQt!ult)!@=mxo=S_L2fPjl6GHn8-#IN{Z<^)^|!oWM{>0hO9h>G6ap$@|Ji&0(PcnA&c55FsPV1x@^;>$S|Q<*I_Ghl7-gIe zl7wK8@GIBmSummOZmDHS(58x70%PUE@_(lFfHPBM(ASA>F5>a8F{`r7JDPSo z1ajqBSb8J2e~NO{P4j#HMXL~Ct@6gJ;&m;FC0BlPO+T~P9S%%?Ceg`?_RRJH(y1oN zVkY!jSX+C^{UDF&!P4#^ergn}sDJd+qwOmV`y=u4wjz!_E(Ggur=XSrJw>J)9nf zI_uFxBTF&YqpYEda0=AUFT@W@pc0IZ+ZeJSIlX? zI7A-Qsqmf)zw2ylbid9hudeAAj`7RO$;F@Av6cK_M)^f=-P;zS-5lzbG}cfO>*szp z*3qugnj&R1<#g}-_1*DvFE1#rf)4U+YG?v-_|XlCU=9E-XkQfGrDJi8;)z2um? z?ahR&M63;JPZNZP$*owOnr(NXyBktT@t29O&-H?wxKP9vsSLfB*OaaoT|4Dp>@v@M z1J!i7TvJB0lE_#Pk~HhMz}uoY=5Kgw%J%U~pHk{J(w%2CD@rL`h_IGSjP=zTZ4^vw zZ{3BT)=gIKXc4uRad;NK1Ts-HH1`;>=sumVvwQ z27QSJzoiIn8q7@=kr9kOAi1}{_ExUvSZ@e=8L^Zl`Ah2KEDn{2K$~=EZ^5UBm$QxV zE2?b~;((~7w>v{oQ#p;`E7VIm-UA{JmP$T%$Kb4$*TTe1e|9cL<+;ABzoJ z-MuP?Vsh_vzlqmneJ4*E^hSZO#^D5y)}A4IVTr;>v-u;8ifcO^txor@Yf zg(`R$5px(!3_>UpV{$P1b!)Rc3VRt6Cyk?nIwf#l#06Wf)rnI^(l4g9#c5`G3B z?%$w8*~oD9p!m4s(QeK21^3E@9iWxS1A#Hw!S5!lKFw?x-&XTD1bEaaAi~WUsUG>- z5L&xPt4b34-W49mzN;;!WK$sA@4W7i1WO?$;6t<3#=KS`X5ifKtVFbj6rPw^*FAYa{FG9oM&{v@4c||5wRka-{TK2H4f4uJ_Eea38lOb@U9~9ad^2JsKBp2; z_>tk!Y1q*RbIf0t*9@+qd9iG)V@2iJsUEJ3R~Pau%!^I6N8oNPE5J<%Il&#)7hmA2 z57AC};;C2~pndhMv+q{k1x1Eus72#m_`t5H31;o&rhegy1i2xUnSfD#&82LIG&I+= zOD*}Inl<%;)PlPr+F$!^#QkfTX!j*I4$_K&!*HzOGIu9&!bjE`W>2;F*lbQ_%;tN^ zfjqkt?8^RVj_zVJqF!<($|ZQl%*r={Xvgj-tQRMqOVal-d6CV01lQv1>(i`cR9jC! zOm#sy#m_U|zZpk=he^10bWrMIW&E;^C%>hb|1)hkZ4+$wQ74to5BP&C{dTZ}&g2|h zkV~G~>zyV(5svShLwq{vD4A_s&?M%$|5f+LB(n8mu=SqtzE|&oU1=~ljf04*eeD$x zw_k@X+ph|rwE1r(S+hRwufeh`PHr!4Q?p4R_>1t{KxuQr{)II!nb(7=MoGipH+v-* zrWkV~zL4MTdL=@v6xSd0S&gZ8yJUaVp?CcDLi+u7bxiQtm&JW_RW(#OO|5U2YIn!U zB*AW|V$Ecjgs$ZH!zh;eq~Ft6J6p7iRO%dF9OZxC+JG8XdUv&Jopk2q7CS9#q+`sd zdOi`368H|o-B;GzzGXxe(vh|??kgfeNg(~vtH~u;9F?Fe^3oz8) zN;ecA0zS)bkgRKQ3yg+K>;)=x9Vqz&7%9dmleVK^2DQlDK?iP1a=%6g&IUQec3bG1 zGw`7{+}0*XJT{aKv3)}-?rPWP>bSvHg1uGNZw=CGJ~fJvaHOJ2rr8xT%}!#4c8qHp zE}JvX_M=>N5QkDL=uFOC3I*GE4IPm!Yx>Pk*g_& zCx5+bWp(enRf_^uS#!b=2ex6x!x0Mc?)OD2W;!7>yibJui4}T%`POO=JDz7{d~s3O zU3;!g9xEyN;&&4|v3663=g6z>3r}1nP$!tL29O4+Ch^Amzjl!LqkQGjXPAoY|d$f0K_LZYYAi|(RSON!i_WZ3^Y4eTP_5o~P z)j7DBl_viCd)`HKt8)k6>Kxj-#W8YSA)S%QtJm@`?+81!_l?4`EFv6=nS71u z8#_RJbAPt?Xm6|b9(GYpHS$Wu2Th9D$mbm%F*u*E{`=f|)xw#j{c*Kb+4&-)_8Fa2 zS#Kbow5a&W{^{;{U-4M&*#^IEF&t(~k$fls=P3$0u3cQ>I*G>VVVA>9ZMdE3-)^$g z$mk;}4>egAj-|{FZToNBV=$QSZnzuVmO_?$ z*j4XSZT0f^L4PO<%GS7+<%Fk4lE>ydY|kx*@21#R%Cy_c593qY{s>6;ydpd1-}c4e zo)ffant?*roG{v^r>s$FcWgCXM67tI(c_iyxHU|6OFFL_jjcHB>nZyD^!00b8xVuu~Z^OwKT+Q%FhzU>=4bxX>- zT7vgvcp=O2J7bcY+*LR3pjx)-?>7(&GiIakQ>X_?K~9eM{rCup5{a73hN%kXAe+NY z6Jg7h%Vd)Hl-m~(%Rv%-{;GkqzEyqwH}^-Q%xx7|lxRb@H5MD=PFqV|72Um%+le`! z+>8{g{lPnJBiRcBt?LrAoVC`YK4#KDf-B($!DAv?uh(|#_g-qqjD;~b_a^K2`TSM7 zY&ZPJ_o_Ve0!%mj*IsWTGesqMs|WeF+b7QSpqp7X;PexJk^37ChmBz>bP`UwnJw$) znmWF)lDpPO;O)%;|P5wast z&V7698?l@dzm(foSPP}w8nZOM9b@4nI=6DU-Z9Y}v#4rbB&O)B)@P~EH(Ym0bVBQM z)EDNA=Vw5#|C7RIrDm&OPhyXId_iQ*tuPvHeR}w^d0z$oERbok+N5qv~J{ zt;bI>aoB1fGkqlP+*mj@WW*B%S3(wZz=T4~|C9hTby0x9wF&h`nEr;%-6D>?d{En} z(F$@IKlNe~TIh+UFXC?Evd^&otUnsg+vQH&8JzNrV5F5&5AQkM!q)P!T^>u^ zLr$GnZ!M{}%J;)e79(=&JCL>heKYlQGlta1Nv_k6b)N!1yYW)quxJ@AW;*y>0W{;^|G;hfn_#bK_kO? zn{Bz&tu1!{$L)SbLn_x;u(PDkA-Ng`dA&2rKq7kTrNCWRfq8{XU&%DtJq8nL!c;1D zr=Y6|k)7>80ZHqDn;(X;8}Z@&gF7#!`QDk_-UerR+_rA#W;8UG>YIKok9Erl&C{)3 zaZAzi_{yV_E-O^$26pz#L|40ulWk3|)4a{4$^0smvBg?}hLJS$#b)ML3Rbw288obOi`IO=q$Ktp5>*CBgQ7ISf z^@*ytsvzYUCgkU3%sKvt)=T6??ri0G2Rg*>iHBT;Rjk*&RBQ?Ax5n5wwJi>Z3zkpV zF0T(Ec2f6V=JN~{=9S<~;JypCrgjW5)2d6HWgiStm$jR|)~H%soI zDHicp#A+gvc&QMp3%xNCsN!SBMguI8W8FE!Fgo1t6|3p4TLTQx6Q z$g`f_2v}>Y>APbMcIR|0s><71g2&%mvNrwhzrT~d^iuLw*(^P}k2YQo+Yh==TERbF zoas{cyH}TrM16L=#QwtxXpYOEF+^C~a;VVRG|}*ye6O5>;Hwkk2XxR)+h%+CpzW^@ zl^E590ofsK4+|_VZWWfpiX-7iW<&%U<)43vT*k8PMg@BHL~BV7nD?Ci+Hv)plxy|w zW5T{;IIUBQIH_stH@~)$df;dF?ARTrb;O*Dqm*xeY( zfa$!kP*5P|>b5$a~ zah$~-pQqF zSSyopwk&}e?c;Q!L|)=3MWgEXlooExaoc3rceB5i`e|K#_PuM+8XR8Fe;1+zWo*JcNZ=G;wvOYh5ZQ>@l`LSlpfHR@SXhq zV`OICz#D~s{+i+WfBggY;i!Lpj~ehb<)5Ea-k|^cGY<{YXb~5Re2I_!Na&xRa=#F5 z{PU9(Qu}{h@-#3o(D>zfmeytfCK~OzN}|r$rghIhpHYcIKT+8Z*{gQ3Q>g5*3ky@& z`}+!+2`a^)bLqeDW>gTIPnx-^x4Gqx)kwgs^<&!`{Ik#Ulgi*0xcbD||MevQ?Onxa znWp=Sf^BbNb5)kGkn4Y6REc@K!S#4JPc?t|mtw|;V!cKeSkr$VwQraMv=Yef$>1aY z_d`|6f(>AiZuT7i9vQQEBm#}+wLCok8G#r`Q^U%CI|~2#)(8Kyfz8xYR2&Ij^-Kn5 z;0CcFMn!R^pla3(0-C*som0B}`Fa4Bf7i7JzyfU)ZaX*$+?FJs7t8)OeazK9lwLRN zuBu?@?vx{-X4MN$X!!+Y(sBHbW;M5Gb8TQr3ktCAz*~y*|g#EZuOG9 z9=+c2`as)*r)1b#)mG$wnB*jT_4`e$_)?LXt)pPxuP)B-q^tYRR#}od&3?`yTE7J) zAR-p=^n;nyYuFxuvm7RJha5u6gGmnBTBh7;XGny!+VwFLZcXG9zEVgb1KMyo;({-U zH&i3QxoEz+PBS!2W!==v=SyB#3WA64F1GTEBh_i7B7ca#;jvw5ck%MYR||NcN5DLK zQr5<^>yDZD}>dkh1gX?i|m_-hx0uX(vhg+iy>n zw~L!Y_qAz0PTK~Q3t+y z@Q_0MYnuI=*I*s`ZbT^ve|J>eE1BD|(H0ek9@~2PlRE`C6272DzN)eH0?0H~sM%Kd zvFFaW@M6$3w5Pm0bLiMQ53F4a^3^Rq4eZL%fdD>+e!`Fow)q}P zMDV#^930#n578F)i?&qH7$*+sy@ZX*uwsCtc8zO53n`eO8#;}q*X?N=;_V0&Xj_za z7}%oT$2w8%sxLNVSf;m=1O?|@pSn4e_%nK_c3&9Lr$9U8z{m}(k%xHTm)sdK< zdeb#l{IG`&%g=e(jaB!h;rK5_2uR1Je`WDz8O8OaZ)QoNv5Cq4X48Yh72kNCj7T2x zfyHzA;O#;er5D-$Sb)^RBMI7JLl*6Owy;HCLOmjRq0@0T)8RCt9ovi+ypznnT@Q7f z$3e2uqH<^R_Co_!vRPIcInNy_yFfJNWChDcN$dUV`54!aaYMf0EaHr;9W))3ZExj; zFIQ)(9jA18tfC0gz(!pZ+*h&zVX>OV@fRdWFIuRsFTlXU>=6Tm_E0DrU&?=B9kY61 z(7DUJpWglVgQq^Y3WDrOU|~aGAw2SWg(SgwX)K2NAOc*IRciAy#nG!EW<3oU6Y5X( zV2Z=S(NPuFn+=hzG}-pi3Y#ka!bKiMy#;HeGd%oz+~%PqmI%eMV6jZ(%K-%qWTsss z$$j2+3VHvzXJ=VLt8w-h;bNHILvn(x(psV-u$b7?l;dPr3m5+W7WG<7okLYClx3p8 zw?q7aiYbO0OjKl1g31T%pA4f_)xPh$ZKV6RfVt7DfC^IeQR0^K{~Vq;gCUmx6MWyj6Y-O(9f8kn7xxC+XdzF8jcgHh8~V{men0~ zTZPq&fyzx0`0 z^DHW z<+SJu=XEy(0Xk6#jwZeiq6*Au^Q=M(mk3;8AS_NY4pNP7WK{9UQOWAIjq{bD!tmMc z`BE3$rT>@TC^lv`7`RLghY@j@+myC-V-1leLC}v|a3VUp#wRFV)gvy=`@7pVDcWQ_ zHx$GbWzL54-(d*_lkvUwb0rdRvS31umjSrxVR#DEUD&>e%{>$B^oC?bs|6l6vSs=_ z4^vy*xp5)G4Kf&(30tnRZn|9G!M6d+!Yr}(WcU%|z4CSDTkWPRe?5nOX4ztX2@V@W zF0Cz=MX?MsTcHzVw9Nzk zscdMBe@0)US4pXRf#j1wsVFvr-0Se_`6om1nSyjN|IXjc!$v=f(JoShuB>wASS=D^@RX`8gM9CF$GeL9rlP=t3?ImV06lYeb?E94}7XbIbpo zI)q>*q16UQ3oL+R{P47oH(erkIND$7jpLhrR{%cA<<9GY2BsH3hWfam_c2?Cv|oST zeU-%6=SJ+<@(YDT(+hMlT-5}DV5_U4wWHKu4HH z9Ab&1HLep$_XPw5j=yh6ov`h@(lg^W<3RvWl|-VA32NPXrx2mzxG7(%dVP;m)r&vh zu>MY$2!QmcQOlRYRp0$kJV|UHtiw<-%Q5^J#BabKUhuu3UpDxP=F$}KH+j%O#Q!0F zH9-4+0{i}FfM@*jjrC}z)ZZ{s)#vmFSfc}ZQ<(e>z#H1BFk4- zQBlcxgn)+Ac}!p|Q2s`Ss>PXahW-O{|66eQ-$T~_*}ea_`0rmRcsmo^qYsD>G+|(9 z&6?L@v{?$8uC~&_v_JF%y{16YT?dwCBkCS7*DV zj~a88bNq%x?giZe@;l^0ZHjl)H3dil{RGj3oakWU@isk}RCy+8>JR_^ATsjt)%iZ< zzR2AL43U=(J&U*|HC~)-Pq8ji^4fe1@qwx;Dv*1ej6kB~xKYqpYCgJvSlpCL7?SWiatVg|I-(Aom3K zw;Elx4W4Tnx?R|2mR}en$gz*-EL^!sL?fjH`5RB?t&LJRS1)LIePV9Krn&5gL z1FS5&+`lMi%cA5Y*-3AVX36lvlk6kad#wPPMJLpAflPaxFGQKFC$9|VaFb`elwz>> z`{h*T{u*=xa?KT___7Ie_3BnefmoWUv?A{;sGYPJ{ z>J14C?>8K`g8Lv8*{__^Lj$NWtoVFqh68aLF$BO~2tWe18v``4I?sSp7*}5*+ED;3 zwEf|^ASAXUjB=yJIzoMS_Qj(CNSB)nYpNn?78k}>m_ZOTK~eo)-Av_&YO4i<#*<+& zEZ;|%yw4l%uC`0{(yeL%@`Ur!RzX~B0epppPlA09T|*3vW@Vti$ZK~1Fl;Hw9#v|q zX>Qd<4(8Mt?tlhXM1n3hHK6ZJltTO(hFFaB2+~>f0a1DZf zom~d0QXwVY$QXkVda{9I+#iSYN;dAp&I+OXlrn3>>7;fKhidW9Qx(v+K&%mZx^f7< zPQO(Cr>85J%xx!|V=!!0C`D1@+3ero-PpiwJuQQR+U4in&sQt_Otq_#><2GusM%mk zqdOI2^2?b~@~EKwVpt{KzR99M5%Z8DES>38M+z>c8@*4oDP9YzudZ55&E&Y~pts1~ zNp5INC2uYc+OS}*E8Q=`&<7H@(3}@tO$so;ioYRpDbp7nig+Q}IrLL)^#aB1ZL$<{ zugTG|!Trhemo?<`4det%U_9;1D z5ePjRHi~b)QnBHEz%xZuGQ2kjZEc`xqeNg&-s)a8ZA;ZFzYzvd_vc0Gq)Wg! zM@f3Y+!~zs7Y`-ml*ksfwFx`Za;9y&$O%0`64W4E06!kG59JVOeu^NTmJ%E6B#EWwtH0^74xU zTQvAByhQ_JCJ=yxK$_l97X%A|QY4=0X$Ho{)T%mf>aY~o6U>(yvbF^#$&PAd35Ni0 z4=sjHE`$1#ZpLiV3BB>+cu2&2cbE*3=BWlj*cGgooVp2&zz!2S(>O9E$VR^e@5OMq zr7R(7>L?XeO7n`c96wgp6Rk1bc1pX*3gapm zl<7PVI|zF?ysp6tG$9PfKb*5}ra3oGM~bDw!>hq_)vS0e0?z#@Ws|ASF#UuqekQ^A znu>;b0x?ev=`0Z`U2?6K!8yQ5J9KLMo2VY6W-fFu4tf=+k0Y&ZfbVB1upY@DU zY)G;45Kiz&UuXpCxXid1x}2Pyj0CSXGF-#_hce+G3E&dDU3~CK-|@ilIvo>`YU_zMR3DUQ9EK7*c6l8bWhKdI4+wAlGw3Rum< zYnc|?+%AJfJ4zG@OuBy(k~a2k6spCSu!AQR6yK^n zGVl~S>%rDs?}5c313W9k%107}ax)5V;beIH1?&RV+;QwSRLe$`;f99xnl@G^!iW%j zJn18_Qz8axG(tqZ{r8l6+h1=7FiEE#l-|#L*g*PY72tF`;dE)AD|ctg;bdaA#7ZsH z__7+Z5Bw{zGs9&MDF|}Y!Wl7ykm6s)zllh1*2Ht#@h5;g2n2efPB6WCZ#;;%9s+>P zF-2o0vdu<%M}rytdJLio^?J>rPN1bL);_a>b>XZZHls5p4|IXKwEY?Te6Q|pb;Fn+ zTb=hMtnBzH$EQ;eqykbq!WWOm?TsS#iTJRfty#yXS*cye=&Y|cUL5r8`G-fqe^J#E z&~FJqPot6GohHL<$sMk*X^)Wzbw1=$`~+_e${DA*lbkYN9A#Sh>I);Qmb@l;jM_+6 zj26RLV8-+(M-8n=`p5D6MyuTsrQ*@MrZhPRT7bziWMpfZ1CehfiT0!CGgNUuT%WPmWIQo=@S399V&-+q6ifZivvWxpgP79W z14+6Lr~cbcSlRe%z$3U7e6OkccvmNe$@dZy9D(x<%V1X}1&Vn&_>_kH#oUNkxIIl= zRu|cj?HoWx2EVwi=4;q&{`}VH`ZQ6ISi(-#S@-4mD2URTx;XsF2Lnpa2O++Rs6#4j8@qC`D;72MxYw1AaqD^m_68s zz*)43^EV^Q@FQ^&_&8__T0`E|p~Key9b|5JM~A@ZF5T5<)ocwz0aO(~T^$f#ZG{Oy zm=VD4##uc~mcwG9Amm}CSb~GuXHvk0>}6(f*RX|t;tAM;>EZ5;2PAYTi5obQh2q0M zR<5uu4*4_4k?-ROi#Y+)_<3Ay{Ikc^$@ezXO=4$|O}i3`1y9KW(N3fVB({Xic>RWr zCBI_7RoT3TtbU{}A8-|iV;A-NCA7Klxf z*ahAo#wkDZO)=n}6=z;e$0>{`hx{ygjXX#PHAOOtE?Zf*OJ9o>4Rn>3p2c*3RSd^` zL64=SO^+uTLZZ3?&+Jlovq?rD`Eo)p82cj;b7Q4x90>FzRR_BA-<~g%G@ep;-5io= zqh~N|?ul+}w-%E-MuaT4>~7VjP{5!YD5uR?6#6 zA#{&SB$IzF-MWvRPSF-5Q}+a{BjZf_({=DxF_36<7Qb+!0rRMndY~^g5zUL*4tI26zFVsv=8wA`o_AWBqzjY8S$`nCuj`fZvEZ#p~4nX&9R;Id* zpAc}I;_=QrjnwFT0+)Hrd}1PKwwfmH`uocRNb~JkP=^Adtgz=W?ng!xFEy)?GOYl9 z;-==yBeE!>_(l|J7XZITndD1?;}8u@F99{(EyCn^>eI+KZCD~cpgFLREBAPJlRYB(r328u9LzC@3=|2^kbQli z`wdY*X?|G*9o529NY9qM?mskp-W~w*%^y^8>daQ@knpunlsrHE69@2<#gWC~`yclJG#-Ew#Xn5=iVjibK|sS0R51KT zE}L1gEB5oqPxak)D_33!NYo zkm(PXg97_Lpz+*`8!%pw(hdSNU`6;u)}%uY-V*L0P@PHu_V5QP$Mb)lnB4uKrIhLl zXec3-T5^9sZE+?AlqFCRMPRo=dD{JWpbbb_M4`f08#aHwKJ^0#S4hX>bON$nSRGop zg2r6&0inW(Ap}F`389k@f_pWv6>Ll^1(90^veB0C)e}A|1buOY38bv(vzm;-=i`0U z!7DKx+!jHg%I)-0<@SLh>M?YAb8riZ>2p3E2u9CBBRLk%A{E)&^``ilsV>bg!)ci& zNTs@tt@y=G`Ou0WH&8vqk1PTj&-Or3z-G`Mzy^|;#vAr_?`1-IKgjU)Zn{53AcU~- zZu$(!JOSbag?qfK;bJT1vY~Q8TY%>z3}W|_$wbEc{5gw|tnj44vzI=nALsS!e(xbZ zAP2Sqs)NT(8%qAVS~?Jx?*9gm4~C{vSbv>q;;U(W&N>)ZR_M@kBekqhJlbLES3pP$ zT~jkGLi>mU3o~rF&c=ht(*a=`z)w4hvtOU*V;u}LZ>@{~WGPG_Mavudf~Vi`-ERPp ziLK{{473;9u4^ZZFU>MYt!k)PZXy_loV~QB*mk=BOF$+OO2$|JgnuRAMP%WT%z2y1 zr!|Tf*G6X17Pn8biPK{sUYA=eTiNA<{ESQu2d$98%E`b=yi@$%y8YhqP|f_pDlNfK zERh>F;lXOJvldsoCU*+1aj*o);MaW&Rsx|yK`#z*Edk|(|CLf5rsW-s-3F>OGNdVJsq;Pv_g{)=Bc^n+e`g%3O1*tRH%13t+0N9({zX+dO9ctqfZ{W~?MU#E@_b7 z8-_4TMM?uk^lgQx(hg7#Ttj<;WyH*1<_9Q#*#%VJG9X)maoLqkmGBh57%9df2npLc zFc$=$e1LU@g&iNW+uHIcMH_^8$5?_Ova0b;5xZ35Dc$4v?XaPbbR7udmJJQH7*Bl9 z2L*R!+oF2AsNRn@#f3U_M*b0ZAeXmrpmOWGK(+P#d+sV$@ zXMD+u=5LI-=^Hi;6N^&i*>vQH?>XE%yBwOq=8CPRs z=sZ+bumG8*v?^_nszJ+X#t6n|9KBXgInFh17A%~0x6)|>(%ZQ$4zg%b*-E31b!fya zec{rt>R*b}td$TT#T$f(551A#v~fS7dubtOPA~kz`3h$+hgVfsAbYg)bJ5dfLt%@d z>kIN(Fee%(vEQs7+4wWEmh$Uf$Frpcev0)oIyPVWz;jUCYnZXD} zW}k=?Er27lH~9i8JjS-<65upNFwM)BqYof5L* zaEwokWuS~`i30^WwuNGi?aj=eU=id|s$6<#*+`jwjL74=(_$~*Al4?AP*Smvyxx3Mt81OiQ=9fT$Ljl&9YV z+9GcSsB6wn7=tQ24S)RAm9RoY%RTF)HdJy4o$|66V6nQpNWLz3a|)=Y|x`N3fHVi~Lfl z94Egy+BT${m+fqs`qjDZCz0bO=j74aTCpBsnC*BVuspC?@ zYlZNRPBqdtvUrxLgP5LC9<#OyZ1lvrkrORORsE5PRC$m5c_TV?zrJLc&6z|9PU*TD zq4AVWovcMe*ywWaDdSH0Pfr$a9y3z2kTSYl&kPAzTsel{V_k5fvnBe(MoZU$vRZjz z02m8mOl<%gh-&ct-~8xQF_V5MP68e4SSmxlL1zB^V?g}l`xi%mAqf}6HMocspnT~F z@H~USqej%9M41zjt?bTp@5Mi4jyy#5uF8AY(oV)aLyE+LGzoA=R3SrHYoglfj^%`^ zdPrgA+FP5h)AzIz*;5ae>BWtT$_TtHx@y<;p574|#K~KQ(*uT~{I^HbyFTf z46)_i#1z=UZlgD2YGqrG>B|vpQP9$!cntkr`q$G8Tq2scLXyMI2zeNqk*8Ya^hsX0 zRit$+lI`KQ+FfMY&wph-h!vOGpo$wzSAXWICu=(j>hx7&P;B5MQphAkON6*Aq8_Rq z*cz&)S!KA0^YD#U&~YU)ha^hlFx{Y?wkl&Fb})4yA42y@JnwutUWsvhruY}f>Pp%- z%)plCZK|dZhB~lAbr8#diDZo8$Bj(>Es&}c&PfiQJ`Vc+K2n7gr&HB9{jWvs#7B+7 z9#`#G0Z42c(F*&lz^CE9rW~{HIs8aOA6t4?Vu*9A4Dr(XetwPhCEqyg<~%STB@w(+VTbC%p2|XRpx(2}M{3sdP)^05JdC zAyLV>&H_QIbZ5*eD`Uw2GJ+ebI!Hv)^5OBTn}LNCS8+OTVL&-+#Hl{^HFwez@hf1% z%K(NC`+?%t%ua-Q&h(QpufZNU<|)<7)TLtm<_lJMBvzYvnV222B8tXml=%lrOywMm={Q(}H_`c8H8aeNJWP0$EhiC~P{~>$L2LJQyrSFwEOC#gLGkO+D zSYrmO;OX!19;j3i5}y-4c%$*YP?3OU!rI5teelbJM+Rx#wQPdi0*{>mP+)LcH1y=A z$t{|V_!FV{>V;&eY)VfU{~@sDV1gKLaMWM0B&nvb4$Tou^2Z=0049pb=$oVq*OBeW z2@il8CIBn<7`jv%NYsWU&$sr&2A=HP*%N^hK=ev9pGJHkT3wGAjoFH6K;b~5j{}#s z93$$Dawbkww6lv@AXP;LZ@DxP^E_Swo{sFO>^7&+p~hzLZD}M4V{54yF?04>w0z2Z zhGZD;jBOKJd08A?ytyR%Q1i@pa2Uxe`q!I1)noDk9en0-aq%LkDbTIlngQnO`DbY6 z1XF2rYc93y4gQc9Oo1)ZmY`ObaL-|X{Y9e40*fwtJk444EG9WN7{P}XhEk=f`le_< z*1Nyx5?KL>XypFf>t21Q!5*>tGw^uLCc-Y7TpeFTGS4(JMm)ouWJudFcYU=^XwDLN}f0rMm0ozA*{Ed`BKo*Y(A#PM=8bU_sUxYmJx!#Qk)QH>(gnvTm(yDx8jcMj|qEHt@sKapKRv zB%i-)(>;rM0tG_n`z38{T~Jn*<`4-DUa*K9_j4GAtIRtPAqKRPAf24+!_|Vqm(Hzw z;1qH%Q=R$Hj8IxipDrT&c-y(mRnydiT?p2)(@)F{UqXa!pbI1j!fL8tF9iE_lfJ>@ zzJ(fQs*|>Svduus%W&EO5HF4m(z^4eh?i4ujBS8##I(PO?@7@k<#;wc!X$yI9}@b1 zkL!^=84!mHViB`9kEh(_*K{VuF-oAImRkNp<~Y3fctYQvVzF?&1Rg$h3%=~=s=W09 zLwP*El#-HnMGju*Zr$fl*HX$rQ!VGq{yd5OX3$rmiz4i#tna5|+%j{8bgE4&3j1#h zfNpcAA}uvgLMJ`$T)Hv8BdP&&VA({N?iv){ca?Oxo0j}Ep+Htf@M3wtaz^*csM1vr7xcAmB|O?WDNlMCWkR};ANozitkvZGboyi^QiO$( z{dps?x3N=mvnlBMGV_=CCX(hXkg0MVXqbbI)6{*xrsQFEFf%Xu{6uf*AZ3u1X>axpC#S%e^6tlM^23EID)|eHonL z93*s8b_eKif1r4B%!6rbYg!8YDAj;xBD2fa^6iNNMcsrANKqYXAK^L?FE_0pI{RpmaNcWwmX=&VGqN?AqVrJC-&PZWJ|( zm|6AR-!_=*l%Mos=d9|PG3y8X)5%WWeXQw8v~G$QWRy}`_^soLPHBXH;czFocdX+C z2~JSLJymgSx<)BT;IXDCMmgTjb?Arix*o08ynovG9IzM-T|cNgY`Y7^tboOb;a|oC zzEuQM2L2={{1=b&zd3*ZzoLfzA1?Vm8SCVgT*8le;Pg=v|C^~$I zC)O%=WYyn3ifV-8(UE`HeB`HZVK2D(=#N6+nf|8!k`Npp;(`8uF+%^p9uB4AU%yNx z?3(4xfTt;r^Rv>?doVfAw5@8_T7mzS0%5VWMwql3Fv$5igDHggh1He+Atv?yF~o2T zm;VL$JtXggBI~6l_Tfa}@I{p2Z2-8E>Sz2()SU7KBw5#+{qM9X0T1-$O8y}Rp8!f{ z8);)ilJal!XbDKBehA_u$^EFOhmj!+;UL^8>tk64emWF{TjQwUrIe~aTQNAa{qPPJ zCPD$uCwR6G*D?&@5(U6+<@W2Nr<3o0nf!-cO%f~i4&~qah2VI)2o56uW<-ucXW`#M+$Op-OH23qVcOj9JQs4sGN5MeTmXJMgwe;zw(Ci6Q6Rx?#exdn5)QwKBbm=J(i=z6?KD?jGz&EjE z12{6;Apr5XHl&8;UC_%1Fpi0~>VR*xlk~iNI_CVq(+YfFf)}udeL-j|2x`vuS2x11 zg0Q*p`B|L&Z(fzssoCrOW=gA?WxwffEYY4%AcX0Pb-N&T5X%c5wtvdk1m^-hb6dc9 zUCL^8f;SJmBe3mF6UBMfs%eAey6vK%FjtD&{d>TE7!=onX~Nf(0%D>63jFSR={~g0 zjhAAulp*W-qbb`|FpL;ju^aUIwPRH$VJv%Bt5$&M(99X0P|Gj`aX zWcGa3rSQJTydiaH`S@bKVCAfB$PYFTtVEH_G*XTjr+=Y+TqQN`Yj9+3x-e*1OKb~0 zKUlPoQzWhYJoX9{s5Irt54iymr41%47_VT=%09wl zSj=HPha*XbQ~l_{9H1g`(Ok6F>0ifc7<{k!(*ej`0<=!>GFbpd#wzt+1U7JN%40#~ zESLLKuRG#L?A{d!buh_cRI1cQ4&n8-)uZrcgFa{g*hy9Rko)?%gW$pMN3cUX;S;)@ ze-j~LzADgpgvo?yB}iaz{+JYy%?-kWUO>cur9FT;b1`F4F(P4$)B?JibKY6-F3n#C zjHY7U{{*&e2$-6f2t9d+>kv%-cEi8PEVz+aOXOKOaD#QGvZvBY|l1ygVJm=!#tgGlxewipZ&PGog`4@Z}++?;h@!YzWPu^<6L zGfb-+vRv_Bx(K1WqzzNR=jxPs1mKsR0s=E^`yEB1vM;R&_Y0aJK}H(#{nGs%Ap+q| zCk9QqS|UsZNXBY_g*P~q466iAA(45&_m*yG1KJt3jTc#9)n)RGMA5X26?K5!u+s;y zSVI&nvNi9P-Mh%0+q(o6F5aPWEK~R%f_()P=VCa$O#s9_N>h8^>sqEkW?+UeP3uPX*IdkR=nPnD5nKLFbvm-VQv{B~BlzEDX zkRdXJkjz6NMP{LpZOYK^I9=cGec#Xh&;47^v!3;P)^n}vpKGma)!yem&(C=r@8k7; zAEqO$@)W#LGORuO0G))}jG8$Y(^Pk0q}r1#GoY)Jrv3R+Ddk&Kt5o^ChV+NZ@6q@Q zI->S+Kn~iiV|JHQGN|g0EwEgs-4kuvn05HrfTC-UW@VN2S*HICs^A;)cAbJmcg6M2 zi*vELVbgCP9M7;IR<8Hoijr#B4R7&xUf=3K1RRt0zCpLaOHz>&i2?5Ayu{uE(AlKB zFxcjNo9T#ixF4E7b|o6&xH^nxjm_X^5Q+XmN@wAri~wcR`^z=C6F-wIpTZN_p68Ku-?%yS>;dn9g zsakKtvcqK&gY7G;L0e*ptU`T+U)t9J!Y(V-J=rsr8@vRCvgF%#Op-}TJ7TRs3>k3_ zs)+l-R=E1*{rx2?QO(YA6A#WiZ+f3Om&gqJd@T>YfWnY688V*;4*R@We(p(<(4k}3T;pBvuHMH<`f1DA(( ze(^?D_GL#pkQeKULyMfpxgjBB7{WZ?{8WIrNaB0HM~5alWKQgpdaW<1v@mYT6L}$X zL%XO9qMo^zyIvQG#?mrpwA|^?D3M_@RlD_M5gQdRciNE1Ioi8;GrSS?4!9nCTNc{ zqFJ67^i0*gmi`5!9Qjk%y0eqc*4deehK-#<`#qPu2g8@B=oA=b-RY-nzK9!*CxQ8a zf-|6fFmHU5?y?0B3QupBLHfRC?3|UZLqFmOy0Wu2UYLG5haawvP7ZCPIo_GC;qNWo zE*`6GBP074uatz;gyl9{`@Vk-G3W_qe-~l$;q&DoUkMd4rw6^6)fh>d93C&x6-*@% zng&{E!knm?FGEOE03UTI^((>xqlDw-aGh$%K1CO5LrTLn#=59xf40*pYco`uH!tA=!0K{6&@HOK+055c$vvwAs4!TL}+HDQm-7FHT*sIk@$#;)+ zwkJ;GA%mgW>RoUd$|bfQVx#73@<}VZRpkrbR-dr_{c+K174-W`6#hmXKcVURz4#K# zUTVkd)*u@uLvVbPyY^JwSpC$Dt%;kD1RlPE!g1U>ee2m^*7^wp>RGgVF>3CGT}kqC zY5?Jn|Hda{yCPB>@2E!0Ok}=TlH;gHz zG!|NKQ@=FGsJG8Au!f6Y>HZ=Uonq6Rn*c2*|I)~b8{_Htn zM)?;s=V0OrD+`aSsMHg7Q?NFTLky<3?k1FY=@+zH_%mDi5QsBi{Ps9@9wm0#2e`4A1D}T`E9i)|p+_0K54NTG30rTh@vw_k=X&B?^FrQZO z?BFkArjQCD5tqUoHN4inq|Te*ekCH{q~p_&>9Y@VG&tHniekqREhzOi4j^l+>mh39 z+*4`O9|MAJ`>JpnbxN?Zw6WRHE0{3*3MD7T{4Da4Mi;Gn>Q=0-w~v6)hAKL6JcfEV zmWv7#xKb@K#94oj{aQ2>*xc3L7gzztI1g5zo z!Cs?Oo%g);yMN}^=-NX1x-W{%Bxq4LcM>KCSy$1g``lWU6iqCHhLo$GM3XF1xW}Ieseb?1 zDSCmHq0M|YoCI6o{_f~6Kh_Y|oEtQEdXcBn9>t=HFz6nbxqT3Bs>=TZG$A*ubn?bQ zGiz%?R@A7y{t@UND!QN6AIMv<}7q(YPw1ScunPXNK86h_OT;K^!ZYKvlFa#syK zMGpFMRPQJ1f7~UA;T_DRXo8>;6xe}mbxUK_?r6euy);IJzkBPe(8jk7^KRe#?49K~ z-6q=SKlPZ$_MP#Wm-#A=p!mU}H*?34Qkz3#EA$BIbz;>(q6i5BO*;vwI~pW*bjH0u zw|;B?{0#M~Z#p;_D3Cfwu6OF`JhSs}95}&XG{a?O z0PW?l=QlItOhY`C`Ds36h`~2N4!oK4h3VKHnMvpxBYFebWp~_Gf^<;nK zo+c`v@~E%9{p0kZun3xoh+mZp;>qX(XRpDlS!lwUdOZ<8#m3^N@LsAJIlu%aXX5mu zq7CuZd#UGv;vSv<(7Oq4I#T#_d(2Jx4NFZ`;EC}<^zLx-$0O~Rq`pyqw!n7NAGm_b z(jmY-?Qk2K!;n^5b3ui<`S8{_tBA56QF{B(=B5&XharT3#*H%5RBrME(gz4t* zbW0B7b%g70Z>}61J1H1bCtD5gRdAOylY*_@ljRV+f%jD?@UJ2Y?J`I^J_!KT$}+Za z`JMrROkwT)nd!zKy(cZ`He0>B4!Q=MmA2mkwZ+xjk2!N2(?im*Q;e7p!Z4v}a{s#>LvGbGKtt7;Dj)*Sp>3*&3ne++)zI&>*2s3*g z2E(>GYa?JUZiGr0w1RkZwz1ds)M4`7dPs=!tLlZ#gv zgLVX+`hSl&zpA&TygE>sJ3NoD75;rxeI8N3Ojs^+Yg1~hNUFpSA)FRb)w0ZQhSX_r zLu1mx?{lM*QdOwr#PC9xK*=LzOr_-5?+d-2v#KN2@H@YMmf~z~fJ)_%kez*Mr~;2` z3u35s1K-q0N@T_vDcter!`3hsBZI!z0{spUr>N~61ZP7$v(qc=yNG5nUA41%q1%Dd zjq1j4td{$7Xd??MfYgw5`;F14>l;ru;@MXXf1K)OTPDcHTwY&74F1gk%F|#Vv|t2V zjd;TW3yD&si>fT&JvtmcVRcVm#;1f`s>d_gK7kam=+-Hu3hy3kv?9*7z#cTdKUim% zyAF4OorxUKPumv;%I!P1C;V`!dyUZ(ksx5SE+s1TQWJr7+3hy~`+q0@PPRg)6{NHR ztLYp3&=E({K`}7_|Tq!4Io8=Bl zyR&a*wo}#rG2FYNAJfj-ftTOwH%}|%=;Ji`&Mfl_bSVzM4R@FT+(C#q#H&$EMp(#F zH_?bu+gAPX4n^K97ZeX(h4y!W7;OUOF8ttjD9v8^Amd}YJ>f^@<}>b}0yyU0?+$yz zZ-JQhOB5o_>@ZrP=m{OiqcyJIc%s$}dK*JE_Xkejxl{^yLf`1TX0)h!CFQZ_idG>} zD*(8Nrj9#g+_lyGP(_&IkTZi<_td?D;McxCK_>}sB--m)duy4X6g?hjVYhgD(Whq` z?wXSVFH2R>Ki-@gTKn$n`wJO%A|95n36zgB#2a7jl^Fb`3w;pd4Cs{nn}#2e?*!7O zWAFQ=-c4g_SJA&(A}aq0g~5vI?jYmpz%NJ-oDO=jZz{fIIRiU;_qJd`*F6J#=xvkl zb)&+K?)YcR(WPnYKI(+@kbwLb$m2#ktXPj#p zMDonvt;-O0Z+PE1AOt)i4Xq00!Ge8~t6P#rFJnlG=YKc`t8%vVij0bz+nC%_<<_N~ zSerSU!vk6jNGr~P)k_+ktbWyr6DL6R)c%S-6)iI~mZF*2QQ7T7&=j*0J^sz{{k!aa zP?xd6F?cMo;tvsvAY*m6TuJLNY_YA5?X52aDJUd5$4uQN_O^(wIN$RHUW-%yq$;G3 zKL)LaKUjj39SyJ00ATPC0};A>+w}SFbTm&$$$(OZ+Je@~Yk~vWy)Bg7j+EMdZ?A&C zXETms%yS>6+Gj+z z>b7@~!^$%w#id*e{wf0HOzj!5=Zd?6CEsFo&N1}z{2b-c;s?K~)B8jwl4I+Ux%B1l z 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 fW0e>^`<^1V=Ld`F_@g^V;2$kDy^AF()&2 + echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2 + return 1 + fi + fi + else + JAVACMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v java + )" || : + JAVACCMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v javac + )" || : + + if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then + echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2 + return 1 + fi + fi +} + +# hash string like Java String::hashCode +hash_string() { + str="${1:-}" h=0 + while [ -n "$str" ]; do + char="${str%"${str#?}"}" + h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296)) + str="${str#?}" + done + printf %x\\n $h +} + +verbose() { :; } +[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; } + +die() { + printf %s\\n "$1" >&2 + exit 1 +} + +trim() { + # MWRAPPER-139: + # Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds. + # Needed for removing poorly interpreted newline sequences when running in more + # exotic environments such as mingw bash on Windows. + printf "%s" "${1}" | tr -d '[:space:]' +} + +# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties +while IFS="=" read -r key value; do + case "${key-}" in + distributionUrl) distributionUrl=$(trim "${value-}") ;; + distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;; + esac +done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties" +[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties" + +case "${distributionUrl##*/}" in +maven-mvnd-*bin.*) + MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ + case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in + *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;; + :Darwin*x86_64) distributionPlatform=darwin-amd64 ;; + :Darwin*arm64) distributionPlatform=darwin-aarch64 ;; + :Linux*x86_64*) distributionPlatform=linux-amd64 ;; + *) + echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2 + distributionPlatform=linux-amd64 + ;; + esac + distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip" + ;; +maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;; +*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;; +esac + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}" +distributionUrlName="${distributionUrl##*/}" +distributionUrlNameMain="${distributionUrlName%.*}" +distributionUrlNameMain="${distributionUrlNameMain%-bin}" +MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}" +MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")" + +exec_maven() { + unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || : + exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD" +} + +if [ -d "$MAVEN_HOME" ]; then + verbose "found existing MAVEN_HOME at $MAVEN_HOME" + exec_maven "$@" +fi + +case "${distributionUrl-}" in +*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;; +*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;; +esac + +# prepare tmp dir +if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then + clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; } + trap clean HUP INT TERM EXIT +else + die "cannot create temp dir" +fi + +mkdir -p -- "${MAVEN_HOME%/*}" + +# Download and Install Apache Maven +verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +verbose "Downloading from: $distributionUrl" +verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +# select .zip or .tar.gz +if ! command -v unzip >/dev/null; then + distributionUrl="${distributionUrl%.zip}.tar.gz" + distributionUrlName="${distributionUrl##*/}" +fi + +# verbose opt +__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR='' +[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v + +# normalize http auth +case "${MVNW_PASSWORD:+has-password}" in +'') MVNW_USERNAME='' MVNW_PASSWORD='' ;; +has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;; +esac + +if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then + verbose "Found wget ... using wget" + wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl" +elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then + verbose "Found curl ... using curl" + curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl" +elif set_java_home; then + verbose "Falling back to use Java to download" + javaSource="$TMP_DOWNLOAD_DIR/Downloader.java" + targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName" + cat >"$javaSource" <<-END + public class Downloader extends java.net.Authenticator + { + protected java.net.PasswordAuthentication getPasswordAuthentication() + { + return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() ); + } + public static void main( String[] args ) throws Exception + { + setDefault( new Downloader() ); + java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() ); + } + } + END + # For Cygwin/MinGW, switch paths to Windows format before running javac and java + verbose " - Compiling Downloader.java ..." + "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java" + verbose " - Running Downloader.java ..." + "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")" +fi + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +if [ -n "${distributionSha256Sum-}" ]; then + distributionSha256Result=false + if [ "$MVN_CMD" = mvnd.sh ]; then + echo "Checksum validation is not supported for maven-mvnd." >&2 + echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + elif command -v sha256sum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then + distributionSha256Result=true + fi + elif command -v shasum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then + distributionSha256Result=true + fi + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2 + echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + fi + if [ $distributionSha256Result = false ]; then + echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2 + echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2 + exit 1 + fi +fi + +# unzip and move +if command -v unzip >/dev/null; then + unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip" +else + tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar" +fi +printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url" +mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME" + +clean || : +exec_maven "$@" diff --git a/Week 08/Lecture 13/Assignment 03/lecture_13/mvnw.cmd b/Week 08/Lecture 13/Assignment 03/lecture_13/mvnw.cmd new file mode 100644 index 0000000..6f779cf --- /dev/null +++ b/Week 08/Lecture 13/Assignment 03/lecture_13/mvnw.cmd @@ -0,0 +1,149 @@ +<# : batch portion +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.3.2 +@REM +@REM Optional ENV vars +@REM MVNW_REPOURL - repo url base for downloading maven distribution +@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output +@REM ---------------------------------------------------------------------------- + +@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0) +@SET __MVNW_CMD__= +@SET __MVNW_ERROR__= +@SET __MVNW_PSMODULEP_SAVE=%PSModulePath% +@SET PSModulePath= +@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @( + IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B) +) +@SET PSModulePath=%__MVNW_PSMODULEP_SAVE% +@SET __MVNW_PSMODULEP_SAVE= +@SET __MVNW_ARG0_NAME__= +@SET MVNW_USERNAME= +@SET MVNW_PASSWORD= +@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*) +@echo Cannot start maven from wrapper >&2 && exit /b 1 +@GOTO :EOF +: end batch / begin powershell #> + +$ErrorActionPreference = "Stop" +if ($env:MVNW_VERBOSE -eq "true") { + $VerbosePreference = "Continue" +} + +# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties +$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl +if (!$distributionUrl) { + Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" +} + +switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) { + "maven-mvnd-*" { + $USE_MVND = $true + $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip" + $MVN_CMD = "mvnd.cmd" + break + } + default { + $USE_MVND = $false + $MVN_CMD = $script -replace '^mvnw','mvn' + break + } +} + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +if ($env:MVNW_REPOURL) { + $MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" } + $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')" +} +$distributionUrlName = $distributionUrl -replace '^.*/','' +$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$','' +$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain" +if ($env:MAVEN_USER_HOME) { + $MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain" +} +$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join '' +$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME" + +if (Test-Path -Path "$MAVEN_HOME" -PathType Container) { + Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME" + Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" + exit $? +} + +if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) { + Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl" +} + +# prepare tmp dir +$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile +$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir" +$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null +trap { + if ($TMP_DOWNLOAD_DIR.Exists) { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } + } +} + +New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null + +# Download and Install Apache Maven +Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +Write-Verbose "Downloading from: $distributionUrl" +Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +$webclient = New-Object System.Net.WebClient +if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) { + $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD) +} +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum +if ($distributionSha256Sum) { + if ($USE_MVND) { + Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." + } + Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash + if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) { + Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property." + } +} + +# unzip and move +Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null +Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null +try { + Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null +} catch { + if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) { + Write-Error "fail to move MAVEN_HOME" + } +} finally { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } +} + +Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" diff --git a/Week 08/Lecture 13/Assignment 03/lecture_13/pom.xml b/Week 08/Lecture 13/Assignment 03/lecture_13/pom.xml new file mode 100644 index 0000000..7db908d --- /dev/null +++ b/Week 08/Lecture 13/Assignment 03/lecture_13/pom.xml @@ -0,0 +1,124 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.3.2 + + + com.example + lecture_13 + 1.0-SNAPSHOT + lecture_13 + Demo project for Spring Boot + + + + + + + + + + + + + + + 21 + + + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.boot + spring-boot-starter-web-services + + + org.springframework.boot + spring-boot-devtools + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + mysql + mysql-connector-java + 8.0.33 + runtime + + + + + org.projectlombok + lombok + + + + + org.springframework.boot + spring-boot-starter-validation + + + org.hibernate.validator + hibernate-validator + 8.0.0.Final + + + javax.validation + validation-api + 2.0.1.Final + + + + + org.mapstruct + mapstruct + 1.5.3.Final + + + org.mapstruct + mapstruct-processor + 1.5.3.Final + provided + + + + + javax.servlet + javax.servlet-api + 4.0.1 + provided + + + + + org.springdoc + springdoc-openapi-starter-webmvc-ui + 2.2.0 + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/Week 08/Lecture 13/Assignment 03/lecture_13/run.bat b/Week 08/Lecture 13/Assignment 03/lecture_13/run.bat new file mode 100644 index 0000000..7f578be --- /dev/null +++ b/Week 08/Lecture 13/Assignment 03/lecture_13/run.bat @@ -0,0 +1,3 @@ +@echo off +echo Building and running the project with Maven... +mvn clean install && java -jar target/lecture_13-1.0-SNAPSHOT.jar \ No newline at end of file diff --git a/Week 08/Lecture 13/Assignment 03/lecture_13/run.sh b/Week 08/Lecture 13/Assignment 03/lecture_13/run.sh new file mode 100644 index 0000000..1596d33 --- /dev/null +++ b/Week 08/Lecture 13/Assignment 03/lecture_13/run.sh @@ -0,0 +1,3 @@ +#!/bin/bash +echo Building the project with Maven... +mvn clean install && java -jar target/lecture_13-1.0-SNAPSHOT.jar \ No newline at end of file diff --git a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/Lecture13Application.java b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/Lecture13Application.java new file mode 100644 index 0000000..e77dfa4 --- /dev/null +++ b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/Lecture13Application.java @@ -0,0 +1,12 @@ +package com.example.lecture_13; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Lecture13Application { + + public static void main(String[] args) { + SpringApplication.run(Lecture13Application.class, args); + } +} diff --git a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/config/FilterConfig.java b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/config/FilterConfig.java new file mode 100644 index 0000000..83dc148 --- /dev/null +++ b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/config/FilterConfig.java @@ -0,0 +1,19 @@ +package com.example.lecture_13.config; + +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import com.example.lecture_13.config.filter.APIKeyFilter; + +@Configuration +public class FilterConfig { + + @Bean + public FilterRegistrationBean apiKeyFilter(APIKeyFilter apiKeyFilter) { + FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); + registrationBean.setFilter(apiKeyFilter); + registrationBean.addUrlPatterns("/api/v1/*"); // All Customer API + return registrationBean; + } +} \ No newline at end of file diff --git a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/config/WebConfig.java b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/config/WebConfig.java new file mode 100644 index 0000000..9e643f3 --- /dev/null +++ b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/config/WebConfig.java @@ -0,0 +1,9 @@ +package com.example.lecture_13.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.data.web.config.EnableSpringDataWebSupport; + +@Configuration +@EnableSpringDataWebSupport(pageSerializationMode = EnableSpringDataWebSupport.PageSerializationMode.VIA_DTO) +public class WebConfig { +} diff --git a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/config/filter/APIKeyFilter.java b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/config/filter/APIKeyFilter.java new file mode 100644 index 0000000..2535b63 --- /dev/null +++ b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/config/filter/APIKeyFilter.java @@ -0,0 +1,48 @@ +package com.example.lecture_13.config.filter; + +import java.io.IOException; +import java.util.Optional; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +import com.example.lecture_13.data.model.APIKey; +import com.example.lecture_13.data.repository.APIKeyRepository; + +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +@Component +public class APIKeyFilter extends OncePerRequestFilter { + + @Autowired + private APIKeyRepository apiKeyRepository; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) + throws ServletException, IOException { + String requestApiKey = request.getHeader("api-key"); + + Optional apiKeyOpt = apiKeyRepository.findFirstByActiveTrueOrderById(); + response.addHeader("source", "fpt-software"); + if (apiKeyOpt.isPresent()) { + String storedApiKey = apiKeyOpt.get().getApiKey(); + + if (storedApiKey.equals(requestApiKey)) { + filterChain.doFilter(request, response); + } else { + response.setStatus(HttpStatus.FORBIDDEN.value()); + response.setContentType("application/json"); + response.getWriter().write("{\"error\": \"Invalid API Key\"}"); + } + } else { + response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value()); + response.setContentType("application/json"); + response.getWriter().write("{\"error\": \"API Key not configured or inactive\"}"); + } + } +} diff --git a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/controller/CustomerController.java b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/controller/CustomerController.java new file mode 100644 index 0000000..3ba54e7 --- /dev/null +++ b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/controller/CustomerController.java @@ -0,0 +1,154 @@ +package com.example.lecture_13.controller; + +import java.util.UUID; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.example.lecture_13.data.model.Status; +import com.example.lecture_13.dto.CustomerDTO; +import com.example.lecture_13.dto.CustomerSaveDTO; +import com.example.lecture_13.dto.CustomerShowDTO; +import com.example.lecture_13.service.CustomerService; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import jakarta.validation.Valid; + +@RestController +@RequestMapping("/api/v1/customers") +@Validated +public class CustomerController { + + @Autowired + private CustomerService customerService; + + /** + * Retrieves all customers from the database. + * + * @param page The index of the page to retrieve. Defaults to 0. + * @param size The number of customers to retrieve per page. Defaults to 20. + * @return A {@link ResponseEntity} containing a {@link Page} of {@link CustomerShowDTO} objects representing the customers on the specified page. + * @apiNote If no customers are found, a {@link ResponseEntity} with status status code 204 (No Content) is returned. + */ + @Operation(summary = "Retrieve all Active Customers.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Customers retrieved successfully"), + @ApiResponse(responseCode = "204", description = "Customers not found") + }) + @GetMapping + public ResponseEntity> getAllCustomer(@RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "20") int size) { + Pageable pageable = PageRequest.of(page, size); + Page customerPage = customerService.findAllActiveCustomer(pageable); + + if (customerPage.isEmpty()) { + return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); + } + + return ResponseEntity.status(HttpStatus.OK).body(customerPage); + } + + /** + * Creates a new Customer. + * + * @param customerSaveDTO The CustomerSaveDTO object containing the details of the new customer to be created. + * @return A ResponseEntity containing the newly created CustomerDTO object and an HTTP status code of 201 (Created) upon successful creation. + */ + @Operation(summary = "Create a new Customer.") + @ApiResponses(value = { + @ApiResponse(responseCode = "201", description = "Customer created successfully") + }) + @PostMapping + public ResponseEntity createCustomer(@Valid @RequestBody CustomerSaveDTO customerSaveDTO) { + CustomerDTO customer = customerService.createCustomer(customerSaveDTO); + return ResponseEntity.status(HttpStatus.CREATED).body(customer); + } + + /** + * Updates an existing Customer with the provided CustomerSaveDTO object. + * + * @param id The unique identifier of the customer to be updated. + * @param customerSaveDTO The CustomerSaveDTO object containing the details of the updated customer. + * @return A ResponseEntity containing the updated CustomerDTO object and an HTTP status code of 200 (OK) upon successful update. + * @apiNote If the Customer with the given ID is not found, a ResponseEntity with status code 204 (No Content) is returned. + */ + @Operation(summary = "Update existing Customer.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Customer updated successfully"), + @ApiResponse(responseCode = "204", description = "Customer not found") + }) + @PutMapping(value = "/{id}") + public ResponseEntity updateCustomer(@PathVariable("id") UUID id, @Valid @RequestBody CustomerSaveDTO customerSaveDTO) { + CustomerDTO customer = customerService.updateCustomer(id, customerSaveDTO); + return ResponseEntity.status(HttpStatus.OK).body(customer); + } + + /** + * Updates an existing Customer's status from Deactive to Active. + * + * @param id The unique identifier of the Customer to be updated. + * @return A ResponseEntity containing the updated CustomerDTO object and an HTTP status code of 200 (OK) upon successful update. + * @apiNote If the Customer with the given ID is not found, a ResponseEntity with status code 204 (No Content) is returned. + */ + @Operation(summary = "Update existing Customer status from Deactive to Active.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Customer successfully activated"), + @ApiResponse(responseCode = "204", description = "Customer not found") + }) + @PutMapping(value = "/active/{id}") + public ResponseEntity updateCustomerStatusActive(@PathVariable("id") UUID id) { + CustomerDTO customer = customerService.updateCustomerStatus(id, Status.Active); + return ResponseEntity.status(HttpStatus.OK).body(customer); + } + + /** + * Updates an existing Customer's status from Active to Deactive. + * + * @param id The unique identifier of the Customer to be updated. + * @return A ResponseEntity containing the updated CustomerDTO object and an HTTP status code of 200 (OK) upon successful update. + * @apiNote If the Customer with the given ID is not found, a ResponseEntity with status code 204 (No Content) is returned. + */ + @Operation(summary = "Update existing Customer status from Active to Deactive.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Customer successfully deactivated"), + @ApiResponse(responseCode = "204", description = "Customer not found") + }) + @PutMapping(value = "/deactive/{id}") + public ResponseEntity updateCustomerStatusDeactive(@PathVariable("id") UUID id) { + CustomerDTO customer = customerService.updateCustomerStatus(id, Status.Deactive); + return ResponseEntity.status(HttpStatus.OK).body(customer); + } + + /** + * Deletes an existing Customer. + * + * @param id The unique identifier of the Customer to be deleted. + * @return A ResponseEntity with status code 200 (OK) upon successful deletion. + * @apiNote If the Customer with the given ID is not found, a ResponseEntity with status code 204 (No Content) is returned. + */ + @Operation(summary = "Delete an existing Customer.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Customer deleted successfully"), + @ApiResponse(responseCode = "204", description = "Customer not found") + }) + @DeleteMapping(value = "/{id}") + public ResponseEntity deleteCustomer(@PathVariable("id") UUID id) { + customerService.deleteCustomer(id); + return ResponseEntity.status(HttpStatus.OK).build(); + } +} \ No newline at end of file diff --git a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/data/model/APIKey.java b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/data/model/APIKey.java new file mode 100644 index 0000000..8461e80 --- /dev/null +++ b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/data/model/APIKey.java @@ -0,0 +1,31 @@ +package com.example.lecture_13.data.model; + +import java.time.LocalDateTime; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "APIKey") +public class APIKey { + + @Id + @Column(name = "ID", columnDefinition = "BIGINT", updatable = false, nullable = false) + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + private String apiKey; + private String description; + private LocalDateTime createdAt; + private LocalDateTime updatedAt; + private boolean active; +} diff --git a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/data/model/Customer.java b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/data/model/Customer.java new file mode 100644 index 0000000..9068525 --- /dev/null +++ b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/data/model/Customer.java @@ -0,0 +1,51 @@ +package com.example.lecture_13.data.model; + +import java.util.Date; +import java.util.UUID; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Pattern; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "Customer") +public class Customer { + + @Id + @Column(name = "ID", columnDefinition = "BINARY(16)", updatable = false, nullable = false) + @GeneratedValue(strategy = GenerationType.UUID) + private UUID id; + + @NotBlank(message = "Name is mandatory") + @Pattern(regexp = "^[a-zA-Z\\s]+$", message = "Name can only contain letters and spaces") + @Column(name = "name", nullable = false) + private String name; + + @NotBlank(message = "Phone is mandatory") + @Pattern(regexp = "^\\+62[0-9]{9,13}$", message = "Phone number must start with +62 and contain 9 to 13 digits") + @Column(name = "phoneNumber", nullable = false) + private String phoneNumber; + + @Enumerated(EnumType.STRING) + @Column(name = "status", nullable = false) + private Status status = Status.Active; + + @Column(name = "createdAt", nullable = false) + private Date createdAt; + + @Column(name = "updatedAt", nullable = false) + private Date updatedAt; +} \ No newline at end of file diff --git a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/data/model/Status.java b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/data/model/Status.java new file mode 100644 index 0000000..0fe8cb5 --- /dev/null +++ b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/data/model/Status.java @@ -0,0 +1,6 @@ +package com.example.lecture_13.data.model; + +public enum Status { + Active, + Deactive +} diff --git a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/data/repository/APIKeyRepository.java b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/data/repository/APIKeyRepository.java new file mode 100644 index 0000000..e50c68b --- /dev/null +++ b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/data/repository/APIKeyRepository.java @@ -0,0 +1,18 @@ +package com.example.lecture_13.data.repository; + +import java.util.Optional; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import com.example.lecture_13.data.model.APIKey; + +@Repository +public interface APIKeyRepository extends JpaRepository { + + // Get the first API key, order by ID + Optional findFirstByOrderById(); + + // Find the first active API key + Optional findFirstByActiveTrueOrderById(); +} \ No newline at end of file diff --git a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/data/repository/CustomerRepository.java b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/data/repository/CustomerRepository.java new file mode 100644 index 0000000..54f6310 --- /dev/null +++ b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/data/repository/CustomerRepository.java @@ -0,0 +1,18 @@ +package com.example.lecture_13.data.repository; + +import java.util.UUID; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import com.example.lecture_13.data.model.Customer; +import com.example.lecture_13.data.model.Status; + +@Repository +public interface CustomerRepository extends JpaRepository { + + // Find customer data by considering the status. + Page findByStatus(Status status, Pageable pageable); +} diff --git a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/dto/CustomerDTO.java b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/dto/CustomerDTO.java new file mode 100644 index 0000000..a3081d5 --- /dev/null +++ b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/dto/CustomerDTO.java @@ -0,0 +1,19 @@ +package com.example.lecture_13.dto; + +import com.example.lecture_13.data.model.Status; + +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; + +import java.util.UUID; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class CustomerDTO { + private UUID Id; + private String name; + private String phoneNumber; + private Status status; +} diff --git a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/dto/CustomerSaveDTO.java b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/dto/CustomerSaveDTO.java new file mode 100644 index 0000000..276693f --- /dev/null +++ b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/dto/CustomerSaveDTO.java @@ -0,0 +1,27 @@ +package com.example.lecture_13.dto; + +import lombok.Data; +import lombok.NoArgsConstructor; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; +import lombok.AllArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class CustomerSaveDTO { + + @NotBlank(message = "Name is mandatory") + @NotNull(message = "Name can't be NULL") + @Pattern(regexp = "^[a-zA-Z\\s]+$", message = "Name can only contain letters and spaces") + @Schema(example = "Your Name") + private String name; + + @NotBlank(message = "Phone is mandatory") + @NotNull(message = "Phone can't be NULL") + @Pattern(regexp = "^\\+62[0-9]{9,13}$", message = "Phone number must start with +62 and contain 9 to 13 digits") + @Schema(example = "+62xxxxxxxxxxxxx") + private String phoneNumber; +} diff --git a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/dto/CustomerShowDTO.java b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/dto/CustomerShowDTO.java new file mode 100644 index 0000000..1f4cb67 --- /dev/null +++ b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/dto/CustomerShowDTO.java @@ -0,0 +1,16 @@ +package com.example.lecture_13.dto; + +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; + +import java.util.UUID; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class CustomerShowDTO { + private UUID Id; + private String name; + private String phoneNumber; +} diff --git a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/exception/BadRequestException.java b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/exception/BadRequestException.java new file mode 100644 index 0000000..645c68e --- /dev/null +++ b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/exception/BadRequestException.java @@ -0,0 +1,7 @@ +package com.example.lecture_13.exception; + +public class BadRequestException extends RuntimeException { + public BadRequestException(String message) { + super(message); + } +} diff --git a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/exception/DuplicateStatusException.java b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/exception/DuplicateStatusException.java new file mode 100644 index 0000000..5f3f806 --- /dev/null +++ b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/exception/DuplicateStatusException.java @@ -0,0 +1,7 @@ +package com.example.lecture_13.exception; + +public class DuplicateStatusException extends RuntimeException { + public DuplicateStatusException(String message) { + super(message); + } +} diff --git a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/exception/GlobalExceptionHandler.java b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..b1fc0b4 --- /dev/null +++ b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/exception/GlobalExceptionHandler.java @@ -0,0 +1,77 @@ +package com.example.lecture_13.exception; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.FieldError; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +@RestControllerAdvice +public class GlobalExceptionHandler { + + // Handle validation errors from @Valid annotated methods + @ExceptionHandler(MethodArgumentNotValidException.class) + public ResponseEntity>> handleValidationErrors(MethodArgumentNotValidException ex) { + List errors = ex.getBindingResult().getFieldErrors() + .stream().map(FieldError::getDefaultMessage).collect(Collectors.toList()); + return new ResponseEntity<>(getErrorsMap(errors), HttpStatus.BAD_REQUEST); + } + + private Map> getErrorsMap(List errors) { + Map> errorResponse = new HashMap<>(); + errorResponse.put("errors", errors); + return errorResponse; + } + + /** + * Handles generic exceptions by creating a response entity containing an error message. + * + * @param e the exception to handle + * @return a response entity containing a map with an error message + */ + @ExceptionHandler(Exception.class) + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + public ResponseEntity> handleException(Exception e) { + Map errorResponse = new HashMap<>(); + errorResponse.put("error", e.getMessage()); + return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR); + } + + // Custom exceptions + /** + * Handles {@link ResourceNotFoundException} by creating a response entity containing an error message. + * + * @param e the {@link ResourceNotFoundException} to handle + * @return a {@link ResponseEntity} containing a map with an error message + * @throws ResourceNotFoundException if the specified resource is not found + */ + @ExceptionHandler(ResourceNotFoundException.class) + @ResponseStatus(HttpStatus.NOT_FOUND) + public ResponseEntity> handleResourceNotFoundException(ResourceNotFoundException e) { + Map errorResponse = new HashMap<>(); + errorResponse.put("error", e.getMessage()); + return new ResponseEntity<>(errorResponse, HttpStatus.NOT_FOUND); + } + + /** + * Handles {@link BadRequestException} by creating a response entity containing an error message. + * + * @param e the {@link BadRequestException} to handle + * @return a {@link ResponseEntity} containing a map with an error message + */ + @ExceptionHandler(BadRequestException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public ResponseEntity> handleBadRequestException(BadRequestException e) { + Map errorResponse = new HashMap<>(); + errorResponse.put("error", e.getMessage()); + return new ResponseEntity<>(errorResponse, HttpStatus.BAD_REQUEST); + } +} + diff --git a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/exception/ResourceNotFoundException.java b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/exception/ResourceNotFoundException.java new file mode 100644 index 0000000..ad0e756 --- /dev/null +++ b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/exception/ResourceNotFoundException.java @@ -0,0 +1,7 @@ +package com.example.lecture_13.exception; + +public class ResourceNotFoundException extends RuntimeException { + public ResourceNotFoundException(String message) { + super(message); + } +} diff --git a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/mapper/CustomerMapper.java b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/mapper/CustomerMapper.java new file mode 100644 index 0000000..6ddfa82 --- /dev/null +++ b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/mapper/CustomerMapper.java @@ -0,0 +1,40 @@ +package com.example.lecture_13.mapper; + +import com.example.lecture_13.data.model.Customer; +import com.example.lecture_13.dto.CustomerDTO; +import com.example.lecture_13.dto.CustomerShowDTO; +import com.example.lecture_13.dto.CustomerSaveDTO; + +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; + +@Mapper(componentModel = "spring") +public interface CustomerMapper { + + CustomerMapper INSTANCE = Mappers.getMapper(CustomerMapper.class); + + // Customer - CustomerDTO + CustomerDTO toCustomerDTO(Customer customer); + + @Mapping(target = "createdAt", ignore = true) + @Mapping(target = "updatedAt", ignore = true) + Customer toCustomer(CustomerDTO customerDTO); + + // Customer - CustomerShowDTO + CustomerShowDTO toCustomerShowDTO(Customer customer); + + @Mapping(target = "status", ignore = true) + @Mapping(target = "createdAt", ignore = true) + @Mapping(target = "updatedAt", ignore = true) + Customer toCustomer(CustomerShowDTO customerShowDTO); + + // Customer - CustomerSaveDTO + CustomerSaveDTO toCustomerSaveDTO(Customer customer); + + @Mapping(target = "id", ignore = true) + @Mapping(target = "status", ignore = true) + @Mapping(target = "createdAt", ignore = true) + @Mapping(target = "updatedAt", ignore = true) + Customer toCustomer(CustomerSaveDTO customerSaveDTO); +} diff --git a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/service/CustomerService.java b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/service/CustomerService.java new file mode 100644 index 0000000..d57b77e --- /dev/null +++ b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/service/CustomerService.java @@ -0,0 +1,35 @@ +package com.example.lecture_13.service; + +import java.util.UUID; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + +import com.example.lecture_13.data.model.Customer; +import com.example.lecture_13.data.model.Status; +import com.example.lecture_13.dto.CustomerDTO; +import com.example.lecture_13.dto.CustomerSaveDTO; +import com.example.lecture_13.dto.CustomerShowDTO; + +import jakarta.validation.Valid; + +public interface CustomerService { + + // Retrieves a paginated list of all customers. + Page findAllActiveCustomer(Pageable pageable); + + // Creating a new customer. + CustomerDTO createCustomer(@Valid CustomerSaveDTO customerSaveDTO); + + // Updates an existing customer with the provided customer details. + CustomerDTO updateCustomer(UUID id, @Valid CustomerSaveDTO customerSaveDTO); + + // Updates the status of an existing customer. + CustomerDTO updateCustomerStatus(UUID id, Status status); + + // Find customer by its id. + Customer findById(UUID id); + + // Deletes a customer from the repository. + void deleteCustomer(UUID id); +} \ No newline at end of file diff --git a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/service/impl/CustomerServiceImpl.java b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/service/impl/CustomerServiceImpl.java new file mode 100644 index 0000000..a4ccaf7 --- /dev/null +++ b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/service/impl/CustomerServiceImpl.java @@ -0,0 +1,129 @@ +package com.example.lecture_13.service.impl; + +import java.util.Date; +import java.util.UUID; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import com.example.lecture_13.data.model.Customer; +import com.example.lecture_13.data.model.Status; +import com.example.lecture_13.data.repository.CustomerRepository; +import com.example.lecture_13.dto.CustomerDTO; +import com.example.lecture_13.dto.CustomerSaveDTO; +import com.example.lecture_13.dto.CustomerShowDTO; +import com.example.lecture_13.exception.DuplicateStatusException; +import com.example.lecture_13.exception.ResourceNotFoundException; +import com.example.lecture_13.mapper.CustomerMapper; +import com.example.lecture_13.service.CustomerService; + +import jakarta.validation.Valid; + +@Service +@Validated +public class CustomerServiceImpl implements CustomerService { + + @Autowired + private CustomerMapper customerMapper; + + @Autowired + private CustomerRepository customerRepository; + + /** + * Retrieves a paginated list of all active customers from the repository. + * + * @param pageable The pagination parameters, including the page number and size. + * @return A Page object containing a list of {@link CustomerShowDTO} objects representing the customers on the specified page. + */ + @Override + public Page findAllActiveCustomer(Pageable pageable) { + return customerRepository.findByStatus(Status.Active, pageable).map(customerMapper::toCustomerShowDTO); + } + + /** + * Retrieves a customer from the repository based on the provided unique identifier. + * + * @param customerId The unique identifier of the customer to be retrieved. + * @return A {@link Customer} object representing the customer with the given ID. + * @throws ResourceNotFoundException if no customer is found with the given ID. + */ + @Override + public Customer findById(UUID customerId) { + return customerRepository.findById(customerId).orElseThrow(() -> new ResourceNotFoundException("Customer not found")); + } + + /** + * Creates a new customer in the repository and returns the corresponding {@link CustomerDTO} object. + * + * @param customerSaveDTO The {@link CustomerSaveDTO} object containing the details of the new customer to be created. + * @return A {@link CustomerDTO} object representing the newly created customer. + */ + @Override + public CustomerDTO createCustomer(@Valid CustomerSaveDTO customerSaveDTO) { + Customer customer = customerMapper.toCustomer(customerSaveDTO); + customer.setCreatedAt(new Date()); + customer.setUpdatedAt(new Date()); + Customer savedCustomer = customerRepository.save(customer); + return customerMapper.toCustomerDTO(savedCustomer); + } + + /** + * Updates an existing customer in the repository with the provided details from the {@link CustomerSaveDTO} object. + * + * @param id The unique identifier of the customer to be updated. + * @param customerSaveDTO The {@link CustomerSaveDTO} object containing the details of the customer to be updated. + * @return A {@link CustomerDTO} object representing the updated customer. + * @throws ResourceNotFoundException if the customer with the given ID is not found. + */ + @Override + public CustomerDTO updateCustomer(UUID id, @Valid CustomerSaveDTO customerSaveDTO) { + Customer customer = customerRepository.findById(id) + .orElseThrow(() -> new ResourceNotFoundException("Customer not found")); + + customer.setName(customerSaveDTO.getName()); + customer.setPhoneNumber(customerSaveDTO.getPhoneNumber()); + customer.setUpdatedAt(new Date()); + Customer updatedCustomer = customerRepository.save(customer); + return customerMapper.toCustomerDTO(updatedCustomer); + } + + /** + * Updates the status of an existing customer in the repository. + * + * @param id The unique identifier of the customer whose status is to be updated. + * @param status The new status to be assigned to the customer. + * @return A {@link CustomerDTO} object representing the updated customer. + * @throws ResourceNotFoundException if the customer with the given ID is not found. + * @throws DuplicateStatusException if the customer already has the specified status. + */ + @Override + public CustomerDTO updateCustomerStatus(UUID id, Status status) { + Customer customer = customerRepository.findById(id) + .orElseThrow(() -> new ResourceNotFoundException("Customer not found")); + + if (customer.getStatus() == status) { + throw new DuplicateStatusException("Customer status is already " + status); + } + + customer.setStatus(status); + customer.setUpdatedAt(new Date()); + Customer updatedCustomer = customerRepository.save(customer); + return customerMapper.toCustomerDTO(updatedCustomer); + } + + /** + * Deletes a customer from the repository based on the provided unique identifier. + * + * @param id The unique identifier of the customer to be deleted. + * @throws ResourceNotFoundException if no customer is found with the given ID. + */ + @Override + public void deleteCustomer(UUID id) { + Customer customer = customerRepository.findById(id) + .orElseThrow(() -> new ResourceNotFoundException("Customer not found")); + customerRepository.delete(customer); + } +} \ No newline at end of file diff --git a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/resources/application.properties b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/resources/application.properties new file mode 100644 index 0000000..1aa55bc --- /dev/null +++ b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/resources/application.properties @@ -0,0 +1,31 @@ +spring.application.name=lecture_13 + +# Datasorce connection data +spring.config.import=file:env.properties +spring.datasource.url=${DB_DATABASE} +spring.datasource.username=${DB_USER} +spring.datasource.password=${DB_PASSWORD} +spring.datasource.driver-class-name=com.mysql.jdbc.Driver +spring.jpa.hibernate.ddl-auto=update + +# Enable SQL logging and show the statements and params + formatting +spring.jpa.show-sql=true +spring.jpa.properties.hibernate.format_sql=true +logging.level.org.hibernate.SQL=DEBUG +logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE + +# Swagger API documentation docs path +springdoc.api-docs.path=/api-docs + +# Enable the restart feature but exclude certain paths from triggering a restart +spring.devtools.restart.additional-paths=src/main/java +spring.devtools.restart.exclude=static/**,public/** + +# Enable the LiveReload feature +spring.devtools.livereload.enabled=true + +# Overriding bean +spring.main.allow-bean-definition-overriding=true + +# Port +server.port=${PORT} \ No newline at end of file diff --git a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/resources/data.sql b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/resources/data.sql new file mode 100644 index 0000000..3cfacc2 --- /dev/null +++ b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/resources/data.sql @@ -0,0 +1,55 @@ +-- Create the database +CREATE DATABASE week8_lecture13; + +-- Use the database +USE week8_lecture13; + +-- Initialize table with DDL +-- Create `Customer` table +CREATE TABLE Customer ( + ID BINARY(16) PRIMARY KEY, + name VARCHAR(255) NOT NULL, + phoneNumber VARCHAR(255), + status ENUM('Active', 'Deactivate') NOT NULL, + createdAt DATETIME, + updatedAt DATETIME +); + +-- Create `APIKey` table +CREATE TABLE APIKey ( + ID BIGINT AUTO_INCREMENT PRIMARY KEY, + api_key VARCHAR(255) NOT NULL, + description VARCHAR(255), -- Description or label for the API key + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- Timestamp of creation + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- Timestamp of last update + active BOOLEAN DEFAULT TRUE -- Status to enable or disable the API key +); + +-- Initialize data on table with DML +-- Insert 20 customers +INSERT INTO Customer (ID, name, phone_number, status, created_at, updated_at) VALUES +(UUID_TO_BIN(UUID()), 'Alice Smith', '1234567890', 'Active', NOW(), NOW()), +(UUID_TO_BIN(UUID()), 'Bob Johnson', '0987654321', 'Active', NOW(), NOW()), +(UUID_TO_BIN(UUID()), 'Charlie Brown', '1122334455', 'Active', NOW(), NOW()), +(UUID_TO_BIN(UUID()), 'David Wilson', '5566778899', 'Active', NOW(), NOW()), +(UUID_TO_BIN(UUID()), 'Eva Davis', '2233445566', 'Active', NOW(), NOW()), +(UUID_TO_BIN(UUID()), 'Frank Miller', '6677889900', 'Active', NOW(), NOW()), +(UUID_TO_BIN(UUID()), 'Grace Lee', '9988776655', 'Active', NOW(), NOW()), +(UUID_TO_BIN(UUID()), 'Hank Moore', '4455667788', 'Active', NOW(), NOW()), +(UUID_TO_BIN(UUID()), 'Ivy Taylor', '3344556677', 'Active', NOW(), NOW()), +(UUID_TO_BIN(UUID()), 'Jack Anderson', '7788990011', 'Active', NOW(), NOW()), +(UUID_TO_BIN(UUID()), 'Kara Thomas', '9988771122', 'Active', NOW(), NOW()), +(UUID_TO_BIN(UUID()), 'Leo Harris', '4455662233', 'Active', NOW(), NOW()), +(UUID_TO_BIN(UUID()), 'Mona Clark', '5566773344', 'Active', NOW(), NOW()), +(UUID_TO_BIN(UUID()), 'Nate Lewis', '3344558899', 'Active', NOW(), NOW()), +(UUID_TO_BIN(UUID()), 'Olivia Hall', '1122336677', 'Active', NOW(), NOW()), +(UUID_TO_BIN(UUID()), 'Paul Young', '8899001122', 'Active', NOW(), NOW()), +(UUID_TO_BIN(UUID()), 'Quinn Walker', '2233447788', 'Active', NOW(), NOW()), +(UUID_TO_BIN(UUID()), 'Rachel Allen', '6677883344', 'Active', NOW(), NOW()), +(UUID_TO_BIN(UUID()), 'Sam King', '9988773344', 'Active', NOW(), NOW()), +(UUID_TO_BIN(UUID()), 'Tina Scott', '5566778899', 'Active', NOW(), NOW()); + +-- Prepare API Keys +INSERT INTO APIKey (api_key, description, created_at, updated_at, active) VALUES +('12345-ABCDE', 'Primary API Key for System Access', NOW(), NOW(), TRUE), +('67890-FGHIJ', 'Secondary API Key for Testing', NOW(), NOW(), FALSE); \ No newline at end of file diff --git a/Week 08/Lecture 13/Assignment 03/lecture_13/src/test/java/com/example/lecture_13/Lecture13ApplicationTests.java b/Week 08/Lecture 13/Assignment 03/lecture_13/src/test/java/com/example/lecture_13/Lecture13ApplicationTests.java new file mode 100644 index 0000000..14fdbea --- /dev/null +++ b/Week 08/Lecture 13/Assignment 03/lecture_13/src/test/java/com/example/lecture_13/Lecture13ApplicationTests.java @@ -0,0 +1,13 @@ +package com.example.lecture_13; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class Lecture13ApplicationTests { + + @Test + void contextLoads() { + } + +} From 76e55be075363483e21afa4b1b6520fec4b98406 Mon Sep 17 00:00:00 2001 From: mikeleo03 Date: Tue, 30 Jul 2024 09:51:48 +0700 Subject: [PATCH 09/23] [Feat] Assignment 03 done (need to add detail) --- .../Assignment 03/lecture_13/pom.xml | 4 + .../lecture_13/config/FilterConfig.java | 2 +- .../lecture_13/config/InterceptorConfig.java | 24 ++++++ .../config/filter/APIKeyFilter.java | 8 ++ .../config/interceptor/APIKeyInterceptor.java | 74 +++++++++++++++++++ .../controller/CustomerController.java | 20 +++++ .../example/lecture_13/data/model/APIKey.java | 2 + .../data/repository/APIKeyRepository.java | 4 +- 8 files changed, 136 insertions(+), 2 deletions(-) create mode 100644 Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/config/InterceptorConfig.java create mode 100644 Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/config/interceptor/APIKeyInterceptor.java diff --git a/Week 08/Lecture 13/Assignment 03/lecture_13/pom.xml b/Week 08/Lecture 13/Assignment 03/lecture_13/pom.xml index 7db908d..decd417 100644 --- a/Week 08/Lecture 13/Assignment 03/lecture_13/pom.xml +++ b/Week 08/Lecture 13/Assignment 03/lecture_13/pom.xml @@ -48,6 +48,10 @@ org.springframework.boot spring-boot-devtools + + org.springframework + spring-webmvc + diff --git a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/config/FilterConfig.java b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/config/FilterConfig.java index 83dc148..9c2fed8 100644 --- a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/config/FilterConfig.java +++ b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/config/FilterConfig.java @@ -13,7 +13,7 @@ public class FilterConfig { public FilterRegistrationBean apiKeyFilter(APIKeyFilter apiKeyFilter) { FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); registrationBean.setFilter(apiKeyFilter); - registrationBean.addUrlPatterns("/api/v1/*"); // All Customer API + registrationBean.addUrlPatterns("/api/*"); // All Customer API return registrationBean; } } \ No newline at end of file diff --git a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/config/InterceptorConfig.java b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/config/InterceptorConfig.java new file mode 100644 index 0000000..7f5fbfd --- /dev/null +++ b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/config/InterceptorConfig.java @@ -0,0 +1,24 @@ +package com.example.lecture_13.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import com.example.lecture_13.config.interceptor.APIKeyInterceptor; + +@Configuration +public class InterceptorConfig implements WebMvcConfigurer { + // Register an interceptor with the registry + private final APIKeyInterceptor apiKeyInterceptor; + + @Autowired + public InterceptorConfig(APIKeyInterceptor apiKeyInterceptor) { + this.apiKeyInterceptor = apiKeyInterceptor; + } + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(apiKeyInterceptor); + } +} diff --git a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/config/filter/APIKeyFilter.java b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/config/filter/APIKeyFilter.java index 2535b63..f6d7bfa 100644 --- a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/config/filter/APIKeyFilter.java +++ b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/config/filter/APIKeyFilter.java @@ -3,6 +3,8 @@ import java.io.IOException; import java.util.Optional; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; @@ -22,9 +24,13 @@ public class APIKeyFilter extends OncePerRequestFilter { @Autowired private APIKeyRepository apiKeyRepository; + private final static Logger logger = LoggerFactory.getLogger(APIKeyFilter.class); + @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { + + logger.info("[Filter][" + request + "]" + "[" + request.getMethod()+ "]" + request.getRequestURI()); String requestApiKey = request.getHeader("api-key"); Optional apiKeyOpt = apiKeyRepository.findFirstByActiveTrueOrderById(); @@ -44,5 +50,7 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response.setContentType("application/json"); response.getWriter().write("{\"error\": \"API Key not configured or inactive\"}"); } + + logger.info("[Filter] Logging Response : {}", response.getStatus()); } } diff --git a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/config/interceptor/APIKeyInterceptor.java b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/config/interceptor/APIKeyInterceptor.java new file mode 100644 index 0000000..b5b4be3 --- /dev/null +++ b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/config/interceptor/APIKeyInterceptor.java @@ -0,0 +1,74 @@ +package com.example.lecture_13.config.interceptor; + +import java.time.LocalDateTime; +import java.util.Optional; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import com.example.lecture_13.data.model.APIKey; +import com.example.lecture_13.data.repository.APIKeyRepository; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +@Component +public class APIKeyInterceptor implements HandlerInterceptor { + + private final APIKeyRepository apiKeyRepository; + private final static Logger logger = LoggerFactory.getLogger(APIKeyInterceptor.class); + + @Autowired + public APIKeyInterceptor(APIKeyRepository apiKeyRepository) { + this.apiKeyRepository = apiKeyRepository; + logger.info("APIKeyRepository injected: {}", (this.apiKeyRepository != null)); + } + + // Request is intercepted by this method before reaching the Controller + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + // Pre-processing logic here + // Apply timestamp + response.addHeader("timestamp", LocalDateTime.now().toString()); + logger.info("[PreHandle] Timestamp applied."); + logger.info("[PreHandle][" + request + "]" + "[" + request.getMethod()+ "]" + request.getRequestURI()); + return true; // Continue with the request + } + + // Response is intercepted by this method before reaching the client + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { + // Post-handle logic here + logger.info("[PostHandle][" + request + "]" + "[" + request.getMethod()+ "]" + request.getRequestURI()); + } + + // This method is called after request & response HTTP communication is done. + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + logger.info("[AfterCompletion][" + request + "]" + "[" + request.getMethod()+ "]" + request.getRequestURI()); + + String username = request.getHeader("api-key-username"); + if (username != null) { + response.addHeader("username", username); + logger.info("[AfterCompletion] Username detected : {}", username); + } + + // Update lastUsedAt in the database + String requestApiKey = request.getHeader("api-key"); + logger.info("[AfterCompletion] API Key : {}", requestApiKey); + Optional apiKeyOpt = apiKeyRepository.findFirstByApiKeyAndActiveTrue(requestApiKey); + if (apiKeyOpt.isPresent()) { + APIKey apiKey = apiKeyOpt.get(); + apiKey.setUsername(username); + apiKey.setLastUsedAt(LocalDateTime.now()); + apiKeyRepository.save(apiKey); + logger.info("[AfterCompletion] API Key data updated : {}", apiKey); + } + + logger.info("[AfterCompletion] Execution done."); + } +} diff --git a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/controller/CustomerController.java b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/controller/CustomerController.java index 3ba54e7..8f81c9d 100644 --- a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/controller/CustomerController.java +++ b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/controller/CustomerController.java @@ -1,5 +1,6 @@ package com.example.lecture_13.controller; +import java.util.Optional; import java.util.UUID; import org.springframework.beans.factory.annotation.Autowired; @@ -15,11 +16,14 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import com.example.lecture_13.data.model.APIKey; import com.example.lecture_13.data.model.Status; +import com.example.lecture_13.data.repository.APIKeyRepository; import com.example.lecture_13.dto.CustomerDTO; import com.example.lecture_13.dto.CustomerSaveDTO; import com.example.lecture_13.dto.CustomerShowDTO; @@ -38,6 +42,9 @@ public class CustomerController { @Autowired private CustomerService customerService; + @Autowired + private APIKeyRepository apiKeyRepository; + /** * Retrieves all customers from the database. * @@ -151,4 +158,17 @@ public ResponseEntity deleteCustomer(@PathVariable("id") UUID id) { customerService.deleteCustomer(id); return ResponseEntity.status(HttpStatus.OK).build(); } + + @Operation(summary = "Get the username of current API User.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Username retrieved successfully"), + }) + @GetMapping("/username") + public String printUsername(@RequestHeader("api-key") String apiKey) { + Optional apiKeyOpt = apiKeyRepository.findFirstByActiveTrueOrderById(); + if (apiKeyOpt.isPresent() && apiKeyOpt.get().getApiKey().equals(apiKey)) { + return "Username: " + apiKeyOpt.get().getUsername(); + } + return "Invalid API Key"; + } } \ No newline at end of file diff --git a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/data/model/APIKey.java b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/data/model/APIKey.java index 8461e80..2c5b664 100644 --- a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/data/model/APIKey.java +++ b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/data/model/APIKey.java @@ -24,8 +24,10 @@ public class APIKey { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String apiKey; + private String username; // Added username field private String description; private LocalDateTime createdAt; private LocalDateTime updatedAt; private boolean active; + private LocalDateTime lastUsedAt; // Added last used field } diff --git a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/data/repository/APIKeyRepository.java b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/data/repository/APIKeyRepository.java index e50c68b..429e232 100644 --- a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/data/repository/APIKeyRepository.java +++ b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/data/repository/APIKeyRepository.java @@ -14,5 +14,7 @@ public interface APIKeyRepository extends JpaRepository { Optional findFirstByOrderById(); // Find the first active API key - Optional findFirstByActiveTrueOrderById(); + Optional findFirstByActiveTrueOrderById(); + + Optional findFirstByApiKeyAndActiveTrue(String apiKey); } \ No newline at end of file From 75561e2693947d8965f5da51ad45be3713d429b1 Mon Sep 17 00:00:00 2001 From: mikeleo03 Date: Tue, 30 Jul 2024 10:27:36 +0700 Subject: [PATCH 10/23] [Feat] Add some code documentation --- .../com/example/lecture_13/config/filter/APIKeyFilter.java | 4 +++- .../lecture_13/config/interceptor/APIKeyInterceptor.java | 6 +++--- .../example/lecture_13/controller/CustomerController.java | 6 ++++++ 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/config/filter/APIKeyFilter.java b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/config/filter/APIKeyFilter.java index f6d7bfa..f133e22 100644 --- a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/config/filter/APIKeyFilter.java +++ b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/config/filter/APIKeyFilter.java @@ -30,7 +30,7 @@ public class APIKeyFilter extends OncePerRequestFilter { protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { - logger.info("[Filter][" + request + "]" + "[" + request.getMethod()+ "]" + request.getRequestURI()); + logger.info("[Filter][" + request + "]" + "[" + request.getMethod()+ "] " + request.getRequestURI()); String requestApiKey = request.getHeader("api-key"); Optional apiKeyOpt = apiKeyRepository.findFirstByActiveTrueOrderById(); @@ -39,7 +39,9 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse String storedApiKey = apiKeyOpt.get().getApiKey(); if (storedApiKey.equals(requestApiKey)) { + logger.info("[Filter] doFilter starts."); filterChain.doFilter(request, response); + logger.info("[Filter] doFilter done."); } else { response.setStatus(HttpStatus.FORBIDDEN.value()); response.setContentType("application/json"); diff --git a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/config/interceptor/APIKeyInterceptor.java b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/config/interceptor/APIKeyInterceptor.java index b5b4be3..51d90f0 100644 --- a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/config/interceptor/APIKeyInterceptor.java +++ b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/config/interceptor/APIKeyInterceptor.java @@ -35,7 +35,7 @@ public boolean preHandle(HttpServletRequest request, HttpServletResponse respons // Apply timestamp response.addHeader("timestamp", LocalDateTime.now().toString()); logger.info("[PreHandle] Timestamp applied."); - logger.info("[PreHandle][" + request + "]" + "[" + request.getMethod()+ "]" + request.getRequestURI()); + logger.info("[PreHandle][" + request + "]" + "[" + request.getMethod()+ "] " + request.getRequestURI()); return true; // Continue with the request } @@ -43,13 +43,13 @@ public boolean preHandle(HttpServletRequest request, HttpServletResponse respons @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // Post-handle logic here - logger.info("[PostHandle][" + request + "]" + "[" + request.getMethod()+ "]" + request.getRequestURI()); + logger.info("[PostHandle][" + request + "]" + "[" + request.getMethod()+ "] " + request.getRequestURI()); } // This method is called after request & response HTTP communication is done. @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { - logger.info("[AfterCompletion][" + request + "]" + "[" + request.getMethod()+ "]" + request.getRequestURI()); + logger.info("[AfterCompletion][" + request + "]" + "[" + request.getMethod()+ "] " + request.getRequestURI()); String username = request.getHeader("api-key-username"); if (username != null) { diff --git a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/controller/CustomerController.java b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/controller/CustomerController.java index 8f81c9d..73c563d 100644 --- a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/controller/CustomerController.java +++ b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/controller/CustomerController.java @@ -159,6 +159,12 @@ public ResponseEntity deleteCustomer(@PathVariable("id") UUID id) { return ResponseEntity.status(HttpStatus.OK).build(); } + /** + * Retrieves the username of the current API User. + * + * @param apiKey The API key provided in the request header. + * @return The username of the current API User if the provided API key is valid, otherwise returns "Invalid API Key". + */ @Operation(summary = "Get the username of current API User.") @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "Username retrieved successfully"), From 07ac8a37d972a121bab751750be56a85ea4df502 Mon Sep 17 00:00:00 2001 From: mikeleo03 Date: Tue, 30 Jul 2024 11:07:33 +0700 Subject: [PATCH 11/23] [Feat] Update some commentaries and SQL data --- .../lecture_13/config/interceptor/APIKeyInterceptor.java | 6 ++++-- .../lecture_13/data/repository/APIKeyRepository.java | 1 + .../Assignment 03/lecture_13/src/main/resources/data.sql | 4 +++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/config/interceptor/APIKeyInterceptor.java b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/config/interceptor/APIKeyInterceptor.java index 51d90f0..61bab43 100644 --- a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/config/interceptor/APIKeyInterceptor.java +++ b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/config/interceptor/APIKeyInterceptor.java @@ -32,10 +32,11 @@ public APIKeyInterceptor(APIKeyRepository apiKeyRepository) { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // Pre-processing logic here + logger.info("[PreHandle][" + request + "]" + "[" + request.getMethod()+ "] " + request.getRequestURI()); // Apply timestamp response.addHeader("timestamp", LocalDateTime.now().toString()); logger.info("[PreHandle] Timestamp applied."); - logger.info("[PreHandle][" + request + "]" + "[" + request.getMethod()+ "] " + request.getRequestURI()); + logger.info("[PreHandle] preHandle done."); return true; // Continue with the request } @@ -44,6 +45,7 @@ public boolean preHandle(HttpServletRequest request, HttpServletResponse respons public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // Post-handle logic here logger.info("[PostHandle][" + request + "]" + "[" + request.getMethod()+ "] " + request.getRequestURI()); + logger.info("[PostHandle] postHandle done."); } // This method is called after request & response HTTP communication is done. @@ -69,6 +71,6 @@ public void afterCompletion(HttpServletRequest request, HttpServletResponse resp logger.info("[AfterCompletion] API Key data updated : {}", apiKey); } - logger.info("[AfterCompletion] Execution done."); + logger.info("[AfterCompletion] afterCompletion done."); } } diff --git a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/data/repository/APIKeyRepository.java b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/data/repository/APIKeyRepository.java index 429e232..11b1163 100644 --- a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/data/repository/APIKeyRepository.java +++ b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/java/com/example/lecture_13/data/repository/APIKeyRepository.java @@ -16,5 +16,6 @@ public interface APIKeyRepository extends JpaRepository { // Find the first active API key Optional findFirstByActiveTrueOrderById(); + // Find the first active API key with a specific API key Optional findFirstByApiKeyAndActiveTrue(String apiKey); } \ No newline at end of file diff --git a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/resources/data.sql b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/resources/data.sql index 3cfacc2..0338776 100644 --- a/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/resources/data.sql +++ b/Week 08/Lecture 13/Assignment 03/lecture_13/src/main/resources/data.sql @@ -22,7 +22,9 @@ CREATE TABLE APIKey ( description VARCHAR(255), -- Description or label for the API key created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- Timestamp of creation updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- Timestamp of last update - active BOOLEAN DEFAULT TRUE -- Status to enable or disable the API key + active BOOLEAN DEFAULT TRUE, -- Status to enable or disable the API key + last_used_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- Last time the API key was used + username VARCHAR(255) -- Username associated with the API key ); -- Initialize data on table with DML From ea8f8db29f5fc220dc44d88b2f0b1e1b1c59b821 Mon Sep 17 00:00:00 2001 From: mikeleo03 Date: Tue, 30 Jul 2024 11:07:46 +0700 Subject: [PATCH 12/23] [Feat] Update documentation --- .../Lecture 13/Assignment 03/img/demo1.png | Bin 92938 -> 105704 bytes .../Lecture 13/Assignment 03/img/demo2.png | Bin 114024 -> 21437 bytes .../Lecture 13/Assignment 03/img/demo3.png | Bin 108234 -> 87879 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Week 08/Lecture 13/Assignment 03/img/demo1.png b/Week 08/Lecture 13/Assignment 03/img/demo1.png index 087f503efdeaf9a88eb403a0a41c2f1b921e34a7..678a5f3e418061c5bbfefb3966c259c8be536803 100644 GIT binary patch literal 105704 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 wC_jp0L`W4l6Tj)LtJkxQM0raolG)H!J^kdY zj{c&&*Xf#-m@u9P@|~BPKc+Q*$%tpJ8AT2_nNL|kOAI4{1yMkBv++;l7t~WplCsuSWI>h$}9w@T0n4xd$7uEjQ|7iwk_tNoIvLbmd#`fmO#_Ki==ogd9evhL zW$0MrLl-4#HoV1G2W0!(VyqLhpWPY)*TG` z(oZTRXU@!=v+#v*_7r{T&$+?)RiLm+5qp&;D=P>7Sj?9c2QRt?t;~R-e zAy2Z9p#p+79eNB^xsaTV%{*|sn##NdCXWA`~A^&8=G6* zKFE+N4s05WB0--ZPeii+EXno0bA9@KHtqB+H>oDw_`30;jq?VG@LD*)!6#`8{f_rl z6b9qb@8B%1!GbaJaG>gpF))(e*oLlLc|(@ci6Yq|PC8y`+j2EbOtjS>+qEBv$Q`pW?n7OFCwF0eLi>;Mt%Q^@L z5~}6KR0|e&%Hlsg{Vo@P%KR0=W|!pi1Neu=(SW{Egc8X!n^|wxP3SwZ62fHoNJVC* zNqbQyuC-SDz5354m(@yE+pRpx;1^*@(QgZF<4CY;i3Ekdwp-J)h`CBrQKRYYyQ)*- z)-zN3I3+_V4GLc%IvRHd2mB1@1Nxutp#d!1+TC@!kf4M9tavPHWxMEhGFQ@s<(aZr zpB8nuuFaT5#ktmdvQEPm68pEexR=?HkX^?qSN<(Gnv9oQ?LKP#!JC=!C=~{U7gVVy zYA9a>OOlp0eRSFFOxGkP;yvJz)VWS&ZLn7(bU{U2kAwAK>I7BXEk8~5s&*zCPrE4% zl)8c7Ikx;L&QFX~Y?y5i_Zt=@=NQN@SedFbB+z*?U*IedS@FIyxr!WD;qX+iPRoUt z{03b&=d_6Xt&2A_e(8s006je0On>JA1Q%C)9m}gU1A#|edfFA z2OxoChmNpjj^CGirZWB6{*EvY(X&}ifLN5sW-wtUa`?Q zQx=A=P9Ee%HS(ixy!7@z%DF%YVJ0z-4GB{2Y+a&Aq$o3WOR9yo$NxM<<4(ctzOp=_ z$iWdKiY<@^S|&bqUktLeP3n5Hboa%5-1dUL{TglCa;52_T||HTdge0e_d7>vlksVv3hE~=I5$}?7=mG z;kXCV-SXXon>ix4UPkNz9{q;=Ft%1u3pp39kCP;r1|p+U|_3_P>)& zf0w2>JQ7-cCrOWLI0e?(@6bR48<;B)_5se$C>6x~>DG)!CAMd@`1!1jqWC%CL@OHN z7i|d&B-Xy4-66m(JHatBJ$AlW=5h*v;l7hgc&b4&IF0MpZpi>9{A_ITt2pTrbC~6; zq=_f-e*haLe=fzOKO&>hkO=7YYBl|5aNEC5T>Jl^aQ|1yr~Q6cKHPItW_Epi=7mK; z@qb7=HRsA{`&WqT|Gi`P{!fMv|NCU%Az}zaZfZREBEhE0GA9BW*6i8;;!KhH?sQFp zV-04V>VG^~=eMPu2M+^ob?NbDpY@e6%l;qoJ1s!lmT=Ms5-;AJZ(Y6w=Q|*$hxGXayQ`H0&SU%m(TjMo V{o^d%ACAC(dglza-f7qc{WmJ_uUP;9 literal 92938 zcmce-WpG?evn487%*-rV%*>1ySj^0_n3=J~lEuu-%*@PWF*7rde7JJAD*{jbk}bc6p-#~cF}SIdT+Dl;>af|gdf z=-+FOtoKe&%ic_3eF0}Rpu|Z3Wt;;*|JNMW(MTNjc}8M$7>$!uS#{c(@BSI>dQz@59mvc`~5Bt1b2oEo>yoN^UPo$ZS;iaXdN8nr! z+)I$J5MB76+mo#KnY$bgC(SlHc_%ZtL;OG>ay=d|PN-#E_D9i-jE!?@YZWqtMPx`p z0H=!;ibd&$U&F@k?*>M?<`WPRaeQoB02V<&KzO@J>gxA;Tn};CaDzZYLrdm%xsU-v zl9H6HHX1<&M+!|11r{MTXN1K?oXKcK7?uvI_k6bB=l`0fb*?5ZUyA#a1(+$m*K#Jh z06^_`0|ziLF#XANPKh5sdUAwA=37MOQ6u39YvDxxO`ld;XlUrG9tZ-8UHXo@-wN0@ zEjPEf37_k&PKqBWGZlS6#OiiIE}x9a9JJsLnNfrBAwtt*tIA&I&UT_z)1k>v(*jQ= z4wiS2J^kXsh{Zn_Q^;DE;G)FddW|L2+n|mq$EuGK%#Ie4{?yw!#5Qw4{aEblbsbMP z_f?S*`a8oFS(cC0#l^(~{(uP#K#VxKLHdUNq#_cB^q$NRc%Np5HMJH2K;&$!2H?5n ze0X?lJqSdc;)EZdev88Rc`Oka2`yIDNrcJHi9I#>NvrcVBG6nml1hA)gE{_u+*}Cu z=-G?(?26e-Ca$0RGs9Gd9bA9g5V8E9NKJn+I*hR4>a;=D$cl9%mIqlYf#x343b{X! zeIHo+V9-3Pm07N*QORii(X*Y*#tSXK*cVqLq4nF}3ZjYVIp`qhM;?0RVBx$dK%wYw z5gsl6E&ww|A*EGEu5t5cB;$cq%*_%~Gj&SL*qR}>d6|}bDx0$s6_7*x_WlhC6*YUZ zrHO?aT@cOys3yT|sSVQK-)n2Gidu`8tGFt;<=M5nZ?kBUaC5F_Xl~mgQLwW~ zr?Lm&O@`c)N_?iKoXvdVPXJ9b+f7<|#HvcyUe0YPZ|svOrwyq8H~My8Lw6GHZ1iX7z2>OF8W4H3RX?A_Ru5vZ`=U2f zrvrdgHidqvaXziVDWBs)eprO2NiGedWQT(>93(O827+z&;W0qB3Y5&n<>8mm43-jb(B#S-3{_Vr-=sgvsqU?twK(d9R-{flsYdZX}sS+(W)$cA^<=I433BILQRtAzaJ z^Ub1e!MoJmRezOUU+_)&-VQT z+p!BUG$#8F>YfERTwl+5~>*GHX>|NY` zMH_`tLLd4l&VwA56Ff5Az#nR8On0=|hbA7iKqqPe7-XK}4InSXp1#yz>}+tK$kC79 zO+v7+JDzS+Yf#T1Z#;R*gi~wyKo*nnKn<=TD)#0_+bpe;Y&eAq=)5IO=W$gyL;GR* z=?H=k2`6rL$b`$O3DuQ7+58r;?<9CuwCrXF2u;s9X_u{sf%bko% zKMcYlz8QT%a-}c=`sP(8Z(oV3TER4O;q3=`RV?IIU?I~A6pfrtUCDAdr`>@xeb47; z=>nEizDd#YN;JI*QQRI_cFvs}*95+_-z;6&UWM`}{PyrdSXA&Xa_{53+&CF4n;V^zP+)1g)8s*7vJ6?o(axps`JLR>{Zt>6mk}I)-BbSM z{g)PPSx1UaRcmnRjiecui&EkG09;>@E>LAUo#-=^gUX}%F`5>Sqa;=pHRR0gA>rPR z$@e$Xz6Ub>oHT&?u1Aj95_I`gEb|+~Tam-nGT}3h3~OmsTW>>0Geva%Za}n4D2@eY z=KH(I-R~c?qmPCIxk|}t%}%*PhOW;o+s(CBNQvlT+xJ=EdA3&HR6O%K=^}m5yRtwn zz3)McI8qBWcQVg|INcd)bupo{V8mk{Dmb|gP=_)g>`VP9G##hJ>;+RxqLr5-EjcuQEu)B(D`(rx^2|3Vc9X7F9@Ww&Tf&91K?C z)4zsv5~92$@2rQmQ%K6u6}4cDUb6a2HZ3N~s?KrP-3G{{o#Zf($j%Dc1Rh<}PR7!( zVOgxEqmUU(?QL#F&D#KpZC|{vupqEjng$m;V1L@+LOhGm+g}A&_&Rfp%#3FsdEL8t zsT#xNtMU>_K|rJVKbmhyR!pnd=Xtg>*5%|0@Qc+RGUjir2hRuedQJZu9ta*CB^ogd`Y@7%Ejx&{RbHCbzY@vnU zS5DNu@u?li>UJ_Fv`p_49hy;oTN`!Tn?TOC8?Xn9$~i8V)?!|?wepD@B7l`wfexju zJ%AHleVQc|`_b_nIr>sfz`b^lN#04PnHc@MLoKBqyk)`9^=w}awyPB+{G%OzaeI=H zUsl8@>sx+T&9}A}5yOwEfEao{+0r*2uG_m~FH%VCMVMOS{u{5aEzybZO~{bJ^hMw) z^j?h(CIM{uZ5!GsU70^7^>U+Y4)3J~_$DuHPMf}GBmR52eB&mrCM4Bz_>OlU(sycQ zDkq(>nopZw#hJ(f+bRP*)VE6{zXqaGr?zalM;&56wk6M62^G~6yI_i5qXetlmOsx2 zK9H)0-@EquV2f%1ssq<;a~iw%);&7OtAI(Oot^vH?6)Iz+*e18N$-sC-ii=Ctt8r; zcI7LmlQ8(s%!B?Vo9s7N#xSN^^I!*$sGPgu7_(0uPR>o^o# zolACCa-*ve2|Hp|@c3ac9yfD4!N-yQ73NNdODImiT{76bznjJ%VBf6yPK%<cS^i>w|jDWR(v3w{hHZKRd&3#FrSW9E6aumqtDF zw6Ig-NwoNrL*HvYf>MkRx^vdhNnI(%bpj8`&Gi2?;o5BrVltTdE+hP6aGoc5Q5_}! z{?+2Q{$gSvgpktf!IEO=`Tb!{TE<+Z)q;%2?W|PF?BV7{$xk@Cm5rOv=k-GIsj0$h z&#xKqZoGl{;mYEFI^wHw(;LLCI)4!K=>)0VL2mG{+cSAvSxMx&b8H9M-bzpsj(lbA zkGUbyvoV&zco3?NY4|Q?1$kG*U!nbh0apBg6BQagT&V?JbNY&$ZNV_O@}|KL{=!#T z%u@@|mTq#^fyC2|)~3>)18QS@g_u#abvy*o`+5dn?z*e|{X1ZL%EI=@oL>6v+0gkl z7efdoToIct;o4Q{m-YLaE?1TSnE-|Ocn_{giaSY>CobHsnrhEfI|Ag?l zbXQHp!j@g@5|(g7ur{MF%Fnym`yQJPmnRg5-5e%B1vPzW+gQ`qNEEy>k*)K|IS$NK zxG_e}ZQ!K|Mi5>80^f}JiLziNfWgiTh^kArFN_{qzT|tQ*vw?Ya=I>Dm*B2Q*a0TM zwu7Mb_R%oJzHe*@-pD_zM=2<%d*rhQ;Xr$iRY~0)QPkC&ubPlGpE|KAPC_S)lKQ}HhsDI7>=$$_=7gQh zy$W=`k6WIK6EY8S;5K*%%JVpdTk~5^I*s;_Mtr;;v;VDV!9zBm=wg*eATP)}(Jj%? z;d-2dRvJP@|EDL_c-Ifi*oPMf3EuB2jP|J#Gt%T#IZE|*vBuy7ATLXCh*-=x{Ao>+ z+6XbX8{m8Kq4#%Qav8fK_7SdCPZ81dB7dN6X$;+QnWDp^mlY8l0KYZDXw(@@Cvl4c zXq*Tk#H-X1zRrPGu?2y#b=m$-3^_RpQdSuSE+(&pxisp_ce6nV?@g-W=kKa%_^HpAgg=^8hA z#?I#PJzuP1TYP7OI-aOx2eH3WpLxs_dF+{uVE;-u`wvcOEnY&4gk~pJ5bM~cUxMyI zUTYoxZh0A8#(F@Pm2wh&()|iujiZa%D?2^19e2b1X$EjVcX5W4hjFvrJ9sJexRvy9 z_Kp|H3vqY0BKQhjZed&tXs-0CVJ{(U@}t?r^dWg)!ji_?ky$?0NTE44B6*uGjyDS*))X4wWV6K0faqOWlzziu-esy^qx&wbR z%}-aw66D*P#u5Ees%VfewS(guRvFYkwrDpj;N=yhe&dC5;?UrBnD8PZAvGvZ`a?e| zT*=j5WUO!j%#PLeRhl4F-@T|5>PEMD&lq_gd;=u1Q!(hqSIiZi)VShFK*GEsZ50F* zHc5bLYXqX@PI>Av!IN)Wy+2f1j&>BQ;Xq0`_a08z63&Gxm(jf6L&`{RwHOWb=$jJ> z1P=s_gHiS=IE_cFq&AKSC>DLFAT%wofmQK%ia}AW8m0CKetH!}m6k3@DlB@Gy=e)` zWOgPdE4ma)u1Adt95SrFqiif_w@=`B^UmiBxosn@zT2of;yiOLCsw(DBVMw!#jQ<@ z;eC+266r-u@l&)te2>@8kM*` zxmGnR7tbSydkY#e4C-+owE;W~j0;}MgysTaq5RvL&+pvtnq1%SmnQno5DO?Aw?K9+ z!$eTlojZm|KFd-@WB5!NJZ;eiRv(EgtC3jA7Q5*%X{aWn>HN!{h$A|CJHO z4}w7+w611E7I?!CNas?-qlCGh8(EwVVlr+Pdp-}0&e~UE!@IJC{d~d22SH_3+<-vs zN}&W;M%f65+2rBI)dmHoMIjoR` zrBr&1AY#R{3LJgS`{r8Epdy%roZ>nHu5eAshVm%4c8Smj4C_yj4cA>bh(5_P1@vjq zN<)U+F7DDXXn8q`MRjJ>?CfUbqtYRfGF@DNbsP1-Ft@W7mVIq!?<{}$;E}479|6_) zLU7yDVukx^9}M3OPVkwQah_WuELowqEp(k>SN}AWkMLU8jo$C`?;j!%0jas1iI=fs zGej(lD+&k1&!>GH?fOVG4MnGa00z$%y(5vyEM~s57g_I!&#kWOg0H^91nGfTuh{Z_ z?ou_iT@j~b3+jz-01+Wo;gl6KQ6##0>&)S$_5! zO2Cif^?2F-P)8s-;up)?l!ZG&!wP%A(~`G8Laj_3&GivzdpO_X&!vC)7%EQ9QB^8N zHfzUP*evgPX_s_GNDJEhpc2!{20^005%OXIr~hz97xJWv&58xTwc!ntSj~(+socGK zqbD=abK!q_1~b^on<6&(!y)Y^SC#*pinYKT;s-l{Ow&I4GOcFxPXH5u}ZLMJ{6Rdd6)E%5^otns}~~@YQ%Kyu}=kb<_8;aeW2TACFLz zhO!rxKfo?(xGrU0GMoZ)flbE`Kav-Oyt)+@n8p;D@`gp}BR6oxVAV%C`=ldC@a|*O z^7Nw}UoVJ{vMlX|8Lp)_0PE9rlM^D-=G?zf7mVvf?JX)16r$(33fiPNYz#3#_ z1sq-Z9eJ`6U{Uv5a9h}jf2C~ytW!(z2~u$Kq3+-q{SYx352EsOT8+U%W$FV8G<&}O zk~%x6OjJ+$XZq1o?ju&f*2T`Zsm&sAit_|RRcoRxtU!IqrZbU>@M{|g#Fi)Oy@as2 z77v1>m#`cMh~%H9hR;4WeQy~Djxf5P?6Xm!B03#o zqlwSSx2OBVJQaR)mW8uFe(bcH1>S?)FeMsp^gj>F#c??q5M{pJQ|)QZ5uGG_|LzkX zk*}JY-If?q&z{vMq`q@?>-ID;ikti*qAxhgwpS%1<_TK89p1{{MCU0^bNU-y{}ws+ zsf;|{{Et{o`eyzf(0gt_8(Fy1cOvgr_+gp8-sK<_(huBQ0`#Eb<3u7@cLEf9Habx) zN7zKo1c264*}yQzIY?i*sKnG}aC{JR&e$qIy3Ks}myLH|L>%@}R)qMDg)E82WZEN6 zIhUTl^~<+>z^lQF_%)y#+_JtE59KeRa!wKeAn?5MLl*HoE=aQU2h@ffyuBsTQL6e! z%vVrUTX;;7(c`ic-0Efq3?mYtdfx*lTF0CNb1DMv3MiL7HXw-R4z>o8bO*y7h>>=* z1K+bM1X{}%=9M6r?LMabKX2u3~$*%Yd>hi>4WzFyC0oP)%357VYm) za;Ie%B_^eW2Z5amL2hmz%9hRI3VXb4qgxaofmgtP_eUvwZAR9-|6zr78|^5#C1aHn z(n?jUbX*@+OcSpEa=V9<8H$58{8Bnk&~)i^zcj>iFT5e|Zh@%iv#ZgJe;ar5c8@h6 z+4*XY)#5FniBj038<~9{B*r#9nJ-amvd-Yz#{~h1%oBnmh627A;V()<*8+i1vVt5S z@pW{x1d3Ho{#O%l)M)QwV?IS>l6W%y+sny>xYbGR+h6h-86eXC3iOpO>zB^)0%sc? z+?hTfZce4wMy8at9l|hDKl;m5t9H(tHV5~|k``0}#guA6DF6*v5QzW25EPMgW$dC_ zzi+-|FqW5g)g^JZ&BdmG-Y@YYDCJ0}_e(XVqh4IM082#75Uw!~RJi7(efG4C6I#_mf*@E>z@xxT-*Qd*0)`o9|K z|M^h;0|IP{cj4XK-E-^fl`{VGaQ`v_a_Z_(E-o%kCl}Kdn(U6pvtao6_+M0b23HdH z?qDQNv;98wWEOukv*~29gAJ{&?xxtl``1JG_YSQf7llB%VtIZ)ixl}3<>is+v|9sD zm#WID6b$QaHu1l(P7whCUwfS|La)b&sibNH`>z55n)%;pL|RA1;)y3cjKb#)yScFk zM@SRAU~akG^L`EA>R4cI^f0OE7!gQ7@`TD~s;`*2S=DR2 zXci`tK9;OCRRDh#=)X2^S=)!YazNBT(;~ayX$AM+(dU}Pb zHu0%)_-|6n8{VI-pnN_46Qx~cRn^_Sk+|a0QiVe~W8=Rx^+HLb#TO;|^ss8PKxzJ? z$$j(X<%Nyv!bKJgk@QQP@}G)M6$eKMfyK)G$*Qfcj^%v0F+rI7H57A55P;0q>%3)6 z!TEei+95A3_BppZBj8`1&phbkrcW1Bxn|SP3=ruIE;RnPs{kgox-1(gJ|=)#_`f%p zKHcPAs7V|mG(c%?7Th(rX1jGyfKpycm~n4#nd_Eu8*@_9uIRmYpK2Vu_Sn)7bjR;| zpdm?pZEitZ75!;ekIC6cFIm?}@|eq2RpO3=h;)JwiOY^=xY;U=nSk-n2#%avQ-E^k zZv^`vZ0DL&xLuodz!VLcN-Mrb5UH0zK*JqYPs=%a<^lHA&NI@l_qlQ`OJ$Un5xa0V z9x4NBDlz$-nx8b6?!)Rh(mN2yN9WVBlHd{eabXXolruKMon9wPQ65sO`KZr%L2?Kf zK{e=4`CKaVcJB1gHhsPoz+X&Rdvn3!6$W&*EqGWb+kS-580{ypa9=?@>35TWJMy;R zVYS#3utgSz!wUxzua(p6 zCDcdGM#2&<<~0o?cyAH%t9`XlO^1YZ1HY+L!{g7u7*LD;GLTLi>jA+1ZONRzN5OTQ z1cS%aC(_i)`=)YQL?jaC0+%~bMg-K1T@)?uxgK45j`tLz7pmMj{n*;=TLfDq*0Jc` zN4(|iJX5%X+jC@2nYQ~p(DWKIt7g3~O4h&ujLyyInW|E@J7#o0Gb;rO24Va<{E_nS z0}jlI9;~MZ)lWU@lHd&qpo1StN$fkh!*Z#Y`X4-q1=ulPGIff1GD9PTRZeZ7Wo$6X zK=XFeCOB+=W-LkQc!~8fRKsXdO%h**c%tew!@4>O>gnP+u6Ov(YMniCA)qx;0gA!> z=#4A-HkeP^Jp__^P#FJEV`wtTcCVxyPX~%F*MG<6+BYR*j#Kj;G;clYwjWPxL`*rk zJ1^kN@2@MTaUcpFq)|QG%y<6=KsOFiA-WiX8kQ?cGnhH>6nR7;5x<-aq5fOo>l#tt z0NdN!Ke?5kFWN5SqZH59EfHs=*j4u0I^^w`ARunSY}HM;dB08D0Pr=cBynH4Ktj?q zK~C5VfM!w{VqMe=_p~EC7K!gKb*Y0W>PfQ1?(XEwSj8+oO?VEhVt-)?v}1j(m>NUJ znzSq6xvw#DPNU;YQx-eXTR6-`CNXpNo%cMP&CcgKraB?nuL}k1(8?6FR3h8QtpS{_ zX8WU@t1N>&XX`1Ebqk%4-h|VhF_p^M%Ul!34$V|1stIVC6DR?5TR91X<+AqIA$%e* zQ#U+kYpJ2>yNB}TOg&1@_(Sj}2B(ue@y?L_F@oAwKl3XeA^MvB06KK>e6M$mllMI6 zlDePPozHmH!KO9@kN%94(XPHibYBjFp=PL>vLq(K6M?h>71h<;mvsztYx|EGw9)C( zh-`G8FSlOOR6c_n+S-&Ip*8^VgFdz8EQq-etS1oj>ylrxW3m*m&E&6!R3 z14iCiC?+MkpN^i@Ufi%}`>P#$U?Y5ZK?Z8Ymd{$u4O;R3hygL0z_SDdmnxbhx>PF0j~Zd|Wv>^U!24Mz*`4WC_L+|^joH_HhCnwvE#v99Uv6~cir?&L<~opDVu)XIe9U}M0w*W|P< z(Fvb{-aCCK*0$WO=Q}aV`gQQ$z$TwTbQjg@zbDf$Cifr@jcj1F`LSxw zvxVSBAvsl$T2xV?6S3JpwA~eVx+pr=RV}>-M(fsTX(?qF15r2iNa0rW{fpM_q@#4} z?32*N4C-$%-(cVdVP$Y$91V=MeM7V^&4SxK$KD9rYk)$BNuhTM<>N) z#9Zt5uf4mJL(}b>%Btz(6y1`ln2HC;<|%|?4k$z3fllg4)ZA~KM~f5oyA|EfFv>gd zIDm}@dCFrAH0iFE!#pMv7&+<8IDE=yhW=ilq>;r1a=oV zmV-S8{B%kNaEsB`E%IhK$*9oIh4Z`Zzqx)hL5h z-6bOk(An!95)LrH=re%zi8PuM2!tm)Epa*Ak?8z{k=XP(S~Ym{NB8c7qMCs%s#fdBfK(`zI=%b5bCqmQ*>Dk}@qK@?Pi{#xE-#Xp z+IHLmMR+f}^PZUAokUL0yl=~Ue+xmt>*Iu&ItVtqxD8QNMhZ(+bJDxO%xLjjv*28Q zYR?O69lM?hQ`*NUuGe;xGl;~lnaH%C*8gLZmt7~)n{Y{7`}Au5{pV8OrZ|myVi=mm z)iFkJ%Vi+KQIePqZNfG`wJtcES<&=*t=uVPl zZ>}9vY^#q}yvw|09WH9eA+fOx@9 zl?}gHWx8-|YF7PJ*FJ6=Xj3Nf=R-EU&P2J@5-Jnn)1sygrLgdZ_p24Db{Y(^3BEEk z{_!A99o!kEeGJj9|ASSl3(MBKZYb{RBNlO0vR^t3wi%qm_0VT1I|i4$+6}Kp@=qg! zJhjQeas@MRaUwf6rrZUkM4l|?lh3|!Z!*lT5rG32G1QSIqmAP#;!jq&fZXy(18tmG z<#Io7cVY#F1C5H)i`fGZ0DInvS)~Hg^|G+0p!OJQ`a{r>MR_P0*-W z%t_tm?eJHQNoiC~cj%Bu1@ZIas~tEYk+mAlNFgq!#E0{uN}*{{My(VF7ztDvLs}hr zm0UWC3G1dnVxX_N#5NF(mtz6)?Iz=^;peLedHoI4!93Fg>65(>6l*OgoI?ZlQ3Tx& z>*RX&r_fffmo>~|Zy$!6RznxN2K-=-;xbs0NdmBVi^|7lrmst!9Asrx1XF^AmVL+u zydY5<9FZfecY4DAg-Gw*vf6v7AGv5?pdKp^;$!hhu5=$^Y7$mPA{ z#s}th>kXiY_cI3o?Yj9mh=D6vX*h=qpdq^{#|Gay!G#0ROA81^|BMGovKl&Y1Hfrg zt5mw^M*4St{T0^$4R$35^R#gBgJil@9MsG^j+_Wffj`c#F0Cconi*%;)0CNb2~Oqr zxXO&r9U<~jOGb=;>2)GY#P_*DzdEOK{E9{-=M7<3#uv=)Bp8#i#lPW&m9{|FKdKAQLlFr$`7Mfel^J zJc1RClcx5k5(&G355aYLe#YqlS(3W{dd5+%D5%r`cexRG^^u_O*&<`wV@m?lh;V(ySKPIXTj3fH=4YN`?z4Oe1pAom0_8az-_GffSf8;SF+QGDz%)Fqv@hoyO?RN*?3Z2O%h2 zhI}2LB_|-xd|Ydn68|^cum<8Uox%5=?Uc#~6K4aGFxoCXGu-+8|G;s=rD5=dhI7tF z1l-XU-W`m3fx!Amij2?OJ&^S!Ql5BdMfNc*LzR8wIA|1cn@L_?3p_7QsF^&}H_?8O zN*2F=boyzFdRJf;O(r{xN`6$_V8W|E@=+=8ZL7sfY<8q65N@k@>?f$6z!7UeAQ=B? z90Kf5MGQvhRtXKxFqyqzAu>|qk67H=xq5{46&A~-2g&j)-7F_V62u##!YBM%dSpA#BXwkUDtK zh-O0(a6CsZ21TM3b{L@=t3B__EWt^b4Z-+0l(|nxbjBKTw&_Wvbrv@9UPtx<4zTi% z&_{q5-TXPtru-_wG zzZc{i##y$>ms9g^t_eFT4)45&j+E8>YIDO1@mXFxW5f9e4YF>rK%;p3&^%jf2gYH$ z?7t8umpdsOn68Gx#MVnYwY50X=P_D* z+`m9#Y&@W(t!E82!HZeSSX2_Kr`2;?caE)nTC<&BKjrsf-CkDXyU-=Wl|`$iZvFrP zAF)p*mO)Zed_ZcKr8IC&GajcXT#}AOqFBXcZL?fIf7j$rqB;V-jU(#k=;%qwrh5l; z!J!e-HSKbyDsU5i52U%$u^4sYtmR>v29`=|*jR#rBKPwbxceancGI~Lc&^^UkO;)L z?u7ZGhe^iIg#Fb4v0D+779Y*}tD2Ki_4D!A@TXIXY?nCDVwdp5gVrWWeHq$|c4RE@`kVRDdfo~6A zvVdm2$l5~37#}K_v0y}hJfCff71pIHHh#|5i55-~fX~%3vtT^T9Rp&B^3d^sK`9}t z?wg{YGkqT)D~=KtWkPgG1|9PkOq}WH>FWdeg7kdyz*8Pnnst=JZfipe>6=KZdg1(f z1X=NP-S2V2e?((4)cUBpHY;r_=<~r}u1A5G&V!<}hsnDZLZ{;MPBheUISFTbpiQRN zyeepEM=?P>ml~`{&#ODkDK~|CAzoWUeAue4pKXys|R48m0q2TB`&V9hg{QC#9fihkbesT>PbN0{0S?5mthb<{?=* zGpSF4?KFa%WO@@*XIg|DvmO&0u=Aju?bF?ef+Aj8Hn1zYyM46;PfxH?a8Igb?RS7v zw&&ho`xAd$?7>^S56bSlW*E5kTZf#o)_ge|kE&OiDSUOy5#x%yhhN9;^;_KxAQeBT zSYKm)vq>|SV`{?CSUr5g>U9BY(C|SrR_}p1xx6tUxu7wDf8bWE zJBPnO5ut-ZqfkceYWm8Ik->vVtl@EFx2((PoGUG`d7&V-$t;f0G3#|iiklwodfuE8 zp3pdzYeLdb=ksqjxCbTuw*6~v2j@n3BJG;~A+;)MvpY|Je#(?vJ!8O+BwMpvSyc^3 zvN$Xn9kCb>Yq8*i1V<0$kHiApy!p_xtk2}B6``||ql!Wwf7)}5t8F#o8fm&rfgzS$ zS7IFWsqKTGGpypf)2@93C&`Z{FOAsTO)fb4b02lY>PR8RH{GXSW5sV5=OPR>$;w!| zhk*#x6lTDZ`$I59GMWIz;y%DTa95|M-I0W$8-rq!KSzbJs@s@zwgBd>Vy+Er5vthy zVov`kTObW+>wZiuJvM7*uI@mUKK!AwF=_p|&Qy*RU(Ty_^}NQ}d-?(Kl8!5qdE%tu zPvY@7R(x29sjRy8N|Y`E?-%x{aS^!0PQ@Md*GpJ*aOK(GA&+F zsudRZtAW=&DCnWQ3A%1@y)ue62 zl&KJ%0@NnE8EC4jXxWALRutlprhY12q>qBU+EzT3a~YfPUb>66FwuT$T1aD;4n^K_ z#H55PEPXKn+xoCezmQyYF&vL8gRGbPk{N_xrfRi}@av(GMX47zBcG_Tm7EG@;2;%B!{NRv)Z7bbUsgEyGok9%u?3?Vh zIxDuU<4j~f2(WL7P}! zl?SDL7rmuQT8NVpe&6FD)f1d2W*)&2w63wH*MP8f{qn;GwD7a+=P4sbdlJ5i@o_Ks?|st zk~`&o77*);7Am}H&(UL#K)6tktu(se7{Glt zC_S%{q1vcNaKg}7*;x+AH$WD$QQ@ubvDqvKpLGQib@wYQ#>-rD=o=B{D>A;ZlC zE8O6Hz>{4>P)`I7i*OP;iBFqYX3m7g(T?LEGJ9i;6Jt6{cn20c^y7!nTRDY@Oth$h zJ(n|mC?aPglToESlb%d1qw2wvV{*GQl7Vq#<1uq=axKnvP9)qLcI?#>EULv_a+`D9 zaM6U4`QU`7F&0|~*^Oo2i{NViH$^MaG)TfxHUw(6Pt6Rbx=iv_#`w91b1XJ8IM!@p z1n#c2$TbJ+D+K(AoIEkZyXqdui<974e@mmY`qL4~Vvf|%42Y@Ty>%QAvB-+!Vp5K7 zuz{Agn)kMyLaPgejH? zB*I+d_@%_s=pfw5dETJAItTMb07D7)1-#`TtHwMz>Qd0;!marcKa!!qFqI*qa}%M^ z-=^lZ*lGBdr}K+QL%Z-h*uQV6r~B0#s*N?w=Y+Q|H2!MQ+q^w(KDm1}DZT7+;lw;i zFpRjWL582%$EdQhScAE-1Y_KiV&FYiQ5@doikgI)Gc2FsJNTy-kr_X{??(E1t4a4~ z3R235UGnwa4Y(vh>Cdl!QB)<7+~z+)Z|C~?@MpASbXkynojZ2frzY7SAKFRap{O0? z$d(TCg6P!pPpyRxUUBfshXBvvDn#PEw5*xfW*%uU(>VMQf@>iu2W*hM#tBe({Vp(D zwQCofYG9wK-9|zw&5a5urh0eGi&@+#b~dG}+dCi?YX^F?(wj6rVh~PkN%U&|uq_1N zuZ@Rv(_wDdI|{03R1V8t#c75PMX*(B;QwK~8@OumUNVL`t^8f8fH8R|(-D|qVS;^L z4fZZJqRxn=D(3Ula4Iu;^JlXBj9W~6k6wRzRO6DOAGc12Ae^^!b zq(i_m>)Ae@GF+^Nb`)8Saw<5SCr5L3=>(M<#7;4Z5V7@W6}Xus<9{UG#w20}U>5u+ zDr6+1Q@Ke_?U?~2S)I`T?3eaJQb?Nx-#J-HzIMm{(h2srixgOW^t&M$NLnskdIvYt znzyz|w{2~0xl@a~|05sR*AUBNE7$gDcCrTJ%;10pv-QC?Cg1bxMR=D2c{mysJ>AruuZ{N|QyMDmfW0Z}(*P6BV zoX>jZRNiR|EAE%YwHa6H=AYPQ?UKqQhxAW;y;`PK%<8ce-(HzxgWltP91w>Y9H!^a=_xj7A@ z&`7v^|0Y4mT5gsN{!=FcX0VXo>8SsB4AK1GJ}6qU0&k}P$31|Vsa@uX=L+7%!N2Jr z`C9E}JE-@4bcIFvL;n*Avhn}|qN1Q=$;eAZKPjE9%>Vu`mcy(8OtN&Xtr5OEHh_P} zW5Aq=Vzad-#D9Ikg90$Dk_|Q;94u54x3#w~Q3BY8JSp$eSA*WUlVy!}q@$vdT@=g& z#U&(^DE`OE`7w(|OGg*4VC0OhZYKlX$;Zd{w?doOk&!*{gjuA)mAaH+qar4#qoX4t z^y$9=Ru0H!U}S7h;{VCn3jSX>!~Z{eP4WMMRs@S+)-=GJ%)wkKc8k;LXE49i)Y4K? z`ETlG4Uf}mwJTpL(dPC<9RmYnb0nVbh>r6-Fbw*%B6*gE40zVpynTGUQq-hd3P)mA zuK@`Kwe@t~IS3v&^4i+v9sgv5!I#y+yt%0<3p^BX1U$Hqi1=W0r;0kJ9h8aIY?_bN zv<_Jj=7`p8$6o|)Fk4P13_h-Xp9`5E&%Ywjs!R(UeDJ*BYelzGohYhY<*}swP3;$S zMHY`u4G}cEJfxemTyI_|^S+5LJMG3FiVo z1>3baLYj?k+ z1;46k`bJ3Wk~m)mb&bH4aoE0uy=mv;4{vX8ttK0x{{+ZdKn8CJHL(i=EmP}=iLG_* zB{j1x^$GSz?;n64R@U>rr%L zBAI%BTA{5x7~21$6z`#rVH|fCLE*U84W*DSF58U-SI`t?|E{^MPqB zV;wznY`#R81k2y0h^c{tD2cTI-HSFzr8Qy~0V0^z(gfy*hzqswk0PGhkK?Y$@~O<8 zxDAA314pW}hj{Q+JWtFV?fBU;ilfuy7H$|hyUaqB6ZWF;y|YGn>1HU3h&TjBGGNXm zaQ%p{(CUR7_4Yej0z;%o5|3r?Ve_(GPJ%`6R(mOGrOZD!dTXwP7po_~(%!s1FQ+gB z?d4=}TQ(!q2rFKSiPwqdgnq7QICQThd;{)i&$`a4{7(?u-cK+j_K!@->ihLCgHC1) zfup<#@Q$UW4v5Ki^^dtcqu<|Lh}%FQm~4=vJg`U-^yjv7gXFB%{3u*wV#6M?G^RtS z2YY|G`CL>_sHoC4M+ZvW(*%FNRM7zl1r423RV9~hM*1&lf=H zoTqui<&4I5#9-K)AQ~n_T$ou`hOsIGe1(EfrdvCx&fn8%+UxLwbpMi?Ps#Opz|t?L zMVY+)OORj|!@K_uSfTzNn}kr1HXp2B$e| z8U`04uFHq+c8srMi)ghGa0~ z*hztN#m5FrfJzCxky`C@_WA)g-7fxa33Ei6bTX5312}x>64ry{v}z}5tj56VkE0ER zB-~)1~vs; zY4A3+7SAZe!wnPfZzsPTT@x;#!w6pYe&BX1fMk60R7iFoO&|W$Qh%zT+uoT}5LwUn zFNE`K0xejzvdcjPL3M63GYDK*o{4@HZ0K&Q+7R%cvqheR{PxZckJAD2hD#XWhE zY%gua)sjO1viwFJ@xIMwtRm;l;;!bD*C_yl3Te3+qwFz34Ey6e?caC0VZJi@KL%Ls zmzx@A{-~CVEK2=jL6X6|o&QYXVlwix7m&>1#ljJ4++ua~sZ7m8PI0N_2H2-S|L_Gu z9k=*?h|z_bn^*O?P-NDeW-&b_xX3GI`Kd#A>tIQ{jO=`r7mqKFEaQzl28*eSq3!zp zC%T9MWurT@6pl!zcix-W?<^5!iskl$mX|l$u;>kZMJlwc2xQV=h}E<<&Nq6IeV9^~ zUokk8&xk_yf`bDy`yVnVhqBdXg>j(WU&6d_W0Bbk;#Ifv5>7|N^sqe`lK z;VWSG6)Pfc$EaFyP9akDs>LR zn2W2on&ghIHsLTD(+Ng!Y)PoKuP3c`@oM-eV9Y_bRoy?-k~iVBn=f~uHS#BMsgC`h zAM-WVUjDzTgzYYQuu&D|T`Z1xRFW5CFxb`SEw0n;nqqv$MCEfU$kt;geuQw{T-1St zouB)>Z=B`UTrCz-8ZbBhK;?hp*@{^5tQPAypX<0cXdw)}KY+sBt* zClMq78`Y3@(DAoq?)s-7fl!YOsL9}Yn@ho&NNl}&hgnC-SfTy9FutyT6OE~+AU`0{ z^84+U$1X68)E!?zC#=LW(MpB2fsilU)U&TC>fVJB53O%rWaJ^J z`jot$ZyNs);D#S#9PqyH#o+Ci&g)itYSl?Vi{fY}keR&bN9X;L{d!4d)lVf?UU8+B|dTg_E$}rPgs}`?*Ah>)Mz< zuZ|o@nw|v)$DS&c(6@~NYYn@^69bemE8Eu~_2tiHz9S7#I9&$Xdx8^3}?I(l5*$ zEetIn{0-Z6Z9VzqNR^;JjCAQGOGuPfK2dAqA~Q7YIlNf6VD{#b9+{`!;I6=(*hr?r38iVa!G&A z3{pn?3c>8`kCZa%I#fgRa`Y;rVGpT)ZT6~%W(BN>r3NYpU#wZ8c@#;hlUAjzODHyer??a+)@K$H! zmZxLG*S$+GuA7w%wTnNT2>f4hNT7SO7+rV;a0Ogi1 zOHCVVha3e_ zQ7akGQo1jnV>7UNOR;CUcf%221zzuWM*gBmwX{+MAMoyb_Tm3dV=xsT9TKVrFF;NN zx6>16Pe4S;j$j~!9_RAX-5J{O}5g}wIsKWUw)xEuS!&LOc15D|q; zk1zCa_BWKf78s+6r{~QFD3{Y_7Bv;Vk3D8(uhekEr3y!Jv|+3VoAwOI>gPpl^hQV7 z!Yq+i!%D_nIsL0~7+`8jSTQXiBC}9$hf_357XwX^Q&0Zqw;z9$ZQsCgyjy^I&xqs{ z6fs0Q|4on|m4?RN+!rn|Ahn8z^t0Qf!mbB}RKH1L?s?W;Lr5CPumMvS2*w3%F7 zz5G&ww7R3J#puy^m<7*y(o^;0!-PSo10Y#9WD=WRV57uv-{FQpP#wT@SV^PS@C7Q9 zzJi~qcw<<iqQ0 zI9LUk6!2n}q}BpA08uZMj7z_u9UhzP)GbQNcKl_e&(7`W^tRE@9&k2zD4s$HZCQ_+ zeBAfCloX&K%b$Z56U`_5^9xw<^l&tT%(jsN-%e9_t96L(Zin5e&%Y8p`#Ll6LCxD!2C+qYg$QR?<4?;)BV z_K4ewwqP*HJcbD}pRmP7^w@J+v97zvxB?9=&?CT)kIv|@o(I)Ma5F#PGvBSv1*?9V z;U3|RchzdX>aVvHDC`iR)kUYI@A+I!-0PO|$GBNk`r|gA?Dv+rdV{5c-xA(^(%QH+ z)6;)!XCaAgUm4XhB4u^p{r25m!4|P6aK<|7u3V~a#D4nqae~&@D2wZ@-<7|ypqKE* zgxV=Cs)lhYONTwmGTss3&YeJPLgab0oMv;?08(Y~JYV zM~m*rX`n;ABl2>wuE5icCc->+>4Qk0l~B@Bp0^#CMS>7@Hd^46cG#Pq( zT}?Z)`b@Tt{;{u0=yl(0u<7@<*24z&>(PTHpSlH+ElHs`BBT=%%97I|9@Z<}idIUs zF!GN+{(xr&!JdXFX!1jKCLH>?++rbhb@h>7a9?=z;RrOQHxQpaWdK`s62Y!u0;`ss zr?(b(%kZQU@2$?&M$ zEYP67+wrhu|Dg@TEVbO;xS~ z4yW8)0$#aXlh3GlhN^*o#ln7{pH9R#j?a}AzLaF^A8%@{U9#M!qhuQXYO?(G9AI<6 z-|w}4BR^BZ6P4=g1;BI-Dys;zl@L!O6}X#H8Y41u)(JU{!~(j^m|Xe`!TeOG#1iBa zUP88=oa{Pi&y5u+0pI58Jo2NWZpwu=bQ z@KFw$H6Nz6p?e^Qfy*Ul(WE!N-4&-7B$=O)Ws0;X7@z~bS=ernL9ao zj_U6lcd@}W_?SIxj=O4VZN%y`^HM^C_FS*vZRz`*sr6Hu=Ho2mSD2BD-LK?4eo|Gq zyiX^yzog_ki>BZ6d6tTUkg>*2!rD3!dL9I!cfyvmSz7l8wc(j4hKe9>D|GueV(q7P zI_+7gS+H9IL_NH8B>b)XS~vM&#wlBNXk!uye8WQsBa7A_|)}fD@wyJn(`$n-znSBbG7~0&Lffl4F_n2JUW<(%y`u#Q} zKqhQR6eE}tZn$M;aQ>ZW-ph!no>{xNyv4#=xq2EUN3JzB+?)4z5_oZ~=+V!YD{O2+ zj1yXv`BO|%5`&|CUs-e6@8||B#hb(bQHMk{Qs*4DZ7tYuSMN{?7}ZIO>n@1=$Y6Jd z<4j+z{Ti~D)JcJSF-!hT;izMW5GWJ&WA|W*-G?Dy#%#nMm6kV^D@EDbdh}Ay&E!uI zB7DM1+eQ*AzB%&8lvn6_JTtx?7_;BG_{0w-6_*N=yJ(T= z1^q)h>Nn{kF`gnzXgFZW3{PUA|CudJn2L7%qcMKuM95cq4-M$>{S_6z3AUVrn#I7g zTTDR2kd~2ig$EZgeqZ1)$*(q^Nzx#o870;zTJt=x1?A}vA5+BQ-Q=U>_6$!Y>zvgmrr1`HfS7orHiSCclvLuk{Q3@NzL4`#o#xP~p zJP>#MWQV2Fzerq5AsM3W{bEpG*KuS(nXq_wU7jJ{u}ochG_~CloZ*kl#E7lR_kM59 zKJXadjB^(iwy3J0iHCB!k{z1~y`}%@V#*q3d-H^`p5hhS$tS72h|ddE@Tq{~LvT)5 zQnhS^ZJqNV^RXm#N!SB+nVWq_XeU#vfA0~-^Xi4}hV82A zrXjJca$c_y$JLEGhFlNYYa}6;?n?<7&;o07xYIra^%~{zgAS55ySt4}qd1%dtQm%U z0PW~nM(?G49d(wgG6<&RBD&Lz(5lIVV2kWLrom6t_Iogo{ zsAer`Cb-G%kQOV3wHP$uXE;Yuv5EY%vPiT2NPg$$1KS z(Xm6*)ohnNr*a1|`BuwB{WWvkXK<`2fo9Mqhw#++(cX#}bY~^(CW*G4S!YQ#Q~ZmV zTGL@f$m9)F86Q*is$q}o20yb`0HweXcf7)eVIR+dQyygCKkObRs*k_P5uY=WqT=O` z*i3mJ9xV2VytLTv${vFbAZ#3ze9unaEZ^m$l6%>sFm?(?V$bXL&7-T@%AfKN9<>4r8&#p&YHM49o7``;pQ>m`&72H#j^qFGyx=yW(I1!op-2Z1LR*; zFMc>SuXYUlyWQ^HViA)?=|1nc$dmdI4oeD-^-t1l_aCS@$QTQ5?Qz)>_1C>eN|ptf zpT)}DGHDgP$}TP)m5}7agnVjd0W4$X0MV^vxGNW5nzyhXpxr> z)=u*Mxe{BxjM)aq@Q^xR&x$duP<`7w#kaf1LD`k=^AKzN>$N6gh{wvez?iznsGr>R zC&x7UBJ{i0U%obtdhjU||MK8GDr=MpbkWmMYId{lgu{FyV1L*p!&pBTw9@F;I$&j^ zsB2EMV67G}(Dt+lgL;0uneBiLjZ#Ts9I>1nLI6P4dxZgHJeH_KbqHju$aZ)$qZOuz zm78Ybg%6tzlyfz9ty<0Ryi{AxAP}ryljl7bUMZB5V^`f2wTvMVrf7{{=ol0J0CVX^ zTn7i=KVQo)e`KG-@3URi^Z#m}C8Gr^R^8!)re!FpEKM8)d|M^5v!V%&H%qvI>M83d zb4%-VAt}(ieGz7H+x{XQni0|TBcCc9OJSp7EIgKy7H z)$=!84`{I+SD5xUjxjM)@2awkUu)AERP)3Yh5$N_r*PrMojdRtkZaC>l?$^l1R3PsZYP4|cE%qQT)u{Jlo#9ecBr z^X}6KY35hd6@(GgydlbqLyONh*YvgXOuhO;8F~CgO!)d)w1FkrZ?+MrH_$hQ!$ShQ zqpKB}CMEFqZ4iVsVgA0(s%iYC!;C~Zl->9sW{!pGCg?8&@cuHn8Q2&Tz}%;JHd ze2#8tGXg1;=x$-U3cUQ?L~=aYK_95oAt)z`t)4$$N*8rTg%XtIXMfc93n zAY`lF8mc*5UxbRKI!;bTEQn(c&ME1MMv{NQ5vStgIJ==6?x~vIAq_neh1gmd&NO746#0a zl{yE^3BetnYdC+4@l&P=it{{h&-A=;v6WH3k&Bq*Bq>zm8x|FiFRTMB((SJ|fSl$Q z>`ZrP78(nQ^c>v;qXu#&RmdMOTV<38n4bZ-D%LXHpGqy+3z(GL{1WEoPZR$s$2mT% z6?Xq7vb*Tkmvxc@YQP=*mPrs_yE)$P+HwZR8s0Tvh>c_0z+#1qwItQELpZ0w#-DL} zC}VnU372O5BQ-}YOrpJ|0(U*9J}}L<;ukc{kN>T&v9QYKhSVM|5vd*J@&sM{&5ZJ@ z)9rH@5%FhlS45rG-(#4`YA%wLF%!Qo2R_+Lq)Z5-K2?Z!8bTvkyM8{jg*J&lR%tWV z7D6u_i4H&@V0AIMy}1NX)Doq)AV|RLoBK%(b2IBe)a{@}w{gM21IlVwDdQXwgr@_) z^vOhhpS@NysC0u3z$=Tkw=SB&7Y0Cx1H7V2RKnXWKiy&nsUMFNoxfl zR4*+bg144(sg&tj^tOqJ%SMP48RN3Pb*M2I8vp3gWs^I}5t-fosdhUeO<`GvBO5v^ zWWR+X@De1Q2(={NB6}eHrPMTMKg5tJ8T$06(p-aKD}w}R*DF?8e5U%bS6UwKHBCPH_=~9 zw{zkO0zm0LCYkPre)+#G!7sP6QgSFm&zZ_7lawF<9jvJ2Z5%4EHpJ0_P*4^ZM5&qN zay}_3KMduhTwldnUL9MZM}@zEE#J1@1?r%~jF<{x7JYw=V~wX6#P(YUURWP6^+7Vm z?L>M=Lbk|Kcz%hynnISF(-D0-{%-VUTw1*QOm+8FenzcT3wi@?9vDiXDhNt}EWDF1 z1e!(Ui@%7T%=l#g4Kp;fEYgIo_0o_&X1WCq=c<|ODtkG8nx}2YAJlg|A_F;c(4o?J zXTswek1u7P#iD1@@_*Ogl+LsM!*3pTYLr*=7LU5+50jGCetjjDkt08&{Z@Q^^2_SjT zKe5`lG{PX~yL0}gHlSY#8|oVe>#!1-%WM%1scr!esc)iV8?)*q;er;u)(W+Hb=T|k zQeT|p!q(#UNf}Iq)9+B&#g-?2$Cmp9x?QW>Wjl-xj_G4}-5-JESzV33y@o(B#*Y={T zSqRwr_RNjwO3BbO`&FXy$2ZU^z`|nqsdg~|w=(SJTTqcIcsiu39cx0xc@=niB?o&*?shOv9t2&sF}fGo!G~h;<*ZVhy?w*cSpxuR}Ud z1yOkPD)F35B=V*fP$p%DXFkWRb|r)4kxLH@T};Hg(JG#ikSHHeDwfrzlKT9agMtbl zT$=Rk(~K&s)GQ|ur4N5WR3T&z(Z{#!m_Re?*<`BVug=tQ8?4D>MZMd%GYE;efJ@*v z7b7imrs3#lp91d_tVo91-@)aP;vY0mxZ6mwZa=kV#5!hBOyoqLA!3_sAOMmHLKsmF zy)aH>GQW$Vw>a%j-NHI(R2CZT&W0@`M1Ba8oP!{r={vUAaW_0BJR)zx<<8|*7GAu^ zovS+EtCmCS)w66aZ~lAOZrBJovryJ!3EhGW>#5s*9}|!eN~OhR=#*B-+Cmp%Cx4YH ze6Ip0LqB(6TO$qR=lext6aTiU|Gw8x-tUrK@D^Mk^(t1~g48{VJ~=+UwH)+v*&o$5 zRenM{QN$#_GQ-HlwOBHF-tte=rjlDOJNS2_%<=r%k4XfE0Vq9G!c9MOu9i!)wRKa% zzkyC&%-;4FRVVkD2190l98_Tu5PsZ&=V32sUV zyxg*tk@DyM(!eXpL8j_d*PUTHzCv5tS3uf3y%dD_pdQq%JKy4%QegPCjln3v0nw|2 zXHXXY<=5_-na!U4qnIufXE?87$xPQsU2iX}9~4{a6pdjG z6E6izrIXM~JAl$~TCYzW@yooiP!6?beievEFa2K~%l01r5fKf3Ad7}5r~SRC=Jc_T zGC4YY%{m~Pnj1FSx&)NB9wPn*p!~$T&HR`=;28DIxfzRx%Hmy0bfRS`G&S5>eUME? z-zkU&Kj->>JM3U>*8Z_i!}ICsS9qpIcU=iy>#fSy92f&+Y1~{PDsH!a|IYKq%H*X_ zZtgpUYuZ+8SNLHc``o}>odfz=^9QmiORzNOpRQ?Bma|x&f@eQKqa4pIe%R(;gC?8O z?svg(ZFXf&D4O|Ep2Wf=n^r0Mb@debJtG9(G-C=jZmof5N07w(eH-xTt2|wU!}|Lz z4YEo&75FNEbD{suf<;DF_+L_~|4j#WSzrQ&@E;)b{i-+qH(>C`|58u3waX6xN5^`w zOYL8eS+~_DTVX=;MZ`p;Bb=!EFm%p7B+S+xb4~z#=lM)xRumGz7%#Ezq?AhnOf_y@&#Wem>#PSpSP2F z|7;A2>NV9g+U?735OHNW=nKA?jZP2A3+g%n@3sM93OYnVu_Bgn4 zQ!y-1DW04hmBF*_TL-7dISu~e z8^t?F!!bUTu@dPm>?0#1aX0?{{#oFLaOxX3#|v|+A!lVyr_06v0f;#?#`p+>88^P` zzrtK@*VN&nxsQ@FO)6MI_LnGH6$zW7t+!-~hraj~8AqiKE6QomZ7rqf<*8D8+z!-& zpU)NXx7?rEOh!O+s#b)~&Uau}+AOVYP;HNf<>4U{rZU5Or4m=Xu z|F;jme@6KGpa1>i`v1dko#&pA=|xt+$AjVpc0uig>gX5#k~Cpr5uH_A`+FCg$b7|l zS3IL~b__dyAp_DG0%`vjOLHhRV?wjF-y{d6T6|b|k)t**6 zYS!6Pmu5Zac*d24QYJmvCw8V4hH@$BpyBiL@MtjMVbIaDLt8Zf+v=9N z=?N;Q)|@*ubks5d^LBJYA5i$BR!xohaMY%0Oajn}=>9fock;F&B0jEY+(_+w?|6>T z7)pi_uj#2U84~Qtj^IPxwXZ7pEs*D_qA+aWIWy?Plgh6tvq7;%4`S+O{U;G_nEG;1 zQ&ao(S4x?(uEr^IIj!u8A7b|}mo(u-UYT>1Lh)RkmWUmmJCGHn_FvuvJAI?m8}vXk z8(EU+3k72`LbvA7_eHVu(iEdZ3gMHBLhpt!FV&=y2r`V~{ny zfv@~7E>!};L3ls%0HB+5+cMm_z@bMzwwWJpd=@yBU&*PpTnzHZpWCB;GJ_kbdCQ(? z4uJMXI?WXVd?6M&mkt`{Ypkds?tUwl-%gDiax`QTy_}C42d!}Z3!~FehwGEX@JjUw zFR$;dAg;&)Wzhtu;}1;3I{zRUI2dzZXQzhT(a0KFO`-yz@*013E1q#4AT87E#186M z3m)L~GFZT`ly?`&<%ls^$ zv~Sfju|eOPu;CGYvMPBW;r%&q!%Pxx31T3iA1U>AZkC*S@&L}*i za5y7TLN{;qbl-@}-@Yj1S#bH2HIhg_8`2kiE&Y)d3yhsL{%jPskRw()QzDGNpm*Ng zzW7Yx7X%Jcv)_4Mkvi#wl(X0&PRorK2LXROt?g|p`Vm6*BsBuF!}qz% zpNkKxI&o+1uruq5)E-v29sEjg8@911i()_N@`0Nc`PgnU1Vs}jsnR04V9QB`Qxaha zF0oN}-cg=&LzWj0{GMUec5M zr&hJg@+Lng#O@#IDNRtT&F=Ped8xrH8me&~t)I?cJzsBLNO=2=ZQS=kexdeuqZy)p(U?)0=ePg9wf9E{gQT!=7 ze1mNBbEiIU0y%9Swb*jCUP)-R=S{Q()z#3B*=QL`ls~GaH)D7|c76x(Eqp+DyL9jm zg6ygEqqC_e5E;BB<9B4cVowSXm zYK4&VtcMJEYTO3Bt!Qd$FV}=KC2anRDr9!FAz58f&E36M$*UOqrgz6Y=0--){;ah{ z+mLPJji>T_jACZ~(nR*l0HYuZStv`|z8!DR*uLt)y4Z4Cs;PNI0hNQwLbPkt9z`MA zM?{JvSIcva9yYo&wEJ&Z>gB*->#VDheuftzIYX7F>C6W6sj5W*p$6|9 zpN@3Hu(+q~${U{Ls&EVT7W=U8m6p2$!d#&&vb1N|>!omLHLd>hD6Y}gjTkTKQ)cSc z?ZFQ0A!CB+YPjlKj9#lHyJ>p7dhwdfFuw^|MlfDv7UTNs;^A#FXXJhO0#$UHlHM`0AX*Bg!DjJUn;Mfl`+G+;>mjT0lnZAl2z z$QhFV5t2*{lJwis0@4{f`=BA60M|0ItRNnJg1Iu(%vAMSMreEl0-5szhz_TmH*`&L zVY7_~xiffR_JD}1;e?RjRXW`ml?6_(5<%?2*t=`p@QAN_%WgT;trVT9r{LKHajJz;@tpA;UZ`S!fgce)&$$==n&Q8?*L;Z2M zi!*u*&y+rUz(S*b1Hr-wB(Q6B$a?6XHkBs#jc+(T( zjmoL>9r{8(OvR#-vt=K<;v|T>YpY#-bx=`2RIlifz=>UVqjkQr?~%YU8<9`{$Re>V z5hE#ck3kixHQ=8ZbV{?D_-xbY9Ku(X&vh#;LKJ2HK9_;JK+o8hX^k_VGgm zdgjh<%0@BBJ*(a7qsKs`e_w-?{Q;FC`&TCsx-{@gzJ&#~V7u20&-8;Lq(AX}a|@)RVK`8*;$@ukcAOzNb`f*yD3Qy5`onqiOfZk3QtY!Y5-a+sCDn z+JSF=_RRINP&J(+T@^d3o7i7b?e{0TYio&ppDwil_)er7yA12Ze%!HUQirZl>3)lu z2x47xS|>4cHEi~_`BJb%sn~vhQsV1W^nbZ@5zak4Rp;^$^LAh-`<#)&9#?c&^!LsX zo&l<;fX(i1NmLVr-RsiTnT(;ABV;GoJFTp>BDWJ7&e9LATrIjoSWgZxx0x|d8Uzcv ziz?9|{K~Th{D(#IyWV!(9rR%PP~vFm^7gMZMZy6J%uX z$#A=zqXGfQvzc1SD<18R?q(6oc=QzQnD^8tODt35WOqR6xeeKCtuK@@ElBy)uuG(( z4R681X!!`oL^Gm!cTwH;r$fMo_Iz^aYlPg;CmWH%GBRhd@@=m&Bp9zqNPb>4&$9zH znd;-(^^dakHds9~R*9!DjJ!@%sP;@aZd_CGm81Z&PFQ*ul}eB7>c#uXT;}i zBZ4qBX`(&k@%-5PnvBhCdeZ}H7wX}M^7=0TE1$L}D6-u_AxU>84qB-=G~4>_-evQF zLRwwdGwwE{BUgciW=^_0aF?l+Yx*3AIj$N_Eiqnuxr1f+oeVc9`+<_lRp<;Bp{UXY zyGx=yp0OcXf3YytZY#ZJsF7MK<}YYMj?My-1|dI613%;2zefZmn{VOgObU_05*@4F ztyOnVfIaq6+lwj>`?3eGYrYJZEWC#rxD;zU`Soh-K*3jfqFToIWp0GYjtiW?I~$QL zuZM8-JK*ihKb<1;B`Ryo;W1Zbe>%puVnO7!d$k)8THend#>L;E$wusQ2v#0 zfm&p%s0Rbu8!t5+)XGg=r%}(GIiATg49TW3-IS?~C9f1CvZw#q7R2Tug}{Sy^cn5u zz9TWu&wB=*sI-a#v-ag5A6RVUm|VgtYYX9Lr-QWnRbQsbcC96QGF9>bFW9NoUN;K# zOEeuu&hz@=+6euc9??1vLC)0xM;-;im5x699+99P>E3waIu`4TuD(>eAalUGKCej54UHh6p zczHYmF${S*E2X+yX~3N^_CIU277c6AsQMALYn95|m_#W^mRx8iZ(Rt#O^uK3ChP%% z7GbCiHBM#(J?W!{-SS@dWX0q2rCN?yCeWI$lYZ$8Ob z4#f2D>({uRN;+%tA+Fo?SFGVM=&wg~rt%ia&G;A9?V?^s{JH_n4{q z<({_pw@OtV$FlFoFat(9^(h$B*2ChxJyhvsy#gJ|q$SY@*D-~J$Bktkq6q=7aQS&g z%JL03*oU`E9t!vnZ#!`Q_i_5(BbgUIb^^(QPcRz^!615qs3piQNI_MM=d~D>3PGr+ z{*ktGVxM2^5~Xw9l?B+UPeKXMb$ZI=p4SuX%t0!5{%p^Ob+3twz za6@!T!vYbZ4EBj>3F^MW(ZzwI!4oswF*4Tns$*x%$7G&Qn-r|C%GeW&9Q&!xNSGJj z8*Lkez7Lyw2=1w}xG%s@gcv&bTEnYwwy%Bth)iZ`t1whHQHYLSbV;gTw9rdz~71zffl;39;>M_B)COxp*>4boYd-kDu62 zA{R)y6BG6G11hh;KnFSiA3Cs?(*OQD*EJvr-`Ugut78IrLG(>fF`nCt49#jCQEO;_ zvPqKPg045Jy^(Y`PJ68V!coeDpW8U?!k8d(wt@~@tYsyx*rf4b8|oqrF^%`*hvMTt z$2vw#;$Y*eS5{}p01=_$B;9j1N*wYtZ0sTzt7p@IhvZJzQy6g#XV`%LxeI%T?mFng z{?}2A4a*jAuM<_>!7%$A7Q@+ZgZ#fZue{VZK*cthID%?r4s}X8BzGG|CtLtcU{^+_ zrqHP^>ao}UgJ2uxb`8DPlw%h8@KtYl@oZsJ4pR871*WVL45x{Np z2h^s&rc_a!pS@ueZ#|Nbyvvk~MHe=@t&1Abq|2VILKOBMl%`|3UecReY6maWFRCzD zO(ivWPobH*JxAPsQg5&lC(2|h=-Or(@$c7BZQuvgo~zI2`rHXm=K7(%go_QLfNr&x zKrk2`Ow;Xxm;t;pTY-xtjUN@~+ANRfjy?rj3Cw>C@WEj_RUeB^E`eWKd`wR{IMFG4 z2ph7os4XW_^x7w*?N3zkmg>ez&R`A`!Zt(P-l~!Q+4VSnb9TM<$f0yM z)Rt7prkwGcOhHSO%xOHY-@D+B&#RdE1rI$^Xnm4x{ zhvA~iLiuXIjXPLu`NFbV5NAMP*V!Po0_zo`ysuSielbIF z?twan!iyKCWUzzgJF_&Eo!@}A*l zaOO2nQp%LZHUJrh2|li=Cv-fhB8+bStU@_yV*l(gew zw?gttT;2RK;wynRF(O(sGdkm`hHn_m(fQ-7V^vGW46oc{dcH=T+GK+FX3p4&DRkG1 z7f37YHvKWD9ZiWZ;CMr(Ut;NYXK-@S!`muCL;b@PJ_K0k%AHH2=zFOM+{*81y`Nz}n|*5Oiq0hi0jXFg z8^MW{>P*YpM6C6TV>2SqU5xUIq}*;+&_qw$r?}A%RX;H*KP&$nBWMvoi7+Pq{LOG8 zg~!KixIKs)ozqyRY-p%Gvac_ZMP{v|02FIW9G7W7OSDczfQd`F@S(M9H~)%@5x zH2Wn{j!O`;8Mr#dz70%z?zd*S(Pi4&g4IoXFo2&ZDkiu*&?>BON|jG&MiCMcVi(?J z3yXFdz|O8QyAqo+qxHUb39Z|v)FTx5su_?=)!%vMMorrHi+E^*GE`=%v6R{%tqkO~ zGc9fZ!A`4n0uqGkZLlsa<_jxHSLE$=K zX~TI_8-E#oxG}7-(p0i~`o5D{zQ^U+X0?2zNU@FS?82_*!bYs=jF~mG|2N+Yonk#Uo38(;3jJ z#a7@WL*?;>h$AF&2Rp>!IoZ1n6L)w&)3=hg=xyI zdHx!CvKBsDUsJd_VC%Wb()MgdpFGIdPmEZ*Jnw7jR3_C)4tXyQE+F2JxjJ)((eAj-~Q@m3|>?dn%?t&BE8 z!CQ*ZNiP^zqGT2CRt#OVP@nHdU0#|^q~Q>K6GaWcw!-S24Z3J~+2Z|ubn`@!;pH_E zb*d%x=;hd=7rAX_FNF~JTT8{z>?{(n7(T$PtJyGeG~OKP^Q5Y-P;~AMG4`=wc0;j7 zC7OZ9Jx4;tx{t8&=;ju2I7T?~3`Km&%_*GC%ths5W|i z5Y(+un;hnCaV|%omc&=rNWo_KzMqj`?e6bRQoMw!40}GwxNas@{8mFJE>zE+ zy<$|cPM**CtpU;hu>c(;(8uCf^|(}R;>~K;kZ4P~adM|zzh!_ivI2w7M~BJ6+#UNM zA18cN#dj*nJ`(d(?|FluaXn#%t>$ffPuYBO$adfPo+<&n>=H)ft@4hL7JQ0pjP{wh`Iyur_2 zyG9vdPFJ9+Wb|G|ID0KbKi`%>Oea|17dp(DIjs1io)W>_J_ikl@aro7oMnGUFZQJp zGyc4^Sfk#EN@@P&w_h=l)mF5p2iJ2AuF(}3wj<$FT0-D8vm1H$MU+L;;ib;8MknU? zw`+JzJ%1SbuTdLIuE^8^M%ucKH;AGO8$ugSOf%Jizjh7b+;ZSnNWc8Cq*2P1ZQW}3 zElzy83vCUW(9vmr1*bSAv$ba?k(NB$PCxBi*V#5(=_7LDT^vS2f1Qe* z+24JHu6He*kFL#~)bz4OFCg(_2Y?;Rb7vRFa+PX-?>**eT>Q*w&|h7`rVDY^KGiUbMJg7r71&F$DkYKJF(7L2`|> z!G)J;pW$Q+6^wU`>5tO5`xPa88KcsNd!DwE-ES+@KN5{TzvPrrx%<8pj8V>!935=% zLF3qs1rCd$^;!Q8eE)MwXX2ZT8E5gf>z{?O zvMz6~z1`NTEmQ}PYhS2n^=kiq>i`ikFL0ubM0&WBFm?T|^W`K^Q+~cF#fFakPH!r? zsd>b4bM}GDz4zJdOae2fCCS22Q@(vxAAH=Ph#I!EmWj5dHNgr1IAKqGk{uY1OU(yN zbwJ6!l{?%iifdP^;R@McQ!!`k+w{i`A9gdte5%&<$=nQ>_fb--grFl$ zW)pOu41--y^PTaoQ3HKGaJGt*(tC$Ijph8>Cq-=;jlMT5z`SPzZ`>VLQ73eU2}C*S zRw~9PL?XA}o{x=LcPObCEZZeba$UPCg)CN!h~&ATIensyx%(Y%T|{427$KBW9)0okwh0HFX^B! z*SPw8sJ0NQi{elhuO|c#J1%WyUCr0DStq}v?buh!UUUxj6+<+DUt!YNQwOd4_p_y& z^NMom3b`)`rnjJuzFi;3y@d1n!&SiQ#=-e*qA|731iLz~o%E8{K$$=%Nr`{0NJcb7 zSp-eD#20qnD-wRLs&tRb<#4Yd+Vb>lbpNA2}fn+GRXfxy&hbCR1VQ_Y#{IavPTS_o67AYyWFmD#sod*b zhdEE<#NNn6KSOOR>N(}%O#{&%E{Q}(X6PsyFP)C@T-+3>*zbxK?oN9UpAN8Pd@S;H zL+dc)iVY?7*gL}d$=n9_bON%gRO z`q&{P#$*V!`S#$m$NPnKY$N|ier;)7?bsb_-ou1@*WKOA3(4AKCa0g(^aUVTmn6dyJ!{{I_)!;2Q zFTr##rc6_wf=<*fZVmBN5asF>9XTvp^!RmRY2?8j-&MCgOfceC-2UC2f#~OeA42yL zyz;s|lt=U5Pis!XC+mamHn=^U9O@G1YnL7P9)LAX@y>g8I!t>t(nX+lV(B znwCJ{(YaI*90a={ywB3Q{rJgr9A z@c83-e9?hhH9Z0z*r)!r%qs|NAzOg1{pVp7Sb$#Nuqy(6N|%d0Gpd7FTKr9C<`h)M zZEuIo4ZM%P347>c_^j`W7khkKXvkZHa7i_DLE33=gJv75x*79YB#L~PaMH)H=C>)_ zNu7XVZKZry6yWpZyx}xkhC4@U)%p+G>ZbTfaXRgQ8wA#XjW59qW)yZWA9Nd1Or%8O zaFaG3`VDvNUl=^g(jrd;bHyTzzfeEBa!@0y-37%9;Bnt*jvX<(eRGUn@>WRG?w28qbGe-3^;@bf11jD1lKc4ADp z-}2KntBgxi`nXq`+&F|iI$QblX~$=6RcCn83S$p2?(Ntz1@}`~52C(1`5Srh_F7*b zf@;l{22~J(UH`Hntwsh-oj${AHn>s|qUd-D#LhWmZazihkz^sp;j~FSzzKFo@%ftO zVV!|1lz0@jNju)@#o2wEl|YNMme*|$88B}le^a~6oau@@w#Q7tOyrRD?s*9)Z*y_J zUN_!)7Z=vr;|!(-#H_;90>k-?#PS60vVLpi42C2J9 z4Ao$d)_f{Zm}4pj+GMd?-&Q;>F?f4>TQob>gP86%5QCfFF%d_IB`zlFf0Uk;r<|vR zx^q2@tkdh9s#M1d%$_uSy1hDoZx_+4yiTqs-oXD2eR|wrMaWK?M|#;!bY9NzkgYAh z_}1LV6LJ4=zQ{;`L8fo!x#frj@f9`Afs5mPgXLWkO~drcn}EwHQ@04Rp|C~yFmRZ- zvR;5?{n6^t6%uS4y#8Un#$xmQ2)KtcOV$e>>=xvC{MEC&CnEVVOJcel+oW|r9JOoB zVz!HTso5$TY281RGL|1XHB8R#(3A@ffpTaP?c|+S!Sx=DB*yF)JvaEJo8M&qoF-|t zK}toWQlc#qWIV1&%4yb!K14|UPA^c_ejQ5nIw_L`Rq`+;>wB}jANaK_r-p{HPPXm8 z5NP%8a&pJ$Jg2Hfw)E&uYrd`KXn%XUN?WjB2ARALjLW5BeG3elny4k_@kjwr1z=-G zEHB1~e`#Wn8E_ZOQ*)xY`-J*RT|(aiwBvVKmQMR&R`&}pj#=IAckNDq25X+`LCf&B zB0pTTE%(FsuKK+Lec`ekT75foZ}35`#1-r7?ct`DQKMn41~>k3!t;W1u5;gUVoB4U zOc7usb{MZh;k=_d@{FzR(Ax-nyBEUHio=b?5PQFYj6)XYmH;?pu9Gwx&3B1y)tY+D z#e1<7%~gy%Zm42$Ylm&NXQ7Em7x!m}CtT(O%5mSA?VFAcqY|HA06sdh*pas+z#UZE z&DmzGC6xULH~!_G;(H=L-CywK%QA6Hw$pZQpR?sp`sz>GoV-w^TOBA5Us&qqW34F*~B)M1|!IgR&rZui%ji8j%Y`|5u7O|>TB9!~%b9_vbg+MiEGQ(oy9aEdc>sXz`whX35iuaCKIXfZ#_#pGWd8 z?&3Um>$tSU;;W?O*jX)om(zU&{|mh*>Wur%{o;{5<*1{nv5UG5HZWQ)4sMQs#laRF z8ZH8MDG)phN}KY_7hG|=_WZXuX#jI!Q{@W(6p>hHbzrAEaHo7DsyWe#KBgoDVIMHq zJ!hg;d)srd&Hi2+CMKZaT}ZY}NV~_cIrZqvm)Nt~wq?Pv^ScbN!nwTjFSmvulgOH6 z3pQ7jd|JfZFVq;C)OmWyI|`M)mw&!l|E!W5JaRT1GFM4Yw8Cz2OwmTuU2 zQN!M?SS85pUC$@uwNr(|i|gUp_Pb^xt&&)WuXBS!%~Ck^p@j#98{pj|zzH+=tb*Wf z@4=jqzxg3nW-?XUY}F=QHk52@S<9n_ol7cYCC=5pR|#4 ziGRyyjcKd6(9_k_KE+>H!oqL`%E%glv*jizE7alJ>eeMqDq|`#TTb5~| zhDZUt?^Df+=vxL?oMKZMQFXnUe6F+o3O~kTYjb&8EGRInWSV*>lJZLA+rBpsEf2mS zKb3s;ct2OVzt_`t#_1kQ`-al&vsUZ)xI>$~ZMw3(VmW@H1iXBZB9Yfs$o8ZM@>+|5 zhvy6X>uu?A{HjumR91QC|H24VCM>xK7T=k|Ei1as%E9yW4mK0p#7E6!Yp{x_f){Jafy#7XsyBI2GI~nJ?va(VY`NaMgy*$ldFuhWa$I%3PA@3jheK3Tm z8vHQ1H`RD>x4_@*1Tw2&(jU`l{fN}tSZ{g=HP(K$_uQT(1(iTRg3!I0ei4s!>sLoI z3_mRyR%hv9r$hDuthRAdd*rO@_c!d+p4JTAAG#Rv0n$*3%L7M0DPsUoWE_-i6}}(4 z>n0VhKfJMdqE&Z+7)!bw0=HQ+6rmkej7);Lsv>2K3urh`#8I;OZT#JgTWdxdLm6B<|Y=5dA=zXw0J8VHaijkvaDQu;ev(XM) zK(ZoW=W=6gqx2dR3iddxFf8Ok*i#1A-yLZbapY%iL+TK9CsZ^13xEGtiTbOB{qJH& z_&?YnO)&odI7pB+Ffhn~Jf$ThBuvcBEC0fYU9Ig9ByK>f_7CA8(j*pL5 z07(B{qe^YDz1m9`#l=I77f^v1Qj^Uh=IQCF#Y|B|qMCxjkE$vLoemF-G$vi8nKCm6&m^i9 zj_@I(>PaZ<7X0XfU0sF4Khjdx$^OtW%x~|)8rQ!iy>=#wr(WD^2|9K{kmQOYySuw) zsw=fU2NPq&5P*2f-F643^&E1wcB?opCgQ-3GcJ9?uYv9SRqS1cy43eA${nOlm& z+#KHXSa77q9Q;`481IYZw_4(_IGvAT?v-!}Di!a-nU{Fai{UQrSr`CW%i;M0M$(pK zh}Lkz*r;CYKo}e~CkBNb6JnNfRhJdgnZg!DmQ~)>FL1?6&TaD$yXDk+fw2qvW_Wc( zp!4*A#jaSFhbY@`!De~#K5K=@BCad)s665@3uRW96w+tkr<S5LOJRW5XP+{YyK$_Sh>J%6GrZ;N>4zGZU}<<>oZebMe)R6PRH5_mLKFc0m?h8BZv9iH~7 z0huCqi^rg${l*Q5-?tMq1c>yXZ(CV z>7gd6kWF1q*$^G&WqEBgu3h37y&$FFcaXCBsJC<;x&@h?6N0-aP|jWW{JcfBC$M<* z{Ek}$bnzJW1kPcD+Y|=JUjFey-v4}?;Z5fud6QGsVne{^!_~y%Htr%eS4lELra#Ii za>;txsPYzDOTVTcm7Zr@=XcXd$d`O**LiQWOG8*^?mYY1VO}!HIl#TtEC{7C64(Ms#7@bm1JrKUH~# zgE1AY8H}Ur+S4~<#2EQuK!IYdVfy#4Jt7a(?26Hfh64y^12tM$76G4%0Ob`@i|oq= z`-2DoUThyzW`XSl?oM*+0J2Dw;%qu}lt<31BNfSb@QE%*gd{+=L!1%{>N-$YYc z%(=&BmK4TBiRtMvUEbPPc-+qz24DV=fJbd~?+kFx>k4>=C*iA#g~u0428lyr|D2Uy zjbfjppR2OrHA|V&S}T3pa+4yGy)9^Lh5*cKmNnAvW3!`^+dB?%+1VNn8!WTJ?2(=O zf&LESqP)Bo$N9*Y%`!=6_=$Nbvw$?v=+;s0K)Qe-56*fYDDB9lQ$|0K8zXlrcPY@b zFx24kxmcs!5^1iB9WAL)+{jS}bpt;ZsGpnfm+zPLutX%<0;>e^7DHvj>34HlHj7O- z-}mGP;}x&!c9L;&F`Vm6+8zT!YX;Z=EufEtoqm!lCSA)&X=;(1`dE&e7Bz{d=sXw% zzQanT{`m)Ff^03&BbTw1TU!xrlh5?nmU(s(a=Am0)o`ou6}^CQ@6RJF2P=>kWQS8* zl2bybBL8W`=JO?P{Li&IuHfh&7h79ihrKo?zIXvuTtSDUU?>JA!w}~wYTtmFG1;3k zHq#U9cxchZ*&LgyN44R}5zCc7O`!YN1xFiSM%YGm|2RsZazbWi`1~q+xlX1kzvD==~T`M(If|)^_|&wjMA( z`lYz>(T%t)X{Va$Nb#iKdfs6Sw>FOSiKMdhU`?&!yrYAl9SqtzUv?yVFeJu_X7iKl zv}n9vL91j@)@*6JsXLN=kQ;D{^D)$Y@OIK=%3>&)R;y|!mT-9Hd}&fQzGY-EULPK< zyD6pocm)utqF==*NsPB_>lksbxN3OZ*}tSYQx=Y9z0#LcgVE|7 zweW7IZ$$|+hEDZa$sd3pXiMu>J5@DtEF_dY&c$8OMRv|d*hN+dko*0jR zDlY;g7;(Ki`bFhgyG6TWtsQgvust%|bb)F4K&VE@~Py_n9d6|H_%Zn{%S=}EiN77DRS7#q~1DY0=7f%HSW>d}Kt3q@Pf=>dt~~ zi=Og7-(qRZqPCLS{Et&X7`w(n8fhu9zm%4#MjW?>9+&i4U0d~h>Md-zbP__-sjkLU zl;!#)l5i=hl?TyjlI@dPJLM4{EoJbVppLGOgmzauXD*wkhr|{Py!cp0+Mx=2bpx*P z7;^2EWHosj;jVCO#Ya%ogX45fI%L^Y^u|GSK6~-*8%R4T6OPG5&p4V!nmf;ank&(V zN+-RP8w^pzIC&zw=2$;F%@kC*ui#AlTM#@inN+tB(sIRdS>bgyST0c(2rV2nrzBF}1a_ z=j?vYyF!E{mI&m{DKcd+YY~R1$v+7K=w~0l5elwY9g?^RKSbJ!o>rWHo?(k1N8|l2@__%0w0MYu8axzvqsH4)-z2IHlIE zJ&~z;nxqg#u#Qit!_wwB5!K;A|01rV5P`HFIckBzR%2wrja>Og1aGSpJwzB(M1=B= z!rW+)h85(K$ZS@l9VTY{Eq_?%_k^r=9VW_i+%?;%b9@k&HdCHUqB zyFX%{*L`rKRJpB{a$P5+TRtw>Uh0EUzth5{@rS0|&GcVB^mF`*jv3_;2-p@zD7U;s zFCz^!3(I@1Vx3|&hP!TgBq6y#oirnY8fdVQ*T5Nfmo@Iex(js*+pc5cGjSBP3-C(PJ{a6D zXC7y!t7lT&*p#Wlm?m(vnjrI19qM|i5pU^bdws^fF-d)k$?&^mTS~&r38UqE3--eb zhHtCKQSUYG^@zUqw-MZo1zu)-SU2A_R;irTwc1;m8&NmKb|I3O)Tu4UesjoQ zVCokjCbD&C|60QQP0K3Y`H?rgIMx_n%VG)M7$6)!&B=oY?c|MwJoq`tmxYH9HaC_V zOkzn>Cjf^ZTZ4FD>7mSvKJr^{mi5lvKQ8I;79R=VwGfyOFs{m+Q-}Xo<v8>R^($JuPglw2Q6vGV=Cvf-cZDBQq?u)1PXKGQG*X z;8r`WBamo~Y&oi^C)IR@>?m5_45@>_fo5n4-?OktN+!^|(t_opT4CBZ4U-76H~rt^ z&VtBJ(*EUIsL4bHRQNxti$zS{q^~Wb`Q;3z{mZG0u<5+8?2Kn1PE#M$u%JdpG!aHV z9Jw1x6%#ZGq+c$<-bY%i?f~4i+-o$Nj7$d{&oaKihM!QIz8UqGNu~7H2nA{Y5kFLV z;LXMFY!^s+P7~C?>=h<#>Kac}4lVP+FJ_f~t7MDd{+M~&R_H%`=AA#Tu17GcA9-Ze zGf(XoM8Do&Of1n-WxR(SX-0VnW(kW$M)X2{5Htng$Nj9OeZUj_)P~y}+SwI+4Z8X~ z*NI7ykKYcz2E*Gstx1Fs)%+P_9#?irJb&PtIYwG_)Qm(+fQLwyU)R80B#OdutkKyn zwgkg@$|zabVWQ__3^AL*zMqe3&vdrMiYn}_X*p_&+x*KfVZG$GND)D~{4!6pEe$*TRO@=j7F z?JVME%DY$Vlcg?(fN_H3ZyB9?Gn<^)n!7mQ^}!a)k-k;iC%b|qy@Qy9*&Vk21|2H9 zL^f!|`k0=MfHqS;-vvn@7ZswICHTI_(JY5C|4&3UOW0L;g>wEACddc;NGuOE)X)K6 zg1IacDDBR1;|P9Se64Lj314^CUFjDaQ*#>dC0mA<4zL+f$+}4LV7%;X*7HQ8?CcNV z#G)lM`+4`}rG*9R%59_o(GX8n&#BQ3wAckO$5A`Rcv3otWl*#;GdCJ8G@LRS*z5y> zOr2OO?E1CZe?up`HCxQ}6>=Cjk-jJMuP-;DkXn)aPI`jD*$-BJg%=*A z?STfv3;C$YkQY4{ZsL)A;%FHAbR5r5o`=CHQrhp?Cs<|FO)`rMU1Rhz`of=YFIFyo zvrBg{rN#c!%B(d`UEo_bUhVCLWcGIA8bN{0_gNZwj>CaPEGdn$Q};(-ku6e+xnVwJ zg*bf?ao?}}edgMcir%b6~ z!lErDf!>hN?(hw`<7bV2eKf+@I_<5Ee6Uz0uPx(WcQO%M`vFDg%J@sC^+4B@_k`EZ zrqDepE?!y}$JXvsg6m%A2Lg+)oW@@68SXrTlUhHEm{I~{9T`q<5&FVDZh8Qs7Fug) z41nu@inLVRj|Q-6Vp|tP2TqQ$ylT46A3_k9rh^L%0mJkP=Fjue zB+E|m57w&P)F`z0M!-hbklF{cSAtYl(v2m2-AYYVa^-2SQ(+JOw)Ybl%)Jxkg^7AS zXtxt>>LF=%&yvjL)Ws=lFNoXDq!uG0Qu6Rp6MET^a6VVeXRoT?dDNgR}dp5Hym zrZMsPTt39AU5-qmPp?kE#lCR%*e2Uq@VH`W1zRX&CPhZq;uflmo6dR)@R>NHnf?N_ z3D3LqiD|BCk_g)BY>+eyp=im9B~8sqNA&g9E$cRCz&Dr7HH#>P;Luhn)(->FU( z0}~!5lyp9pl9ZnhDHU~MMUHjCtEP_n20p9)lzdWS6f1YBq8Pl%sm$gI_MxI%B0>%5 z+(rtK-FwO>T8n}()^AtO8uNwkv&oT>W561rh>YJ}IV(Q+4lp9- zG_Uz~9~M430~c-H%`1khplLXDv^74LFqGjSU3KC{zEkYJ=Z@u_wSYT6>RYRut_3%S zTNv0st|0fpZ^oX!5-XnK6c;A&rnqyLvMPs&$@))HO+o+rsV=d zE7d&IwQ3Nbw8N$N2aYpojO7}C&+@?x{&)T3svic^mPhaQpS;gKXWOpGU5kLLaE1`6^YL_0wiw z+)g%|(`_!71-0;LUhhPQ6t)U?Pl(pjy6A#D-_S^@hc2ub?yQKJtKMWsxJ7J4cyZFR zS=Sz59UICHS4WOp>fxeFNAmBH2KQpH>rtY77n@UF$vka=R-AguM-|ypAIUw=qYi0ao^UjSx$rLP8U!tq?!Mugb$pk(4$OL-(O`q5 z)I)T6k;70loMw;6tnc1;vh`Q9b-wyQ^P2qT_sHk^iVq;~vhUhd8MsiSy)6q6XMExN z`RhU7_^{9!AMDQwfIl20Y|*gbWb7{%DgUg(D>v=&*weWu+T;aBYD&K*KhAOCMoFtNcN1S^VWnrF$}fd z`jLMj%`~?UWhVtbriz(T4Jox?qX<(v*!j2U&6ibznB{$v-Q;IKL@{?^;|P?mKQt5+ zpd=)=;O8qv{M6+7v=%knlq6GCZ<0M2<%**O!M$Vqsr)n|IwPv%%D11vc%d1<*rO#* zdQvq?C7dyIbvV7Ys^*HCwAONTchBjJfF@9zqlh+YF_{E|e_pOtph|(Nv}s21xSF(u zs`iFZGyztOMUvqksGC6EDb-(7lU(K{<|FAYtji(yx?6k3!-pu~-ZyWegrl2Q5S~`d zZp9P_5i4#@f7>{CSGa|is^sDY%dA3huAps|L!fv2qvOy;bpJC(*HDBvE;F7T7N@pE z@65s{3tJKNlH+Jr4C?RJ#m~V5Ps;hO$U^CuUvdjn2xoJj%PF{MD<^W$X<&VuD-H}1 z9ma&ESB#!N$zkslrzK;?XcZmT-kYr84ja831@T!qT)JQiEK$tf6cZFqa|&hSPku6X zei(N}gpaLy_AZb>Wn0eG3(@8xQLWdvs9m2Sp{zj&Rm*i}L9X^7Q|DJbncs2g)}1vi z8D>#Nev4HJ>~63s`nk;0MG8_ik5!)2WKZ>Oh7iiWQSW3MwqR8-N=nb`PW?#{fB0IU zv#HRw6l3x6pO;~ZsO3=R-aL)ql%p1-`BRv-t>ac!42sm!pW5pZ*6OPy`mCls2hvq2 zf9JtW{cA^QN*EQZK<{p_%x@YzWl(;}DY-Ev$ZNZOt|$R)jm>L>}C_1~3ZWF_BXYV+kF=0$WKUca`|4bb?3*mb8HI%mjn zY)B-MIKB!;tr)vbL&^OOM)gC|5p34f+MONjmyJ#Yu9UKOe-w3yS7t(eMRbyjOUcJw zxKaX>lPqzV7Od1d_0}Gr#%M_+t8$ zAe3E;mdPie;a+LfI9sA!Pd*hG-i8=QhA{FADL$K|$hR@GDvcy4&v6a)L!V`?qzIc; zN@^2*w)cND8e`X_gd*=dl#CRrOVTeJJ>K*kCEHFTf1F!v>^KC6yC!0r`>?iMJ47zT z!JywFqZ5-r%^%T9YM@kwe^*+XIp&4en4%G-eZVl+=;UzYl^YIh5bndMfv1_3vk})i zPLoVM*@BbDxcW*!4$dWGJop|Yv?h_h(tLS#ab%@%*sx@G<)K16iB`^cW`uXy@#tqe zGF;{}hAlE8<+#G9j4L6l4AMAFiN&p0ewJMfaU~S8@p-_#Ntvh+2|1)6{cD(oUKI5v zK&C2h!w;dM58s?A2`wX77M^>wiea-7wAcP+nn*vJHKbKxVltGJK*}(C{Gi9`h7)!D zVA&+-bqARgP?~8Y27EJ;mGWwJn#}f4VnElbtaMK8!1WVvficZ$-F5y-{=kJ{%&G2Z zMZNr=P^5;zFnXWf3ObRqC@5xiN0M<->EaDj5qDHm_4N=AH@XG^l7K63rId=nzhED! z_Yl5<3F}Mdjj53`AQw!v;a+*mb)IwaGbSLhK|a3wgzUp8)Kd%P#$3;rHl22vpzyz0 z)a4PU) z3^X4XX(r20#^+$n{Y1NL`sN1FWOW7TFa0ZDHbb&fjjG1#jfy(ETR zxrwiEG`mA&GB}W-2^OiBpH{m(b^mC62B42^5BHy14T^CFDoqYXKC#h!5B+q%?%2iBYB^3A2=7uU?Nlg1$ zSW5mLO{+)+@*{IA+}o2_YWfAR4A+FvDub(8B9shV_Yy2=j~gmxl@--?y{yU$EL~j z_Wlq~zAy2)!lD@dhuX>ZrrXM^XYEP}T8dJ4uC6#F$-RYm6(FUI)LeNw7j@e4X&J+3 z#b_1{%Z19gHtL9seW1YV1S_x-jR)Tay<~5Py6Y@djVPnyAg8mf#mQShZ`#gv*@9u& zm#7@*ZWzIrho<$z!T+Ll#l0@KYXUmJB8wlEVE4 z$*(RoDNYuE$ROD!`cg&bIf~8Tdn~plC855%3`0b$c`eIsA4?srkq_2rRM4^H;cO@8 zLONcIivZ}#yvi(yCj9l~TER8jQAFKEXlIOcg2t3`k&b+iJZYJf`$%S9GRGyKw}8zI zZwoUH@>l(8uDxfLEw^wAGfIsW#Ee46FLu0=^Dt)cGcrrnS=?l>uK3htqqdYj7w?ci zj&j)UeT&v(dB?@fmQo?*eK(mgP5~>ss%`zjIpW5!qZcnX+2~M*aaMk zaH=90?bHGy9r-8Cq~_TohBC1)(hnX5GPp`5z48;7_g5P8FrNZqfv;I%3$s*Hk(Hmh zhvvV^c9}~;Ji}IMx$8SqcE>_n-$$X~bZ*JH69KE7HvT&+^si+FY2ISX86JRA03dB| zAuH9cQO|6shXSw*xH3|wK~OedR)zAU(x!-eQpJ zB!IiO&FOA9pCuyZMQ!w|{J^JWj}2Ei{Co49fD8WAx1=JX+K|+RG+BT*YF4qTW({1W zqkEQfLi*!-c#pC})}{r~$Dh_J`YVXIl_5jl{Z>lo`3z=>#!1%T5$t`p3W=vbpNn`z zAHX4a(p2%sX8UsT;^l}8uc0}pGJ-VbuZ2b7(IU#SWtkUlvJr8cN1UWiYr$_PQzd$8 zgY3e_(bjxTFX-btBI%ZS`(6S}XsGt2nM8mtB3?M8|NapvV!nidzP*oUABlC!g;A_h~8T=Mp@3 z%(u<0)d+A#qWHA+MVVJaOdDNneaH1WJ`(26-C(!hl7hMcvf52JEE(VezelxWEpAd} z6G9`1M#4@kT>2Cv@+;#}4c!{C?iwMEk#ocGiHiV7m9|P3k=mJV#7_aOA{*~k61MEF zci&r!gpLSeAM$GZ3M`!n(_^TPI1QxfXK8NUOXAK?)fg(*J^rF?YuPko?5lB?=xLoP zjL1vwXt>)%Ib-Te6g*(sbj&tD0_u+F5a-al@yT~wEJ7?@#7T_y?=NX5)%VhQLJbs%n@ zziZdi{8g|Y)*GZaKH6B3)rKZ6v7MF5mze&lH$P)>zqCtsS{VW!Qt>?^eWRbtOPqH`syq6vR;AYl8wDS+ zHm9AHFtPiN+NIaV|73j!IwRNyn_QFZ| zfYq9!UQEB*EsnBbxxulmdOtCnB6*$LF1qcmC_R9k_kc5hb768)IkZS_$2Z#VIQ5gA zk5mtO-5hh^98ODc0ZHzXeuQajq~t-3qyO!FjeYEZYvtt}A3m4KdHlZK?z=dtOS}@) zD*@5U@HuI;OVfE&3QoOwLzM%88;$adpm|7Y%jTFGAR8TWm#$|4&JP%GR>2-siZqv_ z2TD9ll{{SAwyouucIl1Nr<~IBJ|bNvcMt%Owch1W&N652*SM4YI7Xg zvY?HfttlbiQ3n>=4t3MLF17#e5q=(*678wZW;-f}ClneR9v1%g?VZ>4z9C52AVXp| z1#+va9l;d#&-B{KrDfBT2TWGG^2h;4aE^vg5=nXp)h#5mGz|TzN#H>HeH&f0MkI6N zGQs!;OL7wS!;2cX)y18h&;hjZUI|BhaDlV*gH!nRG==4=KFd}Kf8$&X0FJfJBMC5d zhm4E61DT$2?*s5P-kwpDTIlADHw6b;3U0)0 z>o9QBSNHybQ_4_0KHy~ak-dIS$>^rL3jWW?MOn#!;o5q?Q-W~FZ^<2a_6A!Hx31=^ zR6Chb{O8-Bhp){Ra|$e}fsC~Rk)Gn6B-&CkkSvsuU{huKt`Gi{9PX%di|}MKWR);S z$_!iSKP!>`{45dvJ?$x^2KQL3kz$iNmhtRW>ke8Jg1VZ%2JX?rVN_CFjZ6+ruBEaf z)w`$?%@B!v5!S_xB0&)z#I;T!TP`UtioH{$|2qp|cysmRqJ?g<8yr6L@((mDG~u!0 z{ON}YJIubTauBa#)d@|Y+U)S&)Z^}^U|+Y2*zrl>!z@uv8sq=PV)8AEGKfdM9; zka8q7T!W>LI{>ZHNGG13@=7^Gsd@kLXCi>kWb5x>#ZMY{u`p*8GLE5RGq=Zc{ zrZyO9dLMpzOy}N7XZh^97a`pj|Ak#bmpiP$_Dx9KipefKOIbSxK8F2rp;&C~r+dP~ z7LApFaEsXe0pX6PDf3u^XhC%}(a5uefbd|6dJK;U?f0C>F;L#dp=Y&Y3SUC`xeNnS zb#CMl?nHTn8i0pT-FQ-S-ytNt%q|6I5BwN$0ysa|`aDgVzFqIs>9v9dlmfQ+IoR&J z({?mch)vS|vsH8pr?c#*W2xSeU~R2CIRVz%S(-Z=$qN2Vb7jXJ?sJ1e=(xhzg&j58 zt~^eJHYwbGg`}g*3uwRvT0$PT@2|A$--ndC6w?(4Vl7`+f$e#q zSwU_Dr=Lg_%U*ri0U6~gSbU{FdkGtcHHT_0g14*VW>okuov_D9Xqmu;xPI ziy=@z$TtvD%DyZ;l>gH~cKYtV;*f!<%=Ag(#=!Fr&^N*Az(ZxW-;M9j1Gd{B=osgi zPyl;XYlQe1yXCk%qp+lTboOz_?&RVdaB010Qk`_pyZ*^{=;ReS5<&w@yF2_>j(yV> z0WGF%R9z?7j5?i2kTAZDx9f27d$Vh`V&|2f>aIOs?4q!g#T?@kP^o4T0?20v)og1{XzQ5 zh02ma`D!FhZ71zIZ&=K7LU+Cr8AH*OqjPFV%uPiNt6ffPZqg{&q+FU(AX9@o^ zp)l>g(Y2tb?3TQAxuNlRRxXI4S%2IXgh9?#JV?A8}r`2Nf-re1u&9dNV zuRT9s=-@z(L(SHgSI7i~$-W_Y86G2}@CN@!FGrB#pAIDH94%VQm`mo*os6TX%666G zecrHfwH3mn=P%ubo30+TJaT}mnDiCfqXDiT8e!LH5!UBF(IEIs-FizN4368A&HE`) z04LnYggx*V1UiRa{QC^T;rti$x;ije)qhtj*89CMpyX3Abc%|##;FEW0z`RAyg498K$H&ps zvYEfv*7Rimk^cPKRKc>Uj!tx7;5!J3N;xfP>t9&kxp(0$EiC}YtG=BW>3Td-$MHjh-j-~{YLtqK z>Jaa*ss2+y9Qa9e zbp7X2DyWdj2%HYX72{At-(rjx0H+c<9Y0IvznfnyhwyPBp!LF7efaMM7(-3}(BAO1 zC$S7Q5EkvDC-3>-Af>}8 z>xU%Jf7&j{?1w5S|9WE&v#~<`Zkiuv>i$sdxuoRZ&0&B(LFRR4Pp$Fn>FNSwsBEQP z|L1lMhRjaH^>X{a`}qDT|2oTFzc;dYAw=9$G zW}6^8D}sO5peSnuRWFP*m}K16`*0~nq^A6z`)`E_6ON*hrRo2z$)5!E)tnZ!!ty`2 zi#-CmAKu2p0?NS$VQnF!wB%n@<&bJY3|Te0?WyIpj3W~hYWkYMRX$vkx+0eUS& zTbVLvqa-#nsmq*-gG5>4v<#8q*@?U@*9XQ}&yaNN-}R$N+4fIX@XA66)GNV$5N#(7 z+b{m(bfVd&f1Tk!rR=ArB($iSpR-EI`fv9P{yPy1cn1H6 zw{uZ9_)lFB*J$+7>_5iCL%n6LT*6ln3yN;G7OYL78~YzS6+kTbg5EnR-4({{Tg~&Y z6HwsJQ#34b%9mryqS8FY|BPQ5`Q`a}e~0;QIpoCRwAVq%iLw821O@GXabf^2NG+5% zcgXPQXRiNkW0lwh>f#V2<6335^4V629$NIa_a8B%e})I=f3oBMe;h2r!o#aAMno1C zZt;U6B8`Es>D)WyE|xp*z47%J8O3iyUKUy&jgKX#cYY~bbz-GRyhfFa`~U!7f2=>& z^e+I<`hKAyfPc#$KB0h!-*n|Xj6?;S1iR6gNrr)CPhkdRm@H>u-w&Tck6G%JzmOoF z2S?>BK#fW(#`~gPAjBDq#AX)H9qe*)P0sMGt@1S4MP1}PPxTJyr70vvT^mPu2=4GW zxzfUGZ7g2=6nbXrcxk`z`d|BADn9TkT9y%!{(gRl``PYH(87=vWI0>1H8~2AGueCf z*q)RJzh<6jW(|o_MjsLeD89BxK3?#401R>UR-B-^Q(8p(e=9^gDKsipAE5t%Y3zG3 zaHqu}eYVHlwY|q7B^nlQoI>PV2fdg5c2(`#wdP!F&N=27?HtZEKR(i9;r-*dfonZr&vMj1ktD!Av4k4kpY2^?p|Lqu zS5s3%TWMf4{Sn7fG*m*!=rA{B()eBmL7zm=k3IzXHuv@3z%mA|(dQ-P#qOlv_`4KR z*{$LIiibUCDbfpTNZ4J-r>x+$*Z2qDo*z<=IYX%~*ljX*-(MyLX4`3BJ%G1dEV>VX z$LGMpPyQ8;wCa%c=#oMyzK34ho;iUl8y%u_m&4u8t*$ZH z>sB_pv`bjh6}^`pKOfy)9Dg-MzhK0@10ZCCitKg=7{lEG+e`$wQ_~Ha06MN5yZ6a;Td$x<)7El$U?nna#Zp zQRccz2J;&<_rg9s4ZG%BKVnD#!;=*N;Uv23_ck{AeLh8|2v2w+uP)eW89K4LMD5}2 z<#Xoz_a+G06X?+j6+M2h0Oe6?$gsT4r(srWUo$5DtOtzVj`7HY@_xH@$V{vk#MN^G z!2QwHRvVOG+-p_dro#i@@x#2Mv7UX1(>1@iAbDYWJ%T>N>*w!>74Z;#>Y+`6J{Hiv zPlNd08TkN%kW8J%Tin%JhPkbQXv3S#!&1FL3RXpK3Swk0E^@=VG)kI-HLPk^ZQ3ow z=_O2J!CUGVw-)RcbExb+z0`#^^fcW^9J^QVQF3O}{`Lj;FKa&u&xfQ3LVOMun0y-} z6JQG0)*(->&@U?QS1i6OKtB?iN798F)ofv$Z}`8zrr`^;ikV%9VrakAC0!DdI7pHH$Tsqtjq97!Cbysh6YKP1 zxO~HWiX7QB>|w+ONz6x~bM)kbc_kXfKMuY1s0KZ$O}eW$b!ixVF;u8OjSri@Jii_x z+WI6(Ihd7OBT2H+)qLjXhsLcc1n#*gr;nOn7)llo?`^O?CDgpHb85&%%>s3gJAkg!&QVsIIn5ezdTGJD$ZpdBKcjj=#g# z-6-F);xUEN`tbTSwNoH=1b$!q7wnGB_h4P2tU#xE8sMC2%9)z3#w&l8xAoh?@nT+g z>cyWXv~vMEfGr`820;gLb9kzaL!NTguc68`Q%w4O%gccNS5-JdEh=vE_b0doMrU`e z8##&TewcKI3O~B&u=9MJEqEn<4$(?NL|k~eq8{tu=4{B&C^{k@@YE9LNshvZ2RZwX zN3-1*dbbvQlvn778A{nin|K$CjVZ>y6N0vQA&uEBHnen8K)1;QH9UYg(Dy^~<5NJl z*xz^6jm2Lh$^XTDb6jlldPMzxzcw$ajB{O@Q&{sm;}0dR+{EF!kI9M{ElO&hVmlqu z;dEA*dq5e;)5GS&d4eRFC`?RCi0DX%q#2nAMN8KJp@>EsyzPNtef!Cs z=UkQjxKPt`1dEEo8NuGE49AB#p?L>ZF?#B8B==iDA#lq)_QNCXfJw1V+Bj|WM88UT zM|s)(SpAcuElDj2AkPDHHniW>%9qYr)LvF9QD>}AFX2G1m2{cHSp=SmBPYJ>qk@XQ zTKCcork^px<#5}MESy3Y10J*3o{Xh;7HP{SxzrB^yMa@GE>yWz1V6tr?<2r zFrDqo(QEM}d(!4bmJE%={vM=@=22I4JZTM~W76hrX$V%Huz1ZNpe((>Q zeZ=A~R}7h&LMxL240#v0=!!Bv${`Tp2jO*=gI&@TWHx^x9zal8m0~)bC;FKG$3}|D z?lc>LZ4+YOVZ6xVGV;g=l4r{}>yIeimNKI>65hXH+iTdM$8DE_J@7jFYl-|M8m&+y zZ*C-DI8tulzLAlIa&mr<-ND?6NcwE!@yi)r{y_Fsl~9jAzG|<-rKuLch&kjl2wQ2} z>hNdo<$A$FhEcv95R5HgBNCpzx~bbS5Zjtu!;8M)Qx?<-ep`SjPO!YZbSNnC_&~~j zaT4CfkX&~+@(zRjR?-}gLu4HAF3YEw$ka=nzB$8C^Kj;a+_B5HCm~YOao`nVCrv9^q>m>ct2%nMp5dGT9JfV zW+J`#rWz{4>suDZ!SfRF%pNKHEiMGC1ji#ep;_JVd8dKTIN->X%RbTew-#&f zPDn3ywrs86h{V!R_vaHLXdLpSHQ2zgPEzIoKzYlUx+a7z*y!=GQ%lM6w5bluzMz~( z)T>^&I`dOp2PVws%N!-D1QroLEAd+=!uLJJd$*Qt3AI?JLRD@+psBHr^0jD|IU0_VDwOzL#T-zvy(<)p9v`p};vn5=otEGI?-LU*IDxwL)%Z z;eP{}w5}z4ti#OA{AQKRa|1SeV0V~yVGvp6D}P_DOm}6O%$AJ@aMwkHp|R>tKkI#q z_TTZttQ%)QK!9o^{vHr$uIe@x0uDmUW=)(sSS%ps5D*omMx?uAEFv#jc-7`#m<`yc z#z8?cC|!^Ga5tbsrw$6(q?Cs*tw~%7GG3d9_PPLb25*v{D z^+MR6O6Rx_nT}3Eja;w!hf*rfbF2#Tc6w=tw)Co{KaDSNbbh)znCL-Kt; z8*tHi6u`klLo7Vl4CNv;4_@zF4n^+!mC%8wa8a4ssdR_jElh5>hMeO3KoMG)x>iQ^ zRbciY88gzve$pL>dV01Y(p)WMh`oZsPX*}n{^n+a!LQ^TSN_!#p-j0_eX+OB#nb4v z_5paB9J_5r)T_N-GW7R8cKiYy<;<3SKhzj)R$9u}V&VBu%tm}e0oHPAvZU2}z9*?4 z;`KN2)3hwSruy5d(%~w zZEg0DHLd(A6gDr;`ItLCL7|xD@326824zcsgOZ&h&~XZ{w*SIpJ=(AqmD8I`iyH9IY2uzzdxlX}jiMdkOjkB=dca=e7)C8=H8L_5%#2)NVM{M%8y<=O)v+A8~JzeLnrQ#JTH)V-}^wv;1DplTpbj} z;0*CZn3N@4a^fbTW%YUthfk)omOnX#&w{2s*v=E9K?Sp-%+WIK?*Ys9;{)~4~cPKyohXX+t zoM}SrC-cJ(VMN-mHX4P|0C-cVl|P_rW<6j0+<7sl2!wT>hllgi@{zdtt}tld{-lUv zZ;Z9a_=>iz<{dryeU$llQY3Xh$5fg7%UT|?p+=kG@p?0aN=kV9nNReqp0nr~5T>R% zFipNB3Cz|miy+Fnn#eS^yo{n;%D6c*9Jn`GhkQ?> zQKZIKFU79QODbaXP8dV)Bp>?vb0BHx#zVm9H=HXD)1MX$>p{q|T-`sU1J9M|I1+w! z)Z8C0`XqJgBY@GiMM&UM(jnY_BWcSLX0;XpJb zO>yzZd4M}*F3uD{Am}qk1zP%^#>+RJ~h(1*h6!VA>Bm z#sQ-L+hvBL)?1#nZecjf=u4zNaiuom}qcb=p_cNNgn8u9WU-y z!&apH=GFe%wun+uU^ixvZ0QH}gA_e?VxY4oYjraUp4+oOq~_>kkzHBD4~;UU_g2vP zXCR0(-R2y+lcF8Du9}{K_lFv&Nq8R!;W{Nt7B1I6A5R`mRhpQ6+1w-hX@?#m4QOST zP=VntV=CK=>Aq{p<2Lc@Z%UMn^ z0zo!rIEre#a-J)(9yasw6<3uSMqYH=82H`1S3CYC{8c&r5gN^x@9XFw{3Lrl+d#Sx z_Y~OF;3XoU*&uE)ItRa@sdtw@&*n(j_! ztd$nt_I^#jWLbGF-#|C~lInTXbr%?I-l6#8foB<@QRIw?UJ;Ar=v?%N)otBRX3|2P zvG{O9(Io&tUX!nB!Z*s1YUXF3gRa+^(m%g4^xc(cR^Qo$URc7V@zPPeW205=U=WRq z^5AfivNKu1(e=&@h)k(oyvDY_d8>StF$oB?aM>i?!765A_|=n6WY-mC$Cx^DgqUxJ z`L^;DbN0uxR_`Dsa!Cp4YTsTRj(-zVNIDcKqCpkv6oaeU^a}cuuGd>w%Lu)mS^BO4 zOhG-%uMpWWt1Lg8P+;4XX?^5#EMh=>>>{NIgfGhGm&>$m$;mO}m8E2!>Q^KQ$0tz= z67n{!hThd|mHlUfM_4oBe}^wd;4S^vLKmmzP2SQ)4C9KrhKAt4KydMKK$UpZVyaJM z$O~lL7E*LR)wwQmwa9m|!?kr|%W}*gWl_~(UL&47!sk`Qc&5+QPwZ$M_81eer!wKw zZ}6l#T9j?7G9CWQ^}+Q_d_IQBaG}(g!;Uq}dw=$q$Gd&lvU4C<*!kgE|5W@gz!acQ z>w_5@V>#Jw#jaH31?f7}U7UOYAalz|DmZ=vlxEcyhP zj14LCpj(h^4-ALC;&YoVIzKB0Sag-HQ!LkhUY|!aY~jIU+W*y=$4l7NGwx<|ce;AN zS0QbgX2Q`(;Mv*>8~l@N+I20!>cL-5<-T4KeavJFO=q)!h-n_X7TVr-=^eh}0N%k8 zfB9DxmB2T-q3Nv1n#oINY;ktDi5M#c`2Jg@J0;uI9g8HIPcfHYve~qnAtWA>0;Bg* zK`(QcpwV|CHtpxm`ShC}?}ta~J&Gsv26|qt8)@CmlwvYax$DBO>gFCl1@-w9DAQ15CN41L5vY~>2XQ@Hd z(DU6#`ll13*j=1ukB#HiSa;JlY0ch`4=+BiU;V$vRvWIcg|z@9z7^9jR|XwM3dWkF zfHEH2*4Dnt5^kp69~MbM$d&n})DrfC9Peo*$j$B7d!#mT?x2%@-H=Sl@in*H%W$<< zo-q&Dr#H)~*@b=_blSDK-`%*G)mJ-A%=2@?`8h1oieTFUz0uKvY_zSS%OdZg?kJ(+ z!xzRwvvBY9!TWJFwn%&Nu#|I|@5{OgLeEpG&XJBSS9SFVbO!^hYCPu@P_k%b+((R^tr_?1)}T}4Mqq*9DkQcv;N`Mp?o z(IwPA^H1NE-diLF5jbT_K5FXbH|}hd-S1^$?>s1URZAt2lVLUT=k3XfZN3t!0@iuR zl@Fvf%{ZYEV1PO534<&ciUR|8Et7YrwQw=cpGBu5E@ zrERJ<>KYt0j8Gt!@2_BW>aN7DiJq80GEmb%>W;fz_^Uw=SE`9GB?_z6(D6R(e;M`T z1oBcYy1reS+jM`Kd=o^|LLV6eC#Gn@+c;?a8EVtfcQ9avl>Nj(=!1*>gbg02A;8O7 zk}A5qv>aLvk^S~20L(a?+WI8>Nw`N_2j3L{$(<+%DHz?>H@Ap-mJHqnM}%2ycrIb^KTix!Pu|~u?y6~uq7fna&FhL zA-(r9=hi#<*+~AUKy-);8MbHq6!uE5Uvd=uAmkOdXiA-xHr1qe(_?LA7P+$Gje(W2 zvDBc$G24DL53i`G7zQTH!@!~upk4vs70yyl+tYH$NwQ7&R;T6D(zDa7IrHMxw#U_l z0$OdjpCI`Iu8O{W)=N=o(8toTKsDB?Rf0dUxG9j)E`EovvsoEqWX}CIBfu&ART2Gq z%YLstwP^3f+=}zIl@Nqn*j;I4%-~#@+mATCZr(QnI!Yimk_7*m$$lw`A?sXg-*f95 zY6)a`Xxz1+zrXlE;mwi<0~FH>dGykFq3f1)dd!H1g|iVp+VpsZ;u_72D7g<;W9`Te zrM_x{F+idh*X5x#4yW$)1RMU%vJ~glG@_3!5jH%p3xX_}C#iT=3oO#CAI>`8updQT zs6w54-Zc{?@O~iM^aDk`O_lKq)^6Ia>l3Xf;)N?SuC_51x^78}v643|&}#{D=O_Z~ ztoAiXA@EWTb%$#E_S8IqcT4F0@~u%xP!BHsSI=oAE(%f7c!8Cv0`%DOSZEiMHA}!| zarM^Em4PL6ZU&t;)LDM4E5%rQ%*dLp^(>W{VO$5-docLTOW3{wOWIGmf7XM~eAvS6 z;qk}oHFst1I_K~ECqM$TGkjIm!jX|!tZ}Zl{I!*|J`Gxl37Mg?SXIPq+YxB(C4QnC zjF5UsU*j>;JRi%dO1sBZN*?jqN2?KqSDEu-5tN&|>tf^U;(O#mT?)wa=$e$=2UiEq zT0P#>-OlW|-fx@W{B)`?->;6x2ZMW#vFAFudiYt-d)0>)if=0!mkCy!$dT}3BKvuY zsS0uU@tc!9K8*X+N@JPp03g^Jb;S1>eXGY`351>sO-n@|Jv2|6SkgGT=EZ6mLL`v7 zub%OpJK)ogi1W))@Qi%BX53r?8XbsU{7ooqCWpj6ffmldnNW2a_!9L#BK13&f`9^f z-JTkAV{M()E5t0e1D+O@@l)W5Cyvmmd_OElMI-QQCQRR%MIbOokWw{)?HnY1W6~np zR}>lDqzUh={&!Kb*p}Jf9ML9DIdy2X*Rg+sZ+9RX%u>15o@L<0~VYj9|H# z2Hytz7HvdLbHb4ttrz)5(Pq#%0bc`F`^;+Y#I!%Kca+c$oT$bXpZA`ha5AP?W|AQK_Q=QKpGgO7Pw%1%UM2W2trY+OiwDij7MvJ|o%M~My+T;v-Vm;|7z+iLq7A)>Wh zN_P-SLD7;d)r^U~cIOeJ!@*nMaXW2~@WydqC^LD>Ju6 zL?=xo1QARI#BhK*|vXrf)yVBdWGY}@}TyZ3es2s4iv~3v{SxbC+s_vjKH5j z&IUOm0Z++XV@6~xs}}#ZOLc5vdNcTJ!W`g~7Zf4R1flJ1>u0{ETWo9sIHnUG{6`*@ zl#l*y7xq_jikB`QrJ}TZl+l^ZflfyCA`bI zdlsu{FXDSj+zw{w;e|31$yTG57x>Dto0$m?D8fMpVG17f**e>K!5p1boM zRPza!w4LC)RjlWCfsi@|RAS4A>|C$Uh&pWLb=+1|dbsf3=o}bQGvp<^R-r6;3X%oR z;BblAQ-^!Wvp6m?7hi`TCvdciKX7<=dUg~Ya5-2+H%p%LKnJ?Ww+69NA(agXL_}Kh zX7snetbWn!XIHS1^k475o7G;It>dO(z?&93x)aif=!3>88Q?&R(CFxx)AS&rSB zaWJXRQ0=rjFG_u$w@=8*Ld?*LozM0JXBjbB{qIRh(;};cE-&P~3@a@%-+sNg@A`7j zJ@kA7eaYrG7|XYHkz)-x;h#{3Wr}U*kUh`u#2)2r7NK9flztY{}(LU&ViETxS zpD|zI0Jbxy@mW++9*n^^1z7pxrNH@EEVVSLlBqLVI?f}l^;G-&`QK=$ijei^wG~TrB5~%mXj(0U9Pot4n^8lPk6hx$mRtt;|`uGe-yk@)cTVCMz z0Itn`dmC2%KSry}UZc83U73M?>uCQq?%qSA{PSU9KS}?$1H5mqm9IpHmDbI7cKzU+F^qpqRpF&q|9S_Oy~* zdoRET)+jd@r2q-f*G*Dbk?BV6&q@Qv;idJzF~szSUPpe7k8J){MEM_N)avh?L%ymX z0#ajt$=UWd&C@2 z?#7hC7=8OzRX8g}W9Crv6S8|dl;lUtzaVVCW2vn$Mlr8E)l-(^mF$ATS(T#oK_|b} zuVn(SK}mnPPQ!(JUP8t7{}9!d!h#ps31|E;06>fU-V}G3#C0lc~DvEM*<_;t?t2`2Pq)KuX-l?{S zdN4B_T*JWlr+NV<_vRkT=|bO~3A}BUeWB)vT&V zJ1^7W{0!M>vdQu<{O)ffne}Qw6)HPrU;T^OxCYJ%GP!-r2fzI|V8a*nUx32V-@rS* zu*gMWqqc!V?msCxFiIHw{6!&a&E0m=P30r&f1cL;@}?#S=ZTl|WG#C2kQwl-iXSde z43PfkPJXUi08<#O z>=7#i+jz<6M4B+kmupIV3L=^r%pY|J)_;=au zFY@(2pjnOr)iO2nrFt5$u_awx?T>FSHCQ#N!7oV934i4^KUDYM1(-RSaKtn@Q z)X*p{L{YM_|5J_o15#Ha@Y)D~iLx!d;rfY$g!F42OizF>=#A}ld#p477Jer6$iU;W z&EQq@xit7CMdZ^*ObRYN{+av5S#cCdR0>(YA=Sh@Jen;n$rRR{wkyR@$VA@fA`~Y@ z*}lpzztFgk<|>TB#Yru{?exZr1VV2Xr06ND_=DA4bv?K*SKZc2Xm|?`9yiDW!^9hg zm)?*r3%85muXJp#${^|4*QlT$q27I?1|un=4zbva+Qek*U$1elpRAl*Ry6YD<#G-f zLxkDz?A-OQpB`E2W0eQN>)=NcyO8~n?}6a<_N|JhHRUN|7ZV)*#GTO^Z-!}OW~IG9 z-IL*ArxcH&beG-3Bj4GEWzE+KVVddgHVx06MFiS0sY;tHE1Kci6ChAjOix|3GP`2E~tl<8+ly}`5DD2yaptBJv#>=_yOD`evoI%25T z>)eh(WrnXKpT#A1Hz$IszI`vEltEpcd|(pWu&TC7(Ub2BcwG)DH|7vIf7*8fE?#>b zXL+LZTWXzL^#);?63<8wG!(lgw|G-;7^Fl-jp(dcbInzFx%4SYlZ+9qhKzIek;%%n z8qN4nTg}V5zj|?uj=j^{5-sCC;;+4blNwg6wS!oV0Ci{=W-_~LmhGcPqf0GIiVKJI zVcsx-YWt*VU9FUL7>%1%F1f2@I6iFqsqIIs7fF0fW}hD|!JSP%NF)pn!QV;*4v9Rg z>#`j0&})FVwW&WJv_!H1&wU57@b-H`;M8&o*qDH0a=Q#l=d~P}@>WfFBxot}MZKyj z{JuHOi(f`$9X(^mxl!U|nX8HWRHK68T`Rv~w_k6W=Fy=IW7zJ+$cf+P4{50tI5AAL z){&Nb-$ZVF`dQsS%`{xF%2daV-Kv06P1!%ADk08Ii@>HhjVl0yUvxv>6hGo?~oCOBe3w2 z{Rt?N8c9MFq%Y`%T5Lk>vIqHsfBEOQ(4=*tOdL2{9huj!cY_BpvhVgmm8hxA(Tjtw+S+=imFpAB}qtimR+ zbd03XD|T#x<hkTpAvRC*XBfgw||mk!Ob=1gSjcmUUts z`^xp1_QFJPR-9j;Pcs)35oxt@1QaR2T%WGKL+0X*T{XM>mS+lye{oqXeZPFp_}+FE zqtbR1b%6y6+1W18l`6glWQz5Dv~7FTp<{Bfli)2KqUqj|TJicM>lLwJXK~^8$xaoh z0hlI#mAR^W?v7F~GUO40SCq%amylTHsxpf`i5rjivB8U5J2`CJxrMWSqm#F1Dw74F z%|#a1bYsV=>cZFd*F?(%3};tde84NtY>-sY4M%p-t`9?wzzbVtn&0g@GXjDCnjcYQ zm%O0;2d*7CNWNY_X9aE^g8u$&#N55^?)M&kysZ+>{-H(i8Cnfu>E~Ek)1 z7-vx9euBXed19Nhr8Mk%fOFJ`Cn3 z&B=08Xm)nCl47;j-RUneR2&UxnvpIxAK-(9A zDNem0&KKNTp?f%(P9Cbtq~3`aC62s$4%ig9%uRGmu-OOeWUMsdwRKitkL^V6Y<oMhBJH-onD?piYO``Z<9@fqeJH15kSo#gU^XjY0|(|7i!9PR`!;IxCkD<5e$JTwmqmebo}>t0N^RucGI8 zg}u1^Y7$*lg+Aza?+CrzFteh{-p8&*vNJ`Cd>j_VNQbUe^9`{9%arlcEA+V}62Cri zP%IY|jqITI0`B>LP~)|9(k$W@C%<>EWlG!aH(Jkcs@~6Wt2X;7gzA=$vbH_Y-Ike# zh-7}T4>Jk2dvzfYwCk`paz`+Mp{B($f@n$$rs^#2C~k0Nw`=otXVOB7Qp)X{HPK11$LJxy%^G3_1gz>P#Ff6#SjILnszzoy8v(vB)7GxDkXQ|JR@`<=DP{f`6*Efbzc@5}uL!}H9U-f`1jj*f=`J}@@h;PyW2uPGY zrn%wC>7SKlp}b8xZzqj;etC3`LoU^?N2TO#Y+wZsO;dh34*ad!@&-ESU3VTgVyCJW z*C|lY6PHqm{{u1->JhU}dG8a(PSdGXAyh8M@B%W~D?bb}OwyM6en2XR&(~C2CU&8+ zN);F(ak;bz*t|Rz9bf%d=6f!g!O7`GwIpy&=Zd7>0YpHhFBtQd1M$7+hQ6qQpEF*J zudPmf%k=_mhTs!CBN3Ch#e?=D^$~guCq!d&>zF;Si!9B-zCCQ{Xfj-R&dH)3`QDfZ zcK4~P`OXBs?&FQrE5wP?wODRH+FY`1b~5QI$H(KmwJpU5g01P99o&_>k+bD3v#7L4 z9`w_)RJ#PUuwVP9cCb{-lJ-|8p}u#>!d!RG_}n?^5sOB%HyGr)=HEtF|ljlemrX2f2Ir`ylCYD&sIOW zYum)gkqkrZ*{OQBzCgy?>gf-?oee^J?;c2-H_(t4aJ&aG)kjV+f-V4K<~|(oQV8QU zhK~dUxZQ=t*peKn!=3Z!-AnixbQ2o^S(zIiHyQ0ATV(t$MJq#`w)^G`OR{%-QtA#j zS?FuYL6VBN4ktukCObMQ@A)A~b6f(r{Vffhd(Fa!ywy*B7hX+U_m2_l+ODivw|Q+j z(MBJ9L67nAbKZ|)=M4(tJx}=&yKbC_?^Zo~n0{bj0r*WET6l$Kh}Pt>><5^~Z$x)q z-61Q{`Fcn9u&4aWpO4s`C{Ro=ch>!0JErXGC~r_OrQcS=! z$J#5=JD^nmvt50&LdT+j4QkBNZ9js80-vWw;=RpDKz$y!&niq@tU%15WTaQ5$YqoJ z#v#*ST*<5VJ$w752KmaALXXJ=!icv!dx+#gvRuM3d48f9#>jxMtzG7d&7m}`xRYpg zv8?}ndO*EED@Okh3XPk+PvVc}ahKa4tQRo?F)FZnikN!mT-cN*byC5c>&p>f&h?E_ zInj|qhK29nAevC&nfC>w)1;QdnG}qLw{b!O{FD=}U)T{g8909OJZJt?#S+~-Goo@0 z5x~6|$)0$L8xE)#O|GJUlnWCXS$qD-a4THQO)S7CsAzqOxdJoN zbv(JcshS*-eHYO#RFvB%fMN9dL{GV*K3j+3cI{z}l>2n-@Y1GG{gQf0zO?})4x#*I zMWA`?MQDnEAf8|)9fr9MCie@bB-VTVT^2)LL!H*7vid|Bdw zyB0vqt;_B_Ayr@`tzaGhl%XF>x8rTza1(@}y^YRSI;rt6dWOm40#xAR8a33& zO{k>KPs~Amu^Q=RM$OJh`0N3O4Lv44m6Gn0hfCPL!EhfHL5&of;;?zpc1)MG3YS{7 z6?tbn6vb|Xj-~5*S-V}?aXK{>lB}Fcwg9cKx?#vvzKB}sQ#1(m)vEARZXPUSsv4C5 zv*U^tnGme^o`4G`p$&V47_1fcF*(^{slG(nMKhjj?2!{$y+SM4ZQV!x!HOF=O|E$; zxxSX-%>Ws>C&Ms@UBu|llZ)wybljt|SE(Ji)V;pP8}nrNm`YCoquf6#g{L2-qVm${ zg4tRT)9W|mAkZ|hmDZu5Z8RFbvTlIldw+!PZqq}|Pi>nxawGI%`g|wsJwLZQRF>bK!ad0^7=qcm$z0@@+iRlp z&+slf-%dzR)5?79jLEaSw_v?FCq`OpEQ0-nZlMHyNpZKKCBLi?QEqP!lA#!u0rbaE z$C0z6bjLq2X2-Vp`Qn14-fj7Eg!&5Z-4aD0UWo&8NY?`=-EG#;7nWv~MnB_aY&@qx zoVR!VshU?c6MYix1&<*7-?ci*-3sAGb5kdRaQ$4w& zFY8s^YP36hi08?U;DZJWSVy+;?RF8q zy}6YmlVb&mm_WX-yyWZfp9eqB1fi~aV=s&Q)s3>jhg%%&MF>i-_W@a~W*+0Nu^x~hRwA#dd;rf~J9Gz-Pq>W)*MR3)br~ZUH1ycF*9?%Kl{?+*-kc8ah#YzF;w8`+dA0!9^l9&4 zL~W_e3G@BW#HB{hv}^JNz{puC!1KG zA2V;UdG_X6ySKwVmW#DeV=_v*_daaps`j4sv|c^OG~9)319=ipU~<2%E^8Ewq}&6L zlMO&MSIs(ywqPmHZuqe+e@*Wj(x@yUD2~ANX6H#xf*{{)fsi#w(TQ?7;Tw~>|BJ)I(CJgcTC>w}}X(EjTf z6WYwJovc|K?HVfQCSTW8vB^RQMzmMD+fbX!juVY0YeYkp@jPJ_7_%>=xt^b(pU8XT zIo8%%jhc>$B?^lQ3vm&_OnOv9c<%(B*{`R|J#gDO+mXF1U%&bd7P|o`39sYVeJ~G9 zdC?aAc1xSdoF$xG+R-$%&Hy6r`E}4d7oq2cY2Mlyt(&_J-S#|Kp`9JiOi-OSOb8x! zcrh4_{ecNE8?l_0g2Bk1O$vj4YtyQMgcgd&<3(25`F2`?B(iH_)!4~{COrj%@7ouL z?q6~Kl#$_Y0ckwrh`Sdo`7-9oxy4)mjqAA*e@>-YeGk{ zFm1SI?VaQApK8j`_@V2w-39!Pw zze65Ou#8EY1BSz(PB9|Wl-+*DK`7sNbHy@x^yG@#m#J|-!D{FjUDcE zr5~B%NX>Bh8&~zo_>lu;5zX6udC|z3@oJ-UJVSSQ&{mZQ`T{b*l41UXA0fn9uK00! zaT#N~(KQwK_jxn|qSJR?y2)vAMS`EX4u14$T4$e1nAsboqE}DZ!7O=1Fw1BG_%Qbpl6X~E zVoeS5w%Pol!(G{-p`pqy`g-U;^#*SCU2&KbPl%6X_XN+oAl=WqVUq4_Zx@%;jv)Hp z)NJJr0z-4&U!h_lU@6h%f*VHaAH41);AuOr4hdeI`s;i3x-up-D5Ig0ow^Ism?^f&V- zdp=5pl#6a|B0f7PY1(o}KEJYQ+IAlIqb7tl%`q9x7KmHF&N3G%=Ht0p;FzP(k4PNv z(^bo7vCm=*ACnM;Sjl;PsZ9!<0=}N4RyU=o`eaeJ`SX;HPP3f9nMWIA zX$Bg_!pzUjJ%iy^HK9f`rl7IZ9Dac*#5$I{Bs0`W(N97Ke6D3Doa{k9RpMZvJK3Wi zG}ZEFYyAc|eFD~!X%TVfSc}Elg8ow1N8%iwVyIrN6RaM?0-SWy*BFR(*Q`~mX=_he?Tlq0KFg2EOtuNzeM?pZ_3w2B^Q zu|92GFj(g&etrXHmIu$*$117y0ytVtjM!MEveQG|0SsQ}g+nGW`EpN$3GzF@w2Lmp zcA~m>LV7b@oeJ2_O*R9bcfgPsB=w74zs^C>;~B%JL8D7A#K2^vRc7vwfy1Dttr|8< z)OuEiDQPo z=XOWok(N5-NB2?-jv=1+BzezD-o|+HTG~EklCng&9|gj;vyYZk#4l+wq~oi`H}3k) zW~SUJe!ko$-jD5>ugS)6g+@ko=ye2H`+Q+K!&lDoh36|I`dq1MmGE3H{r+qg<9i!d zI`X%OJ1K7vsbsk?e#aSI-^DHwnMu=Q7SC7(>iHo`J+(~VWT$q`h)&zKFOSc2wI{7; zhQdZy`_0dK(l1_ILlN4+T*>7kBQ*$#?C_G=2I%KI@R8NPDmIi|GxtuzlMX$`TS5VN z?#CQ$ED90S70tER%)z1OR+y8yzkEx380gKe;|jVBqO3-t^6; z^o&?v@gyDyag%a3#;XCH448osekJHf4648C#i*|1W%oKV>7jQHyvxE=m33jHAQ{*Q z_$)0SP}$Y*YBY$l9iC_l+Ua*2`WIKhG>88Ow78!%urev1=>5 zYAyXz<_XN&5RrkFSm*5!&gUQu2eOlcWpx}x2X#kMn+8@(O3El% zpmSXiP5JW4*92AXI~QJp)Qw1W+onj%=?h$GoN>oal4xH@Fcv?UfRomIy2|T zkCw{t1daZo;7i{HZZQBoHxP&tp`wnyYHrz)kHKoNrE?tva zu|VTtVopUv?k1CTsi14{l7bn9tNmnlw>e?;2+zLxk$+2_V$0LWuO83nMK;a-b7`5+ z;B4&4qDaP7M^cgG+M3P8z&M^>bltb7&Ruseqki9Y;@b{LFVt)kn6m(<8uQJ%Q~{T_ zxvdQWi=nOHg1pcWnoI9azd~IhSqx*yN(_#9Sly)~(EVdgSdw=$xQrA1aNhr-Vc@ExDzZZ*Nf3YuFnW`gMkq&n^&84ny zWN(LA(x#fO%{MRKr~eFGn7Ga{>9Uxq8vPg7!T9sX<;KHyEzx)kCH=~P9L7i!n-0zx zn%^M4yI=n`o(ulGH!UwG)W*d$6)C>{O&M&)4r*~g-X5NYyf}K{8Hl{@%nKrhA`oOI z^EY!cj)OGrB{yvetUnIB-V)Zy^k?(sp;LH;pO*c~=bylK zJ`3!F;R+z*f1XekwOHDV z1=(^E^Kq?M{65Qk6T;TUSi(;2t!I#NZ?wPmB&Cj>Ohtr%_sO}{b9@#~Ve9nb`J4>6 zwR0kYMXk2|mqhU?%Y%MhEpJs5JCR%&5gIFxAVAIajQ*FwX4-<*_bRLF9aOII4`c&C zw*=`1vNRR3se4O>lhw#TMrQ<^p{k4j`@&xqG6rV8lX1Xy+n99qmrv82J-VPj{30Jx z9bM}w0R88kHPx!aKC3;t@ZzONlVKK{P%0BO_l+V zWp6dbUaN`WbF#(m5cZ$o1+7cL(ndp!q-ny4PIxLk#!8U6gLFu6O`LUT2nBU*S+ktw%DByEK z^YUH4dVtxT8$I0%>B!OI^!qSAh%mpLB3J$F zyVenpDvlSHA!Xo?1&(aT;Wc(K#?6{#8Gh4$g_NEO@#khHpY{yBUl)A|W}u9@HE;fb z`hIOo$Gcn@`H;N=6IoHX$=T!Q;V+$C#u7w2rSamxK#R|tKNF#(O!f6o^o>zf4mY%@ zpNXhpdW=beJa7Opa-iTG(dreq5f6>J{#;+DyDJ)9Z6~lh&?ZKJJ`b#1dqU#Pwp^ zv)tENEa~OL-pg$BxerLv>x@q<8tB76{pvZWa1)64#JwMV-X0V^-FK5XlRM*w=|+O5 zmFll+708m<$-NV(VKQO zJogTpg2MfHBxkh+^U5x(Vw^}PzuE04_wS^FTkOy)iTk6)rP#d+;?BQ3G4u1y^bDyE z+8W0{D1KKOY$-1uYd63A1hz4y0;mCP9p5%77Fm+I4re7A0ngEKjAYqAIsW9q>NOEk zsrBWiIkrP4$?piOz+)A$ar8?rK&`MFy;OZ@Jwx@-cyEaV=GV~#2dwzp8WL^_HU-ky zeh8+11RS`{($8ZR;rISz^Mq(RDV5f9-nlWuqg3%NJKbDR(xdFw9Oywi^IeLviH0NQ z9`E1xglgJ|k@@B9{!gYzubGtrPPfsCe@}P&!)fu4J--Fq;p1viwzdp(_xJpgdH}fb zS$^2x$-I7rPGPD>|0X$Cch||W+xw={DdOBc2fbl|KV&N+0q^~{hvJ&uM0v{s;QJ-` zHhRu+>&Y90^eL!kH(tPdS=g`ZgfJ)6&2w>xMd+<`9MqMueV7}=PT^GWY41QVtgeWp9NWD9;Z*C+6 zQ_LEE+nE16HTL#H!xsX#FASKS-#&az8)o_fLUqLC45i364>_28|0BinJnNm55z9oM zS#(%=zY$aKyA%&!+~Q$(P6HCGU4=`?10mfW>)A&oc3(gNx!to z0&RP9CDg-tm(??q-bl0AhK&7~maZ!7YV zeCp6-CQHJ}Ohwly@~lb^O!?^_pI~a(UGFN8=QDg|aaPbw`}V`$_nXW8j%~uYmRlg> z?sc$%Bg8y|-1P6)&sa1rt+FKL+YO<~a`V9!Z9ip&DDv=*x1QQ42HYU*Y56%+v%HN> z_oE)E9tE=&t)PG0xx8*)((0KGhY!gHavBl^jJPMa>X|0chN)iW)0Qr)ku0x@E^ zUxJuD)q=BSbQv)t@>%cb+?a*fMH$a4?@dbGy^q6H$|4J#zcr_anlkH=GHx{49K>12 z$7?drPpTLaOF8ki&bJtML&RH&(WW?H@b7Bki#(S3c>==8p2;kz0OH)~Bb3<%V}OCUW5_bGp+^{GiIzOW8EByMYOyJx8m(jFD zfzDj2jGEB&kuVo05;)uKoL_G|B%u@-k&7>nl%X73C~u)(f8V(SC9iYu&OeZFBj4@g z{!;v0wdo5YyUbL7eA?XU_xNuiTZi70!Y&Gi%^)>e!u*=}xKs`h^=N8Rn5vhF_VGLy zO!H8kH-w27v9FsL(x>-`g@V-h>$6XPUG8l;SQ~rh)7rw48FgO{Y2ygk$+n*O1oZphGG7wkJ4zc86El@R|OZC+m6UejTxzn0$T zm#jJd;~qGhUvjv|Z&JZ1msxOmdkVbx%^u1CM3nJn<$@Rr|Ny$T? zO^-~cnuoxaBKPR_?%dmTlT(>+YQFpheGdRg2hFNZa$3GJRQt=V1g0IEX~D@W09}}xC|!C1UAgKgZ)>3mqxmN~lKal9_wmtW@TI8`W(u?_ongzPy%&$hmY&c|+{iRZcy^>pyl&?A zK>QOEL)=Eg63cv80T;XCgNd&Pa!qLNxdgXcKEfLAEw08g-jjcFhod8x4BW9KX@~2< zIWZQiL#zBelz-Z5Y%qm;<4j#K`(SQ#Qq->*6C z{xly7%&7OauFp!xzXB)MKT(kgk7jBaPn%qVges;I+@~b#$57y=O`K&ZsS{a0x*a_nXY%CV6yP6ho z#;km{-oeg@zl}~8{vMc9R2?Axp(S~6#oO$f*h-AlWH)^n<&+d~t|D!%&v?bsd<_Gt z*W_a9gw<+(nx~w{L9Kt7p)O+r?DgTY3KDf(G~^?L1A_Qqe21=9V5$L{&xL2g6nU=2&x{nGhnEidWa(#WG0I zt)TLiqCbtXv)2xI5%N@&8P!;?Me!nCOrKF|nAClA-JizfyuQ)ZXf3GZHcJTDb3m2q z^W3p&a6d6l43H)5)nrS@&hP}B+6{|wpnx&)oNt`Vrl(DvJe%BGq=Do3G+>zh~V#o zE3}Xuvo!2+4C8)oRE8a1s|y7;QTA}0Ri9h)^{CCs0>Kf$LGo`uj)E^&*M8xbj%geo z=Z7&Da`)C@XJdRP=msB@`^9!*slOMU-RN2}Yl+BecB_OqyPK9FQ=k}iDupi4{ltcV z5ajQgy0+Yp9?=_l5Z4FTG=EtmbhqYvTAa@vg<^=u1JJ2#^^EJccbva#_za|BcgHp-IP>;u@Z@_co6JGK zdLcFC-sYJ1F)f2?_?{$l@TduY0$zTc!(5uV@wW|ziRIF+N%OHt;l55((O1s(b@2*+ z$zKOzHu%lRCV1w+#dd>mAaIx(SC;d`Y|+aWad?KG@|VPW>Xkh{>G2NCkIaV&JC0$$ zYG+PVt3SQ8D-ADl*25bH5)vqtJ(4lPz~Lq<`tpbZ zS0KtfSJl;v&lBU0$s~D8wrtLD9zXA0!X453<;&gBTJ!#1)Eu=nYOHaI z^MpBDWR^kBRGV6$Z90b^!3MAsIb;-7n zwGZd1@!6Qw5Rpe@gw7jaBUyG8+F|5%h|+Yquyj|g$3=^33pkE*=Tz>_EHu{tVWI{LjLgbmTh*D^okzsHQonWjLgmiOwP~uq41FGk=0}G9E zFa}_DtlaK(RVRNM{89?I!)pc3c5mLy%I_-4_V8PQT&goVR&SXfB9mcS_H1rhx<96% zkv9|=Z-pvzi7!u4&WwR9p2}e3sW&ms($biB7pq>3_Ie?k*qNGSr*)gQ&UBQNq->YS zg?xPAL11l;cWtd8_vuBkvAHwiM8XTx&zhoMEA1C}svUbqQINagKR`|aQvqUP394CI zy!Q0|`ErzfEIGaArpidqSfl+gkFH|{dE0N#;mD8lV5I}i)uIAkA^+vbk>_1VkBRT} z<;8zABjK7)n!I8GVaxa3nXH0m(g?{|Ti-!#=_l;a-Ex}R3GbUaBs6)Ny1cYgj))!8 zFO#hO%;*2|;+Ly3y48nUb0CqiF*>H&X$DTxAz?~YI2>cDI_)|5LGRDu8)n+ zEYnks7eM$i{ivpF*2!RFNSz5|%Chq}u8A4f{)Cog%Zl>JhCa{UYM$$#D5qF;hpPrW z7AC`taRJ4FOG;&KB`eUs!bt6)dgpx4Ovl2MdQI#^d&9Xz9htU;Qk=B^kwfal3AJ0b zN^zS6Tzjr6vFGLZZMzlC4Vkrypcwiw@v0~$keBu-YnFJG;|~KVB*Z;X#=dYnOrqOs zUiL7Z!+>0(bfqTQ>pY6(j6=Dat>l-Svx=k6gfRDnd-e!{vVELl%@|atq9M%Y(qPFP zqZ^U=KJgEt#%Y5Rk`wQ{zohJT@HXP2^02_!09|E`{qe3M`CSF3q6VZSWH5a$W53*` zb}$hdh^o!LY`d0svUxU`^wDEu$Ov=vW@ym&7Y>{PE^YEky*O?a@2|l$x&*D}b6*|^u6Zy2&gdh?e+`Y&!62&OOJo zY$|bsIY>1xpR8$oeqZgQ((IJt!y6!u-7E#z8Wm6M4He__Gk8x^Tu}+am!mGQSQ0k| zki`kxqapj0F4G2hShnuwe1-U9#(ZHk-(+K;h~oZMfi`Yr>32^c=h~XvjmN?aGKLnf zm983QT1c~ZA*dE4+{OybI})t88I?tvKn_O=rJEu@Jm#~ zo#FsESajvYJ`CNzXp_n1oN|;UZJ281eAHu#6I)sq*7JjF3;k9_XZVY3 zyXM&KTtO@0Q8_a@K$rW9Tfbqs@mbw!RXOhZtpDjL&OH>y>*MIka$P~o@%%#_S;x8Q z4UmMnmv_4yz3F)s5bu|suO=F{$N#-|oDHU@c%wsHM@L7|(lfDla?(Uh?AMx^kZmpy z?xAA|^`kd#lI4ozHSK+XQI?-L<(d_*e_UR_ox_d*nw1*CRY*72D$KcSNTJ}iTUuM zq1;Me=GEKRU^Cg!i_SDK^1A$II)AqMnPo-1qWF(QNYr@*Lx9Fu2WG;a$`GD6`3IJV zF|WcH7<2tPbE}o}^2_-Zn|OJcm#)O65U;a_%=C`EFi2l-8p7IK6#A6_4Wnym2 zqG?M~hkq<%WGg?etbj|Z*F>l9)mohj@$V5rBfJESN(aEI)Bu3Ut>fR&?G&V>=N!nC zPx>OVa==O;mH|^r3iLN^tUR5;E-vLxEhryMvv|T$?Stm67%F?fz)sZRl3~Y5bK~)> zL6;i**o14D5tSF^ck&n!Q#u92(5#%4xi4$iX`X+e26`}*CjTwN?P_t#H0;`Z*!;Oa zYAq)-I#vC9tVB=k0Jq$;G=(Xg-_!3^984rk$N)a7hR&B-zs%K!g^Jd)n|FPF79x?K zD3|E<6V>*!a!TO0?b~NBi?uu{%`Q!QaLCVrHMFF6?-pxs0&d*s;2g4Vw)WrgJ?Kd* zYjO@yU};Ps(vHEgPUi>TAW7UGx|2Ls<*|^=2!MZ8gKcLqat^x+5)r{nbY9tBmw&{R zX8aZWwLkmv%*OYAQ5R#NX_M#1r~Tj$Xb~ZozGh;^YdWLn}~l^?`6L6&YbyO@?a8CfekJe$Cq!1{=RD}c9i0<7qTF58U+N3 zm-aJi4l@ftG-nCVh-6j3)*5nha;}E9X`HmI3W9yMy(%gyW7XIGq9g5r<|^RZA~L0> z3-1HLc;92Lr7|O9gLu%Pi=LpxZNlH}MMp*QN<#mX8wqsnUYz3-6BG5@PsMKrsoBVN za%%`J`^Uio=zi9^f851G0>dj}u{kBEBE;`Saq! zg1q-#qGDmzZN9nK6NXZ~q8Kw{pXH`9*M-jAqa!v+_Z!xXss2`n<4YM{DVCjd63aXG z_TILpB@0)*TO7_QCLqkV84wU)>T-<;Li4E7+s9{IEzu_6=7MkEd5XXF;dCK?m%0WS zS#RUi|MMSt;eJH@>UAPhM@3jIXVezok@aEbcvzy<=8EQ=#Sb;90RkrlMV7|Zd>GBR zO%#;&S2wLDO`3dehR2Gr(Jh&4^K61pLVM3_hiEwC=ck9HM8zCDg-TCh4O6p)>+)XZ z{)Qcy<`RTgBqU!BsIybL`7iTmOKiId{nOz@{}&8d{N?+13YgRM1fLn{|1n(e<>ciz z#7rIk9jK-lMj59;{d=>PFhZucMkxT_azuf*lrJS_4` zR{r+z&CPX0JQ^e&;8|Ymjt3o}0Mp_Mf`NO4faQwt@Vm+baR~_pV`Fde24Zshk6xx3 zM?8J{G)=%JX2IM`Ht6mhf*3xNZ8p$X4m#FOekDaY+Xigp2bwnlpis4%WX_nYR^Ap8 z{8OdoEdepFD)Z)2h{x1dk5K?~yOZ4|&k|q0z;;5s3H|G0;@e&u6IQdIr1j*7KQccO z9Y_=p*?Y=euspD6Ja z;t{dHTBg-NE2xE!TgJ63a`eEXN~66Pr!UhLghr*gQ%|#|_Tc&0r5~c2TE-HeW(h~i zB9?fV;AnXvJNI&ey%qv!nSicZ#M&u*OWqY87^!VoDeVAA;60XJrrIMs9me~QE>YwZ zj|8#s5UR}N0-M5HJR2jBGHa>*=hj)NByv)49w;p6Zm3;)?~G<=4{IzLFN zkP&sxY9r0#j2tC>M`mrS%0l%T!NM2k`u+wpUKVg2ko&vZPZ((jsbn()(%~;pub8J{ zjA%HM>Q*qcc~>>Gt(}P_L|Mv7O0o%=oUtm$s-{#VTN-o1A(he_*Ko+J6h$Oua zgC?lJpX}$DNBNZRlM^2ftHH@up)>RwR#*C>FeO-5z2z%-{F7Cie1365jorn^G$G7w zC&p(C!1MAf|IMlW<6~lwgJYJY$#iMe!a7P@DyGP;dxT{LtZ2T9z&vJ$4av_DBg}5I zyRc~4vA|bGex1%w!(lJ-wUMp}kC1GHF^ppjX;mZS`?NoqtK218_t4m+%#PNB+bd9! z3zC?e05fxlEETeG9BLk1wv&&>nWvlw7P3h06)Sn{>vwwbVv#fcD0qv|0aA-MAo=;A zXZ!xD0P$g(?(bE*G=6adWLW(E_}~{xn2HXEQ$ZZrJ7!6 zGVSxLi5T#$q|od903%_~Zt#I0mxdqvVEvAAv~*859hk0@+JCM=VMIITI95C?aOl@S zhzBh?JL?fj+TSZX{lM%w^uz-WiQo@NDLF}BmkX0*!F!EnN*VvgcL4qCe@_fE1BZ%6 zvqo~hyTcleJT%TXLO}1{ve9RYnRlb5hsf-Qb^0bw5#_ zDcJrlE`E3pqJkCd*`t)1H)%>+&z*I$XE3(oB)kh)cT^^m~6e4o*n`_X=T?Tf0 z*SgH;^1{@|5HdJOr;!Xh%P3Dm7$~NWr^A^HHLRcRF~s9x!!2Pl*(U=iK?`#s6!%~l z30;v;k>OP4UfA##&1ofU)v(C#E$yuLU#H6?Zcmp>I}ZH8x5>AfIgMtvZw&>R;EQ7q zo=_hhX0@eP0CJx+S6#1Mk3mE9D!GR|e6 zFF)$;0Qc@16a{->sbv^*E<}!oHKZ0$NW~lUGe1f{u4vW_5KWZWm_Ax63gBItJUu(# z@*a4N#$&`G1L?*IlA1gLbOtcJBF%9(Dz~MUuJ=N=>RzE)f52WcCd=$k@jqWE`jlh7 z`CgV5#yni8ta~|NFjj%#Dh&v>?lZGUypK*O@ha_KdvU%2h~M`du~;chYM%ty&K!B5 z&JQ=SQ;j8cey0@+Zs-&G)S_?q%wcQ8Ml(?@L*&YtN3P-Y1$bG-w#{i?9AA!ujye}AxKuDh5bURPI$}tp-EFmiLLu`9*r+mYF=I* zozNa3BZ;9#gW^*36F#{zgNhM?DSRWYM?fRB$!jZMMz~C+&!POy=E|}V1y?bo=#0jj zvv$i_s9ZmIM5J7MBE`pU3ohC_TD6OlgTgHIJ+hUm~HBNLZ{=8#qElh*sDkVea$I3ox{C4$E z80ygTvAg7O9X2%a5sj^G)B6QW^7H*R%53=%RoAMrVd|W=3;~p;m5w?dIegI3vvIgw z^giK~tp4EE;sSG^f5r193$<9BS4m4rAm92pSjov%$ddpECe>;{wUjg5h)mQL#$#_zbpLN1W`=zm2e#nxC zq=v~xa~=|&+)U#wMtv`~jz)aWiA8A)pxL9UEP$&JJ3t+NZBi4g8F*{I%;6JSs~`3- z^_z0n8=<3W2B>0zc%p6Wbl(KL708xYSE!!02C4g)(EU1u8I%Da6{(Z2Z>}|$h>x_? z_YFh?&gZpOT<+JwU9GEY#PFv#4ya~)Gd8!V-$9wX0(N#G&b*1*P~?F(+HxW)rpwp% z^KCCXPOFb7RospNc(EJmn74@x3`!e!NGw{v80_!S?z|Y$10TRaM)-rVDmOfoscTNC z`wPtDoYHUR2^}dR$+GzY{bin;>xaN!w^T~hE{kJ(aD%Tl91#e9d6J0H%4?pf?K&)o zTJ5JE`GV`@Eu#&m-}DD>er~xu-=ZJ=l_Krl2U?aUFrJGHAp+R-i#8Z4uU>wR{ZgVFA#YK%_ZIz8?`nfS4lyZr|e1AAMqI(cN| zAmVJf!DupS3)}7o0D-xF?RkT@=;_<2=5>l|H*g!DC;H^gOhjN8{pbtbM33gTGB&9* z-ad^m4Qks%5so->#^_hfRqG~saPvz;Qgwk2f@yBXFGpf|o{7zivCPAK-l&gj-!+hmQsP>Qg|P~l27 z9h=|Q+k_;U7012(zy{l?Icz_I+9fTVS1XXt1jm=*`mwf(q{$i&otm6**JCgXQx;z5A*>-w$ z_c%}#>TLCmjS+_={(b*y_RAk_T;`8lsVLLfnWWn1(;(hk90ebbID0F$3Qo|-@Ou3g zj#Hg-8b88bgJ6?`MujK<`nnf#UWd>T77O+HPR}nu?8skM8uHAvWoFEb_y>d?+mxP_ z5-pE0=B;#)uM3`NxJ)PTfKgj88kHZIRT3c;QoyW|b`*n%u<(Rh<=t=Vg?HAO?8-rkAXU5WH24HhDfe|tkE4{P zL5(AgAxrYZx0N17O%^*3o7U`+y2*a!BD1MQ^ehs(TnoG!YrJ@i<50n zWsUtT+o`lua+e&)3~`~<7;94JQB$CJ&X@)}bcXg8kZALms+FD^<#muJ~i zLJv?apJ!@L$gVat|HumyfLXd$AM{-#iLJ4mnU;X@n%hq_*3dux#VI)^FJ_X&B{V4i z{DG&2UaY45a0f`yH{R@P(k8pdfu;lFO?Lh{({t%qr(qI-RF?jm7R#aqR*cLiwh(%dI5uXirW zj$OSsy1iFkpPyzHs!GvAW?IfN!Tz=CvjJjyqges6=W6R=zlruNlA%+i{x*FBm37sN zvz0Aw4PU4RTfolcTY1|T7tnrH(TJQi|mv+8K zh_vE04#@J@Q2vjViA;o?!kbjzG5!&%Cc;0Tdn=5dMUI`^ z!~Vfb`ZuUkMm<Ycyb?oj6X`zfG! zZ(D!zIDkfc*J=9l?+b@)sS>t3@CrZ2&i4%V5+5=S7zO}600CHY2hpoUF*2y)2Y0Ts#gm+uh;_q$l(=^v+tK(?Yin2Y%r@{*JZc#W zHne|882`P5v*4QX?FO9`XYE;YNyyWI!)hws@0pPOZ~S`3rMg~)_FBIj{w8rP6v8Gv zC-kZ!9?|!byGO;XtU0P?`KOYbKC*f_dS#Pc*>Ah&_=;KV__XIpp*yHU-tmssnB~!Z z{g#-y-2=&zax+?({alwZ&@+C~Nw<`kaLU-i7>JbV^t0$zvne&gKBp3p zuK7ujX=_Mx4oFo@Z^I$^!)Io}W?id>K}H`>mW8_~;sf|fA|*#T)4K2WM-F*{uXTeb z#Ko2R%|4E-J9Nf)TI~MTLZP`2Gwq|#jR{$E#ww#hwRMlBK#_WO zk4X%Ezv(JnYU2346JqE@h`CKd1&%FbJL|nR43s)G^-v052@8jDNH*&pE@ipj{1IrJ zioN^5Zr~na<#FIRUj2)2sCVhjn>Q|!nvQ=DHB$D-(}T4JG`Kh)&~Y~X9QK-<(+EVR z_;w~pXao#4U<-Zq)kKU2A3lIapaT&TKBez)BnU&G@-eI@px^vQsa)(bR_Gbpsm|UV zbwBg^+mtE==*8L~Xm8pm?O^;mw^4fOURTT%^uENW0#@#^lK8ciSIQ;btnsOvy@fd{mM8lD?>@AhSz47}_wgqnH|ijV!vQ>I%VDT2E^(`F`P; zIQ3hfD2Z;~^|Eij<b`~z= z%zyQB__ELrZE6baU1Zs)jj=UX^o&SSj(sBpuQSIc#rgh~+l2)#yzdV<($Mgo(>fiU z+^b!vhfd54wYaw=CPf{vJ<0lm(!mRyJi@sG)15YoVh?`hC8`b}I)+Vd;O!EoyXJh| zyfUao0f(Z^o(e|U(dQ_Mna%v%FOD^A4r@F(-+Y~LQ2J*@-vkSKiQ$NRI(Rm(0{MPS z4f+kLZg3;-(}!k$BSzy{<>w+Yh13Iq6P)_|3NIwx`JY=5PIH>f&Omuh-nz0l2BmSm zC`i*{g~s)#i%2M?Ajht0_Yv{krxkW5jH))*9i5WOTWX1)I>e79qDS5}6~FoYg?fLp zw`H{0$@BG(MqrFF!_v+!PvE!Sr!pVi_KTieS~urmAKOkw!Z%Fp;cc+J+T|RWSsuRF zd}k%9#w#+&je7i@@xJSmuW;*t8T=njG92p zQdo2d)hN!i#aELdl3q|(-r2THmwTT+|CTR%`S}|~__p>1B$}Fd7tLj5p4)8frHiR9 z(SMVtbdOehDzI=ARA`LvhAT4u66AP0fzE668rc2&N5Q6|Ykt?5)hktay{ZmSMhKD` zHSL)xwW1;59E^$%EtbMJwrx z3^QY6C)ACW?7R{!jh96#JMUoj^Bh!^zxjwxu>hF6Z?NA&m)*qbo)$W<^IWrC!n^d{ zsBVA#-&nn;AbbNnA%VI8D6jt45D_V-&?ax=eS9=2zPe=6b8%%4*LJHgfol?yVvZ4P z$0)e7c~kA7ag%3-Wo5EO`&Tig50HB`$djF^sae9w_OPNgZX`zZRN!nJrzf-&QMJNzDm?>n$K|~$m~`H68`Trs ziQ%XA-s;zj^S~67=?t`*@iZCaH~k)-SM2W53lb-PQ_E}M#VKI28@*X{&2?^|^>rTJ zcIp^t59+LvvuhF&y*+;S?!G?II5HAfBX)afo1eQNF}`umRBWI-1)A7IN;TwI&Uz15 zV%zoZv0h>*xIL1XvrVH}ZCM z+Q2d0xNBomh)Uc^>r_N9{ktYs1d@#)Pv>Yn621TJPB(q+a#uO zRbxD8uqy79k~IB+No25Q;btBMvGk)nJ`D3cfI#HS@d_At4_7-tN|_u`Zl25U1ug|D z8v&+g6;KHh&D{^QSSMEPWkZSCM4_-7iHNrQ7(s?$jheI*9E7Qv{#% zYowS82-g5t3$RM$-C#c7Ie)R_lLibZ%O)lxCeNI+$P^!eQYT(y&`+RG;(wx_aC7o)&sX}zhYlAq$?UM4 z)JC#~Niosi;gH>leJyT@#b!0Tk_kI|V-9n?XVO`as)2oDgal!=MY>~gLIPV35fOB@ ztRrM}vHN2AD(L~1dZB1NdT)P5X3*KGF)*`)+q!$EMBnN*k^|6r9kG)IlNl5QX!!=t zNEH;NWvig#QUz4+gDog8>M`T9)2)cY+lX$px@^q7IK2kS-U>>HaDRQjX-plP{(3#P zDZa{@M+4Q}DYfD6-J&!#G&NyByFW;toQ;FK^vWE}_4xNdsmoUxB2?EOa6qT`U@kUm z;O@|}6}yX0b(DY*Eq$yP{C4dCI?lPyfd4nC!KmzB)}gk`w*x!s**T_YVws< zceV_)>k{6fZDPl0H{xtQ)@F8#WbMyv!^Ia1EY(_Ba|P+a{Fjkg0Cn6>E8{^HF|W>s z>esLZBwAp{pbX4LmiI7~JWH&@Ij6|%T z_i&i0kN`50uczHE4JJwSs{iEAVUQ5!T>06*oIWkP@O*rIhzn}V2wa!4oH3CW_YhU4 zo+1TavquksYTG2O7zWC~6i{reJRpXVS3vzl(X?cXZ{+q%MrSBZw-t>dAXL=m3 zoMRvJcp<>?Ycf@dexxz%C$lQlP!I3>YFb+G{}=|}qUFun=vuS6tP`x-zkI0)oY4u$ z8h}XlShlry&u(Zty>>M@QY~3`B_ph)SW=ez&QA~A?j-@9f~|Vye?=W^z-K2|gp!GG zhLJOF9%H@~gT=hMDNr|~uFO3*qgmYrg~&C$ZEsufX{0!O(&z{Z3L;qwxEYRm{xJcJ z5YQnWCl#_AtKrlsD(FE?5nO$xgD4UTSC1@{ScWfy2UYh6}ZZbAY_w6i6l(ZMd0_ z)zt8!UvBg;%ibiq-r=CHagQRpl;i<10if^`r9CF|&Pth6m{~l1XjqUKvSI%z{LTM% zfuab`uvgFLvETAzD0Wnz6KWs=L=ivG7zOh3@-{8D?e6W-_xnRbw=2VmA9!uen3YDj zY5X@ADr%8{$fLNz5ad*I(mVs&T#^!|+ACW5Pi0qE{~f~cKR^cv9_}iq>Bj$pD-d~k z{kqXXaQ{oN5`5dA1#AZXxKVjw$2fe+HnF;gbA@zVLZK2Zo`gom{Pah@oDjUhSN{cI z3eSo?<~xZ0DVHm8Nz@YyCzL8y)qnVGd1*<<_Xd#*D%IF1dDp+=D8*L*Kd|23!++$~ zmFAZW%D4h4Q0cP}fOb@pA|lE0MnpgLE#(r=&is5!c4O$o+Ky6a`SE@0O=?y#PrXPU z@E%>cxrsRQRIe+v3t9@ZZFj}c=NsK8%9)@36JUTaHLgKFFG4okH_EXLEN}k5 zpa!45dl$xBK^JnEuC#&KcKPUk5L{x14+%F36g2Vd*|QwE2J=MJ)ks~@-;4jDOaB|t zL?>lhHmXwAmmpYI1XFxttG4uku__tzEy2-uqamtnmA&s~xKq%-h?JZ|ViNmuW@WN* zH9+S~?MvUydBPZvT)9!N=zqkkJW=>{KY?DMa7EsEt))?@Hu>9I?)oEQ|Bt-?KxcB6 z-I8Cwy-T5H@0%ZRg!83(^zN~z?ZqFNRrxN$er1h_&*1W)?NYz1Hd)AZg1?EdwYs9s zuY?cLm_&k3;YXZGWwqY&8f5AZzUiNOuL;wWlj(gkyRs?~=e^peab8vauim_B&}kLyIX5!ke1JacTK|{V za_q+J4RfSy_J`Ve&kgvR z%+Vcoz3W$24+7Pv=j3#Xe_H&GaJO35=&fGi;rS2$GG5E0Wv728j6npRmOUJ~(o|P8 zmD+SOT+qT(0>3|f`WA&db3ovawAR-Gg+`E6|0zLKA6Fc_dRrCqFZ;_n%HAg^&Hs>7 z?7wXL|Hqgi#r46zi(Tjk`bK^*uU`r5l|(TK3cg)iTRYS}u%!665u)Vi|Dmd@Dd0c! z-%vGg**H0|beF4tN(al5PA}h30M$v8PKz@Iq^Xp?n_|L zIyI*uT7n0yMeCDguRrE3PcilT+cj7VIzo@O>T-t$nJl9Ug(c+U_JMq;Ay$rb-0I_sGckz`FyY*a!zSt zE?)Vuj=@;(@Z?Z9!L5Bb(|`K@b>#A6e=_~y3mS=!1z!cHij!xi%eOZ8 z+t~^bK;$S0iQw9o$-XRDBn_}MMbhH$jW9p(&4A`F?l{c;NA_xw|Y?Ei!h^1~pLt%%-W~QS;j(O+Lhm$c{u8To=%Zy3T=lVWF-39BG@z!BZubDS{iq+EIRokr1ePbas#N&beJSo z2rgX?4SUL56Poc*6d@VrR=rNujFB<^K#7}G@=A3FIXu3WSNQ5g4RP3`d^-4`Dd%_a z%T%TorRdCFB5k{a#Gy8GRhgWpP5cB5%_BuP%(*nk(x&h721>M}%FyxjU@iYSccEES zvaS7Bv;Vw&J?n#Kk2#>8(a_lDia^bk6^UdWA-}+qFD;O;NbL1cPusg+%mtumWE8suUI>c<&*bWBR|*B3lmnB0aj37jyASc=S$<_ zP*Q3vW2{FVsl$`e%NgbnL9q@1`MswFV)07^=`A4%%@6`e2|6l{j3EY6sM1>?ASF>kdlYBZthc_k z-dgYd_ttm+yl35W_dffcefRHo_C5#P&EFd5TgOYo(SuPnr{<5K(|I4~4PEoFt3w)x zJl+%w)Rqlr_}{%*f;2vVF;oGou>4G%GhGmLuP7K2ooMN`9TfuI$S=^iY?&qkU=__Y7avmON!Xv*1Y*?B>wjU|<^kH-stmmr=8i%8Z20 zgbw#M7t#so9)$Og?eD>}fuR&C{34M3t?FJeu12O$UlvFnTp=qpFp`fo7yT+Uxa((8 z*ZIY?kD(xzJbA>f&cOLDGMHGqHKUaS&N9%3PDAEjL zR^ZZb72}AO`K{$;L%1TLboE`oOGEC=Atv@Jqn&_CAUaQvVI!i*p_($Kbh+8<-M)az z{o43k9rM&{=WE)8?_}p*uzqsDconTcXnUwLbsk~-a&6#@InFs6OGC2}iIFX(l}_`wALuw21o`53+`` zwMhg=_D$u~_L(X*IiH^nJ*lB(Wu1i%?6>NkvD#>CFkyjzg(WRd3c-H)a>@3Di!1A! zmZo8Vv@^b_K8K=h#R@scXgzt^Y5o@npy$1jg4ieDdy2PDHSUkBN5*C<7rHmhYR9an zn2vd=M%T?c7Tp} zx%!M_;xnWwUkPb}7`YrOiBl1`waJ+%^j~tJ78q`JYZ0+)Ld4G1E8Wh%7R4hnqZ2A2 zF3moV4^jj`0q7@rtZ>U*ll(q{Yv`PW*QUOQe@ErQ%Dr}|?~QOqnUBW6%|YW!*fa2J zLfGT&%I)Zp#ltb*ymOp;CDXcfBA|Wg@WMWp|B>VJM7xX)!25M0zABB+8O~bd<=YGAZKhp_A2~UvG(Y;{p&FtSka5Gsmu3vPHdPO{u#^!{jFC}rA|DHKwcvh9KP>FivEGW;H>-#l*)6W0B6icAizbhoXr$X( z4lbq4O4dat10f7l_aim(Mfp*%#ag7AcM8OD+yii{BzMxDJMYhl9=Oh6LGz2&J|o{6 zBaikfc}mAJioO0V8De*<=HQfER!*YofR+J?EZ>LiDriF-rfV-7e>Gpy;xpo zlCwT6e?0#xV7k)Y*P!0Wl&^B?Y1(3gMfM#ZLT#>Vn>sGA%3wbb6$)3omn!)0^d*Tf8s@pF|hVc2n z3r0ezoIeK%JO7|~hDp3jc3kD7wAYZpbPcjGaL6Hc*~m?io6zJN3*Y{1R#>`Ikd7jIyWF~3}w*jmvXa1 z9}MXjgH9hP(-`jGjxD_x82ltH%FJ(?IF)k(unORus*;WhO^)%ljr?Fh6A@MuPgCeE z&YE#>aa0Fb9He|8}7^DUF);8SpjJWA(?pLnx|g55vqvOmms5`c@H|)&)7BM8C@RGOnUa_X~|5qJu=?u%H;n-Y6Q=I2OXVt!6NYE4vlm)y=u_PAgv!T0x%V zd-zBF6ZR*Er9O=*;;yk|()W=k59!&B#XT#E=cb&m1V-aSKPsx$r5Zk$34SdTgS!$f zxK72apHP%Hlr^#KUKLaV@m>7)Qle&=QLE-a*9 zZz^e!uf%@JFscvdG>eKjs_~l)kAKlN)l<1SvC=kO)A)+xz~Lg|EuWlN=yXhdLqjW8R|A8alg+cE zM8k!6zdC|hn;ZqK5G^2D;mY=3P*JUU$h#ScENSj94LtDOzNbcddV~Z=eH7^|QOo@P zH2Z#}#an$NME}PDRZ-AnzolpThAFpKni_QSY)3?;i^zWu00xKhjz-S9l=2%V3u*>Usqt4|iP|vlK?@Of^&cCc3Yu z3q#SdZ1&RP67?HUe|95!Ot-86HQ9O1x&gFi!Igq=ydCyVuE;j5XEvK zNGs^LQACf02o$QFH|2+>%gU48MOpqerwg09diQ%T*mSv~HCHZqT#KV8emM0N^J&m# zb}dqR7O{L01pUE`^b5P2Guc7_AI)RY$JcmOfz9vhBM>@k6%um&7|$8z)UCF2H4x5l zDm4eRlIqE+k`t@>A(epfWxvD|)4Vs!7N$<_t|x6Wt*3U2sX60piU=PhQMtN z${SPCY+896-g2*(VVms=j;w-$AZ@3%J&u%OqPq^5sSf6*VmE=r!o_T)_1bp&^I~hQ z%n+)1p0EqU_8zXja3HCjEW&|}94Br~M>9VgFjdq(_m)HrEjW9cR5mq)9;V8j*{Yh? zEK_dBIA*44Jw~{NjE{S;P_7ietgyakYQ*B^ToF za=8;9N*0Y_>>(y!LmGJN4N7ir{Xm}UH`^1##7WU4?5+BV3#QS!-PpjPnYGpkPwQ7> zr5BP21LS(auL)D3BMRWB;QQC1S}F8^i&%V@K$pv#3w z(Zq5+qCv*Dc+uMnntzjFdfS9uadl1@!9HfR<;Z8uaRTepNIUgg1l7^Ac&oShyj z;b$?N8xQ5*PoAIc|JP!vp1y0q;Ycd!4)=6SHP#Z}(Ibqh86GHXZI ND`qyAsxRJn@L$Crt-}BS diff --git a/Week 08/Lecture 13/Assignment 03/img/demo2.png b/Week 08/Lecture 13/Assignment 03/img/demo2.png index 6977fbee7de270b6d3a5801ee0084112280afcb5..8a365a2e26155437ccc50d3e01efe6fa049fb1ba 100644 GIT binary patch literal 21437 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 diff --git a/Week 08/Lecture 13/Assignment 03/img/demo3.png b/Week 08/Lecture 13/Assignment 03/img/demo3.png index 0fcdb9901bbfad64602e93ab24cd50b758cd4cb5..42d0534176170ec49e3423c137422492f743e16b 100644 GIT binary patch literal 87879 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 Uw|u^toccx`O@k+8k6*m|U!~5ge*gdg literal 108234 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 z z6u(DX;a+eSyiq6qZ2zk=zu;MNg)= zpd_ruc$HMTpppJ}a&aU*M%%rOh(b;ThRQp@557;o4X&+4i(Mh|CU!{%`6pgP!V2LJ zf;>p@0{Dxq8#lPn>>~w&$IgdH-+XvJ_b9_~rW`$4XKF;vdRsqJIPUydku#zh&ZllF zb!rpk+&-5HjwyjtblqtWqcOh3Z$ZBqvzQc$oRaV{6cAsrHubc?Ki-*p{yY(rWq96& zYbLMfd7?dSAa|CF&jRo8EV#2GT0#v8+MK9aEF2qC^o(NF=NsGe*nRVO81EB_r&LlrujyjO0D6!Jw#Q*-8FC8I0b%#f)pnGZ?ReT5HOlFczxBWx@ zVi?>mu_cFRNDV(bg^tbr4QHNuMG(xy*)FFJcxg~6J!zS#xZMPmPD=~a1`OdIA+6t` zH?vx9&?~Z&{UILA?--cR9WHD*=RCRJ#iJ_aN2VMylPh!w1o2hTM3aVb@muca8IS)s zYIw+{`Jl6AqH!uhPHBSA+1V*M-*j#C-aio6!#4M+96K{-Y{$!UlnC-c=*ugqwsx40 zDOKfFBj*!sD1nOh8VRjsrZIh>cI{;~+1nCQ7PGz!^;ZXiNGi#*`r#15gep1^aowqNg%u_yRr2XQc;?M)zWZ!P;h9)S8Ya;Mg$4H@10 zF9?$_5x1aoZVr*xvyyTe63-D=?j1Z&qI;6Tlf}^JK!}-byheMEjjj7YVUE9Km|0om zZ}I%`FW>Kkk(g|!Ik+j^OC;S5ONl<+`jdw>$h=3?YGtIH?IO2zZldevSDE8McQ&n< zLV9%!vJS6v>RM~cluis=w2Wjq312HlO^I${sj z=K;L%PSO`t+rPLXdyHOP?kcVPv0D%Fs@dzS2JEsEXhN^xeR;+~1pKg&J^^%buFtaFx=we=z!!4e6;LdFmAX z0bxs$8sF8DI+k9ZPYuUB!rSddD)V+s&~kUDn5K{WW!|~2uvc=1@wb1>I6Y1$DNQX} zy@XVr{B=DwsSHDdu6yUeJt;0N$X+T^54hDYmKtt(`}W&>I*e5nn%qWmtlYZUBt%<8 zF41UtIr7&kwLp!kAky%Lz6+cT%iAd7VL^0CH5guW+&=5VC@^k8P!S6yr{S+ z=_xD}dRWI3dZmn0_r z6gka}%AV({WC4km%7Sw4%E{Bsr7ZGws4eNXF9%p#ZY$iK*^}R3w{Z`rRrI-Itc>aF zt3R%1ZOoJ6FZY?1L;V4_+r-pur?cMJB;X|>>TbC)y&ncJqv=aErA%ec;3{a zd>VcvbTWisT?;P$Y32^%2gGWGs~jR(>Vm>O@)?DvM1Lq(1B=}Ai{TmhHv=@^^CsCl zqNKN%M??=&dbpEpN9GW+=OG(zZ}uSdMH(p)>9onG_TZfMr(`uRXQcZO2c!}OTK+2Y=wVjexa)Im%!2TabGz$XNCv5*!#xKq-OJ2**7~`R zV)-o6?g!}~=meiP*)*hk&3>a8hmzIzF0`9s!^|;!_w@FpKKSgE3d>51a3$Ha?=inQ zMMJvCt@RqbvT-nAP&hZHC*?I4r}T$g@5wWvpzUUTp2_Zb^W6TRR);>bG_^HlXXfH( z@qB;aD*kM~qqw2;OU@5Xl$%dCvHNdCkJf;KJ}Tbw0%1IB@(j16(J65J9~Z0PfPbA|eqPQ@us{bHO!%e8pts;pIf<1U26e^Y=hb#}XvClBOH4 z1$9i}y4U>MR($`6+n-ZE)-$NDDBqA!3AaakjM$waJyWQ+?st~bqgtFveXtL;L#zj1 zJZQXP(v>TXzq6MJcH@gfo2vMtw|>BwE7@&TlR-M?*fjbBZ&!CVKEqa+ zWW8tfq}lJ;h-c{3^3(EWJC@~8vb~!QPv8i8?3n^NanE&=Pn&o0zEARx)+$L(m2pkZ z-IW!J2sj?cvu=N>lZk|*xS5%V^p`ZzJu_k`rx>^?UTZlF|o`Gt7#r&M%r6I6A$pP530`8uPp2PTHP#f|vQTCVO_+vkL$0xh|T z4tm)$MUfi`G5B<8!oXCtw;Ok`A2B8I$-Ol_PCM_yMWq$MTO#V8p!`vofg@x!>_@#R zR=5|mmjrO=E778R@oL8mT1iZHj>)Tt1gX&qcS_Y!GfRc1U2!?{C3nMm6FmECXS|@} zI#CwFd6fe{>F{yArahTLzH8g>H1idmf$69vRSLDBc1S#X{}WZaK%zFHa{Z&Ih&JBR z1+O!dG)qp9)|+db9>MlTmnLKU_s~j8st+aRHK)agdA})QSMzKrTB2o6C?w)!x3D|c z^Lfnwtbb73@9ur}t}=JBim#cA_9vU})StZipT6nSA2$Va=-7{Pjv2VWW-Z}qG$ejS zh|uYM_~bnE$)hZd0&Ewjy~kCB^ox5cry0ecogEX1T#Y1=LY3^WeE50o#DV`DJxXoo z!h>m@`xzrr?EH=E%b^)EyX={{PZX~u>_5d%2s0i>o!W7abZ+TQ*r(!H|H}|!>)?-> z+XdRHE}BY*c;m-}5U^%Xt+WCy4=tee>b|v(YL~Jl6OA0g#LR}hjN3k{H7Pqgxru5$ z(sg6qSc-+FfX$Iv6e-|?l{VpuXm zD~M*a7frP`aXg<}Kz55-A z(TjQC8~**po23u)G+Q#WqsCfq((!k0c|0q6*?8t!@P0qGtbCqZi{Di1WDdi^r`Tgx z5zq#Y!+WEfa-=X=n>=|76w88;n!5~ciR#a%AzS)&b9puQvvY6#5p!US2~;nBSrGcf zUL8-*!2z;++(N%vuUrVJ*a@0-zkZ@e527FMk^W8+j>_`@oTIe`lNipS1=5ADKwNWhzV$v?LW&DpCjIW;0^(Mf`WG00>F# zL3SQu9Dc!1Ik&Mgp*RjM+xC_icGanU3+I<*>PWtNog%~$Fp_Q*=A@Tb@uvLx_BIrl zbo`IO{7_&eFCZ~T9Rk=T0HqPMDM`#;8$7z zOASPMIKU?jSU`F5Xj2Q6HdKB)g5iuXu!Rz)B- zGtpHXbl$PXWG$eXF(-h~=-Y@4I=2P8RVn1DLpSAiX5wsM0@Lvtxu&`DzuZ74p&zne zyWTAn?m9w??l1nSCq0Q@UAh1F0upfBA-?Y5x`xOHu&U-SpP}ou*h5zE6NIL%0`q}~ z;`5%5u==q+B&cZA>vI*NN;?8(QI|l#Ar?twK#Aaf&3YGpK6Qa`G_uEmmNXYYT(WZ( z3nn08h=|{DCcarYvwF4pWGIBrDju4-A!|j`k`F_|)yg3i>JF@>cam^)%^Lm96s9@R zA@5%Ktq7@K4rM|sllx!EA}iI_;AechEzZ5l_4F-}Q7teRz&w-<;Wg~cLv5orP-=)c zy9x;xA;^Gxb2(>x3@FezKp73#K`c;#8MB69!F`w~c)+>VLo>JWUkJ^^G%?LCC}+fm zOHYQRq|2u%Z!r<~E?W zEq2lJv|#q8MP@uRpQgNlvBaEgCpP;s0rkF#$eb)h@lHFtJSVw(;XgNyv>0HWPv%zkKGDE1Sc1g2I_i+o zip`B;tEh!>k6oIY{2CIv_(hOzgT(vz#__Q-#qkW5UndvE7bO%jY9oKLg7$CHYoFKt ze(k1xZ!pu=FaUA%*=Yz)P$%;@%mn_>7SJ}Cqj|!uqucC5hMv#2c#1lV!?cN-H6O&G zhBujH@>~34U}NR_Bu7-wuhO*r>i)jKxWfk`l54csM3KEJhypE}XTlEc!<6FCxSeHO z_2|ZjUkHS0Zo((cr^#?kC%VzarnXPzWH16$(LQw1iIIZM3MSOAUxlHwtfLsuUS|e| z^$`4p=Yiqm%s|MJh|9xc@pi}J#QwsSUZX&%G*fRSug?M;8a8~?UfxP8c9CQ5ot@;E zMX_0Bn0(o`ULJdibX|2-PmV^WdJdN)6?wLB-Kt7}9QfpGoKAXVe0PUgPLw3s*m=i3 zwq@`Yl-*&JJlRVQeUV#xpP^GJwKvH>*V6mM#t8srG{b5m{zS+|+U2iv4`!&_KU> z^U33HK4U^vg5nlaaMVN;S5iOE3}uZ|G5p@Y{tK=;1!&v%(F;iYbLgcTEs93`cIFD< zy)&;zHPk{czl3--Peo)(CrJE5YZ!)`Ue#X>a?1;j7mvx~2%72SYYM%dUFb7>D?8e; zSBELv`s4WNywz65>!%~*T@kL)IkSDw9sMG&nxXy!GM@7I-NDno`cisGn%HFsCAj#` zmJ%Wu9&ON1(pC~nQf72xZ>?Npq}c*Lzi)=@L)=5x7m5X@C=Jq8rR#@FHe`j&?Wh>f zI}Pz}{ua=`+q~mpi6pre^&==X+?(pT^4lR039*&%^XP}(*t>%s+C*ZN)R8q13}A_5 z7uuF4V$2!Eyj%xEh6Ih2EFl*fN!R38I*yCK_^2Amfr}}GQMnD|T5DSFK+6?OtEyzO ze_qX6U0I{k!_4J$!6Zzbp5=T>h>7{X0FW?ipK`b{pO7`O2ScV$ zZ_POn&f5ilrpA&C=y*2cNz2Y^=XtlD))A!oYp-X$C^??u8eo4RB3`6~5G8NYjL3ZFTl7Rh=j~S%Li0@GDkiblsvn*Jln!a@!A@!g4|K zv|UH)sdWk`3Y6gpv=Qqo;v(Y@x!N}tLF<7_=^sdGy?ne`A*}c-t+AQIU>2h_N+{Y- z;g0#ZK7AEf6xv*sk7_Dss7-3|wkwQE9fm$Mr`GqA)x*5KZCE+0vlLDC35ncxYiZyW zx%Fwz(@!L$7eaMg5D;*pH}cbx?>W~e=l*pc&55w6!ys9~?w)e51fxV}cyL33K*3`# z=Tjkl11UnqGW2ONAucrv5IAR2J?s3wm^XxR1qNuIVQ~S~aML=MV0?(9B0g$5^W%<+ z{X7}S6UgOFw_$xgrb|s4g0;xvpv&s#&`r7nHAEzJcI34@EUA9jC&aRN z#fUngt5u^@8oN$KKVZ-$b0c)%>3jg#;heXlxKdy6j$cqD!NsdZH++5eP&NYhQgHZj zZSXDSxoh<5`tmB5q9o1R12JKQt6WLBQXDpzN(zSt{R4H((s=#`;H{8x>vCmmt@any4ih+4v;({H8)MPab`Huj|?mNHGwfa_?$t+NP+IVc3u>Y zY#=FlrR^BzM?jlILV31m77HhTIlX0PS?hwi$4>`kCL4G7*w;(d-@0Y2THR;=eS?x z-aPoRuB&FY$ocL6*+}8E&dz5DzijU=mxzR3K+@WmsL9eF)Lfqe8ACrkNcKN>AymZi zT^$7Ut7ItLow76P$UCRanoqx`6saNKa?IA6#)5Vt^Rt%d7j`KZo&L8lC(Z6pjCXpy zVZ7PqRCjBktv4>y4dVHt+v8d}TqFoyx?K;^Jt@I*@b(UunH$VGn@7ib)TS0fvH6+F zZ_@hzlc8_b`6XP4F5ITnk%)wa9W#*bOKe3QPV9zvqQ=Q-2ulWu&K2ftF|7Z*qFWZm zDD;~88u0UBE#{*MpN-8fC)-7B4TgO@c6vE<=jwIS65|jW*N~-IQA`Lyy~LOf}XLPKb-l@Pi))8(v?j$#Ef@B%gBF! zKxEs(pTo3mu_(QmSdn0UD=&UZAz5Jt8J>?_=@gkIOVWwnFMU8ib|(85l>BR7&Wwu= zJg`$@JnNONd#f2m(euy_VJN2$*1yrO#iRw{GsNecB99Ly2${EuxI=)(W63jv?=Bk$ zVQ@n>L&mVw<6FCoJ7jE@4Nt*(kTdzxh~ZD)jng^-YS$CEOx~QNY~O5}M4Oj*XKE|7 ze4bLSQl3bDOf8I4Ti~V3JkhyJPo`3Ij-9S(2ubw{xwi~)_B~18RCKO{gV9B>s@y=S zTz^ix1`_mJkUStO;cg_QEj0P^yL5;y^J@_gk~6~QtjB5WUQZ_DNi$s-%dqjPCEEAIaD~F#* zzSNp7@}&jmBBMgamZ7tV`>LV7JWchq=nAJrZivlW#A)_fl`vyBHUtGJorVn}fFCc3 z5d1EKBN_-l$Fx9obpX{lUv3rBlaRM2Nhiq!iySpwwSHa{YMmEtW-k_K@@AHFy84wh zi?jZOj9$9Kqctd06OqE-DJAw;Jx)A4>M+7PJ8CNb>=o`g(CjJ4zW%^Hig<{m>(w7yrk<(`hOro|IUqn73c9I}FBVuHP z3&=}5F(TZADVmV&G6I8ewB9w~QBqC>T3+ioj-$1Q5|)Md4*DC{_vz!!7u>q^%?Gh_ zG+u`?ggL`P{5xdX$_uZilB6Q9F@`K(yj7U3FL;l~`BlDkX$cz6L1pW?|QpEb_{TJx+zb%OQ{}FNd?9;z_ zw*N8Z%zF@F!V!<;Dg>wng8<6as}24ij=C`zRUt47^Ucp5lh7=kM7W|ue<*Nzltvbw zt))=KghG7W_7|W6W9weyuG!098z#VhlD+kezvzvnVTwa66YQS`9kBL=MCc=u7Y%To z6##kO1;(!|1Kfaen}nSpq>vD!3!f=(TP(L^_zv}_KPnNq!Mw0dOx@H zg^*ZP0EQ108>Hd%fQ}pw{GC7@d<`4;4+IU@;!l<*@Q-E(fH^Y+v2|4yHh_U@60QRp zLBRxFE`VPOx4Fz<-X01ie4X8aDtiN*ka!3u6GYOq*J==oD^%nZrpOBAlz@2L| zjyx3LGGXdxt5^=nH26tb zs-Vso;cr0NQ$+VcP*^|XZ^|QnActQFxEPzOt?mEyiUZ}MJynQjr!7+ziK^^1f6yLO zZ6J5`F(O{Z$3ra&fz~|7z0v+1QZF|V60rVrQu|Gqi9(B2Haw0%OzIKzRO*q8H1iDz z!>R)B+*l!%)bJJP>?2!QRK*rH+N)RtR+U|n^FPUZw=p=pKMX%O+&B37x{3r2jR6N` zhtd7cZ;Glu^o*(B6s4;T^<=oK64w0!e!*SBK&0(b`N?QaGURbzc>v;Zojyz@TVlR2 z|E?x?fM8Qr-(fLci9Atv&@tF)jdu|3P?TWiTKUPg?|7JaNP*8U;6wZn6)*M9VUoQRAi2w#CBP<% za+%*uwzqxK6A(Z>3xiGU9-6F;y5;;csB(BZZfc%VmF7hw=1|D04Q)%uzkp0E=7lQ= z^xSi$&cJ%Wwu@^F?@a8hBUE`+`bTcu6s38{V>w8`N0te}e&7RtU*IXH?8r>|E*9b61|bO|@D0A)~yyfh(~gM-W(2$xMCIbx1@YGU~wbIeu8{DiTL7!Z&b0}`1>+UL%4DI z0CL2-M+V&x9cIjv8O?Jxb^5h0E0zS23`H|@`nV%5fTTI?)BuEfbetS3a96G8jy03H zA%yBzy4@QS%tWeBO=+a>IEro6oTDyu=@jjoei9RB7ti(L9NX6pDF=vted)6cw0i3g z#jwMi<(LpZH2Xbxnp@!W&}ZbcN0*}U*M_);E)2;d9R6@1?x=mSw}AxP=?HtpxXY1L z$7{SzJ&lmSZ!GlNL7baEd5hSBunOc~)Fh zAo@Zwxd@7g?nWe&h=dh2_VJ-@9J{a}y|RE?7-VxrA7*p$2y*i3P) zgX|bSvsbs`^~1Ms|3$aIfiUJNto7gJhep3{|D}F}$K$c1y>*B;v~N7@rAoVlmmKxN zviQH#twPDAzKX!ZIR0qVBW5~tHhDTb*bEF|4_4OxO+XbL5>NtTw4qzHDw*wDyKvyh z8z-H><@YCPC&l-WqnwCB@(tpseB<*!YppTVWN7U-t>s2$>%La$(`>o9>C>ltqIH;| zMCUtlYW7}{^8EQ@EsoUteE3Tf(zc_Q2xm6KTEG_p*f*VAQ4`_Px^O_QTCB0R~P z1NF_oUWd}FAo?$>NRD~*$LFAYdD6T=UYSwNC#iEPO3qNe7|)^`^{snZSopm?}8ZM zIf1aYzjYr?TK%$6PKB&lva-PF^xxdYzUI7(pq=FNWu0JY(IVX}U+`3a*B17sMiLF7 z*YfW^JpMf-`yyaC`cJ6rBOEGV91`8n_&0-45Xr}Ap8R$j39~ee=`&yXd$98N=6!Wj zh!)d{#@gHef>*?r_ZGt-1UYP8`M z6&n>|yyFY@p|^W#7F7z`>fp<*mr)kp1+}`vNHRRL#IhcTEHCR2kL4n@YmXvFrcRi6 z)|FXtC-H{Ar1?okH{b+Hx6`W=Wc=ghOz%YJl(a09kpG!a$Bv!zOwunrTsd=DuEcQ< zIJWdt8G|toBnk)E{9)(Edn~_j&;_TK+w3AZ>w%a(h;3_ce*r5^IL|+wOBbjoHs#{1 zK57bgvf^R7))g|zu-+-7(>d29(lUMF$&Wb77EC8pQj!WIxJMzhaOo;LWKTxSqzd`>N!b0elUA&;{Qu+IRW4Q${S4 z74w-T8bie92xFJF3%V$eCSHxjtJ>k0bWjO&&81(=3_JX;b?%i-PorR!{ep%TJ+AqDmug(ALwPJqJ!S$Ne8>hO;)b|el$~ij(JSj< zK;b#=^KTvplzs+?b$XE`u#M2EHZ&(a@&qcyh~r;q{R0O1wliaOQ#GRgWXo0Rg&{9j zwQs8Xs;-8gm(;i0HwjUlpFMSRVqdYp7DNd%V07PfG+I0qT;ykbh-FHsQGkdMJ8AG3 z#5y2P+XqNCUAWs$R?#)8(tjIK1d!~`s;5ZqWlyn+fOs%pD@!#}9`+o?LRl7?6D7;< zhV9@^eE%R?CH`?tkxuP>vRwqDsk;37{(=29skzWei+7Y%M!t5<_C`9>+m7tdXHy@i zg+f?KHIYzTU9>B*l4P_+)k_{KFwfYVW|5{Fk#}EPMdd+`uqRj^Y%pvv9z2bmUE9|z zjUx}GzxUC?b=2JFmuc0kd|hHMFE!o`i4~E%H&<^bEztA@UU{sc6oY4?{{+egeY#~D zpD%Kz2o3OdSHRFB|u-djZ8x4tqi`$@v&9a*x>0oLE1FR6fR#0W@%!0TdK%^gYa$ z+cZoFHzhiMvgollR2!QY?UGvHZ=^-U{u@h_{+VSXL;_{~i@M<=YP>?Vx<@XRk%in} zWjrHhICQfth%t+?MLJ3P8ELjDRaEcI0*$bFUO`j7#B7Su{jG(5&R?8qiNW93ARZ%X z>liyoqIOQ@iJ2;el;uezVK$3<>_NgRvhyHaYBv>9Yy@Q)7M1(qx4&$L`|eri z(mvC(oU$6tE>ZFFwV4I~R{e{qo@?+`7@Ei@hVka;)|t1d|B9JM=VV2yu^kFH`4)(P z6Tk8{ZQLPMSQ4db`r^c!e$L2whEXM!rriSJ0``H`;+K_rTfe?db1?sy7n=&Qyobi- zg>X_LqnfW(5<|N1IGQXgCt;W*sdHoog4+gg=c?QIN~$L73hEc`c6{|?_BX03$xfdd z`BAJv{xRk{W6GczB-(Y~U+fkQU+&)UL#4qwI7$lvSc9Sc_}d zZKKYRnFc8vwF}*fN-R&O8xsPPfae?CTPOv-KAo{@C|L4f-BZ?m$jniw?<=pLeT{mx zkR19i(Bhh@e!QBQDwR{&gNvTph2HdhqF^JFmYu?%(Mzg#wOgd03&LLYpA-t;PF!EfDYLV)5zjL^yBl_f}7N%ydxu~3K=K2lPzLS$^gv!f& zFQl{2Rhfzz(>{y>FXTg~gMWpMUp?}F fW0e>^`<^1V=Ld`F_@g^V;2$kDy^AF() Date: Tue, 30 Jul 2024 11:08:09 +0700 Subject: [PATCH 13/23] [Refactor] README from Assignment 02 --- Week 08/Lecture 13/Assignment 02/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Week 08/Lecture 13/Assignment 02/README.md b/Week 08/Lecture 13/Assignment 02/README.md index 3508d64..9aff75d 100644 --- a/Week 08/Lecture 13/Assignment 02/README.md +++ b/Week 08/Lecture 13/Assignment 02/README.md @@ -14,7 +14,7 @@ Here’s a step-by-step guide: ### 📦 Storing API Key in the Database -**Idea**: Create a table to store the API key. You can have a single record in this table that holds the API key. +**Idea**: Create a table to store the API key. We can have a single record in this table that holds the API key. **Table Schema** See the detail [here](/Week%2008/Lecture%2013/Assignment%2002/lecture_13/src/main/resources/data.sql). From c289ceddf3732a130f9a51d0d4eb8f8ec6ea3c5b Mon Sep 17 00:00:00 2001 From: mikeleo03 Date: Tue, 30 Jul 2024 11:08:23 +0700 Subject: [PATCH 14/23] [Feat] Implementation for README from assignment 03 --- Week 08/Lecture 13/Assignment 03/README.md | 217 +++++++++++++++------ 1 file changed, 153 insertions(+), 64 deletions(-) diff --git a/Week 08/Lecture 13/Assignment 03/README.md b/Week 08/Lecture 13/Assignment 03/README.md index 894235f..744f67b 100644 --- a/Week 08/Lecture 13/Assignment 03/README.md +++ b/Week 08/Lecture 13/Assignment 03/README.md @@ -5,33 +5,17 @@ ### 🧐 Detailed Overview -To complete the assignment, we need to add the following functionalities to the existing CRUD project: -1. **Store API key in the database**: Ensure we have a table to store the API key. -2. **Verify requests**: Filter to check for the "api-key" header in incoming requests. -3. **Include header in all responses**: Filter to add the "source" header to all responses. +1. **Store Username for Each API Key**: Add a username field to the `ApiKey` entity and include this in the response headers. +2. **Add Timestamp Header**: Add a `timestamp` header with the current time to all responses. +3. **Store Last Used Time**: Update the `ApiKey` entity to store the last time it was used. +4. **Print Username in Controller**: Implement a method in the controller to print the username associated with the API key. -Here’s a step-by-step guide: +### 🛠️ Modify the `ApiKey` Entity -### 📦 Storing API Key in the Database - -**Idea**: Create a table to store the API key. You can have a single record in this table that holds the API key. - -**Table Schema** -See the detail [here](/Week%2008/Lecture%2013/Assignment%2002/lecture_13/src/main/resources/data.sql). -```sql --- Create `APIKey` table -CREATE TABLE APIKey ( - ID BIGINT AUTO_INCREMENT PRIMARY KEY, - api_key VARCHAR(255) NOT NULL, - description VARCHAR(255), -- Description or label for the API key - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- Timestamp of creation - updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- Timestamp of last update - active BOOLEAN DEFAULT TRUE -- Status to enable or disable the API key -); -``` +**Idea**: Update the `ApiKey` entity to include a username field and a last used time field. **Java Entity** -See the detail [here](/Week%2008/Lecture%2013/Assignment%2002/lecture_13/src/main/java/com/example/lecture_13/data/model/APIKey.java). +See the detail [here](/Week%2008/Lecture%2013/Assignment%2003/lecture_13/src/main/java/com/example/lecture_13/data/model/APIKey.java). ```java @Data @NoArgsConstructor @@ -45,15 +29,21 @@ public class APIKey { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String apiKey; + private String username; // Added username field private String description; private LocalDateTime createdAt; private LocalDateTime updatedAt; private boolean active; + private LocalDateTime lastUsedAt; // Added last used field } ``` +### 🗄️ Update the Repository + +**Idea**: Add a method to update the last used time. + **Repository** -See the detail [here](/Week%2008/Lecture%2013/Assignment%2002/lecture_13/src/main/java/com/example/lecture_13/data/repository/APIKeyRepository.java). +See the detail [here](/Week%2008/Lecture%2013/Assignment%2003/lecture_13/src/main/java/com/example/lecture_13/data/repository/APIKeyRepository.java). ```java @Repository public interface APIKeyRepository extends JpaRepository { @@ -62,62 +52,135 @@ public interface APIKeyRepository extends JpaRepository { Optional findFirstByOrderById(); // Find the first active API key - Optional findFirstByActiveTrueOrderById(); + Optional findFirstByActiveTrueOrderById(); + + // Find the first active API key with a specific API key + Optional findFirstByApiKeyAndActiveTrue(String apiKey); } ``` -### 🔽 Filter for API Key Verification +### 🌐 Create Interceptor -**Idea**: Create a filter that intercepts incoming requests, checks for the "api-key" header, and verifies it against the stored API key in the database. Use it also to add the "source" header to all responses. +**Idea**: Create an interceptor that intercepts incoming requests, checks for the "api-key-username" header, send it to header, and also setup "timestamp" header to all responses. -**Filter Implementation** -See the detail [here](/Week%2008/Lecture%2013/Assignment%2002/lecture_13/src/main/java/com/example/lecture_13/config/filter/APIKeyFilter.java). +**Interceptor Implementation** +See the detail [here](/Week%2008/Lecture%2013/Assignment%2003/lecture_13/src/main/java/com/example/lecture_13/config/interceptor/APIKeyInterceptor.java). ```java @Component -public class APIKeyFilter extends OncePerRequestFilter { +public class APIKeyInterceptor implements HandlerInterceptor { + + private final APIKeyRepository apiKeyRepository; + private final static Logger logger = LoggerFactory.getLogger(APIKeyInterceptor.class); @Autowired - private APIKeyRepository apiKeyRepository; + public APIKeyInterceptor(APIKeyRepository apiKeyRepository) { + this.apiKeyRepository = apiKeyRepository; + logger.info("APIKeyRepository injected: {}", (this.apiKeyRepository != null)); + } + // Request is intercepted by this method before reaching the Controller @Override - protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) - throws ServletException, IOException { - String requestApiKey = request.getHeader("api-key"); + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + // Pre-processing logic here + // Apply timestamp + response.addHeader("timestamp", LocalDateTime.now().toString()); + logger.info("[PreHandle] Timestamp applied."); + logger.info("[PreHandle][" + request + "]" + "[" + request.getMethod()+ "] " + request.getRequestURI()); + return true; // Continue with the request + } - Optional apiKeyOpt = apiKeyRepository.findFirstByActiveTrueOrderById(); - response.addHeader("source", "fpt-software"); + // Response is intercepted by this method before reaching the client + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { + // Post-handle logic here + logger.info("[PostHandle][" + request + "]" + "[" + request.getMethod()+ "] " + request.getRequestURI()); + } + + // This method is called after request & response HTTP communication is done. + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + logger.info("[AfterCompletion][" + request + "]" + "[" + request.getMethod()+ "] " + request.getRequestURI()); + + String username = request.getHeader("api-key-username"); + if (username != null) { + response.addHeader("username", username); + logger.info("[AfterCompletion] Username detected : {}", username); + } + + // Update lastUsedAt in the database + String requestApiKey = request.getHeader("api-key"); + logger.info("[AfterCompletion] API Key : {}", requestApiKey); + Optional apiKeyOpt = apiKeyRepository.findFirstByApiKeyAndActiveTrue(requestApiKey); if (apiKeyOpt.isPresent()) { - String storedApiKey = apiKeyOpt.get().getApiKey(); - - if (storedApiKey.equals(requestApiKey)) { - filterChain.doFilter(request, response); - } else { - response.setStatus(HttpStatus.FORBIDDEN.value()); - response.setContentType("application/json"); - response.getWriter().write("{\"error\": \"Invalid API Key\"}"); - } - } else { - response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value()); - response.setContentType("application/json"); - response.getWriter().write("{\"error\": \"API Key not configured or inactive\"}"); + APIKey apiKey = apiKeyOpt.get(); + apiKey.setUsername(username); + apiKey.setLastUsedAt(LocalDateTime.now()); + apiKeyRepository.save(apiKey); + logger.info("[AfterCompletion] API Key data updated : {}", apiKey); } + + logger.info("[AfterCompletion] Execution done."); } } ``` -### ✔️ Register Filters -**Configuration** -See the detail [here](/Week%2008/Lecture%2013/Assignment%2002/lecture_13/src/main/java/com/example/lecture_13/config/FilterConfig.java). +### ✔️ Register Interceptor +**Interceptor Configuration** +See the detail [here](/Week%2008/Lecture%2013/Assignment%2003/lecture_13/src/main/java/com/example/lecture_13/config/InterceptorConfig.java). ```java @Configuration -public class FilterConfig { - - @Bean - public FilterRegistrationBean apiKeyFilter(APIKeyFilter apiKeyFilter) { - FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); - registrationBean.setFilter(apiKeyFilter); - registrationBean.addUrlPatterns("/api/v1/*"); // All Customer API - return registrationBean; +public class InterceptorConfig implements WebMvcConfigurer { + // Register an interceptor with the registry + private final APIKeyInterceptor apiKeyInterceptor; + + @Autowired + public InterceptorConfig(APIKeyInterceptor apiKeyInterceptor) { + this.apiKeyInterceptor = apiKeyInterceptor; + } + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(apiKeyInterceptor); + } +} +``` + +#### Response Header Filter + +Update the response header filter to include the `timestamp` header. + +### 🆕 Add a Controller Method to Print Username + +**Idea**: Add a method to your controller to print the username associated with the API key. + +**Customer Controller** +See the detail [here](/Week%2008/Lecture%2013/Assignment%2003/lecture_13/src/main/java/com/example/lecture_13/controller/CustomerController.java). + +```java +@RestController +@RequestMapping("/api/v1/customers") +@Validated +public class CustomerController { + + ..... + + /** + * Retrieves the username of the current API User. + * + * @param apiKey The API key provided in the request header. + * @return The username of the current API User if the provided API key is valid, otherwise returns "Invalid API Key". + */ + @Operation(summary = "Get the username of current API User.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Username retrieved successfully"), + }) + @GetMapping("/username") + public String printUsername(@RequestHeader("api-key") String apiKey) { + Optional apiKeyOpt = apiKeyRepository.findFirstByActiveTrueOrderById(); + if (apiKeyOpt.isPresent() && apiKeyOpt.get().getApiKey().equals(apiKey)) { + return "Username: " + apiKeyOpt.get().getUsername(); + } + return "Invalid API Key"; } } ``` @@ -134,7 +197,10 @@ lecture_13 │ │ ├── config/ │ │ │ ├── filter/ │ │ │ │ └── APIKeyFilter.java +│ │ │ ├── interceptor/ +│ │ │ │ └── APIKeyInterceptor.java │ │ │ ├── FilterConfig.java +│ │ │ ├── InterceptorConfig.java │ │ │ └── WebConfig.java │ │ ├── controller/ │ │ │ └── CustomerController.java @@ -201,7 +267,9 @@ CREATE TABLE APIKey ( description VARCHAR(255), -- Description or label for the API key created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- Timestamp of creation updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- Timestamp of last update - active BOOLEAN DEFAULT TRUE -- Status to enable or disable the API key + active BOOLEAN DEFAULT TRUE, -- Status to enable or disable the API key + last_used_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- Last time the API key was used + username VARCHAR(255) -- Username associated with the API key ); ``` @@ -259,17 +327,38 @@ If all the instruction is well executed, Open [localhost:8080](http://localhost: | /api/v1/customers/active/{id} | PUT | Activate the existing customer by their customer ID. Make sure the customer ID exists and is currently inactive. | | /api/v1/customers/deactive/{id} | PUT | Deactivate the existing customer by their customer ID. Make sure the customer ID exists and is currently active. | | /api/v1/customers/{id} | DELETE | Delete an existing customer by customer ID. Make sure the customer ID exists. | +| /api/v1/customers/username | GET | Get the current username of Customer API user. | ### 🚀 Demonstration +#### Screenshots ![Screenshots](/Week%2008/Lecture%2013/Assignment%2002/img/demo1.png) -Result if API Key not exists or not configured on the header. +The request headers used and the response headers returned. ![Screenshots](/Week%2008/Lecture%2013/Assignment%2002/img/demo2.png) -Result if API Key well-configured on the header. +Data stored on APIKey table from database. ![Screenshots](/Week%2008/Lecture%2013/Assignment%2002/img/demo3.png) -Result header returning source from fpt-software. \ No newline at end of file +The current Customer API username. + +#### Logs +Here is the log printed from the console (excluding the SQL Hibernate log) when `GET` request to `/api/v1/customers` is called with the defined headers. +```java +[Filter][org.apache.catalina.connector.RequestFacade@73cd94a6][GET] /api/v1/customers +[Filter] doFilter starts. +[PreHandle][org.apache.catalina.connector.RequestFacade@73cd94a6][GET] /api/v1/customers +[PreHandle] Timestamp applied. +[PreHandle] preHandle done. +[PostHandle][org.apache.catalina.connector.RequestFacade@73cd94a6][GET] /api/v1/customers +[PostHandle] postHandle done. +[AfterCompletion][org.apache.catalina.connector.RequestFacade@73cd94a6][GET] /api/v1/customers +[AfterCompletion] Username detected : Leon +[AfterCompletion] API Key : 12345-ABCDE +[AfterCompletion] API Key data updated : APIKey(id=1, apiKey=12345-ABCDE, username=Leon, description=Primary API Key for System Access, createdAt=2024-07-29T15:12:25, updatedAt=2024-07-29T15:12:25, active=true, lastUsedAt=2024-07-30T10:53:09.157716200) +[AfterCompletion] afterCompletion done. +[Filter] doFilter done. +[Filter] Logging Response : 200 +``` \ No newline at end of file From 128127aa4f93724ec97452e1bcee8bcb03612d1f Mon Sep 17 00:00:00 2001 From: mikeleo03 Date: Tue, 30 Jul 2024 11:10:52 +0700 Subject: [PATCH 15/23] [Refactor] README image redirection --- Week 08/Lecture 13/Assignment 03/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Week 08/Lecture 13/Assignment 03/README.md b/Week 08/Lecture 13/Assignment 03/README.md index 744f67b..a40e934 100644 --- a/Week 08/Lecture 13/Assignment 03/README.md +++ b/Week 08/Lecture 13/Assignment 03/README.md @@ -332,15 +332,15 @@ If all the instruction is well executed, Open [localhost:8080](http://localhost: ### 🚀 Demonstration #### Screenshots -![Screenshots](/Week%2008/Lecture%2013/Assignment%2002/img/demo1.png) +![Screenshots](/Week%2008/Lecture%2013/Assignment%2003/img/demo1.png) The request headers used and the response headers returned. -![Screenshots](/Week%2008/Lecture%2013/Assignment%2002/img/demo2.png) +![Screenshots](/Week%2008/Lecture%2013/Assignment%2003/img/demo2.png) Data stored on APIKey table from database. -![Screenshots](/Week%2008/Lecture%2013/Assignment%2002/img/demo3.png) +![Screenshots](/Week%2008/Lecture%2013/Assignment%2003/img/demo3.png) The current Customer API username. From 27405327169592e8fe3347d137033ec5dbe6eb09 Mon Sep 17 00:00:00 2001 From: mikeleo03 Date: Tue, 30 Jul 2024 11:23:09 +0700 Subject: [PATCH 16/23] [Feat] Swagger documentation --- Week 08/Lecture 13/Assignment 03/README.md | 5 +++++ .../Lecture 13/Assignment 03/img/swagger.png | Bin 0 -> 89470 bytes 2 files changed, 5 insertions(+) create mode 100644 Week 08/Lecture 13/Assignment 03/img/swagger.png diff --git a/Week 08/Lecture 13/Assignment 03/README.md b/Week 08/Lecture 13/Assignment 03/README.md index a40e934..bc7ce35 100644 --- a/Week 08/Lecture 13/Assignment 03/README.md +++ b/Week 08/Lecture 13/Assignment 03/README.md @@ -344,6 +344,11 @@ Data stored on APIKey table from database. The current Customer API username. +#### Swagger Documentation +I use swagger for documentation, you can access it [here](http://localhost:8080/swagger-ui/index.html) + +![Screenshots](/Week%2008/Lecture%2013/Assignment%2003/img/swagger.png) + #### Logs Here is the log printed from the console (excluding the SQL Hibernate log) when `GET` request to `/api/v1/customers` is called with the defined headers. ```java diff --git a/Week 08/Lecture 13/Assignment 03/img/swagger.png b/Week 08/Lecture 13/Assignment 03/img/swagger.png new file mode 100644 index 0000000000000000000000000000000000000000..260be2d4d400ae72376618424a4be143f243cc41 GIT binary patch literal 89470 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 Date: Wed, 31 Jul 2024 10:48:20 +0700 Subject: [PATCH 17/23] [Init] Initiate FeignClient demo project --- .../feignClientDemo/.gitignore | 33 +++ .../.mvn/wrapper/maven-wrapper.properties | 19 ++ .../FeignClientDemo/feignClientDemo/mvnw | 259 ++++++++++++++++++ .../FeignClientDemo/feignClientDemo/mvnw.cmd | 149 ++++++++++ .../FeignClientDemo/feignClientDemo/pom.xml | 54 ++++ .../FeignClientDemoApplication.java | 13 + .../src/main/resources/application.properties | 1 + .../FeignClientDemoApplicationTests.java | 13 + 8 files changed, 541 insertions(+) create mode 100644 Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/.gitignore create mode 100644 Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/.mvn/wrapper/maven-wrapper.properties create mode 100644 Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/mvnw create mode 100644 Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/mvnw.cmd create mode 100644 Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/pom.xml create mode 100644 Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/FeignClientDemoApplication.java create mode 100644 Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/resources/application.properties create mode 100644 Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/test/java/com/example/feignClientDemo/FeignClientDemoApplicationTests.java diff --git a/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/.gitignore b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/.mvn/wrapper/maven-wrapper.properties b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..8f96f52 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,19 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +wrapperVersion=3.3.2 +distributionType=only-script +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.7/apache-maven-3.9.7-bin.zip diff --git a/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/mvnw b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/mvnw new file mode 100644 index 0000000..d7c358e --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/mvnw @@ -0,0 +1,259 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.3.2 +# +# Optional ENV vars +# ----------------- +# JAVA_HOME - location of a JDK home dir, required when download maven via java source +# MVNW_REPOURL - repo url base for downloading maven distribution +# MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +# MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output +# ---------------------------------------------------------------------------- + +set -euf +[ "${MVNW_VERBOSE-}" != debug ] || set -x + +# OS specific support. +native_path() { printf %s\\n "$1"; } +case "$(uname)" in +CYGWIN* | MINGW*) + [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")" + native_path() { cygpath --path --windows "$1"; } + ;; +esac + +# set JAVACMD and JAVACCMD +set_java_home() { + # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched + if [ -n "${JAVA_HOME-}" ]; then + if [ -x "$JAVA_HOME/jre/sh/java" ]; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACCMD="$JAVA_HOME/jre/sh/javac" + else + JAVACMD="$JAVA_HOME/bin/java" + JAVACCMD="$JAVA_HOME/bin/javac" + + if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then + echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2 + echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2 + return 1 + fi + fi + else + JAVACMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v java + )" || : + JAVACCMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v javac + )" || : + + if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then + echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2 + return 1 + fi + fi +} + +# hash string like Java String::hashCode +hash_string() { + str="${1:-}" h=0 + while [ -n "$str" ]; do + char="${str%"${str#?}"}" + h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296)) + str="${str#?}" + done + printf %x\\n $h +} + +verbose() { :; } +[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; } + +die() { + printf %s\\n "$1" >&2 + exit 1 +} + +trim() { + # MWRAPPER-139: + # Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds. + # Needed for removing poorly interpreted newline sequences when running in more + # exotic environments such as mingw bash on Windows. + printf "%s" "${1}" | tr -d '[:space:]' +} + +# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties +while IFS="=" read -r key value; do + case "${key-}" in + distributionUrl) distributionUrl=$(trim "${value-}") ;; + distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;; + esac +done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties" +[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties" + +case "${distributionUrl##*/}" in +maven-mvnd-*bin.*) + MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ + case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in + *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;; + :Darwin*x86_64) distributionPlatform=darwin-amd64 ;; + :Darwin*arm64) distributionPlatform=darwin-aarch64 ;; + :Linux*x86_64*) distributionPlatform=linux-amd64 ;; + *) + echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2 + distributionPlatform=linux-amd64 + ;; + esac + distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip" + ;; +maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;; +*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;; +esac + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}" +distributionUrlName="${distributionUrl##*/}" +distributionUrlNameMain="${distributionUrlName%.*}" +distributionUrlNameMain="${distributionUrlNameMain%-bin}" +MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}" +MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")" + +exec_maven() { + unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || : + exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD" +} + +if [ -d "$MAVEN_HOME" ]; then + verbose "found existing MAVEN_HOME at $MAVEN_HOME" + exec_maven "$@" +fi + +case "${distributionUrl-}" in +*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;; +*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;; +esac + +# prepare tmp dir +if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then + clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; } + trap clean HUP INT TERM EXIT +else + die "cannot create temp dir" +fi + +mkdir -p -- "${MAVEN_HOME%/*}" + +# Download and Install Apache Maven +verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +verbose "Downloading from: $distributionUrl" +verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +# select .zip or .tar.gz +if ! command -v unzip >/dev/null; then + distributionUrl="${distributionUrl%.zip}.tar.gz" + distributionUrlName="${distributionUrl##*/}" +fi + +# verbose opt +__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR='' +[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v + +# normalize http auth +case "${MVNW_PASSWORD:+has-password}" in +'') MVNW_USERNAME='' MVNW_PASSWORD='' ;; +has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;; +esac + +if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then + verbose "Found wget ... using wget" + wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl" +elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then + verbose "Found curl ... using curl" + curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl" +elif set_java_home; then + verbose "Falling back to use Java to download" + javaSource="$TMP_DOWNLOAD_DIR/Downloader.java" + targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName" + cat >"$javaSource" <<-END + public class Downloader extends java.net.Authenticator + { + protected java.net.PasswordAuthentication getPasswordAuthentication() + { + return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() ); + } + public static void main( String[] args ) throws Exception + { + setDefault( new Downloader() ); + java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() ); + } + } + END + # For Cygwin/MinGW, switch paths to Windows format before running javac and java + verbose " - Compiling Downloader.java ..." + "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java" + verbose " - Running Downloader.java ..." + "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")" +fi + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +if [ -n "${distributionSha256Sum-}" ]; then + distributionSha256Result=false + if [ "$MVN_CMD" = mvnd.sh ]; then + echo "Checksum validation is not supported for maven-mvnd." >&2 + echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + elif command -v sha256sum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then + distributionSha256Result=true + fi + elif command -v shasum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then + distributionSha256Result=true + fi + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2 + echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + fi + if [ $distributionSha256Result = false ]; then + echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2 + echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2 + exit 1 + fi +fi + +# unzip and move +if command -v unzip >/dev/null; then + unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip" +else + tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar" +fi +printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url" +mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME" + +clean || : +exec_maven "$@" diff --git a/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/mvnw.cmd b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/mvnw.cmd new file mode 100644 index 0000000..6f779cf --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/mvnw.cmd @@ -0,0 +1,149 @@ +<# : batch portion +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.3.2 +@REM +@REM Optional ENV vars +@REM MVNW_REPOURL - repo url base for downloading maven distribution +@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output +@REM ---------------------------------------------------------------------------- + +@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0) +@SET __MVNW_CMD__= +@SET __MVNW_ERROR__= +@SET __MVNW_PSMODULEP_SAVE=%PSModulePath% +@SET PSModulePath= +@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @( + IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B) +) +@SET PSModulePath=%__MVNW_PSMODULEP_SAVE% +@SET __MVNW_PSMODULEP_SAVE= +@SET __MVNW_ARG0_NAME__= +@SET MVNW_USERNAME= +@SET MVNW_PASSWORD= +@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*) +@echo Cannot start maven from wrapper >&2 && exit /b 1 +@GOTO :EOF +: end batch / begin powershell #> + +$ErrorActionPreference = "Stop" +if ($env:MVNW_VERBOSE -eq "true") { + $VerbosePreference = "Continue" +} + +# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties +$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl +if (!$distributionUrl) { + Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" +} + +switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) { + "maven-mvnd-*" { + $USE_MVND = $true + $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip" + $MVN_CMD = "mvnd.cmd" + break + } + default { + $USE_MVND = $false + $MVN_CMD = $script -replace '^mvnw','mvn' + break + } +} + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +if ($env:MVNW_REPOURL) { + $MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" } + $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')" +} +$distributionUrlName = $distributionUrl -replace '^.*/','' +$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$','' +$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain" +if ($env:MAVEN_USER_HOME) { + $MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain" +} +$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join '' +$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME" + +if (Test-Path -Path "$MAVEN_HOME" -PathType Container) { + Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME" + Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" + exit $? +} + +if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) { + Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl" +} + +# prepare tmp dir +$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile +$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir" +$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null +trap { + if ($TMP_DOWNLOAD_DIR.Exists) { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } + } +} + +New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null + +# Download and Install Apache Maven +Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +Write-Verbose "Downloading from: $distributionUrl" +Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +$webclient = New-Object System.Net.WebClient +if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) { + $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD) +} +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum +if ($distributionSha256Sum) { + if ($USE_MVND) { + Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." + } + Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash + if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) { + Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property." + } +} + +# unzip and move +Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null +Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null +try { + Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null +} catch { + if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) { + Write-Error "fail to move MAVEN_HOME" + } +} finally { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } +} + +Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" diff --git a/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/pom.xml b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/pom.xml new file mode 100644 index 0000000..b6ca51a --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/pom.xml @@ -0,0 +1,54 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.3.2 + + + com.example + feignClientDemo + 0.0.1-SNAPSHOT + feignClientDemo + Demo project for Spring Boot + + + + + + + + + + + + + + + 21 + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/FeignClientDemoApplication.java b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/FeignClientDemoApplication.java new file mode 100644 index 0000000..d24a6f1 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/FeignClientDemoApplication.java @@ -0,0 +1,13 @@ +package com.example.feignClientDemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class FeignClientDemoApplication { + + public static void main(String[] args) { + SpringApplication.run(FeignClientDemoApplication.class, args); + } + +} diff --git a/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/resources/application.properties b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/resources/application.properties new file mode 100644 index 0000000..ab07292 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.application.name=feignClientDemo diff --git a/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/test/java/com/example/feignClientDemo/FeignClientDemoApplicationTests.java b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/test/java/com/example/feignClientDemo/FeignClientDemoApplicationTests.java new file mode 100644 index 0000000..97499ea --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/test/java/com/example/feignClientDemo/FeignClientDemoApplicationTests.java @@ -0,0 +1,13 @@ +package com.example.feignClientDemo; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class FeignClientDemoApplicationTests { + + @Test + void contextLoads() { + } + +} From aeb50e7e4ccc3a8f53427f9f16982c9de76959ce Mon Sep 17 00:00:00 2001 From: mikeleo03 Date: Wed, 31 Jul 2024 11:46:02 +0700 Subject: [PATCH 18/23] [Feat] FeignClient Demo done --- .../FeignClientDemo/feignClientDemo/pom.xml | 56 ++++++++++++- .../FeignClientDemoApplication.java | 2 + .../feignClientDemo/client/AlbumClient.java | 16 ++++ .../client/JSONPlaceHolderClient.java | 22 +++++ .../feignClientDemo/client/PostClient.java | 13 +++ .../feignClientDemo/client/TodoClient.java | 15 ++++ .../config/ClientConfiguration.java | 42 ++++++++++ .../config/CustomErrorDecoder.java | 19 +++++ .../config/DynamicUrlInterceptor.java | 23 +++++ .../ConfigureFeignUrlController.java | 84 +++++++++++++++++++ .../exception/BadRequestException.java | 20 +++++ .../exception/NotFoundException.java | 17 ++++ .../hystrix/JSONPlaceHolderFallback.java | 23 +++++ .../example/feignClientDemo/model/Album.java | 32 +++++++ .../example/feignClientDemo/model/Post.java | 41 +++++++++ .../example/feignClientDemo/model/Todo.java | 40 +++++++++ .../patcherror/client/UserClient.java | 16 ++++ .../patcherror/model/User.java | 34 ++++++++ .../service/JSONPlaceHolderService.java | 12 +++ .../impl/JSONPlaceHolderServiceImpl.java | 27 ++++++ .../src/main/resources/application.properties | 9 ++ .../FeignClientDemoApplicationTests.java | 13 --- .../feignClientDemo/OpenFeignManualTest.java | 44 ++++++++++ .../feignClientDemo/SpringContextTest.java | 15 ++++ 24 files changed, 620 insertions(+), 15 deletions(-) create mode 100644 Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/client/AlbumClient.java create mode 100644 Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/client/JSONPlaceHolderClient.java create mode 100644 Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/client/PostClient.java create mode 100644 Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/client/TodoClient.java create mode 100644 Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/config/ClientConfiguration.java create mode 100644 Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/config/CustomErrorDecoder.java create mode 100644 Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/config/DynamicUrlInterceptor.java create mode 100644 Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/controller/ConfigureFeignUrlController.java create mode 100644 Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/exception/BadRequestException.java create mode 100644 Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/exception/NotFoundException.java create mode 100644 Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/hystrix/JSONPlaceHolderFallback.java create mode 100644 Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/model/Album.java create mode 100644 Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/model/Post.java create mode 100644 Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/model/Todo.java create mode 100644 Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/patcherror/client/UserClient.java create mode 100644 Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/patcherror/model/User.java create mode 100644 Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/service/JSONPlaceHolderService.java create mode 100644 Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/service/impl/JSONPlaceHolderServiceImpl.java delete mode 100644 Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/test/java/com/example/feignClientDemo/FeignClientDemoApplicationTests.java create mode 100644 Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/test/java/com/example/feignClientDemo/OpenFeignManualTest.java create mode 100644 Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/test/java/com/example/feignClientDemo/SpringContextTest.java diff --git a/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/pom.xml b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/pom.xml index b6ca51a..9f93916 100644 --- a/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/pom.xml +++ b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/pom.xml @@ -2,17 +2,19 @@ 4.0.0 + org.springframework.boot spring-boot-starter-parent 3.3.2 + com.example feignClientDemo - 0.0.1-SNAPSHOT + 1.0-SNAPSHOT feignClientDemo - Demo project for Spring Boot + OpenFeign project for Spring Boot @@ -28,18 +30,68 @@ 21 + 2023.0.3 + 3.0.1 + + + + + org.springframework.cloud + spring-cloud-dependencies + 2023.0.3 + pom + import + + + + org.springframework.boot spring-boot-starter + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.cloud + spring-cloud-starter-openfeign + 4.1.3 + + + io.github.openfeign + feign-okhttp + + + + + org.apache.httpcomponents + httpclient + 4.5.13 + + + org.springframework.boot spring-boot-starter-test test + + com.github.tomakehurst + wiremock-jre8 + 3.0.1 + test + + + junit + junit + 4.13.2 + test + diff --git a/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/FeignClientDemoApplication.java b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/FeignClientDemoApplication.java index d24a6f1..56d34cf 100644 --- a/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/FeignClientDemoApplication.java +++ b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/FeignClientDemoApplication.java @@ -2,8 +2,10 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.openfeign.EnableFeignClients; @SpringBootApplication +@EnableFeignClients public class FeignClientDemoApplication { public static void main(String[] args) { diff --git a/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/client/AlbumClient.java b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/client/AlbumClient.java new file mode 100644 index 0000000..a6e542b --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/client/AlbumClient.java @@ -0,0 +1,16 @@ +package com.example.feignClientDemo.client; + +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; + +import com.example.feignClientDemo.model.Album; + +@FeignClient(name = "albumClient", url = "https://jsonplaceholder.typicode.com/albums/") +public interface AlbumClient { + @GetMapping(value = "/{id}") + Album getAlbumById(@PathVariable(value = "id") Integer id); + + @GetMapping(value = "/{id}") + Album getAlbumByIdAndDynamicUrl(@PathVariable(name = "id") Integer id); +} diff --git a/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/client/JSONPlaceHolderClient.java b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/client/JSONPlaceHolderClient.java new file mode 100644 index 0000000..2bd8a77 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/client/JSONPlaceHolderClient.java @@ -0,0 +1,22 @@ +package com.example.feignClientDemo.client; + +import java.util.List; + +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +import com.example.feignClientDemo.config.ClientConfiguration; +import com.example.feignClientDemo.hystrix.JSONPlaceHolderFallback; +import com.example.feignClientDemo.model.Post; + +@FeignClient(value = "jplaceholder", url = "https://jsonplaceholder.typicode.com/", configuration = ClientConfiguration.class, fallback = JSONPlaceHolderFallback.class) +public interface JSONPlaceHolderClient { + + @RequestMapping(method = RequestMethod.GET, value = "/posts") + List getPosts(); + + @RequestMapping(method = RequestMethod.GET, value = "/posts/{postId}", produces = "application/json") + Post getPostById(@PathVariable("postId") Long postId); +} diff --git a/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/client/PostClient.java b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/client/PostClient.java new file mode 100644 index 0000000..d55db30 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/client/PostClient.java @@ -0,0 +1,13 @@ +package com.example.feignClientDemo.client; + +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; + +import com.example.feignClientDemo.model.Post; + +@FeignClient(name = "postClient", url = "${spring.cloud.openfeign.client.config.postClient.url}") +public interface PostClient { + @GetMapping(value = "/{id}") + Post getPostById(@PathVariable(value = "id") Integer id); +} diff --git a/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/client/TodoClient.java b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/client/TodoClient.java new file mode 100644 index 0000000..daf9f9c --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/client/TodoClient.java @@ -0,0 +1,15 @@ +package com.example.feignClientDemo.client; + +import java.net.URI; + +import org.springframework.cloud.openfeign.FeignClient; + +import com.example.feignClientDemo.model.Todo; + +import feign.RequestLine; + +@FeignClient(name = "todoClient") +public interface TodoClient { + @RequestLine(value = "GET") + Todo getTodoById(URI uri); +} diff --git a/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/config/ClientConfiguration.java b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/config/ClientConfiguration.java new file mode 100644 index 0000000..2d8c2a9 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/config/ClientConfiguration.java @@ -0,0 +1,42 @@ +package com.example.feignClientDemo.config; + +import org.apache.http.entity.ContentType; +import org.springframework.context.annotation.Bean; + +import feign.Logger; +import feign.RequestInterceptor; +import feign.auth.BasicAuthRequestInterceptor; +import feign.codec.ErrorDecoder; +import feign.okhttp.OkHttpClient; + +public class ClientConfiguration { + + @Bean + public Logger.Level feignLoggerLevel() { + return Logger.Level.FULL; + } + + @Bean + public ErrorDecoder errorDecoder() { + return new CustomErrorDecoder(); + } + + @Bean + public OkHttpClient client() { + return new OkHttpClient(); + } + + @Bean + public RequestInterceptor requestInterceptor() { + return requestTemplate -> { + requestTemplate.header("user", "ajeje"); + requestTemplate.header("password", "brazof"); + requestTemplate.header("Accept", ContentType.APPLICATION_JSON.getMimeType()); + }; + } + + // @Bean - uncomment to use this interceptor and remove @Bean from the requestInterceptor() + public BasicAuthRequestInterceptor basicAuthRequestInterceptor() { + return new BasicAuthRequestInterceptor("ajeje", "brazof"); + } +} diff --git a/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/config/CustomErrorDecoder.java b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/config/CustomErrorDecoder.java new file mode 100644 index 0000000..b481fbb --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/config/CustomErrorDecoder.java @@ -0,0 +1,19 @@ +package com.example.feignClientDemo.config; + +import com.example.feignClientDemo.exception.BadRequestException; +import com.example.feignClientDemo.exception.NotFoundException; + +import feign.Response; +import feign.codec.ErrorDecoder; + +public class CustomErrorDecoder implements ErrorDecoder { + @Override + public Exception decode(String methodKey, Response response) { + + return switch (response.status()) { + case 400 -> new BadRequestException(); + case 404 -> new NotFoundException("Not found !!!"); + default -> new Exception("Generic error"); + }; + } +} diff --git a/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/config/DynamicUrlInterceptor.java b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/config/DynamicUrlInterceptor.java new file mode 100644 index 0000000..4c6fce1 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/config/DynamicUrlInterceptor.java @@ -0,0 +1,23 @@ +package com.example.feignClientDemo.config; + +import java.util.function.Supplier; + +import feign.RequestInterceptor; +import feign.RequestTemplate; + +public class DynamicUrlInterceptor implements RequestInterceptor { + + private final Supplier urlSupplier; + + public DynamicUrlInterceptor(Supplier urlSupplier) { + this.urlSupplier = urlSupplier; + } + + @Override + public void apply(RequestTemplate template) { + String url = urlSupplier.get(); + if (url != null) { + template.target(url); + } + } +} diff --git a/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/controller/ConfigureFeignUrlController.java b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/controller/ConfigureFeignUrlController.java new file mode 100644 index 0000000..2771c4c --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/controller/ConfigureFeignUrlController.java @@ -0,0 +1,84 @@ +package com.example.feignClientDemo.controller; + +import java.net.URI; + +import org.springframework.beans.factory.ObjectFactory; +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.boot.autoconfigure.http.HttpMessageConverters; +import org.springframework.cloud.openfeign.FeignClientsConfiguration; +import org.springframework.cloud.openfeign.support.HttpMessageConverterCustomizer; +import org.springframework.cloud.openfeign.support.SpringDecoder; +import org.springframework.cloud.openfeign.support.SpringEncoder; +import org.springframework.cloud.openfeign.support.SpringMvcContract; +import org.springframework.context.annotation.Import; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +import com.example.feignClientDemo.client.AlbumClient; +import com.example.feignClientDemo.client.PostClient; +import com.example.feignClientDemo.client.TodoClient; +import com.example.feignClientDemo.config.DynamicUrlInterceptor; +import com.example.feignClientDemo.model.Album; +import com.example.feignClientDemo.model.Post; +import com.example.feignClientDemo.model.Todo; + +import feign.Feign; +import feign.Target; +import feign.codec.Decoder; +import feign.codec.Encoder; + +@RestController +@Import(FeignClientsConfiguration.class) +public class ConfigureFeignUrlController { + private final AlbumClient albumClient; + + private final PostClient postClient; + + private final TodoClient todoClient; + + private final ObjectFactory messageConverters; + + private final ObjectProvider customizers; + + public ConfigureFeignUrlController(AlbumClient albumClient, + PostClient postClient, + Decoder decoder, + Encoder encoder, + ObjectFactory messageConverters, ObjectProvider customizers) { + this.albumClient = albumClient; + this.postClient = postClient; + this.messageConverters = messageConverters; + this.customizers = customizers; + this.todoClient = Feign.builder().encoder(encoder).decoder(decoder).target(Target.EmptyTarget.create(TodoClient.class)); + } + + @GetMapping(value = "albums/{id}") + public Album getAlbumById(@PathVariable(value = "id") Integer id) { + return albumClient.getAlbumById(id); + } + + @GetMapping(value = "posts/{id}") + public Post getPostById(@PathVariable(value = "id") Integer id) { + return postClient.getPostById(id); + } + + @GetMapping(value = "todos/{id}") + public Todo getTodoById(@PathVariable(value = "id") Integer id) { + return todoClient.getTodoById(URI.create("https://jsonplaceholder.typicode.com/todos/" + id)); + } + + @GetMapping(value = "/dynamicAlbums/{id}") + public Album getAlbumByIdAndDynamicUrl(@PathVariable(value = "id") Integer id) { + AlbumClient client = Feign.builder() + .requestInterceptor(new DynamicUrlInterceptor(() -> "https://jsonplaceholder.typicode.com/albums/")) + .contract(new SpringMvcContract()) + .encoder(new SpringEncoder(messageConverters)) + .decoder(new SpringDecoder(messageConverters, customizers)) + .target(Target.EmptyTarget.create(AlbumClient.class)); + + return client.getAlbumByIdAndDynamicUrl(id); + } +} + + diff --git a/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/exception/BadRequestException.java b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/exception/BadRequestException.java new file mode 100644 index 0000000..77565ef --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/exception/BadRequestException.java @@ -0,0 +1,20 @@ +package com.example.feignClientDemo.exception; + +public class BadRequestException extends Exception { + + public BadRequestException() { + } + + public BadRequestException(String message) { + super(message); + } + + public BadRequestException(Throwable cause) { + super(cause); + } + + @Override + public String toString() { + return "BadRequestException: "+getMessage(); + } +} \ No newline at end of file diff --git a/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/exception/NotFoundException.java b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/exception/NotFoundException.java new file mode 100644 index 0000000..4237b94 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/exception/NotFoundException.java @@ -0,0 +1,17 @@ +package com.example.feignClientDemo.exception; + +public class NotFoundException extends Exception { + + public NotFoundException(String message) { + super(message); + } + + public NotFoundException(Throwable cause) { + super(cause); + } + + @Override + public String toString() { + return "NotFoundException: " + getMessage(); + } +} diff --git a/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/hystrix/JSONPlaceHolderFallback.java b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/hystrix/JSONPlaceHolderFallback.java new file mode 100644 index 0000000..6f61a2b --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/hystrix/JSONPlaceHolderFallback.java @@ -0,0 +1,23 @@ +package com.example.feignClientDemo.hystrix; + +import java.util.Collections; +import java.util.List; + +import org.springframework.stereotype.Component; + +import com.example.feignClientDemo.client.JSONPlaceHolderClient; +import com.example.feignClientDemo.model.Post; + +@Component +public class JSONPlaceHolderFallback implements JSONPlaceHolderClient { + + @Override + public List getPosts() { + return Collections.emptyList(); + } + + @Override + public Post getPostById(Long postId) { + return null; + } +} diff --git a/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/model/Album.java b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/model/Album.java new file mode 100644 index 0000000..250bc55 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/model/Album.java @@ -0,0 +1,32 @@ +package com.example.feignClientDemo.model; + +public class Album { + + private Integer id; + private Integer userId; + private String title; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getUserId() { + return userId; + } + + public void setUserId(Integer userId) { + this.userId = userId; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } +} diff --git a/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/model/Post.java b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/model/Post.java new file mode 100644 index 0000000..6ca244e --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/model/Post.java @@ -0,0 +1,41 @@ +package com.example.feignClientDemo.model; + +public class Post { + + private String userId; + private Long id; + private String title; + private String body; + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getBody() { + return body; + } + + public void setBody(String body) { + this.body = body; + } +} diff --git a/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/model/Todo.java b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/model/Todo.java new file mode 100644 index 0000000..c5d638b --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/model/Todo.java @@ -0,0 +1,40 @@ +package com.example.feignClientDemo.model; + +public class Todo { + private Integer id; + private Integer userId; + private String title; + private Boolean completed; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getUserId() { + return userId; + } + + public void setUserId(Integer userId) { + this.userId = userId; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public Boolean getCompleted() { + return completed; + } + + public void setCompleted(Boolean completed) { + this.completed = completed; + } +} \ No newline at end of file diff --git a/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/patcherror/client/UserClient.java b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/patcherror/client/UserClient.java new file mode 100644 index 0000000..bb18fe8 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/patcherror/client/UserClient.java @@ -0,0 +1,16 @@ +package com.example.feignClientDemo.patcherror.client; + +import com.example.feignClientDemo.patcherror.model.User; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +@FeignClient(name = "user-client", url = "${user.api.url}") +public interface UserClient { + + @RequestMapping(value = "{userId}", method = RequestMethod.PATCH) + User updateUser(@PathVariable(value = "userId") String userId, @RequestBody User user); + +} diff --git a/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/patcherror/model/User.java b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/patcherror/model/User.java new file mode 100644 index 0000000..7b8021c --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/patcherror/model/User.java @@ -0,0 +1,34 @@ +package com.example.feignClientDemo.patcherror.model; + +public class User { + + private String userId; + + private String userName; + + private String email; + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } +} diff --git a/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/service/JSONPlaceHolderService.java b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/service/JSONPlaceHolderService.java new file mode 100644 index 0000000..209da25 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/service/JSONPlaceHolderService.java @@ -0,0 +1,12 @@ +package com.example.feignClientDemo.service; + +import java.util.List; + +import com.example.feignClientDemo.model.Post; + +public interface JSONPlaceHolderService { + + List getPosts(); + + Post getPostById(Long id); +} \ No newline at end of file diff --git a/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/service/impl/JSONPlaceHolderServiceImpl.java b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/service/impl/JSONPlaceHolderServiceImpl.java new file mode 100644 index 0000000..a9ddd7d --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/java/com/example/feignClientDemo/service/impl/JSONPlaceHolderServiceImpl.java @@ -0,0 +1,27 @@ +package com.example.feignClientDemo.service.impl; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.example.feignClientDemo.client.JSONPlaceHolderClient; +import com.example.feignClientDemo.model.Post; +import com.example.feignClientDemo.service.JSONPlaceHolderService; + +@Service +public class JSONPlaceHolderServiceImpl implements JSONPlaceHolderService { + + @Autowired + private JSONPlaceHolderClient jsonPlaceHolderClient; + + @Override + public List getPosts() { + return jsonPlaceHolderClient.getPosts(); + } + + @Override + public Post getPostById(Long id) { + return jsonPlaceHolderClient.getPostById(id); + } +} \ No newline at end of file diff --git a/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/resources/application.properties b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/resources/application.properties index ab07292..0fb1008 100644 --- a/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/resources/application.properties +++ b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/resources/application.properties @@ -1 +1,10 @@ spring.application.name=feignClientDemo +user.api.url=http://localhost:8080/api/user +feign.okhttp.enabled=true + +server.port=8085 +spring.main.allow-bean-definition-overriding=true +logging.level.com.baeldung.cloud.openfeign.client=INFO +feign.hystrix.enabled=true + +spring.cloud.openfeign.client.config.postClient.url=https://jsonplaceholder.typicode.com/posts/ \ No newline at end of file diff --git a/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/test/java/com/example/feignClientDemo/FeignClientDemoApplicationTests.java b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/test/java/com/example/feignClientDemo/FeignClientDemoApplicationTests.java deleted file mode 100644 index 97499ea..0000000 --- a/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/test/java/com/example/feignClientDemo/FeignClientDemoApplicationTests.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.example.feignClientDemo; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class FeignClientDemoApplicationTests { - - @Test - void contextLoads() { - } - -} diff --git a/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/test/java/com/example/feignClientDemo/OpenFeignManualTest.java b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/test/java/com/example/feignClientDemo/OpenFeignManualTest.java new file mode 100644 index 0000000..5fb1bed --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/test/java/com/example/feignClientDemo/OpenFeignManualTest.java @@ -0,0 +1,44 @@ +package com.example.feignClientDemo; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; + +import java.util.List; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import com.example.feignClientDemo.model.Post; +import com.example.feignClientDemo.service.JSONPlaceHolderService; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class OpenFeignManualTest { + + @Autowired + private JSONPlaceHolderService jsonPlaceHolderService; + + @Test + public void whenSpringContextIsBootstrapped_thenNoExceptions() { + } + + @Test + public void whenGetPosts_thenListPostSizeGreaterThanZero() { + + List posts = jsonPlaceHolderService.getPosts(); + + assertFalse(posts.isEmpty()); + } + + @Test + public void whenGetPostWithId_thenPostExist() { + + Post post = jsonPlaceHolderService.getPostById(1L); + + assertNotNull(post); + } + +} diff --git a/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/test/java/com/example/feignClientDemo/SpringContextTest.java b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/test/java/com/example/feignClientDemo/SpringContextTest.java new file mode 100644 index 0000000..cc42913 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/test/java/com/example/feignClientDemo/SpringContextTest.java @@ -0,0 +1,15 @@ +package com.example.feignClientDemo; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = FeignClientDemoApplication.class) +public class SpringContextTest { + + @Test + public void whenSpringContextIsBootstrapped_thenNoExceptions() { + } +} From 1274368b71a037caeacb0dcfddd2b182a1df4805 Mon Sep 17 00:00:00 2001 From: mikeleo03 Date: Wed, 31 Jul 2024 14:48:03 +0700 Subject: [PATCH 19/23] [Feat] Implementation of Rest Template Demo 1 --- .../.mvn/wrapper/maven-wrapper.properties | 19 ++ .../RestTemplateDemo/restTemplateDemo/mvnw | 259 +++++++++++++++++ .../restTemplateDemo/mvnw.cmd | 149 ++++++++++ .../RestTemplateDemo/restTemplateDemo/pom.xml | 224 +++++++++++++++ .../mock/EmployeeService.java | 26 ++ .../RestTemplateConfigurationApplication.java | 14 + .../resttemplate/web/dto/Foo.java | 43 +++ .../web/exception/NotFoundException.java | 4 + .../handler/RestTemplateRespErrorHandler.java | 37 +++ .../resttemplate/web/model/Bar.java | 22 ++ .../resttemplate/web/model/Employee.java | 47 ++++ .../web/service/BarConsumerService.java | 26 ++ .../sampleapp/MainApplication.java | 15 + .../sampleapp/config/RestClientConfig.java | 29 ++ .../sampleapp/config/WebConfig.java | 16 ++ .../RestTemplateHeaderInterceptor.java | 18 ++ .../repository/HeavyResourceRepository.java | 21 ++ .../BarMappingExamplesController.java | 43 +++ .../web/controller/CompanyController.java | 17 ++ .../controller/DeferredResultController.java | 76 +++++ .../controller/HeavyResourceController.java | 40 +++ .../web/controller/ItemController.java | 39 +++ .../web/controller/MyFooController.java | 85 ++++++ .../web/controller/SimplePostController.java | 75 +++++ .../sampleapp/web/dto/Company.java | 37 +++ .../sampleapp/web/dto/Foo.java | 38 +++ .../sampleapp/web/dto/HeavyResource.java | 60 ++++ .../web/dto/HeavyResourceAddressOnly.java | 30 ++ .../HeavyResourceAddressPartialUpdate.java | 30 ++ .../sampleapp/web/dto/Item.java | 36 +++ .../sampleapp/web/dto/ItemManager.java | 9 + .../sampleapp/web/dto/Views.java | 9 + .../exception/ResourceNotFoundException.java | 8 + .../restTemplateDemo/transfer/LoginForm.java | 31 ++ .../src/main/resources/application.properties | 2 + .../src/main/resources/logback.xml | 23 ++ .../restTemplateDemo/SpringContextTest.java | 14 + .../restTemplateDemo/SpringTestConfig.java | 11 + .../restTemplateDemo/client/Consts.java | 5 + .../client/TestRestTemplateBasicLiveTest.java | 124 ++++++++ ...eServiceMockRestServiceServerUnitTest.java | 50 ++++ .../mock/EmployeeServiceUnitTest.java | 36 +++ .../RestTemplateBasicLiveTest.java | 266 ++++++++++++++++++ .../resttemplate/RestTemplateLiveTest.java | 40 +++ .../RestTemplateResponseErrorHandlerTest.java | 50 ++++ .../src/test/resources/.gitignore | 13 + .../src/test/resources/logback-test.xml | 23 ++ 47 files changed, 2289 insertions(+) create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/.mvn/wrapper/maven-wrapper.properties create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/mvnw create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/mvnw.cmd create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/pom.xml create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/mock/EmployeeService.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/resttemplate/RestTemplateConfigurationApplication.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/resttemplate/web/dto/Foo.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/resttemplate/web/exception/NotFoundException.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/resttemplate/web/handler/RestTemplateRespErrorHandler.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/resttemplate/web/model/Bar.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/resttemplate/web/model/Employee.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/resttemplate/web/service/BarConsumerService.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/MainApplication.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/config/RestClientConfig.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/config/WebConfig.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/interceptor/RestTemplateHeaderInterceptor.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/repository/HeavyResourceRepository.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/controller/BarMappingExamplesController.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/controller/CompanyController.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/controller/DeferredResultController.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/controller/HeavyResourceController.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/controller/ItemController.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/controller/MyFooController.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/controller/SimplePostController.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/dto/Company.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/dto/Foo.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/dto/HeavyResource.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/dto/HeavyResourceAddressOnly.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/dto/HeavyResourceAddressPartialUpdate.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/dto/Item.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/dto/ItemManager.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/dto/Views.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/exception/ResourceNotFoundException.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/transfer/LoginForm.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/resources/application.properties create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/resources/logback.xml create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/SpringContextTest.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/SpringTestConfig.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/client/Consts.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/client/TestRestTemplateBasicLiveTest.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/mock/EmployeeServiceMockRestServiceServerUnitTest.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/mock/EmployeeServiceUnitTest.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/resttemplate/RestTemplateBasicLiveTest.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/resttemplate/RestTemplateLiveTest.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/web/handler/RestTemplateResponseErrorHandlerTest.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/resources/.gitignore create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/resources/logback-test.xml diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/.mvn/wrapper/maven-wrapper.properties b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..8f96f52 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,19 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +wrapperVersion=3.3.2 +distributionType=only-script +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.7/apache-maven-3.9.7-bin.zip diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/mvnw b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/mvnw new file mode 100644 index 0000000..d7c358e --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/mvnw @@ -0,0 +1,259 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.3.2 +# +# Optional ENV vars +# ----------------- +# JAVA_HOME - location of a JDK home dir, required when download maven via java source +# MVNW_REPOURL - repo url base for downloading maven distribution +# MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +# MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output +# ---------------------------------------------------------------------------- + +set -euf +[ "${MVNW_VERBOSE-}" != debug ] || set -x + +# OS specific support. +native_path() { printf %s\\n "$1"; } +case "$(uname)" in +CYGWIN* | MINGW*) + [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")" + native_path() { cygpath --path --windows "$1"; } + ;; +esac + +# set JAVACMD and JAVACCMD +set_java_home() { + # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched + if [ -n "${JAVA_HOME-}" ]; then + if [ -x "$JAVA_HOME/jre/sh/java" ]; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACCMD="$JAVA_HOME/jre/sh/javac" + else + JAVACMD="$JAVA_HOME/bin/java" + JAVACCMD="$JAVA_HOME/bin/javac" + + if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then + echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2 + echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2 + return 1 + fi + fi + else + JAVACMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v java + )" || : + JAVACCMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v javac + )" || : + + if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then + echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2 + return 1 + fi + fi +} + +# hash string like Java String::hashCode +hash_string() { + str="${1:-}" h=0 + while [ -n "$str" ]; do + char="${str%"${str#?}"}" + h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296)) + str="${str#?}" + done + printf %x\\n $h +} + +verbose() { :; } +[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; } + +die() { + printf %s\\n "$1" >&2 + exit 1 +} + +trim() { + # MWRAPPER-139: + # Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds. + # Needed for removing poorly interpreted newline sequences when running in more + # exotic environments such as mingw bash on Windows. + printf "%s" "${1}" | tr -d '[:space:]' +} + +# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties +while IFS="=" read -r key value; do + case "${key-}" in + distributionUrl) distributionUrl=$(trim "${value-}") ;; + distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;; + esac +done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties" +[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties" + +case "${distributionUrl##*/}" in +maven-mvnd-*bin.*) + MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ + case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in + *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;; + :Darwin*x86_64) distributionPlatform=darwin-amd64 ;; + :Darwin*arm64) distributionPlatform=darwin-aarch64 ;; + :Linux*x86_64*) distributionPlatform=linux-amd64 ;; + *) + echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2 + distributionPlatform=linux-amd64 + ;; + esac + distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip" + ;; +maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;; +*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;; +esac + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}" +distributionUrlName="${distributionUrl##*/}" +distributionUrlNameMain="${distributionUrlName%.*}" +distributionUrlNameMain="${distributionUrlNameMain%-bin}" +MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}" +MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")" + +exec_maven() { + unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || : + exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD" +} + +if [ -d "$MAVEN_HOME" ]; then + verbose "found existing MAVEN_HOME at $MAVEN_HOME" + exec_maven "$@" +fi + +case "${distributionUrl-}" in +*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;; +*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;; +esac + +# prepare tmp dir +if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then + clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; } + trap clean HUP INT TERM EXIT +else + die "cannot create temp dir" +fi + +mkdir -p -- "${MAVEN_HOME%/*}" + +# Download and Install Apache Maven +verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +verbose "Downloading from: $distributionUrl" +verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +# select .zip or .tar.gz +if ! command -v unzip >/dev/null; then + distributionUrl="${distributionUrl%.zip}.tar.gz" + distributionUrlName="${distributionUrl##*/}" +fi + +# verbose opt +__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR='' +[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v + +# normalize http auth +case "${MVNW_PASSWORD:+has-password}" in +'') MVNW_USERNAME='' MVNW_PASSWORD='' ;; +has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;; +esac + +if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then + verbose "Found wget ... using wget" + wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl" +elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then + verbose "Found curl ... using curl" + curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl" +elif set_java_home; then + verbose "Falling back to use Java to download" + javaSource="$TMP_DOWNLOAD_DIR/Downloader.java" + targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName" + cat >"$javaSource" <<-END + public class Downloader extends java.net.Authenticator + { + protected java.net.PasswordAuthentication getPasswordAuthentication() + { + return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() ); + } + public static void main( String[] args ) throws Exception + { + setDefault( new Downloader() ); + java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() ); + } + } + END + # For Cygwin/MinGW, switch paths to Windows format before running javac and java + verbose " - Compiling Downloader.java ..." + "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java" + verbose " - Running Downloader.java ..." + "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")" +fi + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +if [ -n "${distributionSha256Sum-}" ]; then + distributionSha256Result=false + if [ "$MVN_CMD" = mvnd.sh ]; then + echo "Checksum validation is not supported for maven-mvnd." >&2 + echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + elif command -v sha256sum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then + distributionSha256Result=true + fi + elif command -v shasum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then + distributionSha256Result=true + fi + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2 + echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + fi + if [ $distributionSha256Result = false ]; then + echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2 + echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2 + exit 1 + fi +fi + +# unzip and move +if command -v unzip >/dev/null; then + unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip" +else + tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar" +fi +printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url" +mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME" + +clean || : +exec_maven "$@" diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/mvnw.cmd b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/mvnw.cmd new file mode 100644 index 0000000..6f779cf --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/mvnw.cmd @@ -0,0 +1,149 @@ +<# : batch portion +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.3.2 +@REM +@REM Optional ENV vars +@REM MVNW_REPOURL - repo url base for downloading maven distribution +@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output +@REM ---------------------------------------------------------------------------- + +@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0) +@SET __MVNW_CMD__= +@SET __MVNW_ERROR__= +@SET __MVNW_PSMODULEP_SAVE=%PSModulePath% +@SET PSModulePath= +@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @( + IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B) +) +@SET PSModulePath=%__MVNW_PSMODULEP_SAVE% +@SET __MVNW_PSMODULEP_SAVE= +@SET __MVNW_ARG0_NAME__= +@SET MVNW_USERNAME= +@SET MVNW_PASSWORD= +@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*) +@echo Cannot start maven from wrapper >&2 && exit /b 1 +@GOTO :EOF +: end batch / begin powershell #> + +$ErrorActionPreference = "Stop" +if ($env:MVNW_VERBOSE -eq "true") { + $VerbosePreference = "Continue" +} + +# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties +$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl +if (!$distributionUrl) { + Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" +} + +switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) { + "maven-mvnd-*" { + $USE_MVND = $true + $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip" + $MVN_CMD = "mvnd.cmd" + break + } + default { + $USE_MVND = $false + $MVN_CMD = $script -replace '^mvnw','mvn' + break + } +} + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +if ($env:MVNW_REPOURL) { + $MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" } + $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')" +} +$distributionUrlName = $distributionUrl -replace '^.*/','' +$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$','' +$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain" +if ($env:MAVEN_USER_HOME) { + $MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain" +} +$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join '' +$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME" + +if (Test-Path -Path "$MAVEN_HOME" -PathType Container) { + Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME" + Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" + exit $? +} + +if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) { + Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl" +} + +# prepare tmp dir +$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile +$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir" +$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null +trap { + if ($TMP_DOWNLOAD_DIR.Exists) { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } + } +} + +New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null + +# Download and Install Apache Maven +Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +Write-Verbose "Downloading from: $distributionUrl" +Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +$webclient = New-Object System.Net.WebClient +if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) { + $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD) +} +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum +if ($distributionSha256Sum) { + if ($USE_MVND) { + Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." + } + Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash + if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) { + Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property." + } +} + +# unzip and move +Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null +Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null +try { + Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null +} catch { + if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) { + Write-Error "fail to move MAVEN_HOME" + } +} finally { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } +} + +Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/pom.xml b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/pom.xml new file mode 100644 index 0000000..106b2f3 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/pom.xml @@ -0,0 +1,224 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.3.2 + + + com.example + restTemplateDemo + 0.0.1-SNAPSHOT + restTemplateDemo + Demo project for Spring Boot + + + + + + + + + + + + + + + 21 + 1.4.20 + + 1.6.1 + + 4.12.0 + 33.2.1-jre + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-actuator + + + com.thoughtworks.xstream + xstream + ${xstream.version} + + + + com.google.guava + guava + ${guava.version} + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + + com.squareup.okhttp3 + okhttp + ${com.squareup.okhttp3.version} + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + + + + + + + spring-resttemplate + + + src/main/resources + true + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.apache.maven.plugins + maven-war-plugin + + + org.apache.maven.plugins + maven-surefire-plugin + + 3 + true + + **/*IntegrationTest.java + **/*IntTest.java + **/*LongRunningUnitTest.java + **/*ManualTest.java + **/JdbcTest.java + **/*LiveTest.java + + + + + org.codehaus.cargo + cargo-maven2-plugin + ${cargo-maven2-plugin.version} + + true + + tomcat8x + embedded + + + + + + + 8082 + + + + + + + + + + integration + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + none + + + **/*IntegrationTest.java + **/*IntTest.java + + + + + + + + + + live + + + + org.codehaus.cargo + cargo-maven2-plugin + + + start-server + pre-integration-test + + start + + + + stop-server + post-integration-test + + stop + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + none + + + **/*LiveTest.java + + + cargo + + + + + + + + + + diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/mock/EmployeeService.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/mock/EmployeeService.java new file mode 100644 index 0000000..a24280f --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/mock/EmployeeService.java @@ -0,0 +1,26 @@ +package com.example.restTemplateDemo.mock; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import com.example.restTemplateDemo.resttemplate.web.model.Employee; + +@Service +public class EmployeeService { + + static final String EMP_URL_PREFIX = "http://localhost:8080/employee"; + static final String URL_SEP = "/"; + + // private static final Logger logger = LoggerFactory.getLogger(EmployeeService.class); + + @Autowired + private RestTemplate restTemplate; + + public Employee getEmployee(String id) { + ResponseEntity resp = restTemplate.getForEntity(EMP_URL_PREFIX + URL_SEP + id, Employee.class); + return resp.getStatusCode() == HttpStatus.OK ? resp.getBody() : null; + } +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/resttemplate/RestTemplateConfigurationApplication.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/resttemplate/RestTemplateConfigurationApplication.java new file mode 100644 index 0000000..0a75f16 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/resttemplate/RestTemplateConfigurationApplication.java @@ -0,0 +1,14 @@ +package com.example.restTemplateDemo.resttemplate; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +@EnableAutoConfiguration +public class RestTemplateConfigurationApplication { + + public static void main(String[] args) { + SpringApplication.run(RestTemplateConfigurationApplication.class, args); + } +} \ No newline at end of file diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/resttemplate/web/dto/Foo.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/resttemplate/web/dto/Foo.java new file mode 100644 index 0000000..eced2a7 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/resttemplate/web/dto/Foo.java @@ -0,0 +1,43 @@ +package com.example.restTemplateDemo.resttemplate.web.dto; + +import com.thoughtworks.xstream.annotations.XStreamAlias; + +@XStreamAlias("Foo") +public class Foo { + private long id; + private String name; + + public Foo() { + super(); + } + + public Foo(final String name) { + super(); + + this.name = name; + } + + public Foo(final long id, final String name) { + super(); + + this.id = id; + this.name = name; + } + + // API + public long getId() { + return id; + } + + public void setId(final long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } +} \ No newline at end of file diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/resttemplate/web/exception/NotFoundException.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/resttemplate/web/exception/NotFoundException.java new file mode 100644 index 0000000..fc18c0f --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/resttemplate/web/exception/NotFoundException.java @@ -0,0 +1,4 @@ +package com.example.restTemplateDemo.resttemplate.web.exception; + +public class NotFoundException extends RuntimeException { +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/resttemplate/web/handler/RestTemplateRespErrorHandler.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/resttemplate/web/handler/RestTemplateRespErrorHandler.java new file mode 100644 index 0000000..889b81e --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/resttemplate/web/handler/RestTemplateRespErrorHandler.java @@ -0,0 +1,37 @@ +package com.example.restTemplateDemo.resttemplate.web.handler; + +import java.io.IOException; + +import org.springframework.http.HttpStatus; +import org.springframework.http.client.ClientHttpResponse; +import org.springframework.stereotype.Component; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.ResponseErrorHandler; + +import com.example.restTemplateDemo.resttemplate.web.exception.NotFoundException; + +@Component +public class RestTemplateRespErrorHandler implements ResponseErrorHandler { + + @Override + public boolean hasError(ClientHttpResponse httpResponse) throws IOException { + return httpResponse.getStatusCode() + .is5xxServerError() || httpResponse.getStatusCode() + .is4xxClientError(); + } + + @Override + public void handleError(ClientHttpResponse httpResponse) throws IOException { + if (httpResponse.getStatusCode() + .is5xxServerError()) { + //Handle SERVER_ERROR + throw new HttpClientErrorException(httpResponse.getStatusCode()); + } else if (httpResponse.getStatusCode() + .is4xxClientError()) { + //Handle CLIENT_ERROR + if (httpResponse.getStatusCode() == HttpStatus.NOT_FOUND) { + throw new NotFoundException(); + } + } + } +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/resttemplate/web/model/Bar.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/resttemplate/web/model/Bar.java new file mode 100644 index 0000000..863db29 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/resttemplate/web/model/Bar.java @@ -0,0 +1,22 @@ +package com.example.restTemplateDemo.resttemplate.web.model; + +public class Bar { + private String id; + private String name; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/resttemplate/web/model/Employee.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/resttemplate/web/model/Employee.java new file mode 100644 index 0000000..ff8b98c --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/resttemplate/web/model/Employee.java @@ -0,0 +1,47 @@ +package com.example.restTemplateDemo.resttemplate.web.model; + +import java.util.Objects; + +public class Employee { + + private String id; + private String name; + + public Employee(String id, String name) { + this.id = id; + this.name = name; + } + + public Employee() { + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + Employee employee = (Employee) o; + return Objects.equals(id, employee.id); + } + + @Override public int hashCode() { + + return Objects.hash(id); + } +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/resttemplate/web/service/BarConsumerService.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/resttemplate/web/service/BarConsumerService.java new file mode 100644 index 0000000..bf499d1 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/resttemplate/web/service/BarConsumerService.java @@ -0,0 +1,26 @@ +package com.example.restTemplateDemo.resttemplate.web.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import com.example.restTemplateDemo.resttemplate.web.handler.RestTemplateResponseErrorHandler; +import com.example.restTemplateDemo.resttemplate.web.model.Bar; + +@Service +public class BarConsumerService { + + private final RestTemplate restTemplate; + + @Autowired + public BarConsumerService(RestTemplateBuilder restTemplateBuilder) { + restTemplate = restTemplateBuilder + .errorHandler(new RestTemplateResponseErrorHandler()) + .build(); + } + + public Bar fetchBarById(String barId) { + return restTemplate.getForObject("/bars/4242", Bar.class); + } +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/MainApplication.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/MainApplication.java new file mode 100644 index 0000000..fb69579 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/MainApplication.java @@ -0,0 +1,15 @@ +package com.example.restTemplateDemo.sampleapp; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@EnableAutoConfiguration +@ComponentScan("com.baeldung.sampleapp") +public class MainApplication implements WebMvcConfigurer { + + public static void main(final String[] args) { + SpringApplication.run(MainApplication.class, args); + } +} \ No newline at end of file diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/config/RestClientConfig.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/config/RestClientConfig.java new file mode 100644 index 0000000..ffedfb0 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/config/RestClientConfig.java @@ -0,0 +1,29 @@ +package com.example.restTemplateDemo.sampleapp.config; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.client.ClientHttpRequestInterceptor; +import org.springframework.util.CollectionUtils; +import org.springframework.web.client.RestTemplate; + +import com.example.restTemplateDemo.sampleapp.interceptor.RestTemplateHeaderModifierInterceptor; + +@Configuration +public class RestClientConfig { + + @Bean + public RestTemplate restTemplate() { + RestTemplate restTemplate = new RestTemplate(); + + List interceptors = restTemplate.getInterceptors(); + if (CollectionUtils.isEmpty(interceptors)) { + interceptors = new ArrayList<>(); + } + interceptors.add(new RestTemplateHeaderModifierInterceptor()); + restTemplate.setInterceptors(interceptors); + return restTemplate; + } +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/config/WebConfig.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/config/WebConfig.java new file mode 100644 index 0000000..436f0db --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/config/WebConfig.java @@ -0,0 +1,16 @@ +package com.example.restTemplateDemo.sampleapp.config; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +@EnableWebMvc +@ComponentScan({ "com.example.restTemplateDemo.sampleapp.web" }) +public class WebConfig implements WebMvcConfigurer { + + public WebConfig() { + super(); + } +} \ No newline at end of file diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/interceptor/RestTemplateHeaderInterceptor.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/interceptor/RestTemplateHeaderInterceptor.java new file mode 100644 index 0000000..2c73a3d --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/interceptor/RestTemplateHeaderInterceptor.java @@ -0,0 +1,18 @@ +package com.example.restTemplateDemo.sampleapp.interceptor; + +import java.io.IOException; + +import org.springframework.http.HttpRequest; +import org.springframework.http.client.ClientHttpRequestExecution; +import org.springframework.http.client.ClientHttpRequestInterceptor; +import org.springframework.http.client.ClientHttpResponse; + +public class RestTemplateHeaderInterceptor implements ClientHttpRequestInterceptor { + + @Override + public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { + ClientHttpResponse response = execution.execute(request, body); + response.getHeaders().add("Foo", "bar"); + return response; + } +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/repository/HeavyResourceRepository.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/repository/HeavyResourceRepository.java new file mode 100644 index 0000000..4e74237 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/repository/HeavyResourceRepository.java @@ -0,0 +1,21 @@ +package com.example.restTemplateDemo.sampleapp.repository; + +import java.util.Map; + +import com.example.restTemplateDemo.sampleapp.web.dto.HeavyResource; +import com.example.restTemplateDemo.sampleapp.web.dto.HeavyResourceAddressOnly; + +public class HeavyResourceRepository { + + public void save(HeavyResource heavyResource, String id) { + } + + public void save(HeavyResourceAddressOnly partialUpdate) { + } + + public void save(Map updates, String id) { + } + + public void save(HeavyResourceAddressOnly partialUpdate, String id) { + } +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/controller/BarMappingExamplesController.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/controller/BarMappingExamplesController.java new file mode 100644 index 0000000..eb0cc68 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/controller/BarMappingExamplesController.java @@ -0,0 +1,43 @@ +package com.example.restTemplateDemo.sampleapp.web.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +@Controller +@RequestMapping(value = "/ex") +public class BarMappingExamplesController { + + public BarMappingExamplesController() { + super(); + } + + // API + // with @RequestParam + @RequestMapping(value = "/bars") + @ResponseBody + public String getBarBySimplePathWithRequestParam(@RequestParam("id") final long id) { + return "Get a specific Bar with id=" + id; + } + + @RequestMapping(value = "/bars", params = "id") + @ResponseBody + public String getBarBySimplePathWithExplicitRequestParam(@RequestParam("id") final long id) { + return "Get a specific Bar with id=" + id; + } + + @RequestMapping(value = "/bars", params = { "id", "second" }) + @ResponseBody + public String getBarBySimplePathWithExplicitRequestParams(@RequestParam("id") final long id) { + return "Get a specific Bar with id=" + id; + } + + // with @PathVariable + @RequestMapping(value = "/bars/{numericId:[\\d]+}") + @ResponseBody + public String getBarsBySimplePathWithPathVariable(@PathVariable final long numericId) { + return "Get a specific Bar with id=" + numericId; + } +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/controller/CompanyController.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/controller/CompanyController.java new file mode 100644 index 0000000..9c4f5c2 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/controller/CompanyController.java @@ -0,0 +1,17 @@ +package com.example.restTemplateDemo.sampleapp.web.controller; + +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.example.restTemplateDemo.sampleapp.web.dto.Company; + +@RestController +public class CompanyController { + + @RequestMapping(value = "/companyRest", produces = MediaType.APPLICATION_JSON_VALUE) + public Company getCompanyRest() { + final Company company = new Company(1, "Xpto"); + return company; + } +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/controller/DeferredResultController.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/controller/DeferredResultController.java new file mode 100644 index 0000000..7ff0d20 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/controller/DeferredResultController.java @@ -0,0 +1,76 @@ +package com.example.restTemplateDemo.sampleapp.web.controller; + +import java.util.concurrent.CompletableFuture; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.context.request.async.DeferredResult; + +@RestController +public class DeferredResultController { + + private final static Logger LOG = LoggerFactory.getLogger(DeferredResultController.class); + + @GetMapping("/async-deferredresult") + public DeferredResult> handleReqDefResult(Model model) { + LOG.info("Received request"); + DeferredResult> deferredResult = new DeferredResult<>(); + + deferredResult.onCompletion(() -> LOG.info("Processing complete")); + + CompletableFuture.supplyAsync(() -> { + LOG.info("Processing in separate thread"); + try { + Thread.sleep(6000); + } catch (InterruptedException e) { + } + return "OK"; + }).whenCompleteAsync((result, exc) -> deferredResult.setResult(ResponseEntity.ok(result))); + + LOG.info("Servlet thread freed"); + return deferredResult; + } + + @GetMapping("/process-blocking") + public ResponseEntity handleReqSync(Model model) { + // ... + return ResponseEntity.ok("ok"); + } + + @GetMapping("/async-deferredresult-timeout") + public DeferredResult> handleReqWithTimeouts(Model model) { + LOG.info("Received async request with a configured timeout"); + DeferredResult> deferredResult = new DeferredResult<>(500l); + deferredResult.onTimeout(() -> deferredResult.setErrorResult(ResponseEntity.status(HttpStatus.REQUEST_TIMEOUT) + .body("Request timeout occurred."))); + + CompletableFuture.supplyAsync(() -> { + LOG.info("Processing in separate thread"); + try { + Thread.sleep(6000); + } catch (InterruptedException e) { + } + return "error"; + }) + .whenCompleteAsync((result, exc) -> deferredResult.setResult(ResponseEntity.ok(result))); + LOG.info("servlet thread freed"); + return deferredResult; + } + + @GetMapping("/async-deferredresult-error") + public DeferredResult> handleAsyncFailedRequest(Model model) { + LOG.info("Received async request with a configured error handler"); + DeferredResult> deferredResult = new DeferredResult<>(); + deferredResult.onError((Throwable t) -> { + deferredResult.setErrorResult(ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body("An error occurred.")); + }); + LOG.info("servlet thread freed"); + return deferredResult; + } +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/controller/HeavyResourceController.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/controller/HeavyResourceController.java new file mode 100644 index 0000000..eab5a1a --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/controller/HeavyResourceController.java @@ -0,0 +1,40 @@ +package com.example.restTemplateDemo.sampleapp.web.controller; + +import java.util.Map; + +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import com.example.restTemplateDemo.sampleapp.repository.HeavyResourceRepository; +import com.example.restTemplateDemo.sampleapp.web.dto.HeavyResource; +import com.example.restTemplateDemo.sampleapp.web.dto.HeavyResourceAddressOnly; + +@RestController +public class HeavyResourceController { + + private final HeavyResourceRepository heavyResourceRepository = new HeavyResourceRepository(); + + @RequestMapping(value = "/heavyresource/{id}", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity saveResource(@RequestBody HeavyResource heavyResource, @PathVariable("id") String id) { + heavyResourceRepository.save(heavyResource, id); + return ResponseEntity.ok("resource saved"); + } + + @RequestMapping(value = "/heavyresource/{id}", method = RequestMethod.PATCH, consumes = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity partialUpdateName(@RequestBody HeavyResourceAddressOnly partialUpdate, @PathVariable("id") String id) { + heavyResourceRepository.save(partialUpdate, id); + return ResponseEntity.ok("resource address updated"); + } + + @RequestMapping(value = "/heavyresource2/{id}", method = RequestMethod.PATCH, consumes = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity partialUpdateGeneric(@RequestBody Map updates, + @PathVariable("id") String id) { + heavyResourceRepository.save(updates, id); + return ResponseEntity.ok("resource updated"); + } +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/controller/ItemController.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/controller/ItemController.java new file mode 100644 index 0000000..fecc47a --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/controller/ItemController.java @@ -0,0 +1,39 @@ +package com.example.restTemplateDemo.sampleapp.web.controller; + +import java.util.Date; + +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.example.restTemplateDemo.sampleapp.web.dto.Item; +import com.example.restTemplateDemo.sampleapp.web.dto.ItemManager; +import com.example.restTemplateDemo.sampleapp.web.dto.Views; +import com.fasterxml.jackson.annotation.JsonView; + +@RestController +public class ItemController { + + @JsonView(Views.Public.class) + @RequestMapping("/items/{id}") + public Item getItemPublic(@PathVariable final int id) { + return ItemManager.getById(id); + } + + @JsonView(Views.Internal.class) + @RequestMapping("/items/internal/{id}") + public Item getItemInternal(@PathVariable final int id) { + return ItemManager.getById(id); + } + + @RequestMapping("/date") + public Date getCurrentDate() throws Exception { + return new Date(); + } + + @RequestMapping("/delay/{seconds}") + public void getCurrentTime(@PathVariable final int seconds) throws Exception { + + Thread.sleep(seconds * 1000); + } +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/controller/MyFooController.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/controller/MyFooController.java new file mode 100644 index 0000000..9282887 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/controller/MyFooController.java @@ -0,0 +1,85 @@ +package com.example.restTemplateDemo.sampleapp.web.controller; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.servlet.support.ServletUriComponentsBuilder; + +import com.example.restTemplateDemo.sampleapp.web.dto.Foo; +import com.example.restTemplateDemo.sampleapp.web.exception.ResourceNotFoundException; + +import jakarta.servlet.http.HttpServletResponse; + +@Controller +@RequestMapping(value = "/foo") +public class MyFooController { + + private final Map myfoos; + + public MyFooController() { + super(); + myfoos = new HashMap<>(); + myfoos.put(1L, new Foo(1L, "sample foo")); + } + + // API - read + + @RequestMapping(method = RequestMethod.GET, produces = { "application/json" }) + @ResponseBody + public Collection findAll() { + return myfoos.values(); + } + + @RequestMapping(method = RequestMethod.GET, value = "/{id}", produces = { "application/json" }) + @ResponseBody + public Foo findById(@PathVariable final long id) { + final Foo foo = myfoos.get(id); + if (foo == null) { + throw new ResourceNotFoundException(); + } + return foo; + } + + // API - write + + @RequestMapping(method = RequestMethod.PUT, value = "/{id}") + @ResponseStatus(HttpStatus.OK) + @ResponseBody + public Foo updateFoo(@PathVariable("id") final long id, @RequestBody final Foo foo) { + myfoos.put(id, foo); + return foo; + } + + @RequestMapping(method = RequestMethod.PATCH, value = "/{id}") + @ResponseStatus(HttpStatus.OK) + public void updateFoo2(@PathVariable("id") final long id, @RequestBody final Foo foo) { + myfoos.put(id, foo); + } + + @RequestMapping(method = RequestMethod.POST) + @ResponseStatus(HttpStatus.CREATED) + @ResponseBody + public Foo createFoo(@RequestBody final Foo foo, HttpServletResponse response) { + myfoos.put(foo.getId(), foo); + response.setHeader("Location", ServletUriComponentsBuilder.fromCurrentRequest() + .path("/" + foo.getId()) + .toUriString()); + return foo; + } + + @RequestMapping(method = RequestMethod.DELETE, value = "/{id}") + @ResponseStatus(HttpStatus.OK) + public void deleteById(@PathVariable final long id) { + myfoos.remove(id); + } + +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/controller/SimplePostController.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/controller/SimplePostController.java new file mode 100644 index 0000000..92b18fa --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/controller/SimplePostController.java @@ -0,0 +1,75 @@ +package com.example.restTemplateDemo.sampleapp.web.controller; + +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import com.example.restTemplateDemo.sampleapp.web.dto.Foo; + +// used to test HttpClientPostingTest +@RestController +public class SimplePostController { + + @RequestMapping(value = "/users", method = RequestMethod.POST) + public String postUser(@RequestParam final String username, @RequestParam final String password) { + return "Success" + username; + } + + @RequestMapping(value = "/users/detail", method = RequestMethod.POST) + public String postUserDetail(@RequestBody final Foo entity) { + return "Success" + entity.getId(); + } + + @RequestMapping(value = "/users/multipart", method = RequestMethod.POST) + public String uploadFile(@RequestParam final String username, @RequestParam final String password, @RequestParam("file") final MultipartFile file) { + if (!file.isEmpty()) { + try { + final DateFormat dateFormat = new SimpleDateFormat("yyyy_MM_dd_HH.mm.ss"); + final String fileName = dateFormat.format(new Date()); + final File fileServer = new File(fileName); + fileServer.createNewFile(); + final byte[] bytes = file.getBytes(); + try (BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(fileServer))) { + stream.write(bytes); + } + return "You successfully uploaded " + username; + } catch (final IOException e) { + return "You failed to upload " + e.getMessage(); + } + } else { + return "You failed to upload because the file was empty."; + } + } + + @RequestMapping(value = "/users/upload", method = RequestMethod.POST) + public String postMultipart(@RequestParam("file") final MultipartFile file) { + if (!file.isEmpty()) { + try { + final DateFormat dateFormat = new SimpleDateFormat("yyyy_MM_dd_HH.mm.ss"); + final String fileName = dateFormat.format(new Date()); + final File fileServer = new File(fileName); + fileServer.createNewFile(); + final byte[] bytes = file.getBytes(); + try (BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(fileServer))) { + stream.write(bytes); + } + return "You successfully uploaded "; + } catch (final IOException e) { + return "You failed to upload " + e.getMessage(); + } + } else { + return "You failed to upload because the file was empty."; + } + } +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/dto/Company.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/dto/Company.java new file mode 100644 index 0000000..f126332 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/dto/Company.java @@ -0,0 +1,37 @@ +package com.example.restTemplateDemo.sampleapp.web.dto; + +public class Company { + + private long id; + private String name; + + public Company() { + super(); + } + + public Company(final long id, final String name) { + this.id = id; + this.name = name; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + public long getId() { + return id; + } + + public void setId(final long id) { + this.id = id; + } + + @Override + public String toString() { + return "Company [id=" + id + ", name=" + name + "]"; + } +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/dto/Foo.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/dto/Foo.java new file mode 100644 index 0000000..86b0fa8 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/dto/Foo.java @@ -0,0 +1,38 @@ +package com.example.restTemplateDemo.sampleapp.web.dto; + +public class Foo { + private long id; + private String name; + + public Foo() { + super(); + } + + public Foo(final String name) { + super(); + this.name = name; + } + + public Foo(final long id, final String name) { + super(); + this.id = id; + this.name = name; + } + + // API + public long getId() { + return id; + } + + public void setId(final long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/dto/HeavyResource.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/dto/HeavyResource.java new file mode 100644 index 0000000..e5102b1 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/dto/HeavyResource.java @@ -0,0 +1,60 @@ +package com.example.restTemplateDemo.sampleapp.web.dto; + +public class HeavyResource { + private Integer id; + private String name; + private String surname; + private Integer age; + private String address; + + public HeavyResource() { + } + + public HeavyResource(Integer id, String name, String surname, Integer age, String address) { + this.id = id; + this.name = name; + this.surname = surname; + this.age = age; + this.address = address; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getSurname() { + return surname; + } + + public void setSurname(String surname) { + this.surname = surname; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/dto/HeavyResourceAddressOnly.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/dto/HeavyResourceAddressOnly.java new file mode 100644 index 0000000..d58763e --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/dto/HeavyResourceAddressOnly.java @@ -0,0 +1,30 @@ +package com.example.restTemplateDemo.sampleapp.web.dto; + +public class HeavyResourceAddressOnly { + private Integer id; + private String address; + + public HeavyResourceAddressOnly() { + } + + public HeavyResourceAddressOnly(Integer id, String address) { + this.id = id; + this.address = address; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/dto/HeavyResourceAddressPartialUpdate.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/dto/HeavyResourceAddressPartialUpdate.java new file mode 100644 index 0000000..a6cfe01 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/dto/HeavyResourceAddressPartialUpdate.java @@ -0,0 +1,30 @@ +package com.example.restTemplateDemo.sampleapp.web.dto; + +public class HeavyResourceAddressPartialUpdate { + private Integer id; + private String address; + + public HeavyResourceAddressPartialUpdate() { + } + + public HeavyResourceAddressPartialUpdate(Integer id, String address) { + this.id = id; + this.address = address; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/dto/Item.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/dto/Item.java new file mode 100644 index 0000000..68b4a52 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/dto/Item.java @@ -0,0 +1,36 @@ +package com.example.restTemplateDemo.sampleapp.web.dto; + +import com.fasterxml.jackson.annotation.JsonView; + +public class Item { + @JsonView(Views.Public.class) + public int id; + + @JsonView(Views.Public.class) + public String itemName; + + @JsonView(Views.Internal.class) + public String ownerName; + + public Item() { + super(); + } + + public Item(final int id, final String itemName, final String ownerName) { + this.id = id; + this.itemName = itemName; + this.ownerName = ownerName; + } + + public int getId() { + return id; + } + + public String getItemName() { + return itemName; + } + + public String getOwnerName() { + return ownerName; + } +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/dto/ItemManager.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/dto/ItemManager.java new file mode 100644 index 0000000..f447964 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/dto/ItemManager.java @@ -0,0 +1,9 @@ +package com.example.restTemplateDemo.sampleapp.web.dto; + +public class ItemManager { + + public static Item getById(final int id) { + final Item item = new Item(2, "book", "John"); + return item; + } +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/dto/Views.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/dto/Views.java new file mode 100644 index 0000000..b841fe2 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/dto/Views.java @@ -0,0 +1,9 @@ +package com.example.restTemplateDemo.sampleapp.web.dto; + +public class Views { + public static class Public { + } + + public static class Internal extends Public { + } +} \ No newline at end of file diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/exception/ResourceNotFoundException.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/exception/ResourceNotFoundException.java new file mode 100644 index 0000000..0dd847d --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/web/exception/ResourceNotFoundException.java @@ -0,0 +1,8 @@ +package com.example.restTemplateDemo.sampleapp.web.exception; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ResponseStatus(value = HttpStatus.NOT_FOUND) +public class ResourceNotFoundException extends RuntimeException { +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/transfer/LoginForm.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/transfer/LoginForm.java new file mode 100644 index 0000000..3e441b9 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/transfer/LoginForm.java @@ -0,0 +1,31 @@ +package com.example.restTemplateDemo.transfer; + +public class LoginForm { + private String username; + private String password; + + public LoginForm() { + } + + public LoginForm(String username, String password) { + super(); + this.username = username; + this.password = password; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/resources/application.properties b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/resources/application.properties new file mode 100644 index 0000000..1a26e3a --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/resources/application.properties @@ -0,0 +1,2 @@ +server.port=8082 +server.servlet.context-path=/spring-rest \ No newline at end of file diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/resources/logback.xml b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/resources/logback.xml new file mode 100644 index 0000000..b2f79c1 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/resources/logback.xml @@ -0,0 +1,23 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/SpringContextTest.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/SpringContextTest.java new file mode 100644 index 0000000..9927a8c --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/SpringContextTest.java @@ -0,0 +1,14 @@ +package com.example.restTemplateDemo; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +import com.example.restTemplateDemo.resttemplate.RestTemplateConfigurationApplication; + +@SpringBootTest(classes= RestTemplateConfigurationApplication.class) +public class SpringContextTest { + + @Test + public void whenSpringContextIsBootstrapped_thenNoExceptions() { + } +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/SpringTestConfig.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/SpringTestConfig.java new file mode 100644 index 0000000..1fe8bc0 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/SpringTestConfig.java @@ -0,0 +1,11 @@ +package com.example.restTemplateDemo; + +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +@Configuration +@EnableAutoConfiguration +@ComponentScan("com.baeldung") +public class SpringTestConfig { +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/client/Consts.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/client/Consts.java new file mode 100644 index 0000000..a938243 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/client/Consts.java @@ -0,0 +1,5 @@ +package com.example.restTemplateDemo.client; + +public interface Consts { + int APPLICATION_PORT = 8082; +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/client/TestRestTemplateBasicLiveTest.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/client/TestRestTemplateBasicLiveTest.java new file mode 100644 index 0000000..12f97f9 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/client/TestRestTemplateBasicLiveTest.java @@ -0,0 +1,124 @@ +package com.example.restTemplateDemo.client; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestTemplate; + +import com.example.restTemplateDemo.resttemplate.web.dto.Foo; + +import okhttp3.Request; +import okhttp3.RequestBody; + +// This test needs RestTemplateConfigurationApplication to be up and running +public class TestRestTemplateBasicLiveTest { + + private RestTemplate restTemplate; + + private static final String FOO_RESOURCE_URL = "http://localhost:" + 8082 + "/spring-rest/foos"; + private static final String URL_SECURED_BY_AUTHENTICATION = "http://httpbin.org/basic-auth/user/passwd"; + private static final String BASE_URL = "http://localhost:" + 8082 + "/spring-rest"; + + @BeforeEach + public void beforeTest() { + restTemplate = new RestTemplate(); + } + + // GET + @Test + public void givenTestRestTemplate_whenSendGetForEntity_thenStatusOk() { + TestRestTemplate testRestTemplate = new TestRestTemplate(); + ResponseEntity response = testRestTemplate.getForEntity(FOO_RESOURCE_URL + "/1", Foo.class); + Assertions.assertEquals(response.getStatusCode(), HttpStatus.OK); + } + + @Test + public void givenRestTemplateWrapper_whenSendGetForEntity_thenStatusOk() { + RestTemplateBuilder restTemplateBuilder = new RestTemplateBuilder(); + restTemplateBuilder.configure(restTemplate); + TestRestTemplate testRestTemplate = new TestRestTemplate(restTemplateBuilder); + ResponseEntity response = testRestTemplate.getForEntity(FOO_RESOURCE_URL + "/1", Foo.class); + Assertions.assertEquals(response.getStatusCode(), HttpStatus.OK); + } + + @Test + public void givenRestTemplateBuilderWrapper_whenSendGetForEntity_thenStatusOk() { + RestTemplateBuilder restTemplateBuilder = new RestTemplateBuilder(); + restTemplateBuilder.build(); + TestRestTemplate testRestTemplate = new TestRestTemplate(restTemplateBuilder); + ResponseEntity response = testRestTemplate.getForEntity(FOO_RESOURCE_URL + "/1", Foo.class); + Assertions.assertEquals(response.getStatusCode(), HttpStatus.OK); + } + + @Test + public void givenRestTemplateWrapperWithCredentials_whenSendGetForEntity_thenStatusOk() { + RestTemplateBuilder restTemplateBuilder = new RestTemplateBuilder(); + restTemplateBuilder.configure(restTemplate); + TestRestTemplate testRestTemplate = new TestRestTemplate(restTemplateBuilder, "user", "passwd"); + ResponseEntity response = testRestTemplate.getForEntity(URL_SECURED_BY_AUTHENTICATION, + String.class); + Assertions.assertEquals(response.getStatusCode(), HttpStatus.OK); + } + + @Test + public void givenTestRestTemplateWithCredentials_whenSendGetForEntity_thenStatusOk() { + TestRestTemplate testRestTemplate = new TestRestTemplate("user", "passwd"); + ResponseEntity response = testRestTemplate.getForEntity(URL_SECURED_BY_AUTHENTICATION, + String.class); + Assertions.assertEquals(response.getStatusCode(), HttpStatus.OK); + } + + @Test + public void givenTestRestTemplateWithBasicAuth_whenSendGetForEntity_thenStatusOk() { + TestRestTemplate testRestTemplate = new TestRestTemplate(); + ResponseEntity response = testRestTemplate.withBasicAuth("user", "passwd"). + getForEntity(URL_SECURED_BY_AUTHENTICATION, String.class); + Assertions.assertEquals(response.getStatusCode(), HttpStatus.OK); + } + + @Test + public void givenTestRestTemplateWithCredentialsAndEnabledCookies_whenSendGetForEntity_thenStatusOk() { + TestRestTemplate testRestTemplate = new TestRestTemplate("user", "passwd", TestRestTemplate. + HttpClientOption.ENABLE_COOKIES); + ResponseEntity response = testRestTemplate.getForEntity(URL_SECURED_BY_AUTHENTICATION, + String.class); + Assertions.assertEquals(response.getStatusCode(), HttpStatus.OK); + } + + // HEAD + @Test + public void givenFooService_whenCallHeadForHeaders_thenReceiveAllHeaders() { + TestRestTemplate testRestTemplate = new TestRestTemplate(); + final HttpHeaders httpHeaders = testRestTemplate.headForHeaders(FOO_RESOURCE_URL); + Assertions.assertTrue(httpHeaders.getContentType().includes(MediaType.APPLICATION_JSON)); + } + + // POST + @Test + public void givenService_whenPostForObject_thenCreatedObjectIsReturned() { + TestRestTemplate testRestTemplate = new TestRestTemplate("user", "passwd"); + @SuppressWarnings("deprecation") + final RequestBody body = RequestBody.create(okhttp3.MediaType.parse("text/html; charset=utf-8"), + "{\"id\":1,\"name\":\"Jim\"}"); + final Request request = new Request.Builder().url(BASE_URL + "/users/detail").post(body).build(); + testRestTemplate.postForObject(URL_SECURED_BY_AUTHENTICATION, request, String.class); + } + + // PUT + @Test + public void givenService_whenPutForObject_thenCreatedObjectIsReturned() { + TestRestTemplate testRestTemplate = new TestRestTemplate("user", "passwd"); + @SuppressWarnings("deprecation") + final RequestBody body = RequestBody.create(okhttp3.MediaType.parse("text/html; charset=utf-8"), + "{\"id\":1,\"name\":\"Jim\"}"); + final Request request = new Request.Builder().url(BASE_URL + "/users/detail").post(body).build(); + testRestTemplate.put(URL_SECURED_BY_AUTHENTICATION, request, String.class); + } + +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/mock/EmployeeServiceMockRestServiceServerUnitTest.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/mock/EmployeeServiceMockRestServiceServerUnitTest.java new file mode 100644 index 0000000..5433423 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/mock/EmployeeServiceMockRestServiceServerUnitTest.java @@ -0,0 +1,50 @@ +package com.example.restTemplateDemo.mock; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.test.web.client.MockRestServiceServer; +import org.springframework.web.client.RestTemplate; + +import com.example.restTemplateDemo.SpringTestConfig; +import com.fasterxml.jackson.databind.ObjectMapper; + +@ExtendWith(SpringExtension.class) +@SpringBootTest(classes = SpringTestConfig.class) +public class EmployeeServiceMockRestServiceServerUnitTest { + + // private static final Logger logger = LoggerFactory.getLogger(EmployeeServiceMockRestServiceServerUnitTest.class); + + @Autowired + private EmployeeService empService; + + @Autowired + private RestTemplate restTemplate; + + private MockRestServiceServer mockServer; + + private final ObjectMapper mapper = new ObjectMapper(); + + @BeforeEach + public void init() { + mockServer = MockRestServiceServer.createServer(restTemplate); + } + + /* @Test + public void givenMockingIsDoneByMockRestServiceServer_whenGetIsCalled_shouldReturnMockedObject() throws Exception { + Employee emp = new Employee("E001", "Eric Simmons"); + + mockServer.expect(ExpectedCount.once(), + requestTo(new URI("http://localhost:8080/employee/E001"))) + .andExpect(method(HttpMethod.GET)) + .andRespond(withStatus(HttpStatus.OK) + .contentType(MediaType.APPLICATION_JSON) + .body(mapper.writeValueAsString(emp))); + + Employee employee = empService.getEmployee("E001"); + mockServer.verify(); + Assertions.assertEquals(emp, employee); + } */ +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/mock/EmployeeServiceUnitTest.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/mock/EmployeeServiceUnitTest.java new file mode 100644 index 0000000..65d522f --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/mock/EmployeeServiceUnitTest.java @@ -0,0 +1,36 @@ +package com.example.restTemplateDemo.mock; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestTemplate; + +import com.example.restTemplateDemo.resttemplate.web.model.Employee; + +@ExtendWith(MockitoExtension.class) +public class EmployeeServiceUnitTest { + + @Mock + private RestTemplate restTemplate; + + @InjectMocks + private final EmployeeService empService = new EmployeeService(); + + @SuppressWarnings({ "rawtypes", "unchecked" }) + @Test + public void givenMockingIsDoneByMockito_whenGetIsCalled_shouldReturnMockedObject() throws Exception { + Employee emp = new Employee("E001", "Eric Simmons"); + Mockito.when(restTemplate.getForEntity("http://localhost:8080/employee/E001", Employee.class)) + .thenReturn(new ResponseEntity(emp, HttpStatus.OK)); + + Employee employee = empService.getEmployee("E001"); + + assertEquals(emp, employee); + } +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/resttemplate/RestTemplateBasicLiveTest.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/resttemplate/RestTemplateBasicLiveTest.java new file mode 100644 index 0000000..6bd3759 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/resttemplate/RestTemplateBasicLiveTest.java @@ -0,0 +1,266 @@ +package com.example.restTemplateDemo.resttemplate; + +import java.io.IOException; +import java.net.URI; +import java.util.Arrays; +import java.util.Base64; +import java.util.Set; + +import org.junit.jupiter.api.Assertions; +import static org.junit.jupiter.api.Assertions.fail; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.http.client.ClientHttpRequestFactory; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.RequestCallback; +import org.springframework.web.client.RestTemplate; + +import static com.example.restTemplateDemo.client.Consts.APPLICATION_PORT; +import com.example.restTemplateDemo.resttemplate.web.dto.Foo; +import com.example.restTemplateDemo.resttemplate.web.handler.RestTemplateResponseErrorHandler; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.base.Charsets; + +// This test needs RestTemplateConfigurationApplication to be up and running +public class RestTemplateBasicLiveTest { + + private RestTemplate restTemplate; + private static final String fooResourceUrl = "http://localhost:" + APPLICATION_PORT + "/spring-rest/foos"; + + @BeforeEach + public void beforeTest() { + restTemplate = new RestTemplate(); + restTemplate.setErrorHandler(new RestTemplateResponseErrorHandler()); + // restTemplate.setMessageConverters(Arrays.asList(new MappingJackson2HttpMessageConverter())); + } + + // GET + + @Test + public void givenResourceUrl_whenSendGetForRequestEntity_thenStatusOk() throws IOException { + final ResponseEntity response = restTemplate.getForEntity(fooResourceUrl + "/1", Foo.class); + + Assertions.assertEquals(response.getStatusCode(), HttpStatus.OK); + } + + @Test + public void givenResourceUrl_whenSendGetForRequestEntity_thenBodyCorrect() throws IOException { + final RestTemplate template = new RestTemplate(); + final ResponseEntity response = template.getForEntity(fooResourceUrl + "/1", String.class); + + final ObjectMapper mapper = new ObjectMapper(); + final JsonNode root = mapper.readTree(response.getBody()); + final JsonNode name = root.path("name"); + Assertions.assertNotNull(name.asText()); + } + + @Test + public void givenResourceUrl_whenRetrievingResource_thenCorrect() throws IOException { + final Foo foo = restTemplate.getForObject(fooResourceUrl + "/1", Foo.class); + + Assertions.assertNotNull(foo.getName()); + Assertions.assertEquals(1L, foo.getId()); + } + + // HEAD, OPTIONS + @Test + public void givenFooService_whenCallHeadForHeaders_thenReceiveAllHeadersForThatResource() { + final HttpHeaders httpHeaders = restTemplate.headForHeaders(fooResourceUrl); + Assertions.assertTrue(httpHeaders.getContentType() + .includes(MediaType.APPLICATION_JSON)); + } + + // POST + + @Test + public void givenFooService_whenPostForObject_thenCreatedObjectIsReturned() { + final HttpEntity request = new HttpEntity<>(new Foo("bar")); + final Foo foo = restTemplate.postForObject(fooResourceUrl, request, Foo.class); + Assertions.assertNotNull(foo); + Assertions.assertEquals("bar", foo.getName()); + } + + @Test + public void givenFooService_whenPostForLocation_thenCreatedLocationIsReturned() { + final HttpEntity request = new HttpEntity<>(new Foo("bar")); + final URI location = restTemplate.postForLocation(fooResourceUrl, request, Foo.class); + Assertions.assertNotNull(location); + } + + @Test + public void givenFooService_whenPostResource_thenResourceIsCreated() { + final Foo foo = new Foo("bar"); + final ResponseEntity response = restTemplate.postForEntity(fooResourceUrl, foo, Foo.class); + + Assertions.assertEquals(response.getStatusCode(), HttpStatus.CREATED); + final Foo fooResponse = response.getBody(); + Assertions.assertNotNull(fooResponse); + Assertions.assertEquals("bar", fooResponse.getName()); + } + + @Test + public void givenFooService_whenCallOptionsForAllow_thenReceiveValueOfAllowHeader() { + final Set optionsForAllow = restTemplate.optionsForAllow(fooResourceUrl); + final HttpMethod[] supportedMethods = { HttpMethod.GET, HttpMethod.POST, HttpMethod.HEAD }; + + Assertions.assertTrue(optionsForAllow.containsAll(Arrays.asList(supportedMethods))); + } + + // PUT + + @Test + public void givenFooService_whenPutExistingEntity_thenItIsUpdated() { + final HttpHeaders headers = prepareBasicAuthHeaders(); + final HttpEntity request = new HttpEntity<>(new Foo("bar"), headers); + + // Create Resource + final ResponseEntity createResponse = restTemplate.exchange(fooResourceUrl, HttpMethod.POST, request, Foo.class); + + // Update Resource + final Foo updatedInstance = new Foo("newName"); + updatedInstance.setId(createResponse.getBody() + .getId()); + final String resourceUrl = fooResourceUrl + '/' + createResponse.getBody() + .getId(); + final HttpEntity requestUpdate = new HttpEntity<>(updatedInstance, headers); + restTemplate.exchange(resourceUrl, HttpMethod.PUT, requestUpdate, Void.class); + + // Check that Resource was updated + final ResponseEntity updateResponse = restTemplate.exchange(resourceUrl, HttpMethod.GET, new HttpEntity<>(headers), Foo.class); + final Foo foo = updateResponse.getBody(); + Assertions.assertEquals(foo.getName(), updatedInstance.getName()); + } + + @Test + public void givenFooService_whenPutExistingEntityWithCallback_thenItIsUpdated() { + final HttpHeaders headers = prepareBasicAuthHeaders(); + final HttpEntity request = new HttpEntity<>(new Foo("bar"), headers); + + // Create entity + ResponseEntity response = restTemplate.exchange(fooResourceUrl, HttpMethod.POST, request, Foo.class); + Assertions.assertEquals(response.getStatusCode(), HttpStatus.CREATED); + + // Update entity + final Foo updatedInstance = new Foo("newName"); + updatedInstance.setId(response.getBody() + .getId()); + final String resourceUrl = fooResourceUrl + '/' + response.getBody() + .getId(); + restTemplate.execute(resourceUrl, HttpMethod.PUT, requestCallback(updatedInstance), clientHttpResponse -> null); + + // Check that entity was updated + response = restTemplate.exchange(resourceUrl, HttpMethod.GET, new HttpEntity<>(headers), Foo.class); + final Foo foo = response.getBody(); + Assertions.assertEquals(foo.getName(), updatedInstance.getName()); + } + + // PATCH + + @Test + public void givenFooService_whenPatchExistingEntity_thenItIsUpdated() { + final HttpHeaders headers = prepareBasicAuthHeaders(); + final HttpEntity request = new HttpEntity<>(new Foo("bar"), headers); + + // Create Resource + final ResponseEntity createResponse = restTemplate.exchange(fooResourceUrl, HttpMethod.POST, request, Foo.class); + + // Update Resource + final Foo updatedResource = new Foo("newName"); + updatedResource.setId(createResponse.getBody() + .getId()); + final String resourceUrl = fooResourceUrl + '/' + createResponse.getBody() + .getId(); + final HttpEntity requestUpdate = new HttpEntity<>(updatedResource, headers); + final ClientHttpRequestFactory requestFactory = getClientHttpRequestFactory(); + final RestTemplate template = new RestTemplate(requestFactory); + template.setMessageConverters(Arrays.asList(new MappingJackson2HttpMessageConverter())); + template.patchForObject(resourceUrl, requestUpdate, Void.class); + + // Check that Resource was updated + final ResponseEntity updateResponse = restTemplate.exchange(resourceUrl, HttpMethod.GET, new HttpEntity<>(headers), Foo.class); + final Foo foo = updateResponse.getBody(); + Assertions.assertEquals(foo.getName(), updatedResource.getName()); + } + + // DELETE + + @Test + public void givenFooService_whenCallDelete_thenEntityIsRemoved() { + final Foo foo = new Foo("remove me"); + final ResponseEntity response = restTemplate.postForEntity(fooResourceUrl, foo, Foo.class); + Assertions.assertEquals(response.getStatusCode(), HttpStatus.CREATED); + + final String entityUrl = fooResourceUrl + "/" + response.getBody() + .getId(); + restTemplate.delete(entityUrl); + try { + restTemplate.getForEntity(entityUrl, Foo.class); + fail(); + } catch (final HttpClientErrorException ex) { + Assertions.assertEquals(ex.getStatusCode(), HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + @Test + public void givenFooService_whenFormSubmit_thenResourceIsCreated() { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + + MultiValueMap map= new LinkedMultiValueMap<>(); + map.add("id", "10"); + + HttpEntity> request = new HttpEntity<>(map, headers); + + ResponseEntity response = restTemplate.postForEntity( fooResourceUrl+"/form", request , String.class); + + Assertions.assertEquals(response.getStatusCode(), HttpStatus.CREATED); + final String fooResponse = response.getBody(); + Assertions.assertNotNull(fooResponse); + Assertions.assertEquals("10", fooResponse); + } + + private HttpHeaders prepareBasicAuthHeaders() { + final HttpHeaders headers = new HttpHeaders(); + final String encodedLogPass = getBase64EncodedLogPass(); + headers.add(HttpHeaders.AUTHORIZATION, "Basic " + encodedLogPass); + return headers; + } + + private String getBase64EncodedLogPass() { + final String logPass = "user1:user1Pass"; + final byte[] authHeaderBytes = Base64.getEncoder().encode(logPass.getBytes(Charsets.US_ASCII)); + return new String(authHeaderBytes, Charsets.US_ASCII); + } + + private RequestCallback requestCallback(final Foo updatedInstance) { + return clientHttpRequest -> { + final ObjectMapper mapper = new ObjectMapper(); + mapper.writeValue(clientHttpRequest.getBody(), updatedInstance); + clientHttpRequest.getHeaders() + .add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE); + clientHttpRequest.getHeaders() + .add(HttpHeaders.AUTHORIZATION, "Basic " + getBase64EncodedLogPass()); + }; + } + + // Simply setting restTemplate timeout using ClientHttpRequestFactory + + ClientHttpRequestFactory getClientHttpRequestFactory() { + final int timeout = 5; + final HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(); + clientHttpRequestFactory.setConnectTimeout(timeout * 1000); + return clientHttpRequestFactory; + } + +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/resttemplate/RestTemplateLiveTest.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/resttemplate/RestTemplateLiveTest.java new file mode 100644 index 0000000..e8ab9c9 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/resttemplate/RestTemplateLiveTest.java @@ -0,0 +1,40 @@ +package com.example.restTemplateDemo.resttemplate; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.web.client.RestTemplate; + +import com.example.restTemplateDemo.sampleapp.config.RestClientConfig; +import com.example.restTemplateDemo.transfer.LoginForm; + +@ExtendWith(SpringExtension.class) +@ContextConfiguration(classes = RestClientConfig.class) +public class RestTemplateLiveTest { + + @Autowired + RestTemplate restTemplate; + + @Test + public void givenRestTemplate_whenRequested_thenLogAndModifyResponse() { + LoginForm loginForm = new LoginForm("userName", "password"); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + HttpEntity requestEntity = new HttpEntity(loginForm, headers); + + ResponseEntity responseEntity = restTemplate.postForEntity("http://httpbin.org/post", requestEntity, String.class); + + Assertions.assertEquals(responseEntity.getStatusCode(), HttpStatus.OK); + Assertions.assertEquals("bar", responseEntity.getHeaders() + .get("Foo") + .get(0)); + } +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/web/handler/RestTemplateResponseErrorHandlerTest.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/web/handler/RestTemplateResponseErrorHandlerTest.java new file mode 100644 index 0000000..470f564 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/web/handler/RestTemplateResponseErrorHandlerTest.java @@ -0,0 +1,50 @@ +package com.example.restTemplateDemo.web.handler; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.client.RestClientTest; +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.test.web.client.ExpectedCount; +import org.springframework.test.web.client.MockRestServiceServer; +import static org.springframework.test.web.client.match.MockRestRequestMatchers.method; +import static org.springframework.test.web.client.match.MockRestRequestMatchers.requestTo; +import static org.springframework.test.web.client.response.MockRestResponseCreators.withStatus; +import org.springframework.web.client.RestTemplate; + +import com.example.restTemplateDemo.resttemplate.web.exception.NotFoundException; +import com.example.restTemplateDemo.resttemplate.web.handler.RestTemplateResponseErrorHandler; +import com.example.restTemplateDemo.resttemplate.web.model.Bar; + +@ExtendWith(SpringExtension.class) +@ContextConfiguration(classes = { NotFoundException.class, Bar.class }) +@RestClientTest +public class RestTemplateResponseErrorHandlerTest { + + @Autowired private MockRestServiceServer server; + @Autowired private RestTemplateBuilder builder; + + @Test + public void givenRemoteApiCall_when404Error_thenThrowNotFound() { + Assertions.assertNotNull(this.builder); + Assertions.assertNotNull(this.server); + + RestTemplate restTemplate = this.builder + .errorHandler(new RestTemplateResponseErrorHandler()) + .build(); + + this.server + .expect(ExpectedCount.once(), requestTo("/bars/4242")) + .andExpect(method(HttpMethod.GET)) + .andRespond(withStatus(HttpStatus.NOT_FOUND)); + + Assertions.assertThrows(NotFoundException.class, () -> { + Bar response = restTemplate.getForObject("/bars/4242", Bar.class); + }); + } +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/resources/.gitignore b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/resources/.gitignore new file mode 100644 index 0000000..f9bfbae --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/resources/.gitignore @@ -0,0 +1,13 @@ +*.class + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/resources/logback-test.xml b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/resources/logback-test.xml new file mode 100644 index 0000000..b2f79c1 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/resources/logback-test.xml @@ -0,0 +1,23 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + + + + + + + + + + \ No newline at end of file From 56bebcf069e5ee99d1034d22edb59ed37c72948f Mon Sep 17 00:00:00 2001 From: mikeleo03 Date: Wed, 31 Jul 2024 16:38:47 +0700 Subject: [PATCH 20/23] [Feat] Implementation of Rest Template 2 --- .../restTemplateDemo1/.gitignore | 33 +++ .../.mvn/wrapper/maven-wrapper.properties | 19 ++ .../RestTemplateDemo/restTemplateDemo1/mvnw | 259 ++++++++++++++++++ .../restTemplateDemo1/mvnw.cmd | 149 ++++++++++ .../restTemplateDemo1/pom.xml | 65 +++++ .../RestTemplateConfigurationApplication.java | 12 + .../RestTemplateDemo1Application.java | 16 ++ .../lists/EmployeeApplication.java | 16 ++ .../lists/client/EmployeeClient.java | 121 ++++++++ .../lists/controller/EmployeeResource.java | 46 ++++ .../restTemplateDemo1/lists/dto/Employee.java | 40 +++ .../lists/dto/EmployeeList.java | 29 ++ .../lists/service/EmployeeService.java | 25 ++ .../web/controller/PersonAPI.java | 38 +++ .../restTemplateDemo1/web/dto/Person.java | 32 +++ .../web/service/PersonService.java | 10 + .../web/service/PersonServiceImpl.java | 19 ++ .../src/main/resources/application.properties | 2 + .../lists/postjson/PersonAPILiveTest.java | 96 +++++++ .../RestTemplatePostReqEncLiveTest.java | 57 ++++ .../src/test/resources/application.properties | 5 + .../src/test/resources/logback-test.xml | 12 + 22 files changed, 1101 insertions(+) create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/.gitignore create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/.mvn/wrapper/maven-wrapper.properties create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/mvnw create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/mvnw.cmd create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/pom.xml create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/RestTemplateConfigurationApplication.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/RestTemplateDemo1Application.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/lists/EmployeeApplication.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/lists/client/EmployeeClient.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/lists/controller/EmployeeResource.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/lists/dto/Employee.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/lists/dto/EmployeeList.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/lists/service/EmployeeService.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/web/controller/PersonAPI.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/web/dto/Person.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/web/service/PersonService.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/web/service/PersonServiceImpl.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/resources/application.properties create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/test/java/com/example/restTemplateDemo1/lists/postjson/PersonAPILiveTest.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/test/java/com/example/restTemplateDemo1/lists/postjson/RestTemplatePostReqEncLiveTest.java create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/test/resources/application.properties create mode 100644 Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/test/resources/logback-test.xml diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/.gitignore b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/.mvn/wrapper/maven-wrapper.properties b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..8f96f52 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,19 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +wrapperVersion=3.3.2 +distributionType=only-script +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.7/apache-maven-3.9.7-bin.zip diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/mvnw b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/mvnw new file mode 100644 index 0000000..d7c358e --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/mvnw @@ -0,0 +1,259 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.3.2 +# +# Optional ENV vars +# ----------------- +# JAVA_HOME - location of a JDK home dir, required when download maven via java source +# MVNW_REPOURL - repo url base for downloading maven distribution +# MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +# MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output +# ---------------------------------------------------------------------------- + +set -euf +[ "${MVNW_VERBOSE-}" != debug ] || set -x + +# OS specific support. +native_path() { printf %s\\n "$1"; } +case "$(uname)" in +CYGWIN* | MINGW*) + [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")" + native_path() { cygpath --path --windows "$1"; } + ;; +esac + +# set JAVACMD and JAVACCMD +set_java_home() { + # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched + if [ -n "${JAVA_HOME-}" ]; then + if [ -x "$JAVA_HOME/jre/sh/java" ]; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACCMD="$JAVA_HOME/jre/sh/javac" + else + JAVACMD="$JAVA_HOME/bin/java" + JAVACCMD="$JAVA_HOME/bin/javac" + + if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then + echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2 + echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2 + return 1 + fi + fi + else + JAVACMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v java + )" || : + JAVACCMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v javac + )" || : + + if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then + echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2 + return 1 + fi + fi +} + +# hash string like Java String::hashCode +hash_string() { + str="${1:-}" h=0 + while [ -n "$str" ]; do + char="${str%"${str#?}"}" + h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296)) + str="${str#?}" + done + printf %x\\n $h +} + +verbose() { :; } +[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; } + +die() { + printf %s\\n "$1" >&2 + exit 1 +} + +trim() { + # MWRAPPER-139: + # Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds. + # Needed for removing poorly interpreted newline sequences when running in more + # exotic environments such as mingw bash on Windows. + printf "%s" "${1}" | tr -d '[:space:]' +} + +# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties +while IFS="=" read -r key value; do + case "${key-}" in + distributionUrl) distributionUrl=$(trim "${value-}") ;; + distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;; + esac +done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties" +[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties" + +case "${distributionUrl##*/}" in +maven-mvnd-*bin.*) + MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ + case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in + *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;; + :Darwin*x86_64) distributionPlatform=darwin-amd64 ;; + :Darwin*arm64) distributionPlatform=darwin-aarch64 ;; + :Linux*x86_64*) distributionPlatform=linux-amd64 ;; + *) + echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2 + distributionPlatform=linux-amd64 + ;; + esac + distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip" + ;; +maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;; +*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;; +esac + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}" +distributionUrlName="${distributionUrl##*/}" +distributionUrlNameMain="${distributionUrlName%.*}" +distributionUrlNameMain="${distributionUrlNameMain%-bin}" +MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}" +MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")" + +exec_maven() { + unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || : + exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD" +} + +if [ -d "$MAVEN_HOME" ]; then + verbose "found existing MAVEN_HOME at $MAVEN_HOME" + exec_maven "$@" +fi + +case "${distributionUrl-}" in +*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;; +*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;; +esac + +# prepare tmp dir +if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then + clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; } + trap clean HUP INT TERM EXIT +else + die "cannot create temp dir" +fi + +mkdir -p -- "${MAVEN_HOME%/*}" + +# Download and Install Apache Maven +verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +verbose "Downloading from: $distributionUrl" +verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +# select .zip or .tar.gz +if ! command -v unzip >/dev/null; then + distributionUrl="${distributionUrl%.zip}.tar.gz" + distributionUrlName="${distributionUrl##*/}" +fi + +# verbose opt +__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR='' +[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v + +# normalize http auth +case "${MVNW_PASSWORD:+has-password}" in +'') MVNW_USERNAME='' MVNW_PASSWORD='' ;; +has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;; +esac + +if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then + verbose "Found wget ... using wget" + wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl" +elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then + verbose "Found curl ... using curl" + curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl" +elif set_java_home; then + verbose "Falling back to use Java to download" + javaSource="$TMP_DOWNLOAD_DIR/Downloader.java" + targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName" + cat >"$javaSource" <<-END + public class Downloader extends java.net.Authenticator + { + protected java.net.PasswordAuthentication getPasswordAuthentication() + { + return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() ); + } + public static void main( String[] args ) throws Exception + { + setDefault( new Downloader() ); + java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() ); + } + } + END + # For Cygwin/MinGW, switch paths to Windows format before running javac and java + verbose " - Compiling Downloader.java ..." + "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java" + verbose " - Running Downloader.java ..." + "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")" +fi + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +if [ -n "${distributionSha256Sum-}" ]; then + distributionSha256Result=false + if [ "$MVN_CMD" = mvnd.sh ]; then + echo "Checksum validation is not supported for maven-mvnd." >&2 + echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + elif command -v sha256sum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then + distributionSha256Result=true + fi + elif command -v shasum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then + distributionSha256Result=true + fi + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2 + echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + fi + if [ $distributionSha256Result = false ]; then + echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2 + echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2 + exit 1 + fi +fi + +# unzip and move +if command -v unzip >/dev/null; then + unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip" +else + tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar" +fi +printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url" +mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME" + +clean || : +exec_maven "$@" diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/mvnw.cmd b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/mvnw.cmd new file mode 100644 index 0000000..6f779cf --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/mvnw.cmd @@ -0,0 +1,149 @@ +<# : batch portion +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.3.2 +@REM +@REM Optional ENV vars +@REM MVNW_REPOURL - repo url base for downloading maven distribution +@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output +@REM ---------------------------------------------------------------------------- + +@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0) +@SET __MVNW_CMD__= +@SET __MVNW_ERROR__= +@SET __MVNW_PSMODULEP_SAVE=%PSModulePath% +@SET PSModulePath= +@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @( + IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B) +) +@SET PSModulePath=%__MVNW_PSMODULEP_SAVE% +@SET __MVNW_PSMODULEP_SAVE= +@SET __MVNW_ARG0_NAME__= +@SET MVNW_USERNAME= +@SET MVNW_PASSWORD= +@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*) +@echo Cannot start maven from wrapper >&2 && exit /b 1 +@GOTO :EOF +: end batch / begin powershell #> + +$ErrorActionPreference = "Stop" +if ($env:MVNW_VERBOSE -eq "true") { + $VerbosePreference = "Continue" +} + +# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties +$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl +if (!$distributionUrl) { + Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" +} + +switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) { + "maven-mvnd-*" { + $USE_MVND = $true + $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip" + $MVN_CMD = "mvnd.cmd" + break + } + default { + $USE_MVND = $false + $MVN_CMD = $script -replace '^mvnw','mvn' + break + } +} + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +if ($env:MVNW_REPOURL) { + $MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" } + $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')" +} +$distributionUrlName = $distributionUrl -replace '^.*/','' +$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$','' +$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain" +if ($env:MAVEN_USER_HOME) { + $MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain" +} +$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join '' +$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME" + +if (Test-Path -Path "$MAVEN_HOME" -PathType Container) { + Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME" + Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" + exit $? +} + +if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) { + Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl" +} + +# prepare tmp dir +$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile +$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir" +$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null +trap { + if ($TMP_DOWNLOAD_DIR.Exists) { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } + } +} + +New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null + +# Download and Install Apache Maven +Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +Write-Verbose "Downloading from: $distributionUrl" +Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +$webclient = New-Object System.Net.WebClient +if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) { + $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD) +} +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum +if ($distributionSha256Sum) { + if ($USE_MVND) { + Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." + } + Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash + if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) { + Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property." + } +} + +# unzip and move +Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null +Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null +try { + Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null +} catch { + if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) { + Write-Error "fail to move MAVEN_HOME" + } +} finally { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } +} + +Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/pom.xml b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/pom.xml new file mode 100644 index 0000000..b646706 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/pom.xml @@ -0,0 +1,65 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.3.2 + + + com.example + restTemplateDemo1 + 0.0.1-SNAPSHOT + restTemplateDemo1 + Demo project for Spring Boot + + + + + + + + + + + + + + + 21 + com.example.restTemplateDemo1.RestTemplateDemo1Application + + + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-test + test + + + junit + junit + 4.13.2 + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/RestTemplateConfigurationApplication.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/RestTemplateConfigurationApplication.java new file mode 100644 index 0000000..675c981 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/RestTemplateConfigurationApplication.java @@ -0,0 +1,12 @@ +package com.example.restTemplateDemo1; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class RestTemplateConfigurationApplication { + + public static void main(String[] args) { + SpringApplication.run(RestTemplateConfigurationApplication.class, args); + } +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/RestTemplateDemo1Application.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/RestTemplateDemo1Application.java new file mode 100644 index 0000000..115a8e1 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/RestTemplateDemo1Application.java @@ -0,0 +1,16 @@ +package com.example.restTemplateDemo1; + +import java.util.Collections; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class RestTemplateDemo1Application { + + public static void main(String[] args) { + SpringApplication app = new SpringApplication(RestTemplateDemo1Application.class); + app.setDefaultProperties(Collections.singletonMap("server.servlet.encoding.charset", "ISO-8859-1")); + app.run(args); + } +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/lists/EmployeeApplication.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/lists/EmployeeApplication.java new file mode 100644 index 0000000..8ec4112 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/lists/EmployeeApplication.java @@ -0,0 +1,16 @@ +package com.example.restTemplateDemo1.lists; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * Sample application used to demonstrate working with Lists and RestTemplate. + */ +@SpringBootApplication +public class EmployeeApplication +{ + public static void main(String[] args) + { + SpringApplication.run(EmployeeApplication.class, args); + } +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/lists/client/EmployeeClient.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/lists/client/EmployeeClient.java new file mode 100644 index 0000000..94b21ae --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/lists/client/EmployeeClient.java @@ -0,0 +1,121 @@ +package com.example.restTemplateDemo1.lists.client; + +import static java.util.Arrays.asList; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestTemplate; + +import com.example.restTemplateDemo1.lists.dto.Employee; +import com.example.restTemplateDemo1.lists.dto.EmployeeList; + +/** + * Application that shows how to use Lists with RestTemplate. + */ +public class EmployeeClient { + public static void main(String[] args) { + EmployeeClient employeeClient = new EmployeeClient(); + + System.out.println("Calling GET for entity using arrays"); + employeeClient.getForEntityEmployeesAsArray(); + + System.out.println("Calling GET using ParameterizedTypeReference"); + employeeClient.getAllEmployeesUsingParameterizedTypeReference(); + + System.out.println("Calling GET using wrapper class"); + employeeClient.getAllEmployeesUsingWrapperClass(); + + System.out.println("Calling POST using normal lists"); + employeeClient.createEmployeesUsingLists(); + + System.out.println("Calling POST using wrapper class"); + employeeClient.createEmployeesUsingWrapperClass(); + } + + public EmployeeClient() { + + } + + public Employee[] getForEntityEmployeesAsArray() { + + RestTemplate restTemplate = new RestTemplate(); + + ResponseEntity response = + restTemplate.getForEntity( + "http://localhost:8080/spring-rest/employees/", + Employee[].class); + + Employee[] employees = response.getBody(); + + assert employees != null; + asList(employees).forEach(System.out::println); + + return employees; + + } + + + public List getAllEmployeesUsingParameterizedTypeReference() { + RestTemplate restTemplate = new RestTemplate(); + + ResponseEntity> response = + restTemplate.exchange( + "http://localhost:8080/spring-rest/employees/", + HttpMethod.GET, + null, + new ParameterizedTypeReference>() { + }); + + List employees = response.getBody(); + + assert employees != null; + employees.forEach(System.out::println); + + return employees; + } + + public List getAllEmployeesUsingWrapperClass() { + RestTemplate restTemplate = new RestTemplate(); + + EmployeeList response = + restTemplate.getForObject( + "http://localhost:8080/spring-rest/employees/v2", + EmployeeList.class); + + List employees = response.getEmployees(); + + employees.forEach(System.out::println); + + return employees; + } + + public void createEmployeesUsingLists() { + RestTemplate restTemplate = new RestTemplate(); + + List newEmployees = new ArrayList<>(); + newEmployees.add(new Employee(3, "Intern")); + newEmployees.add(new Employee(4, "CEO")); + + restTemplate.postForObject( + "http://localhost:8080/spring-rest/employees/", + newEmployees, + ResponseEntity.class); + } + + public void createEmployeesUsingWrapperClass() { + RestTemplate restTemplate = new RestTemplate(); + + List newEmployees = new ArrayList<>(); + newEmployees.add(new Employee(3, "Intern")); + newEmployees.add(new Employee(4, "CEO")); + + restTemplate.postForObject( + "http://localhost:8080/spring-rest/employees/v2", + new EmployeeList(newEmployees), + ResponseEntity.class); + } +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/lists/controller/EmployeeResource.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/lists/controller/EmployeeResource.java new file mode 100644 index 0000000..57af327 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/lists/controller/EmployeeResource.java @@ -0,0 +1,46 @@ +package com.example.restTemplateDemo1.lists.controller; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import com.example.restTemplateDemo1.lists.dto.Employee; +import com.example.restTemplateDemo1.lists.dto.EmployeeList; +import com.example.restTemplateDemo1.lists.service.EmployeeService; + +@RestController +@RequestMapping("/employees") +public class EmployeeResource +{ + @Autowired + private EmployeeService employeeService; + + @RequestMapping(method = RequestMethod.GET, path = "/") + public List getEmployees() + { + return employeeService.getAllEmployees(); + } + + @RequestMapping(method = RequestMethod.GET, path = "/v2") + public EmployeeList getEmployeesUsingWrapperClass() + { + List employees = employeeService.getAllEmployees(); + return new EmployeeList(employees); + } + + @RequestMapping(method = RequestMethod.POST, path = "/") + public void addEmployees(@RequestBody List employees) + { + employeeService.addEmployees(employees); + } + + @RequestMapping(method = RequestMethod.POST, path = "/v2") + public void addEmployeesUsingWrapperClass(@RequestBody EmployeeList employeeWrapper) + { + employeeService.addEmployees(employeeWrapper.getEmployees()); + } +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/lists/dto/Employee.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/lists/dto/Employee.java new file mode 100644 index 0000000..2f47f49 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/lists/dto/Employee.java @@ -0,0 +1,40 @@ +package com.example.restTemplateDemo1.lists.dto; + +public class Employee { + + public long id; + public String title; + + public Employee() + { + + } + + public Employee(long id, String title) + { + this.id = id; + this.title = title; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + @Override + public String toString() + { + return "Employee #" + id + "[" + title + "]"; + } +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/lists/dto/EmployeeList.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/lists/dto/EmployeeList.java new file mode 100644 index 0000000..a9fa1dd --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/lists/dto/EmployeeList.java @@ -0,0 +1,29 @@ +package com.example.restTemplateDemo1.lists.dto; + +import java.util.ArrayList; +import java.util.List; + +public class EmployeeList +{ + public List employees; + + public EmployeeList() + { + employees = new ArrayList<>(); + } + + public EmployeeList(List employees) + { + this.employees = employees; + } + + public void setEmployees(List employees) + { + this.employees = employees; + } + + public List getEmployees() + { + return employees; + } +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/lists/service/EmployeeService.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/lists/service/EmployeeService.java new file mode 100644 index 0000000..5fb31d1 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/lists/service/EmployeeService.java @@ -0,0 +1,25 @@ +package com.example.restTemplateDemo1.lists.service; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.stereotype.Service; + +import com.example.restTemplateDemo1.lists.dto.Employee; + +@Service("EmployeeListService") +public class EmployeeService +{ + public List getAllEmployees() + { + List employees = new ArrayList<>(); + employees.add(new Employee(1, "Manager")); + employees.add(new Employee(2, "Java Developer")); + return employees; + } + + public void addEmployees(List employees) + { + employees.forEach(e -> System.out.println("Adding new employee " + e)); + } +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/web/controller/PersonAPI.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/web/controller/PersonAPI.java new file mode 100644 index 0000000..ae150cf --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/web/controller/PersonAPI.java @@ -0,0 +1,38 @@ +package com.example.restTemplateDemo1.web.controller; + +import jakarta.servlet.http.HttpServletResponse; + +import com.example.restTemplateDemo1.web.service.PersonService; +import com.example.restTemplateDemo1.web.dto.Person; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.support.ServletUriComponentsBuilder; + +@RestController +public class PersonAPI { + + @Autowired + private PersonService personService; + + @GetMapping("/") + public String home() { + return "Spring boot is working!"; + } + + @PostMapping(value = "/createPerson", consumes = "application/json", produces = "application/json") + public Person createPerson(@RequestBody Person person) { + return personService.saveUpdatePerson(person); + } + + @PostMapping(value = "/updatePerson", consumes = "application/json", produces = "application/json") + public Person updatePerson(@RequestBody Person person, HttpServletResponse response) { + response.setHeader("Location", ServletUriComponentsBuilder.fromCurrentContextPath() + .path("/findPerson/" + person.getId()) + .toUriString()); + return personService.saveUpdatePerson(person); + } + +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/web/dto/Person.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/web/dto/Person.java new file mode 100644 index 0000000..0ff8c23 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/web/dto/Person.java @@ -0,0 +1,32 @@ +package com.example.restTemplateDemo1.web.dto; + +public class Person { + private Integer id; + private String name; + + public Person() { + + } + + public Person(Integer id, String name) { + this.id = id; + this.name = name; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/web/service/PersonService.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/web/service/PersonService.java new file mode 100644 index 0000000..7714589 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/web/service/PersonService.java @@ -0,0 +1,10 @@ +package com.example.restTemplateDemo1.web.service; + +import com.example.restTemplateDemo1.web.dto.Person; + +public interface PersonService { + + public Person saveUpdatePerson(Person person); + + public Person findPersonById(Integer id); +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/web/service/PersonServiceImpl.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/web/service/PersonServiceImpl.java new file mode 100644 index 0000000..ddd02fd --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/java/com/example/restTemplateDemo1/web/service/PersonServiceImpl.java @@ -0,0 +1,19 @@ +package com.example.restTemplateDemo1.web.service; + +import com.example.restTemplateDemo1.web.dto.Person; +import org.springframework.stereotype.Component; + +@Component +public class PersonServiceImpl implements PersonService { + + @Override + public Person saveUpdatePerson(Person person) { + return person; + } + + @Override + public Person findPersonById(Integer id) { + return new Person(id, "John"); + } + +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/resources/application.properties b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/resources/application.properties new file mode 100644 index 0000000..345e237 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/main/resources/application.properties @@ -0,0 +1,2 @@ +server.port=8080 +server.servlet.context-path=/spring-rest diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/test/java/com/example/restTemplateDemo1/lists/postjson/PersonAPILiveTest.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/test/java/com/example/restTemplateDemo1/lists/postjson/PersonAPILiveTest.java new file mode 100644 index 0000000..25acd91 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/test/java/com/example/restTemplateDemo1/lists/postjson/PersonAPILiveTest.java @@ -0,0 +1,96 @@ +package com.example.restTemplateDemo1.lists.postjson; + +import java.io.IOException; +import java.net.URI; + +import org.json.JSONException; +import org.json.JSONObject; +import static org.junit.Assert.assertNotNull; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.web.client.RestTemplate; + +import com.example.restTemplateDemo1.RestTemplateConfigurationApplication; +import com.example.restTemplateDemo1.web.dto.Person; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = RestTemplateConfigurationApplication.class) +public class PersonAPILiveTest { + + private static String createPersonUrl; + private static String updatePersonUrl; + + private static RestTemplate restTemplate; + + private static HttpHeaders headers; + + private final ObjectMapper objectMapper = new ObjectMapper(); + + private static JSONObject personJsonObject; + + @BeforeClass + public static void runBeforeAllTestMethods() throws JSONException { + createPersonUrl = "http://localhost:8080/spring-rest/createPerson"; + updatePersonUrl = "http://localhost:8080/spring-rest/updatePerson"; + + restTemplate = new RestTemplate(); + + headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + personJsonObject = new JSONObject(); + personJsonObject.put("id", 1); + personJsonObject.put("name", "John"); + } + + @Test + public void givenDataIsJson_whenDataIsPostedByPostForObject_thenResponseBodyIsNotNull() throws IOException { + HttpEntity request = new HttpEntity<>(personJsonObject.toString(), headers); + String personResultAsJsonStr = restTemplate.postForObject(createPersonUrl, request, String.class); + JsonNode root = objectMapper.readTree(personResultAsJsonStr); + + Person person = restTemplate.postForObject(createPersonUrl, request, Person.class); + + assertNotNull(personResultAsJsonStr); + assertNotNull(root); + assertNotNull(root.path("name") + .asText()); + + assertNotNull(person); + assertNotNull(person.getName()); + } + + @Test + public void givenDataIsJson_whenDataIsPostedByPostForEntity_thenResponseBodyIsNotNull() throws IOException { + HttpEntity request = new HttpEntity<>(personJsonObject.toString(), headers); + ResponseEntity responseEntityStr = restTemplate.postForEntity(createPersonUrl, request, String.class); + JsonNode root = objectMapper.readTree(responseEntityStr.getBody()); + + ResponseEntity responseEntityPerson = restTemplate.postForEntity(createPersonUrl, request, Person.class); + + assertNotNull(responseEntityStr.getBody()); + assertNotNull(root.path("name") + .asText()); + + assertNotNull(responseEntityPerson.getBody()); + assertNotNull(responseEntityPerson.getBody() + .getName()); + } + + @Test + public void givenDataIsJson_whenDataIsPostedByPostForLocation_thenResponseBodyIsTheLocationHeader() throws JsonProcessingException { + HttpEntity request = new HttpEntity<>(personJsonObject.toString(), headers); + URI locationHeader = restTemplate.postForLocation(updatePersonUrl, request); + + assertNotNull(locationHeader); + } +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/test/java/com/example/restTemplateDemo1/lists/postjson/RestTemplatePostReqEncLiveTest.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/test/java/com/example/restTemplateDemo1/lists/postjson/RestTemplatePostReqEncLiveTest.java new file mode 100644 index 0000000..90444cc --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/test/java/com/example/restTemplateDemo1/lists/postjson/RestTemplatePostReqEncLiveTest.java @@ -0,0 +1,57 @@ +package com.example.restTemplateDemo1.lists.postjson; + +import org.json.JSONException; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.web.client.RestTemplate; + +import com.example.restTemplateDemo1.RestTemplateDemo1Application; +import com.example.restTemplateDemo1.web.dto.Person; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = RestTemplateDemo1Application.class) +public class RestTemplatePostReqEncLiveTest { + private static String createPersonUrl; + private static RestTemplate restTemplate; + + @BeforeClass + public static void runBeforeAllTestMethods() throws JSONException { + createPersonUrl = "http://localhost:8080/spring-rest/createPerson"; + restTemplate = new RestTemplate(); + } + + @Test + public void givenJapaneseNameInDataWithoutHeaderEncoding_whenDataIsPostedByPostForObject_thenSaveIncorrectly() { + Person japanese = new Person(100, "関連当"); + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + HttpEntity request = new HttpEntity<>(japanese, headers); + + Person person = restTemplate.postForObject(createPersonUrl, request, Person.class); + assertNotNull(person); + assertNotEquals("関連当", person.getName()); + } + + @Test + public void givenJapaneseNameInDataWithHeaderEncoding_whenDataIsPostedByPostForObject_thenSaveCorrectly() { + Person japanese = new Person(100, "関連当"); + + HttpHeaders headers = new HttpHeaders(); + headers.set("Content-type", "application/json;charset=UTF-8"); + HttpEntity request = new HttpEntity<>(japanese, headers); + + Person person = restTemplate.postForObject(createPersonUrl, request, Person.class); + assertNotNull(person); + assertEquals("関連当", person.getName()); + } +} diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/test/resources/application.properties b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/test/resources/application.properties new file mode 100644 index 0000000..286ea95 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/test/resources/application.properties @@ -0,0 +1,5 @@ +logging.level.org.springframework.web.client.RestTemplate=DEBUG +logging.level.com.baeldung.resttemplate.logging=DEBUG +logging.level.org.apache.http=DEBUG +logging.level.httpclient.wire=DEBUG +logging.pattern.console=%20logger{20} - %msg%n diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/test/resources/logback-test.xml b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/test/resources/logback-test.xml new file mode 100644 index 0000000..d9b5dda --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/test/resources/logback-test.xml @@ -0,0 +1,12 @@ + + + + + [%d{ISO8601}]-[%thread] %-5level %logger - %msg%n + + + + + + + \ No newline at end of file From 39f535ec0b438fc302b0b928cad92ea9d481b68d Mon Sep 17 00:00:00 2001 From: mikeleo03 Date: Thu, 1 Aug 2024 09:27:45 +0700 Subject: [PATCH 21/23] [Feat] Implementation of WebClient --- .../WebClientDemo/webClientDemo/.gitignore | 33 +++ .../.mvn/wrapper/maven-wrapper.properties | 19 ++ .../WebClientDemo/webClientDemo/mvnw | 259 ++++++++++++++++++ .../WebClientDemo/webClientDemo/mvnw.cmd | 149 ++++++++++ .../WebClientDemo/webClientDemo/pom.xml | 233 ++++++++++++++++ .../reactive/controller/UploadController.java | 28 ++ .../webClientDemo/reactive/enums/Role.java | 5 + .../reactive/exception/ServiceException.java | 8 + .../reactive/model/Employee.java | 18 ++ .../webClientDemo/reactive/model/Foo.java | 11 + .../reactive/service/EmployeeService.java | 60 ++++ .../service/ReactiveUploadService.java | 66 +++++ .../webclient/simultaneous/Client.java | 58 ++++ .../reactive/webclient/simultaneous/Item.java | 20 ++ .../reactive/webclient/simultaneous/User.java | 20 ++ .../webclient/simultaneous/UserWithItem.java | 22 ++ .../webClientDemo/webclient/Product.java | 13 + .../webclient/ProductsFeignClient.java | 15 + .../ProductsSlowServiceController.java | 21 ++ .../webclient/WebClientApplication.java | 15 + .../webclient/WebController.java | 59 ++++ .../webclient/json/ReaderConsumerService.java | 18 ++ .../json/ReaderConsumerServiceImpl.java | 90 ++++++ .../webclient/json/model/Book.java | 22 ++ .../webclient/json/model/Reader.java | 30 ++ .../status/WebClientStatusCodeHandler.java | 58 ++++ .../exception/CustomBadRequestException.java | 7 + .../exception/CustomServerErrorException.java | 7 + .../timeout/WebClientTimeoutProvider.java | 92 +++++++ .../src/main/resources/application.properties | 3 + .../src/main/resources/logback.xml | 20 ++ .../src/main/webapp/WEB-INF/web.xml | 21 ++ .../webClientDemo/SpringContextTest.java | 17 ++ .../reactive/ReactiveIntegrationTest.java | 73 +++++ .../SpringReactiveTestApplication.java | 34 +++ .../WebClientLoggingIntegrationTest.java | 129 +++++++++ .../reactive/logging/filters/LogFilters.java | 54 ++++ .../logging/jetty/RequestLogEnhancer.java | 95 +++++++ .../EmployeeServiceIntgerationTest.java | 123 +++++++++ .../service/EmployeeServiceUnitTest.java | 117 ++++++++ .../ReactiveUploadServiceUnitTest.java | 49 ++++ .../simultaneous/ClientIntegrationTest.java | 77 ++++++ ...lientStatusCodeHandlerIntegrationTest.java | 98 +++++++ .../WebControllerIntegrationTest.java | 49 ++++ .../ReaderConsumerServiceImplUnitTest.java | 88 ++++++ .../WebClientTimeoutIntegrationTest.java | 133 +++++++++ .../src/test/resources/logback-test.xml | 20 ++ 47 files changed, 2656 insertions(+) create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/.gitignore create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/.mvn/wrapper/maven-wrapper.properties create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/mvnw create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/mvnw.cmd create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/pom.xml create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/reactive/controller/UploadController.java create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/reactive/enums/Role.java create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/reactive/exception/ServiceException.java create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/reactive/model/Employee.java create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/reactive/model/Foo.java create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/reactive/service/EmployeeService.java create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/reactive/service/ReactiveUploadService.java create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/reactive/webclient/simultaneous/Client.java create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/reactive/webclient/simultaneous/Item.java create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/reactive/webclient/simultaneous/User.java create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/reactive/webclient/simultaneous/UserWithItem.java create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/Product.java create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/ProductsFeignClient.java create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/ProductsSlowServiceController.java create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/WebClientApplication.java create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/WebController.java create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/json/ReaderConsumerService.java create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/json/ReaderConsumerServiceImpl.java create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/json/model/Book.java create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/json/model/Reader.java create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/status/WebClientStatusCodeHandler.java create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/status/exception/CustomBadRequestException.java create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/status/exception/CustomServerErrorException.java create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/timeout/WebClientTimeoutProvider.java create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/resources/application.properties create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/resources/logback.xml create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/webapp/WEB-INF/web.xml create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/SpringContextTest.java create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/reactive/ReactiveIntegrationTest.java create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/reactive/SpringReactiveTestApplication.java create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/reactive/logging/WebClientLoggingIntegrationTest.java create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/reactive/logging/filters/LogFilters.java create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/reactive/logging/jetty/RequestLogEnhancer.java create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/reactive/service/EmployeeServiceIntgerationTest.java create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/reactive/service/EmployeeServiceUnitTest.java create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/reactive/service/ReactiveUploadServiceUnitTest.java create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/reactive/webclient/simultaneous/ClientIntegrationTest.java create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/webclient/WebClientStatusCodeHandlerIntegrationTest.java create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/webclient/WebControllerIntegrationTest.java create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/webclient/json/ReaderConsumerServiceImplUnitTest.java create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/webclient/timeout/WebClientTimeoutIntegrationTest.java create mode 100644 Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/resources/logback-test.xml diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/.gitignore b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/.mvn/wrapper/maven-wrapper.properties b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..8f96f52 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,19 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +wrapperVersion=3.3.2 +distributionType=only-script +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.7/apache-maven-3.9.7-bin.zip diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/mvnw b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/mvnw new file mode 100644 index 0000000..d7c358e --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/mvnw @@ -0,0 +1,259 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.3.2 +# +# Optional ENV vars +# ----------------- +# JAVA_HOME - location of a JDK home dir, required when download maven via java source +# MVNW_REPOURL - repo url base for downloading maven distribution +# MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +# MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output +# ---------------------------------------------------------------------------- + +set -euf +[ "${MVNW_VERBOSE-}" != debug ] || set -x + +# OS specific support. +native_path() { printf %s\\n "$1"; } +case "$(uname)" in +CYGWIN* | MINGW*) + [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")" + native_path() { cygpath --path --windows "$1"; } + ;; +esac + +# set JAVACMD and JAVACCMD +set_java_home() { + # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched + if [ -n "${JAVA_HOME-}" ]; then + if [ -x "$JAVA_HOME/jre/sh/java" ]; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACCMD="$JAVA_HOME/jre/sh/javac" + else + JAVACMD="$JAVA_HOME/bin/java" + JAVACCMD="$JAVA_HOME/bin/javac" + + if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then + echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2 + echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2 + return 1 + fi + fi + else + JAVACMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v java + )" || : + JAVACCMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v javac + )" || : + + if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then + echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2 + return 1 + fi + fi +} + +# hash string like Java String::hashCode +hash_string() { + str="${1:-}" h=0 + while [ -n "$str" ]; do + char="${str%"${str#?}"}" + h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296)) + str="${str#?}" + done + printf %x\\n $h +} + +verbose() { :; } +[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; } + +die() { + printf %s\\n "$1" >&2 + exit 1 +} + +trim() { + # MWRAPPER-139: + # Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds. + # Needed for removing poorly interpreted newline sequences when running in more + # exotic environments such as mingw bash on Windows. + printf "%s" "${1}" | tr -d '[:space:]' +} + +# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties +while IFS="=" read -r key value; do + case "${key-}" in + distributionUrl) distributionUrl=$(trim "${value-}") ;; + distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;; + esac +done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties" +[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties" + +case "${distributionUrl##*/}" in +maven-mvnd-*bin.*) + MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ + case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in + *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;; + :Darwin*x86_64) distributionPlatform=darwin-amd64 ;; + :Darwin*arm64) distributionPlatform=darwin-aarch64 ;; + :Linux*x86_64*) distributionPlatform=linux-amd64 ;; + *) + echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2 + distributionPlatform=linux-amd64 + ;; + esac + distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip" + ;; +maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;; +*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;; +esac + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}" +distributionUrlName="${distributionUrl##*/}" +distributionUrlNameMain="${distributionUrlName%.*}" +distributionUrlNameMain="${distributionUrlNameMain%-bin}" +MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}" +MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")" + +exec_maven() { + unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || : + exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD" +} + +if [ -d "$MAVEN_HOME" ]; then + verbose "found existing MAVEN_HOME at $MAVEN_HOME" + exec_maven "$@" +fi + +case "${distributionUrl-}" in +*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;; +*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;; +esac + +# prepare tmp dir +if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then + clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; } + trap clean HUP INT TERM EXIT +else + die "cannot create temp dir" +fi + +mkdir -p -- "${MAVEN_HOME%/*}" + +# Download and Install Apache Maven +verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +verbose "Downloading from: $distributionUrl" +verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +# select .zip or .tar.gz +if ! command -v unzip >/dev/null; then + distributionUrl="${distributionUrl%.zip}.tar.gz" + distributionUrlName="${distributionUrl##*/}" +fi + +# verbose opt +__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR='' +[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v + +# normalize http auth +case "${MVNW_PASSWORD:+has-password}" in +'') MVNW_USERNAME='' MVNW_PASSWORD='' ;; +has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;; +esac + +if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then + verbose "Found wget ... using wget" + wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl" +elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then + verbose "Found curl ... using curl" + curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl" +elif set_java_home; then + verbose "Falling back to use Java to download" + javaSource="$TMP_DOWNLOAD_DIR/Downloader.java" + targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName" + cat >"$javaSource" <<-END + public class Downloader extends java.net.Authenticator + { + protected java.net.PasswordAuthentication getPasswordAuthentication() + { + return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() ); + } + public static void main( String[] args ) throws Exception + { + setDefault( new Downloader() ); + java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() ); + } + } + END + # For Cygwin/MinGW, switch paths to Windows format before running javac and java + verbose " - Compiling Downloader.java ..." + "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java" + verbose " - Running Downloader.java ..." + "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")" +fi + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +if [ -n "${distributionSha256Sum-}" ]; then + distributionSha256Result=false + if [ "$MVN_CMD" = mvnd.sh ]; then + echo "Checksum validation is not supported for maven-mvnd." >&2 + echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + elif command -v sha256sum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then + distributionSha256Result=true + fi + elif command -v shasum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then + distributionSha256Result=true + fi + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2 + echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + fi + if [ $distributionSha256Result = false ]; then + echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2 + echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2 + exit 1 + fi +fi + +# unzip and move +if command -v unzip >/dev/null; then + unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip" +else + tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar" +fi +printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url" +mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME" + +clean || : +exec_maven "$@" diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/mvnw.cmd b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/mvnw.cmd new file mode 100644 index 0000000..6f779cf --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/mvnw.cmd @@ -0,0 +1,149 @@ +<# : batch portion +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.3.2 +@REM +@REM Optional ENV vars +@REM MVNW_REPOURL - repo url base for downloading maven distribution +@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output +@REM ---------------------------------------------------------------------------- + +@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0) +@SET __MVNW_CMD__= +@SET __MVNW_ERROR__= +@SET __MVNW_PSMODULEP_SAVE=%PSModulePath% +@SET PSModulePath= +@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @( + IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B) +) +@SET PSModulePath=%__MVNW_PSMODULEP_SAVE% +@SET __MVNW_PSMODULEP_SAVE= +@SET __MVNW_ARG0_NAME__= +@SET MVNW_USERNAME= +@SET MVNW_PASSWORD= +@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*) +@echo Cannot start maven from wrapper >&2 && exit /b 1 +@GOTO :EOF +: end batch / begin powershell #> + +$ErrorActionPreference = "Stop" +if ($env:MVNW_VERBOSE -eq "true") { + $VerbosePreference = "Continue" +} + +# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties +$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl +if (!$distributionUrl) { + Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" +} + +switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) { + "maven-mvnd-*" { + $USE_MVND = $true + $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip" + $MVN_CMD = "mvnd.cmd" + break + } + default { + $USE_MVND = $false + $MVN_CMD = $script -replace '^mvnw','mvn' + break + } +} + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +if ($env:MVNW_REPOURL) { + $MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" } + $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')" +} +$distributionUrlName = $distributionUrl -replace '^.*/','' +$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$','' +$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain" +if ($env:MAVEN_USER_HOME) { + $MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain" +} +$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join '' +$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME" + +if (Test-Path -Path "$MAVEN_HOME" -PathType Container) { + Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME" + Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" + exit $? +} + +if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) { + Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl" +} + +# prepare tmp dir +$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile +$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir" +$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null +trap { + if ($TMP_DOWNLOAD_DIR.Exists) { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } + } +} + +New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null + +# Download and Install Apache Maven +Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +Write-Verbose "Downloading from: $distributionUrl" +Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +$webclient = New-Object System.Net.WebClient +if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) { + $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD) +} +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum +if ($distributionSha256Sum) { + if ($USE_MVND) { + Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." + } + Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash + if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) { + Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property." + } +} + +# unzip and move +Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null +Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null +try { + Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null +} catch { + if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) { + Write-Error "fail to move MAVEN_HOME" + } +} finally { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } +} + +Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/pom.xml b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/pom.xml new file mode 100644 index 0000000..f092748 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/pom.xml @@ -0,0 +1,233 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.3.2 + + + com.example + webClientDemo + 0.0.1-SNAPSHOT + webClientDemo + Demo project for Spring Boot + + + + + + + + + + + + + + + 21 + 1.0.1.RELEASE + 1.0 + 4.0.3 + 5.0.0-alpha.12 + 3.5.3 + 3.4.2 + 4.0.3 + 2.0.0-Beta4 + 2.0.0 + 2.1.3 + 4.4 + 4.11.0 + 12.0.10 + logback.xml + + + + + + org.springframework.cloud + spring-cloud-dependencies + 2023.0.3 + pom + import + + + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-webflux + + + org.springframework.cloud + spring-cloud-starter-openfeign + ${spring-cloud-starter-openfeign.version} + + + org.projectreactor + reactor-spring + ${reactor-spring.version} + + + jakarta.json.bind + jakarta.json.bind-api + + + jakarta.json + jakarta.json-api + ${jakarta.json-api.version} + + + org.apache.geronimo.specs + geronimo-json_1.1_spec + ${geronimo-json_1.1_spec.version} + + + org.apache.johnzon + johnzon-jsonb + ${johnzon-jsonb.version} + + + + org.apache.commons + commons-lang3 + + + + com.squareup.okhttp3 + okhttp + ${okhttp.version} + + + com.squareup.okhttp3 + mockwebserver + ${okhttp.version} + test + + + + org.springframework.boot + spring-boot-devtools + runtime + + + com.h2database + h2 + runtime + + + org.springframework + spring-test + + + org.springframework.boot + spring-boot-starter-test + test + + + org.wiremock + wiremock-standalone + ${wiremock-standalone.version} + test + + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + test + + + org.projectlombok + lombok + ${lombok.version} + + + org.mockito + mockito-junit-jupiter + ${mockito-junit-jupiter.version} + test + + + io.projectreactor + reactor-test + test + + + org.eclipse.jetty + jetty-reactive-httpclient + ${jetty-reactive-httpclient.version} + test + + + org.eclipse.jetty + jetty-client + ${jetty-client.version} + test + + + org.jetbrains.kotlin + kotlin-stdlib + ${kotlin-stdlib.version} + + + + + + integration-lite-first + + + + org.apache.maven.plugins + maven-surefire-plugin + + + ${project.basedir}/src/test/resources/logback-test.xml + + + + + + + + integration-lite-second + + + + org.apache.maven.plugins + maven-surefire-plugin + + + ${project.basedir}/src/test/resources/logback-test.xml + + + + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/reactive/controller/UploadController.java b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/reactive/controller/UploadController.java new file mode 100644 index 0000000..4c9a5ae --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/reactive/controller/UploadController.java @@ -0,0 +1,28 @@ +package com.example.webClientDemo.reactive.controller; + +import com.example.webClientDemo.reactive.service.ReactiveUploadService; +import org.springframework.http.HttpStatusCode; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import reactor.core.publisher.Mono; + +@RestController +public class UploadController { + final ReactiveUploadService uploadService; + + public UploadController(ReactiveUploadService uploadService) { + this.uploadService = uploadService; + } + + @PostMapping(path = "/upload") + @ResponseBody + public Mono uploadPdf(@RequestParam("file") final MultipartFile multipartFile) { + return uploadService.uploadPdf(multipartFile.getResource()); + } + + @PostMapping(path = "/upload/multipart") + @ResponseBody + public Mono uploadMultipart(@RequestParam("file") final MultipartFile multipartFile) { + return uploadService.uploadMultipart(multipartFile); + } +} diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/reactive/enums/Role.java b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/reactive/enums/Role.java new file mode 100644 index 0000000..2b1d95e --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/reactive/enums/Role.java @@ -0,0 +1,5 @@ +package com.example.webClientDemo.reactive.enums; + +public enum Role { + ENGINEER, SENIOR_ENGINEER, LEAD_ENGINEER +} diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/reactive/exception/ServiceException.java b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/reactive/exception/ServiceException.java new file mode 100644 index 0000000..e324730 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/reactive/exception/ServiceException.java @@ -0,0 +1,8 @@ +package com.example.webClientDemo.reactive.exception; + +public class ServiceException extends RuntimeException{ + + public ServiceException(String message) { + super(message); + } +} diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/reactive/model/Employee.java b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/reactive/model/Employee.java new file mode 100644 index 0000000..cd54ca0 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/reactive/model/Employee.java @@ -0,0 +1,18 @@ +package com.example.webClientDemo.reactive.model; + +import com.example.webClientDemo.reactive.enums.Role; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@AllArgsConstructor +@NoArgsConstructor +@Data +public class Employee { + private Integer employeeId; + private String firstName; + private String lastName; + private Integer age; + private Role role; +} diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/reactive/model/Foo.java b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/reactive/model/Foo.java new file mode 100644 index 0000000..7fbe3bb --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/reactive/model/Foo.java @@ -0,0 +1,11 @@ +package com.example.webClientDemo.reactive.model; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@AllArgsConstructor +@Data +public class Foo { + private long id; + private String name; +} diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/reactive/service/EmployeeService.java b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/reactive/service/EmployeeService.java new file mode 100644 index 0000000..9f49676 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/reactive/service/EmployeeService.java @@ -0,0 +1,60 @@ +package com.example.webClientDemo.reactive.service; + +import org.springframework.web.reactive.function.client.WebClient; + +import com.example.webClientDemo.reactive.model.Employee; + +import reactor.core.publisher.Mono; + +public class EmployeeService { + + private final WebClient webClient; + public static String PATH_PARAM_BY_ID = "/employee/{id}"; + public static String ADD_EMPLOYEE = "/employee"; + + public EmployeeService(WebClient webClient) { + this.webClient = webClient; + } + + public EmployeeService(String baseUrl) { + this.webClient = WebClient.create(baseUrl); + } + + public Mono getEmployeeById(Integer employeeId) { + return webClient + .get() + .uri(PATH_PARAM_BY_ID, employeeId) + .retrieve() + .bodyToMono(Employee.class); + } + + @SuppressWarnings("deprecation") + public Mono addNewEmployee(Employee newEmployee) { + + return webClient + .post() + .uri(ADD_EMPLOYEE) + .syncBody(newEmployee) + .retrieve(). + bodyToMono(Employee.class); + } + + @SuppressWarnings("deprecation") + public Mono updateEmployee(Integer employeeId, Employee updateEmployee) { + + return webClient + .put() + .uri(PATH_PARAM_BY_ID,employeeId) + .syncBody(updateEmployee) + .retrieve() + .bodyToMono(Employee.class); + } + + public Mono deleteEmployeeById(Integer employeeId) { + return webClient + .delete() + .uri(PATH_PARAM_BY_ID,employeeId) + .retrieve() + .bodyToMono(String.class); + } +} diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/reactive/service/ReactiveUploadService.java b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/reactive/service/ReactiveUploadService.java new file mode 100644 index 0000000..7a35c3e --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/reactive/service/ReactiveUploadService.java @@ -0,0 +1,66 @@ +package com.example.webClientDemo.reactive.service; + +import com.example.webClientDemo.reactive.exception.ServiceException; +import org.springframework.core.io.Resource; +import org.springframework.http.HttpStatus; +import org.springframework.http.HttpStatusCode; +import org.springframework.http.MediaType; +import org.springframework.http.client.MultipartBodyBuilder; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.reactive.function.BodyInserters; +import org.springframework.web.reactive.function.client.WebClient; +import org.springframework.web.util.UriComponentsBuilder; +import reactor.core.publisher.Mono; + +import java.net.URI; + +@Service +public class ReactiveUploadService { + + private final WebClient webClient; + private static final String EXTERNAL_UPLOAD_URL = "http://localhost:8080/external/upload"; + + public ReactiveUploadService(final WebClient webClient) { + this.webClient = webClient; + } + + + public Mono uploadPdf(final Resource resource) { + + final URI url = UriComponentsBuilder.fromHttpUrl(EXTERNAL_UPLOAD_URL).build().toUri(); + Mono httpStatusMono = webClient.post() + .uri(url) + .contentType(MediaType.APPLICATION_PDF) + .body(BodyInserters.fromResource(resource)) + .exchangeToMono(response -> { + if (response.statusCode().equals(HttpStatus.OK)) { + return response.bodyToMono(HttpStatus.class).thenReturn(response.statusCode()); + } else { + throw new ServiceException("Error uploading file"); + } + }); + return httpStatusMono; + } + + + public Mono uploadMultipart(final MultipartFile multipartFile) { + final URI url = UriComponentsBuilder.fromHttpUrl(EXTERNAL_UPLOAD_URL).build().toUri(); + + final MultipartBodyBuilder builder = new MultipartBodyBuilder(); + builder.part("file", multipartFile.getResource()); + + Mono httpStatusMono = webClient.post() + .uri(url) + .contentType(MediaType.MULTIPART_FORM_DATA) + .body(BodyInserters.fromMultipartData(builder.build())) + .exchangeToMono(response -> { + if (response.statusCode().equals(HttpStatus.OK)) { + return response.bodyToMono(HttpStatus.class).thenReturn(response.statusCode()); + } else { + throw new ServiceException("Error uploading file"); + } + }); + return httpStatusMono; + } +} diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/reactive/webclient/simultaneous/Client.java b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/reactive/webclient/simultaneous/Client.java new file mode 100644 index 0000000..b31539e --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/reactive/webclient/simultaneous/Client.java @@ -0,0 +1,58 @@ +package com.example.webClientDemo.reactive.webclient.simultaneous; + +import java.util.List; + +import org.springframework.web.reactive.function.client.WebClient; + +import lombok.Data; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +@Data +public class Client { + + // private static final Logger LOG = Logger.getLogger(Client.class.getName()); + + private final WebClient webClient; + + public Client(String uri) { + this.webClient = WebClient.create(uri); + } + + public Mono getUser(int id) { + return webClient.get() + .uri("/user/{id}", id) + .retrieve() + .bodyToMono(User.class); + } + + public Mono getItem(int id) { + return webClient.get() + .uri("/item/{id}", id) + .retrieve() + .bodyToMono(Item.class); + } + + public Mono getOtherUser(int id) { + return webClient.get() + .uri("/otheruser/{id}", id) + .retrieve() + .bodyToMono(User.class); + } + + public Flux fetchUsers(List userIds) { + return Flux.fromIterable(userIds) + .flatMap(this::getUser); + } + + public Flux fetchUserAndOtherUser(int id) { + return Flux.merge(getUser(id), getOtherUser(id)); + } + + public Mono fetchUserAndItem(int userId, int itemId) { + Mono user = getUser(userId); + Mono item = getItem(itemId); + + return Mono.zip(user, item, UserWithItem::new); + } +} diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/reactive/webclient/simultaneous/Item.java b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/reactive/webclient/simultaneous/Item.java new file mode 100644 index 0000000..f6f66ee --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/reactive/webclient/simultaneous/Item.java @@ -0,0 +1,20 @@ +package com.example.webClientDemo.reactive.webclient.simultaneous; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; + +import lombok.Data; + +@Data +public class Item { + private int id; + + @JsonCreator + public Item(@JsonProperty("id") int id) { + this.id = id; + } + + public int id() { + return id; + } +} \ No newline at end of file diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/reactive/webclient/simultaneous/User.java b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/reactive/webclient/simultaneous/User.java new file mode 100644 index 0000000..ad511ff --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/reactive/webclient/simultaneous/User.java @@ -0,0 +1,20 @@ +package com.example.webClientDemo.reactive.webclient.simultaneous; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; + +import lombok.Data; + +@Data +public class User { + private int id; + + @JsonCreator + public User(@JsonProperty("id") int id) { + this.id = id; + } + + public int id() { + return id; + } +} diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/reactive/webclient/simultaneous/UserWithItem.java b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/reactive/webclient/simultaneous/UserWithItem.java new file mode 100644 index 0000000..ca8e7e5 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/reactive/webclient/simultaneous/UserWithItem.java @@ -0,0 +1,22 @@ +package com.example.webClientDemo.reactive.webclient.simultaneous; + +import lombok.Data; + +@Data +public class UserWithItem { + private User user; + private Item item; + + public UserWithItem(User user, Item item) { + this.user = user; + this.item = item; + } + + public User user() { + return user; + } + + public Item item() { + return item; + } +} diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/Product.java b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/Product.java new file mode 100644 index 0000000..6b477e3 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/Product.java @@ -0,0 +1,13 @@ +package com.example.webClientDemo.webclient; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Product { + private String title; + private String description; +} diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/ProductsFeignClient.java b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/ProductsFeignClient.java new file mode 100644 index 0000000..2d0b823 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/ProductsFeignClient.java @@ -0,0 +1,15 @@ +package com.example.webClientDemo.webclient; + +import java.net.URI; +import java.util.List; + +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +@FeignClient(value = "productsBlocking", url = "http://localhost:8080") +public interface ProductsFeignClient { + + @RequestMapping(method = RequestMethod.GET, value = "/slow-service-products", produces = "application/json") + List getProductsBlocking(URI baseUrl); +} diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/ProductsSlowServiceController.java b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/ProductsSlowServiceController.java new file mode 100644 index 0000000..304cc01 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/ProductsSlowServiceController.java @@ -0,0 +1,21 @@ +package com.example.webClientDemo.webclient; + +import java.util.Arrays; +import java.util.List; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class ProductsSlowServiceController { + + @GetMapping("/slow-service-products") + private List getAllProducts() throws InterruptedException { + Thread.sleep(2000L); // delay + return Arrays.asList( + new Product("Fancy Smartphone", "A stylish phone you need"), + new Product("Cool Watch", "The only device you need"), + new Product("Smart TV", "Cristal clean images") + ); + } +} diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/WebClientApplication.java b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/WebClientApplication.java new file mode 100644 index 0000000..ddc25c7 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/WebClientApplication.java @@ -0,0 +1,15 @@ +package com.example.webClientDemo.webclient; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.openfeign.EnableFeignClients; + +@SpringBootApplication +@EnableFeignClients +public class WebClientApplication { + + public static void main(String[] args) { + SpringApplication.run(WebClientApplication.class, args); + } +} + diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/WebController.java b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/WebController.java new file mode 100644 index 0000000..6d96ae3 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/WebController.java @@ -0,0 +1,59 @@ +package com.example.webClientDemo.webclient; + +import java.net.URI; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.reactive.function.client.WebClient; + +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import reactor.core.publisher.Flux; + +@Slf4j +@RestController +public class WebController { + + private static final int DEFAULT_PORT = 8080; + + public static final String SLOW_SERVICE_PRODUCTS_ENDPOINT_NAME = "/slow-service-products"; + + @Setter + private int serverPort = DEFAULT_PORT; + + @Autowired + private ProductsFeignClient productsFeignClient; + + @GetMapping("/products-blocking") + public List getProductsBlocking() { + log.info("Starting BLOCKING Controller!"); + final URI uri = URI.create(getSlowServiceBaseUri()); + + List result = productsFeignClient.getProductsBlocking(uri); + result.forEach(product -> log.info(product.toString())); + log.info("Exiting BLOCKING Controller!"); + return result; + } + + @GetMapping(value = "/products-non-blocking", produces = MediaType.TEXT_EVENT_STREAM_VALUE) + public Flux getProductsNonBlocking() { + log.info("Starting NON-BLOCKING Controller!"); + Flux productFlux = WebClient.create() + .get() + .uri(getSlowServiceBaseUri() + SLOW_SERVICE_PRODUCTS_ENDPOINT_NAME) + .retrieve() + .bodyToFlux(Product.class); + + productFlux.subscribe(product -> log.info(product.toString())); + log.info("Exiting NON-BLOCKING Controller!"); + return productFlux; + } + + private String getSlowServiceBaseUri() { + return "http://localhost:" + serverPort; + } + +} diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/json/ReaderConsumerService.java b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/json/ReaderConsumerService.java new file mode 100644 index 0000000..9ed47ef --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/json/ReaderConsumerService.java @@ -0,0 +1,18 @@ +package com.example.webClientDemo.webclient.json; + +import com.example.webClientDemo.webclient.json.model.Book; + +import java.util.List; + +public interface ReaderConsumerService { + + List processReaderDataFromObjectArray(); + + List processReaderDataFromReaderArray(); + + List processReaderDataFromReaderList(); + + List processNestedReaderDataFromReaderArray(); + + List processNestedReaderDataFromReaderList(); +} diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/json/ReaderConsumerServiceImpl.java b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/json/ReaderConsumerServiceImpl.java new file mode 100644 index 0000000..fe71d43 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/json/ReaderConsumerServiceImpl.java @@ -0,0 +1,90 @@ +package com.example.webClientDemo.webclient.json; + +import com.example.webClientDemo.webclient.json.model.Book; +import com.example.webClientDemo.webclient.json.model.Reader; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.MediaType; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class ReaderConsumerServiceImpl implements ReaderConsumerService { + + private final WebClient webClient; + private static final ObjectMapper mapper = new ObjectMapper(); + + public ReaderConsumerServiceImpl(WebClient webClient) { + this.webClient = webClient; + } + @Override + public List processReaderDataFromObjectArray() { + Mono response = webClient.get() + .accept(MediaType.APPLICATION_JSON) + .retrieve() + .bodyToMono(Object[].class).log(); + Object[] objects = response.block(); + return Arrays.stream(objects) + .map(object -> mapper.convertValue(object, Reader.class)) + .map(Reader::getFavouriteBook) + .collect(Collectors.toList()); + } + + @Override + public List processReaderDataFromReaderArray() { + Mono response = + webClient.get() + .accept(MediaType.APPLICATION_JSON) + .retrieve() + .bodyToMono(Reader[].class).log(); + + Reader[] readers = response.block(); + return Arrays.stream(readers) + .map(Reader::getFavouriteBook) + .collect(Collectors.toList()); + } + + @Override + public List processReaderDataFromReaderList() { + Mono> response = webClient.get() + .accept(MediaType.APPLICATION_JSON) + .retrieve() + .bodyToMono(new ParameterizedTypeReference>() {}); + List readers = response.block(); + + return readers.stream() + .map(Reader::getFavouriteBook) + .collect(Collectors.toList()); + } + + @Override + public List processNestedReaderDataFromReaderArray() { + Mono response = webClient.get() + .accept(MediaType.APPLICATION_JSON) + .retrieve() + .bodyToMono(Reader[].class).log(); + Reader[] readers = response.block(); + + return Arrays.stream(readers) + .flatMap(reader -> reader.getBooksRead().stream()) + .map(Book::getAuthor) + .collect(Collectors.toList()); + } + + @Override + public List processNestedReaderDataFromReaderList() { + Mono> response = webClient.get() + .accept(MediaType.APPLICATION_JSON) + .retrieve() + .bodyToMono(new ParameterizedTypeReference>() {}); + + List readers = response.block(); + return readers.stream() + .flatMap(reader -> reader.getBooksRead().stream()) + .map(Book::getAuthor) + .collect(Collectors.toList()); + } +} diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/json/model/Book.java b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/json/model/Book.java new file mode 100644 index 0000000..c07b25c --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/json/model/Book.java @@ -0,0 +1,22 @@ +package com.example.webClientDemo.webclient.json.model; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; + +import lombok.Data; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@Data +public class Book { + private final String author; + private final String title; + + @JsonCreator + public Book( + @JsonProperty("author") String author, + @JsonProperty("title") String title) { + this.author = author; + this.title = title; + } +} diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/json/model/Reader.java b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/json/model/Reader.java new file mode 100644 index 0000000..003f873 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/json/model/Reader.java @@ -0,0 +1,30 @@ +package com.example.webClientDemo.webclient.json.model; + +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; + +import lombok.Data; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@Data +public class Reader { + private final int id; + private final String name; + private final Book favouriteBook; + private final List booksRead; + + @JsonCreator + public Reader( + @JsonProperty("id") int id, + @JsonProperty("name") String name, + @JsonProperty("favouriteBook") Book favouriteBook, + @JsonProperty("booksRead") List booksRead) { + this.id = id; + this.name = name; + this.favouriteBook = favouriteBook; + this.booksRead =booksRead; + } +} diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/status/WebClientStatusCodeHandler.java b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/status/WebClientStatusCodeHandler.java new file mode 100644 index 0000000..c368bd7 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/status/WebClientStatusCodeHandler.java @@ -0,0 +1,58 @@ +package com.example.webClientDemo.webclient.status; + +import org.springframework.http.HttpStatus; +import org.springframework.http.HttpStatusCode; +import org.springframework.web.reactive.function.client.ClientResponse; +import org.springframework.web.reactive.function.client.ExchangeFilterFunction; +import org.springframework.web.reactive.function.client.WebClient; + +import com.example.webClientDemo.webclient.status.exception.CustomBadRequestException; +import com.example.webClientDemo.webclient.status.exception.CustomServerErrorException; + +import reactor.core.publisher.Mono; + +public class WebClientStatusCodeHandler { + + public static Mono getResponseBodyUsingExchangeFilterFunction(String uri) { + ExchangeFilterFunction errorResponseFilter = ExchangeFilterFunction + .ofResponseProcessor(WebClientStatusCodeHandler::exchangeFilterResponseProcessor); + return WebClient + .builder() + .filter(errorResponseFilter) + .build() + .post() + .uri(uri) + .retrieve() + .bodyToMono(String.class); + } + + @SuppressWarnings("unlikely-arg-type") + public static Mono getResponseBodyUsingOnStatus(String uri) { + return WebClient + .builder() + .build() + .post() + .uri(uri) + .retrieve() + .onStatus( + HttpStatus.INTERNAL_SERVER_ERROR::equals, + response -> response.bodyToMono(String.class).map(CustomServerErrorException::new)) + .onStatus( + HttpStatus.BAD_REQUEST::equals, + response -> response.bodyToMono(String.class).map(CustomBadRequestException::new)) + .bodyToMono(String.class); + } + + private static Mono exchangeFilterResponseProcessor(ClientResponse response) { + HttpStatusCode status = response.statusCode(); + if (HttpStatus.INTERNAL_SERVER_ERROR.equals(status)) { + return response.bodyToMono(String.class) + .flatMap(body -> Mono.error(new CustomServerErrorException(body))); + } + if (HttpStatus.BAD_REQUEST.equals(status)) { + return response.bodyToMono(String.class) + .flatMap(body -> Mono.error(new CustomBadRequestException(body))); + } + return Mono.just(response); + } +} diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/status/exception/CustomBadRequestException.java b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/status/exception/CustomBadRequestException.java new file mode 100644 index 0000000..0087f86 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/status/exception/CustomBadRequestException.java @@ -0,0 +1,7 @@ +package com.example.webClientDemo.webclient.status.exception; + +public class CustomBadRequestException extends Exception { + public CustomBadRequestException(String message) { + super(message); + } +} \ No newline at end of file diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/status/exception/CustomServerErrorException.java b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/status/exception/CustomServerErrorException.java new file mode 100644 index 0000000..bb0b4d2 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/status/exception/CustomServerErrorException.java @@ -0,0 +1,7 @@ +package com.example.webClientDemo.webclient.status.exception; + +public class CustomServerErrorException extends Exception { + public CustomServerErrorException(String message) { + super(message); + } +} diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/timeout/WebClientTimeoutProvider.java b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/timeout/WebClientTimeoutProvider.java new file mode 100644 index 0000000..3592018 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/java/com/example/webClientDemo/webclient/timeout/WebClientTimeoutProvider.java @@ -0,0 +1,92 @@ +package com.example.webClientDemo.webclient.timeout; + +import java.time.Duration; +import java.util.concurrent.TimeUnit; + +import org.springframework.http.client.reactive.ReactorClientHttpConnector; +import org.springframework.web.reactive.function.client.WebClient; + +import io.netty.channel.ChannelOption; +import io.netty.channel.epoll.EpollChannelOption; +import io.netty.handler.ssl.SslContextBuilder; +import io.netty.handler.timeout.ReadTimeoutHandler; +import io.netty.handler.timeout.WriteTimeoutHandler; +import lombok.experimental.UtilityClass; +import reactor.netty.http.client.HttpClient; +import reactor.netty.tcp.SslProvider; +import reactor.netty.transport.ProxyProvider; + +@UtilityClass +public class WebClientTimeoutProvider { + + public static WebClient defaultWebClient() { + HttpClient httpClient = HttpClient.create(); + + return buildWebClient(httpClient); + } + + public WebClient responseTimeoutClient() { + HttpClient httpClient = HttpClient.create() + .responseTimeout(Duration.ofSeconds(1)); + + return buildWebClient(httpClient); + } + + public WebClient connectionTimeoutClient() { + HttpClient httpClient = HttpClient.create() + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 1000); + + return buildWebClient(httpClient); + } + + public WebClient connectionTimeoutWithKeepAliveClient() { + HttpClient httpClient = HttpClient.create() + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10000) + .option(ChannelOption.SO_KEEPALIVE, true) + .option(EpollChannelOption.TCP_KEEPIDLE, 300) + .option(EpollChannelOption.TCP_KEEPINTVL, 60) + .option(EpollChannelOption.TCP_KEEPCNT, 8); + + return buildWebClient(httpClient); + } + + public WebClient readWriteTimeoutClient() { + @SuppressWarnings("deprecation") + HttpClient httpClient = HttpClient.create() + .doOnConnected(conn -> conn + .addHandler(new ReadTimeoutHandler(5, TimeUnit.SECONDS)) + .addHandler(new WriteTimeoutHandler(5))); + + return buildWebClient(httpClient); + } + + public WebClient sslTimeoutClient() { + @SuppressWarnings("deprecation") + HttpClient httpClient = HttpClient.create() + .secure(spec -> spec + .sslContext(SslContextBuilder.forClient()) + .defaultConfiguration(SslProvider.DefaultConfigurationType.TCP) + .handshakeTimeout(Duration.ofSeconds(30)) + .closeNotifyFlushTimeout(Duration.ofSeconds(10)) + .closeNotifyReadTimeout(Duration.ofSeconds(10))); + + return buildWebClient(httpClient); + } + + public WebClient proxyTimeoutClient() { + HttpClient httpClient = HttpClient.create() + .proxy(spec -> spec + .type(ProxyProvider.Proxy.HTTP) + .host("http://proxy") + .port(8080) + .connectTimeoutMillis(3000)); + + return buildWebClient(httpClient); + } + + private WebClient buildWebClient(HttpClient httpClient) { + return WebClient.builder() + .clientConnector(new ReactorClientHttpConnector(httpClient)) + .build(); + } +} diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/resources/application.properties b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/resources/application.properties new file mode 100644 index 0000000..39eeab8 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/resources/application.properties @@ -0,0 +1,3 @@ +logging.level.root=INFO +server.port=8081 +logging.level.reactor.netty.http.client.HttpClient=DEBUG diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/resources/logback.xml b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/resources/logback.xml new file mode 100644 index 0000000..2721b93 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/resources/logback.xml @@ -0,0 +1,20 @@ + + + + + # Pattern of log message for console appender + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/webapp/WEB-INF/web.xml b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..5c53472 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,21 @@ + + + + Spring Functional Application + + + functional + com.example.webClientDemo.functional.RootServlet + 1 + true + + + functional + / + + + + \ No newline at end of file diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/SpringContextTest.java b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/SpringContextTest.java new file mode 100644 index 0000000..f20669b --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/SpringContextTest.java @@ -0,0 +1,17 @@ +package com.example.webClientDemo; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import com.example.webClientDemo.reactive.SpringReactiveTestApplication; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = SpringReactiveTestApplication.class) +public class SpringContextTest { + + @Test + public void whenSpringContextIsBootstrapped_thenNoExceptions() { + } +} diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/reactive/ReactiveIntegrationTest.java b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/reactive/ReactiveIntegrationTest.java new file mode 100644 index 0000000..0b3a68e --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/reactive/ReactiveIntegrationTest.java @@ -0,0 +1,73 @@ +package com.example.webClientDemo.reactive; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.web.reactive.function.client.ClientResponse; +import org.springframework.web.reactive.function.client.WebClient; + +import com.example.webClientDemo.reactive.model.Foo; +import com.github.tomakehurst.wiremock.WireMockServer; +import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; +import static com.github.tomakehurst.wiremock.client.WireMock.configureFor; +import static com.github.tomakehurst.wiremock.client.WireMock.get; +import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; +import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; +import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig; + +import reactor.core.publisher.Mono; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class ReactiveIntegrationTest { + + private WebClient client; + private final int singleRequestTime = 1000; + private WireMockServer wireMockServer; + + @Before + public void setup() { + wireMockServer = new WireMockServer(wireMockConfig().dynamicPort()); + wireMockServer.start(); + configureFor("localhost", wireMockServer.port()); + client = WebClient.create("http://localhost:" + wireMockServer.port()); + } + + @After + public void tearDown() { + wireMockServer.stop(); + } + + @Test + public void whenMonoReactiveEndpointIsConsumed_thenCorrectOutput() { + stubFor(get(urlEqualTo("/foo/123")).willReturn(aResponse().withFixedDelay(singleRequestTime) + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody("{\"id\":123, \"name\":\"foo\"}"))); + + final Mono fooMono = client.get().uri("/foo/123").retrieve() + .bodyToMono(ClientResponse.class) + .log(); + + System.out.println(fooMono.subscribe()); + } + + @Test + public void whenFluxReactiveEndpointIsConsumed_thenCorrectOutput() throws InterruptedException { + stubFor(get(urlEqualTo("/foo")).willReturn(aResponse().withFixedDelay(singleRequestTime) + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody("{\"id\":1, \"name\":\"foo\"}"))); + + client.get().uri("/foo") + .retrieve() + .bodyToFlux(Foo.class).log() + .subscribe(System.out::println); + + System.out.println(); + } + +} diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/reactive/SpringReactiveTestApplication.java b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/reactive/SpringReactiveTestApplication.java new file mode 100644 index 0000000..2396c64 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/reactive/SpringReactiveTestApplication.java @@ -0,0 +1,34 @@ +package com.example.webClientDemo.reactive; + +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.web.reactive.function.client.WebClient; + +import com.example.webClientDemo.reactive.model.Foo; + +@SpringBootApplication +public class SpringReactiveTestApplication { + + @Bean + public WebClient client() { + return WebClient.create("http://localhost:8080"); + } + + @Bean + CommandLineRunner cmd(WebClient client) { + return args -> { + client.get().uri("/foos2") + .retrieve() + .bodyToFlux(Foo.class).log() + .subscribe(System.out::println); + }; + } + + // + public static void main(String[] args) { + SpringApplication.run(SpringReactiveTestApplication.class, args); + } + +} diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/reactive/logging/WebClientLoggingIntegrationTest.java b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/reactive/logging/WebClientLoggingIntegrationTest.java new file mode 100644 index 0000000..b48d4a0 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/reactive/logging/WebClientLoggingIntegrationTest.java @@ -0,0 +1,129 @@ +package com.example.webClientDemo.reactive.logging; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.Mockito.atLeast; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import org.slf4j.LoggerFactory; +import org.springframework.http.client.reactive.ReactorClientHttpConnector; +import org.springframework.web.reactive.function.BodyInserters; +import org.springframework.web.reactive.function.client.WebClient; + +import com.example.webClientDemo.reactive.logging.filters.LogFilters; +import com.fasterxml.jackson.databind.ObjectMapper; + +import ch.qos.logback.classic.spi.LoggingEvent; +import ch.qos.logback.core.Appender; +import io.netty.handler.logging.LogLevel; +import lombok.AllArgsConstructor; +import lombok.Data; +import reactor.netty.http.client.HttpClient; +import reactor.netty.transport.logging.AdvancedByteBufFormat; + + +public class WebClientLoggingIntegrationTest { + + @AllArgsConstructor + @Data + class Post { + private String title; + private String body; + private int userId; + } + + @SuppressWarnings("rawtypes") + private Appender jettyAppender; + @SuppressWarnings("rawtypes") + private Appender nettyAppender; + @SuppressWarnings("rawtypes") + private Appender mockAppender; + private final String sampleUrl = "https://jsonplaceholder.typicode.com/posts"; + + private Post post; + private String sampleResponseBody; + + @SuppressWarnings("unchecked") + @BeforeEach + void setup() throws Exception { + + post = new Post("Learn WebClient logging with Baeldung!", "", 1); + sampleResponseBody = new ObjectMapper().writeValueAsString(post); + + ch.qos.logback.classic.Logger jetty = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger("com.example.webClientDemo.reactive.logging.jetty"); + jettyAppender = mock(Appender.class); + when(jettyAppender.getName()).thenReturn("com.example.webClientDemo.reactive.logging.jetty"); + jetty.addAppender(jettyAppender); + + ch.qos.logback.classic.Logger netty = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger("reactor.netty.http.client"); + nettyAppender = mock(Appender.class); + when(nettyAppender.getName()).thenReturn("reactor.netty.http.client"); + netty.addAppender(nettyAppender); + + ch.qos.logback.classic.Logger test = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger("com.example.webClientDemo.reactive"); + mockAppender = mock(Appender.class); + when(mockAppender.getName()).thenReturn("com.example.webClientDemo.reactive"); + test.addAppender(mockAppender); + + } + + @SuppressWarnings("unchecked") + @Test + public void givenNettyHttpClientWithWiretap_whenEndpointIsConsumed_thenRequestAndResponseBodyLogged() { + + reactor.netty.http.client.HttpClient httpClient = HttpClient + .create() + .wiretap(true); + + WebClient + .builder() + .clientConnector(new ReactorClientHttpConnector(httpClient)) + .build() + .post() + .uri(sampleUrl) + .body(BodyInserters.fromValue(post)) + .retrieve() + .bodyToMono(String.class) + .block(); + + verify(nettyAppender).doAppend(argThat(argument -> (((LoggingEvent) argument).getFormattedMessage()).contains("00000300"))); + } + + @SuppressWarnings("unchecked") + @Test + public void givenNettyHttpClientWithCustomLogger_whenEndpointIsConsumed_thenRequestAndResponseBodyLogged() { + reactor.netty.http.client.HttpClient httpClient = HttpClient.create() + .wiretap("reactor.netty.http.client.HttpClient", LogLevel.DEBUG, AdvancedByteBufFormat.TEXTUAL); + + WebClient.builder() + .clientConnector(new ReactorClientHttpConnector(httpClient)) + .build() + .post() + .uri(sampleUrl) + .body(BodyInserters.fromValue(post)) + .retrieve() + .bodyToMono(String.class) + .block(); + + verify(nettyAppender).doAppend(argThat(argument -> (((LoggingEvent) argument).getFormattedMessage()).contains(sampleResponseBody))); + } + + @SuppressWarnings("unchecked") + @Test + public void givenDefaultHttpClientWithFilter_whenEndpointIsConsumed_thenRequestAndResponseLogged() { + WebClient + .builder() + .filters(exchangeFilterFunctions -> exchangeFilterFunctions.addAll(LogFilters.prepareFilters())) + .build() + .post() + .uri(sampleUrl) + .body(BodyInserters.fromValue(post)) + .retrieve() + .bodyToMono(String.class) + .block(); + + verify(mockAppender, atLeast(1)).doAppend(argThat(argument -> (((LoggingEvent) argument).getFormattedMessage()).contains(sampleUrl))); + } +} \ No newline at end of file diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/reactive/logging/filters/LogFilters.java b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/reactive/logging/filters/LogFilters.java new file mode 100644 index 0000000..74a6c95 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/reactive/logging/filters/LogFilters.java @@ -0,0 +1,54 @@ +package com.example.webClientDemo.reactive.logging.filters; + +import java.util.Arrays; +import java.util.List; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.reactive.function.client.ExchangeFilterFunction; +import reactor.core.publisher.Mono; + +@Slf4j +public class LogFilters { + public static List prepareFilters() { + return Arrays.asList(logRequest(), logResponse()); + } + + private static ExchangeFilterFunction logRequest() { + return ExchangeFilterFunction.ofRequestProcessor(clientRequest -> { + if (log.isDebugEnabled()) { + StringBuilder sb = new StringBuilder("Request: \n") + .append(clientRequest.method()) + .append(" ") + .append(clientRequest.url()); + clientRequest + .headers() + .forEach((name, values) -> values.forEach(value -> sb + .append("\n") + .append(name) + .append(":") + .append(value))); + log.debug(sb.toString()); + } + return Mono.just(clientRequest); + }); + } + + private static ExchangeFilterFunction logResponse() { + return ExchangeFilterFunction.ofResponseProcessor(clientResponse -> { + if (log.isDebugEnabled()) { + StringBuilder sb = new StringBuilder("Response: \n") + .append("Status: ") + .append(clientResponse.statusCode()); + clientResponse + .headers() + .asHttpHeaders() + .forEach((key, value1) -> value1.forEach(value -> sb + .append("\n") + .append(key) + .append(":") + .append(value))); + log.debug(sb.toString()); + } + return Mono.just(clientResponse); + }); + } +} diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/reactive/logging/jetty/RequestLogEnhancer.java b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/reactive/logging/jetty/RequestLogEnhancer.java new file mode 100644 index 0000000..1cba936 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/reactive/logging/jetty/RequestLogEnhancer.java @@ -0,0 +1,95 @@ +package com.example.webClientDemo.reactive.logging.jetty; + +import java.nio.ByteBuffer; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.util.Locale; + +import org.eclipse.jetty.client.Request; +import org.eclipse.jetty.http.HttpField; +import org.eclipse.jetty.http.HttpFields; +import org.eclipse.jetty.http.HttpHeader; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class RequestLogEnhancer { + + public static Request enhance(Request request) { + StringBuilder group = new StringBuilder(); + request.onRequestBegin(theRequest -> group + .append("Request ") + .append(theRequest.getMethod()) + .append(" ") + .append(theRequest.getURI()) + .append("\n")); + request.onRequestHeaders(theRequest -> { + for (HttpField header : theRequest.getHeaders()) + group + .append(header) + .append("\n"); + }); + request.onRequestContent((theRequest, content) -> { + group.append(toString(content, getCharset(theRequest.getHeaders()))); + }); + request.onRequestSuccess(theRequest -> { + log.debug(group.toString()); + group.delete(0, group.length()); + }); + group.append("\n"); + request.onResponseBegin(theResponse -> { + group + .append("Response \n") + .append(theResponse.getVersion()) + .append(" ") + .append(theResponse.getStatus()); + if (theResponse.getReason() != null) { + group + .append(" ") + .append(theResponse.getReason()); + } + group.append("\n"); + }); + request.onResponseHeaders(theResponse -> { + for (HttpField header : theResponse.getHeaders()) + group + .append(header) + .append("\n"); + }); + request.onResponseContent((theResponse, content) -> { + group.append(toString(content, getCharset(theResponse.getHeaders()))); + }); + request.onResponseSuccess(theResponse -> { + log.debug(group.toString()); + }); + return request; + } + + private static String toString(ByteBuffer buffer, Charset charset) { + byte[] bytes; + if (buffer.hasArray()) { + bytes = new byte[buffer.capacity()]; + System.arraycopy(buffer.array(), 0, bytes, 0, buffer.capacity()); + } else { + bytes = new byte[buffer.remaining()]; + buffer.get(bytes, 0, bytes.length); + } + return new String(bytes, charset); + } + + private static Charset getCharset(HttpFields headers) { + String contentType = headers.get(HttpHeader.CONTENT_TYPE); + if (contentType != null) { + String[] tokens = contentType + .toLowerCase(Locale.US) + .split("charset="); + if (tokens.length == 2) { + String encoding = tokens[1].replaceAll("[;\"]", ""); + return Charset.forName(encoding); + } + } + return StandardCharsets.UTF_8; + } + +} + diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/reactive/service/EmployeeServiceIntgerationTest.java b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/reactive/service/EmployeeServiceIntgerationTest.java new file mode 100644 index 0000000..addc247 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/reactive/service/EmployeeServiceIntgerationTest.java @@ -0,0 +1,123 @@ +package com.example.webClientDemo.reactive.service; + +import java.io.IOException; +import java.util.Objects; + +import org.junit.jupiter.api.AfterAll; +import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import com.example.webClientDemo.reactive.enums.Role; +import com.example.webClientDemo.reactive.model.Employee; +import com.fasterxml.jackson.databind.ObjectMapper; + +import okhttp3.mockwebserver.MockResponse; +import okhttp3.mockwebserver.MockWebServer; +import okhttp3.mockwebserver.RecordedRequest; +import reactor.core.publisher.Mono; +import reactor.test.StepVerifier; + +class EmployeeServiceIntegrationTest { + + public static MockWebServer mockBackEnd; + private EmployeeService employeeService; + private final ObjectMapper MAPPER = new ObjectMapper(); + + @BeforeAll + static void setUp() throws IOException { + mockBackEnd = new MockWebServer(); + mockBackEnd.start(); + } + + @AfterAll + static void tearDown() throws IOException { + mockBackEnd.shutdown(); + } + + @BeforeEach + void initialize() { + String baseUrl = String.format("http://localhost:%s", mockBackEnd.getPort()); + employeeService = new EmployeeService(baseUrl); + } + + @Test + void getEmployeeById() throws Exception { + + Employee mockEmployee = new Employee(100, "Adam", "Sandler", 32, Role.LEAD_ENGINEER); + mockBackEnd.enqueue(new MockResponse().setBody(MAPPER.writeValueAsString(mockEmployee)) + .addHeader("Content-Type", "application/json")); + + Mono employeeMono = employeeService.getEmployeeById(100); + + StepVerifier.create(employeeMono) + .expectNextMatches(employee -> employee.getRole().equals(Role.LEAD_ENGINEER)) + .verifyComplete(); + + RecordedRequest recordedRequest = mockBackEnd.takeRequest(); + assertEquals("GET", recordedRequest.getMethod()); + assertEquals("/employee/100", recordedRequest.getPath()); + } + + @Test + void addNewEmployee() throws Exception { + + Employee newEmployee = new Employee(null, "Adam", "Sandler", 32, Role.LEAD_ENGINEER); + Employee webClientResponse = new Employee(100, "Adam", "Sandler", 32, Role.LEAD_ENGINEER); + mockBackEnd.enqueue(new MockResponse().setBody(MAPPER.writeValueAsString(webClientResponse)) + .addHeader("Content-Type", "application/json")); + + Mono employeeMono = employeeService.addNewEmployee(newEmployee); + + StepVerifier.create(employeeMono) + .expectNextMatches(employee -> employee.getEmployeeId().equals(100)) + .verifyComplete(); + + RecordedRequest recordedRequest = mockBackEnd.takeRequest(); + assertEquals("POST", recordedRequest.getMethod()); + assertEquals("/employee", recordedRequest.getPath()); + } + + @Test + void updateEmployee() throws Exception { + + Integer newAge = 33; + String newLastName = "Sandler New"; + Employee updateEmployee = new Employee(100, "Adam", newLastName, newAge, Role.LEAD_ENGINEER); + mockBackEnd.enqueue(new MockResponse().setBody(MAPPER.writeValueAsString(updateEmployee)) + .addHeader("Content-Type", "application/json")); + + Mono updatedEmploye = employeeService.updateEmployee(100, updateEmployee); + + StepVerifier.create(updatedEmploye) + .expectNextMatches(employee -> employee.getLastName().equals(newLastName) && Objects.equals(employee.getAge(), newAge)) + .verifyComplete(); + + RecordedRequest recordedRequest = mockBackEnd.takeRequest(); + assertEquals("PUT", recordedRequest.getMethod()); + assertEquals("/employee/100", recordedRequest.getPath()); + + } + + + @Test + void deleteEmployee() throws Exception { + + String responseMessage = "Employee Deleted SuccessFully"; + Integer employeeId = 100; + mockBackEnd.enqueue(new MockResponse().setBody(MAPPER.writeValueAsString(responseMessage)) + .addHeader("Content-Type", "application/json")); + + Mono deletedEmployee = employeeService.deleteEmployeeById(employeeId); + + StepVerifier.create(deletedEmployee) + .expectNext("\"Employee Deleted SuccessFully\"") + .verifyComplete(); + + RecordedRequest recordedRequest = mockBackEnd.takeRequest(); + assertEquals("DELETE", recordedRequest.getMethod()); + assertEquals("/employee/100", recordedRequest.getPath()); + } + +} diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/reactive/service/EmployeeServiceUnitTest.java b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/reactive/service/EmployeeServiceUnitTest.java new file mode 100644 index 0000000..5dfbe41 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/reactive/service/EmployeeServiceUnitTest.java @@ -0,0 +1,117 @@ +package com.example.webClientDemo.reactive.service; + +import java.util.Objects; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import static org.mockito.Mockito.when; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.web.reactive.function.client.WebClient; + +import com.example.webClientDemo.reactive.enums.Role; +import com.example.webClientDemo.reactive.model.Employee; + +import reactor.core.publisher.Mono; +import reactor.test.StepVerifier; + +@ExtendWith(MockitoExtension.class) +class EmployeeServiceUnitTest { + + EmployeeService employeeService; + @Mock + private WebClient webClientMock; + @SuppressWarnings("rawtypes") + @Mock + private WebClient.RequestHeadersSpec requestHeadersMock; + @SuppressWarnings("rawtypes") + @Mock + private WebClient.RequestHeadersUriSpec requestHeadersUriMock; + @Mock + private WebClient.RequestBodySpec requestBodyMock; + @Mock + private WebClient.RequestBodyUriSpec requestBodyUriMock; + @Mock + private WebClient.ResponseSpec responseMock; + + @BeforeEach + void setUp() { + employeeService = new EmployeeService(webClientMock); + } + + @SuppressWarnings("unchecked") + @Test + void givenEmployeeId_whenGetEmployeeById_thenReturnEmployee() { + + Integer employeeId = 100; + Employee mockEmployee = new Employee(100, "Adam", "Sandler", 32, Role.LEAD_ENGINEER); + when(webClientMock.get()).thenReturn(requestHeadersUriMock); + when(requestHeadersUriMock.uri("/employee/{id}", employeeId)).thenReturn(requestHeadersMock); + when(requestHeadersMock.retrieve()).thenReturn(responseMock); + when(responseMock.bodyToMono(Employee.class)).thenReturn(Mono.just(mockEmployee)); + + Mono employeeMono = employeeService.getEmployeeById(employeeId); + + StepVerifier.create(employeeMono) + .expectNextMatches(employee -> employee.getRole().equals(Role.LEAD_ENGINEER)) + .verifyComplete(); + } + + @SuppressWarnings({ "deprecation", "unchecked" }) + @Test + void givenEmployee_whenAddEmployee_thenAddNewEmployee() { + + Employee newEmployee = new Employee(null, "Adam", "Sandler", 32, Role.LEAD_ENGINEER); + Employee webClientResponse = new Employee(100, "Adam", "Sandler", 32, Role.LEAD_ENGINEER); + when(webClientMock.post()).thenReturn(requestBodyUriMock); + when(requestBodyUriMock.uri(EmployeeService.ADD_EMPLOYEE)).thenReturn(requestBodyMock); + when(requestBodyMock.syncBody(newEmployee)).thenReturn(requestHeadersMock); + when(requestHeadersMock.retrieve()).thenReturn(responseMock); + when(responseMock.bodyToMono(Employee.class)).thenReturn(Mono.just(webClientResponse)); + + Mono employeeMono = employeeService.addNewEmployee(newEmployee); + + StepVerifier.create(employeeMono) + .expectNextMatches(employee -> employee.getEmployeeId().equals(100)) + .verifyComplete(); + } + + @SuppressWarnings({ "deprecation", "unchecked" }) + @Test + void givenEmployee_whenupdateEmployee_thenUpdatedEmployee() { + + Integer newAge = 33; + String newLastName = "Sandler New"; + Employee updateEmployee = new Employee(100, "Adam", newLastName, newAge, Role.LEAD_ENGINEER); + when(webClientMock.put()).thenReturn(requestBodyUriMock); + when(requestBodyUriMock.uri(EmployeeService.PATH_PARAM_BY_ID, 100)).thenReturn(requestBodyMock); + when(requestBodyMock.syncBody(updateEmployee)).thenReturn(requestHeadersMock); + when(requestHeadersMock.retrieve()).thenReturn(responseMock); + when(responseMock.bodyToMono(Employee.class)).thenReturn(Mono.just(updateEmployee)); + + Mono updatedEmployee = employeeService.updateEmployee(100, updateEmployee); + + StepVerifier.create(updatedEmployee) + .expectNextMatches(employee -> employee.getLastName().equals(newLastName) && Objects.equals(employee.getAge(), newAge)) + .verifyComplete(); + + } + + @SuppressWarnings("unchecked") + @Test + void givenEmployee_whenDeleteEmployeeById_thenDeleteSuccessful() { + + String responseMessage = "Employee Deleted SuccessFully"; + when(webClientMock.delete()).thenReturn(requestHeadersUriMock); + when(requestHeadersUriMock.uri(EmployeeService.PATH_PARAM_BY_ID, 100)).thenReturn(requestHeadersMock); + when(requestHeadersMock.retrieve()).thenReturn(responseMock); + when(responseMock.bodyToMono(String.class)).thenReturn(Mono.just(responseMessage)); + + Mono deletedEmployee = employeeService.deleteEmployeeById(100); + + StepVerifier.create(deletedEmployee) + .expectNext(responseMessage) + .verifyComplete(); + } +} diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/reactive/service/ReactiveUploadServiceUnitTest.java b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/reactive/service/ReactiveUploadServiceUnitTest.java new file mode 100644 index 0000000..547dee8 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/reactive/service/ReactiveUploadServiceUnitTest.java @@ -0,0 +1,49 @@ +package com.example.webClientDemo.reactive.service; + +import static org.assertj.core.api.Assertions.assertThat; +import org.junit.jupiter.api.Test; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +import org.springframework.core.io.Resource; +import org.springframework.http.HttpStatus; +import org.springframework.http.HttpStatusCode; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.reactive.function.client.ClientResponse; +import org.springframework.web.reactive.function.client.WebClient; + +import reactor.core.publisher.Mono; + +class ReactiveUploadServiceUnitTest { + + private static final String BASE_URL = "http://localhost:8080/external/upload"; + + final WebClient webClientMock = WebClient.builder().baseUrl(BASE_URL) + .exchangeFunction(clientRequest -> Mono.just(ClientResponse.create(HttpStatus.OK) + .header("content-type", "application/json") + .build())) + .build(); + + private final ReactiveUploadService tested = new ReactiveUploadService(webClientMock); + + @Test + void givenAPdf_whenUploadingWithWebClient_thenOK() { + final Resource file = mock(Resource.class); + + final Mono result = tested.uploadPdf(file); + final HttpStatusCode status = result.block(); + + assertThat(status).isEqualTo(HttpStatus.OK); + } + + @Test + void givenAMultipartPdf_whenUploadingWithWebClient_thenOK() { + final Resource file = mock(Resource.class); + final MultipartFile multipartFile = mock(MultipartFile.class); + when(multipartFile.getResource()).thenReturn(file); + + final Mono result = tested.uploadMultipart(multipartFile); + final HttpStatusCode status = result.block(); + + assertThat(status).isEqualTo(HttpStatus.OK); + } +} diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/reactive/webclient/simultaneous/ClientIntegrationTest.java b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/reactive/webclient/simultaneous/ClientIntegrationTest.java new file mode 100644 index 0000000..4afbd67 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/reactive/webclient/simultaneous/ClientIntegrationTest.java @@ -0,0 +1,77 @@ +package com.example.webClientDemo.reactive.webclient.simultaneous; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import org.junit.After; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.junit4.SpringRunner; + +import com.github.tomakehurst.wiremock.WireMockServer; +import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; +import static com.github.tomakehurst.wiremock.client.WireMock.configureFor; +import static com.github.tomakehurst.wiremock.client.WireMock.get; +import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; +import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; +import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig; + +@RunWith(SpringRunner.class) +@SpringBootTest +@DirtiesContext +public class ClientIntegrationTest { + + private WireMockServer wireMockServer; + + private Client client; + + @Before + public void setup() { + wireMockServer = new WireMockServer(wireMockConfig().dynamicPort()); + wireMockServer.start(); + configureFor("localhost", wireMockServer.port()); + client = new Client("http://localhost:" + wireMockServer.port()); + } + + @After + public void tearDown() { + wireMockServer.stop(); + } + + @Test + public void givenClient_whenFetchingUsers_thenExecutionTimeIsLessThanDouble() { + // Arrange + int requestsNumber = 5; + int singleRequestTime = 1000; + + for (int i = 1; i <= requestsNumber; i++) { + stubFor(get(urlEqualTo("/user/" + i)).willReturn(aResponse().withFixedDelay(singleRequestTime) + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(String.format("{ \"id\": %d }", i)))); + } + + List userIds = IntStream.rangeClosed(1, requestsNumber) + .boxed() + .collect(Collectors.toList()); + + // Act + long start = System.currentTimeMillis(); + List users = client.fetchUsers(userIds) + .collectList() + .block(); + long end = System.currentTimeMillis(); + + // Assert + long totalExecutionTime = end - start; + + assertEquals("Unexpected number of users", requestsNumber, users.size()); + assertTrue("Execution time is too big", 2 * singleRequestTime > totalExecutionTime); + } +} diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/webclient/WebClientStatusCodeHandlerIntegrationTest.java b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/webclient/WebClientStatusCodeHandlerIntegrationTest.java new file mode 100644 index 0000000..20390d3 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/webclient/WebClientStatusCodeHandlerIntegrationTest.java @@ -0,0 +1,98 @@ +package com.example.webClientDemo.webclient; + +import com.example.webClientDemo.webclient.status.WebClientStatusCodeHandler; +import com.github.tomakehurst.wiremock.WireMockServer; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.test.context.junit4.SpringRunner; +import reactor.core.publisher.Mono; + +import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; +import static com.github.tomakehurst.wiremock.client.WireMock.configureFor; +import static com.github.tomakehurst.wiremock.client.WireMock.post; +import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; +import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; +import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig; +import static java.lang.String.format; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +@RunWith(SpringRunner.class) +public class WebClientStatusCodeHandlerIntegrationTest { + private String baseUrl; + private WireMockServer wireMockServer; + + @Before + public void setUp() { + wireMockServer = new WireMockServer(wireMockConfig().dynamicPort()); + wireMockServer.start(); + configureFor("localhost", wireMockServer.port()); + baseUrl = format("http://localhost:%s", wireMockServer.port()); + } + + @After + public void tearDown() { + wireMockServer.stop(); + } + + @Test + public void whenResponseIs2XX_thenBothStatusHandlerAndExchangeFilterReturnEqualResponses() { + stubPostResponse("/success", 200, "success"); + + Mono responseStatusHandler = WebClientStatusCodeHandler + .getResponseBodyUsingOnStatus(baseUrl + "/success"); + + Mono responseExchangeFilter = WebClientStatusCodeHandler + .getResponseBodyUsingExchangeFilterFunction(baseUrl + "/success"); + + assertThat(responseStatusHandler.block()) + .isEqualTo(responseExchangeFilter.block()) + .isEqualTo("success"); + } + + @Test + public void whenResponseIs500_thenBothStatusHandlerAndExchangeFilterReturnEqualResponses() { + stubPostResponse("/server-error", 500, "Internal Server Error"); + + Mono responseStatusHandler = WebClientStatusCodeHandler + .getResponseBodyUsingOnStatus(baseUrl + "/server-error"); + + Mono responseExchangeFilter = WebClientStatusCodeHandler + .getResponseBodyUsingExchangeFilterFunction(baseUrl + "/server-error"); + + assertThatThrownBy(responseStatusHandler::block) + .isInstanceOf(Exception.class) + .hasMessageContaining("Internal Server Error"); + + assertThatThrownBy(responseExchangeFilter::block) + .isInstanceOf(Exception.class) + .hasMessageContaining("Internal Server Error"); + } + + @Test + public void whenResponseIs400_thenBothStatusHandlerAndExchangeFilterReturnEqualResponses() { + stubPostResponse("/client-error", 400, "Bad Request"); + + Mono responseStatusHandler = WebClientStatusCodeHandler + .getResponseBodyUsingOnStatus(baseUrl + "/client-error"); + + Mono responseExchangeFilter = WebClientStatusCodeHandler + .getResponseBodyUsingExchangeFilterFunction(baseUrl + "/client-error"); + + assertThatThrownBy(responseStatusHandler::block) + .isInstanceOf(Exception.class) + .hasMessageContaining("Bad Request"); + + assertThatThrownBy(responseExchangeFilter::block) + .isInstanceOf(Exception.class) + .hasMessageContaining("Bad Request"); + } + + private static void stubPostResponse(String url, int statusCode, String response) { + stubFor(post(urlEqualTo(url)).willReturn(aResponse() + .withStatus(statusCode) + .withBody(response))); + } +} diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/webclient/WebControllerIntegrationTest.java b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/webclient/WebControllerIntegrationTest.java new file mode 100644 index 0000000..c3747d2 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/webclient/WebControllerIntegrationTest.java @@ -0,0 +1,49 @@ +package com.example.webClientDemo.webclient; + +import static org.springframework.test.annotation.DirtiesContext.ClassMode.BEFORE_CLASS; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.web.server.LocalServerPort; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.web.reactive.server.WebTestClient; + +@DirtiesContext(classMode = BEFORE_CLASS) +@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, classes = WebClientApplication.class) +class WebControllerIntegrationTest { + + @LocalServerPort + private int randomServerPort; + + @Autowired + private WebTestClient testClient; + + @Autowired + private WebController webController; + + @BeforeEach + void setup() { + webController.setServerPort(randomServerPort); + } + + @Test + void whenEndpointWithBlockingClientIsCalled_thenThreeProductsAreReceived() { + testClient.get() + .uri("/products-blocking") + .exchange() + .expectStatus().isOk() + .expectBodyList(Product.class).hasSize(3); + } + + @Test + void whenEndpointWithNonBlockingClientIsCalled_thenThreeProductsAreReceived() { + testClient.get() + .uri("/products-non-blocking") + .exchange() + .expectStatus().isOk() + .expectBodyList(Product.class).hasSize(3); + } +} diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/webclient/json/ReaderConsumerServiceImplUnitTest.java b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/webclient/json/ReaderConsumerServiceImplUnitTest.java new file mode 100644 index 0000000..7eeabb0 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/webclient/json/ReaderConsumerServiceImplUnitTest.java @@ -0,0 +1,88 @@ +package com.example.webClientDemo.webclient.json; + +import com.example.webClientDemo.webclient.json.model.Book; +import org.junit.jupiter.api.Test; +import org.springframework.http.HttpStatus; +import org.springframework.web.reactive.function.client.ClientResponse; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +import java.util.Arrays; +import java.util.List; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.CoreMatchers.hasItems; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.Matchers.hasProperty; + +public class ReaderConsumerServiceImplUnitTest { + + private static final String READER_JSON = "[{\"id\":1,\"name\":\"reader1\",\"favouriteBook\":{\"author\":\"Milan Kundera\",\"title\":\"The Unbearable Lightness of Being\"}," + + "\"booksRead\":[{\"author\":\"Charles Dickens\",\"title\":\"Oliver Twist\"},{\"author\":\"Milan Kundera\",\"title\":\"The Unbearable Lightness of Being\"}]}," + + "{\"id\":2,\"name\":\"reader2\",\"favouriteBook\":{\"author\":\"Douglas Adams\",\"title\":\"The Hitchhiker\'s Guide to the Galaxy\"}," + + "\"booksRead\":[{\"author\":\"J.R.R. Tolkien\",\"title\":\"Lord of the Rings\"}, " + + "{\"author\":\"Douglas Adams\",\"title\":\"The Hitchhiker\'s Guide to the Galaxy\"}]}]"; + + private static final String BASE_URL = "http://localhost:8080/readers"; + + WebClient webClientMock = WebClient.builder().baseUrl(BASE_URL) + .exchangeFunction(clientRequest -> Mono.just(ClientResponse.create(HttpStatus.OK) + .header("content-type", "application/json") + .body(READER_JSON) + .build())) + .build(); + + private final ReaderConsumerService tested = new ReaderConsumerServiceImpl(webClientMock); + + @Test + void when_processReaderDataFromObjectArray_then_OK() { + String expectedAuthor1 = "Milan Kundera"; + String expectedAuthor2 = "Douglas Adams"; + List actual = tested.processReaderDataFromObjectArray(); + assertThat(actual, hasItems(hasProperty("author", is(expectedAuthor1)), + hasProperty("author", is(expectedAuthor2)))); + } + + @Test + void when_processReaderDataFromReaderArray_then_OK() { + String expectedAuthor1 = "Milan Kundera"; + String expectedAuthor2 = "Douglas Adams"; + List actual = tested.processReaderDataFromReaderArray(); + assertThat(actual, hasItems(hasProperty("author", is(expectedAuthor1)), + hasProperty("author", is(expectedAuthor2)))); + } + + @Test + void when_processReaderDataFromReaderList_then_OK() { + String expectedAuthor1 = "Milan Kundera"; + String expectedAuthor2 = "Douglas Adams"; + List actual = tested.processReaderDataFromReaderList(); + assertThat(actual, hasItems(hasProperty("author", is(expectedAuthor1)), + hasProperty("author", is(expectedAuthor2)))); + + } + + @Test + void when_processNestedReaderDataFromReaderArray_then_OK() { + List expected = Arrays.asList( + "Milan Kundera", + "Charles Dickens", + "J.R.R. Tolkien", + "Douglas Adams"); + + List actual = tested.processNestedReaderDataFromReaderArray(); + assertThat(actual, hasItems(expected.get(0), expected.get(1), expected.get(2), expected.get(3))); + } + + @Test + void when_processNestedReaderDataFromReaderList_then_OK() { + List expected = Arrays.asList( + "Milan Kundera", + "Charles Dickens", + "J.R.R. Tolkien", + "Douglas Adams"); + + List actual = tested.processNestedReaderDataFromReaderList(); + assertThat(actual, hasItems(expected.get(0), expected.get(1), expected.get(2), expected.get(3))); + } +} diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/webclient/timeout/WebClientTimeoutIntegrationTest.java b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/webclient/timeout/WebClientTimeoutIntegrationTest.java new file mode 100644 index 0000000..54367fc --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/java/com/example/webClientDemo/webclient/timeout/WebClientTimeoutIntegrationTest.java @@ -0,0 +1,133 @@ +package com.example.webClientDemo.webclient.timeout; + +import com.github.tomakehurst.wiremock.WireMockServer; +import io.netty.handler.timeout.ReadTimeoutException; +import lombok.val; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.springframework.http.HttpStatus; +import org.springframework.web.reactive.function.client.WebClientRequestException; +import reactor.core.publisher.Mono; +import reactor.netty.http.client.HttpClientRequest; + + +import java.time.Duration; +import java.util.concurrent.TimeoutException; + +import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; +import static com.github.tomakehurst.wiremock.client.WireMock.configureFor; +import static com.github.tomakehurst.wiremock.client.WireMock.get; +import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; +import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; +import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +public class WebClientTimeoutIntegrationTest { + + private WireMockServer wireMockServer; + + @Before + public void setup() { + wireMockServer = new WireMockServer(wireMockConfig().dynamicPort()); + wireMockServer.start(); + configureFor("localhost", wireMockServer.port()); + } + + @After + public void tearDown() { + wireMockServer.stop(); + } + + @AfterEach + public void tearDownEach() { + wireMockServer.resetAll(); + } + + @SuppressWarnings("deprecation") + @Test + public void givenResponseTimeoutClientWhenRequestTimeoutThenReadTimeoutException() { + val path = "/response-timeout"; + val delay = Math.toIntExact(Duration.ofSeconds(2).toMillis()); + stubFor(get(urlEqualTo(path)).willReturn(aResponse().withFixedDelay(delay) + .withStatus(HttpStatus.OK.value()))); + + val webClient = WebClientTimeoutProvider.responseTimeoutClient(); + + val ex = assertThrows(RuntimeException.class, () -> + webClient.get() + .uri(wireMockServer.baseUrl() + path) + .exchangeToMono(Mono::just) + .log() + .block()); + assertThat(ex).isInstanceOf(WebClientRequestException.class) + .getCause().isInstanceOf(ReadTimeoutException.class); + } + + @SuppressWarnings("deprecation") + @Test + public void givenReadWriteTimeoutClientWhenRequestTimeoutThenReadTimeoutException() { + val path = "/read-write-timeout"; + val delay = Math.toIntExact(Duration.ofSeconds(6).toMillis()); + stubFor(get(urlEqualTo(path)).willReturn(aResponse().withFixedDelay(delay) + .withStatus(HttpStatus.OK.value()))); + + val webClient = WebClientTimeoutProvider.readWriteTimeoutClient(); + + val ex = assertThrows(RuntimeException.class, () -> + webClient.get() + .uri(wireMockServer.baseUrl() + path) + .exchangeToMono(Mono::just) + .log() + .block()); + assertThat(ex).isInstanceOf(WebClientRequestException.class) + .getCause().isInstanceOf(ReadTimeoutException.class); + } + + @SuppressWarnings("deprecation") + @Test + public void givenNoTimeoutClientAndReactorTimeoutWhenRequestTimeoutThenTimeoutException() { + val path = "/reactor-timeout"; + val delay = Math.toIntExact(Duration.ofSeconds(5).toMillis()); + stubFor(get(urlEqualTo(path)).willReturn(aResponse().withFixedDelay(delay) + .withStatus(HttpStatus.OK.value()))); + + val webClient = WebClientTimeoutProvider.defaultWebClient(); + + val ex = assertThrows(RuntimeException.class, () -> + webClient.get() + .uri(wireMockServer.baseUrl() + path) + .exchangeToMono(Mono::just) + .timeout(Duration.ofSeconds(1)) + .log() + .block()); + assertThat(ex).hasMessageContaining("Did not observe any item") + .getCause().isInstanceOf(TimeoutException.class); + } + + @SuppressWarnings("deprecation") + @Test + public void givenNoTimeoutClientAndTimeoutHttpRequestWhenRequestTimeoutThenReadTimeoutException() { + val path = "/reactor-http-request-timeout"; + val delay = Math.toIntExact(Duration.ofSeconds(5).toMillis()); + stubFor(get(urlEqualTo(path)).willReturn(aResponse().withFixedDelay(delay) + .withStatus(HttpStatus.OK.value()))); + + val webClient = WebClientTimeoutProvider.defaultWebClient(); + + val ex = assertThrows(RuntimeException.class, () -> + webClient.get() + .uri(wireMockServer.baseUrl() + path) + .httpRequest(httpRequest -> { + HttpClientRequest reactorRequest = httpRequest.getNativeRequest(); + reactorRequest.responseTimeout(Duration.ofSeconds(1)); + }) + .exchangeToMono(Mono::just) + .log() + .block()); + assertThat(ex).isInstanceOf(WebClientRequestException.class) + .getCause().isInstanceOf(ReadTimeoutException.class); + } +} diff --git a/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/resources/logback-test.xml b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/resources/logback-test.xml new file mode 100644 index 0000000..f814800 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/WebClientDemo/webClientDemo/src/test/resources/logback-test.xml @@ -0,0 +1,20 @@ + + + + + # Pattern of log message for console appender + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + + + + + + \ No newline at end of file From 0f48e998dd560ba69393c693588d663ba10d876e Mon Sep 17 00:00:00 2001 From: mikeleo03 Date: Thu, 1 Aug 2024 09:58:51 +0700 Subject: [PATCH 22/23] [Fix] Redirection and renaming --- .../feignClientDemo/src/main/resources/application.properties | 2 +- .../resttemplate/web/service/BarConsumerService.java | 4 ++-- .../example/restTemplateDemo/sampleapp/MainApplication.java | 2 +- .../restTemplateDemo/sampleapp/config/RestClientConfig.java | 4 ++-- .../java/com/example/restTemplateDemo/SpringTestConfig.java | 2 +- .../resttemplate/RestTemplateBasicLiveTest.java | 4 ++-- .../web/handler/RestTemplateResponseErrorHandlerTest.java | 4 ++-- .../src/test/resources/application.properties | 2 +- 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/resources/application.properties b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/resources/application.properties index 0fb1008..8b35812 100644 --- a/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/resources/application.properties +++ b/Week 08/Lecture 14/Assignment 01/FeignClientDemo/feignClientDemo/src/main/resources/application.properties @@ -4,7 +4,7 @@ feign.okhttp.enabled=true server.port=8085 spring.main.allow-bean-definition-overriding=true -logging.level.com.baeldung.cloud.openfeign.client=INFO +logging.level.com.example.feignClientDemo.cloud.openfeign.client=INFO feign.hystrix.enabled=true spring.cloud.openfeign.client.config.postClient.url=https://jsonplaceholder.typicode.com/posts/ \ No newline at end of file diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/resttemplate/web/service/BarConsumerService.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/resttemplate/web/service/BarConsumerService.java index bf499d1..5727b3a 100644 --- a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/resttemplate/web/service/BarConsumerService.java +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/resttemplate/web/service/BarConsumerService.java @@ -5,7 +5,7 @@ import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; -import com.example.restTemplateDemo.resttemplate.web.handler.RestTemplateResponseErrorHandler; +import com.example.restTemplateDemo.resttemplate.web.handler.RestTemplateRespErrorHandler; import com.example.restTemplateDemo.resttemplate.web.model.Bar; @Service @@ -16,7 +16,7 @@ public class BarConsumerService { @Autowired public BarConsumerService(RestTemplateBuilder restTemplateBuilder) { restTemplate = restTemplateBuilder - .errorHandler(new RestTemplateResponseErrorHandler()) + .errorHandler(new RestTemplateRespErrorHandler()) .build(); } diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/MainApplication.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/MainApplication.java index fb69579..ad6563c 100644 --- a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/MainApplication.java +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/MainApplication.java @@ -6,7 +6,7 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @EnableAutoConfiguration -@ComponentScan("com.baeldung.sampleapp") +@ComponentScan("com.example.restTemplateDemo.sampleapp") public class MainApplication implements WebMvcConfigurer { public static void main(final String[] args) { diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/config/RestClientConfig.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/config/RestClientConfig.java index ffedfb0..8c8024d 100644 --- a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/config/RestClientConfig.java +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/main/java/com/example/restTemplateDemo/sampleapp/config/RestClientConfig.java @@ -9,7 +9,7 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.client.RestTemplate; -import com.example.restTemplateDemo.sampleapp.interceptor.RestTemplateHeaderModifierInterceptor; +import com.example.restTemplateDemo.sampleapp.interceptor.RestTemplateHeaderInterceptor; @Configuration public class RestClientConfig { @@ -22,7 +22,7 @@ public RestTemplate restTemplate() { if (CollectionUtils.isEmpty(interceptors)) { interceptors = new ArrayList<>(); } - interceptors.add(new RestTemplateHeaderModifierInterceptor()); + interceptors.add(new RestTemplateHeaderInterceptor()); restTemplate.setInterceptors(interceptors); return restTemplate; } diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/SpringTestConfig.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/SpringTestConfig.java index 1fe8bc0..26d14da 100644 --- a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/SpringTestConfig.java +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/SpringTestConfig.java @@ -6,6 +6,6 @@ @Configuration @EnableAutoConfiguration -@ComponentScan("com.baeldung") +@ComponentScan("com.example.restTemplateDemo") public class SpringTestConfig { } diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/resttemplate/RestTemplateBasicLiveTest.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/resttemplate/RestTemplateBasicLiveTest.java index 6bd3759..3f0dc03 100644 --- a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/resttemplate/RestTemplateBasicLiveTest.java +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/resttemplate/RestTemplateBasicLiveTest.java @@ -27,7 +27,7 @@ import static com.example.restTemplateDemo.client.Consts.APPLICATION_PORT; import com.example.restTemplateDemo.resttemplate.web.dto.Foo; -import com.example.restTemplateDemo.resttemplate.web.handler.RestTemplateResponseErrorHandler; +import com.example.restTemplateDemo.resttemplate.web.handler.RestTemplateRespErrorHandler; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.base.Charsets; @@ -41,7 +41,7 @@ public class RestTemplateBasicLiveTest { @BeforeEach public void beforeTest() { restTemplate = new RestTemplate(); - restTemplate.setErrorHandler(new RestTemplateResponseErrorHandler()); + restTemplate.setErrorHandler(new RestTemplateRespErrorHandler()); // restTemplate.setMessageConverters(Arrays.asList(new MappingJackson2HttpMessageConverter())); } diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/web/handler/RestTemplateResponseErrorHandlerTest.java b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/web/handler/RestTemplateResponseErrorHandlerTest.java index 470f564..e19ce7e 100644 --- a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/web/handler/RestTemplateResponseErrorHandlerTest.java +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo/src/test/java/com/example/restTemplateDemo/web/handler/RestTemplateResponseErrorHandlerTest.java @@ -18,7 +18,7 @@ import org.springframework.web.client.RestTemplate; import com.example.restTemplateDemo.resttemplate.web.exception.NotFoundException; -import com.example.restTemplateDemo.resttemplate.web.handler.RestTemplateResponseErrorHandler; +import com.example.restTemplateDemo.resttemplate.web.handler.RestTemplateRespErrorHandler; import com.example.restTemplateDemo.resttemplate.web.model.Bar; @ExtendWith(SpringExtension.class) @@ -35,7 +35,7 @@ public void givenRemoteApiCall_when404Error_thenThrowNotFound() { Assertions.assertNotNull(this.server); RestTemplate restTemplate = this.builder - .errorHandler(new RestTemplateResponseErrorHandler()) + .errorHandler(new RestTemplateRespErrorHandler()) .build(); this.server diff --git a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/test/resources/application.properties b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/test/resources/application.properties index 286ea95..8e60ed4 100644 --- a/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/test/resources/application.properties +++ b/Week 08/Lecture 14/Assignment 01/RestTemplateDemo/restTemplateDemo1/src/test/resources/application.properties @@ -1,5 +1,5 @@ logging.level.org.springframework.web.client.RestTemplate=DEBUG -logging.level.com.baeldung.resttemplate.logging=DEBUG +logging.level.com.example.restTemplateDemo1.resttemplate.logging=DEBUG logging.level.org.apache.http=DEBUG logging.level.httpclient.wire=DEBUG logging.pattern.console=%20logger{20} - %msg%n From 0c5ee6d00317ec69daa330e80975417141fa0010 Mon Sep 17 00:00:00 2001 From: mikeleo03 Date: Thu, 1 Aug 2024 10:19:19 +0700 Subject: [PATCH 23/23] [Feat] README documentation --- Week 08/Lecture 14/Assignment 01/README.md | 148 ++++++++++++++++++ Week 08/Lecture 14/Assignment 01/img/demo.png | Bin 0 -> 23374 bytes 2 files changed, 148 insertions(+) create mode 100644 Week 08/Lecture 14/Assignment 01/README.md create mode 100644 Week 08/Lecture 14/Assignment 01/img/demo.png diff --git a/Week 08/Lecture 14/Assignment 01/README.md b/Week 08/Lecture 14/Assignment 01/README.md new file mode 100644 index 0000000..ff1e325 --- /dev/null +++ b/Week 08/Lecture 14/Assignment 01/README.md @@ -0,0 +1,148 @@ +# 👨🏻‍🏫 Lecture 14 - Spring Advanced Features: FeignClient, RestTemplate, WebClient + +> This repository is created as a part of an assignment for Lecture 14 on Spring Advanced Features: FeignClient, RestTemplate, WebClient. + +## 💡 Assignment 01 - FeignClient, RestTemplate, WebClient + +### 🧐 What are FeignClient, RestTemplate, and WebClient? + +Spring offers several tools for making HTTP requests to external services or APIs. Each tool has its own strengths and is suited for different use cases: + +- **FeignClient**: A declarative web service client that simplifies HTTP API calls by reducing the amount of boilerplate code required. It integrates seamlessly with Spring Cloud for easy integration with microservices. + + **Syntax Example**: + ```java + @FeignClient(name = "inventory-service", url = "http://inventory-service") + public interface InventoryClient { + + @GetMapping("/inventory/{productId}") + InventoryResponse getInventory(@PathVariable("productId") String productId); + } + ``` + +- **RestTemplate**: A synchronous HTTP client that provides a straightforward way to consume RESTful services. It's been a staple in Spring for many years, known for its simplicity and ease of use. + + **Syntax Example**: + ```java + @Bean + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + // Usage + ResponseEntity response = restTemplate.getForEntity("http://example.com/api/resource", String.class); + ``` + +- **WebClient**: A modern, reactive, and non-blocking HTTP client designed to work well with the Spring WebFlux framework. It supports asynchronous and streaming scenarios, making it ideal for reactive programming. + + **Syntax Example**: + ```java + @Bean + public WebClient webClient() { + return WebClient.builder().baseUrl("http://example.com").build(); + } + + // Usage + Mono response = webClient.get() + .uri("/api/resource") + .retrieve() + .bodyToMono(String.class); + ``` + +### ❓ What are the Differences? + +Understanding the differences between FeignClient, RestTemplate, and WebClient helps in choosing the right tool for your specific needs: + +- **Declarative vs. Programmatic**: + - **FeignClient** is declarative, allowing you to define API clients using interfaces. + - **RestTemplate** and **WebClient** require more programmatic control but offer greater flexibility. + +- **Synchronous vs. Asynchronous**: + - **FeignClient** and **RestTemplate** are synchronous, meaning they block the calling thread until the response is received. + - **WebClient** supports both synchronous and asynchronous operations, making it suitable for reactive and non-blocking scenarios. + +- **Reactive Support**: + - **WebClient** is designed with reactive programming in mind and works seamlessly with Project Reactor and Spring WebFlux. + - **FeignClient** and **RestTemplate** are more traditional and do not support reactive paradigms. + +Here's a table summarizing these differences: + +| Feature | FeignClient | RestTemplate | WebClient | +|-------------------|------------------------------------------------|------------------------------------------------|-------------------------------------------------| +| **Declarative API** | Yes | No | Yes | +| **Asynchronous** | No | No | Yes | +| **Reactive Support** | No | No | Yes | +| **HTTP Methods** | Limited (GET, POST, etc.) | Full control | Full control | + +### 🤔 Use Cases + +- **FeignClient**: Ideal for microservices architectures where you need to make simple, declarative HTTP requests. For example, when one microservice needs to call another microservice, FeignClient provides a clean and easy-to-understand interface. + + **Real Case**: In a microservices setup for an e-commerce application, a `PaymentService` might need to call an external `InventoryService` to check stock levels. Using FeignClient simplifies this inter-service communication. + +- **RestTemplate**: Best suited for straightforward, synchronous HTTP operations. It's often used in scenarios where you need to make blocking calls to RESTful services and handle simple request-response cycles. + + **Real Case**: When building a server-side application that needs to fetch data from an external weather API and display it on a dashboard, RestTemplate offers a simple way to make these HTTP calls and process the responses. + +- **WebClient**: Perfect for handling asynchronous and streaming scenarios, especially in reactive applications. It is the go-to choice for non-blocking I/O operations and integrating with reactive streams. + + **Real Case**: In a real-time chat application, WebClient can be used to stream data from a messaging service, allowing for asynchronous communication and real-time updates without blocking the main thread. + +### 🗂️ List of Projects + +To provide clear examples and explanations, each project is organized separately: + +1. **FeignClient Demo** + - **Directory**: [feignClientDemo](/Week%2008/Lecture%2014/Assignment%2001/FeignClientDemo/feignClientDemo) + - **Inspiration**: [Baeldung FeignClient Guide](https://www.baeldung.com/spring-cloud-openfeign​) + - **Description**: Demonstrates how to use FeignClient to make HTTP requests using a declarative approach. Includes examples of GET and POST requests. + + **Key Points**: + - Declarative API definition + - Simplified microservices communication + - Integration with Spring Cloud + +2. **RestTemplate Demo** + - **Directories**: + - [RestTemplateDemo](/Week%2008/Lecture%2014/Assignment%2001/RestTemplateDemo/restTemplateDemo) + - [RestTemplateDemo1](/Week%2008/Lecture%2014/Assignment%2001/RestTemplateDemo/restTemplateDemo1) + - **Inspiration**: [Baeldung RestTemplate Guide](https://www.baeldung.com/rest-template​) and [Handling Lists with RestTemplate](https://www.baeldung.com/resttemplate-list​​) + - **Description**: Provides examples of how to use RestTemplate for synchronous HTTP requests. Includes scenarios for GET, POST, PUT, and DELETE operations, as well as handling complex responses. + + **Key Points**: + - Synchronous HTTP operations + - Handling various HTTP methods + - Processing complex responses + +3. **WebClient Demo** + - **Directory**: [webClientDemo](/Week%2008/Lecture%2014/Assignment%2001/WebClientDemo/webClientDemo) + - **Inspiration**: [Baeldung WebClient Guide](https://www.baeldung.com/spring-webclient-json-list​) + - **Description**: Showcases the capabilities of WebClient for asynchronous and reactive programming. Demonstrates how to handle various HTTP methods and stream data efficiently. + + **Key Points**: + - Asynchronous and reactive programming + - Streaming data handling + - Integration with Spring WebFlux + +### ⚙️ How to run the program + +1. Navigate to the desired directory. For example, to run the WebClient demo: + ```bash + $ cd WebClientDemo/webClientDemo + ``` + +2. Ensure Maven is installed. Check the version with: + ```bash + $ mvn -v + ``` + +3. Execute the unit tests to verify functionalities: + ```bash + $ mvn test + ``` + +### 🚀 Demonstration + +Here are the results from demonstrating all functionalities in the WebClientDemo project: + +![Demo](/Week%2008/Lecture%2014/Assignment%2001/img/demo.png) \ No newline at end of file diff --git a/Week 08/Lecture 14/Assignment 01/img/demo.png b/Week 08/Lecture 14/Assignment 01/img/demo.png new file mode 100644 index 0000000000000000000000000000000000000000..84965b747734616afc8a05970457aaa5a0ad805e GIT binary patch literal 23374 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 SI^e+GU~$~qwAAF>wLbu;yDt#{ literal 0 HcmV?d00001