diff --git a/.mvn/wrapper/MavenWrapperDownloader.java b/.mvn/wrapper/MavenWrapperDownloader.java new file mode 100644 index 0000000000..7582292877 --- /dev/null +++ b/.mvn/wrapper/MavenWrapperDownloader.java @@ -0,0 +1,120 @@ + +/* + * Copyright 2007-present the original author or authors. + * + * Licensed 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 + * + * http://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. + */ +import java.net.*; +import java.io.*; +import java.nio.channels.*; +import java.util.Properties; + +public class MavenWrapperDownloader { + + private static final String WRAPPER_VERSION = "0.5.6"; + /** + * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is + * provided. + */ + private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" + + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; + + /** + * Path to the maven-wrapper.properties file, which might contain a downloadUrl + * property to + * use instead of the default one. + */ + private static final String MAVEN_WRAPPER_PROPERTIES_PATH = ".mvn/wrapper/maven-wrapper.properties"; + + /** + * Path where the maven-wrapper.jar will be saved to. + */ + private static final String MAVEN_WRAPPER_JAR_PATH = ".mvn/wrapper/maven-wrapper.jar"; + + /** + * Name of the property which should be used to override the default download + * url for the wrapper. + */ + private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; + + public static void main(String args[]) { + System.out.println("- Downloader started"); + File baseDirectory = new File(args[0]); + System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); + + // If the maven-wrapper.properties exists, read it and check if it contains a + // custom + // wrapperUrl parameter. + File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); + String url = DEFAULT_DOWNLOAD_URL; + if (mavenWrapperPropertyFile.exists()) { + FileInputStream mavenWrapperPropertyFileInputStream = null; + try { + mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); + Properties mavenWrapperProperties = new Properties(); + mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); + url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); + } catch (IOException e) { + System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); + } finally { + try { + if (mavenWrapperPropertyFileInputStream != null) { + mavenWrapperPropertyFileInputStream.close(); + } + } catch (IOException e) { + // Ignore ... + } + } + } + System.out.println("- Downloading from: " + url); + + File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); + if (!outputFile.getParentFile().exists()) { + if (!outputFile.getParentFile().mkdirs()) { + System.out.println( + "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); + } + } + System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); + try { + downloadFileFromURL(url, outputFile); + System.out.println("Done"); + System.exit(0); + } catch (Throwable e) { + System.out.println("- Error downloading"); + e.printStackTrace(); + System.exit(1); + } + } + + private static void downloadFileFromURL(String urlString, File destination) throws Exception { + if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { + String username = System.getenv("MVNW_USERNAME"); + char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); + Authenticator.setDefault(new Authenticator() { + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(username, password); + } + }); + } + URL website = new URL(urlString); + ReadableByteChannel rbc; + rbc = Channels.newChannel(website.openStream()); + FileOutputStream fos = new FileOutputStream(destination); + fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); + fos.close(); + rbc.close(); + } + +} diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000..2cc7d4a55c Binary files /dev/null and b/.mvn/wrapper/maven-wrapper.jar differ diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000000..642d572ce9 --- /dev/null +++ b/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,2 @@ +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000000..e72141d88d --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,14 @@ +{ + "configurations": [ + { + "type": "java", + "name": "Spring Boot-TourguideApplication", + "request": "launch", + "cwd": "${workspaceFolder}", + "mainClass": "com.openclassrooms.tourguide.TourguideApplication", + "projectName": "tourguide", + "args": "", + "envFile": "${workspaceFolder}/.env" + } + ] +} diff --git a/README.md b/README.md new file mode 100644 index 0000000000..ed94ac4763 --- /dev/null +++ b/README.md @@ -0,0 +1,12 @@ +# Technologies + +> Java 17 +> Spring Boot 3.X +> JUnit 5 + +# How to have gpsUtil, rewardCentral and tripPricer dependencies available ? + +> Run : +- mvn install:install-file -Dfile=/libs/gpsUtil.jar -DgroupId=gpsUtil -DartifactId=gpsUtil -Dversion=1.0.0 -Dpackaging=jar +- mvn install:install-file -Dfile=/libs/RewardCentral.jar -DgroupId=rewardCentral -DartifactId=rewardCentral -Dversion=1.0.0 -Dpackaging=jar +- mvn install:install-file -Dfile=/libs/TripPricer.jar -DgroupId=tripPricer -DartifactId=tripPricer -Dversion=1.0.0 -Dpackaging=jar diff --git a/TourGuide/.github/workflows/cicd.yml b/TourGuide/.github/workflows/cicd.yml new file mode 100644 index 0000000000..906c42d5ce --- /dev/null +++ b/TourGuide/.github/workflows/cicd.yml @@ -0,0 +1,100 @@ +name: Java CI/CD Pipeline + +on: + push: + branches: + - master + pull_request: + branches: + - master + +jobs: + test-and-report: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: "17" + distribution: "temurin" + + - name: Install private JAR dependencies + run: | + mvn install:install-file -Dfile=./libs/gpsUtil.jar -DgroupId=gpsUtil -DartifactId=gpsUtil -Dversion=1.0.0 -Dpackaging=jar + mvn install:install-file -Dfile=./libs/RewardCentral.jar -DgroupId=rewardCentral -DartifactId=rewardCentral -Dversion=1.0.0 -Dpackaging=jar + mvn install:install-file -Dfile=./libs/TripPricer.jar -DgroupId=tripPricer -DartifactId=tripPricer -Dversion=1.0.0 -Dpackaging=jar + + - name: Build and test with Maven + run: mvn clean verify jacoco:report surefire-report:report-only javadoc:javadoc + + - name: Upload JaCoCo Report + uses: actions/upload-artifact@v4 + with: + name: jacoco-report + path: target/site/jacoco/ + + - name: Upload Javadoc + uses: actions/upload-artifact@v4 + with: + name: javadoc + path: target/site/apidocs/ + + - name: Upload Surefire Report + uses: actions/upload-artifact@v4 + with: + name: surefire-report + path: target/reports/ + + - name: Upload JAR + uses: actions/upload-artifact@v4 + with: + name: application-jar + path: target/*.jar + + - name: Publish to GitHub Pages + uses: peaceiris/actions-gh-pages@v3 + with: + personal_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./target + + docker-build: + runs-on: ubuntu-latest + needs: test-and-report + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: "17" + distribution: "temurin" + + - name: Install private JAR dependencies + run: | + mvn install:install-file -Dfile=./libs/gpsUtil.jar -DgroupId=gpsUtil -DartifactId=gpsUtil -Dversion=1.0.0 -Dpackaging=jar + mvn install:install-file -Dfile=./libs/RewardCentral.jar -DgroupId=rewardCentral -DartifactId=rewardCentral -Dversion=1.0.0 -Dpackaging=jar + mvn install:install-file -Dfile=./libs/TripPricer.jar -DgroupId=tripPricer -DartifactId=tripPricer -Dversion=1.0.0 -Dpackaging=jar + + - name: Build application with Maven + run: mvn clean install + + - name: Extract short commit SHA + id: vars + run: echo "short_sha=$(echo $GITHUB_SHA | cut -c1-7)" >> $GITHUB_ENV + + - name: Build Docker image with tags + run: | + docker build -t ${{ secrets.DOCKER_USERNAME }}/p8:latest -t ${{ secrets.DOCKER_USERNAME }}/p8:${{ env.short_sha }} . + + - name: Log in to Docker Hub + run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login --username ${{ secrets.DOCKER_USERNAME }} --password-stdin + + - name: Push Docker image + run: | + docker push ${{ secrets.DOCKER_USERNAME }}/p8:latest + docker push ${{ secrets.DOCKER_USERNAME }}/p8:${{ env.short_sha }} diff --git a/TourGuide/Dockerfile b/TourGuide/Dockerfile new file mode 100644 index 0000000000..8ae1a44169 --- /dev/null +++ b/TourGuide/Dockerfile @@ -0,0 +1,18 @@ +FROM maven:3.9.9-ibm-semeru-21-noble + +WORKDIR /app + +COPY . . + +RUN mvn clean package + +FROM openjdk:26-jdk + +WORKDIR /app + +ARG JAR_FILE=target/*jar + +COPY ${JAR_FILE} /app/tourguide.jar + +ENTRYPOINT [ "java","-jar", "/app/tourguide.jar" ] + diff --git a/TourGuide/logs/test-execution.log b/TourGuide/logs/test-execution.log new file mode 100644 index 0000000000..f19332706f --- /dev/null +++ b/TourGuide/logs/test-execution.log @@ -0,0 +1,2553 @@ +2025-06-16 15:24:15 [main] INFO o.s.t.c.s.AnnotationConfigContextLoaderUtils - Could not detect default configuration classes for test class [com.openclassrooms.tourguide.TourguideApplicationTests]: TourguideApplicationTests does not declare any static, non-private, non-final, nested classes annotated with @Configuration. +2025-06-16 15:24:15 [main] INFO o.s.b.t.c.SpringBootTestContextBootstrapper - Found @SpringBootConfiguration com.openclassrooms.tourguide.TourguideApplication for test class com.openclassrooms.tourguide.TourguideApplicationTests +2025-06-16 15:24:17 [background-preinit] DEBUG org.jboss.logging - Logging Provider: org.jboss.logging.Slf4jLoggerProvider found via system property +2025-06-16 15:24:17 [background-preinit] INFO o.h.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.2.Final +2025-06-16 15:24:17 [background-preinit] DEBUG o.h.v.i.x.config.ValidationXmlParser - Trying to load META-INF/validation.xml for XML based Validator configuration. +2025-06-16 15:24:17 [background-preinit] DEBUG o.h.v.i.x.c.ResourceLoaderHelper - Trying to load META-INF/validation.xml via TCCL +2025-06-16 15:24:17 [background-preinit] DEBUG o.h.v.i.x.c.ResourceLoaderHelper - Trying to load META-INF/validation.xml via Hibernate Validator's class loader +2025-06-16 15:24:17 [background-preinit] DEBUG o.h.v.i.x.config.ValidationXmlParser - No META-INF/validation.xml found. Using annotation based configuration only. +2025-06-16 15:24:17 [background-preinit] DEBUG o.h.v.i.e.r.TraversableResolvers - Cannot find jakarta.persistence.Persistence on classpath. Assuming non JPA 2 environment. All properties will per default be traversable. +2025-06-16 15:24:17 [background-preinit] DEBUG o.h.v.m.ResourceBundleMessageInterpolator - Loaded expression factory via original TCCL +2025-06-16 15:24:17 [main] INFO c.o.t.TourguideApplicationTests - Starting TourguideApplicationTests using Java 17.0.15 with PID 1620 (started by AGOUROU GUSTAVE in C:\Users\AGOUROU GUSTAVE\Downloads\Open Classroom\P8\JavaPathENProject8-master\TourGuide) +2025-06-16 15:24:17 [main] DEBUG c.o.t.TourguideApplicationTests - Running with Spring Boot v3.4.6, Spring v6.2.7 +2025-06-16 15:24:17 [main] INFO c.o.t.TourguideApplicationTests - No active profile set, falling back to 1 default profile: "default" +2025-06-16 15:24:17 [main] DEBUG o.s.boot.SpringApplication - Loading source class com.openclassrooms.tourguide.TourguideApplication +2025-06-16 15:24:17 [main] DEBUG o.s.w.c.s.GenericWebApplicationContext - Refreshing org.springframework.web.context.support.GenericWebApplicationContext@6d64b553 +2025-06-16 15:24:17 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalConfigurationAnnotationProcessor' +2025-06-16 15:24:17 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.internalCachingMetadataReaderFactory' +2025-06-16 15:24:18 [background-preinit] DEBUG o.h.v.i.e.ValidatorFactoryConfigurationHelper - HV000252: Using org.hibernate.validator.internal.engine.DefaultPropertyNodeNameProvider as property node name provider. +2025-06-16 15:24:18 [background-preinit] DEBUG o.h.v.i.e.ValidatorFactoryConfigurationHelper - HV000234: Using org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator as ValidatorFactory-scoped message interpolator. +2025-06-16 15:24:18 [background-preinit] DEBUG o.h.v.i.e.ValidatorFactoryConfigurationHelper - HV000234: Using org.hibernate.validator.internal.engine.resolver.TraverseAllTraversableResolver as ValidatorFactory-scoped traversable resolver. +2025-06-16 15:24:18 [background-preinit] DEBUG o.h.v.i.e.ValidatorFactoryConfigurationHelper - HV000234: Using org.hibernate.validator.internal.util.ExecutableParameterNameProvider as ValidatorFactory-scoped parameter name provider. +2025-06-16 15:24:18 [background-preinit] DEBUG o.h.v.i.e.ValidatorFactoryConfigurationHelper - HV000234: Using org.hibernate.validator.internal.engine.DefaultClockProvider as ValidatorFactory-scoped clock provider. +2025-06-16 15:24:18 [background-preinit] DEBUG o.h.v.i.e.ValidatorFactoryConfigurationHelper - HV000234: Using org.hibernate.validator.internal.engine.scripting.DefaultScriptEvaluatorFactory as ValidatorFactory-scoped script evaluator factory. +2025-06-16 15:24:18 [main] DEBUG o.s.c.a.ClassPathBeanDefinitionScanner - Identified candidate component class: file [C:\Users\AGOUROU GUSTAVE\Downloads\Open Classroom\P8\JavaPathENProject8-master\TourGuide\target\classes\com\openclassrooms\tourguide\configuration\ExecutorConfig.class] +2025-06-16 15:24:18 [main] DEBUG o.s.c.a.ClassPathBeanDefinitionScanner - Identified candidate component class: file [C:\Users\AGOUROU GUSTAVE\Downloads\Open Classroom\P8\JavaPathENProject8-master\TourGuide\target\classes\com\openclassrooms\tourguide\configuration\TourGuideModule.class] +2025-06-16 15:24:18 [main] DEBUG o.s.c.a.ClassPathBeanDefinitionScanner - Identified candidate component class: file [C:\Users\AGOUROU GUSTAVE\Downloads\Open Classroom\P8\JavaPathENProject8-master\TourGuide\target\classes\com\openclassrooms\tourguide\controller\TourGuideController.class] +2025-06-16 15:24:18 [main] DEBUG o.s.c.a.ClassPathBeanDefinitionScanner - Identified candidate component class: file [C:\Users\AGOUROU GUSTAVE\Downloads\Open Classroom\P8\JavaPathENProject8-master\TourGuide\target\classes\com\openclassrooms\tourguide\service\RewardsService.class] +2025-06-16 15:24:18 [main] DEBUG o.s.c.a.ClassPathBeanDefinitionScanner - Identified candidate component class: file [C:\Users\AGOUROU GUSTAVE\Downloads\Open Classroom\P8\JavaPathENProject8-master\TourGuide\target\classes\com\openclassrooms\tourguide\service\TourGuideService.class] +2025-06-16 15:24:22 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'propertySourcesPlaceholderConfigurer' +2025-06-16 15:24:22 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.test.mock.mockito.MockitoPostProcessor' +2025-06-16 15:24:22 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.sql.init.dependency.DatabaseInitializationDependencyConfigurer$DependsOnDatabaseInitializationPostProcessor' +2025-06-16 15:24:22 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.event.internalEventListenerProcessor' +2025-06-16 15:24:22 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'preserveErrorControllerTargetClassPostProcessor' +2025-06-16 15:24:22 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'forceAutoProxyCreatorToUseClassProxying' +2025-06-16 15:24:22 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.event.internalEventListenerFactory' +2025-06-16 15:24:22 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.test.mock.mockito.MockitoPostProcessor$SpyPostProcessor' +2025-06-16 15:24:22 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor' +2025-06-16 15:24:22 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalCommonAnnotationProcessor' +2025-06-16 15:24:22 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor' +2025-06-16 15:24:22 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.context.internalConfigurationPropertiesBinder' +2025-06-16 15:24:22 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'methodValidationPostProcessor' +2025-06-16 15:24:22 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'methodValidationPostProcessor' via factory method to bean named 'environment' +2025-06-16 15:24:22 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.context.properties.EnableConfigurationPropertiesRegistrar.methodValidationExcludeFilter' +2025-06-16 15:24:22 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.aop.config.internalAutoProxyCreator' +2025-06-16 15:24:22 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'webServerFactoryCustomizerBeanPostProcessor' +2025-06-16 15:24:22 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'errorPageRegistrarBeanPostProcessor' +2025-06-16 15:24:22 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'healthEndpointGroupsBeanPostProcessor' +2025-06-16 15:24:22 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'meterRegistryPostProcessor' +2025-06-16 15:24:22 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'meterRegistryPostProcessor' via factory method to bean named 'org.springframework.web.context.support.GenericWebApplicationContext@6d64b553' +2025-06-16 15:24:22 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'observationRegistryPostProcessor' +2025-06-16 15:24:22 [main] DEBUG o.s.u.c.s.UiApplicationContextUtils - Unable to locate ThemeSource with name 'themeSource': using default [org.springframework.ui.context.support.ResourceBundleThemeSource@1b410308] +2025-06-16 15:24:22 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.test.context.support.internalDynamicPropertyRegistrarBeanInitializer' +2025-06-16 15:24:22 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'tourguideApplication' +2025-06-16 15:24:22 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'executorConfig' +2025-06-16 15:24:22 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'tourGuideModule' +2025-06-16 15:24:22 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'tourGuideController' +2025-06-16 15:24:22 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'tourGuideService' +2025-06-16 15:24:22 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'getGpsUtil' +2025-06-16 15:24:22 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'rewardsService' +2025-06-16 15:24:22 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'getRewardCentral' +2025-06-16 15:24:22 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'threadPoolExecutor' +2025-06-16 15:24:22 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'rewardsService' via constructor to bean named 'getGpsUtil' +2025-06-16 15:24:22 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'rewardsService' via constructor to bean named 'getRewardCentral' +2025-06-16 15:24:22 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'rewardsService' via constructor to bean named 'threadPoolExecutor' +2025-06-16 15:24:22 [main] DEBUG o.s.c.e.PropertySourcesPropertyResolver - Found key 'tourguide.startTracker' in PropertySource 'environmentProperties' with value of type String +2025-06-16 15:24:22 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'tourGuideService' via constructor to bean named 'getGpsUtil' +2025-06-16 15:24:22 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'tourGuideService' via constructor to bean named 'rewardsService' +2025-06-16 15:24:22 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'tourGuideService' via constructor to bean named 'threadPoolExecutor' +2025-06-16 15:24:25 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'tourGuideController' via constructor to bean named 'tourGuideService' +2025-06-16 15:24:25 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'tourGuideController' via constructor to bean named 'rewardsService' +2025-06-16 15:24:25 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'getRewardsService' +2025-06-16 15:24:25 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'getRewardsService' via factory method to bean named 'getGpsUtil' +2025-06-16 15:24:25 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'getRewardsService' via factory method to bean named 'getRewardCentral' +2025-06-16 15:24:25 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'getRewardsService' via factory method to bean named 'threadPoolExecutor' +2025-06-16 15:24:25 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.AutoConfigurationPackages' +2025-06-16 15:24:25 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration' +2025-06-16 15:24:25 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.ssl.SslAutoConfiguration' +2025-06-16 15:24:25 [pool-4-thread-1] DEBUG c.o.tourguide.tracker.Tracker - Begin Tracker. Tracking 100000 users. +2025-06-16 15:24:25 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'spring.ssl-org.springframework.boot.autoconfigure.ssl.SslProperties' +2025-06-16 15:24:25 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.context.properties.BoundConfigurationProperties' +2025-06-16 15:24:25 [pool-4-thread-1] DEBUG c.o.tourguide.tracker.Tracker - Tracker Time Elapsed: 0 seconds. +2025-06-16 15:24:25 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'org.springframework.boot.autoconfigure.ssl.SslAutoConfiguration' via constructor to bean named 'org.springframework.web.context.support.GenericWebApplicationContext@6d64b553' +2025-06-16 15:24:25 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'org.springframework.boot.autoconfigure.ssl.SslAutoConfiguration' via constructor to bean named 'spring.ssl-org.springframework.boot.autoconfigure.ssl.SslProperties' +2025-06-16 15:24:25 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'fileWatcher' +2025-06-16 15:24:25 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'sslPropertiesSslBundleRegistrar' +2025-06-16 15:24:25 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'sslPropertiesSslBundleRegistrar' via factory method to bean named 'fileWatcher' +2025-06-16 15:24:25 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'sslBundleRegistry' +2025-06-16 15:24:25 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration$TomcatWebSocketConfiguration' +2025-06-16 15:24:25 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'websocketServletWebServerCustomizer' +2025-06-16 15:24:25 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration' +2025-06-16 15:24:25 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryConfiguration$EmbeddedTomcat' +2025-06-16 15:24:25 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'tomcatServletWebServerFactory' +2025-06-16 15:24:25 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'servletWebServerFactoryCustomizer' +2025-06-16 15:24:25 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration' +2025-06-16 15:24:25 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'server-org.springframework.boot.autoconfigure.web.ServerProperties' +2025-06-16 15:24:25 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'servletWebServerFactoryCustomizer' via factory method to bean named 'server-org.springframework.boot.autoconfigure.web.ServerProperties' +2025-06-16 15:24:25 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'tomcatServletWebServerFactoryCustomizer' +2025-06-16 15:24:25 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'tomcatServletWebServerFactoryCustomizer' via factory method to bean named 'server-org.springframework.boot.autoconfigure.web.ServerProperties' +2025-06-16 15:24:25 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'localeCharsetMappingsCustomizer' +2025-06-16 15:24:25 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration' +2025-06-16 15:24:25 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration' via constructor to bean named 'server-org.springframework.boot.autoconfigure.web.ServerProperties' +2025-06-16 15:24:25 [main] DEBUG o.a.c.core.AprLifecycleListener - The Apache Tomcat Native library could not be found using names [tcnative-2, libtcnative-2, tcnative-1, libtcnative-1] on the java.library.path [C:\Users\AGOUROU GUSTAVE\AppData\Roaming\Code\User\globalStorage\pleiades.java-extension-pack-jdk\java\17\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\Users\AGOUROU GUSTAVE\AppData\Roaming\Code\User\globalStorage\pleiades.java-extension-pack-jdk\gradle\latest\bin;C:\Program Files\apache-maven-3.9.9\bin;C:\Users\AGOUROU GUSTAVE\AppData\Roaming\Code\User\globalStorage\pleiades.java-extension-pack-jdk\java\17\bin;C:\Users\AGOUROU GUSTAVE\Downloads\apache-maven-3.9.9-bin\apache-maven-3.9.9\bin;C:\Program Files\Eclipse Adoptium\jdk-17.0.15+6\bin;C:\Program Files\Common Files\Oracle\Java\javapath;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Users\AGOUROU GUSTAVE\Downloads\platform-tools_r34.0.3-windows\platform-tools;C:\Program Files\mingw64\bin;C:\Program Files\Git\cmd;C:\Program Files\apache-maven-3.9.9\bin;C:\Program Files\JavaUSBComplete\bin;C:\Windows\Installer\{5D847F4E-C86E-4EEC-8E84-E13E00C48891};C:\Program Files\MySQL\MySQL Server 8.0\bin;C:\Program Files\OpenSSL-Win64\bin;;C:\Users\AGOUROU GUSTAVE\Desktop\Microsoft VS Code\bin;c:\Users\AGOUROU GUSTAVE\AppData\Roaming\Code\User\globalStorage\github.copilot-chat\debugCommand;.]. The errors reported were [Can't load library: C:\Users\AGOUROU GUSTAVE\Downloads\Open Classroom\P8\JavaPathENProject8-master\TourGuide\bin\tcnative-2.dll, Can't load library: C:\Users\AGOUROU GUSTAVE\Downloads\Open Classroom\P8\JavaPathENProject8-master\TourGuide\bin\libtcnative-2.dll, Can't load library: C:\Users\AGOUROU GUSTAVE\Downloads\Open Classroom\P8\JavaPathENProject8-master\TourGuide\bin\tcnative-1.dll, Can't load library: C:\Users\AGOUROU GUSTAVE\Downloads\Open Classroom\P8\JavaPathENProject8-master\TourGuide\bin\libtcnative-1.dll, no tcnative-2 in java.library.path: C:\Users\AGOUROU GUSTAVE\AppData\Roaming\Code\User\globalStorage\pleiades.java-extension-pack-jdk\java\17\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\Users\AGOUROU GUSTAVE\AppData\Roaming\Code\User\globalStorage\pleiades.java-extension-pack-jdk\gradle\latest\bin;C:\Program Files\apache-maven-3.9.9\bin;C:\Users\AGOUROU GUSTAVE\AppData\Roaming\Code\User\globalStorage\pleiades.java-extension-pack-jdk\java\17\bin;C:\Users\AGOUROU GUSTAVE\Downloads\apache-maven-3.9.9-bin\apache-maven-3.9.9\bin;C:\Program Files\Eclipse Adoptium\jdk-17.0.15+6\bin;C:\Program Files\Common Files\Oracle\Java\javapath;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Users\AGOUROU GUSTAVE\Downloads\platform-tools_r34.0.3-windows\platform-tools;C:\Program Files\mingw64\bin;C:\Program Files\Git\cmd;C:\Program Files\apache-maven-3.9.9\bin;C:\Program Files\JavaUSBComplete\bin;C:\Windows\Installer\{5D847F4E-C86E-4EEC-8E84-E13E00C48891};C:\Program Files\MySQL\MySQL Server 8.0\bin;C:\Program Files\OpenSSL-Win64\bin;;C:\Users\AGOUROU GUSTAVE\Desktop\Microsoft VS Code\bin;c:\Users\AGOUROU GUSTAVE\AppData\Roaming\Code\User\globalStorage\github.copilot-chat\debugCommand;., no libtcnative-2 in java.library.path: C:\Users\AGOUROU GUSTAVE\AppData\Roaming\Code\User\globalStorage\pleiades.java-extension-pack-jdk\java\17\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\Users\AGOUROU GUSTAVE\AppData\Roaming\Code\User\globalStorage\pleiades.java-extension-pack-jdk\gradle\latest\bin;C:\Program Files\apache-maven-3.9.9\bin;C:\Users\AGOUROU GUSTAVE\AppData\Roaming\Code\User\globalStorage\pleiades.java-extension-pack-jdk\java\17\bin;C:\Users\AGOUROU GUSTAVE\Downloads\apache-maven-3.9.9-bin\apache-maven-3.9.9\bin;C:\Program Files\Eclipse Adoptium\jdk-17.0.15+6\bin;C:\Program Files\Common Files\Oracle\Java\javapath;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Users\AGOUROU GUSTAVE\Downloads\platform-tools_r34.0.3-windows\platform-tools;C:\Program Files\mingw64\bin;C:\Program Files\Git\cmd;C:\Program Files\apache-maven-3.9.9\bin;C:\Program Files\JavaUSBComplete\bin;C:\Windows\Installer\{5D847F4E-C86E-4EEC-8E84-E13E00C48891};C:\Program Files\MySQL\MySQL Server 8.0\bin;C:\Program Files\OpenSSL-Win64\bin;;C:\Users\AGOUROU GUSTAVE\Desktop\Microsoft VS Code\bin;c:\Users\AGOUROU GUSTAVE\AppData\Roaming\Code\User\globalStorage\github.copilot-chat\debugCommand;., no tcnative-1 in java.library.path: C:\Users\AGOUROU GUSTAVE\AppData\Roaming\Code\User\globalStorage\pleiades.java-extension-pack-jdk\java\17\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\Users\AGOUROU GUSTAVE\AppData\Roaming\Code\User\globalStorage\pleiades.java-extension-pack-jdk\gradle\latest\bin;C:\Program Files\apache-maven-3.9.9\bin;C:\Users\AGOUROU GUSTAVE\AppData\Roaming\Code\User\globalStorage\pleiades.java-extension-pack-jdk\java\17\bin;C:\Users\AGOUROU GUSTAVE\Downloads\apache-maven-3.9.9-bin\apache-maven-3.9.9\bin;C:\Program Files\Eclipse Adoptium\jdk-17.0.15+6\bin;C:\Program Files\Common Files\Oracle\Java\javapath;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Users\AGOUROU GUSTAVE\Downloads\platform-tools_r34.0.3-windows\platform-tools;C:\Program Files\mingw64\bin;C:\Program Files\Git\cmd;C:\Program Files\apache-maven-3.9.9\bin;C:\Program Files\JavaUSBComplete\bin;C:\Windows\Installer\{5D847F4E-C86E-4EEC-8E84-E13E00C48891};C:\Program Files\MySQL\MySQL Server 8.0\bin;C:\Program Files\OpenSSL-Win64\bin;;C:\Users\AGOUROU GUSTAVE\Desktop\Microsoft VS Code\bin;c:\Users\AGOUROU GUSTAVE\AppData\Roaming\Code\User\globalStorage\github.copilot-chat\debugCommand;., no libtcnative-1 in java.library.path: C:\Users\AGOUROU GUSTAVE\AppData\Roaming\Code\User\globalStorage\pleiades.java-extension-pack-jdk\java\17\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\Users\AGOUROU GUSTAVE\AppData\Roaming\Code\User\globalStorage\pleiades.java-extension-pack-jdk\gradle\latest\bin;C:\Program Files\apache-maven-3.9.9\bin;C:\Users\AGOUROU GUSTAVE\AppData\Roaming\Code\User\globalStorage\pleiades.java-extension-pack-jdk\java\17\bin;C:\Users\AGOUROU GUSTAVE\Downloads\apache-maven-3.9.9-bin\apache-maven-3.9.9\bin;C:\Program Files\Eclipse Adoptium\jdk-17.0.15+6\bin;C:\Program Files\Common Files\Oracle\Java\javapath;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Users\AGOUROU GUSTAVE\Downloads\platform-tools_r34.0.3-windows\platform-tools;C:\Program Files\mingw64\bin;C:\Program Files\Git\cmd;C:\Program Files\apache-maven-3.9.9\bin;C:\Program Files\JavaUSBComplete\bin;C:\Windows\Installer\{5D847F4E-C86E-4EEC-8E84-E13E00C48891};C:\Program Files\MySQL\MySQL Server 8.0\bin;C:\Program Files\OpenSSL-Win64\bin;;C:\Users\AGOUROU GUSTAVE\Desktop\Microsoft VS Code\bin;c:\Users\AGOUROU GUSTAVE\AppData\Roaming\Code\User\globalStorage\github.copilot-chat\debugCommand;.] +org.apache.tomcat.jni.LibraryNotFoundError: Can't load library: C:\Users\AGOUROU GUSTAVE\Downloads\Open Classroom\P8\JavaPathENProject8-master\TourGuide\bin\tcnative-2.dll, Can't load library: C:\Users\AGOUROU GUSTAVE\Downloads\Open Classroom\P8\JavaPathENProject8-master\TourGuide\bin\libtcnative-2.dll, Can't load library: C:\Users\AGOUROU GUSTAVE\Downloads\Open Classroom\P8\JavaPathENProject8-master\TourGuide\bin\tcnative-1.dll, Can't load library: C:\Users\AGOUROU GUSTAVE\Downloads\Open Classroom\P8\JavaPathENProject8-master\TourGuide\bin\libtcnative-1.dll, no tcnative-2 in java.library.path: C:\Users\AGOUROU GUSTAVE\AppData\Roaming\Code\User\globalStorage\pleiades.java-extension-pack-jdk\java\17\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\Users\AGOUROU GUSTAVE\AppData\Roaming\Code\User\globalStorage\pleiades.java-extension-pack-jdk\gradle\latest\bin;C:\Program Files\apache-maven-3.9.9\bin;C:\Users\AGOUROU GUSTAVE\AppData\Roaming\Code\User\globalStorage\pleiades.java-extension-pack-jdk\java\17\bin;C:\Users\AGOUROU GUSTAVE\Downloads\apache-maven-3.9.9-bin\apache-maven-3.9.9\bin;C:\Program Files\Eclipse Adoptium\jdk-17.0.15+6\bin;C:\Program Files\Common Files\Oracle\Java\javapath;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Users\AGOUROU GUSTAVE\Downloads\platform-tools_r34.0.3-windows\platform-tools;C:\Program Files\mingw64\bin;C:\Program Files\Git\cmd;C:\Program Files\apache-maven-3.9.9\bin;C:\Program Files\JavaUSBComplete\bin;C:\Windows\Installer\{5D847F4E-C86E-4EEC-8E84-E13E00C48891};C:\Program Files\MySQL\MySQL Server 8.0\bin;C:\Program Files\OpenSSL-Win64\bin;;C:\Users\AGOUROU GUSTAVE\Desktop\Microsoft VS Code\bin;c:\Users\AGOUROU GUSTAVE\AppData\Roaming\Code\User\globalStorage\github.copilot-chat\debugCommand;., no libtcnative-2 in java.library.path: C:\Users\AGOUROU GUSTAVE\AppData\Roaming\Code\User\globalStorage\pleiades.java-extension-pack-jdk\java\17\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\Users\AGOUROU GUSTAVE\AppData\Roaming\Code\User\globalStorage\pleiades.java-extension-pack-jdk\gradle\latest\bin;C:\Program Files\apache-maven-3.9.9\bin;C:\Users\AGOUROU GUSTAVE\AppData\Roaming\Code\User\globalStorage\pleiades.java-extension-pack-jdk\java\17\bin;C:\Users\AGOUROU GUSTAVE\Downloads\apache-maven-3.9.9-bin\apache-maven-3.9.9\bin;C:\Program Files\Eclipse Adoptium\jdk-17.0.15+6\bin;C:\Program Files\Common Files\Oracle\Java\javapath;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Users\AGOUROU GUSTAVE\Downloads\platform-tools_r34.0.3-windows\platform-tools;C:\Program Files\mingw64\bin;C:\Program Files\Git\cmd;C:\Program Files\apache-maven-3.9.9\bin;C:\Program Files\JavaUSBComplete\bin;C:\Windows\Installer\{5D847F4E-C86E-4EEC-8E84-E13E00C48891};C:\Program Files\MySQL\MySQL Server 8.0\bin;C:\Program Files\OpenSSL-Win64\bin;;C:\Users\AGOUROU GUSTAVE\Desktop\Microsoft VS Code\bin;c:\Users\AGOUROU GUSTAVE\AppData\Roaming\Code\User\globalStorage\github.copilot-chat\debugCommand;., no tcnative-1 in java.library.path: C:\Users\AGOUROU GUSTAVE\AppData\Roaming\Code\User\globalStorage\pleiades.java-extension-pack-jdk\java\17\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\Users\AGOUROU GUSTAVE\AppData\Roaming\Code\User\globalStorage\pleiades.java-extension-pack-jdk\gradle\latest\bin;C:\Program Files\apache-maven-3.9.9\bin;C:\Users\AGOUROU GUSTAVE\AppData\Roaming\Code\User\globalStorage\pleiades.java-extension-pack-jdk\java\17\bin;C:\Users\AGOUROU GUSTAVE\Downloads\apache-maven-3.9.9-bin\apache-maven-3.9.9\bin;C:\Program Files\Eclipse Adoptium\jdk-17.0.15+6\bin;C:\Program Files\Common Files\Oracle\Java\javapath;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Users\AGOUROU GUSTAVE\Downloads\platform-tools_r34.0.3-windows\platform-tools;C:\Program Files\mingw64\bin;C:\Program Files\Git\cmd;C:\Program Files\apache-maven-3.9.9\bin;C:\Program Files\JavaUSBComplete\bin;C:\Windows\Installer\{5D847F4E-C86E-4EEC-8E84-E13E00C48891};C:\Program Files\MySQL\MySQL Server 8.0\bin;C:\Program Files\OpenSSL-Win64\bin;;C:\Users\AGOUROU GUSTAVE\Desktop\Microsoft VS Code\bin;c:\Users\AGOUROU GUSTAVE\AppData\Roaming\Code\User\globalStorage\github.copilot-chat\debugCommand;., no libtcnative-1 in java.library.path: C:\Users\AGOUROU GUSTAVE\AppData\Roaming\Code\User\globalStorage\pleiades.java-extension-pack-jdk\java\17\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\Users\AGOUROU GUSTAVE\AppData\Roaming\Code\User\globalStorage\pleiades.java-extension-pack-jdk\gradle\latest\bin;C:\Program Files\apache-maven-3.9.9\bin;C:\Users\AGOUROU GUSTAVE\AppData\Roaming\Code\User\globalStorage\pleiades.java-extension-pack-jdk\java\17\bin;C:\Users\AGOUROU GUSTAVE\Downloads\apache-maven-3.9.9-bin\apache-maven-3.9.9\bin;C:\Program Files\Eclipse Adoptium\jdk-17.0.15+6\bin;C:\Program Files\Common Files\Oracle\Java\javapath;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Users\AGOUROU GUSTAVE\Downloads\platform-tools_r34.0.3-windows\platform-tools;C:\Program Files\mingw64\bin;C:\Program Files\Git\cmd;C:\Program Files\apache-maven-3.9.9\bin;C:\Program Files\JavaUSBComplete\bin;C:\Windows\Installer\{5D847F4E-C86E-4EEC-8E84-E13E00C48891};C:\Program Files\MySQL\MySQL Server 8.0\bin;C:\Program Files\OpenSSL-Win64\bin;;C:\Users\AGOUROU GUSTAVE\Desktop\Microsoft VS Code\bin;c:\Users\AGOUROU GUSTAVE\AppData\Roaming\Code\User\globalStorage\github.copilot-chat\debugCommand;. + at org.apache.tomcat.jni.Library.(Library.java:91) + at org.apache.tomcat.jni.Library.initialize(Library.java:147) + at org.apache.catalina.core.AprLifecycleListener.init(AprLifecycleListener.java:211) + at org.apache.catalina.core.AprLifecycleListener.isAprAvailable(AprLifecycleListener.java:113) + at org.springframework.boot.autoconfigure.web.servlet.TomcatServletWebServerFactoryCustomizer.isAprAvailable(TomcatServletWebServerFactoryCustomizer.java:90) + at org.springframework.boot.autoconfigure.web.servlet.TomcatServletWebServerFactoryCustomizer.getUseApr(TomcatServletWebServerFactoryCustomizer.java:81) + at org.springframework.boot.autoconfigure.web.servlet.TomcatServletWebServerFactoryCustomizer.customize(TomcatServletWebServerFactoryCustomizer.java:63) + at org.springframework.boot.autoconfigure.web.servlet.TomcatServletWebServerFactoryCustomizer.customize(TomcatServletWebServerFactoryCustomizer.java:38) + at org.springframework.boot.web.server.WebServerFactoryCustomizerBeanPostProcessor.lambda$postProcessBeforeInitialization$0(WebServerFactoryCustomizerBeanPostProcessor.java:72) + at org.springframework.boot.util.LambdaSafe$Callbacks.lambda$invoke$0(LambdaSafe.java:287) + at org.springframework.boot.util.LambdaSafe$LambdaSafeCallback.invoke(LambdaSafe.java:159) + at org.springframework.boot.util.LambdaSafe$Callbacks.lambda$invoke$1(LambdaSafe.java:286) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at java.base/java.util.Collections$UnmodifiableCollection.forEach(Collections.java:1092) + at org.springframework.boot.util.LambdaSafe$Callbacks.invoke(LambdaSafe.java:286) + at org.springframework.boot.web.server.WebServerFactoryCustomizerBeanPostProcessor.postProcessBeforeInitialization(WebServerFactoryCustomizerBeanPostProcessor.java:72) + at org.springframework.boot.web.server.WebServerFactoryCustomizerBeanPostProcessor.postProcessBeforeInitialization(WebServerFactoryCustomizerBeanPostProcessor.java:58) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:429) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1818) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:607) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:529) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:339) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:373) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:337) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.instantiateSingleton(DefaultListableBeanFactory.java:1222) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingleton(DefaultListableBeanFactory.java:1188) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:1123) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:987) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:753) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) + at org.springframework.boot.test.context.SpringBootContextLoader.lambda$loadContext$3(SpringBootContextLoader.java:144) + at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:58) + at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:46) + at org.springframework.boot.SpringApplication.withHook(SpringApplication.java:1462) + at org.springframework.boot.test.context.SpringBootContextLoader$ContextLoaderHook.run(SpringBootContextLoader.java:563) + at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:144) + at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:110) + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:225) + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:152) + at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:130) + at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:200) + at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:139) + at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260) + at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:159) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$11(ClassBasedTestDescriptor.java:378) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:383) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$12(ClassBasedTestDescriptor.java:378) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) + at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) + at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) + at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) + at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) + at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:377) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$7(ClassBasedTestDescriptor.java:290) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:289) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$5(ClassBasedTestDescriptor.java:279) + at java.base/java.util.Optional.orElseGet(Optional.java:364) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$6(ClassBasedTestDescriptor.java:278) + at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:31) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$1(TestMethodTestDescriptor.java:105) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:104) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:68) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$2(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:198) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:169) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:93) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:58) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:141) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:57) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85) + at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47) + at org.apache.maven.surefire.junitplatform.LazyLauncher.execute(LazyLauncher.java:56) + at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.execute(JUnitPlatformProvider.java:194) + at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invokeAllTests(JUnitPlatformProvider.java:150) + at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invoke(JUnitPlatformProvider.java:124) + at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:385) + at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:162) + at org.apache.maven.surefire.booter.ForkedBooter.run(ForkedBooter.java:507) + at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:495) +2025-06-16 15:24:26 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'errorPageCustomizer' +2025-06-16 15:24:26 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration' +2025-06-16 15:24:26 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration' via constructor to bean named 'server-org.springframework.boot.autoconfigure.web.ServerProperties' +2025-06-16 15:24:26 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'dispatcherServletRegistration' +2025-06-16 15:24:26 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration$DispatcherServletRegistrationConfiguration' +2025-06-16 15:24:26 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'dispatcherServlet' +2025-06-16 15:24:26 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration$DispatcherServletConfiguration' +2025-06-16 15:24:26 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'spring.mvc-org.springframework.boot.autoconfigure.web.servlet.WebMvcProperties' +2025-06-16 15:24:26 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'dispatcherServlet' via factory method to bean named 'spring.mvc-org.springframework.boot.autoconfigure.web.servlet.WebMvcProperties' +2025-06-16 15:24:26 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'dispatcherServletRegistration' via factory method to bean named 'dispatcherServlet' +2025-06-16 15:24:26 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'dispatcherServletRegistration' via factory method to bean named 'spring.mvc-org.springframework.boot.autoconfigure.web.servlet.WebMvcProperties' +2025-06-16 15:24:26 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'multipartConfigElement' +2025-06-16 15:24:26 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration' +2025-06-16 15:24:26 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'spring.servlet.multipart-org.springframework.boot.autoconfigure.web.servlet.MultipartProperties' +2025-06-16 15:24:26 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration' via constructor to bean named 'spring.servlet.multipart-org.springframework.boot.autoconfigure.web.servlet.MultipartProperties' +2025-06-16 15:24:26 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'errorPageCustomizer' via factory method to bean named 'dispatcherServletRegistration' +2025-06-16 15:24:26 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration' +2025-06-16 15:24:26 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.task.TaskExecutorConfigurations$ThreadPoolTaskExecutorBuilderConfiguration' +2025-06-16 15:24:26 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'threadPoolTaskExecutorBuilder' +2025-06-16 15:24:26 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'spring.task.execution-org.springframework.boot.autoconfigure.task.TaskExecutionProperties' +2025-06-16 15:24:26 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'threadPoolTaskExecutorBuilder' via factory method to bean named 'spring.task.execution-org.springframework.boot.autoconfigure.task.TaskExecutionProperties' +2025-06-16 15:24:26 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.task.TaskExecutorConfigurations$SimpleAsyncTaskExecutorBuilderConfiguration' +2025-06-16 15:24:26 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'org.springframework.boot.autoconfigure.task.TaskExecutorConfigurations$SimpleAsyncTaskExecutorBuilderConfiguration' via constructor to bean named 'spring.task.execution-org.springframework.boot.autoconfigure.task.TaskExecutionProperties' +2025-06-16 15:24:26 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'simpleAsyncTaskExecutorBuilder' +2025-06-16 15:24:26 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration' +2025-06-16 15:24:26 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration' +2025-06-16 15:24:26 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'defaultValidator' +2025-06-16 15:24:26 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'defaultValidator' via factory method to bean named 'org.springframework.web.context.support.GenericWebApplicationContext@6d64b553' +2025-06-16 15:24:26 [main] DEBUG o.h.v.m.ResourceBundleMessageInterpolator - Loaded expression factory via original TCCL +2025-06-16 15:24:26 [main] DEBUG o.h.v.i.e.AbstractConfigurationImpl - Setting custom MessageInterpolator of type org.springframework.validation.beanvalidation.LocaleContextMessageInterpolator +2025-06-16 15:24:26 [main] DEBUG o.h.v.i.e.AbstractConfigurationImpl - Setting custom ConstraintValidatorFactory of type org.springframework.validation.beanvalidation.SpringConstraintValidatorFactory +2025-06-16 15:24:26 [main] DEBUG o.h.v.i.x.config.ValidationXmlParser - Trying to load META-INF/validation.xml for XML based Validator configuration. +2025-06-16 15:24:26 [main] DEBUG o.h.v.i.x.c.ResourceLoaderHelper - Trying to load META-INF/validation.xml via user class loader +2025-06-16 15:24:26 [main] DEBUG o.h.v.i.x.c.ResourceLoaderHelper - Trying to load META-INF/validation.xml via TCCL +2025-06-16 15:24:26 [main] DEBUG o.h.v.i.x.c.ResourceLoaderHelper - Trying to load META-INF/validation.xml via Hibernate Validator's class loader +2025-06-16 15:24:26 [main] DEBUG o.h.v.i.x.config.ValidationXmlParser - No META-INF/validation.xml found. Using annotation based configuration only. +2025-06-16 15:24:26 [main] DEBUG o.h.v.i.e.r.TraversableResolvers - Cannot find jakarta.persistence.Persistence on classpath. Assuming non JPA 2 environment. All properties will per default be traversable. +2025-06-16 15:24:26 [main] DEBUG o.h.v.i.e.ValidatorFactoryConfigurationHelper - HV000252: Using org.hibernate.validator.internal.engine.DefaultPropertyNodeNameProvider as property node name provider. +2025-06-16 15:24:26 [main] DEBUG o.h.v.i.e.ValidatorFactoryConfigurationHelper - HV000234: Using org.springframework.validation.beanvalidation.LocaleContextMessageInterpolator as ValidatorFactory-scoped message interpolator. +2025-06-16 15:24:26 [main] DEBUG o.h.v.i.e.ValidatorFactoryConfigurationHelper - HV000234: Using org.hibernate.validator.internal.engine.resolver.TraverseAllTraversableResolver as ValidatorFactory-scoped traversable resolver. +2025-06-16 15:24:26 [main] DEBUG o.h.v.i.e.ValidatorFactoryConfigurationHelper - HV000234: Using org.hibernate.validator.internal.util.ExecutableParameterNameProvider as ValidatorFactory-scoped parameter name provider. +2025-06-16 15:24:26 [main] DEBUG o.h.v.i.e.ValidatorFactoryConfigurationHelper - HV000234: Using org.hibernate.validator.internal.engine.DefaultClockProvider as ValidatorFactory-scoped clock provider. +2025-06-16 15:24:26 [main] DEBUG o.h.v.i.e.ValidatorFactoryConfigurationHelper - HV000234: Using org.hibernate.validator.internal.engine.scripting.DefaultScriptEvaluatorFactory as ValidatorFactory-scoped script evaluator factory. +2025-06-16 15:24:26 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration' +2025-06-16 15:24:26 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'error' +2025-06-16 15:24:26 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'beanNameViewResolver' +2025-06-16 15:24:26 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration$DefaultErrorViewResolverConfiguration' +2025-06-16 15:24:26 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'spring.web-org.springframework.boot.autoconfigure.web.WebProperties' +2025-06-16 15:24:26 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration$DefaultErrorViewResolverConfiguration' via constructor to bean named 'org.springframework.web.context.support.GenericWebApplicationContext@6d64b553' +2025-06-16 15:24:26 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration$DefaultErrorViewResolverConfiguration' via constructor to bean named 'spring.web-org.springframework.boot.autoconfigure.web.WebProperties' +2025-06-16 15:24:26 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'conventionErrorViewResolver' +2025-06-16 15:24:27 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'errorAttributes' +2025-06-16 15:24:27 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'basicErrorController' +2025-06-16 15:24:27 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'basicErrorController' via factory method to bean named 'errorAttributes' +2025-06-16 15:24:27 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$EnableWebMvcConfiguration' +2025-06-16 15:24:27 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$EnableWebMvcConfiguration' via constructor to bean named 'spring.mvc-org.springframework.boot.autoconfigure.web.servlet.WebMvcProperties' +2025-06-16 15:24:27 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$EnableWebMvcConfiguration' via constructor to bean named 'spring.web-org.springframework.boot.autoconfigure.web.WebProperties' +2025-06-16 15:24:27 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$EnableWebMvcConfiguration' via constructor to bean named 'org.springframework.beans.factory.support.DefaultListableBeanFactory@6093d508' +2025-06-16 15:24:27 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter' +2025-06-16 15:24:27 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter' via constructor to bean named 'spring.web-org.springframework.boot.autoconfigure.web.WebProperties' +2025-06-16 15:24:27 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter' via constructor to bean named 'spring.mvc-org.springframework.boot.autoconfigure.web.servlet.WebMvcProperties' +2025-06-16 15:24:27 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter' via constructor to bean named 'org.springframework.beans.factory.support.DefaultListableBeanFactory@6093d508' +2025-06-16 15:24:27 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'endpointObjectMapperWebMvcConfigurer' +2025-06-16 15:24:27 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'endpointObjectMapper' +2025-06-16 15:24:27 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.actuate.autoconfigure.endpoint.jackson.JacksonEndpointAutoConfiguration' +2025-06-16 15:24:27 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'endpointObjectMapperWebMvcConfigurer' via factory method to bean named 'endpointObjectMapper' +2025-06-16 15:24:27 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'welcomePageHandlerMapping' +2025-06-16 15:24:27 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'mvcConversionService' +2025-06-16 15:24:27 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'mvcResourceUrlProvider' +2025-06-16 15:24:27 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'welcomePageHandlerMapping' via factory method to bean named 'org.springframework.web.context.support.GenericWebApplicationContext@6d64b553' +2025-06-16 15:24:27 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'welcomePageHandlerMapping' via factory method to bean named 'mvcConversionService' +2025-06-16 15:24:27 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'welcomePageHandlerMapping' via factory method to bean named 'mvcResourceUrlProvider' +2025-06-16 15:24:27 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'welcomePageNotAcceptableHandlerMapping' +2025-06-16 15:24:27 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'welcomePageNotAcceptableHandlerMapping' via factory method to bean named 'org.springframework.web.context.support.GenericWebApplicationContext@6d64b553' +2025-06-16 15:24:27 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'welcomePageNotAcceptableHandlerMapping' via factory method to bean named 'mvcConversionService' +2025-06-16 15:24:27 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'welcomePageNotAcceptableHandlerMapping' via factory method to bean named 'mvcResourceUrlProvider' +2025-06-16 15:24:27 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'localeResolver' +2025-06-16 15:24:27 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'themeResolver' +2025-06-16 15:24:27 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'flashMapManager' +2025-06-16 15:24:27 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'viewNameTranslator' +2025-06-16 15:24:27 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'mvcValidator' +2025-06-16 15:24:27 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'mvcContentNegotiationManager' +2025-06-16 15:24:27 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'requestMappingHandlerMapping' +2025-06-16 15:24:27 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'requestMappingHandlerMapping' via factory method to bean named 'mvcContentNegotiationManager' +2025-06-16 15:24:27 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'requestMappingHandlerMapping' via factory method to bean named 'mvcConversionService' +2025-06-16 15:24:27 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'requestMappingHandlerMapping' via factory method to bean named 'mvcResourceUrlProvider' +2025-06-16 15:24:28 [main] DEBUG _.s.w.s.HandlerMapping.Mappings - + c.o.t.c.TourGuideController: + { [/]}: index() + { [/getLocation]}: getLocation(String) + { [/getTripDeals]}: getTripDeals(String) + { [/addUser]}: addUser(String,String,String) + { [/getNearbyAttractions]}: getNearbyAttractions(String) + { [/getRewards]}: getRewards(String) +2025-06-16 15:24:28 [main] DEBUG _.s.w.s.HandlerMapping.Mappings - + o.s.b.a.w.s.e.BasicErrorController: + { [/error]}: error(HttpServletRequest) + { [/error], produces [text/html]}: errorHtml(HttpServletRequest,HttpServletResponse) +2025-06-16 15:24:28 [main] DEBUG o.s.w.s.m.m.a.RequestMappingHandlerMapping - 8 mappings in 'requestMappingHandlerMapping' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'mvcPatternParser' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'mvcUrlPathHelper' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'mvcPathMatcher' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'viewControllerHandlerMapping' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'viewControllerHandlerMapping' via factory method to bean named 'mvcConversionService' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'viewControllerHandlerMapping' via factory method to bean named 'mvcResourceUrlProvider' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'beanNameHandlerMapping' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'beanNameHandlerMapping' via factory method to bean named 'mvcConversionService' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'beanNameHandlerMapping' via factory method to bean named 'mvcResourceUrlProvider' +2025-06-16 15:24:28 [main] DEBUG _.s.w.s.HandlerMapping.Mappings - 'beanNameHandlerMapping' {} +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'routerFunctionMapping' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'routerFunctionMapping' via factory method to bean named 'mvcConversionService' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'routerFunctionMapping' via factory method to bean named 'mvcResourceUrlProvider' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'messageConverters' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'stringHttpMessageConverter' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration$StringHttpMessageConverterConfiguration' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'stringHttpMessageConverter' via factory method to bean named 'environment' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'mappingJackson2HttpMessageConverter' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.http.JacksonHttpMessageConvertersConfiguration$MappingJackson2HttpMessageConverterConfiguration' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'jacksonObjectMapper' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration$JacksonObjectMapperConfiguration' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration$JacksonObjectMapperBuilderConfiguration' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'standardJacksonObjectMapperBuilderCustomizer' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration$Jackson2ObjectMapperBuilderCustomizerConfiguration' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'spring.jackson-org.springframework.boot.autoconfigure.jackson.JacksonProperties' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'standardJacksonObjectMapperBuilderCustomizer' via factory method to bean named 'spring.jackson-org.springframework.boot.autoconfigure.jackson.JacksonProperties' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'parameterNamesModule' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration$ParameterNamesModuleConfiguration' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'jsonMixinModule' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration$JacksonMixinConfiguration' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'jsonMixinModuleEntries' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'jsonMixinModuleEntries' via factory method to bean named 'org.springframework.web.context.support.GenericWebApplicationContext@6d64b553' +2025-06-16 15:24:28 [main] DEBUG o.s.b.a.AutoConfigurationPackages - @EnableAutoConfiguration was declared on a class in the package 'com.openclassrooms.tourguide'. Automatic @Repository and @Entity scanning is enabled. +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'jsonMixinModule' via factory method to bean named 'org.springframework.web.context.support.GenericWebApplicationContext@6d64b553' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'jsonMixinModule' via factory method to bean named 'jsonMixinModuleEntries' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'jsonComponentModule' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'jacksonObjectMapperBuilder' via factory method to bean named 'org.springframework.web.context.support.GenericWebApplicationContext@6d64b553' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'jacksonObjectMapperBuilder' via factory method to bean named 'standardJacksonObjectMapperBuilderCustomizer' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'jacksonObjectMapper' via factory method to bean named 'jacksonObjectMapperBuilder' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'mappingJackson2HttpMessageConverter' via factory method to bean named 'jacksonObjectMapper' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'resourceHandlerMapping' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'resourceHandlerMapping' via factory method to bean named 'mvcContentNegotiationManager' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'resourceHandlerMapping' via factory method to bean named 'mvcConversionService' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'resourceHandlerMapping' via factory method to bean named 'mvcResourceUrlProvider' +2025-06-16 15:24:28 [main] DEBUG _.s.w.s.HandlerMapping.Mappings - 'resourceHandlerMapping' {/webjars/**=ResourceHttpRequestHandler [classpath [META-INF/resources/webjars/]], /**=ResourceHttpRequestHandler [classpath [META-INF/resources/], classpath [resources/], classpath [static/], classpath [public/], ServletContext [/]]} +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'defaultServletHandlerMapping' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'requestMappingHandlerAdapter' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'requestMappingHandlerAdapter' via factory method to bean named 'mvcContentNegotiationManager' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'requestMappingHandlerAdapter' via factory method to bean named 'mvcConversionService' +2025-06-16 15:24:28 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'requestMappingHandlerAdapter' via factory method to bean named 'mvcValidator' +2025-06-16 15:24:29 [main] DEBUG o.s.w.s.m.m.a.RequestMappingHandlerAdapter - ControllerAdvice beans: 0 @ModelAttribute, 0 @InitBinder, 1 RequestBodyAdvice, 1 ResponseBodyAdvice +2025-06-16 15:24:29 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'mvcViewResolver' +2025-06-16 15:24:29 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'mvcViewResolver' via factory method to bean named 'mvcContentNegotiationManager' +2025-06-16 15:24:29 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'defaultViewResolver' +2025-06-16 15:24:29 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'viewResolver' +2025-06-16 15:24:29 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'viewResolver' via factory method to bean named 'org.springframework.beans.factory.support.DefaultListableBeanFactory@6093d508' +2025-06-16 15:24:29 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'viewResolver' +2025-06-16 15:24:29 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'handlerFunctionAdapter' +2025-06-16 15:24:29 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'mvcUriComponentsContributor' +2025-06-16 15:24:29 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'mvcUriComponentsContributor' via factory method to bean named 'mvcConversionService' +2025-06-16 15:24:29 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'mvcUriComponentsContributor' via factory method to bean named 'requestMappingHandlerAdapter' +2025-06-16 15:24:29 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'httpRequestHandlerAdapter' +2025-06-16 15:24:29 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'simpleControllerHandlerAdapter' +2025-06-16 15:24:29 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'handlerExceptionResolver' +2025-06-16 15:24:29 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'handlerExceptionResolver' via factory method to bean named 'mvcContentNegotiationManager' +2025-06-16 15:24:29 [main] DEBUG o.s.w.s.m.m.a.ExceptionHandlerExceptionResolver - ControllerAdvice beans: 0 @ExceptionHandler, 1 ResponseBodyAdvice +2025-06-16 15:24:29 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'requestContextFilter' +2025-06-16 15:24:29 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration' +2025-06-16 15:24:29 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'formContentFilter' +2025-06-16 15:24:29 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.availability.ApplicationAvailabilityAutoConfiguration' +2025-06-16 15:24:29 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'applicationAvailability' +2025-06-16 15:24:29 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.actuate.autoconfigure.availability.AvailabilityHealthContributorAutoConfiguration' +2025-06-16 15:24:29 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.actuate.autoconfigure.health.HealthEndpointConfiguration' +2025-06-16 15:24:29 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'healthStatusAggregator' +2025-06-16 15:24:29 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'management.endpoint.health-org.springframework.boot.actuate.autoconfigure.health.HealthEndpointProperties' +2025-06-16 15:24:29 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'healthStatusAggregator' via factory method to bean named 'management.endpoint.health-org.springframework.boot.actuate.autoconfigure.health.HealthEndpointProperties' +2025-06-16 15:24:29 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'healthHttpCodeStatusMapper' +2025-06-16 15:24:29 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'healthHttpCodeStatusMapper' via factory method to bean named 'management.endpoint.health-org.springframework.boot.actuate.autoconfigure.health.HealthEndpointProperties' +2025-06-16 15:24:29 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'healthEndpointGroups' +2025-06-16 15:24:29 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'healthEndpointGroups' via factory method to bean named 'org.springframework.web.context.support.GenericWebApplicationContext@6d64b553' +2025-06-16 15:24:29 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'healthEndpointGroups' via factory method to bean named 'management.endpoint.health-org.springframework.boot.actuate.autoconfigure.health.HealthEndpointProperties' +2025-06-16 15:24:29 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'healthContributorRegistry' +2025-06-16 15:24:29 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'sslHealthIndicator' +2025-06-16 15:24:29 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.actuate.autoconfigure.ssl.SslHealthContributorAutoConfiguration' +2025-06-16 15:24:29 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'sslInfo' +2025-06-16 15:24:29 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'management.health.ssl-org.springframework.boot.actuate.autoconfigure.ssl.SslHealthIndicatorProperties' +2025-06-16 15:24:29 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'sslInfo' via factory method to bean named 'sslBundleRegistry' +2025-06-16 15:24:29 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'sslInfo' via factory method to bean named 'management.health.ssl-org.springframework.boot.actuate.autoconfigure.ssl.SslHealthIndicatorProperties' +2025-06-16 15:24:29 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'sslHealthIndicator' via factory method to bean named 'sslInfo' +2025-06-16 15:24:29 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'diskSpaceHealthIndicator' +2025-06-16 15:24:29 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.actuate.autoconfigure.system.DiskSpaceHealthContributorAutoConfiguration' +2025-06-16 15:24:29 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'management.health.diskspace-org.springframework.boot.actuate.autoconfigure.system.DiskSpaceHealthIndicatorProperties' +2025-06-16 15:24:29 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'diskSpaceHealthIndicator' via factory method to bean named 'management.health.diskspace-org.springframework.boot.actuate.autoconfigure.system.DiskSpaceHealthIndicatorProperties' +2025-06-16 15:24:29 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'pingHealthContributor' +2025-06-16 15:24:29 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.actuate.autoconfigure.health.HealthContributorAutoConfiguration' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'healthContributorRegistry' via factory method to bean named 'org.springframework.web.context.support.GenericWebApplicationContext@6d64b553' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'healthContributorRegistry' via factory method to bean named 'healthEndpointGroups' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'healthContributorRegistry' via factory method to bean named 'sslHealthIndicator' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'healthContributorRegistry' via factory method to bean named 'diskSpaceHealthIndicator' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'healthContributorRegistry' via factory method to bean named 'pingHealthContributor' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'healthEndpointGroupMembershipValidator' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'healthEndpointGroupMembershipValidator' via factory method to bean named 'management.endpoint.health-org.springframework.boot.actuate.autoconfigure.health.HealthEndpointProperties' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'healthEndpointGroupMembershipValidator' via factory method to bean named 'healthContributorRegistry' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'healthEndpoint' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'healthEndpoint' via factory method to bean named 'healthContributorRegistry' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'healthEndpoint' via factory method to bean named 'healthEndpointGroups' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'healthEndpoint' via factory method to bean named 'management.endpoint.health-org.springframework.boot.actuate.autoconfigure.health.HealthEndpointProperties' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.actuate.autoconfigure.health.HealthEndpointWebExtensionConfiguration$MvcAdditionalHealthEndpointPathsConfiguration' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'healthEndpointWebMvcHandlerMapping' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'webEndpointDiscoverer' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointAutoConfiguration' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'management.endpoints.web-org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointAutoConfiguration' via constructor to bean named 'org.springframework.web.context.support.GenericWebApplicationContext@6d64b553' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointAutoConfiguration' via constructor to bean named 'management.endpoints.web-org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'endpointOperationParameterMapper' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.actuate.autoconfigure.endpoint.EndpointAutoConfiguration' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'endpointMediaTypes' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'webEndpointDiscoverer' via factory method to bean named 'endpointOperationParameterMapper' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'webEndpointDiscoverer' via factory method to bean named 'endpointMediaTypes' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'webEndpointPathMapper' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'endpointCachingOperationInvokerAdvisor' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'endpointCachingOperationInvokerAdvisor' via factory method to bean named 'environment' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'webExposeExcludePropertyEndpointFilter' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'webAccessPropertiesOperationFilter' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'propertiesEndpointAccessResolver' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'propertiesEndpointAccessResolver' via factory method to bean named 'environment' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'webAccessPropertiesOperationFilter' via factory method to bean named 'propertiesEndpointAccessResolver' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'healthEndpointWebMvcHandlerMapping' via factory method to bean named 'webEndpointDiscoverer' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'healthEndpointWebMvcHandlerMapping' via factory method to bean named 'healthEndpointGroups' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'healthEndpointWebExtension' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.actuate.autoconfigure.health.HealthEndpointWebExtensionConfiguration' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'healthEndpointWebExtension' via factory method to bean named 'healthContributorRegistry' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'healthEndpointWebExtension' via factory method to bean named 'healthEndpointGroups' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'healthEndpointWebExtension' via factory method to bean named 'management.endpoint.health-org.springframework.boot.actuate.autoconfigure.health.HealthEndpointProperties' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.actuate.autoconfigure.health.HealthEndpointAutoConfiguration' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'spring.info-org.springframework.boot.autoconfigure.info.ProjectInfoProperties' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration' via constructor to bean named 'spring.info-org.springframework.boot.autoconfigure.info.ProjectInfoProperties' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.actuate.autoconfigure.info.InfoContributorAutoConfiguration' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'management.info-org.springframework.boot.actuate.autoconfigure.info.InfoContributorProperties' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.actuate.autoconfigure.web.servlet.ServletManagementContextAutoConfiguration' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'servletWebChildContextFactory' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'managementServletContext' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'managementServletContext' via factory method to bean named 'management.endpoints.web-org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointAutoConfiguration$WebEndpointServletConfiguration' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'servletEndpointDiscoverer' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'servletEndpointDiscoverer' via factory method to bean named 'org.springframework.web.context.support.GenericWebApplicationContext@6d64b553' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'servletExposeExcludePropertyEndpointFilter' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.actuate.autoconfigure.endpoint.web.ServletEndpointManagementContextConfiguration' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'servletExposeExcludePropertyEndpointFilter' via factory method to bean named 'management.endpoints.web-org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'controllerEndpointDiscoverer' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'controllerExposeExcludePropertyEndpointFilter' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'pathMappedEndpoints' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'pathMappedEndpoints' via factory method to bean named 'servletEndpointDiscoverer' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'pathMappedEndpoints' via factory method to bean named 'webEndpointDiscoverer' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'pathMappedEndpoints' via factory method to bean named 'controllerEndpointDiscoverer' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'micrometerClock' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'propertiesMeterFilter' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'management.metrics-org.springframework.boot.actuate.autoconfigure.metrics.MetricsProperties' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'propertiesMeterFilter' via factory method to bean named 'management.metrics-org.springframework.boot.actuate.autoconfigure.metrics.MetricsProperties' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'meterRegistryCloser' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'simpleMeterRegistry' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'simpleConfig' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'management.simple.metrics.export-org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleProperties' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'simpleConfig' via factory method to bean named 'management.simple.metrics.export-org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleProperties' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'simpleMeterRegistry' via factory method to bean named 'simpleConfig' +2025-06-16 15:24:30 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'simpleMeterRegistry' via factory method to bean named 'micrometerClock' +2025-06-16 15:24:31 [main] DEBUG i.m.c.u.i.l.InternalLoggerFactory - Using SLF4J as the default logging framework +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'metricsHttpClientUriTagFilter' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.actuate.autoconfigure.observation.web.client.HttpClientObservationsAutoConfiguration$MeterFilterConfiguration' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'management.observations-org.springframework.boot.actuate.autoconfigure.observation.ObservationProperties' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'metricsHttpClientUriTagFilter' via factory method to bean named 'management.observations-org.springframework.boot.actuate.autoconfigure.observation.ObservationProperties' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'metricsHttpClientUriTagFilter' via factory method to bean named 'management.metrics-org.springframework.boot.actuate.autoconfigure.metrics.MetricsProperties' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'metricsHttpServerUriTagFilter' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.actuate.autoconfigure.observation.web.servlet.WebMvcObservationAutoConfiguration$MeterFilterConfiguration' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'metricsHttpServerUriTagFilter' via factory method to bean named 'management.observations-org.springframework.boot.actuate.autoconfigure.observation.ObservationProperties' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'metricsHttpServerUriTagFilter' via factory method to bean named 'management.metrics-org.springframework.boot.actuate.autoconfigure.metrics.MetricsProperties' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.actuate.autoconfigure.metrics.CompositeMeterRegistryAutoConfiguration' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.actuate.autoconfigure.metrics.JvmMetricsAutoConfiguration' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'jvmGcMetrics' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'jvmHeapPressureMetrics' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'jvmMemoryMetrics' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'jvmThreadMetrics' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'classLoaderMetrics' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'jvmInfoMetrics' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'jvmCompilationMetrics' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.actuate.autoconfigure.metrics.LogbackMetricsAutoConfiguration' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'logbackMetrics' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.actuate.autoconfigure.metrics.SystemMetricsAutoConfiguration' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'uptimeMetrics' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'processorMetrics' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'fileDescriptorMetrics' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'diskSpaceMetrics' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'diskSpaceMetrics' via factory method to bean named 'management.metrics-org.springframework.boot.actuate.autoconfigure.metrics.MetricsProperties' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.actuate.autoconfigure.metrics.integration.IntegrationMetricsAutoConfiguration' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.actuate.autoconfigure.metrics.startup.StartupTimeMetricsListenerAutoConfiguration' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'startupTimeMetrics' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'startupTimeMetrics' via factory method to bean named 'simpleMeterRegistry' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.task.TaskSchedulingConfigurations$ThreadPoolTaskSchedulerBuilderConfiguration' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'threadPoolTaskSchedulerBuilder' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'spring.task.scheduling-org.springframework.boot.autoconfigure.task.TaskSchedulingProperties' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'threadPoolTaskSchedulerBuilder' via factory method to bean named 'spring.task.scheduling-org.springframework.boot.autoconfigure.task.TaskSchedulingProperties' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.task.TaskSchedulingConfigurations$SimpleAsyncTaskSchedulerBuilderConfiguration' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'org.springframework.boot.autoconfigure.task.TaskSchedulingConfigurations$SimpleAsyncTaskSchedulerBuilderConfiguration' via constructor to bean named 'spring.task.scheduling-org.springframework.boot.autoconfigure.task.TaskSchedulingProperties' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'simpleAsyncTaskSchedulerBuilder' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.actuate.autoconfigure.metrics.task.TaskExecutorMetricsAutoConfiguration' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'eagerTaskExecutorMetrics' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.actuate.autoconfigure.metrics.web.tomcat.TomcatMetricsAutoConfiguration' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'tomcatMetricsBinder' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'tomcatMetricsBinder' via factory method to bean named 'simpleMeterRegistry' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.actuate.autoconfigure.observation.ObservationAutoConfiguration$MeterObservationHandlerConfiguration$OnlyMetricsMeterObservationHandlerConfiguration' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'defaultMeterObservationHandler' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'defaultMeterObservationHandler' via factory method to bean named 'simpleMeterRegistry' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'defaultMeterObservationHandler' via factory method to bean named 'management.observations-org.springframework.boot.actuate.autoconfigure.observation.ObservationProperties' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.actuate.autoconfigure.observation.ObservationAutoConfiguration$MeterObservationHandlerConfiguration' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.actuate.autoconfigure.observation.ObservationAutoConfiguration$OnlyMetricsConfiguration' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'metricsObservationHandlerGrouping' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.actuate.autoconfigure.observation.ObservationAutoConfiguration' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'observationRegistry' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'propertiesObservationFilter' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'propertiesObservationFilter' via factory method to bean named 'management.observations-org.springframework.boot.actuate.autoconfigure.observation.ObservationProperties' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.http.JacksonHttpMessageConvertersConfiguration' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.http.client.HttpClientAutoConfiguration' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'clientHttpRequestFactoryBuilder' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'spring.http.client-org.springframework.boot.autoconfigure.http.client.HttpClientProperties' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'clientHttpRequestFactoryBuilder' via factory method to bean named 'spring.http.client-org.springframework.boot.autoconfigure.http.client.HttpClientProperties' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'clientHttpRequestFactorySettings' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'clientHttpRequestFactorySettings' via factory method to bean named 'spring.http.client-org.springframework.boot.autoconfigure.http.client.HttpClientProperties' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'httpMessageConvertersRestClientCustomizer' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'restClientSsl' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'restClientSsl' via factory method to bean named 'sslBundleRegistry' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'restClientBuilderConfigurer' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'observationRestClientCustomizer' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.actuate.autoconfigure.observation.web.client.RestClientObservationConfiguration' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'observationRestClientCustomizer' via factory method to bean named 'observationRegistry' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'observationRestClientCustomizer' via factory method to bean named 'management.observations-org.springframework.boot.actuate.autoconfigure.observation.ObservationProperties' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.actuate.autoconfigure.observation.web.client.RestTemplateObservationConfiguration' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'observationRestTemplateCustomizer' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'observationRestTemplateCustomizer' via factory method to bean named 'observationRegistry' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'observationRestTemplateCustomizer' via factory method to bean named 'management.observations-org.springframework.boot.actuate.autoconfigure.observation.ObservationProperties' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.actuate.autoconfigure.observation.web.client.HttpClientObservationsAutoConfiguration' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.actuate.autoconfigure.observation.web.servlet.WebMvcObservationAutoConfiguration' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'webMvcObservationFilter' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'webMvcObservationFilter' via factory method to bean named 'observationRegistry' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'webMvcObservationFilter' via factory method to bean named 'management.observations-org.springframework.boot.actuate.autoconfigure.observation.ObservationProperties' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.actuate.autoconfigure.scheduling.ScheduledTasksObservabilityAutoConfiguration' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'observabilitySchedulingConfigurer' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'observabilitySchedulingConfigurer' via factory method to bean named 'observationRegistry' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.aop.AopAutoConfiguration$ClassProxyingConfiguration' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.aop.AopAutoConfiguration' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'lifecycleProcessor' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'spring.lifecycle-org.springframework.boot.autoconfigure.context.LifecycleProperties' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'lifecycleProcessor' via factory method to bean named 'spring.lifecycle-org.springframework.boot.autoconfigure.context.LifecycleProperties' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.sql.init.SqlInitializationAutoConfiguration' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'spring.sql.init-org.springframework.boot.autoconfigure.sql.init.SqlInitializationProperties' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'characterEncodingFilter' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'multipartResolver' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.actuate.autoconfigure.endpoint.web.ServletEndpointManagementContextConfiguration$WebMvcServletEndpointManagementContextConfiguration' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'servletEndpointRegistrar' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'servletEndpointRegistrar' via factory method to bean named 'management.endpoints.web-org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'servletEndpointRegistrar' via factory method to bean named 'servletEndpointDiscoverer' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'servletEndpointRegistrar' via factory method to bean named 'dispatcherServletRegistration' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'servletEndpointRegistrar' via factory method to bean named 'propertiesEndpointAccessResolver' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.actuate.autoconfigure.endpoint.web.servlet.WebMvcEndpointManagementContextConfiguration' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'webEndpointServletHandlerMapping' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'management.endpoints.web.cors-org.springframework.boot.actuate.autoconfigure.endpoint.web.CorsEndpointProperties' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'webEndpointServletHandlerMapping' via factory method to bean named 'webEndpointDiscoverer' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'webEndpointServletHandlerMapping' via factory method to bean named 'servletEndpointDiscoverer' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'webEndpointServletHandlerMapping' via factory method to bean named 'controllerEndpointDiscoverer' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'webEndpointServletHandlerMapping' via factory method to bean named 'endpointMediaTypes' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'webEndpointServletHandlerMapping' via factory method to bean named 'management.endpoints.web.cors-org.springframework.boot.actuate.autoconfigure.endpoint.web.CorsEndpointProperties' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'webEndpointServletHandlerMapping' via factory method to bean named 'management.endpoints.web-org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'webEndpointServletHandlerMapping' via factory method to bean named 'environment' +2025-06-16 15:24:31 [main] INFO o.s.b.a.e.web.EndpointLinksResolver - Exposing 1 endpoint beneath base path '/actuator' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'controllerEndpointHandlerMapping' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'controllerEndpointHandlerMapping' via factory method to bean named 'controllerEndpointDiscoverer' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'controllerEndpointHandlerMapping' via factory method to bean named 'management.endpoints.web.cors-org.springframework.boot.actuate.autoconfigure.endpoint.web.CorsEndpointProperties' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'controllerEndpointHandlerMapping' via factory method to bean named 'management.endpoints.web-org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'controllerEndpointHandlerMapping' via factory method to bean named 'propertiesEndpointAccessResolver' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.actuate.autoconfigure.web.server.ManagementContextAutoConfiguration$SameManagementContextConfiguration$EnableSameManagementContextConfiguration' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.actuate.autoconfigure.web.server.ManagementContextAutoConfiguration$SameManagementContextConfiguration' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'org.springframework.boot.actuate.autoconfigure.web.server.ManagementContextAutoConfiguration$SameManagementContextConfiguration' via constructor to bean named 'environment' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.actuate.autoconfigure.web.server.ManagementContextAutoConfiguration' +2025-06-16 15:24:31 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'management.server-org.springframework.boot.actuate.autoconfigure.web.server.ManagementServerProperties' +2025-06-16 15:24:32 [main] DEBUG o.s.c.s.DefaultLifecycleProcessor - Starting beans in phase -2147483647 +2025-06-16 15:24:32 [main] DEBUG o.s.c.s.DefaultLifecycleProcessor - Successfully started bean 'springBootLoggingLifecycle' +2025-06-16 15:24:32 [main] DEBUG o.s.b.a.l.ConditionEvaluationReportLogger - + + +============================ +CONDITIONS EVALUATION REPORT +============================ + + +Positive matches: +----------------- + + AopAutoConfiguration matched: + - @ConditionalOnProperty (spring.aop.auto=true) matched (OnPropertyCondition) + + AopAutoConfiguration.ClassProxyingConfiguration matched: + - @ConditionalOnMissingClass did not find unwanted class 'org.aspectj.weaver.Advice' (OnClassCondition) + - @ConditionalOnProperty (spring.aop.proxy-target-class=true) matched (OnPropertyCondition) + + ApplicationAvailabilityAutoConfiguration#applicationAvailability matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.availability.ApplicationAvailability; SearchStrategy: all) did not find any beans (OnBeanCondition) + + CacheMeterBinderProvidersConfiguration matched: + - @ConditionalOnClass found required class 'io.micrometer.core.instrument.binder.MeterBinder' (OnClassCondition) + + CompositeMeterRegistryAutoConfiguration matched: + - @ConditionalOnClass found required class 'io.micrometer.core.instrument.composite.CompositeMeterRegistry' (OnClassCondition) + + DiskSpaceHealthContributorAutoConfiguration matched: + - @ConditionalOnEnabledHealthIndicator management.health.defaults.enabled is considered true (OnEnabledHealthIndicatorCondition) + + DiskSpaceHealthContributorAutoConfiguration#diskSpaceHealthIndicator matched: + - @ConditionalOnMissingBean (names: diskSpaceHealthIndicator; SearchStrategy: all) did not find any beans (OnBeanCondition) + + DispatcherServletAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.web.servlet.DispatcherServlet' (OnClassCondition) + - found 'session' scope (OnWebApplicationCondition) + + DispatcherServletAutoConfiguration.DispatcherServletConfiguration matched: + - @ConditionalOnClass found required class 'jakarta.servlet.ServletRegistration' (OnClassCondition) + - Default DispatcherServlet did not find dispatcher servlet beans (DispatcherServletAutoConfiguration.DefaultDispatcherServletCondition) + + DispatcherServletAutoConfiguration.DispatcherServletRegistrationConfiguration matched: + - @ConditionalOnClass found required class 'jakarta.servlet.ServletRegistration' (OnClassCondition) + - DispatcherServlet Registration did not find servlet registration bean (DispatcherServletAutoConfiguration.DispatcherServletRegistrationCondition) + + DispatcherServletAutoConfiguration.DispatcherServletRegistrationConfiguration#dispatcherServletRegistration matched: + - @ConditionalOnBean (names: dispatcherServlet types: org.springframework.web.servlet.DispatcherServlet; SearchStrategy: all) found bean 'dispatcherServlet' (OnBeanCondition) + + EndpointAutoConfiguration#endpointCachingOperationInvokerAdvisor matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.invoker.cache.CachingOperationInvokerAdvisor; SearchStrategy: all) did not find any beans (OnBeanCondition) + + EndpointAutoConfiguration#endpointOperationParameterMapper matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.invoke.ParameterValueMapper; SearchStrategy: all) did not find any beans (OnBeanCondition) + + EndpointAutoConfiguration#propertiesEndpointAccessResolver matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.EndpointAccessResolver; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ErrorMvcAutoConfiguration matched: + - @ConditionalOnClass found required classes 'jakarta.servlet.Servlet', 'org.springframework.web.servlet.DispatcherServlet' (OnClassCondition) + - found 'session' scope (OnWebApplicationCondition) + + ErrorMvcAutoConfiguration#basicErrorController matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.web.servlet.error.ErrorController; SearchStrategy: current) did not find any beans (OnBeanCondition) + + ErrorMvcAutoConfiguration#errorAttributes matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.web.servlet.error.ErrorAttributes; SearchStrategy: current) did not find any beans (OnBeanCondition) + + ErrorMvcAutoConfiguration.DefaultErrorViewResolverConfiguration#conventionErrorViewResolver matched: + - @ConditionalOnBean (types: org.springframework.web.servlet.DispatcherServlet; SearchStrategy: all) found bean 'dispatcherServlet'; @ConditionalOnMissingBean (types: org.springframework.boot.autoconfigure.web.servlet.error.ErrorViewResolver; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ErrorMvcAutoConfiguration.WhitelabelErrorViewConfiguration matched: + - @ConditionalOnProperty (server.error.whitelabel.enabled) matched (OnPropertyCondition) + - ErrorTemplate Missing did not find error template view (ErrorMvcAutoConfiguration.ErrorTemplateMissingCondition) + + ErrorMvcAutoConfiguration.WhitelabelErrorViewConfiguration#beanNameViewResolver matched: + - @ConditionalOnMissingBean (types: org.springframework.web.servlet.view.BeanNameViewResolver; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ErrorMvcAutoConfiguration.WhitelabelErrorViewConfiguration#defaultErrorView matched: + - @ConditionalOnMissingBean (names: error; SearchStrategy: all) did not find any beans (OnBeanCondition) + + GenericCacheConfiguration matched: + - Cache org.springframework.boot.autoconfigure.cache.GenericCacheConfiguration automatic cache type (CacheCondition) + + HealthContributorAutoConfiguration#pingHealthContributor matched: + - @ConditionalOnEnabledHealthIndicator management.health.defaults.enabled is considered true (OnEnabledHealthIndicatorCondition) + + HealthEndpointAutoConfiguration matched: + - @ConditionalOnAvailableEndpoint marked as exposed by a 'management.endpoints.web.exposure' property (OnAvailableEndpointCondition) + + HealthEndpointConfiguration#healthContributorRegistry matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.health.HealthContributorRegistry; SearchStrategy: all) did not find any beans (OnBeanCondition) + + HealthEndpointConfiguration#healthEndpoint matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.health.HealthEndpoint; SearchStrategy: all) did not find any beans (OnBeanCondition) + + HealthEndpointConfiguration#healthEndpointGroupMembershipValidator matched: + - @ConditionalOnProperty (management.endpoint.health.validate-group-membership=true) matched (OnPropertyCondition) + + HealthEndpointConfiguration#healthEndpointGroups matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.health.HealthEndpointGroups; SearchStrategy: all) did not find any beans (OnBeanCondition) + + HealthEndpointConfiguration#healthHttpCodeStatusMapper matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.health.HttpCodeStatusMapper; SearchStrategy: all) did not find any beans (OnBeanCondition) + + HealthEndpointConfiguration#healthStatusAggregator matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.health.StatusAggregator; SearchStrategy: all) did not find any beans (OnBeanCondition) + + HealthEndpointWebExtensionConfiguration matched: + - found 'session' scope (OnWebApplicationCondition) + - @ConditionalOnAvailableEndpoint marked as exposed by a 'management.endpoints.web.exposure' property (OnAvailableEndpointCondition) + - @ConditionalOnBean (types: org.springframework.boot.actuate.health.HealthEndpoint; SearchStrategy: all) found bean 'healthEndpoint' (OnBeanCondition) + + HealthEndpointWebExtensionConfiguration#healthEndpointWebExtension matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.health.HealthEndpointWebExtension; SearchStrategy: all) did not find any beans (OnBeanCondition) + + HealthEndpointWebExtensionConfiguration.MvcAdditionalHealthEndpointPathsConfiguration matched: + - @ConditionalOnBean (types: org.springframework.web.servlet.DispatcherServlet; SearchStrategy: all) found bean 'dispatcherServlet' (OnBeanCondition) + + HttpClientAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.http.client.ClientHttpRequestFactory' (OnClassCondition) + - NoneNestedConditions 0 matched 1 did not; NestedCondition on NotReactiveWebApplicationCondition.ReactiveWebApplication did not find reactive web application classes (NotReactiveWebApplicationCondition) + + HttpClientAutoConfiguration#clientHttpRequestFactoryBuilder matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.http.client.ClientHttpRequestFactoryBuilder; SearchStrategy: all) did not find any beans (OnBeanCondition) + + HttpClientAutoConfiguration#clientHttpRequestFactorySettings matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.http.client.ClientHttpRequestFactorySettings; SearchStrategy: all) did not find any beans (OnBeanCondition) + + HttpClientObservationsAutoConfiguration matched: + - @ConditionalOnClass found required class 'io.micrometer.observation.Observation' (OnClassCondition) + - @ConditionalOnBean (types: io.micrometer.observation.ObservationRegistry; SearchStrategy: all) found bean 'observationRegistry' (OnBeanCondition) + + HttpClientObservationsAutoConfiguration.MeterFilterConfiguration matched: + - @ConditionalOnClass found required class 'io.micrometer.core.instrument.MeterRegistry' (OnClassCondition) + - @ConditionalOnBean (types: io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) found bean 'simpleMeterRegistry' (OnBeanCondition) + + HttpEncodingAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.web.filter.CharacterEncodingFilter' (OnClassCondition) + - found 'session' scope (OnWebApplicationCondition) + - @ConditionalOnProperty (server.servlet.encoding.enabled) matched (OnPropertyCondition) + + HttpEncodingAutoConfiguration#characterEncodingFilter matched: + - @ConditionalOnMissingBean (types: org.springframework.web.filter.CharacterEncodingFilter; SearchStrategy: all) did not find any beans (OnBeanCondition) + + HttpMessageConvertersAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.http.converter.HttpMessageConverter' (OnClassCondition) + - NoneNestedConditions 0 matched 1 did not; NestedCondition on HttpMessageConvertersAutoConfiguration.NotReactiveWebApplicationCondition.ReactiveWebApplication did not find reactive web application classes (HttpMessageConvertersAutoConfiguration.NotReactiveWebApplicationCondition) + + HttpMessageConvertersAutoConfiguration#messageConverters matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.autoconfigure.http.HttpMessageConverters; SearchStrategy: all) did not find any beans (OnBeanCondition) + + HttpMessageConvertersAutoConfiguration.StringHttpMessageConverterConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.http.converter.StringHttpMessageConverter' (OnClassCondition) + + HttpMessageConvertersAutoConfiguration.StringHttpMessageConverterConfiguration#stringHttpMessageConverter matched: + - @ConditionalOnMissingBean (types: org.springframework.http.converter.StringHttpMessageConverter; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JacksonAutoConfiguration matched: + - @ConditionalOnClass found required class 'com.fasterxml.jackson.databind.ObjectMapper' (OnClassCondition) + + JacksonAutoConfiguration.Jackson2ObjectMapperBuilderCustomizerConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.http.converter.json.Jackson2ObjectMapperBuilder' (OnClassCondition) + + JacksonAutoConfiguration.JacksonObjectMapperBuilderConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.http.converter.json.Jackson2ObjectMapperBuilder' (OnClassCondition) + + JacksonAutoConfiguration.JacksonObjectMapperBuilderConfiguration#jacksonObjectMapperBuilder matched: + - @ConditionalOnMissingBean (types: org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JacksonAutoConfiguration.JacksonObjectMapperConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.http.converter.json.Jackson2ObjectMapperBuilder' (OnClassCondition) + + JacksonAutoConfiguration.JacksonObjectMapperConfiguration#jacksonObjectMapper matched: + - @ConditionalOnMissingBean (types: com.fasterxml.jackson.databind.ObjectMapper; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JacksonAutoConfiguration.ParameterNamesModuleConfiguration matched: + - @ConditionalOnClass found required class 'com.fasterxml.jackson.module.paramnames.ParameterNamesModule' (OnClassCondition) + + JacksonAutoConfiguration.ParameterNamesModuleConfiguration#parameterNamesModule matched: + - @ConditionalOnMissingBean (types: com.fasterxml.jackson.module.paramnames.ParameterNamesModule; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JacksonEndpointAutoConfiguration#endpointObjectMapper matched: + - @ConditionalOnClass found required classes 'com.fasterxml.jackson.databind.ObjectMapper', 'org.springframework.http.converter.json.Jackson2ObjectMapperBuilder' (OnClassCondition) + - @ConditionalOnProperty (management.endpoints.jackson.isolated-object-mapper) matched (OnPropertyCondition) + + JacksonHttpMessageConvertersConfiguration.MappingJackson2HttpMessageConverterConfiguration matched: + - @ConditionalOnClass found required class 'com.fasterxml.jackson.databind.ObjectMapper' (OnClassCondition) + - @ConditionalOnProperty (spring.mvc.converters.preferred-json-mapper=jackson) matched (OnPropertyCondition) + - @ConditionalOnBean (types: com.fasterxml.jackson.databind.ObjectMapper; SearchStrategy: all) found bean 'jacksonObjectMapper' (OnBeanCondition) + + JacksonHttpMessageConvertersConfiguration.MappingJackson2HttpMessageConverterConfiguration#mappingJackson2HttpMessageConverter matched: + - @ConditionalOnMissingBean (types: org.springframework.http.converter.json.MappingJackson2HttpMessageConverter ignored: org.springframework.hateoas.server.mvc.TypeConstrainedMappingJackson2HttpMessageConverter,org.springframework.data.rest.webmvc.alps.AlpsJsonHttpMessageConverter; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JvmMetricsAutoConfiguration matched: + - @ConditionalOnClass found required class 'io.micrometer.core.instrument.MeterRegistry' (OnClassCondition) + - @ConditionalOnBean (types: io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) found bean 'simpleMeterRegistry' (OnBeanCondition) + + JvmMetricsAutoConfiguration#classLoaderMetrics matched: + - @ConditionalOnMissingBean (types: io.micrometer.core.instrument.binder.jvm.ClassLoaderMetrics; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JvmMetricsAutoConfiguration#jvmCompilationMetrics matched: + - @ConditionalOnMissingBean (types: io.micrometer.core.instrument.binder.jvm.JvmCompilationMetrics; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JvmMetricsAutoConfiguration#jvmGcMetrics matched: + - @ConditionalOnMissingBean (types: io.micrometer.core.instrument.binder.jvm.JvmGcMetrics; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JvmMetricsAutoConfiguration#jvmHeapPressureMetrics matched: + - @ConditionalOnMissingBean (types: io.micrometer.core.instrument.binder.jvm.JvmHeapPressureMetrics; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JvmMetricsAutoConfiguration#jvmInfoMetrics matched: + - @ConditionalOnMissingBean (types: io.micrometer.core.instrument.binder.jvm.JvmInfoMetrics; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JvmMetricsAutoConfiguration#jvmMemoryMetrics matched: + - @ConditionalOnMissingBean (types: io.micrometer.core.instrument.binder.jvm.JvmMemoryMetrics; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JvmMetricsAutoConfiguration#jvmThreadMetrics matched: + - @ConditionalOnMissingBean (types: io.micrometer.core.instrument.binder.jvm.JvmThreadMetrics; SearchStrategy: all) did not find any beans (OnBeanCondition) + + LifecycleAutoConfiguration#defaultLifecycleProcessor matched: + - @ConditionalOnMissingBean (names: lifecycleProcessor; SearchStrategy: current) did not find any beans (OnBeanCondition) + + LogbackMetricsAutoConfiguration matched: + - @ConditionalOnClass found required classes 'io.micrometer.core.instrument.MeterRegistry', 'ch.qos.logback.classic.LoggerContext', 'org.slf4j.LoggerFactory' (OnClassCondition) + - LogbackLoggingCondition ILoggerFactory is a Logback LoggerContext (LogbackMetricsAutoConfiguration.LogbackLoggingCondition) + - @ConditionalOnBean (types: io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) found bean 'simpleMeterRegistry' (OnBeanCondition) + + LogbackMetricsAutoConfiguration#logbackMetrics matched: + - @ConditionalOnMissingBean (types: io.micrometer.core.instrument.binder.logging.LogbackMetrics; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ManagementContextAutoConfiguration.SameManagementContextConfiguration matched: + - Management Port actual port type (SAME) matched required type (OnManagementPortCondition) + + MetricsAutoConfiguration matched: + - @ConditionalOnClass found required class 'io.micrometer.core.annotation.Timed' (OnClassCondition) + + MetricsAutoConfiguration#micrometerClock matched: + - @ConditionalOnMissingBean (types: io.micrometer.core.instrument.Clock; SearchStrategy: all) did not find any beans (OnBeanCondition) + + MultipartAutoConfiguration matched: + - @ConditionalOnClass found required classes 'jakarta.servlet.Servlet', 'org.springframework.web.multipart.support.StandardServletMultipartResolver', 'jakarta.servlet.MultipartConfigElement' (OnClassCondition) + - found 'session' scope (OnWebApplicationCondition) + - @ConditionalOnProperty (spring.servlet.multipart.enabled) matched (OnPropertyCondition) + + MultipartAutoConfiguration#multipartConfigElement matched: + - @ConditionalOnMissingBean (types: jakarta.servlet.MultipartConfigElement; SearchStrategy: all) did not find any beans (OnBeanCondition) + + MultipartAutoConfiguration#multipartResolver matched: + - @ConditionalOnMissingBean (types: org.springframework.web.multipart.MultipartResolver; SearchStrategy: all) did not find any beans (OnBeanCondition) + + NoOpCacheConfiguration matched: + - Cache org.springframework.boot.autoconfigure.cache.NoOpCacheConfiguration automatic cache type (CacheCondition) + + ObservationAutoConfiguration matched: + - @ConditionalOnClass found required class 'io.micrometer.observation.ObservationRegistry' (OnClassCondition) + + ObservationAutoConfiguration#observationRegistry matched: + - @ConditionalOnMissingBean (types: io.micrometer.observation.ObservationRegistry; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ObservationAutoConfiguration.MeterObservationHandlerConfiguration matched: + - @ConditionalOnBean (types: io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) found bean 'simpleMeterRegistry'; @ConditionalOnMissingBean (types: io.micrometer.core.instrument.observation.MeterObservationHandler; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ObservationAutoConfiguration.MeterObservationHandlerConfiguration.OnlyMetricsMeterObservationHandlerConfiguration matched: + - @ConditionalOnMissingBean (types: io.micrometer.tracing.Tracer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ObservationAutoConfiguration.OnlyMetricsConfiguration matched: + - @ConditionalOnClass found required class 'io.micrometer.core.instrument.MeterRegistry'; @ConditionalOnMissingClass did not find unwanted class 'io.micrometer.tracing.Tracer' (OnClassCondition) + + PropertyPlaceholderAutoConfiguration#propertySourcesPlaceholderConfigurer matched: + - @ConditionalOnMissingBean (types: org.springframework.context.support.PropertySourcesPlaceholderConfigurer; SearchStrategy: current) did not find any beans (OnBeanCondition) + + RestClientAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.web.client.RestClient' (OnClassCondition) + - NoneNestedConditions 0 matched 1 did not; NestedCondition on NotReactiveWebApplicationCondition.ReactiveWebApplication did not find reactive web application classes (NotReactiveWebApplicationCondition) + + RestClientAutoConfiguration#httpMessageConvertersRestClientCustomizer matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.autoconfigure.web.client.HttpMessageConvertersRestClientCustomizer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + RestClientAutoConfiguration#restClientBuilder matched: + - @ConditionalOnMissingBean (types: org.springframework.web.client.RestClient$Builder; SearchStrategy: all) did not find any beans (OnBeanCondition) + + RestClientAutoConfiguration#restClientBuilderConfigurer matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.autoconfigure.web.client.RestClientBuilderConfigurer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + RestClientAutoConfiguration#restClientSsl matched: + - @ConditionalOnBean (types: org.springframework.boot.ssl.SslBundles; SearchStrategy: all) found bean 'sslBundleRegistry'; @ConditionalOnMissingBean (types: org.springframework.boot.autoconfigure.web.client.RestClientSsl; SearchStrategy: all) did not find any beans (OnBeanCondition) + + RestClientObservationConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.web.client.RestClient' (OnClassCondition) + - @ConditionalOnBean (types: org.springframework.web.client.RestClient$Builder; SearchStrategy: all) found bean 'restClientBuilder' (OnBeanCondition) + + RestTemplateAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.web.client.RestTemplate' (OnClassCondition) + - NoneNestedConditions 0 matched 1 did not; NestedCondition on NotReactiveWebApplicationCondition.ReactiveWebApplication did not find reactive web application classes (NotReactiveWebApplicationCondition) + + RestTemplateAutoConfiguration#restTemplateBuilder matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.web.client.RestTemplateBuilder; SearchStrategy: all) did not find any beans (OnBeanCondition) + + RestTemplateObservationConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.web.client.RestTemplate' (OnClassCondition) + - @ConditionalOnBean (types: org.springframework.boot.web.client.RestTemplateBuilder; SearchStrategy: all) found bean 'restTemplateBuilder' (OnBeanCondition) + + ScheduledTasksObservabilityAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler' (OnClassCondition) + - @ConditionalOnBean (types: io.micrometer.observation.ObservationRegistry; SearchStrategy: all) found bean 'observationRegistry' (OnBeanCondition) + + ServletEndpointManagementContextConfiguration matched: + - found 'session' scope (OnWebApplicationCondition) + + ServletEndpointManagementContextConfiguration.WebMvcServletEndpointManagementContextConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.web.servlet.DispatcherServlet' (OnClassCondition) + + ServletManagementContextAutoConfiguration matched: + - @ConditionalOnClass found required class 'jakarta.servlet.Servlet' (OnClassCondition) + - found 'session' scope (OnWebApplicationCondition) + + ServletWebServerFactoryAutoConfiguration matched: + - @ConditionalOnClass found required class 'jakarta.servlet.ServletRequest' (OnClassCondition) + - found 'session' scope (OnWebApplicationCondition) + + ServletWebServerFactoryAutoConfiguration#tomcatServletWebServerFactoryCustomizer matched: + - @ConditionalOnClass found required class 'org.apache.catalina.startup.Tomcat' (OnClassCondition) + + ServletWebServerFactoryConfiguration.EmbeddedTomcat matched: + - @ConditionalOnClass found required classes 'jakarta.servlet.Servlet', 'org.apache.catalina.startup.Tomcat', 'org.apache.coyote.UpgradeProtocol' (OnClassCondition) + - @ConditionalOnMissingBean (types: org.springframework.boot.web.servlet.server.ServletWebServerFactory; SearchStrategy: current) did not find any beans (OnBeanCondition) + + SimpleCacheConfiguration matched: + - Cache org.springframework.boot.autoconfigure.cache.SimpleCacheConfiguration automatic cache type (CacheCondition) + + SimpleMetricsExportAutoConfiguration matched: + - @ConditionalOnEnabledMetricsExport management.simple.metrics.export.enabled is true (OnMetricsExportEnabledCondition) + - @ConditionalOnBean (types: io.micrometer.core.instrument.Clock; SearchStrategy: all) found bean 'micrometerClock'; @ConditionalOnMissingBean (types: io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) did not find any beans (OnBeanCondition) + + SimpleMetricsExportAutoConfiguration#simpleConfig matched: + - @ConditionalOnMissingBean (types: io.micrometer.core.instrument.simple.SimpleConfig; SearchStrategy: all) did not find any beans (OnBeanCondition) + + SqlInitializationAutoConfiguration matched: + - @ConditionalOnProperty (spring.sql.init.enabled) matched (OnPropertyCondition) + - NoneNestedConditions 0 matched 1 did not; NestedCondition on SqlInitializationAutoConfiguration.SqlInitializationModeCondition.ModeIsNever @ConditionalOnProperty (spring.sql.init.mode=never) did not find property 'mode' (SqlInitializationAutoConfiguration.SqlInitializationModeCondition) + + SslAutoConfiguration#sslBundleRegistry matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.ssl.SslBundleRegistry,org.springframework.boot.ssl.SslBundles; SearchStrategy: all) did not find any beans (OnBeanCondition) + + SslHealthContributorAutoConfiguration matched: + - @ConditionalOnEnabledHealthIndicator management.health.defaults.enabled is considered true (OnEnabledHealthIndicatorCondition) + + SslHealthContributorAutoConfiguration#sslHealthIndicator matched: + - @ConditionalOnMissingBean (names: sslHealthIndicator; SearchStrategy: all) did not find any beans (OnBeanCondition) + + SslHealthContributorAutoConfiguration#sslInfo matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.info.SslInfo; SearchStrategy: all) did not find any beans (OnBeanCondition) + + StartupTimeMetricsListenerAutoConfiguration matched: + - @ConditionalOnClass found required class 'io.micrometer.core.instrument.MeterRegistry' (OnClassCondition) + - @ConditionalOnBean (types: io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) found bean 'simpleMeterRegistry' (OnBeanCondition) + + StartupTimeMetricsListenerAutoConfiguration#startupTimeMetrics matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.metrics.startup.StartupTimeMetricsListener; SearchStrategy: all) did not find any beans (OnBeanCondition) + + SystemMetricsAutoConfiguration matched: + - @ConditionalOnClass found required class 'io.micrometer.core.instrument.MeterRegistry' (OnClassCondition) + - @ConditionalOnBean (types: io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) found bean 'simpleMeterRegistry' (OnBeanCondition) + + SystemMetricsAutoConfiguration#diskSpaceMetrics matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.metrics.system.DiskSpaceMetricsBinder; SearchStrategy: all) did not find any beans (OnBeanCondition) + + SystemMetricsAutoConfiguration#fileDescriptorMetrics matched: + - @ConditionalOnMissingBean (types: io.micrometer.core.instrument.binder.system.FileDescriptorMetrics; SearchStrategy: all) did not find any beans (OnBeanCondition) + + SystemMetricsAutoConfiguration#processorMetrics matched: + - @ConditionalOnMissingBean (types: io.micrometer.core.instrument.binder.system.ProcessorMetrics; SearchStrategy: all) did not find any beans (OnBeanCondition) + + SystemMetricsAutoConfiguration#uptimeMetrics matched: + - @ConditionalOnMissingBean (types: io.micrometer.core.instrument.binder.system.UptimeMetrics; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TaskExecutionAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor' (OnClassCondition) + + TaskExecutorConfigurations.SimpleAsyncTaskExecutorBuilderConfiguration#simpleAsyncTaskExecutorBuilder matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.task.SimpleAsyncTaskExecutorBuilder; SearchStrategy: all) did not find any beans (OnBeanCondition) + - @ConditionalOnThreading found PLATFORM (OnThreadingCondition) + + TaskExecutorConfigurations.ThreadPoolTaskExecutorBuilderConfiguration#threadPoolTaskExecutorBuilder matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.task.ThreadPoolTaskExecutorBuilder; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TaskExecutorMetricsAutoConfiguration matched: + - @ConditionalOnClass found required class 'io.micrometer.core.instrument.binder.jvm.ExecutorServiceMetrics' (OnClassCondition) + - @ConditionalOnBean (types: java.util.concurrent.Executor,io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) found beans 'threadPoolExecutor', 'simpleMeterRegistry' (OnBeanCondition) + + TaskSchedulingAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler' (OnClassCondition) + + TaskSchedulingConfigurations.SimpleAsyncTaskSchedulerBuilderConfiguration#simpleAsyncTaskSchedulerBuilder matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.task.SimpleAsyncTaskSchedulerBuilder; SearchStrategy: all) did not find any beans (OnBeanCondition) + - @ConditionalOnThreading found PLATFORM (OnThreadingCondition) + + TaskSchedulingConfigurations.ThreadPoolTaskSchedulerBuilderConfiguration#threadPoolTaskSchedulerBuilder matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.task.ThreadPoolTaskSchedulerBuilder; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TomcatMetricsAutoConfiguration matched: + - @ConditionalOnClass found required classes 'io.micrometer.core.instrument.binder.tomcat.TomcatMetrics', 'org.apache.catalina.Manager' (OnClassCondition) + - @ConditionalOnWebApplication (required) found 'session' scope (OnWebApplicationCondition) + + TomcatMetricsAutoConfiguration#tomcatMetricsBinder matched: + - @ConditionalOnBean (types: io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) found bean 'simpleMeterRegistry'; @ConditionalOnMissingBean (types: io.micrometer.core.instrument.binder.tomcat.TomcatMetrics,org.springframework.boot.actuate.metrics.web.tomcat.TomcatMetricsBinder; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ValidationAutoConfiguration matched: + - @ConditionalOnClass found required class 'jakarta.validation.executable.ExecutableValidator' (OnClassCondition) + - @ConditionalOnResource found location classpath:META-INF/services/jakarta.validation.spi.ValidationProvider (OnResourceCondition) + + ValidationAutoConfiguration#defaultValidator matched: + - @ConditionalOnMissingBean (types: jakarta.validation.Validator; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ValidationAutoConfiguration#methodValidationPostProcessor matched: + - @ConditionalOnMissingBean (types: org.springframework.validation.beanvalidation.MethodValidationPostProcessor; SearchStrategy: current) did not find any beans (OnBeanCondition) + + WebEndpointAutoConfiguration matched: + - @ConditionalOnWebApplication (required) found 'session' scope (OnWebApplicationCondition) + + WebEndpointAutoConfiguration#controllerEndpointDiscoverer matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.web.annotation.ControllerEndpointsSupplier; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebEndpointAutoConfiguration#endpointMediaTypes matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.web.EndpointMediaTypes; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebEndpointAutoConfiguration#pathMappedEndpoints matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.web.PathMappedEndpoints; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebEndpointAutoConfiguration#webEndpointDiscoverer matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.web.WebEndpointsSupplier; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebEndpointAutoConfiguration.WebEndpointServletConfiguration matched: + - found 'session' scope (OnWebApplicationCondition) + + WebEndpointAutoConfiguration.WebEndpointServletConfiguration#servletEndpointDiscoverer matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.web.annotation.ServletEndpointsSupplier; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcAutoConfiguration matched: + - @ConditionalOnClass found required classes 'jakarta.servlet.Servlet', 'org.springframework.web.servlet.DispatcherServlet', 'org.springframework.web.servlet.config.annotation.WebMvcConfigurer' (OnClassCondition) + - found 'session' scope (OnWebApplicationCondition) + - @ConditionalOnMissingBean (types: org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcAutoConfiguration#formContentFilter matched: + - @ConditionalOnProperty (spring.mvc.formcontent.filter.enabled) matched (OnPropertyCondition) + - @ConditionalOnMissingBean (types: org.springframework.web.filter.FormContentFilter; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcAutoConfiguration.EnableWebMvcConfiguration#flashMapManager matched: + - @ConditionalOnMissingBean (names: flashMapManager; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcAutoConfiguration.EnableWebMvcConfiguration#localeResolver matched: + - @ConditionalOnMissingBean (names: localeResolver; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcAutoConfiguration.EnableWebMvcConfiguration#themeResolver matched: + - @ConditionalOnMissingBean (names: themeResolver; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcAutoConfiguration.EnableWebMvcConfiguration#viewNameTranslator matched: + - @ConditionalOnMissingBean (names: viewNameTranslator; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter#defaultViewResolver matched: + - @ConditionalOnMissingBean (types: org.springframework.web.servlet.view.InternalResourceViewResolver; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter#requestContextFilter matched: + - @ConditionalOnMissingBean (types: org.springframework.web.context.request.RequestContextListener,org.springframework.web.filter.RequestContextFilter; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter#viewResolver matched: + - @ConditionalOnBean (types: org.springframework.web.servlet.ViewResolver; SearchStrategy: all) found beans 'defaultViewResolver', 'beanNameViewResolver', 'mvcViewResolver'; @ConditionalOnMissingBean (names: viewResolver types: org.springframework.web.servlet.view.ContentNegotiatingViewResolver; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcEndpointManagementContextConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.web.servlet.DispatcherServlet' (OnClassCondition) + - found 'session' scope (OnWebApplicationCondition) + - @ConditionalOnBean (types: org.springframework.web.servlet.DispatcherServlet,org.springframework.boot.actuate.endpoint.web.WebEndpointsSupplier; SearchStrategy: all) found beans 'webEndpointDiscoverer', 'dispatcherServlet' (OnBeanCondition) + + WebMvcEndpointManagementContextConfiguration#controllerEndpointHandlerMapping matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.web.servlet.ControllerEndpointHandlerMapping; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcEndpointManagementContextConfiguration#endpointObjectMapperWebMvcConfigurer matched: + - @ConditionalOnBean (types: org.springframework.boot.actuate.endpoint.jackson.EndpointObjectMapper; SearchStrategy: all) found bean 'endpointObjectMapper' (OnBeanCondition) + + WebMvcEndpointManagementContextConfiguration#webEndpointServletHandlerMapping matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.web.servlet.WebMvcEndpointHandlerMapping; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcObservationAutoConfiguration matched: + - @ConditionalOnClass found required classes 'org.springframework.web.servlet.DispatcherServlet', 'io.micrometer.observation.Observation' (OnClassCondition) + - found 'session' scope (OnWebApplicationCondition) + - @ConditionalOnBean (types: io.micrometer.observation.ObservationRegistry; SearchStrategy: all) found bean 'observationRegistry' (OnBeanCondition) + + WebMvcObservationAutoConfiguration#webMvcObservationFilter matched: + - @ConditionalOnMissingBean (types: org.springframework.web.filter.ServerHttpObservationFilter; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcObservationAutoConfiguration.MeterFilterConfiguration matched: + - @ConditionalOnClass found required class 'io.micrometer.core.instrument.MeterRegistry' (OnClassCondition) + - @ConditionalOnBean (types: io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) found bean 'simpleMeterRegistry' (OnBeanCondition) + + WebSocketServletAutoConfiguration matched: + - @ConditionalOnClass found required classes 'jakarta.servlet.Servlet', 'jakarta.websocket.server.ServerContainer' (OnClassCondition) + - found 'session' scope (OnWebApplicationCondition) + + WebSocketServletAutoConfiguration.TomcatWebSocketConfiguration matched: + - @ConditionalOnClass found required classes 'org.apache.catalina.startup.Tomcat', 'org.apache.tomcat.websocket.server.WsSci' (OnClassCondition) + + WebSocketServletAutoConfiguration.TomcatWebSocketConfiguration#websocketServletWebServerCustomizer matched: + - @ConditionalOnMissingBean (names: websocketServletWebServerCustomizer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + +Negative matches: +----------------- + + ActiveMQAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'jakarta.jms.ConnectionFactory' (OnClassCondition) + + AopAutoConfiguration.AspectJAutoProxyingConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.aspectj.weaver.Advice' (OnClassCondition) + + AppOpticsMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.appoptics.AppOpticsMeterRegistry' (OnClassCondition) + + ArtemisAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'jakarta.jms.ConnectionFactory' (OnClassCondition) + + AtlasMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.atlas.AtlasMeterRegistry' (OnClassCondition) + + AuditAutoConfiguration: + Did not match: + - @ConditionalOnBean (types: org.springframework.boot.actuate.audit.AuditEventRepository; SearchStrategy: all) did not find any beans of type org.springframework.boot.actuate.audit.AuditEventRepository (OnBeanCondition) + Matched: + - @ConditionalOnProperty (management.auditevents.enabled) matched (OnPropertyCondition) + + AuditEventsEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + + AvailabilityHealthContributorAutoConfiguration#livenessStateHealthIndicator: + Did not match: + - @ConditionalOnProperty (management.health.livenessstate.enabled=true) did not find property 'enabled' (OnPropertyCondition) + + AvailabilityHealthContributorAutoConfiguration#readinessStateHealthIndicator: + Did not match: + - @ConditionalOnProperty (management.health.readinessstate.enabled=true) did not find property 'enabled' (OnPropertyCondition) + + AvailabilityProbesAutoConfiguration: + Did not match: + - Probes availability not running on a supported cloud platform (AvailabilityProbesAutoConfiguration.ProbesCondition) + + BatchAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.batch.core.launch.JobLauncher' (OnClassCondition) + + BatchObservationAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.batch.core.configuration.annotation.BatchObservabilityBeanPostProcessor' (OnClassCondition) + + BeansEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + + BraveAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'brave.Tracer' (OnClassCondition) + + Cache2kCacheConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.cache2k.Cache2kBuilder' (OnClassCondition) + + CacheAutoConfiguration: + Did not match: + - @ConditionalOnBean (types: org.springframework.cache.interceptor.CacheAspectSupport; SearchStrategy: all) did not find any beans of type org.springframework.cache.interceptor.CacheAspectSupport (OnBeanCondition) + Matched: + - @ConditionalOnClass found required class 'org.springframework.cache.CacheManager' (OnClassCondition) + + CacheAutoConfiguration.CacheManagerEntityManagerFactoryDependsOnPostProcessor: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean' (OnClassCondition) + - Ancestor org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration did not match (ConditionEvaluationReport.AncestorsMatchedCondition) + + CacheMeterBinderProvidersConfiguration.Cache2kCacheMeterBinderProviderConfiguration: + Did not match: + - @ConditionalOnClass did not find required classes 'org.cache2k.Cache2kBuilder', 'org.cache2k.extra.spring.SpringCache2kCache', 'org.cache2k.extra.micrometer.Cache2kCacheMetrics' (OnClassCondition) + + CacheMeterBinderProvidersConfiguration.CaffeineCacheMeterBinderProviderConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.cache.caffeine.CaffeineCache' (OnClassCondition) + + CacheMeterBinderProvidersConfiguration.HazelcastCacheMeterBinderProviderConfiguration: + Did not match: + - @ConditionalOnClass did not find required classes 'com.hazelcast.spring.cache.HazelcastCache', 'com.hazelcast.core.Hazelcast' (OnClassCondition) + + CacheMeterBinderProvidersConfiguration.JCacheCacheMeterBinderProviderConfiguration: + Did not match: + - @ConditionalOnClass did not find required classes 'org.springframework.cache.jcache.JCacheCache', 'javax.cache.CacheManager' (OnClassCondition) + + CacheMeterBinderProvidersConfiguration.RedisCacheMeterBinderProviderConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.data.redis.cache.RedisCache' (OnClassCondition) + + CacheMetricsAutoConfiguration: + Did not match: + - @ConditionalOnBean (types: org.springframework.cache.CacheManager; SearchStrategy: all) did not find any beans of type org.springframework.cache.CacheManager (OnBeanCondition) + + CachesEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + Matched: + - @ConditionalOnClass found required class 'org.springframework.cache.CacheManager' (OnClassCondition) + + CaffeineCacheConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.cache.caffeine.CaffeineCacheManager' (OnClassCondition) + + CassandraAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.datastax.oss.driver.api.core.CqlSession' (OnClassCondition) + + CassandraDataAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.datastax.oss.driver.api.core.CqlSession' (OnClassCondition) + + CassandraHealthContributorAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.datastax.oss.driver.api.core.CqlSession' (OnClassCondition) + + CassandraReactiveDataAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.datastax.oss.driver.api.core.CqlSession' (OnClassCondition) + + CassandraReactiveHealthContributorAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.datastax.oss.driver.api.core.CqlSession' (OnClassCondition) + + CassandraReactiveRepositoriesAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.data.cassandra.ReactiveSession' (OnClassCondition) + + CassandraRepositoriesAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.datastax.oss.driver.api.core.CqlSession' (OnClassCondition) + + ClientHttpConnectorAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.web.reactive.function.client.WebClient' (OnClassCondition) + + CloudFoundryActuatorAutoConfiguration: + Did not match: + - @ConditionalOnCloudPlatform did not find CLOUD_FOUNDRY (OnCloudPlatformCondition) + Matched: + - @ConditionalOnClass found required class 'org.springframework.web.servlet.DispatcherServlet' (OnClassCondition) + - found 'session' scope (OnWebApplicationCondition) + - @ConditionalOnProperty (management.cloudfoundry.enabled) matched (OnPropertyCondition) + + CodecsAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.web.reactive.function.client.WebClient' (OnClassCondition) + + CompositeMeterRegistryConfiguration: + Did not match: + - NoneNestedConditions 1 matched 1 did not; NestedCondition on CompositeMeterRegistryConfiguration.MultipleNonPrimaryMeterRegistriesCondition.SingleInjectableMeterRegistry @ConditionalOnSingleCandidate (types: io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) found a single bean 'simpleMeterRegistry'; NestedCondition on CompositeMeterRegistryConfiguration.MultipleNonPrimaryMeterRegistriesCondition.NoMeterRegistryCondition @ConditionalOnMissingBean (types: io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) found beans of type 'io.micrometer.core.instrument.MeterRegistry' simpleMeterRegistry (CompositeMeterRegistryConfiguration.MultipleNonPrimaryMeterRegistriesCondition) + + ConditionsReportEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + + ConfigurationPropertiesReportEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + + ConnectionFactoryHealthContributorAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.r2dbc.spi.ConnectionFactory' (OnClassCondition) + + ConnectionPoolMetricsAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.r2dbc.pool.ConnectionPool' (OnClassCondition) + + CouchbaseAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.couchbase.client.java.Cluster' (OnClassCondition) + + CouchbaseCacheConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.couchbase.client.java.Cluster' (OnClassCondition) + + CouchbaseDataAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.couchbase.client.java.Bucket' (OnClassCondition) + + CouchbaseHealthContributorAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.couchbase.client.java.Cluster' (OnClassCondition) + + CouchbaseReactiveDataAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.couchbase.client.java.Cluster' (OnClassCondition) + + CouchbaseReactiveHealthContributorAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.couchbase.client.java.Cluster' (OnClassCondition) + + CouchbaseReactiveRepositoriesAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.couchbase.client.java.Cluster' (OnClassCondition) + + CouchbaseRepositoriesAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.couchbase.client.java.Bucket' (OnClassCondition) + + DataSourceAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType' (OnClassCondition) + + DataSourceHealthContributorAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.jdbc.core.JdbcTemplate' (OnClassCondition) + + DataSourceInitializationConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.jdbc.datasource.init.DatabasePopulator' (OnClassCondition) + + DataSourcePoolMetricsAutoConfiguration: + Did not match: + - @ConditionalOnBean (types: javax.sql.DataSource,io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) did not find any beans of type javax.sql.DataSource (OnBeanCondition) + Matched: + - @ConditionalOnClass found required classes 'javax.sql.DataSource', 'io.micrometer.core.instrument.MeterRegistry' (OnClassCondition) + + DataSourcePoolMetricsAutoConfiguration.HikariDataSourceMetricsConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.zaxxer.hikari.HikariDataSource' (OnClassCondition) + - Ancestor org.springframework.boot.actuate.autoconfigure.metrics.jdbc.DataSourcePoolMetricsAutoConfiguration did not match (ConditionEvaluationReport.AncestorsMatchedCondition) + + DataSourceTransactionManagerAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.jdbc.core.JdbcTemplate' (OnClassCondition) + + DatadogMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.datadog.DatadogMeterRegistry' (OnClassCondition) + + DispatcherServletAutoConfiguration.DispatcherServletConfiguration#multipartResolver: + Did not match: + - @ConditionalOnBean (types: org.springframework.web.multipart.MultipartResolver; SearchStrategy: all) did not find any beans of type org.springframework.web.multipart.MultipartResolver (OnBeanCondition) + + DynatraceMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.dynatrace.DynatraceMeterRegistry' (OnClassCondition) + + ElasticMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.elastic.ElasticMeterRegistry' (OnClassCondition) + + ElasticsearchClientAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'co.elastic.clients.elasticsearch.ElasticsearchClient' (OnClassCondition) + + ElasticsearchDataAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.data.elasticsearch.client.elc.ElasticsearchTemplate' (OnClassCondition) + + ElasticsearchReactiveHealthContributorAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'reactor.core.publisher.Flux' (OnClassCondition) + + ElasticsearchRepositoriesAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.data.elasticsearch.repository.ElasticsearchRepository' (OnClassCondition) + + ElasticsearchRestClientAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.elasticsearch.client.RestClientBuilder' (OnClassCondition) + + ElasticsearchRestHealthContributorAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.elasticsearch.client.RestClient' (OnClassCondition) + + EmbeddedLdapAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.unboundid.ldap.listener.InMemoryDirectoryServer' (OnClassCondition) + + EmbeddedWebServerFactoryCustomizerAutoConfiguration: + Did not match: + - Application is deployed as a WAR file. (OnWarDeploymentCondition) + Matched: + - @ConditionalOnWebApplication (required) found 'session' scope (OnWebApplicationCondition) + + EnvironmentEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + + ErrorWebFluxAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.web.reactive.config.WebFluxConfigurer' (OnClassCondition) + + FlywayAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.flywaydb.core.Flyway' (OnClassCondition) + + FlywayEndpointAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.flywaydb.core.Flyway' (OnClassCondition) + + FreeMarkerAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'freemarker.template.Configuration' (OnClassCondition) + + GangliaMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.ganglia.GangliaMeterRegistry' (OnClassCondition) + + GraphQlAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'graphql.GraphQL' (OnClassCondition) + + GraphQlObservationAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'graphql.GraphQL' (OnClassCondition) + + GraphQlQueryByExampleAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'graphql.GraphQL' (OnClassCondition) + + GraphQlQuerydslAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.querydsl.core.Query' (OnClassCondition) + + GraphQlRSocketAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'graphql.GraphQL' (OnClassCondition) + + GraphQlReactiveQueryByExampleAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'graphql.GraphQL' (OnClassCondition) + + GraphQlReactiveQuerydslAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.querydsl.core.Query' (OnClassCondition) + + GraphQlWebFluxAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'graphql.GraphQL' (OnClassCondition) + + GraphQlWebFluxSecurityAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'graphql.GraphQL' (OnClassCondition) + + GraphQlWebMvcAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'graphql.GraphQL' (OnClassCondition) + + GraphQlWebMvcSecurityAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'graphql.GraphQL' (OnClassCondition) + + GraphiteMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.graphite.GraphiteMeterRegistry' (OnClassCondition) + + GroovyTemplateAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'groovy.text.markup.MarkupTemplateEngine' (OnClassCondition) + + GsonAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.google.gson.Gson' (OnClassCondition) + + GsonHttpMessageConvertersConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.google.gson.Gson' (OnClassCondition) + + H2ConsoleAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.h2.server.web.JakartaWebServlet' (OnClassCondition) + + HazelcastAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.hazelcast.core.HazelcastInstance' (OnClassCondition) + + HazelcastCacheConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.hazelcast.core.HazelcastInstance' (OnClassCondition) + + HazelcastHealthContributorAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.hazelcast.core.HazelcastInstance' (OnClassCondition) + + HazelcastJpaDependencyAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.hazelcast.core.HazelcastInstance' (OnClassCondition) + + HealthEndpointReactiveWebExtensionConfiguration: + Did not match: + - did not find reactive web application classes (OnWebApplicationCondition) + + HealthEndpointWebExtensionConfiguration.JerseyAdditionalHealthEndpointPathsConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.glassfish.jersey.server.ResourceConfig' (OnClassCondition) + + HeapDumpWebEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + + HibernateJpaAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'jakarta.persistence.EntityManager' (OnClassCondition) + + HibernateMetricsAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'jakarta.persistence.EntityManagerFactory' (OnClassCondition) + + HttpExchangesAutoConfiguration: + Did not match: + - @ConditionalOnBean (types: org.springframework.boot.actuate.web.exchanges.HttpExchangeRepository; SearchStrategy: all) did not find any beans of type org.springframework.boot.actuate.web.exchanges.HttpExchangeRepository (OnBeanCondition) + Matched: + - @ConditionalOnWebApplication (required) found 'session' scope (OnWebApplicationCondition) + - @ConditionalOnProperty (management.httpexchanges.recording.enabled) matched (OnPropertyCondition) + + HttpExchangesAutoConfiguration.ReactiveHttpExchangesConfiguration: + Did not match: + - did not find reactive web application classes (OnWebApplicationCondition) + - Ancestor org.springframework.boot.actuate.autoconfigure.web.exchanges.HttpExchangesAutoConfiguration did not match (ConditionEvaluationReport.AncestorsMatchedCondition) + + HttpExchangesAutoConfiguration.ServletHttpExchangesConfiguration: + Did not match: + - Ancestor org.springframework.boot.actuate.autoconfigure.web.exchanges.HttpExchangesAutoConfiguration did not match (ConditionEvaluationReport.AncestorsMatchedCondition) + Matched: + - found 'session' scope (OnWebApplicationCondition) + + HttpExchangesEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + + HttpHandlerAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.web.reactive.DispatcherHandler' (OnClassCondition) + + HumioMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.humio.HumioMeterRegistry' (OnClassCondition) + + HypermediaAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.hateoas.EntityModel' (OnClassCondition) + + InfinispanCacheConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.infinispan.spring.embedded.provider.SpringEmbeddedCacheManager' (OnClassCondition) + + InfluxMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.influx.InfluxMeterRegistry' (OnClassCondition) + + InfoContributorAutoConfiguration#buildInfoContributor: + Did not match: + - @ConditionalOnSingleCandidate (types: org.springframework.boot.info.BuildProperties; SearchStrategy: all) did not find any beans (OnBeanCondition) + Matched: + - @ConditionalOnEnabledInfoContributor management.info.defaults.enabled is considered true (OnEnabledInfoContributorCondition) + + InfoContributorAutoConfiguration#envInfoContributor: + Did not match: + - @ConditionalOnEnabledInfoContributor management.info.env.enabled is not true (OnEnabledInfoContributorCondition) + + InfoContributorAutoConfiguration#gitInfoContributor: + Did not match: + - @ConditionalOnSingleCandidate (types: org.springframework.boot.info.GitProperties; SearchStrategy: all) did not find any beans (OnBeanCondition) + Matched: + - @ConditionalOnEnabledInfoContributor management.info.defaults.enabled is considered true (OnEnabledInfoContributorCondition) + + InfoContributorAutoConfiguration#javaInfoContributor: + Did not match: + - @ConditionalOnEnabledInfoContributor management.info.java.enabled is not true (OnEnabledInfoContributorCondition) + + InfoContributorAutoConfiguration#osInfoContributor: + Did not match: + - @ConditionalOnEnabledInfoContributor management.info.os.enabled is not true (OnEnabledInfoContributorCondition) + + InfoContributorAutoConfiguration#processInfoContributor: + Did not match: + - @ConditionalOnEnabledInfoContributor management.info.process.enabled is not true (OnEnabledInfoContributorCondition) + + InfoContributorAutoConfiguration#sslInfo: + Did not match: + - @ConditionalOnEnabledInfoContributor management.info.ssl.enabled is not true (OnEnabledInfoContributorCondition) + Matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.info.SslInfo; SearchStrategy: all) did not find any beans (OnBeanCondition) + + InfoContributorAutoConfiguration#sslInfoContributor: + Did not match: + - @ConditionalOnEnabledInfoContributor management.info.ssl.enabled is not true (OnEnabledInfoContributorCondition) + + InfoEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + + IntegrationAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.integration.config.EnableIntegration' (OnClassCondition) + + IntegrationGraphEndpointAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.integration.graph.IntegrationGraphServer' (OnClassCondition) + + JCacheCacheConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'javax.cache.Caching' (OnClassCondition) + + JacksonHttpMessageConvertersConfiguration.MappingJackson2XmlHttpMessageConverterConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.fasterxml.jackson.dataformat.xml.XmlMapper' (OnClassCondition) + + JdbcClientAutoConfiguration: + Did not match: + - @ConditionalOnSingleCandidate did not find required type 'org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate' (OnBeanCondition) + + JdbcRepositoriesAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.data.jdbc.repository.config.AbstractJdbcConfiguration' (OnClassCondition) + + JdbcTemplateAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.jdbc.core.JdbcTemplate' (OnClassCondition) + + JerseyAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.glassfish.jersey.server.spring.SpringComponentProvider' (OnClassCondition) + + JerseySameManagementContextConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.glassfish.jersey.server.ResourceConfig' (OnClassCondition) + + JerseyServerMetricsAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.glassfish.jersey.micrometer.server.ObservationApplicationEventListener' (OnClassCondition) + + JerseyWebEndpointManagementContextConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.glassfish.jersey.server.ResourceConfig' (OnClassCondition) + + JettyMetricsAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.eclipse.jetty.server.Server' (OnClassCondition) + + JmsAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'jakarta.jms.Message' (OnClassCondition) + + JmsHealthContributorAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'jakarta.jms.ConnectionFactory' (OnClassCondition) + + JmxAutoConfiguration: + Did not match: + - @ConditionalOnProperty (spring.jmx.enabled=true) found different value in property 'enabled' (OnPropertyCondition) + Matched: + - @ConditionalOnClass found required class 'org.springframework.jmx.export.MBeanExporter' (OnClassCondition) + + JmxEndpointAutoConfiguration: + Did not match: + - @ConditionalOnProperty (spring.jmx.enabled=true) found different value in property 'enabled' (OnPropertyCondition) + + JmxMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.jmx.JmxMeterRegistry' (OnClassCondition) + + JndiConnectionFactoryAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.jms.core.JmsTemplate' (OnClassCondition) + + JndiDataSourceAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType' (OnClassCondition) + + JooqAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.jooq.DSLContext' (OnClassCondition) + + JpaRepositoriesAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.data.jpa.repository.JpaRepository' (OnClassCondition) + + JsonbAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'jakarta.json.bind.Jsonb' (OnClassCondition) + + JsonbHttpMessageConvertersConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'jakarta.json.bind.Jsonb' (OnClassCondition) + + JtaAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'jakarta.transaction.Transaction' (OnClassCondition) + + KafkaAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.kafka.core.KafkaTemplate' (OnClassCondition) + + KafkaMetricsAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.kafka.core.ProducerFactory' (OnClassCondition) + + KairosMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.kairos.KairosMeterRegistry' (OnClassCondition) + + LdapAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.ldap.core.ContextSource' (OnClassCondition) + + LdapHealthContributorAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.ldap.core.LdapOperations' (OnClassCondition) + + LdapRepositoriesAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.data.ldap.repository.LdapRepository' (OnClassCondition) + + LettuceMetricsAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.lettuce.core.metrics.MicrometerCommandLatencyRecorder' (OnClassCondition) + + LiquibaseAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'liquibase.change.DatabaseChange' (OnClassCondition) + + LiquibaseEndpointAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'liquibase.integration.spring.SpringLiquibase' (OnClassCondition) + + Log4J2MetricsAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.apache.logging.log4j.core.LoggerContext' (OnClassCondition) + + LogFileWebEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + + LoggersEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + + MailHealthContributorAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.mail.javamail.JavaMailSenderImpl' (OnClassCondition) + + MailSenderAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'jakarta.mail.internet.MimeMessage' (OnClassCondition) + + MailSenderValidatorAutoConfiguration: + Did not match: + - @ConditionalOnSingleCandidate did not find required type 'org.springframework.mail.javamail.JavaMailSenderImpl' (OnBeanCondition) + + ManagementContextAutoConfiguration.DifferentManagementContextConfiguration: + Did not match: + - Management Port actual port type (SAME) did not match required type (DIFFERENT) (OnManagementPortCondition) + + ManagementWebSecurityAutoConfiguration: + Did not match: + - AllNestedConditions 1 matched 1 did not; NestedCondition on DefaultWebSecurityCondition.Beans @ConditionalOnMissingBean (types: org.springframework.security.web.SecurityFilterChain; SearchStrategy: all) did not find any beans; NestedCondition on DefaultWebSecurityCondition.Classes @ConditionalOnClass did not find required classes 'org.springframework.security.web.SecurityFilterChain', 'org.springframework.security.config.annotation.web.builders.HttpSecurity' (DefaultWebSecurityCondition) + Matched: + - found 'session' scope (OnWebApplicationCondition) + + MappingsEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + + MessageSourceAutoConfiguration: + Did not match: + - ResourceBundle did not find bundle with basename messages (MessageSourceAutoConfiguration.ResourceBundleCondition) + + MetricsAspectsAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.aspectj.weaver.Advice' (OnClassCondition) + + MetricsEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + Matched: + - @ConditionalOnClass found required class 'io.micrometer.core.annotation.Timed' (OnClassCondition) + + MicrometerTracingAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.tracing.Tracer' (OnClassCondition) + + MongoAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.mongodb.client.MongoClient' (OnClassCondition) + + MongoDataAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.mongodb.client.MongoClient' (OnClassCondition) + + MongoHealthContributorAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.data.mongodb.core.MongoTemplate' (OnClassCondition) + + MongoMetricsAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.mongodb.MongoClientSettings' (OnClassCondition) + + MongoReactiveAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.mongodb.reactivestreams.client.MongoClient' (OnClassCondition) + + MongoReactiveDataAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.mongodb.reactivestreams.client.MongoClient' (OnClassCondition) + + MongoReactiveHealthContributorAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'reactor.core.publisher.Flux' (OnClassCondition) + + MongoReactiveRepositoriesAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.mongodb.reactivestreams.client.MongoClient' (OnClassCondition) + + MongoRepositoriesAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.mongodb.client.MongoClient' (OnClassCondition) + + MustacheAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.samskivert.mustache.Mustache' (OnClassCondition) + + Neo4jAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.neo4j.driver.Driver' (OnClassCondition) + + Neo4jDataAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.neo4j.driver.Driver' (OnClassCondition) + + Neo4jHealthContributorAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.neo4j.driver.Driver' (OnClassCondition) + + Neo4jReactiveDataAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.neo4j.driver.Driver' (OnClassCondition) + + Neo4jReactiveRepositoriesAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.neo4j.driver.Driver' (OnClassCondition) + + Neo4jRepositoriesAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.neo4j.driver.Driver' (OnClassCondition) + + NettyAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.netty.util.NettyRuntime' (OnClassCondition) + + NewRelicMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.newrelic.NewRelicMeterRegistry' (OnClassCondition) + + NoOpMeterRegistryConfiguration: + Did not match: + - @ConditionalOnMissingBean (types: io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) found beans of type 'io.micrometer.core.instrument.MeterRegistry' simpleMeterRegistry (OnBeanCondition) + + NoopTracerAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.tracing.Tracer' (OnClassCondition) + + OAuth2AuthorizationServerAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.security.oauth2.server.authorization.OAuth2Authorization' (OnClassCondition) + + OAuth2AuthorizationServerJwtAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.nimbusds.jose.jwk.source.JWKSource' (OnClassCondition) + + OAuth2ClientAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.security.config.annotation.web.configuration.EnableWebSecurity' (OnClassCondition) + + OAuth2ResourceServerAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.security.oauth2.server.resource.authentication.BearerTokenAuthenticationToken' (OnClassCondition) + + ObservationAutoConfiguration.MeterObservationHandlerConfiguration.TracingAndMetricsObservationHandlerConfiguration: + Did not match: + - @ConditionalOnBean did not find required type 'io.micrometer.tracing.Tracer' (OnBeanCondition) + - @ConditionalOnBean (types: io.micrometer.tracing.Tracer; SearchStrategy: all) did not find any beans of type io.micrometer.tracing.Tracer (OnBeanCondition) + + ObservationAutoConfiguration.MetricsWithTracingConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.tracing.Tracer' (OnClassCondition) + + ObservationAutoConfiguration.ObservedAspectConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.aspectj.weaver.Advice' (OnClassCondition) + + ObservationAutoConfiguration.OnlyTracingConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.tracing.Tracer' (OnClassCondition) + + OpenTelemetryAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.opentelemetry.sdk.OpenTelemetrySdk' (OnClassCondition) + + OpenTelemetryLoggingAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.opentelemetry.api.OpenTelemetry' (OnClassCondition) + + OpenTelemetryTracingAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.tracing.otel.bridge.OtelTracer' (OnClassCondition) + + OtlpLoggingAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.opentelemetry.api.OpenTelemetry' (OnClassCondition) + + OtlpMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.registry.otlp.OtlpMeterRegistry' (OnClassCondition) + + OtlpTracingAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.tracing.otel.bridge.OtelTracer' (OnClassCondition) + + PersistenceExceptionTranslationAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor' (OnClassCondition) + + ProjectInfoAutoConfiguration#buildProperties: + Did not match: + - @ConditionalOnResource did not find resource '${spring.info.build.location:classpath:META-INF/build-info.properties}' (OnResourceCondition) + + ProjectInfoAutoConfiguration#gitProperties: + Did not match: + - GitResource did not find git info at classpath:git.properties (ProjectInfoAutoConfiguration.GitResourceAvailableCondition) + + PrometheusExemplarsAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.tracing.Tracer' (OnClassCondition) + + PrometheusMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.prometheusmetrics.PrometheusMeterRegistry' (OnClassCondition) + + PrometheusSimpleclientExemplarsAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.tracing.Tracer' (OnClassCondition) + + PrometheusSimpleclientMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.prometheus.PrometheusMeterRegistry' (OnClassCondition) + + PulsarAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.apache.pulsar.client.api.PulsarClient' (OnClassCondition) + + PulsarReactiveAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.apache.pulsar.client.api.PulsarClient' (OnClassCondition) + + QuartzAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.quartz.Scheduler' (OnClassCondition) + + QuartzEndpointAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.quartz.Scheduler' (OnClassCondition) + + R2dbcAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.r2dbc.spi.ConnectionFactory' (OnClassCondition) + + R2dbcDataAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.data.r2dbc.core.R2dbcEntityTemplate' (OnClassCondition) + + R2dbcInitializationConfiguration: + Did not match: + - @ConditionalOnClass did not find required classes 'io.r2dbc.spi.ConnectionFactory', 'org.springframework.r2dbc.connection.init.DatabasePopulator' (OnClassCondition) + + R2dbcObservationAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.r2dbc.proxy.ProxyConnectionFactory' (OnClassCondition) + + R2dbcProxyAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.r2dbc.proxy.ProxyConnectionFactory' (OnClassCondition) + + R2dbcRepositoriesAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.r2dbc.spi.ConnectionFactory' (OnClassCondition) + + R2dbcTransactionManagerAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.r2dbc.connection.R2dbcTransactionManager' (OnClassCondition) + + RSocketGraphQlClientAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'graphql.GraphQL' (OnClassCondition) + + RSocketMessagingAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.rsocket.RSocket' (OnClassCondition) + + RSocketRequesterAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.rsocket.RSocket' (OnClassCondition) + + RSocketSecurityAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.security.rsocket.core.SecuritySocketAcceptorInterceptor' (OnClassCondition) + + RSocketServerAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.rsocket.core.RSocketServer' (OnClassCondition) + + RSocketStrategiesAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.netty.buffer.PooledByteBufAllocator' (OnClassCondition) + + RabbitAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.rabbitmq.client.Channel' (OnClassCondition) + + RabbitHealthContributorAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.amqp.rabbit.core.RabbitTemplate' (OnClassCondition) + + RabbitMetricsAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.rabbitmq.client.ConnectionFactory' (OnClassCondition) + + ReactiveCloudFoundryActuatorAutoConfiguration: + Did not match: + - @ConditionalOnWebApplication did not find reactive web application classes (OnWebApplicationCondition) + + ReactiveElasticsearchClientAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'co.elastic.clients.transport.ElasticsearchTransport' (OnClassCondition) + + ReactiveElasticsearchRepositoriesAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'reactor.core.publisher.Mono' (OnClassCondition) + + ReactiveHealthEndpointConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'reactor.core.publisher.Flux' (OnClassCondition) + + ReactiveManagementContextAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'reactor.core.publisher.Flux' (OnClassCondition) + + ReactiveManagementWebSecurityAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity' (OnClassCondition) + + ReactiveMultipartAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.web.reactive.config.WebFluxConfigurer' (OnClassCondition) + + ReactiveOAuth2ClientAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'reactor.core.publisher.Flux' (OnClassCondition) + + ReactiveOAuth2ResourceServerAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity' (OnClassCondition) + + ReactiveSecurityAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'reactor.core.publisher.Flux' (OnClassCondition) + + ReactiveUserDetailsServiceAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.security.authentication.ReactiveAuthenticationManager' (OnClassCondition) + + ReactiveWebServerFactoryAutoConfiguration: + Did not match: + - @ConditionalOnWebApplication did not find reactive web application classes (OnWebApplicationCondition) + + ReactorAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'reactor.core.publisher.Hooks' (OnClassCondition) + + RedisAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.data.redis.core.RedisOperations' (OnClassCondition) + + RedisCacheConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.data.redis.connection.RedisConnectionFactory' (OnClassCondition) + + RedisHealthContributorAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.data.redis.connection.RedisConnectionFactory' (OnClassCondition) + + RedisReactiveAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'reactor.core.publisher.Flux' (OnClassCondition) + + RedisReactiveHealthContributorAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'reactor.core.publisher.Flux' (OnClassCondition) + + RedisRepositoriesAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.data.redis.repository.configuration.EnableRedisRepositories' (OnClassCondition) + + RepositoryMetricsAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.data.repository.Repository' (OnClassCondition) + + RepositoryRestMvcAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration' (OnClassCondition) + + Saml2RelyingPartyAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistrationRepository' (OnClassCondition) + + SbomEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + + ScheduledTasksEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + + SecurityAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.security.authentication.DefaultAuthenticationEventPublisher' (OnClassCondition) + + SecurityFilterAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.security.config.http.SessionCreationPolicy' (OnClassCondition) + + SecurityRequestMatchersManagementContextConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.security.web.util.matcher.RequestMatcher' (OnClassCondition) + + SendGridAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.sendgrid.SendGrid' (OnClassCondition) + + ServletEndpointManagementContextConfiguration.JerseyServletEndpointManagementContextConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.glassfish.jersey.server.ResourceConfig' (OnClassCondition) + + ServletManagementContextAutoConfiguration.ApplicationContextFilterConfiguration: + Did not match: + - @ConditionalOnProperty (management.server.add-application-context-header=true) did not find property 'add-application-context-header' (OnPropertyCondition) + + ServletWebServerFactoryAutoConfiguration.ForwardedHeaderFilterConfiguration: + Did not match: + - @ConditionalOnProperty (server.forward-headers-strategy=framework) did not find property 'server.forward-headers-strategy' (OnPropertyCondition) + + ServletWebServerFactoryConfiguration.EmbeddedJetty: + Did not match: + - @ConditionalOnClass did not find required classes 'org.eclipse.jetty.server.Server', 'org.eclipse.jetty.util.Loader', 'org.eclipse.jetty.ee10.webapp.WebAppContext' (OnClassCondition) + + ServletWebServerFactoryConfiguration.EmbeddedUndertow: + Did not match: + - @ConditionalOnClass did not find required classes 'io.undertow.Undertow', 'org.xnio.SslClientAuthMode' (OnClassCondition) + + SessionAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.session.Session' (OnClassCondition) + + SessionsEndpointAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.session.Session' (OnClassCondition) + + ShutdownEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint the configured access for endpoint 'shutdown' is NONE (OnAvailableEndpointCondition) + + SignalFxMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.signalfx.SignalFxMeterRegistry' (OnClassCondition) + + SpringApplicationAdminJmxAutoConfiguration: + Did not match: + - @ConditionalOnProperty (spring.application.admin.enabled=true) did not find property 'enabled' (OnPropertyCondition) + + SpringDataWebAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.data.web.PageableHandlerMethodArgumentResolver' (OnClassCondition) + + StackdriverMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.stackdriver.StackdriverMeterRegistry' (OnClassCondition) + + StartupEndpointAutoConfiguration: + Did not match: + - ApplicationStartup configured applicationStartup is of type class org.springframework.core.metrics.DefaultApplicationStartup, expected BufferingApplicationStartup. (StartupEndpointAutoConfiguration.ApplicationStartupCondition) + + StatsdMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.statsd.StatsdMeterRegistry' (OnClassCondition) + + TaskExecutorConfigurations.SimpleAsyncTaskExecutorBuilderConfiguration#simpleAsyncTaskExecutorBuilderVirtualThreads: + Did not match: + - @ConditionalOnMissingBean (types: org.springframework.boot.task.SimpleAsyncTaskExecutorBuilder; SearchStrategy: all) found beans of type 'org.springframework.boot.task.SimpleAsyncTaskExecutorBuilder' simpleAsyncTaskExecutorBuilder (OnBeanCondition) + + TaskExecutorConfigurations.TaskExecutorConfiguration: + Did not match: + - @ConditionalOnMissingBean (types: java.util.concurrent.Executor; SearchStrategy: all) found beans of type 'java.util.concurrent.Executor' threadPoolExecutor (OnBeanCondition) + + TaskSchedulingAutoConfiguration#scheduledBeanLazyInitializationExcludeFilter: + Did not match: + - @ConditionalOnBean (names: org.springframework.context.annotation.internalScheduledAnnotationProcessor; SearchStrategy: all) did not find any beans named org.springframework.context.annotation.internalScheduledAnnotationProcessor (OnBeanCondition) + + TaskSchedulingConfigurations.SimpleAsyncTaskSchedulerBuilderConfiguration#simpleAsyncTaskSchedulerBuilderVirtualThreads: + Did not match: + - @ConditionalOnMissingBean (types: org.springframework.boot.task.SimpleAsyncTaskSchedulerBuilder; SearchStrategy: all) found beans of type 'org.springframework.boot.task.SimpleAsyncTaskSchedulerBuilder' simpleAsyncTaskSchedulerBuilder (OnBeanCondition) + + TaskSchedulingConfigurations.TaskSchedulerConfiguration: + Did not match: + - @ConditionalOnBean (names: org.springframework.context.annotation.internalScheduledAnnotationProcessor; SearchStrategy: all) did not find any beans named org.springframework.context.annotation.internalScheduledAnnotationProcessor (OnBeanCondition) + + ThreadDumpEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + + ThymeleafAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.thymeleaf.spring6.SpringTemplateEngine' (OnClassCondition) + + TransactionAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.transaction.PlatformTransactionManager' (OnClassCondition) + + TransactionManagerCustomizationAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.transaction.PlatformTransactionManager' (OnClassCondition) + + UserDetailsServiceAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.security.authentication.AuthenticationManager' (OnClassCondition) + + WavefrontAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.wavefront.sdk.common.application.ApplicationTags' (OnClassCondition) + + WavefrontMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.wavefront.sdk.common.WavefrontSender' (OnClassCondition) + + WavefrontTracingAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.wavefront.sdk.common.WavefrontSender' (OnClassCondition) + + WebClientAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.web.reactive.function.client.WebClient' (OnClassCondition) + + WebClientObservationConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.web.reactive.function.client.WebClient' (OnClassCondition) + + WebFluxAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.web.reactive.config.WebFluxConfigurer' (OnClassCondition) + + WebFluxEndpointManagementContextConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.web.reactive.DispatcherHandler' (OnClassCondition) + + WebFluxObservationAutoConfiguration: + Did not match: + - @ConditionalOnWebApplication did not find reactive web application classes (OnWebApplicationCondition) + + WebMvcAutoConfiguration#hiddenHttpMethodFilter: + Did not match: + - @ConditionalOnProperty (spring.mvc.hiddenmethod.filter.enabled) did not find property 'enabled' (OnPropertyCondition) + + WebMvcAutoConfiguration.ProblemDetailsErrorHandlingConfiguration: + Did not match: + - @ConditionalOnProperty (spring.mvc.problemdetails.enabled=true) did not find property 'enabled' (OnPropertyCondition) + + WebMvcAutoConfiguration.ResourceChainCustomizerConfiguration: + Did not match: + - @ConditionalOnEnabledResourceChain did not find class org.webjars.WebJarVersionLocator (OnEnabledResourceChainCondition) + + WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter#beanNameViewResolver: + Did not match: + - @ConditionalOnMissingBean (types: org.springframework.web.servlet.view.BeanNameViewResolver; SearchStrategy: all) found beans of type 'org.springframework.web.servlet.view.BeanNameViewResolver' beanNameViewResolver (OnBeanCondition) + + WebMvcEndpointManagementContextConfiguration#managementHealthEndpointWebMvcHandlerMapping: + Did not match: + - Management Port actual port type (SAME) did not match required type (DIFFERENT) (OnManagementPortCondition) + + WebServiceTemplateAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.oxm.Marshaller' (OnClassCondition) + + WebServicesAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.ws.transport.http.MessageDispatcherServlet' (OnClassCondition) + + WebSessionIdResolverAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'reactor.core.publisher.Mono' (OnClassCondition) + + WebSocketMessagingAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer' (OnClassCondition) + + WebSocketReactiveAutoConfiguration: + Did not match: + - @ConditionalOnWebApplication did not find reactive web application classes (OnWebApplicationCondition) + + WebSocketServletAutoConfiguration.JettyWebSocketConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.eclipse.jetty.ee10.websocket.jakarta.server.config.JakartaWebSocketServletContainerInitializer' (OnClassCondition) + + WebSocketServletAutoConfiguration.UndertowWebSocketConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.undertow.websockets.jsr.Bootstrap' (OnClassCondition) + + XADataSourceAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'jakarta.transaction.TransactionManager' (OnClassCondition) + + ZipkinAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'zipkin2.reporter.Encoding' (OnClassCondition) + + +Exclusions: +----------- + + None + + +Unconditional classes: +---------------------- + + org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration + + org.springframework.boot.actuate.autoconfigure.availability.AvailabilityHealthContributorAutoConfiguration + + org.springframework.boot.autoconfigure.ssl.SslAutoConfiguration + + org.springframework.boot.actuate.autoconfigure.info.InfoContributorAutoConfiguration + + org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration + + org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration + + org.springframework.boot.actuate.autoconfigure.metrics.integration.IntegrationMetricsAutoConfiguration + + org.springframework.boot.actuate.autoconfigure.endpoint.EndpointAutoConfiguration + + org.springframework.boot.actuate.autoconfigure.web.server.ManagementContextAutoConfiguration + + org.springframework.boot.actuate.autoconfigure.health.HealthContributorAutoConfiguration + + org.springframework.boot.actuate.autoconfigure.endpoint.jackson.JacksonEndpointAutoConfiguration + + org.springframework.boot.autoconfigure.availability.ApplicationAvailabilityAutoConfiguration + + org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration + + + +2025-06-16 15:24:32 [main] INFO c.o.t.TourguideApplicationTests - Started TourguideApplicationTests in 15.867 seconds (process running for 20.959) +2025-06-16 15:24:32 [main] DEBUG o.s.b.a.ApplicationAvailabilityBean - Application availability state LivenessState changed to CORRECT +2025-06-16 15:24:32 [main] DEBUG o.s.b.a.ApplicationAvailabilityBean - Application availability state ReadinessState changed to ACCEPTING_TRAFFIC +2025-06-16 15:24:32 [main] DEBUG o.springframework.test.context.cache - Spring test ApplicationContext cache statistics: [DefaultContextCache@5323999f size = 1, maxSize = 32, parentContextCount = 0, hitCount = 0, missCount = 1, failureCount = 0] +2025-06-16 15:24:32 [main] DEBUG o.s.t.c.w.ServletTestExecutionListener - Setting up MockHttpServletRequest, MockHttpServletResponse, ServletWebRequest, and RequestContextHolder for test class com.openclassrooms.tourguide.TourguideApplicationTests +2025-06-16 15:24:32 [main] DEBUG o.s.t.c.s.DependencyInjectionTestExecutionListener - Performing dependency injection for test class com.openclassrooms.tourguide.TourguideApplicationTests +2025-06-16 15:24:32 [main] DEBUG o.springframework.test.context.cache - Spring test ApplicationContext cache statistics: [DefaultContextCache@5323999f size = 1, maxSize = 32, parentContextCount = 0, hitCount = 1, missCount = 1, failureCount = 0] +2025-06-16 15:24:32 [main] DEBUG o.springframework.test.context.cache - Spring test ApplicationContext cache statistics: [DefaultContextCache@5323999f size = 1, maxSize = 32, parentContextCount = 0, hitCount = 2, missCount = 1, failureCount = 0] +2025-06-16 15:24:33 [main] DEBUG o.s.t.c.s.DirtiesContextBeforeModesTestExecutionListener - Before test method: class [TourguideApplicationTests], method [contextLoads], class annotated with @DirtiesContext [false] with mode [null], method annotated with @DirtiesContext [false] with mode [null] +2025-06-16 15:24:33 [main] DEBUG o.springframework.test.context.cache - Spring test ApplicationContext cache statistics: [DefaultContextCache@5323999f size = 1, maxSize = 32, parentContextCount = 0, hitCount = 3, missCount = 1, failureCount = 0] +2025-06-16 15:24:33 [main] DEBUG o.springframework.test.context.cache - Spring test ApplicationContext cache statistics: [DefaultContextCache@5323999f size = 1, maxSize = 32, parentContextCount = 0, hitCount = 4, missCount = 1, failureCount = 0] +2025-06-16 15:24:36 [main] DEBUG o.springframework.test.context.cache - Spring test ApplicationContext cache statistics: [DefaultContextCache@5323999f size = 1, maxSize = 32, parentContextCount = 0, hitCount = 5, missCount = 1, failureCount = 0] +2025-06-16 15:24:36 [main] DEBUG o.springframework.test.context.cache - Spring test ApplicationContext cache statistics: [DefaultContextCache@5323999f size = 1, maxSize = 32, parentContextCount = 0, hitCount = 6, missCount = 1, failureCount = 0] +2025-06-16 15:24:36 [main] DEBUG o.springframework.test.context.cache - Spring test ApplicationContext cache statistics: [DefaultContextCache@5323999f size = 1, maxSize = 32, parentContextCount = 0, hitCount = 7, missCount = 1, failureCount = 0] +2025-06-16 15:24:36 [main] DEBUG o.springframework.test.context.cache - Spring test ApplicationContext cache statistics: [DefaultContextCache@5323999f size = 1, maxSize = 32, parentContextCount = 0, hitCount = 8, missCount = 1, failureCount = 0] +2025-06-16 15:24:36 [main] DEBUG o.springframework.test.context.cache - Spring test ApplicationContext cache statistics: [DefaultContextCache@5323999f size = 1, maxSize = 32, parentContextCount = 0, hitCount = 9, missCount = 1, failureCount = 0] +2025-06-16 15:24:36 [main] DEBUG o.springframework.test.context.cache - Spring test ApplicationContext cache statistics: [DefaultContextCache@5323999f size = 1, maxSize = 32, parentContextCount = 0, hitCount = 10, missCount = 1, failureCount = 0] +2025-06-16 15:24:36 [main] DEBUG o.springframework.test.context.cache - Spring test ApplicationContext cache statistics: [DefaultContextCache@5323999f size = 1, maxSize = 32, parentContextCount = 0, hitCount = 11, missCount = 1, failureCount = 0] +2025-06-16 15:24:36 [main] DEBUG o.springframework.test.context.cache - Spring test ApplicationContext cache statistics: [DefaultContextCache@5323999f size = 1, maxSize = 32, parentContextCount = 0, hitCount = 12, missCount = 1, failureCount = 0] +2025-06-16 15:24:36 [main] DEBUG o.springframework.test.context.cache - Spring test ApplicationContext cache statistics: [DefaultContextCache@5323999f size = 1, maxSize = 32, parentContextCount = 0, hitCount = 13, missCount = 1, failureCount = 0] +2025-06-16 15:24:36 [main] DEBUG o.s.t.c.s.DirtiesContextTestExecutionListener - After test method: class [TourguideApplicationTests], method [contextLoads], class annotated with @DirtiesContext [false] with mode [null], method annotated with @DirtiesContext [false] with mode [null] +2025-06-16 15:24:36 [main] DEBUG o.s.t.c.w.ServletTestExecutionListener - Resetting RequestContextHolder for test class com.openclassrooms.tourguide.TourguideApplicationTests +2025-06-16 15:24:36 [main] DEBUG o.springframework.test.context.cache - Spring test ApplicationContext cache statistics: [DefaultContextCache@5323999f size = 1, maxSize = 32, parentContextCount = 0, hitCount = 14, missCount = 1, failureCount = 0] +2025-06-16 15:24:36 [main] DEBUG o.springframework.test.context.cache - Spring test ApplicationContext cache statistics: [DefaultContextCache@5323999f size = 1, maxSize = 32, parentContextCount = 0, hitCount = 15, missCount = 1, failureCount = 0] +2025-06-16 15:24:36 [main] DEBUG o.s.t.c.s.DirtiesContextTestExecutionListener - After test class: class [TourguideApplicationTests], class annotated with @DirtiesContext [false] with mode [null] +2025-06-16 15:24:36 [main] INFO c.o.t.unitaire.TestPerformance - Initializing ExecutorService +2025-06-16 15:24:37 [main] INFO c.o.t.unitaire.TestPerformance - Tracking 100000 users... +2025-06-16 15:24:53 [pool-5-thread-21] INFO c.o.tourguide.service.RewardsService - Processing rewards for user: internalUser14283 +2025-06-16 15:25:15 [pool-5-thread-11] INFO c.o.tourguide.service.RewardsService - Processing rewards for user: internalUser68928 +2025-06-16 15:25:36 [pool-5-thread-138] INFO c.o.tourguide.service.RewardsService - Processing rewards for user: internalUser95514 +2025-06-16 15:26:01 [pool-5-thread-64] INFO c.o.tourguide.service.RewardsService - Processing rewards for user: internalUser62094 +2025-06-16 15:26:31 [pool-5-thread-97] INFO c.o.tourguide.service.RewardsService - Processing rewards for user: internalUser24725 +2025-06-16 15:26:34 [pool-5-thread-88] INFO c.o.tourguide.service.RewardsService - Processing rewards for user: internalUser43563 +2025-06-16 15:26:39 [pool-5-thread-68] INFO c.o.tourguide.service.RewardsService - Processing rewards for user: internalUser77807 +2025-06-16 15:26:56 [pool-5-thread-56] INFO c.o.tourguide.service.RewardsService - Processing rewards for user: internalUser59632 +2025-06-16 15:27:06 [pool-5-thread-60] INFO c.o.tourguide.service.RewardsService - Processing rewards for user: internalUser83995 +2025-06-16 15:27:20 [pool-5-thread-95] INFO c.o.tourguide.service.RewardsService - Processing rewards for user: internalUser26647 +2025-06-16 15:27:44 [pool-5-thread-19] INFO c.o.tourguide.service.RewardsService - Processing rewards for user: internalUser13795 +2025-06-16 15:27:56 [pool-5-thread-105] INFO c.o.tourguide.service.RewardsService - Processing rewards for user: internalUser72225 +2025-06-16 15:28:04 [main] INFO c.o.t.unitaire.TestPerformance - ===== FINAL RESULT ===== +2025-06-16 15:28:04 [main] INFO c.o.t.unitaire.TestPerformance - highVolumeTrackLocation: Time Elapsed: 206 seconds. +2025-06-16 15:28:05 [main] INFO c.o.t.unitaire.TestPerformance - Tracking 100000 users... +2025-06-16 15:28:09 [pool-5-thread-113] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:28:11 [pool-5-thread-149] INFO c.o.tourguide.service.RewardsService - Processing rewards for user: internalUser3192 +2025-06-16 15:28:13 [pool-5-thread-44] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:28:13 [pool-5-thread-4] INFO c.o.tourguide.service.RewardsService - Processing rewards for user: internalUser3270 +2025-06-16 15:28:17 [pool-5-thread-96] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:28:21 [pool-5-thread-137] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:28:25 [pool-5-thread-77] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:28:26 [pool-5-thread-128] INFO c.o.tourguide.service.RewardsService - Processing rewards for user: internalUser48622 +2025-06-16 15:28:29 [pool-5-thread-149] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:28:34 [pool-5-thread-115] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:28:38 [pool-5-thread-68] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:28:42 [pool-5-thread-83] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:28:46 [pool-5-thread-33] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:28:50 [pool-5-thread-32] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:28:52 [pool-5-thread-95] INFO c.o.tourguide.service.RewardsService - Processing rewards for user: internalUser49444 +2025-06-16 15:28:54 [pool-5-thread-128] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:28:58 [pool-5-thread-86] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:29:02 [pool-5-thread-44] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:29:06 [pool-5-thread-94] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:29:10 [pool-5-thread-121] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:29:14 [pool-5-thread-25] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:29:18 [pool-5-thread-19] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:29:22 [pool-5-thread-35] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:29:25 [pool-4-thread-1] DEBUG c.o.tourguide.tracker.Tracker - Begin Tracker. Tracking 100000 users. +2025-06-16 15:29:25 [pool-4-thread-1] DEBUG c.o.tourguide.tracker.Tracker - Tracker Time Elapsed: 0 seconds. +2025-06-16 15:29:26 [pool-5-thread-56] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:29:30 [pool-5-thread-71] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:29:34 [pool-5-thread-145] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:29:38 [pool-5-thread-2] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:29:42 [pool-5-thread-29] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:29:46 [pool-5-thread-59] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:29:47 [pool-5-thread-111] INFO c.o.tourguide.service.RewardsService - Processing rewards for user: internalUser5425 +2025-06-16 15:29:50 [pool-5-thread-90] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:29:54 [pool-5-thread-80] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:29:56 [pool-5-thread-107] INFO c.o.tourguide.service.RewardsService - Processing rewards for user: internalUser5621 +2025-06-16 15:29:58 [pool-5-thread-139] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:30:02 [pool-5-thread-14] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:30:06 [pool-5-thread-37] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:30:10 [pool-5-thread-147] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:30:10 [pool-5-thread-25] INFO c.o.tourguide.service.RewardsService - Processing rewards for user: internalUser80417 +2025-06-16 15:30:10 [pool-5-thread-20] INFO c.o.tourguide.service.RewardsService - Processing rewards for user: internalUser55560 +2025-06-16 15:30:12 [pool-5-thread-21] INFO c.o.tourguide.service.RewardsService - Processing rewards for user: internalUser94989 +2025-06-16 15:30:14 [pool-5-thread-97] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:30:19 [pool-5-thread-62] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:30:23 [pool-5-thread-16] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:30:27 [pool-5-thread-9] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:30:31 [pool-5-thread-26] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:30:35 [pool-5-thread-10] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:30:39 [pool-5-thread-18] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:30:43 [pool-5-thread-124] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:30:47 [pool-5-thread-52] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:30:51 [pool-5-thread-114] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:30:55 [pool-5-thread-135] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:30:55 [pool-5-thread-142] INFO c.o.tourguide.service.RewardsService - Processing rewards for user: internalUser23648 +2025-06-16 15:30:59 [pool-5-thread-122] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:31:03 [pool-5-thread-108] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:31:04 [pool-5-thread-64] INFO c.o.tourguide.service.RewardsService - Processing rewards for user: internalUser56805 +2025-06-16 15:31:07 [pool-5-thread-122] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:31:11 [pool-5-thread-119] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:31:11 [pool-5-thread-19] INFO c.o.tourguide.service.RewardsService - Processing rewards for user: internalUser95846 +2025-06-16 15:31:15 [pool-5-thread-148] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:31:19 [pool-5-thread-87] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:31:23 [pool-5-thread-134] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:31:27 [pool-5-thread-67] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:31:31 [pool-5-thread-13] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:31:35 [pool-5-thread-7] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:31:36 [pool-5-thread-38] INFO c.o.tourguide.service.RewardsService - Processing rewards for user: internalUser10731 +2025-06-16 15:31:39 [pool-5-thread-89] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:31:43 [pool-5-thread-15] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:31:47 [pool-5-thread-76] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:31:47 [pool-5-thread-15] INFO c.o.tourguide.service.RewardsService - Processing rewards for user: internalUser97657 +2025-06-16 15:31:51 [pool-5-thread-101] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:31:55 [pool-5-thread-54] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:31:59 [pool-5-thread-110] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:31:59 [pool-5-thread-110] INFO c.o.tourguide.service.RewardsService - Processing rewards for user: internalUser57532 +2025-06-16 15:32:03 [pool-5-thread-111] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:32:07 [pool-5-thread-5] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:32:11 [pool-5-thread-99] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:32:15 [pool-5-thread-17] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:32:19 [pool-5-thread-131] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:32:23 [pool-5-thread-122] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:32:27 [pool-5-thread-20] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:32:31 [pool-5-thread-146] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:32:35 [pool-5-thread-137] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:32:40 [pool-5-thread-144] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:32:44 [pool-5-thread-103] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:32:48 [pool-5-thread-141] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:32:52 [pool-5-thread-119] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:32:56 [pool-5-thread-125] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:33:00 [pool-5-thread-44] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:33:04 [pool-5-thread-25] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:33:08 [pool-5-thread-44] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:33:11 [pool-5-thread-58] INFO c.o.tourguide.service.RewardsService - Processing rewards for user: internalUser9975 +2025-06-16 15:33:12 [pool-5-thread-88] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:33:16 [pool-5-thread-30] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:33:20 [pool-5-thread-87] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:33:24 [pool-5-thread-13] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:33:28 [pool-5-thread-80] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:33:32 [pool-5-thread-61] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:33:36 [pool-5-thread-125] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:33:40 [pool-5-thread-63] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:33:44 [pool-5-thread-80] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:33:48 [pool-5-thread-131] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:33:53 [pool-5-thread-137] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:33:57 [pool-5-thread-127] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:34:01 [pool-5-thread-39] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:34:05 [pool-5-thread-129] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:34:07 [pool-5-thread-36] INFO c.o.tourguide.service.RewardsService - Processing rewards for user: internalUser47041 +2025-06-16 15:34:09 [pool-5-thread-86] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:34:13 [pool-5-thread-4] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:34:17 [pool-5-thread-119] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:34:21 [pool-5-thread-114] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:34:25 [pool-4-thread-2] DEBUG c.o.tourguide.tracker.Tracker - Begin Tracker. Tracking 100000 users. +2025-06-16 15:34:25 [pool-4-thread-2] DEBUG c.o.tourguide.tracker.Tracker - Tracker Time Elapsed: 0 seconds. +2025-06-16 15:34:25 [pool-5-thread-91] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:34:27 [pool-5-thread-129] INFO c.o.tourguide.service.RewardsService - Processing rewards for user: internalUser2480 +2025-06-16 15:34:29 [pool-5-thread-100] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:34:33 [pool-5-thread-54] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:34:37 [pool-5-thread-36] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:34:41 [pool-5-thread-60] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:34:45 [pool-5-thread-102] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:34:49 [pool-5-thread-23] INFO c.o.t.unitaire.TestPerformance - All rewards calculated +2025-06-16 15:34:49 [main] INFO c.o.t.unitaire.TestPerformance - ===== FINAL RESULT ===== +2025-06-16 15:34:49 [main] INFO c.o.t.unitaire.TestPerformance - highVolumeGetRewards: Time Elapsed: 404 seconds. +2025-06-16 15:34:49 [main] INFO c.o.t.unitaire.TestRewardsService - Initializing ExecutorService +2025-06-16 15:35:04 [main] INFO c.o.t.unitaire.TestRewardsService - Expected: 26, Actual: 26 +2025-06-16 15:35:04 [main] INFO c.o.t.unitaire.TestTourGuideService - Initializing ExecutorService +2025-06-16 15:35:05 [main] INFO c.o.t.unitaire.TestTourGuideService - Number of attractions available : 26 +2025-06-16 15:35:05 [SpringApplicationShutdownHook] DEBUG o.s.w.c.s.GenericWebApplicationContext - Closing org.springframework.web.context.support.GenericWebApplicationContext@6d64b553, started on Mon Jun 16 15:24:17 CEST 2025 +2025-06-16 15:35:05 [SpringApplicationShutdownHook] DEBUG o.s.c.s.DefaultLifecycleProcessor - Stopping beans in phase -2147483647 +2025-06-16 15:35:05 [SpringApplicationShutdownHook] DEBUG o.s.c.s.DefaultLifecycleProcessor - Bean 'springBootLoggingLifecycle' completed its stop procedure +2025-06-16 15:35:05 [SpringApplicationShutdownHook] DEBUG o.s.b.f.s.DisposableBeanAdapter - Custom destroy method 'close' on bean with name 'simpleMeterRegistry' completed +2025-06-16 15:35:05 [SpringApplicationShutdownHook] DEBUG o.s.b.f.s.DisposableBeanAdapter - Custom destroy method 'shutdown' on bean with name 'threadPoolExecutor' completed diff --git a/TourGuide/pom.xml b/TourGuide/pom.xml index d3aaeeb349..3e61d47b3d 100644 --- a/TourGuide/pom.xml +++ b/TourGuide/pom.xml @@ -1,22 +1,30 @@ - 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - 3.1.1 - - + com.openclassrooms tourguide 0.0.1-SNAPSHOT + tourguide Demo project for Spring Boot + + + org.springframework.boot + spring-boot-starter-parent + 3.4.6 + + + 17 + + org.springframework.boot spring-boot-starter-actuator @@ -35,7 +43,7 @@ spring-boot-starter-test test - + org.apache.commons commons-lang3 @@ -64,6 +72,16 @@ rewardCentral 1.0.0 + + + org.projectlombok + lombok + provided + + + com.github.ben-manes.caffeine + caffeine + @@ -72,7 +90,77 @@ org.springframework.boot spring-boot-maven-plugin + + org.apache.maven.plugins + maven-compiler-plugin + 3.14.0 + + ${java.version} + + + org.projectlombok + lombok + 1.18.38 + + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.6.3 + + + javadoc + package + + javadoc + + + + + private + false + + + + + org.jacoco + jacoco-maven-plugin + 0.8.8 + + + prepare-agent + + prepare-agent + + + + report + verify + + report + + + + + + org.apache.maven.plugins + maven-surefire-report-plugin + 3.0.0-M7 + + + surefire-report + verify + + report + + + + + - + \ No newline at end of file diff --git a/TourGuide/src/main/java/com/openclassrooms/tourguide/TourGuideController.java b/TourGuide/src/main/java/com/openclassrooms/tourguide/TourGuideController.java deleted file mode 100644 index a884e6590b..0000000000 --- a/TourGuide/src/main/java/com/openclassrooms/tourguide/TourGuideController.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.openclassrooms.tourguide; - -import java.util.List; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import gpsUtil.location.Attraction; -import gpsUtil.location.VisitedLocation; - -import com.openclassrooms.tourguide.service.TourGuideService; -import com.openclassrooms.tourguide.user.User; -import com.openclassrooms.tourguide.user.UserReward; - -import tripPricer.Provider; - -@RestController -public class TourGuideController { - - @Autowired - TourGuideService tourGuideService; - - @RequestMapping("/") - public String index() { - return "Greetings from TourGuide!"; - } - - @RequestMapping("/getLocation") - public VisitedLocation getLocation(@RequestParam String userName) { - return tourGuideService.getUserLocation(getUser(userName)); - } - - // TODO: Change this method to no longer return a List of Attractions. - // Instead: Get the closest five tourist attractions to the user - no matter how far away they are. - // Return a new JSON object that contains: - // Name of Tourist attraction, - // Tourist attractions lat/long, - // The user's location lat/long, - // The distance in miles between the user's location and each of the attractions. - // The reward points for visiting each Attraction. - // Note: Attraction reward points can be gathered from RewardsCentral - @RequestMapping("/getNearbyAttractions") - public List getNearbyAttractions(@RequestParam String userName) { - VisitedLocation visitedLocation = tourGuideService.getUserLocation(getUser(userName)); - return tourGuideService.getNearByAttractions(visitedLocation); - } - - @RequestMapping("/getRewards") - public List getRewards(@RequestParam String userName) { - return tourGuideService.getUserRewards(getUser(userName)); - } - - @RequestMapping("/getTripDeals") - public List getTripDeals(@RequestParam String userName) { - return tourGuideService.getTripDeals(getUser(userName)); - } - - private User getUser(String userName) { - return tourGuideService.getUser(userName); - } - - -} \ No newline at end of file diff --git a/TourGuide/src/main/java/com/openclassrooms/tourguide/TourguideApplication.java b/TourGuide/src/main/java/com/openclassrooms/tourguide/TourguideApplication.java index c349efdd67..6c202b620a 100644 --- a/TourGuide/src/main/java/com/openclassrooms/tourguide/TourguideApplication.java +++ b/TourGuide/src/main/java/com/openclassrooms/tourguide/TourguideApplication.java @@ -9,5 +9,4 @@ public class TourguideApplication { public static void main(String[] args) { SpringApplication.run(TourguideApplication.class, args); } - } diff --git a/TourGuide/src/main/java/com/openclassrooms/tourguide/configuration/ExecutorConfig.java b/TourGuide/src/main/java/com/openclassrooms/tourguide/configuration/ExecutorConfig.java new file mode 100644 index 0000000000..0714fc4ed2 --- /dev/null +++ b/TourGuide/src/main/java/com/openclassrooms/tourguide/configuration/ExecutorConfig.java @@ -0,0 +1,18 @@ +package com.openclassrooms.tourguide.configuration; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class ExecutorConfig { + + @Bean(destroyMethod = "shutdown") + public ExecutorService threadPoolExecutor() { + + int threads = Math.max(4, Runtime.getRuntime().availableProcessors()); + return Executors.newFixedThreadPool(threads); + } +} diff --git a/TourGuide/src/main/java/com/openclassrooms/tourguide/TourGuideModule.java b/TourGuide/src/main/java/com/openclassrooms/tourguide/configuration/TourGuideModule.java similarity index 59% rename from TourGuide/src/main/java/com/openclassrooms/tourguide/TourGuideModule.java rename to TourGuide/src/main/java/com/openclassrooms/tourguide/configuration/TourGuideModule.java index 8c005856d7..75a80981d9 100644 --- a/TourGuide/src/main/java/com/openclassrooms/tourguide/TourGuideModule.java +++ b/TourGuide/src/main/java/com/openclassrooms/tourguide/configuration/TourGuideModule.java @@ -1,28 +1,32 @@ -package com.openclassrooms.tourguide; +package com.openclassrooms.tourguide.configuration; + +import java.util.concurrent.ExecutorService; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import com.openclassrooms.tourguide.service.RewardsService; + import gpsUtil.GpsUtil; import rewardCentral.RewardCentral; -import com.openclassrooms.tourguide.service.RewardsService; @Configuration public class TourGuideModule { - + @Bean public GpsUtil getGpsUtil() { return new GpsUtil(); } - + @Bean - public RewardsService getRewardsService() { - return new RewardsService(getGpsUtil(), getRewardCentral()); + public RewardsService getRewardsService(GpsUtil gpsUtil, RewardCentral rewardCentral, + ExecutorService threadPoolExecutor) { + return new RewardsService(gpsUtil, rewardCentral, threadPoolExecutor); } - + @Bean public RewardCentral getRewardCentral() { return new RewardCentral(); } - + } diff --git a/TourGuide/src/main/java/com/openclassrooms/tourguide/controller/TourGuideController.java b/TourGuide/src/main/java/com/openclassrooms/tourguide/controller/TourGuideController.java new file mode 100644 index 0000000000..3a1422ea8a --- /dev/null +++ b/TourGuide/src/main/java/com/openclassrooms/tourguide/controller/TourGuideController.java @@ -0,0 +1,88 @@ +package com.openclassrooms.tourguide.controller; + +import java.util.Comparator; +import java.util.List; +import java.util.UUID; +import java.util.stream.Collectors; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.openclassrooms.tourguide.dto.NearbyAttractionDTO; +import com.openclassrooms.tourguide.service.RewardsService; +import com.openclassrooms.tourguide.service.TourGuideService; +import com.openclassrooms.tourguide.user.User; +import com.openclassrooms.tourguide.user.UserReward; + +import gpsUtil.location.VisitedLocation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import tripPricer.Provider; + +@RestController +@RequiredArgsConstructor +@Slf4j +public class TourGuideController { + + private final TourGuideService tourGuideService; + private final RewardsService rewardsService; + + @RequestMapping("/") + public String index() { + return "Greetings from TourGuide!"; + } + + @RequestMapping("/getLocation") + public VisitedLocation getLocation(@RequestParam String userName) { + return tourGuideService.getUserLocation(getUser(userName)); + } + + @RequestMapping("/getNearbyAttractions") + public List getNearbyAttractions(@RequestParam String userName) { + User user = getUser(userName); + VisitedLocation visitedLocation = tourGuideService.getUserLocation(user); + + return tourGuideService.getNearByAttractions(visitedLocation).stream() + .map(attraction -> new NearbyAttractionDTO( + attraction.attractionName, + attraction.latitude, + attraction.longitude, + visitedLocation.location.latitude, + visitedLocation.location.longitude, + rewardsService.getDistance(attraction, visitedLocation.location), + rewardsService.getRewardPoints(attraction, user))) + .sorted(Comparator.comparingDouble(dto -> dto.distance)) + .limit(5) + .collect(Collectors.toList()); + } + + @RequestMapping("/getRewards") + public List getRewards(@RequestParam String userName) { + return tourGuideService.getUserRewards(getUser(userName)).parallelStream() + .collect(Collectors.toList()); + } + + @RequestMapping("/getTripDeals") + public List getTripDeals(@RequestParam String userName) { + return tourGuideService.getTripDeals(getUser(userName)).parallelStream() + .collect(Collectors.toList()); + } + + private User getUser(String userName) { + return tourGuideService.getUser(userName); + } + + @RequestMapping("/addUser") + public String addUser(@RequestParam String userName, @RequestParam String phoneNumber, @RequestParam String email) { + if (tourGuideService.getUser(userName) != null) { + return "User " + userName + " already exists"; + } + + User user = new User(UUID.randomUUID(), userName, phoneNumber, email); + tourGuideService.addUser(user); + + log.info("Utilisateur ajouté via l'API : " + userName); + return "User " + userName + " added successfully"; + } +} diff --git a/TourGuide/src/main/java/com/openclassrooms/tourguide/dto/NearbyAttractionDTO.java b/TourGuide/src/main/java/com/openclassrooms/tourguide/dto/NearbyAttractionDTO.java new file mode 100644 index 0000000000..04a004c12b --- /dev/null +++ b/TourGuide/src/main/java/com/openclassrooms/tourguide/dto/NearbyAttractionDTO.java @@ -0,0 +1,22 @@ +package com.openclassrooms.tourguide.dto; + +public class NearbyAttractionDTO { + public String attractionName; + public double attractionLatitude; + public double attractionLongitude; + public double userLatitude; + public double userLongitude; + public double distance; + public int rewardPoints; + + public NearbyAttractionDTO(String attractionName, double attractionLatitude, double attractionLongitude, + double userLatitude, double userLongitude, double distance, int rewardPoints) { + this.attractionName = attractionName; + this.attractionLatitude = attractionLatitude; + this.attractionLongitude = attractionLongitude; + this.userLatitude = userLatitude; + this.userLongitude = userLongitude; + this.distance = distance; + this.rewardPoints = rewardPoints; + } +} diff --git a/TourGuide/src/main/java/com/openclassrooms/tourguide/helper/InternalTestHelper.java b/TourGuide/src/main/java/com/openclassrooms/tourguide/helper/InternalTestHelper.java index 425ee31c94..5766acc8cb 100644 --- a/TourGuide/src/main/java/com/openclassrooms/tourguide/helper/InternalTestHelper.java +++ b/TourGuide/src/main/java/com/openclassrooms/tourguide/helper/InternalTestHelper.java @@ -3,12 +3,12 @@ public class InternalTestHelper { // Set this default up to 100,000 for testing - private static int internalUserNumber = 100; - + private static int internalUserNumber = 100000; + public static void setInternalUserNumber(int internalUserNumber) { InternalTestHelper.internalUserNumber = internalUserNumber; } - + public static int getInternalUserNumber() { return internalUserNumber; } diff --git a/TourGuide/src/main/java/com/openclassrooms/tourguide/service/RewardsService.java b/TourGuide/src/main/java/com/openclassrooms/tourguide/service/RewardsService.java index ad440eb484..7495145466 100644 --- a/TourGuide/src/main/java/com/openclassrooms/tourguide/service/RewardsService.java +++ b/TourGuide/src/main/java/com/openclassrooms/tourguide/service/RewardsService.java @@ -1,80 +1,157 @@ package com.openclassrooms.tourguide.service; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Semaphore; +import java.util.stream.Collectors; import org.springframework.stereotype.Service; +import com.openclassrooms.tourguide.user.User; +import com.openclassrooms.tourguide.user.UserReward; + import gpsUtil.GpsUtil; import gpsUtil.location.Attraction; import gpsUtil.location.Location; import gpsUtil.location.VisitedLocation; +import jakarta.annotation.PreDestroy; +import lombok.extern.slf4j.Slf4j; import rewardCentral.RewardCentral; -import com.openclassrooms.tourguide.user.User; -import com.openclassrooms.tourguide.user.UserReward; @Service +@Slf4j public class RewardsService { - private static final double STATUTE_MILES_PER_NAUTICAL_MILE = 1.15077945; - // proximity in miles - private int defaultProximityBuffer = 10; + private static final double STATUTE_MILES_PER_NAUTICAL_MILE = 1.15077945; + private final int defaultProximityBuffer = 10; private int proximityBuffer = defaultProximityBuffer; - private int attractionProximityRange = 200; + private final int attractionProximityRange = 200; + private final GpsUtil gpsUtil; private final RewardCentral rewardsCentral; - - public RewardsService(GpsUtil gpsUtil, RewardCentral rewardCentral) { + private final Map distanceCache = new ConcurrentHashMap<>(); + private final ExecutorService executor; + private List allUsers = Collections.synchronizedList(new ArrayList<>()); + + private static final int MAX_THREADS = Runtime.getRuntime().availableProcessors() * 4; + private static final Semaphore semaphore = new Semaphore(MAX_THREADS); + private int maxAttractionsToCheck = 10; + + public RewardsService(GpsUtil gpsUtil, RewardCentral rewardCentral, ExecutorService executorService) { this.gpsUtil = gpsUtil; this.rewardsCentral = rewardCentral; + this.executor = executorService; + + if (executor == null || executor.isShutdown()) { + throw new IllegalStateException("ExecutorService must be initialized and active"); + } + } + + public void setMaxAttractionsToCheck(int maxAttractionsToCheck) { + this.maxAttractionsToCheck = maxAttractionsToCheck; + } + + @PreDestroy + public void shutdownExecutor() { + executor.shutdown(); + } + + public void setAllUsers(List allUsers) { + if (allUsers == null || allUsers.isEmpty()) { + throw new IllegalStateException("User list is empty. Cannot initialize users."); + } + if (this.allUsers == null) { + this.allUsers = new ArrayList<>(); + } else { + this.allUsers.clear(); + } + this.allUsers.addAll(allUsers); } - + public void setProximityBuffer(int proximityBuffer) { this.proximityBuffer = proximityBuffer; } - + public void setDefaultProximityBuffer() { - proximityBuffer = defaultProximityBuffer; + this.proximityBuffer = defaultProximityBuffer; } - + public void calculateRewards(User user) { - List userLocations = user.getVisitedLocations(); + + if (user.getUserId().hashCode() % 5000 == 0) { + log.info("Processing rewards for user: {}", user.getUserName()); + } + + List userLocations = new ArrayList<>(user.getVisitedLocations()); List attractions = gpsUtil.getAttractions(); - - for(VisitedLocation visitedLocation : userLocations) { - for(Attraction attraction : attractions) { - if(user.getUserRewards().stream().filter(r -> r.attraction.attractionName.equals(attraction.attractionName)).count() == 0) { - if(nearAttraction(visitedLocation, attraction)) { - user.addUserReward(new UserReward(visitedLocation, attraction, getRewardPoints(attraction, user))); + + List attractionsToCheck = attractions.stream() + .sorted(Comparator.comparingDouble( + attraction -> cachedDistance(user.getLastVisitedLocation().location, attraction))) + .limit(Math.max(1, maxAttractionsToCheck)) + .collect(Collectors.toList()); + + for (VisitedLocation visitedLocation : userLocations) { + for (Attraction attraction : attractionsToCheck) { + if (nearAttraction(visitedLocation, attraction)) { + boolean alreadyRewarded = user.getUserRewards().stream() + .anyMatch(r -> r.attraction.attractionId.equals(attraction.attractionId)); + if (!alreadyRewarded) { + int points = getRewardPoints(attraction, user); + user.addUserReward(new UserReward(visitedLocation, attraction, points)); } } } } } - + + public CompletableFuture calculateRewardsAsync(User user) { + return CompletableFuture.runAsync(() -> { + try { + semaphore.acquire(); + calculateRewards(user); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new RuntimeException("Thread interrupted", e); + } finally { + semaphore.release(); + } + }, executor); + } + + private double cachedDistance(Location location, Attraction attraction) { + return distanceCache.computeIfAbsent(attraction.attractionName, + key -> getDistance(location, attraction)); + } + public boolean isWithinAttractionProximity(Attraction attraction, Location location) { - return getDistance(attraction, location) > attractionProximityRange ? false : true; + return getDistance(attraction, location) <= attractionProximityRange; } - + private boolean nearAttraction(VisitedLocation visitedLocation, Attraction attraction) { - return getDistance(attraction, visitedLocation.location) > proximityBuffer ? false : true; + return getDistance(attraction, visitedLocation.location) <= proximityBuffer; } - - private int getRewardPoints(Attraction attraction, User user) { - return rewardsCentral.getAttractionRewardPoints(attraction.attractionId, user.getUserId()); + + public int getRewardPoints(Attraction attraction, User user) { + return Math.max(rewardsCentral.getAttractionRewardPoints(attraction.attractionId, user.getUserId()), 1); } - + public double getDistance(Location loc1, Location loc2) { - double lat1 = Math.toRadians(loc1.latitude); - double lon1 = Math.toRadians(loc1.longitude); - double lat2 = Math.toRadians(loc2.latitude); - double lon2 = Math.toRadians(loc2.longitude); + double lat1 = Math.toRadians(loc1.latitude); + double lon1 = Math.toRadians(loc1.longitude); + double lat2 = Math.toRadians(loc2.latitude); + double lon2 = Math.toRadians(loc2.longitude); - double angle = Math.acos(Math.sin(lat1) * Math.sin(lat2) - + Math.cos(lat1) * Math.cos(lat2) * Math.cos(lon1 - lon2)); + double angle = Math.acos(Math.sin(lat1) * Math.sin(lat2) + + Math.cos(lat1) * Math.cos(lat2) * Math.cos(lon1 - lon2)); - double nauticalMiles = 60 * Math.toDegrees(angle); - double statuteMiles = STATUTE_MILES_PER_NAUTICAL_MILE * nauticalMiles; - return statuteMiles; + double nauticalMiles = 60 * Math.toDegrees(angle); + return STATUTE_MILES_PER_NAUTICAL_MILE * nauticalMiles; } - -} +} \ No newline at end of file diff --git a/TourGuide/src/main/java/com/openclassrooms/tourguide/service/TourGuideService.java b/TourGuide/src/main/java/com/openclassrooms/tourguide/service/TourGuideService.java index 1aa6472dc9..0ae6216d50 100644 --- a/TourGuide/src/main/java/com/openclassrooms/tourguide/service/TourGuideService.java +++ b/TourGuide/src/main/java/com/openclassrooms/tourguide/service/TourGuideService.java @@ -1,58 +1,86 @@ package com.openclassrooms.tourguide.service; -import com.openclassrooms.tourguide.helper.InternalTestHelper; -import com.openclassrooms.tourguide.tracker.Tracker; -import com.openclassrooms.tourguide.user.User; -import com.openclassrooms.tourguide.user.UserReward; - import java.time.LocalDateTime; import java.time.ZoneOffset; import java.util.ArrayList; +import java.util.Comparator; import java.util.Date; -import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Random; import java.util.UUID; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import java.util.stream.IntStream; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import com.openclassrooms.tourguide.helper.InternalTestHelper; +import com.openclassrooms.tourguide.tracker.Tracker; +import com.openclassrooms.tourguide.user.User; +import com.openclassrooms.tourguide.user.UserReward; + import gpsUtil.GpsUtil; import gpsUtil.location.Attraction; import gpsUtil.location.Location; import gpsUtil.location.VisitedLocation; - import tripPricer.Provider; import tripPricer.TripPricer; @Service public class TourGuideService { - private Logger logger = LoggerFactory.getLogger(TourGuideService.class); + + private final ExecutorService executor; + private List allUsers; + private final Map internalUserMap = new ConcurrentHashMap<>(); private final GpsUtil gpsUtil; private final RewardsService rewardsService; private final TripPricer tripPricer = new TripPricer(); public final Tracker tracker; - boolean testMode = true; - public TourGuideService(GpsUtil gpsUtil, RewardsService rewardsService) { + private boolean startTracker; + + private final Cache locationCache = Caffeine.newBuilder() + .expireAfterWrite(5, TimeUnit.MINUTES) + .maximumSize(500_000) + .build(); + + private static final String TRIP_PRICER_API_KEY = "test-server-api-key"; + private final boolean testMode = true; + + public TourGuideService(GpsUtil gpsUtil, RewardsService rewardsService, ExecutorService executorService, + @Value("${tourguide.startTracker:true}") boolean startTracker) { this.gpsUtil = gpsUtil; this.rewardsService = rewardsService; - + this.executor = executorService; + this.startTracker = startTracker; + Locale.setDefault(Locale.US); if (testMode) { - logger.info("TestMode enabled"); - logger.debug("Initializing users"); initializeInternalUsers(); - logger.debug("Finished initializing users"); } - tracker = new Tracker(this); - addShutDownHook(); + this.tracker = startTracker ? new Tracker(this) : null; + if (startTracker) { + Runtime.getRuntime().addShutdownHook(new Thread(() -> tracker.stopTracking())); + } + } + + public void setAllUsers(List allUsers) { + if (allUsers == null) { + throw new IllegalArgumentException("User list must not be null."); + } + if (allUsers.isEmpty()) { + throw new IllegalStateException("User list is empty. Cannot initialize users."); + } + this.allUsers = new ArrayList<>(allUsers); } public List getUserRewards(User user) { @@ -60,81 +88,69 @@ public List getUserRewards(User user) { } public VisitedLocation getUserLocation(User user) { - VisitedLocation visitedLocation = (user.getVisitedLocations().size() > 0) ? user.getLastVisitedLocation() - : trackUserLocation(user); - return visitedLocation; + return (!user.getVisitedLocations().isEmpty()) ? user.getLastVisitedLocation() : trackUserLocation(user).join(); + } + + public CompletableFuture trackUserLocation(User user) { + return CompletableFuture.supplyAsync(() -> { + VisitedLocation cachedLocation = locationCache.getIfPresent(user.getUserId()); + if (cachedLocation != null) + return cachedLocation; + + VisitedLocation visitedLocation = gpsUtil.getUserLocation(user.getUserId()); + + user.addToVisitedLocations(visitedLocation); + rewardsService.calculateRewardsAsync(user); + locationCache.put(user.getUserId(), visitedLocation); + return visitedLocation; + }, executor); + } + + public List getNearByAttractions(VisitedLocation visitedLocation) { + return gpsUtil.getAttractions().stream() + .sorted(Comparator.comparingDouble( + attraction -> rewardsService.getDistance(attraction, visitedLocation.location))) + .limit(5) + .collect(Collectors.toList()); } public User getUser(String userName) { - return internalUserMap.get(userName); + User user = internalUserMap.get(userName.trim()); + if (user == null) { + throw new IllegalArgumentException("User " + userName + " not found"); + } + return user; } public List getAllUsers() { - return internalUserMap.values().stream().collect(Collectors.toList()); + return new ArrayList<>(internalUserMap.values()); } public void addUser(User user) { - if (!internalUserMap.containsKey(user.getUserName())) { - internalUserMap.put(user.getUserName(), user); - } + internalUserMap.putIfAbsent(user.getUserName(), user); } public List getTripDeals(User user) { - int cumulatativeRewardPoints = user.getUserRewards().stream().mapToInt(i -> i.getRewardPoints()).sum(); - List providers = tripPricer.getPrice(tripPricerApiKey, user.getUserId(), - user.getUserPreferences().getNumberOfAdults(), user.getUserPreferences().getNumberOfChildren(), - user.getUserPreferences().getTripDuration(), cumulatativeRewardPoints); + int rewardPoints = user.getUserRewards().stream().mapToInt(UserReward::getRewardPoints).sum(); + List providers = tripPricer.getPrice( + TRIP_PRICER_API_KEY, + user.getUserId(), + user.getUserPreferences().getNumberOfAdults(), + user.getUserPreferences().getNumberOfChildren(), + user.getUserPreferences().getTripDuration(), + rewardPoints); user.setTripDeals(providers); return providers; } - public VisitedLocation trackUserLocation(User user) { - VisitedLocation visitedLocation = gpsUtil.getUserLocation(user.getUserId()); - user.addToVisitedLocations(visitedLocation); - rewardsService.calculateRewards(user); - return visitedLocation; - } - - public List getNearByAttractions(VisitedLocation visitedLocation) { - List nearbyAttractions = new ArrayList<>(); - for (Attraction attraction : gpsUtil.getAttractions()) { - if (rewardsService.isWithinAttractionProximity(attraction, visitedLocation.location)) { - nearbyAttractions.add(attraction); - } - } - - return nearbyAttractions; - } - - private void addShutDownHook() { - Runtime.getRuntime().addShutdownHook(new Thread() { - public void run() { - tracker.stopTracking(); - } - }); - } - - /********************************************************************************** - * - * Methods Below: For Internal Testing - * - **********************************************************************************/ - private static final String tripPricerApiKey = "test-server-api-key"; - // Database connection will be used for external users, but for testing purposes - // internal users are provided and stored in memory - private final Map internalUserMap = new HashMap<>(); - private void initializeInternalUsers() { - IntStream.range(0, InternalTestHelper.getInternalUserNumber()).forEach(i -> { + int userCount = InternalTestHelper.getInternalUserNumber(); + for (int i = 0; i < userCount; i++) { String userName = "internalUser" + i; - String phone = "000"; - String email = userName + "@tourGuide.com"; - User user = new User(UUID.randomUUID(), userName, phone, email); + User user = new User(UUID.randomUUID(), userName, "000", userName + "@tourGuide.com"); generateUserLocationHistory(user); - internalUserMap.put(userName, user); - }); - logger.debug("Created " + InternalTestHelper.getInternalUserNumber() + " internal test users."); + } } private void generateUserLocationHistory(User user) { @@ -161,4 +177,10 @@ private Date getRandomTime() { return Date.from(localDateTime.toInstant(ZoneOffset.UTC)); } + public void shutdown() { + if (tracker != null) { + tracker.stopTracking(); + } + } + } diff --git a/TourGuide/src/main/java/com/openclassrooms/tourguide/tracker/Tracker.java b/TourGuide/src/main/java/com/openclassrooms/tourguide/tracker/Tracker.java index 179d3d7753..e074d8b5ad 100644 --- a/TourGuide/src/main/java/com/openclassrooms/tourguide/tracker/Tracker.java +++ b/TourGuide/src/main/java/com/openclassrooms/tourguide/tracker/Tracker.java @@ -1,28 +1,31 @@ package com.openclassrooms.tourguide.tracker; import java.util.List; -import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import org.apache.commons.lang3.time.StopWatch; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import com.openclassrooms.tourguide.service.TourGuideService; import com.openclassrooms.tourguide.user.User; +import lombok.extern.slf4j.Slf4j; + +@Slf4j public class Tracker extends Thread { - private Logger logger = LoggerFactory.getLogger(Tracker.class); + private static final long trackingPollingInterval = TimeUnit.MINUTES.toSeconds(5); - private final ExecutorService executorService = Executors.newSingleThreadExecutor(); + private final ScheduledExecutorService executorService = Executors + .newScheduledThreadPool(Runtime.getRuntime().availableProcessors()); private final TourGuideService tourGuideService; private boolean stop = false; public Tracker(TourGuideService tourGuideService) { this.tourGuideService = tourGuideService; - executorService.submit(this); + executorService.scheduleAtFixedRate(this::trackUsers, 0, trackingPollingInterval, + TimeUnit.SECONDS); } /** @@ -33,29 +36,20 @@ public void stopTracking() { executorService.shutdownNow(); } - @Override - public void run() { - StopWatch stopWatch = new StopWatch(); - while (true) { - if (Thread.currentThread().isInterrupted() || stop) { - logger.debug("Tracker stopping"); - break; - } - - List users = tourGuideService.getAllUsers(); - logger.debug("Begin Tracker. Tracking " + users.size() + " users."); - stopWatch.start(); - users.forEach(u -> tourGuideService.trackUserLocation(u)); - stopWatch.stop(); - logger.debug("Tracker Time Elapsed: " + TimeUnit.MILLISECONDS.toSeconds(stopWatch.getTime()) + " seconds."); - stopWatch.reset(); - try { - logger.debug("Tracker sleeping"); - TimeUnit.SECONDS.sleep(trackingPollingInterval); - } catch (InterruptedException e) { - break; - } + public void trackUsers() { + + if (stop) { + log.debug("Tracker stopping"); + return; } + List users = tourGuideService.getAllUsers(); + log.debug("Begin Tracker. Tracking " + users.size() + " users."); + + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + users.parallelStream().forEach(u -> tourGuideService.trackUserLocation(u)); + stopWatch.stop(); + log.debug("Tracker Time Elapsed: " + TimeUnit.MILLISECONDS.toSeconds(stopWatch.getTime()) + " seconds."); } } diff --git a/TourGuide/src/main/java/com/openclassrooms/tourguide/user/User.java b/TourGuide/src/main/java/com/openclassrooms/tourguide/user/User.java index 32ed3b14ea..b758dad806 100644 --- a/TourGuide/src/main/java/com/openclassrooms/tourguide/user/User.java +++ b/TourGuide/src/main/java/com/openclassrooms/tourguide/user/User.java @@ -1,9 +1,11 @@ package com.openclassrooms.tourguide.user; -import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.Set; import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArrayList; import gpsUtil.location.VisitedLocation; import tripPricer.Provider; @@ -14,29 +16,30 @@ public class User { private String phoneNumber; private String emailAddress; private Date latestLocationTimestamp; - private List visitedLocations = new ArrayList<>(); - private List userRewards = new ArrayList<>(); + private List visitedLocations = new CopyOnWriteArrayList<>(); + private final List userRewards = new CopyOnWriteArrayList<>(); private UserPreferences userPreferences = new UserPreferences(); - private List tripDeals = new ArrayList<>(); + private List tripDeals = new CopyOnWriteArrayList<>(); + public User(UUID userId, String userName, String phoneNumber, String emailAddress) { this.userId = userId; this.userName = userName; this.phoneNumber = phoneNumber; this.emailAddress = emailAddress; } - + public UUID getUserId() { return userId; } - + public String getUserName() { return userName; } - + public void setPhoneNumber(String phoneNumber) { this.phoneNumber = phoneNumber; } - + public String getPhoneNumber() { return phoneNumber; } @@ -44,45 +47,52 @@ public String getPhoneNumber() { public void setEmailAddress(String emailAddress) { this.emailAddress = emailAddress; } - + public String getEmailAddress() { return emailAddress; } - + public void setLatestLocationTimestamp(Date latestLocationTimestamp) { this.latestLocationTimestamp = latestLocationTimestamp; } - + public Date getLatestLocationTimestamp() { return latestLocationTimestamp; } - + public void addToVisitedLocations(VisitedLocation visitedLocation) { visitedLocations.add(visitedLocation); } - + public List getVisitedLocations() { return visitedLocations; } - + + public VisitedLocation getLastVisitedLocations() { + return visitedLocations.isEmpty() ? null : visitedLocations.get(visitedLocations.size() - 1); + } + public void clearVisitedLocations() { visitedLocations.clear(); + visitedLocations = new CopyOnWriteArrayList<>(); } - + + private final Set rewardedAttractions = ConcurrentHashMap.newKeySet(); + public void addUserReward(UserReward userReward) { - if(userRewards.stream().filter(r -> !r.attraction.attractionName.equals(userReward.attraction)).count() == 0) { + if (rewardedAttractions.add(userReward.attraction.attractionName)) { userRewards.add(userReward); } } - + public List getUserRewards() { return userRewards; } - + public UserPreferences getUserPreferences() { return userPreferences; } - + public void setUserPreferences(UserPreferences userPreferences) { this.userPreferences = userPreferences; } @@ -90,11 +100,11 @@ public void setUserPreferences(UserPreferences userPreferences) { public VisitedLocation getLastVisitedLocation() { return visitedLocations.get(visitedLocations.size() - 1); } - + public void setTripDeals(List tripDeals) { this.tripDeals = tripDeals; } - + public List getTripDeals() { return tripDeals; } diff --git a/TourGuide/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/TourGuide/src/main/resources/META-INF/additional-spring-configuration-metadata.json new file mode 100644 index 0000000000..7aaee277ec --- /dev/null +++ b/TourGuide/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -0,0 +1,9 @@ +{ + "properties": [ + { + "name": "tourguide.startTracker", + "type": "java.lang.String", + "description": "A description for 'tourguide.startTracker'" + } + ] +} diff --git a/TourGuide/src/main/resources/application-local.yaml b/TourGuide/src/main/resources/application-local.yaml new file mode 100644 index 0000000000..3acb218883 --- /dev/null +++ b/TourGuide/src/main/resources/application-local.yaml @@ -0,0 +1,12 @@ +spring: + application: + name: tourguide + logging: + level: + root: DEBUG + com.openclassrooms.tourguide: DEBUG + com.openclassrooms.tourguide.unitaire: DEBUG + com.openclassrooms.tourguide.unitaire.TestPerformance: DEBUG + +tourguide: + startTracker: true diff --git a/TourGuide/src/main/resources/application.properties b/TourGuide/src/main/resources/application.properties deleted file mode 100644 index 043555abc7..0000000000 --- a/TourGuide/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ -logging.level.com.openclassrooms.tourguide=DEBUG \ No newline at end of file diff --git a/TourGuide/src/test/java/com/openclassrooms/tourguide/TestPerformance.java b/TourGuide/src/test/java/com/openclassrooms/tourguide/TestPerformance.java deleted file mode 100644 index aed028f861..0000000000 --- a/TourGuide/src/test/java/com/openclassrooms/tourguide/TestPerformance.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.openclassrooms.tourguide; - -import static org.junit.jupiter.api.Assertions.assertTrue; - -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.concurrent.TimeUnit; - -import org.apache.commons.lang3.time.StopWatch; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; - -import gpsUtil.GpsUtil; -import gpsUtil.location.Attraction; -import gpsUtil.location.VisitedLocation; -import rewardCentral.RewardCentral; -import com.openclassrooms.tourguide.helper.InternalTestHelper; -import com.openclassrooms.tourguide.service.RewardsService; -import com.openclassrooms.tourguide.service.TourGuideService; -import com.openclassrooms.tourguide.user.User; - -public class TestPerformance { - - /* - * A note on performance improvements: - * - * The number of users generated for the high volume tests can be easily - * adjusted via this method: - * - * InternalTestHelper.setInternalUserNumber(100000); - * - * - * These tests can be modified to suit new solutions, just as long as the - * performance metrics at the end of the tests remains consistent. - * - * These are performance metrics that we are trying to hit: - * - * highVolumeTrackLocation: 100,000 users within 15 minutes: - * assertTrue(TimeUnit.MINUTES.toSeconds(15) >= - * TimeUnit.MILLISECONDS.toSeconds(stopWatch.getTime())); - * - * highVolumeGetRewards: 100,000 users within 20 minutes: - * assertTrue(TimeUnit.MINUTES.toSeconds(20) >= - * TimeUnit.MILLISECONDS.toSeconds(stopWatch.getTime())); - */ - - @Disabled - @Test - public void highVolumeTrackLocation() { - GpsUtil gpsUtil = new GpsUtil(); - RewardsService rewardsService = new RewardsService(gpsUtil, new RewardCentral()); - // Users should be incremented up to 100,000, and test finishes within 15 - // minutes - InternalTestHelper.setInternalUserNumber(100); - TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService); - - List allUsers = new ArrayList<>(); - allUsers = tourGuideService.getAllUsers(); - - StopWatch stopWatch = new StopWatch(); - stopWatch.start(); - for (User user : allUsers) { - tourGuideService.trackUserLocation(user); - } - stopWatch.stop(); - tourGuideService.tracker.stopTracking(); - - System.out.println("highVolumeTrackLocation: Time Elapsed: " - + TimeUnit.MILLISECONDS.toSeconds(stopWatch.getTime()) + " seconds."); - assertTrue(TimeUnit.MINUTES.toSeconds(15) >= TimeUnit.MILLISECONDS.toSeconds(stopWatch.getTime())); - } - - @Disabled - @Test - public void highVolumeGetRewards() { - GpsUtil gpsUtil = new GpsUtil(); - RewardsService rewardsService = new RewardsService(gpsUtil, new RewardCentral()); - - // Users should be incremented up to 100,000, and test finishes within 20 - // minutes - InternalTestHelper.setInternalUserNumber(100); - StopWatch stopWatch = new StopWatch(); - stopWatch.start(); - TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService); - - Attraction attraction = gpsUtil.getAttractions().get(0); - List allUsers = new ArrayList<>(); - allUsers = tourGuideService.getAllUsers(); - allUsers.forEach(u -> u.addToVisitedLocations(new VisitedLocation(u.getUserId(), attraction, new Date()))); - - allUsers.forEach(u -> rewardsService.calculateRewards(u)); - - for (User user : allUsers) { - assertTrue(user.getUserRewards().size() > 0); - } - stopWatch.stop(); - tourGuideService.tracker.stopTracking(); - - System.out.println("highVolumeGetRewards: Time Elapsed: " + TimeUnit.MILLISECONDS.toSeconds(stopWatch.getTime()) - + " seconds."); - assertTrue(TimeUnit.MINUTES.toSeconds(20) >= TimeUnit.MILLISECONDS.toSeconds(stopWatch.getTime())); - } - -} diff --git a/TourGuide/src/test/java/com/openclassrooms/tourguide/TestRewardsService.java b/TourGuide/src/test/java/com/openclassrooms/tourguide/TestRewardsService.java deleted file mode 100644 index 2bcc2fb13e..0000000000 --- a/TourGuide/src/test/java/com/openclassrooms/tourguide/TestRewardsService.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.openclassrooms.tourguide; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -import java.util.Date; -import java.util.List; -import java.util.UUID; - -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; - -import gpsUtil.GpsUtil; -import gpsUtil.location.Attraction; -import gpsUtil.location.VisitedLocation; -import rewardCentral.RewardCentral; -import com.openclassrooms.tourguide.helper.InternalTestHelper; -import com.openclassrooms.tourguide.service.RewardsService; -import com.openclassrooms.tourguide.service.TourGuideService; -import com.openclassrooms.tourguide.user.User; -import com.openclassrooms.tourguide.user.UserReward; - -public class TestRewardsService { - - @Test - public void userGetRewards() { - GpsUtil gpsUtil = new GpsUtil(); - RewardsService rewardsService = new RewardsService(gpsUtil, new RewardCentral()); - - InternalTestHelper.setInternalUserNumber(0); - TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService); - - User user = new User(UUID.randomUUID(), "jon", "000", "jon@tourGuide.com"); - Attraction attraction = gpsUtil.getAttractions().get(0); - user.addToVisitedLocations(new VisitedLocation(user.getUserId(), attraction, new Date())); - tourGuideService.trackUserLocation(user); - List userRewards = user.getUserRewards(); - tourGuideService.tracker.stopTracking(); - assertTrue(userRewards.size() == 1); - } - - @Test - public void isWithinAttractionProximity() { - GpsUtil gpsUtil = new GpsUtil(); - RewardsService rewardsService = new RewardsService(gpsUtil, new RewardCentral()); - Attraction attraction = gpsUtil.getAttractions().get(0); - assertTrue(rewardsService.isWithinAttractionProximity(attraction, attraction)); - } - - @Disabled // Needs fixed - can throw ConcurrentModificationException - @Test - public void nearAllAttractions() { - GpsUtil gpsUtil = new GpsUtil(); - RewardsService rewardsService = new RewardsService(gpsUtil, new RewardCentral()); - rewardsService.setProximityBuffer(Integer.MAX_VALUE); - - InternalTestHelper.setInternalUserNumber(1); - TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService); - - rewardsService.calculateRewards(tourGuideService.getAllUsers().get(0)); - List userRewards = tourGuideService.getUserRewards(tourGuideService.getAllUsers().get(0)); - tourGuideService.tracker.stopTracking(); - - assertEquals(gpsUtil.getAttractions().size(), userRewards.size()); - } - -} diff --git a/TourGuide/src/test/java/com/openclassrooms/tourguide/TestTourGuideService.java b/TourGuide/src/test/java/com/openclassrooms/tourguide/TestTourGuideService.java deleted file mode 100644 index 2b053739e2..0000000000 --- a/TourGuide/src/test/java/com/openclassrooms/tourguide/TestTourGuideService.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.openclassrooms.tourguide; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -import java.util.List; -import java.util.UUID; - -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; - -import gpsUtil.GpsUtil; -import gpsUtil.location.Attraction; -import gpsUtil.location.VisitedLocation; -import rewardCentral.RewardCentral; -import com.openclassrooms.tourguide.helper.InternalTestHelper; -import com.openclassrooms.tourguide.service.RewardsService; -import com.openclassrooms.tourguide.service.TourGuideService; -import com.openclassrooms.tourguide.user.User; -import tripPricer.Provider; - -public class TestTourGuideService { - - @Test - public void getUserLocation() { - GpsUtil gpsUtil = new GpsUtil(); - RewardsService rewardsService = new RewardsService(gpsUtil, new RewardCentral()); - InternalTestHelper.setInternalUserNumber(0); - TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService); - - User user = new User(UUID.randomUUID(), "jon", "000", "jon@tourGuide.com"); - VisitedLocation visitedLocation = tourGuideService.trackUserLocation(user); - tourGuideService.tracker.stopTracking(); - assertTrue(visitedLocation.userId.equals(user.getUserId())); - } - - @Test - public void addUser() { - GpsUtil gpsUtil = new GpsUtil(); - RewardsService rewardsService = new RewardsService(gpsUtil, new RewardCentral()); - InternalTestHelper.setInternalUserNumber(0); - TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService); - - User user = new User(UUID.randomUUID(), "jon", "000", "jon@tourGuide.com"); - User user2 = new User(UUID.randomUUID(), "jon2", "000", "jon2@tourGuide.com"); - - tourGuideService.addUser(user); - tourGuideService.addUser(user2); - - User retrivedUser = tourGuideService.getUser(user.getUserName()); - User retrivedUser2 = tourGuideService.getUser(user2.getUserName()); - - tourGuideService.tracker.stopTracking(); - - assertEquals(user, retrivedUser); - assertEquals(user2, retrivedUser2); - } - - @Test - public void getAllUsers() { - GpsUtil gpsUtil = new GpsUtil(); - RewardsService rewardsService = new RewardsService(gpsUtil, new RewardCentral()); - InternalTestHelper.setInternalUserNumber(0); - TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService); - - User user = new User(UUID.randomUUID(), "jon", "000", "jon@tourGuide.com"); - User user2 = new User(UUID.randomUUID(), "jon2", "000", "jon2@tourGuide.com"); - - tourGuideService.addUser(user); - tourGuideService.addUser(user2); - - List allUsers = tourGuideService.getAllUsers(); - - tourGuideService.tracker.stopTracking(); - - assertTrue(allUsers.contains(user)); - assertTrue(allUsers.contains(user2)); - } - - @Test - public void trackUser() { - GpsUtil gpsUtil = new GpsUtil(); - RewardsService rewardsService = new RewardsService(gpsUtil, new RewardCentral()); - InternalTestHelper.setInternalUserNumber(0); - TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService); - - User user = new User(UUID.randomUUID(), "jon", "000", "jon@tourGuide.com"); - VisitedLocation visitedLocation = tourGuideService.trackUserLocation(user); - - tourGuideService.tracker.stopTracking(); - - assertEquals(user.getUserId(), visitedLocation.userId); - } - - @Disabled // Not yet implemented - @Test - public void getNearbyAttractions() { - GpsUtil gpsUtil = new GpsUtil(); - RewardsService rewardsService = new RewardsService(gpsUtil, new RewardCentral()); - InternalTestHelper.setInternalUserNumber(0); - TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService); - - User user = new User(UUID.randomUUID(), "jon", "000", "jon@tourGuide.com"); - VisitedLocation visitedLocation = tourGuideService.trackUserLocation(user); - - List attractions = tourGuideService.getNearByAttractions(visitedLocation); - - tourGuideService.tracker.stopTracking(); - - assertEquals(5, attractions.size()); - } - - public void getTripDeals() { - GpsUtil gpsUtil = new GpsUtil(); - RewardsService rewardsService = new RewardsService(gpsUtil, new RewardCentral()); - InternalTestHelper.setInternalUserNumber(0); - TourGuideService tourGuideService = new TourGuideService(gpsUtil, rewardsService); - - User user = new User(UUID.randomUUID(), "jon", "000", "jon@tourGuide.com"); - - List providers = tourGuideService.getTripDeals(user); - - tourGuideService.tracker.stopTracking(); - - assertEquals(10, providers.size()); - } - -} diff --git a/TourGuide/src/test/java/com/openclassrooms/tourguide/unitaire/TestPerformance.java b/TourGuide/src/test/java/com/openclassrooms/tourguide/unitaire/TestPerformance.java new file mode 100644 index 0000000000..ff105a6711 --- /dev/null +++ b/TourGuide/src/test/java/com/openclassrooms/tourguide/unitaire/TestPerformance.java @@ -0,0 +1,182 @@ +package com.openclassrooms.tourguide.unitaire; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +import org.apache.commons.lang3.time.StopWatch; +import org.junit.jupiter.api.AfterAll; +import static org.junit.jupiter.api.Assertions.assertTrue; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import com.openclassrooms.tourguide.helper.InternalTestHelper; +import com.openclassrooms.tourguide.service.RewardsService; +import com.openclassrooms.tourguide.service.TourGuideService; +import com.openclassrooms.tourguide.user.User; + +import gpsUtil.GpsUtil; +import gpsUtil.location.Attraction; +import gpsUtil.location.VisitedLocation; +import lombok.extern.slf4j.Slf4j; +import rewardCentral.RewardCentral; + +@Slf4j +public class TestPerformance { + + private static TourGuideService tourGuideService; + private static ExecutorService executor; + + /* + * A note on performance improvements: + * + * The number of users generated for the high volume tests can be easily + * adjusted via this method: + * + * InternalTestHelper.setInternalUserNumber(100000); + * + * + * These tests can be modified to suit new solutions, just as long as the + * performance metrics at the end of the tests remains consistent. + * + * These are performance metrics that we are trying to hit: + * + * highVolumeTrackLocation: 100,000 users within 15 minutes: + * assertTrue(TimeUnit.MINUTES.toSeconds(15) >= + * TimeUnit.MILLISECONDS.toSeconds(stopWatch.getTime())); + * + * highVolumeGetRewards: 100,000 users within 20 minutes: + * assertTrue(TimeUnit.MINUTES.toSeconds(20) >= + * TimeUnit.MILLISECONDS.toSeconds(stopWatch.getTime())); + */ + + @BeforeAll + public static void initExecutorService() { + + log.info("Initializing ExecutorService"); + executor = Executors.newFixedThreadPool(150); + } + + @Test + public void highVolumeTrackLocation() { + + GpsUtil gpsUtil = new GpsUtil(); + RewardCentral rewardCentral = new RewardCentral(); + RewardsService rewardsService = new RewardsService(gpsUtil, rewardCentral, executor); + // Users should be incremented up to 100,000, and test finishes within 15 + // minutes + InternalTestHelper.setInternalUserNumber(100000); + tourGuideService = new TourGuideService(gpsUtil, rewardsService, executor, false); + // tourGuideService.testMode = true; + + List allUsers = tourGuideService.getAllUsers(); + tourGuideService.setAllUsers(allUsers); + + log.info("Tracking {} users...", allUsers.size()); + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + + List> userBatches = partitionList(allUsers, 1000); + + for (List batch : userBatches) { + List> futures = batch.stream() + .map(user -> tourGuideService.trackUserLocation(user)) + .collect(Collectors.toList()); + + CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).exceptionally(ex -> { + log.error("Error tracking user locations in batch: {}", ex.getMessage()); + return null; + }).join(); + } + + stopWatch.stop(); + + log.info("===== FINAL RESULT ====="); + log.info("highVolumeTrackLocation: Time Elapsed: " + + TimeUnit.MILLISECONDS.toSeconds(stopWatch.getTime()) + " seconds."); + assertTrue(TimeUnit.MINUTES.toSeconds(15) >= TimeUnit.MILLISECONDS.toSeconds(stopWatch.getTime())); + } + + @Test + public void highVolumeGetRewards() { + + // Users should be incremented up to 100,000, and test finishes within 20 + // minutes + + GpsUtil gpsUtil = new GpsUtil(); + RewardCentral rewardCentral = new RewardCentral(); + RewardsService rewardsService = new RewardsService(gpsUtil, rewardCentral, executor); + + rewardsService.setMaxAttractionsToCheck(5); + + InternalTestHelper.setInternalUserNumber(100000); + tourGuideService = new TourGuideService(gpsUtil, rewardsService, executor, false); + // tourGuideService.testMode = true; + + Attraction attraction = gpsUtil.getAttractions().get(0); + List allUsers = tourGuideService.getAllUsers(); + tourGuideService.setAllUsers(allUsers); + allUsers.forEach(u -> u.addToVisitedLocations(new VisitedLocation(u.getUserId(), attraction, new Date()))); + + log.info("Tracking {} users...", allUsers.size()); + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + + List> userBatches = partitionList(allUsers, 1000); + + for (List batch : userBatches) { + List> futures = batch.stream() + .map(user -> { + return CompletableFuture.runAsync(() -> rewardsService.calculateRewards(user), executor); + }).collect(Collectors.toList()); + + CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).exceptionally(ex -> { + + log.error("Error calculatingt rewards for users: {}", ex.getMessage()); + return null; + }) + .thenRun(() -> log.info("All rewards calculated")).join(); + + } + stopWatch.stop(); + + log.info("===== FINAL RESULT ====="); + log.info("highVolumeGetRewards: Time Elapsed: " + TimeUnit.MILLISECONDS.toSeconds(stopWatch.getTime()) + + " seconds."); + assertTrue(TimeUnit.MINUTES.toSeconds(20) >= TimeUnit.MILLISECONDS.toSeconds(stopWatch.getTime())); + } + + private List> partitionList(List allUsers, int size) { + List> partitions = new ArrayList<>(); + for (int i = 0; i < allUsers.size(); i += size) { + partitions.add(List.copyOf(allUsers.subList(i, Math.min(i + size, allUsers.size())))); + } + return partitions; + } + + @AfterAll + public static void shutdownResources() throws InterruptedException { + + if (tourGuideService != null) { + tourGuideService.shutdown(); + } + if (executor != null && !executor.isShutdown()) { + executor.shutdown(); + try { + if (!executor.awaitTermination(60, TimeUnit.SECONDS)) { + executor.shutdownNow(); + } + } catch (InterruptedException e) { + executor.shutdownNow(); + Thread.currentThread().interrupt(); + } + } + + } + +} diff --git a/TourGuide/src/test/java/com/openclassrooms/tourguide/unitaire/TestRewardsService.java b/TourGuide/src/test/java/com/openclassrooms/tourguide/unitaire/TestRewardsService.java new file mode 100644 index 0000000000..0f25b0fed9 --- /dev/null +++ b/TourGuide/src/test/java/com/openclassrooms/tourguide/unitaire/TestRewardsService.java @@ -0,0 +1,116 @@ +package com.openclassrooms.tourguide.unitaire; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.Date; +import java.util.List; +import java.util.UUID; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import gpsUtil.GpsUtil; +import gpsUtil.location.Attraction; +import gpsUtil.location.VisitedLocation; +import lombok.extern.slf4j.Slf4j; +import rewardCentral.RewardCentral; + +import com.openclassrooms.tourguide.helper.InternalTestHelper; +import com.openclassrooms.tourguide.service.RewardsService; +import com.openclassrooms.tourguide.service.TourGuideService; +import com.openclassrooms.tourguide.user.User; +import com.openclassrooms.tourguide.user.UserReward; + +@Slf4j +public class TestRewardsService { + + private static ExecutorService executor; + + private static TourGuideService tourGuideService; + + private final RewardCentral rewardCentral = new RewardCentral(); + + @BeforeAll + public static void initExecutorService() { + + log.info("Initializing ExecutorService"); + executor = Executors.newFixedThreadPool(100); + + } + + @Test + public void userGetRewards() { + GpsUtil gpsUtil = new GpsUtil(); + RewardsService rewardsService = new RewardsService(gpsUtil, rewardCentral, executor); + + InternalTestHelper.setInternalUserNumber(0); + tourGuideService = new TourGuideService(gpsUtil, rewardsService, executor, false); + + User user = new User(UUID.randomUUID(), "jon", "000", "jon@tourGuide.com"); + Attraction attraction = gpsUtil.getAttractions().get(0); + user.addToVisitedLocations(new VisitedLocation(user.getUserId(), attraction, new Date())); + + rewardsService.calculateRewards(user); + + List userRewards = user.getUserRewards(); + assertEquals(1, userRewards.size()); + + } + + @Test + public void isWithinAttractionProximity() { + GpsUtil gpsUtil = new GpsUtil(); + RewardsService rewardsService = new RewardsService(gpsUtil, rewardCentral, executor); + + Attraction attraction = gpsUtil.getAttractions().get(0); + assertTrue(rewardsService.isWithinAttractionProximity(attraction, attraction)); + } + + @Test + public void nearAllAttractions() { + GpsUtil gpsUtil = new GpsUtil(); + RewardsService rewardsService = new RewardsService(gpsUtil, new RewardCentral(), + Executors.newFixedThreadPool(10)); + + rewardsService.setProximityBuffer(5000); + rewardsService.setMaxAttractionsToCheck(gpsUtil.getAttractions().size()); + + User user = new User(UUID.randomUUID(), "testUser", "test@example.com", "000"); + user.addToVisitedLocations( + new VisitedLocation(user.getUserId(), gpsUtil.getAttractions().get(0), new Date())); + + rewardsService.calculateRewards(user); + + int expectedRewardCount = gpsUtil.getAttractions().size(); + int actualRewardCount = user.getUserRewards().size(); + + log.info("Expected: " + expectedRewardCount + ", Actual: " + actualRewardCount); + assertEquals(expectedRewardCount, actualRewardCount); + } + + @AfterAll + public static void shutdownResources() throws InterruptedException { + + if (tourGuideService != null) { + tourGuideService.shutdown(); + } + + if (executor != null && !executor.isShutdown()) { + executor.shutdown(); + try { + if (!executor.awaitTermination(60, TimeUnit.SECONDS)) { + executor.shutdownNow(); + } + } catch (InterruptedException e) { + executor.shutdownNow(); + Thread.currentThread().interrupt(); + } + } + } + +} diff --git a/TourGuide/src/test/java/com/openclassrooms/tourguide/unitaire/TestTourGuideService.java b/TourGuide/src/test/java/com/openclassrooms/tourguide/unitaire/TestTourGuideService.java new file mode 100644 index 0000000000..12abc822e2 --- /dev/null +++ b/TourGuide/src/test/java/com/openclassrooms/tourguide/unitaire/TestTourGuideService.java @@ -0,0 +1,148 @@ +package com.openclassrooms.tourguide.unitaire; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.List; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import gpsUtil.GpsUtil; +import gpsUtil.location.Attraction; +import gpsUtil.location.VisitedLocation; +import lombok.extern.slf4j.Slf4j; +import rewardCentral.RewardCentral; +import com.openclassrooms.tourguide.helper.InternalTestHelper; +import com.openclassrooms.tourguide.service.RewardsService; +import com.openclassrooms.tourguide.service.TourGuideService; +import com.openclassrooms.tourguide.user.User; +import tripPricer.Provider; + +@Slf4j +public class TestTourGuideService { + + private static TourGuideService tourGuideService; + + private static ExecutorService executor; + + private static GpsUtil gpsUtil; + private static RewardCentral rewardCentral; + private RewardsService rewardsService; + + @BeforeAll + public static void initLogger() { + gpsUtil = new GpsUtil(); + rewardCentral = new RewardCentral(); + + log.info("Initializing ExecutorService"); + executor = Executors.newFixedThreadPool(100); + + } + + @BeforeEach + public void initServices() { + InternalTestHelper.setInternalUserNumber(0); + rewardsService = new RewardsService(gpsUtil, rewardCentral, executor); + tourGuideService = new TourGuideService(gpsUtil, rewardsService, executor, false); + } + + @Test + public void getUserLocation() { + User user = new User(UUID.randomUUID(), "jon", "000", "jon@tourGuide.com"); + CompletableFuture visitedLocation = tourGuideService.trackUserLocation(user); + assertTrue(visitedLocation.join().userId.equals(user.getUserId())); + } + + @Test + public void addUser() { + User user = new User(UUID.randomUUID(), "jon", "000", "jon@tourGuide.com"); + User user2 = new User(UUID.randomUUID(), "jon2", "000", "jon2@tourGuide.com"); + + tourGuideService.addUser(user); + tourGuideService.addUser(user2); + + User retrivedUser = tourGuideService.getUser(user.getUserName()); + User retrivedUser2 = tourGuideService.getUser(user2.getUserName()); + + assertEquals(user, retrivedUser); + assertEquals(user2, retrivedUser2); + } + + @Test + public void getAllUsers() { + User user = new User(UUID.randomUUID(), "jon", "000", "jon@tourGuide.com"); + User user2 = new User(UUID.randomUUID(), "jon2", "000", "jon2@tourGuide.com"); + + tourGuideService.addUser(user); + tourGuideService.addUser(user2); + + List allUsers = tourGuideService.getAllUsers(); + + tourGuideService.setAllUsers(allUsers); + + assertTrue(allUsers.contains(user)); + assertTrue(allUsers.contains(user2)); + } + + @Test + public void trackUser() { + User user = new User(UUID.randomUUID(), "jon", "000", "jon@tourGuide.com"); + CompletableFuture visitedLocation = tourGuideService.trackUserLocation(user); + + assertEquals(user.getUserId(), visitedLocation.join().userId); + } + + @Test + public void getNearbyAttractions() { + User user = new User(UUID.randomUUID(), "jon", "000", "jon@tourGuide.com"); + CompletableFuture visitedLocation = tourGuideService.trackUserLocation(user); + + log.info("Number of attractions available : " + gpsUtil.getAttractions().size()); + + List attractions = tourGuideService.getNearByAttractions(visitedLocation.join()); + + assertTrue(attractions.size() <= 5); + } + + @Test + public void getTripDeals() { + User user = new User(UUID.randomUUID(), "jon", "000", "jon@tourGuide.com"); + user.getUserPreferences().setNumberOfAdults(2); + user.getUserPreferences().setNumberOfChildren(2); + user.getUserPreferences().setTripDuration(7); + + List providers = tourGuideService.getTripDeals(user); + + assertTrue(!providers.isEmpty() && providers.size() <= 10, + "The number of suppliers should be between 1 and 10, but was : " + providers.size()); + } + + @AfterAll + public static void shutdownResources() throws InterruptedException { + + if (tourGuideService != null) { + tourGuideService.shutdown(); + } + + if (executor != null && !executor.isShutdown()) { + executor.shutdown(); + try { + if (!executor.awaitTermination(60, TimeUnit.SECONDS)) { + executor.shutdownNow(); + } + } catch (InterruptedException e) { + executor.shutdownNow(); + Thread.currentThread().interrupt(); + } + } + } + +} diff --git a/TourGuide/src/test/resources/logback-test.xml b/TourGuide/src/test/resources/logback-test.xml new file mode 100644 index 0000000000..7dfd7910b5 --- /dev/null +++ b/TourGuide/src/test/resources/logback-test.xml @@ -0,0 +1,21 @@ + + + + + logs/test-execution.log + true + + %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/TourGuide/target/classes/META-INF/additional-spring-configuration-metadata.json b/TourGuide/target/classes/META-INF/additional-spring-configuration-metadata.json new file mode 100644 index 0000000000..7aaee277ec --- /dev/null +++ b/TourGuide/target/classes/META-INF/additional-spring-configuration-metadata.json @@ -0,0 +1,9 @@ +{ + "properties": [ + { + "name": "tourguide.startTracker", + "type": "java.lang.String", + "description": "A description for 'tourguide.startTracker'" + } + ] +} diff --git a/TourGuide/target/classes/application-local.yaml b/TourGuide/target/classes/application-local.yaml new file mode 100644 index 0000000000..3acb218883 --- /dev/null +++ b/TourGuide/target/classes/application-local.yaml @@ -0,0 +1,12 @@ +spring: + application: + name: tourguide + logging: + level: + root: DEBUG + com.openclassrooms.tourguide: DEBUG + com.openclassrooms.tourguide.unitaire: DEBUG + com.openclassrooms.tourguide.unitaire.TestPerformance: DEBUG + +tourguide: + startTracker: true diff --git a/TourGuide/target/classes/com/openclassrooms/tourguide/TourguideApplication.class b/TourGuide/target/classes/com/openclassrooms/tourguide/TourguideApplication.class new file mode 100644 index 0000000000..63bc3a25f4 Binary files /dev/null and b/TourGuide/target/classes/com/openclassrooms/tourguide/TourguideApplication.class differ diff --git a/TourGuide/target/classes/com/openclassrooms/tourguide/configuration/ExecutorConfig.class b/TourGuide/target/classes/com/openclassrooms/tourguide/configuration/ExecutorConfig.class new file mode 100644 index 0000000000..e1cd866ed1 Binary files /dev/null and b/TourGuide/target/classes/com/openclassrooms/tourguide/configuration/ExecutorConfig.class differ diff --git a/TourGuide/target/classes/com/openclassrooms/tourguide/configuration/TourGuideModule.class b/TourGuide/target/classes/com/openclassrooms/tourguide/configuration/TourGuideModule.class new file mode 100644 index 0000000000..8d160c7b8f Binary files /dev/null and b/TourGuide/target/classes/com/openclassrooms/tourguide/configuration/TourGuideModule.class differ diff --git a/TourGuide/target/classes/com/openclassrooms/tourguide/controller/TourGuideController.class b/TourGuide/target/classes/com/openclassrooms/tourguide/controller/TourGuideController.class new file mode 100644 index 0000000000..fedbd01638 Binary files /dev/null and b/TourGuide/target/classes/com/openclassrooms/tourguide/controller/TourGuideController.class differ diff --git a/TourGuide/target/classes/com/openclassrooms/tourguide/dto/NearbyAttractionDTO.class b/TourGuide/target/classes/com/openclassrooms/tourguide/dto/NearbyAttractionDTO.class new file mode 100644 index 0000000000..7d22edfa38 Binary files /dev/null and b/TourGuide/target/classes/com/openclassrooms/tourguide/dto/NearbyAttractionDTO.class differ diff --git a/TourGuide/target/classes/com/openclassrooms/tourguide/helper/InternalTestHelper.class b/TourGuide/target/classes/com/openclassrooms/tourguide/helper/InternalTestHelper.class new file mode 100644 index 0000000000..69e5a87358 Binary files /dev/null and b/TourGuide/target/classes/com/openclassrooms/tourguide/helper/InternalTestHelper.class differ diff --git a/TourGuide/target/classes/com/openclassrooms/tourguide/service/RewardsService.class b/TourGuide/target/classes/com/openclassrooms/tourguide/service/RewardsService.class new file mode 100644 index 0000000000..f878ad6474 Binary files /dev/null and b/TourGuide/target/classes/com/openclassrooms/tourguide/service/RewardsService.class differ diff --git a/TourGuide/target/classes/com/openclassrooms/tourguide/service/TourGuideService.class b/TourGuide/target/classes/com/openclassrooms/tourguide/service/TourGuideService.class new file mode 100644 index 0000000000..3fa8896b77 Binary files /dev/null and b/TourGuide/target/classes/com/openclassrooms/tourguide/service/TourGuideService.class differ diff --git a/TourGuide/target/classes/com/openclassrooms/tourguide/tracker/Tracker.class b/TourGuide/target/classes/com/openclassrooms/tourguide/tracker/Tracker.class new file mode 100644 index 0000000000..135bdbe566 Binary files /dev/null and b/TourGuide/target/classes/com/openclassrooms/tourguide/tracker/Tracker.class differ diff --git a/TourGuide/target/classes/com/openclassrooms/tourguide/user/User.class b/TourGuide/target/classes/com/openclassrooms/tourguide/user/User.class new file mode 100644 index 0000000000..9e859ba4f6 Binary files /dev/null and b/TourGuide/target/classes/com/openclassrooms/tourguide/user/User.class differ diff --git a/TourGuide/target/classes/com/openclassrooms/tourguide/user/UserPreferences.class b/TourGuide/target/classes/com/openclassrooms/tourguide/user/UserPreferences.class new file mode 100644 index 0000000000..2dc10d8269 Binary files /dev/null and b/TourGuide/target/classes/com/openclassrooms/tourguide/user/UserPreferences.class differ diff --git a/TourGuide/target/classes/com/openclassrooms/tourguide/user/UserReward.class b/TourGuide/target/classes/com/openclassrooms/tourguide/user/UserReward.class new file mode 100644 index 0000000000..0153b9a7fa Binary files /dev/null and b/TourGuide/target/classes/com/openclassrooms/tourguide/user/UserReward.class differ diff --git a/TourGuide/target/maven-archiver/pom.properties b/TourGuide/target/maven-archiver/pom.properties new file mode 100644 index 0000000000..ba189f5572 --- /dev/null +++ b/TourGuide/target/maven-archiver/pom.properties @@ -0,0 +1,3 @@ +artifactId=tourguide +groupId=com.openclassrooms +version=0.0.1-SNAPSHOT diff --git a/TourGuide/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/TourGuide/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000000..de71954c83 --- /dev/null +++ b/TourGuide/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,12 @@ +com\openclassrooms\tourguide\configuration\TourGuideModule.class +com\openclassrooms\tourguide\service\RewardsService.class +com\openclassrooms\tourguide\user\UserPreferences.class +com\openclassrooms\tourguide\helper\InternalTestHelper.class +com\openclassrooms\tourguide\user\UserReward.class +com\openclassrooms\tourguide\configuration\ExecutorConfig.class +com\openclassrooms\tourguide\tracker\Tracker.class +com\openclassrooms\tourguide\TourguideApplication.class +com\openclassrooms\tourguide\user\User.class +com\openclassrooms\tourguide\controller\TourGuideController.class +com\openclassrooms\tourguide\service\TourGuideService.class +com\openclassrooms\tourguide\dto\NearbyAttractionDTO.class diff --git a/TourGuide/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/TourGuide/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000000..b286074252 --- /dev/null +++ b/TourGuide/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,12 @@ +C:\Users\AGOUROU GUSTAVE\Downloads\Open Classroom\P8\JavaPathENProject8-master\TourGuide\src\main\java\com\openclassrooms\tourguide\configuration\ExecutorConfig.java +C:\Users\AGOUROU GUSTAVE\Downloads\Open Classroom\P8\JavaPathENProject8-master\TourGuide\src\main\java\com\openclassrooms\tourguide\configuration\TourGuideModule.java +C:\Users\AGOUROU GUSTAVE\Downloads\Open Classroom\P8\JavaPathENProject8-master\TourGuide\src\main\java\com\openclassrooms\tourguide\controller\TourGuideController.java +C:\Users\AGOUROU GUSTAVE\Downloads\Open Classroom\P8\JavaPathENProject8-master\TourGuide\src\main\java\com\openclassrooms\tourguide\dto\NearbyAttractionDTO.java +C:\Users\AGOUROU GUSTAVE\Downloads\Open Classroom\P8\JavaPathENProject8-master\TourGuide\src\main\java\com\openclassrooms\tourguide\helper\InternalTestHelper.java +C:\Users\AGOUROU GUSTAVE\Downloads\Open Classroom\P8\JavaPathENProject8-master\TourGuide\src\main\java\com\openclassrooms\tourguide\service\RewardsService.java +C:\Users\AGOUROU GUSTAVE\Downloads\Open Classroom\P8\JavaPathENProject8-master\TourGuide\src\main\java\com\openclassrooms\tourguide\service\TourGuideService.java +C:\Users\AGOUROU GUSTAVE\Downloads\Open Classroom\P8\JavaPathENProject8-master\TourGuide\src\main\java\com\openclassrooms\tourguide\TourguideApplication.java +C:\Users\AGOUROU GUSTAVE\Downloads\Open Classroom\P8\JavaPathENProject8-master\TourGuide\src\main\java\com\openclassrooms\tourguide\tracker\Tracker.java +C:\Users\AGOUROU GUSTAVE\Downloads\Open Classroom\P8\JavaPathENProject8-master\TourGuide\src\main\java\com\openclassrooms\tourguide\user\User.java +C:\Users\AGOUROU GUSTAVE\Downloads\Open Classroom\P8\JavaPathENProject8-master\TourGuide\src\main\java\com\openclassrooms\tourguide\user\UserPreferences.java +C:\Users\AGOUROU GUSTAVE\Downloads\Open Classroom\P8\JavaPathENProject8-master\TourGuide\src\main\java\com\openclassrooms\tourguide\user\UserReward.java diff --git a/TourGuide/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst b/TourGuide/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst new file mode 100644 index 0000000000..87f3115c77 --- /dev/null +++ b/TourGuide/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst @@ -0,0 +1,4 @@ +com\openclassrooms\tourguide\unitaire\TestPerformance.class +com\openclassrooms\tourguide\TourguideApplicationTests.class +com\openclassrooms\tourguide\unitaire\TestRewardsService.class +com\openclassrooms\tourguide\unitaire\TestTourGuideService.class diff --git a/TourGuide/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/TourGuide/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst new file mode 100644 index 0000000000..cb608a4421 --- /dev/null +++ b/TourGuide/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst @@ -0,0 +1,4 @@ +C:\Users\AGOUROU GUSTAVE\Downloads\Open Classroom\P8\JavaPathENProject8-master\TourGuide\src\test\java\com\openclassrooms\tourguide\TourguideApplicationTests.java +C:\Users\AGOUROU GUSTAVE\Downloads\Open Classroom\P8\JavaPathENProject8-master\TourGuide\src\test\java\com\openclassrooms\tourguide\unitaire\TestPerformance.java +C:\Users\AGOUROU GUSTAVE\Downloads\Open Classroom\P8\JavaPathENProject8-master\TourGuide\src\test\java\com\openclassrooms\tourguide\unitaire\TestRewardsService.java +C:\Users\AGOUROU GUSTAVE\Downloads\Open Classroom\P8\JavaPathENProject8-master\TourGuide\src\test\java\com\openclassrooms\tourguide\unitaire\TestTourGuideService.java diff --git a/TourGuide/target/test-classes/com/openclassrooms/tourguide/TourguideApplicationTests.class b/TourGuide/target/test-classes/com/openclassrooms/tourguide/TourguideApplicationTests.class new file mode 100644 index 0000000000..0980816ee3 Binary files /dev/null and b/TourGuide/target/test-classes/com/openclassrooms/tourguide/TourguideApplicationTests.class differ diff --git a/TourGuide/target/test-classes/com/openclassrooms/tourguide/unitaire/TestPerformance.class b/TourGuide/target/test-classes/com/openclassrooms/tourguide/unitaire/TestPerformance.class new file mode 100644 index 0000000000..9297b12a44 Binary files /dev/null and b/TourGuide/target/test-classes/com/openclassrooms/tourguide/unitaire/TestPerformance.class differ diff --git a/TourGuide/target/test-classes/com/openclassrooms/tourguide/unitaire/TestRewardsService.class b/TourGuide/target/test-classes/com/openclassrooms/tourguide/unitaire/TestRewardsService.class new file mode 100644 index 0000000000..a866a846d0 Binary files /dev/null and b/TourGuide/target/test-classes/com/openclassrooms/tourguide/unitaire/TestRewardsService.class differ diff --git a/TourGuide/target/test-classes/com/openclassrooms/tourguide/unitaire/TestTourGuideService.class b/TourGuide/target/test-classes/com/openclassrooms/tourguide/unitaire/TestTourGuideService.class new file mode 100644 index 0000000000..886f0f1d8e Binary files /dev/null and b/TourGuide/target/test-classes/com/openclassrooms/tourguide/unitaire/TestTourGuideService.class differ diff --git a/TourGuide/target/test-classes/logback-test.xml b/TourGuide/target/test-classes/logback-test.xml new file mode 100644 index 0000000000..7dfd7910b5 --- /dev/null +++ b/TourGuide/target/test-classes/logback-test.xml @@ -0,0 +1,21 @@ + + + + + logs/test-execution.log + true + + %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/TourGuide/target/tourguide-0.0.1-SNAPSHOT.jar b/TourGuide/target/tourguide-0.0.1-SNAPSHOT.jar new file mode 100644 index 0000000000..69983334f5 Binary files /dev/null and b/TourGuide/target/tourguide-0.0.1-SNAPSHOT.jar differ diff --git a/TourGuide/target/tourguide-0.0.1-SNAPSHOT.jar.original b/TourGuide/target/tourguide-0.0.1-SNAPSHOT.jar.original new file mode 100644 index 0000000000..a6c7c8a64c Binary files /dev/null and b/TourGuide/target/tourguide-0.0.1-SNAPSHOT.jar.original differ diff --git a/mvnw b/mvnw new file mode 100644 index 0000000000..41c0f0c23d --- /dev/null +++ b/mvnw @@ -0,0 +1,310 @@ +#!/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 +# +# http://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. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + 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" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/mvnw.cmd b/mvnw.cmd new file mode 100644 index 0000000000..86115719e5 --- /dev/null +++ b/mvnw.cmd @@ -0,0 +1,182 @@ +@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 http://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 Maven Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + +FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE%