From 17738226f4df1cdc9a30146b87e4da284a82ea63 Mon Sep 17 00:00:00 2001 From: Kacper Urbaniec Date: Wed, 18 Oct 2023 20:22:43 +0200 Subject: [PATCH 1/9] Bumped kotlin, ksp, spring, dgs, hibernate versions & updated gradle wrappers Also fixed encountered issues: * https://github.com/spring-projects/spring-security/issues/13568 * https://github.com/gradle/gradle/issues/20132 * https://github.com/google/ksp/issues/1445 `BeeFetchedTest` now uses updated DGS generate client V2 API. --- bee.fetched.test/build.gradle.kts | 12 ++--- .../gradle/wrapper/gradle-wrapper.jar | Bin 60756 -> 61574 bytes .../gradle/wrapper/gradle-wrapper.properties | 3 +- bee.fetched.test/gradlew | 28 ++++++---- bee.fetched.test/gradlew.bat | 15 +++--- .../configuration/SecurityConfig.kt | 19 ++++--- .../bee/fetched/test/BeeFetchedTest.kt | 48 ++++++++++-------- bee.fetched/build.gradle.kts | 5 -- .../gradle/wrapper/gradle-wrapper.properties | 2 +- bee.generative/build.gradle.kts | 8 --- .../bee/generative/BeeGenerativePlugin.kt | 2 +- example/application/build.gradle.kts | 9 ++-- .../gradle/wrapper/gradle-wrapper.jar | Bin 60756 -> 61574 bytes .../gradle/wrapper/gradle-wrapper.properties | 3 +- example/application/gradlew | 28 ++++++---- example/application/gradlew.bat | 15 +++--- .../configuration/SecurityConfig.kt | 21 ++++---- example/service.media/build.gradle.kts | 6 +-- .../service.media/entities/build.gradle.kts | 6 +-- example/service.media/events/build.gradle.kts | 6 +-- example/service.organisation/build.gradle.kts | 6 +-- .../entities/build.gradle.kts | 6 +-- .../events/build.gradle.kts | 6 +-- example/utils/build.gradle.kts | 6 +-- gradle/libs.versions.toml | 22 ++++---- lib.data/build.gradle.kts | 5 -- lib.data/gradle/wrapper/gradle-wrapper.jar | Bin 60756 -> 61574 bytes .../gradle/wrapper/gradle-wrapper.properties | 3 +- lib.data/gradlew | 12 +++-- lib.data/gradlew.bat | 1 + lib.events/build.gradle.kts | 6 +-- .../gradle/wrapper/gradle-wrapper.properties | 2 +- lib.result/build.gradle.kts | 6 +-- .../gradle/wrapper/gradle-wrapper.properties | 2 +- 34 files changed, 152 insertions(+), 167 deletions(-) diff --git a/bee.fetched.test/build.gradle.kts b/bee.fetched.test/build.gradle.kts index b035832..29d5936 100644 --- a/bee.fetched.test/build.gradle.kts +++ b/bee.fetched.test/build.gradle.kts @@ -1,10 +1,5 @@ import com.netflix.graphql.dgs.codegen.gradle.GenerateJavaTask -/* -The Library Loader plugin currently has an IDEA bug that causes it to not recognize the "libs" variable. -Until https://youtrack.jetbrains.com/issue/KTIJ-19369 is fixed the suppress annotation is required. - */ -@Suppress("DSL_SCOPE_VIOLATION") plugins { alias(libs.plugins.kotlin.jvm) alias(libs.plugins.kotlin.spring) @@ -12,14 +7,15 @@ plugins { alias(libs.plugins.spring.boot) alias(libs.plugins.spring.dependencymanagement) alias(libs.plugins.kotlin.jpa) + // ksp plugin must be placed before kapt + // https://github.com/google/ksp/issues/1445#issuecomment-1763422067 + alias(libs.plugins.ksp) alias(libs.plugins.kotlin.kapt) alias(libs.plugins.dgs.codegen) alias(libs.plugins.kotlin.allopen) alias(libs.plugins.kotlin.noarg) java - alias(libs.plugins.ksp) id("bee.generative") - } allprojects { @@ -156,4 +152,4 @@ tasks.getByName("jar") { tasks.bootRun { jvmArgs = listOf("-Dspring.output.ansi.enabled=ALWAYS") -} +} \ No newline at end of file diff --git a/bee.fetched.test/gradle/wrapper/gradle-wrapper.jar b/bee.fetched.test/gradle/wrapper/gradle-wrapper.jar index 249e5832f090a2944b7473328c07c9755baa3196..943f0cbfa754578e88a3dae77fce6e3dea56edbf 100644 GIT binary patch delta 36524 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%0DGK?7GHTj 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 VwlMN}`%er%aGR6olj~j${vQ;P=LY}) diff --git a/bee.fetched.test/gradle/wrapper/gradle-wrapper.properties b/bee.fetched.test/gradle/wrapper/gradle-wrapper.properties index 070cb70..744c64d 100644 --- a/bee.fetched.test/gradle/wrapper/gradle-wrapper.properties +++ b/bee.fetched.test/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/bee.fetched.test/gradlew b/bee.fetched.test/gradlew index c53aefa..65dcd68 100644 --- a/bee.fetched.test/gradlew +++ b/bee.fetched.test/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright 2015-2021 the original authors. +# Copyright © 2015-2021 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -32,10 +32,10 @@ # Busybox and similar reduced shells will NOT work, because this script # requires all of these POSIX shell features: # * functions; -# * expansions $var, ${var}, ${var:-default}, ${var+SET}, -# ${var#prefix}, ${var%suffix}, and $( cmd ); -# * compound commands having a testable exit status, especially case; -# * various built-in commands including command, set, and ulimit. +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». # # Important for patching: # @@ -55,7 +55,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -80,10 +80,10 @@ do esac done -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" +# This is normally unused +# shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' @@ -143,12 +143,16 @@ fi if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac case $MAX_FD in #( '' | soft) :;; #( *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -205,6 +209,12 @@ set -- \ org.gradle.wrapper.GradleWrapperMain \ "$@" +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + # Use "xargs" to parse quoted args. # # With -n1 it outputs one arg per line, with the quotes and backslashes removed. diff --git a/bee.fetched.test/gradlew.bat b/bee.fetched.test/gradlew.bat index 107acd3..93e3f59 100644 --- a/bee.fetched.test/gradlew.bat +++ b/bee.fetched.test/gradlew.bat @@ -14,7 +14,7 @@ @rem limitations under the License. @rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +25,8 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,7 +41,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute +if %ERRORLEVEL% equ 0 goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -75,13 +76,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal diff --git a/bee.fetched.test/src/main/kotlin/com/beeproduced/bee/fetched/application/configuration/SecurityConfig.kt b/bee.fetched.test/src/main/kotlin/com/beeproduced/bee/fetched/application/configuration/SecurityConfig.kt index 63a9ff3..4b12da8 100644 --- a/bee.fetched.test/src/main/kotlin/com/beeproduced/bee/fetched/application/configuration/SecurityConfig.kt +++ b/bee.fetched.test/src/main/kotlin/com/beeproduced/bee/fetched/application/configuration/SecurityConfig.kt @@ -7,6 +7,8 @@ import org.springframework.core.env.Environment import org.springframework.security.config.annotation.web.builders.HttpSecurity import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity import org.springframework.security.web.SecurityFilterChain +import org.springframework.security.web.servlet.util.matcher.MvcRequestMatcher +import org.springframework.web.servlet.handler.HandlerMappingIntrospector /** * @@ -23,7 +25,8 @@ class SecurityConfig( @Throws(Exception::class) @Bean - fun filterChain(http: HttpSecurity): SecurityFilterChain { + fun filterChain(http: HttpSecurity, introspector: HandlerMappingIntrospector): SecurityFilterChain { + val mvcMatcherBuilder = MvcRequestMatcher.Builder(introspector) // Disable csrf // See: https://github.com/graphql-java-kickstart/graphql-spring-boot/issues/184 http @@ -34,13 +37,13 @@ class SecurityConfig( .authorizeHttpRequests { authorize -> var auth = authorize .requestMatchers( - "/graphql", - "/graphiql", - "/schema.json", - "/subscriptions", - "/actuator/**", - "/graphiql/**", - "/h2-console" + mvcMatcherBuilder.pattern("/graphql"), + mvcMatcherBuilder.pattern("/graphiql"), + mvcMatcherBuilder.pattern("/schema.json"), + mvcMatcherBuilder.pattern("/subscriptions"), + mvcMatcherBuilder.pattern("/actuator/**"), + mvcMatcherBuilder.pattern("/graphiql/**"), + mvcMatcherBuilder.pattern("/h2-console") ) .permitAll() if (env.activeProfiles.contains("dev")) { diff --git a/bee.fetched.test/src/test/kotlin/com/beeproduced/bee/fetched/test/BeeFetchedTest.kt b/bee.fetched.test/src/test/kotlin/com/beeproduced/bee/fetched/test/BeeFetchedTest.kt index a933b37..735ba6b 100644 --- a/bee.fetched.test/src/test/kotlin/com/beeproduced/bee/fetched/test/BeeFetchedTest.kt +++ b/bee.fetched.test/src/test/kotlin/com/beeproduced/bee/fetched/test/BeeFetchedTest.kt @@ -34,7 +34,7 @@ class BeeFetchedTest { fun `query singular id dataloader (foo)`() { val query = GraphQLQueryRequest( FooGraphQLQuery(), - FooProjectionRoot() + projection(::FooProjectionRoot) .waldoId() .waldo().select { waldo() @@ -55,7 +55,7 @@ class BeeFetchedTest { fun `query plural ids dataloader (bar)`() { val query = GraphQLQueryRequest( BarGraphQLQuery(), - BarProjectionRoot() + projection(::BarProjectionRoot) .waldoIds() .waldos().select { waldo() @@ -76,7 +76,7 @@ class BeeFetchedTest { fun `query singular nullable id dataloader (qux)`() { val query = GraphQLQueryRequest( QuxGraphQLQuery(), - QuxProjectionRoot() + projection(::QuxProjectionRoot) .waldoId() .waldo().select { waldo() @@ -97,7 +97,7 @@ class BeeFetchedTest { fun `query plural nullable ids dataloader (quux)`() { val query = GraphQLQueryRequest( QuuxGraphQLQuery(), - QuuxProjectionRoot() + projection(::QuuxProjectionRoot) .waldoIds() .waldos().select { waldo() @@ -118,7 +118,7 @@ class BeeFetchedTest { fun `query singular unrelated id dataloader (corge)`() { val query = GraphQLQueryRequest( CorgeGraphQLQuery(), - CorgeProjectionRoot() + projection(::CorgeProjectionRoot) .corgeToWaldoId() .waldo().select { waldo() @@ -139,7 +139,7 @@ class BeeFetchedTest { fun `query singular id internal type dataloader (grault)`() { val query = GraphQLQueryRequest( GraultGraphQLQuery(), - GraultProjectionRoot() + projection(::GraultProjectionRoot) .waldo().select { waldo() } @@ -159,7 +159,7 @@ class BeeFetchedTest { fun `query singular nullable id internal type dataloader (fred)`() { val query = GraphQLQueryRequest( FredGraphQLQuery(), - FredProjectionRoot() + projection(::FredProjectionRoot) .waldo().select { waldo() } @@ -179,7 +179,7 @@ class BeeFetchedTest { fun `query plural nullable ids internal type dataloader (xyzzy)`() { val query = GraphQLQueryRequest( XyzzyGraphQLQuery(), - XyzzyProjectionRoot() + projection(::XyzzyProjectionRoot) .waldos().select { waldo() } @@ -199,7 +199,7 @@ class BeeFetchedTest { fun `query plural ids internal type dataloader (plugh)`() { val query = GraphQLQueryRequest( PlughGraphQLQuery(), - PlughProjectionRoot() + projection(::PlughProjectionRoot) .waldos().select { waldo() } @@ -219,7 +219,7 @@ class BeeFetchedTest { fun `query not generated dataloader (garply)`() { val query = GraphQLQueryRequest( GarplyGraphQLQuery(), - GarplyProjectionRoot() + projection(::GarplyProjectionRoot) .waldo().select { waldo() } @@ -241,7 +241,7 @@ class BeeFetchedTest { fun `query unsafe singular id dataloader (alpha)`() { val query = GraphQLQueryRequest( AlphaGraphQLQuery(), - AlphaProjectionRoot() + projection(::AlphaProjectionRoot) .zuluId() .zulu().select { zulu() @@ -262,7 +262,7 @@ class BeeFetchedTest { fun `query unsafe plural ids dataloader (bravo)`() { val query = GraphQLQueryRequest( BravoGraphQLQuery(), - BravoProjectionRoot() + projection(::BravoProjectionRoot) .zuluIds() .zulus().select { zulu() @@ -283,7 +283,7 @@ class BeeFetchedTest { fun `query unsafe singular nullable id dataloader (charlie)`() { val query = GraphQLQueryRequest( CharlieGraphQLQuery(), - CharlieProjectionRoot() + projection(::CharlieProjectionRoot) .zuluId() .zulu().select { zulu() @@ -304,7 +304,7 @@ class BeeFetchedTest { fun `query unsafe plural nullable ids dataloader (delta)`() { val query = GraphQLQueryRequest( DeltaGraphQLQuery(), - DeltaProjectionRoot() + projection(::DeltaProjectionRoot) .zuluIds() .zulus().select { zulu() @@ -325,7 +325,7 @@ class BeeFetchedTest { fun `query unsafe singular unrelated id dataloader (echo)`() { val query = GraphQLQueryRequest( EchoGraphQLQuery(), - EchoProjectionRoot() + projection(::EchoProjectionRoot) .echoToZuluId() .zulu().select { zulu() @@ -346,7 +346,7 @@ class BeeFetchedTest { fun `query unsafe singular id internal type dataloader (foxtrot)`() { val query = GraphQLQueryRequest( FoxtrotGraphQLQuery(), - FoxtrotProjectionRoot() + projection(::FoxtrotProjectionRoot) .zulu().select { zulu() } @@ -366,7 +366,7 @@ class BeeFetchedTest { fun `query unsafe singular nullable id internal type dataloader (golf)`() { val query = GraphQLQueryRequest( GolfGraphQLQuery(), - GolfProjectionRoot() + projection(::GolfProjectionRoot) .zulu().select { zulu() } @@ -386,7 +386,7 @@ class BeeFetchedTest { fun `query unsafe plural ids internal type dataloader (hotel)`() { val query = GraphQLQueryRequest( HotelGraphQLQuery(), - HotelProjectionRoot() + projection(::HotelProjectionRoot) .zulus().select { zulu() } @@ -406,7 +406,7 @@ class BeeFetchedTest { fun `query unsafe plural nullable ids internal type dataloader (india)`() { val query = GraphQLQueryRequest( IndiaGraphQLQuery(), - IndiaProjectionRoot() + projection(::IndiaProjectionRoot) .zulus().select { zulu() } @@ -426,7 +426,7 @@ class BeeFetchedTest { fun `query unsafe not generated dataloader (juliet)`() { val query = GraphQLQueryRequest( JulietGraphQLQuery(), - JulietProjectionRoot() + projection(::JulietProjectionRoot) .zulu().select { zulu() } @@ -443,6 +443,12 @@ class BeeFetchedTest { } inline fun > N.select(selection: N.() -> Unit): P { - selection() + this.selection() return this.parent() +} + +// Workaround as Kotlin does not support Java diamond operator +// https://netflix.github.io/dgs/generating-code-from-schema/#client-api-v2 +inline fun > projection(constructor: ()->R): R { + return constructor() } \ No newline at end of file diff --git a/bee.fetched/build.gradle.kts b/bee.fetched/build.gradle.kts index a15637e..f02e33c 100644 --- a/bee.fetched/build.gradle.kts +++ b/bee.fetched/build.gradle.kts @@ -1,10 +1,5 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile -/* -The Library Loader plugin currently has an IDEA bug that causes it to not recognize the "libs" variable. -Until https://youtrack.jetbrains.com/issue/KTIJ-19369 is fixed the suppress annotation is required. - */ -@Suppress("DSL_SCOPE_VIOLATION") plugins { alias(libs.plugins.kotlin.jvm) java diff --git a/bee.fetched/gradle/wrapper/gradle-wrapper.properties b/bee.fetched/gradle/wrapper/gradle-wrapper.properties index 62f495d..3fa8f86 100644 --- a/bee.fetched/gradle/wrapper/gradle-wrapper.properties +++ b/bee.fetched/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/bee.generative/build.gradle.kts b/bee.generative/build.gradle.kts index ff4db50..541db8b 100644 --- a/bee.generative/build.gradle.kts +++ b/bee.generative/build.gradle.kts @@ -1,18 +1,10 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile -/* -The Library Loader plugin currently has an IDEA bug that causes it to not recognize the "libs" variable. -Until https://youtrack.jetbrains.com/issue/KTIJ-19369 is fixed the suppress annotation is required. - */ -@Suppress("DSL_SCOPE_VIOLATION") plugins { alias(libs.plugins.kotlin.jvm) java `java-gradle-plugin` `kotlin-dsl` - // TODO: Fix versioning? - // https://youtrack.jetbrains.com/issue/KT-54238 - id("org.jetbrains.kotlin.plugin.sam.with.receiver") version("1.8.0") } group = "com.beeproduced" diff --git a/bee.generative/src/main/kotlin/com/beeproduced/bee/generative/BeeGenerativePlugin.kt b/bee.generative/src/main/kotlin/com/beeproduced/bee/generative/BeeGenerativePlugin.kt index ecc4a00..70fa6f8 100644 --- a/bee.generative/src/main/kotlin/com/beeproduced/bee/generative/BeeGenerativePlugin.kt +++ b/bee.generative/src/main/kotlin/com/beeproduced/bee/generative/BeeGenerativePlugin.kt @@ -27,7 +27,7 @@ open class BeeGenerativePluginExtension { } open class BeeDependencies(private val dependencies: DependencyHandler) { - operator fun invoke(dependencyNotation: String): Pair { + operator fun invoke(dependencyNotation: String): Pair { val main = dependencies.add("implementation", dependencyNotation) val processor = dependencies.add("ksp", dependencyNotation, closureOf { val capabilityNotation = if (version != null) { diff --git a/example/application/build.gradle.kts b/example/application/build.gradle.kts index fbc362d..67004cb 100644 --- a/example/application/build.gradle.kts +++ b/example/application/build.gradle.kts @@ -1,10 +1,5 @@ import com.netflix.graphql.dgs.codegen.gradle.GenerateJavaTask -/* -The Library Loader plugin currently has an IDEA bug that causes it to not recognize the "libs" variable. -Until https://youtrack.jetbrains.com/issue/KTIJ-19369 is fixed the suppress annotation is required. - */ -@Suppress("DSL_SCOPE_VIOLATION") plugins { alias(libs.plugins.kotlin.jvm) alias(libs.plugins.kotlin.spring) @@ -12,12 +7,14 @@ plugins { alias(libs.plugins.spring.boot) alias(libs.plugins.spring.dependencymanagement) alias(libs.plugins.kotlin.jpa) + // ksp plugin must be placed before kapt + // https://github.com/google/ksp/issues/1445#issuecomment-1763422067 + alias(libs.plugins.ksp) alias(libs.plugins.kotlin.kapt) alias(libs.plugins.dgs.codegen) alias(libs.plugins.kotlin.allopen) alias(libs.plugins.kotlin.noarg) java - alias(libs.plugins.ksp) id("bee.generative") } diff --git a/example/application/gradle/wrapper/gradle-wrapper.jar b/example/application/gradle/wrapper/gradle-wrapper.jar index 249e5832f090a2944b7473328c07c9755baa3196..943f0cbfa754578e88a3dae77fce6e3dea56edbf 100644 GIT binary patch delta 36524 zcmZ6yQ*&aJ*i+pKn$=zKxk7ICNNX(G9gnUwow3iT2Ov?s|4Q$^qH|&1~>6K_f6Q@z)!W6o~05E1}7HS1}Bv=ef%?3Rc##Sb1)XzucCDxr#(Nfxotv ze%V_W`66|_=BK{+dN$WOZ#V$@kI(=7e7*Y3BMEum`h#%BJi{7P9=hz5ij2k_KbUm( zhz-iBt4RTzAPma)PhcHhjxYjxR6q^N4p+V6h&tZxbs!p4m8noJ?|i)9ATc@)IUzb~ zw2p)KDi7toTFgE%JA2d_9aWv7{xD{EzTGPb{V6+C=+O-u@I~*@9Q;(P9sE>h-v@&g ztSnY;?gI0q;XWPTrOm!4!5|uwJYJVPNluyu5}^SCc1ns-U#GrGqZ1B#qCcJbqoMAc zF$xB#F!(F?RcUqZtueR`*#i7DQ2CF?hhYV&goK!o`U?+H{F-15he}`xQ!)+H>0!QM z`)D&7s@{0}iVkz$(t{mqBKP?~W4b@KcuDglktFy&<2_z)F8Q~73;QcP`+pO=L}4yjlzNuLzuvnVAO``skBd=rV%VWQTd0x6_%ddY*G(AJt06`GHq zJVxl`G*RiYAeT=`Cf(SUN$kUEju!>SqwEd8RWUIk$|8A& zAvW|Uo<=TWC~u}V?SNFv`Fq9OeF_VpfyXHPIIay@Pu5J6$$pg{;xE9D7CROVYV>5c zv^IYXPo_Z4)bg5h?JSUX!K`q_u{>F%FzrG>*!Db_^7*7(F@f%i34Ps`JBAH6{s=ygSr^CVO)voP`v=SO z7v;4cFM_D>iVl{&X*N7pe4_^YKV%`5J774`5!DC}g;D@50h?VA!;fU1?Hf%%`N8R1 zSg@hZ8%Dq^eYV1!g8;`6vCSJoK+V1Q6N8ImtfE3iXs!s~B>js)sLHB9w$r+6Q>Oh#Ig&awvm%OBLg!7alaf}9Cuf;M4%Ig9 zx4K}IQfPr&u?k8xWp!wI4{CP#GTs#qR0b+G{&+=vL}I{b-Pha43^%8=K3997~* z>A|oxYE%Vo4~DiOih`87u|{8!Ql5|9Y+(ZY2nRP+oLdGErjV&YeVKw>A$JyPPAL+C zA36S!dNVf z;xJ)YR;^VPE1?`h-5>{~gwY2pY8RqhrsiIBmJ}n3G@Zs!!fD6y&KWPq&i8HEm*ZAx`G} zjq2CD5U==ID^we8k?=geue4Y>_+%u3$-TzVS6QMlb4NoS%_V>;E2hQ)+1Q@v(reC5 zLeK*f%%{PNO-mtrBVl|-!WaiKAkZv-?wnOwmZ=Tv57k=4PX=C?=I4V*THRFRE8a_{ zb>5YwDf4o>>$o{XYlLN{PZ^Ff?0FJl4>A9C-q9A$$&44l122Qsc|6Fd6aTam{=JO3 zBFfFe9seUPSUeyXQc*RA>2{WoKIYVltA&@5spdIW;rzOOqoQo`CN;~UNgU{{m9^c1 zTrN|8w_7+Nws4}Z-4eS9WMpF3h<@81a)oK9njh;-TB74vR;u{vE?>6FDG7<%GVXFL zUR9l{z*eEND6pp)+hpNT$VVM^Pw*S;#NrbCmH{dhBm?%6D|k)0C@Z9H>T|kby1^)# zOPmJ8Hq`8waoEK(9}IfP_q4yr(s?ME+T%UV-ikxW!XFb^6w02t30j$n_VSwevg;{9 zx0OXK_uGBFej=gbG>G^pEv^`I8&_a@t9>Nr;#r?XNKquD&Ho|`)qK6C^-7SCdo=S& z)vUi;m5*qIePEIbL=wJ|WCBNY;zCm2F-+@N2i{I^uR9UVZm$o`I|@<&2}w)C`h)vV zW{)yGJ3?GCZNtFe53Kb#uzrC7v-{JygKZUiXDV5mR z5la_vAFOvoh#yn)B`$^ZN*Dxp5Uo~_k8G9skn2)Tb>Kw#Vgxi`bti)^(z--X9F~oR zZ6=^_x@mDT~=h_@GGVcgBtLzssB1|Xy(xc(lUYJ#_ zgwc&ajE%^cCYW7d;xAxi{#LN*1}s>{K79MZrq!tYMpRA{T!#^tgXP=J5FvkbZ@gx~ ztq-E&c$`|KX8GS2a_voZHf=y8C{6~f~`DpC- zjQfrt2OGi-WGx}Y4>vM`8<4frU*!bq*NJ*Tyn0cqk=zpDdYth-PJIfz5>pLF@qnai zzj2FEhuOa-7$JR=U!L{UWWJBA%~SW-6Nh&3;<}iQO)DvOI&VKi1L8rmICePWqoY^F z-dC8X8~1T}=C9m&yb1kZzbKd2;29_Pm*Cs=y{Z06QZDlT7Poci>1@hFa%t0<`1()UTxcQ}e`fAh6K`<5C_SG`dw$IqzwEYNKvIH3VWlhz z_#^(T53W}jeWF#WIhj^U7AdIB~3feC--5iUiiT4Qyu81 z;Xa^8#~M@p%6B`LCKWWTa7I+35BLP=EOa&Gp2pbTWw5HOIjrx;2J(KI$$HT|w8}R-8fbp9sot&LiLs7ILlyZc8 zWbss7=*Ah|X$LEt1O|T?ABkIn-0NN`I8+ipfoBZcW>(WiaASG_khBtKM{hfkm5VBS zy0Q`4*G6HRRa#9G)10Ik3$C3|nQbFzmU-dA`LjKQY8icnx?2OE40%z852{OJH=?mbvwr9 zhlx0RDo^D;p*xKx?yT(`s7wj7BHA~rHF2yxnL<1PcU7FM57;?g^ z&CyPh9W4KvZ;T8w;AuNMn|nQ-xJ~CvVT7gAPAGi7w8udw_LOp+p4eZiI`JEC@Mq9F z#dA2AM_};CnL=y0#tZALdB(P~Rz*KqGqjwec%Fy?K(PGoO0tfskWw-aGhd7$ zTi~x1G>4h5q>ek=tIoT(VBQxrq)&#`_0UHC(j*ZO%%}%C)|EzTWEpvYDqCYXLexR9 zlww1ESB+IiO}=oq)8WZj%cY_FTQcEJ`JdABa=_S;O|kLhX*|5|D>0c{12DoC?K95f ztNxm(sTU6cWWd$tv`5X(=x?yAo)IYQ3G*2+o#|EfXko6erF;M4Pc;G0)pUDY)t`H9 z76Z8V9HqbWA@!`BelAT&ErrGTz7}%M*605PEY@3{gv+`yEhr{=EVp_tU%`b54Pn4a zz8nN7`eNx=*`f1t#^7>7G07IEnbnn&`RWZ}4Cp8W_DFDs-5)GU`bw}uBmOQfKmi2@ z(cWWmvHFTUNInRH!0y_ZtuI9Eh@O3+64wy-_2DF~E@KF3abM`0gC%|kHi@&hP_#B$ zLN{Z?$V_;+h?%2zEC{2ITyWOup*w*K?~vpwB(DX1i6oY+F)??;nyHpzaPLIt6G$4; z6>iAsB+&&NN0;ObWVOL+-^ZwD?nHgY>0k>0I3iA7o)f# zN&aX$lM@r_Iu|nSdPjoF{#QD9M6>|JSNPLxX^T2!jCKjS5mwNaO+SmBfOY z;6ZdwfzhO6Vs|9u81f4e%7*mU%8K>A7QWO0;QcX7W@|NSUVl)_>7VEf#&N6E~ zn9Wv88@Suo9P+M_G2(f+JFf#Q^GV#7QQ`qH#$N1y{A*_t^`5H1=V^u?Ec|EF6W+6B z(@Q8ChIUyq;+I5CmjEa1*v%d5{WHyhcHSjQuwzQq?;^BmfV#okq3v8bp7dBdk z54B+%D3=JWd-2w$)puXxZyZH>-$O-?tbSIlGc{em9xHN!44iaCr}6uZ^FpN7IvNh8 zbp!%4xR9np`>AOEd1e2_y}xW#v@@h3wYc?WiwL6Q>fxPQA81V^J)XtGs|Z&er6w~M z!1Ph~85TMG>R&ixNUnevc(w>fgb%+X#Wds6Yl+wH29aE%;RuDeZz5dEt%#p&2VK1n zKkqgl&*_YwnO%9`0<6MVP=O3{02EcR7PvvZPbL2KMuoRsU|Y%zw38qeOL#!YFp#_~+rtNJVl>lJSh_*B0A6n3XkE5po z9RpE_h=pnmDJFX*n6wmsWJ9GLu2=L8y!_R;;Aa2Jl|)I}Qff&`Fy@iOhop8>Y2{F} zbVk3rNMi$XX(q1JrgcIhC08@d5Zc>wLUL3wYm}hzS^!5d&Mec$Sp^$DUS1lD1>KAt z|Efof3nJ4^k(WKL_t-u8ud4L(t>q#9ECj?v#W~W#2zTt>|MCh&*H8Wh1_I&^2Li&M zq9j0`(zk~P7}dB`+15b*j%VPGr$;@4MBQ5AT>-y?0Fxfr2nC1kM2D(y7qMN+p-0yo zOlND}ImY;a_K$HZCrD=P{byToyC7*@;Y$v6wL!c*DfeH#$QS6|3)pJe68d>R#{zNn zB0r*Es<6^ZWeH`M)Cdoyz`@Z&Fu_^pu8*089j{gbbd!jV@s7`eI5_X5J3|poVGlq` zDo9}G;CsjW!hgN2O9=1|GpE;RpQvrBc+&dF)L>V&>9kd6^YIL?+*WDmcQlvwnq`Lf z&N$gF>3+E*NcJojXXI^}B(B-;@ebpVY}l#EcDWles7s;Ft+KZ@m+6FWaD^oYPBXVw z3sq|aKIDh1x5Ff=tW$(LO|!e&G?Xvh^H!GfiA(emluL!LmD=EV@|u|8S7w6ibUePJ z>{sOC6L27R+b&}e?VH;KvV3a;O3G=gwG}YzrkSTV6(&=;o)EV~2OD(Eh4mu@K0G)i z3#44IZhqN6+Hb2h#3R8YwJW7LesDA9=n)75u#46_ZmSh@6Q-4oHvGxFPY8x;Q+)d@ z*-SDqhVeyPGkoD)iq;z0r*M)IhY5I>gMA@RS&EIYPq}Z{$Q4Jbfd76EVhSF-sR^TO z!=o?>V(^bx!pG$26J~Z>Tvu&Uu+0;>m+pg(fmbu(97^(OHBH4;J8WIfv-f5}VP#VS z$Y$}SHKdphDUHlbdIVW!k$L6T{LY)|H}MT=l$22kIl>|46FK9dt$?3Fjk2RA-~AX7 z1|Xe`n)%h~e-O_qLpoFXJ$%gmocq`v0%hRw1k_6nh|+3pvJDy}m)V|xjL&!Z6?%pU z+m)r2*pWjEl!etAYxdzWb0{mGc;#$>rE%)b z@Rnj78P;$lrzY!XCa0&x+8a^YF*G|Q|C}bGeczz(5m_gq08wJHIH`WqHH?A}!~_3{ zQEvMXmL<*nThl^pL58nbHgQ1n9cYmN{C8J^6AKS%?~>1DCt70Q2Vp0;E@`GF%Tzkc zSUt&LJ=wHI6@#8_%=2s=j^4VBd1-h_)3 zeozYua!|{x(qk#z;tavf28rj_5Oen-cYG%;R6I}Hz$yMXeg^)_$OUUXx1r^qrl!DG zYXkAXKBMrVM-rJwAo<5J{NW1XJhW;Nh*&`nFV-Z;Vd({KSkMxV#cn|bXJ z50GtvFE##sqGhV#lv2s6?^yeBShlhR%XaPIo)iXOue}jwZ;Zq#dgDn8H?74Y+$Z?C z2Y5mCC66>dp%sVMecUzCirWq99Ea(TDwClZxtEB~4N-2JmlH#>Z2jOcaNaw4tn?P->BBGNHxUHez7>C@TZNT5Z zHerlG0a4~06L%>tn!~$s^L5`~{ueLZ5?`$46nHvwKxM0V9VQ(k{A40xDVw{+Qt)RV zQ)T2Df)cp0nv!lUFt3D=i~k!V|7dUjpz?K2ZiynO)$d{2*YT$N^CQ{t=luZ>WcE!> zg25p}If9RTho%G@PZp;5zBwv`n+e9iO=6dx1V^|4Ty%`oE=f7O&QC^s!4MJ+lMG>^ za!mgpz*^SHT+M_zm;{H#E~SaU^Kn*y)nTAF*2@t5mF+l)bte+a+goaA*zXJ4P)H|y z{4OwbJnIPtMp4E~=64gM-Y{#o{x)+8YCg$C7Yy=;9hdyBgRFIY2_L9DL3*B@%$5#m z8P}+)glf*}UPD$C;_yntx}9VPmSSnY9`Thd09nfoR;3`kar*FRfS)`+as*t2l*USWgmaZ!qFubr1DegTGZspyYMgic{inI0dSt+rJR z((jjMrdq^?VSZ8FCO;0NW@>O_b67gDHP%W*^O?J z91NQ7ZFODMSvHj3cvT#6RJUF7x=-BJFQ^6<&mOd15Z&M!?b+3Tg!UcgldD9tOAt5K z3X>MlE-a=sj;K&}sSng48jQ7sp|&u3;@e>V4Cuf(!s@9lZ0Cg^DKWmki%>$<85tOG zU;e{%zHU~KREBUg?FbcseK{lmK-`*S1p9j_4hF=F$y)NB;HsHwuf_A0Zhy395eU7o8^A zi2t7Ch|KVprUn03N0T2XshT!g$HTErcQBBG=TWaHkYtaI2CJY7ajI%yr&9 zVC^zJ3WW03bjwGNx{l}#+D&Ml_uI4PQhV}qZPXOP7ffSv(O;hX{Ff1|HoA~v)V!4y{CdALyi2YPjrRVmRYilRv z5PSkj*Z_8Fa*sCqGN?7YTnkr9=i9X`qcw7nqz#{bj?B7NiV9fWF+%~Rb1X@MuS^Mw zC)d#K{(-9!?xStM2K5x%x~ogWxgIK>s5r_RT1jU_lxdTtIEFWvi4eJSAiGec&HXQ( z5t7!J1b#SL|8s4)u147PWQUq_e33!5Z#f$Ja&az)(Htl`Z0@Ez)0d74BzNHHfH|<-8q*ZMf?%eJzoGS!0S6Y zSU7y^1+;V$Je9F027>1eN#_tz+2t}Y^N zYfi9}J!N^SU1CYoNBDbD39@84xLroY@0f%%c^(5CE+}!b5-Mt3oXe2nBdyicgGIL+rzTTKv`}Pp%fG1f^s?sgNH8=Q}s4Z>0ZCZ8ZYF z4og8nK%OA~zZMJX01uFtrmwhcgg*XbiMP9kfkPYFASbp7*Bk^5ZBzV)dL)JhPwDkM zkgdHeKw)orJcj4^)a^wQC2|->G=OBzuc-SskRrrf+H-E%HQ==Ex}d*504#GbIUXIB zcZs@Oo0i61MG}&0bu%@2N?MMJMRXyTVb8@3wF5eY3G6-1NdT~{{~YFs8f&SNebdaq zKmP>XqCQ@iaamuvY2m%xJ~gdSLSj~DBhB`NCj_c}NbSjB{r(E`_-+6a#vx*|S>-GU zHsw^dxxu`e)q1HbH==rLFap?cebKumnTo=iJQ zJD1#=o>0%Y@&jP?^)Q5bTV!pzrf=FoHq2c_59pq@my{D4AW8VU*7LVp;LF-qESV;L zClRfyQ6CcD$sd84K@e@p_ALH%j(Pz@Em@QFyY`AG&(|!(cG8!oV#ejr`y(LolX}Iu zL$)G)8^y4sUAYCWprzVR?`#OJ%NU)9U^B!OGSj>Ly;<)<(nNh`?z*GvJ|ZBKfZ`0 z=q_yGHWPp~R+J+{{@APVwmp8`=%N!L7AT^l^oaM|JrCFu7J#@frf=z(vGq2>sQ^@u zk=^d#gDf}ME!~9PaLfw44~rsG!)T7h8~dY^VcZQa+ueWPGG$mWXB|H2$$0BT(QAIu|=DJXPQDNes3Q>-|Mh=Ih zy{WR)QmhL5rQbBYPBa+e7)8Vo;_aKrg`}izmN>#ATuSDu!QUFA zsgM|Kv@W(S}Ag^6e8)9pQc@JLj_2ZIkO=8)#ARm#mU=NncWbmd-SbO;ad=y|k`shy3b z*8o0@EJo3b$#zSgmnlT7KAp)U!qI2M`hiC@Gp0)pNGHYMe1$MBNE}Hd{Sv^`wI7>MzNwgVv1ZzL zttmyv!=TKuPH$b>r7$lgP5?vho;#Ks4+zLzaz-1b{p-Fn6dWy1Agg7O2{&VQ5@s3A zAqzC9QokRD59!@ex#k>xy61kq6h~O$lb;lB;Q|chv&wzR+N zgXdIo%?q1Y$TzsdCo+n$^NODN7yd}cAv+rkG|u-(wTp?zUSUxaA-W3dwqikdrokwz) z68)Gn$Nwc1zB$F9`#(af|C3v;|2$bo7fU8f7h^NK6h&@xi2m`)g4mW$?l@5JEc*VV z6d67@Fl2w6mO;MYUl2U>R996gQUX$d>$D>)TNGq*arz}f21yh^uvIM!3u$H{_CH5! zrjt9L^&J8UqEV_lLn&}nc|Q=MDei6t=vL_>X-i8B%f5FDi)|qQ;2V-T!qOi*uqq{U zElET6#2cb>Z_6p_vw44&mN!;T&~ubi&p`XGepCNAfa0-T zC84V@VN^R6%z({m=$%iXrbiggxvMiBpww~ktD&=9-JPK3kPCOGCJNQj8+l9k#!QeS zv3h$Ej>@j<-zBW0Qr`5tNQVRfYK_$3>nWUzf&c*tCpl@aYwa%b;JNeTX10OevcxY7 zqnLgKU-X9G8~&?Dr)`*7GryqhN#;9v`D_c=_xBcD{j-cLop~pSnM?&7HggX6gb++ftBq$idM1|>5t+68sWf{ixREbMkZesmpjJsAFPQ#2+8Uek z$BPbu3cQuNDQq+^M}&ZuSHjxUgxOjF<^%4 z*8lc$CgA<$n=DYg_DsrHB7zYM0Ro|gS8ZnUq$u3GQ+{owv9RdB$wG%d-;R+I>?i?b z+r_mu{IL6WTYftdz?0#pbHkmQP31LvXcMK6;mAP+;q^L@q}v~TD}Ni>f7@QYcbM!T zX5kShHv3X1U=>B!2*si9=AEJCBt~GIH7DL4^+gHj+q}tk0F_?Q-=z{JY%77nkw>$F zG}6ROaL_)3t$jX=ZtFG{Q=LZfNjNb2LK=m9l|7iaB++N|S$vAr1 z_gf3JpIB|?dptfQ{sOZGlhyj~D;T#hjaNh0X5(o&7)87^t@@Hteh{0DOM{tCu$l#& z&NhA&V4VR}nzZP{7i(5bGB17<7bu+RJ1}k}=ffSg%=+213Oy@Aj1vv2U>U>8tRhKM z=*e<21)u6SSb{CC&We%#6X@duqLWGJ>O)Ls`uM98``34g11;D}*7>c3+^c|Os&;t}`(BWMD zfbyr~$j%{6%DZ`kR-}s~p?0#&-5a}b?6tDqwtqY%ep0ypSRIB54G@|0J5E#LkxQk# z_&xE=d(U}q?*Rh7L7f8AM5{qdGpC<&t~9YI!%j2G@nUPoLPSiWHjCVP{JAe?cBjQ zTqI=R{nv5c@|R)8Oi3cTL{&6%XdTgDP4CNYT}q2f5|Xf_hID#;83kd+v0RRyNKYn} zyPahwd=4ncDORLvatBc~KzT+jiiD{tzd3d*T(f7ayS;J&I1X!xaL2~POrw2ST=Pr5 zu*c}fb@)0P6jv))kNl38C7gmnWGmlL@{PWOVYt9se*cS0w#@W=N+dY#V08ci=Zmg9 z+${f#Qfs5)hOPxC;q{(J{Kx4HF)2QMzlVtXz0-O&h2$VxtT;ROvZ13nN{IG>Asv{% zHuDqgZ{R2(X*hkO+!HYHHWvRYrvN9fl-1?x6b)oseZY)@dQ6O>9Y#8*23~%bzN~Nf zpHGMdS-G|%F^v3Gnlsc$s4Wl=ZEu+J6y~*Ih2tpmHfO56JXKjldm$BxDvW6ZH>JrU zdRo}=^466lAq6!qY_@nQ}5ETUEoF;`>7b8W910_Z17!r`D?QNvC z+WF%@IkPi43n4;0Ks`M{x*0-^GK7oCAp?pFK1`~RoMSe@jAlV8vQruCUNyQ_7wk?` zSKe*|!4ar@VSA}!ThlIB*Qa5){pu&HS!a)-{lWL2@o1486ZK_!!}FSZ>vyUPIOX#+ z5d3~J24Op?!f!oNytub~egnkB`}h?eh!QyX6&^LbNuA#9vH#N_7IL|#6kIDhLL=be zEg3Cwmw{A(cm{&T zPg>XIWX24$Mj_#^k2I91C@h;b$8WNVr&MLjEwgAUtSeJ2W0)6Fit}PF!K&1j=*+6g zL{XOUrqhNyPLemIF4C&hThR8fie9^fYg$yl$m!1|YgcPlO>TB-(X{lkN~X}R=GA!Q zou<9ZJV6*}SN_4WRsqzRGI&p$;9DxDFTlyPw6Q9rlo@E3tMN&Wo4eFs{1=RCUij$V z`8)kmh0fhTTiEyvRl90B%q2(Moh$jg7{NeQiy> ze!H{zbG7<3BcK}XE&V_1kFfGA7D^ODxn*@nqlp!{LhYb47zIUlV^m+7kZh^a7L1^D zvI?m^9PECMnnN$0hi^Ur0b-~QgEORanrv|`dd;ek$4rAgEEof3HyvuYoZ)H*;+TgO z8CJY~4YDI^7RD7O)m&2h2K`-4e-I$1zcZ*K>Cd7~sSxEXc{d7-;f z5Ykr56Nkie%=z4_LIA}H>c81e$%ey=2hjqzTxoO0MDe!J&PE@EmX49jQJJg?HNw;B zHRHr)3do7CGDa3lPAZ4LAnpT)spnk8(ZiFz$|F$1m*A@!qCPug>Isp|MPI24i>jp~ z((9EQ9W#Rz)0AYT&ZWOWKBNtdNYYm2QytK$o-_|W5j7Abr&73(MG+Ar4K!Ij=nKu# z;SNkveY?Oc!I|Vta2{rb@c50#p_byn|_tu>Pv}6YDydl|}X#4oZW2 zvq)Y@8iG5@6c3?uu4vdLSBq23P&qUSvtGcu_qgH*?KfaT)@QueLx6apA97FI7sXP=foe zmrEu7;%Z=yTTGUsHsjR(wU54xNPI$hLFZUOwh=uhZ&rLammOQ?w*)}?Ah#%&K~OZc zl#Owj1OCEeXt!ALV7LgJ=MVbCo}<%92WX$wCS~Ins}%5+sb*C{WoOT5*2%sgjya;~ z|A#;k?j~J9qB)Tku1BGX=MrZ}<%Z4}i$OvCHv_3vtH_NZoK zjJljjt(~Yh%aI@gFnM*e*@_*N190p^@w5?SjRMb66N_^3EZ#Yoh<8FM>Yx$+mTbp$ zjQQS7(rs2j^54CJXdkH|$1&$wPOGDvm^@1o1pl9~!5&B+I=U-f_M-M&r3zfp2%TH%Ib3lz-^t)+Z9E+>W1Bt1`B}rZ$hZ3{0n|nZKM9O z$?_1+y}fB2$zEzE$zC#46=0E_4x7-VXY5}<+d!g2+Kg$gvU-Xm-A9DBZz+bZ*zDTx z$Wfb93))oLQf;wKi5JBJ%$yq}m42lacy`bC9PjFg*}pCnqn@dv{k9WiwCC07;6n#e zJ499v3YGQ^WyYY=x*s`q*;@R_ai1NKNA}<6=F8IvJArr{-YbdY#{l1K{(4l$7^7We zo~>}l=+L8IJ`BhgR&b$J3hW!ljy5F`+4NA06g$&4oC-`oGb@e5aw-1dSDL}GOnUuy z)z1W)8W9t(7w%OCn_~#0;^F)xic6It5)3h);vuLAKFS4b)G;Z$n-R&{b6h@yGxGo> zT-cq0W7~n+qN10;1OS+*c>H$(GoKq4hGG% zL&XJG$PDQ6K^BD#s_MsnlGPE+$W^B`&a+Z+4;`*nyKil99^E(wW?t>#V_xYWHLl2} zIV`uiR-__g+<&m#Z*4E|wjKY1R2mCm%k2ayMSDw`Rz_KA!3P$uIbB`dl`3&A zmT@gMT@ZpAxBys8zRtgoH+ebSaVA)maP?G1=G4x^Nw3mV0?qehWL35vMI~p$y0hGL z6@vHf-50P~uoe6yY&*D)Ekmi06LF!Jqz9#7kMvWexYMbAn{}`{3ZBsd6$5jBCujDp z<0N?b*1%T<-_Nxh`lKtla|FFqs7RZMtjHAwZ0Ck&s{x`#^S?36BNQN1JU^0f&TRoC z$}c)LW7)-n$CmAg&n(96AycC4!4_*D(~HvXyLW>HORuI0;ny$f9h{!Ud0=X0x%{l6NH$ z?lttWn}DQL521;-r~Kf$N_YPo)7H>3gI@Ivt}GnR=8W~Nn7_PE_3{sRNn`R~bs`g1 zoTh`7o4H*TRp7VBp=%>&t&Cd*Ny~@;{C)P;62d^dipuJYUV3-Dh<#a&AIxtrmX42( zYEH-8F3|^nY-=yw(?^d!hTojNxr~A!n$Ao+2mq*kZ&>Zm+BDC*sul=~!LUtWiokIB zxc(dNwyk&5o;>WRt)Q-Wj;fvuvJO&DLPe%mt@t!Oq^VsoIN0iTh%fh#`-{Ha?a8gf zj^yA3`=_NEONO0Z?}YVP*dL{T}v|A&cE7$_0G=g;1s*WDQuRcq>cJ?z=8b5&i<)=3ELSW%Kff zs=my9Q%8?aMxZeDq=RBHg*&HnIeQ_}X@oh=f#?C^HSg?1dwLn#wu(o^uANrRZD;H; zYbOec$#wJB(u?w22{gV+zb~pv|Ag!q$N@^|6n+FV5-X=lR$jajjeRh$1tjht$URz1 zhw)(ksAr2;QBXH9T#A$6V4PsR7K)){JQb?79o6&*IwDPZknNqySIa6pwcs)~xN81I zKc-GmzZ$i(8RaU==$Dx{tD@4nph-V*=W{Ln97*VEN^F+u0!F<%$l=K`ikIp#<^Yt} z{rx1gk>;rVccPIo6hD=xPQ$PxVwl6Cl;YI6iLf3!aevhsyXXZovK#TOv0|*T+^ii5 z+YO`u(SO3@ybv-DG)w)E;@+ULoj_+<;mc#iW8{9Y!99vE`HdAK=Utac&Eq1uy!TLgOS-C1E90Am)B{Tiw z$>$Er{s{snLEaO5@u&zqxE@v;p6D&?u@40t{#VNA&7SZael};kGEwnHgD4V5RNM@g z(EL~B=A8&?pPPW-fTja0Oi6SVtI_(3ME!qWLg-uK2afWhBn(C2PAmUyu^2h?Y402i z9P03g5$1#etGdUUo?#skjQ|$*()ybRGMXM`-2?jjThnTcPV==7sg$k{GxYdF+S*zz z%dtBo(R9!7SW6Utq|wFpsKMSAH-x{WB|Cz62A8!p8!kHz1tM=9I=M&xqQG zz17xBW7t?Q?C%@4YC`p*za(>hOrK&ELyDQu{5ACOg9noZS1SGh{-FcLy_W;nf$N`N zGYxdIzy7mL3K@Kw65DmvPH0@&;T{y&jP^AsaYENi}q|A z3}l}5V?z_VvpHf%CkpN@IK`czOuLPY=yBUf8Q3b9$X|kEiYROV$`T8T7ZjFPvKhbK zDYxzz99JRNzsx0f1Y>IrIQq9o+W(TsB(ZtN@4*)DMGr3?4~Jt|37IBI|7oQknQI3X zAWs`45xiCHga9;8+W{|!Yy>tic?%SNq=3EX@z2Mk!P0dKG0NCHNz0*F-a z`7K?6d*D4ri*=>wyQyQt{_t=t95*gB1|tdTg45fR{KmKD|3ZuM$QlkX{-tUkq@3Qd z-6X|jEyZa@tuxB}qrdlJdc0{8``%3M$xl8$9pUzkFa$Ww{Jocp9>;5~oNC8o`3GK& zy7_X8YoQDCO1TU_a%#Q+rC?Rr`r)W8CdpEe=>uMYDx6^46V_1DthgX`6CnF*E+%bY z=GYih(DizXEVFDuQRPQY&dc2p;Pwo7L{I2r3;QV8IEPg1McP{PchEUDf} zbtSAoBMPt?&Q@{fG_3a7gzHl58O7e(h_F6^rKgU=a&(^WpgH3U%`tpj3CMVRA-uol z(hA)(VF{4@`k@PREUQJ_8w6CcMW4Pm06{fw^*>aMH%#ik6lD{{j~nT}Vw=wZ(;Ct& zi1nt}RmOGrVHP++5;Z@eE*lkdw~?>AJL_Yg!~p*adS_s1`_oT1B26S zt&1-4twO45pMl<5B9T;SLH9Q?E>dBXcy@5k-{YQ5K!A`=YMYMlLOYc(+LdC<@@UIZ zxq%vI<;6P)=W4nRb7nxQ9KGzXsOjWs_3V-2*V+r}?dAZA7{7f*>^PxEw|6+WS0wAs zen2zj2cFKIr`~Ai`YU|OR4%DQw8uM=|g2B{;1Ho`mx@??e)rX!p$MSlA70pKVcvZ@|fYLpEV~s7G z>#?88yv{ekJpeJL<-?FY7wf10XpS{B4}jy{uc)7esm&J1)ZYt5LI_{)0BkN8Nc}ep zg%SYD0Cub3?KXLY*-dYntrghE|}%?RY5i3yVcPFlheiJUMLIr=Xp=U-^siywr8MF^JAEwl2uQ$VIfuDFPisd}4W2ZxY$C`2`tBTA~ zG2P62@*~(9gYmO6#Ya<1TG#3rQd0BwVyNP@Ayt7B(h%z<@N>Iz;|2VkT8T3`anW@3 z03^F>TCLS9Y*sY)#=BX5!LYD9Z;z4QSOL2^Zw~0e;OutRfp)Xu83Yz~srLh8rR}fp z=#yHH{&=!mHgDg!b;9K@Ux99VmQ*K2Xn%gV6YWHHw(<_uA&($p}$2U2TIs7y+ zM7X5Yk#^wpDE4kQZmN3&VC{!nno7wD2`bEeAwS;W6>$oUt#~E57Imre?b54{c$`tHdB6GMC`IZWLL(%j20Bh zW@}9_@4EsYT$u1Q3ZPWkvYxUX{6AcsV{;{1w60^@wv!dJW7}rOw!LE8wrwXJr(>&Q z+xFe(e7mP=RLy@dYSfEoS{pC8KXH4kGf zd``z`=z(*mSdLiXj&Y{>&akI{IMzo@tD>a^<(r*Ssf6Nz;ZsaLra9mcD`MN8$2`!w zj#+BZCrV}b_c=qEqt7{oF$>wI5*0B0kP{DNQ5_-V9dZ<9u;vm!(L2I_#p*nprX%tU z!{;Gb7IuVBg7pdB2!{X!ZgHqp5+?drImJ(UE6~P2|C?+`E9th5QSv!}?=L}=tvcFMQuyE`=pek1zbRxBAFdgqqB#0~EkA_CpTe0`e$i(eyMD!C!D0SjSaixQMIl zQ>-Dj?K($9qMGwhRqIt28n$`*FH_6v*JjZRnIMxz-qVe_KzSGY5Ph0$(^e$r-hLD4T4m@eV#69bG7_fQ>o`!yu97p=$)>fb; z&!>)wS*Fj!ag#iKWRWiC735;`@XxXFT)nniSe~^1r0v?bQ6_Fokmx~(-O5D{7$d>R z#Us$PxL8^}t1rpnJ@#E}+O?`@a4wB;n{#!lX6WlOwo}C3TgP%?N=BT*FrxR=JR(g$ zJn3EhTI~xj_mVxhFImqt22JE`CI;B~Pb~*cFE>{uL*2mnfeKb_aYO6sDC{Khp%ba`v>+M4WqY2KK4@w{=P~Tzx42!1yHniJT#~*CHF5|TVC_n_ z&;r3b9d!f0;?+iQ8rT1N>MM-D(HQrU-WWU9=w|>nbeG#luD0;ayPj`4=&7Ik$Z{Z3~ z!oob~d$cMHx9;vjAfJ{XC6R@pzkLW4q1ak{?IimWUVBKithq`vKQD14&60gGKCCale{X}Ft0By269l*P6r zuTm0E33lN!&zezRh=5l@mQP_RAR5sr^}&4j;(eFAj2@K*7>|(4IdGb4yB%g88|TKZ z^M@nOtS|f?{!z}s#}S=w{R0`LbVP{k5xhlw?;F>N1tIByWsnp`Bg)hb4sZR>Y12=3 z!#Anh?EEZFm==f$1I@Zw1Y6-%6aE;!l&t#!4vB-%4AfB{X;!sT(jBKx*-5qZn|89Z zK%Is6JLf#w>eauBET9VUE&>aD*^+~!ilaiM?p&mM&kqY3D1*5QUGBbUOI)=eY1dMv zJ=ybPA_VaWPE1+MDhiYq4$DfAeVIv!IP-*#v53?V-c^a) zG6p$+O#_1{V`nNcS`{^%iBn8Oi4fO$#Q7x-$tp2dRs-etYmui-mt@P{hh?ldJJP!? z`!i88d>h`9rIRd6=^pZVuo5}3zUbAX>~uzA4C%servKlplCW0(Ta+B&Eey1CQ5DDV zf2Mk*YRAVjE>){hi_9poOCsx=BU4gQV)kovP|^v!npW_>^LFUzYHx;MKo!BEj7Xy9Xg-A6>kWs*$)aMAWh^_0Fnx;eR|2;L0ZjLl*+F1Moh4?D&8h6H6jJQ+OxgwJV51#)zSmqvRnQ5 zz~62JXPCCiwK9W;yo9-%7Xka%OtQeVDK5SGr51}$q@i)OE>BHgfOFiV%SZ5E(VC*q zYujoHFnnF^qs^WhZG}uBRIs4{4xGP&Tbtr=RJ?=4?;IaVA9Yzp!}H z9QDT#L{7Y?)r=m^ucWOjUuJh*FSmqL?!<1x{iOcP?l7BCorp91#(gUNGIQf@1)d1lXx(RAI zhm*TFNYgXZn_A}FPfh;WMHE%oCs8d+1emobQCt@YTjxcWoK81LeXY~+9)^+UOmeCk z)#LMg9G1`jWr;WZrrR$Gwve9&X+lKpB~*OkxAEnRpO&^BwsOm&TDeQBlvTv^nuju5 zyB8jH2{_Xtz=1n}8hD4nhhZvyxynbGz%2iKM-8|$N`wX8O-Toi=&@x087+joKHd4@ zsx+@?mPB(R?mMWCIeejm^dhs63ARzdm}jsA(O)QqT|m}QRWm-(Hzh#M1)wVV%1iJL zg(a=;b~-ZkGDk#mk1~G*z!7zGrRGL-8}=VILi|%;0knSAjJX1jZXYa@^cU6K|NAIP zkrpm_?r8?!`$D^>c>@hwX{b1l4f&cY;wwU&Q2vPM9oGB`Uj2&haf>bY84LFfn>4P} zUwt~VVTwui2oj$uGt#`OH>|MYjm8`R#n z{C%^u?$@fW&NV}iCuMF`&DU3gT0TNA(vM@&mV$M7yWD^p3 zN996Z8he29k4NFCg+9PbnZ$<&>5-W0fbtK7!ePTkfP37tvtUFQiW$|1%XoEZO`#0Q z2^XjxY40!DruxCn-p%m|j1RfInIaROco}Cf&3zhkkBHj&Rt=WZ_VkNJdliOb-H{>p z4n>c+XW~q#1M6<*boFS%=vdUE3ndU*iM+EFUvAM1=)%}A49e~^iF9Tr^(nqF(J^n~ z49*I<-WXCZ`1EG0hYOd%nsoM{LT8_q$a&QSBz;#S3YCwj?)0mjn_saa@O3c^sMqwF z!ZcWHQHCT~S|SVe5eVTt=z64&T=nI)wG<+4e2@}Gp9#uWEM+p-{L1PUC zM9N-bN73qWRRpT*YCLuK_D+uRgFcwsV}^odrD$A zI~cJDK#5qb8UPL(A_=P(=)Z0U`Aq`WLGuPhE^-isi?g-0`OZ?4kK^MyAsY+mxqt5G z-B14#h=^(sGv*CF8}cd}Xwl*_z1KEt!uP`_(wPBT8=FmK<+VOOk}fZ4Gj*{W-MSmu zygps+?d@%?tx#Fn|0(KF86C^QEgcz^1&!sUz|u||p8_`(gR(h#GELI8FrjSjfNCc zYJ9BHx9555<@$3ttNMYtIMa?NQe?V&_luijx2?!gBJ8tg}l4R@z5x73q4 zfZVtX0lZOzVV%@yTg!w5oMcYuMfGrD!RFwqChHhY`G22|vNLn!6a7VRi4gD!@Ae2K zT6A|%SwkYp{k$!ki4db&5nZ!Hg{8dj)h57Z<$r$9=s?;uzmx54DcKt)m0_ow(XjO@ z{}vbrW9)Fk2;8-9>tkzX!IEOW7lMb$gf~wwZgu2{whBB$YvW7BQSPQZQDy~)5Wh@8*P!VrB-YNi~zFb27ia7UtoAd`4C|JS~iU%&Qw1UMjN zC(CRqwMFj@{DT5Q%Z!g{RpCq?CpzVQqdKjxHQ1xa=u_EKr1ec5)TH;7hvWIn?hs@&K~48_$RK3+ zdu{2({Eh&7HD%B{)|+9CYaV^V1<$`JDFoj0UB!kwzCp*vlO(9kJe-Iv4aj7J^fJER zTEQS`H@RGhfs9w?M)S`;LliZ`Qvu3g2?r)nr?wT^cRJy(wBCr0MDqtRFHm$E%-!6g zMLRw$2+YPDN~0`{Vm}H&to@Nr&fF{~L0>m}Ghn>Vj81s`EIQnE@l@Jse`#}N0!!DL zkzs?x4I;fLH-LS+=E9Vl88}Td=@l&5&xyb1KaYf^1>c=cC+$#bcr7(`-gQsjD7Tws zxszZy^8Sv(2%nbY|4UVV<}>Y_l1lTjrKy;Y5${ej*V%OT0+D~Ec3-9;X zs?8%af6+X@s}jQO+NREG?W&1rhl(x1!Yfpt@?JLkH~UV_9l*DG6qvuakx_O+bAq=s z({A;t{jPMtJAA3|O@KE~J3M!)@g5`5KHrMBrNC_Vh4B|&pimlm=+i4!K-R<3m20bD zzS$Ki+QfH%hnUo)1S~{GWomug`!{WD(v+ zuvqIy(f7nrv3AgZ=8rf6?es-84@=OK6qbY0wJ-G zL(2?kPhb zZ{|(D3#69jUn8s@S7FY>F%&HMCc-%c24`6k2TkwB}T>7a66k$Rk>2x3dp&D-EP;6vCr%iE>GKFx;(izH3Le$SQsp0A%5 zm-Se9<@jb?{00JSx_;^KuDtmei!?oLZDoJ59(**b_6Y`2ZP$kvK4#2^Lk;B5oCirY zRlPg?{iEPr_J_ES2=O`sJ_qloEFsXBDQ+Z4sZubH45vc)72Y|~@)oVTzXL$U?w#*n zclYx8f%j*|f#eOo&_;}Am3`vA@XpB}-9L>H4kiQkO%r&~{%W@YWSeD_%B5+F67d*j z?Utu*W~cd#8x`Co76I~a0hZ}GzEOX;;hDT#z2m$G4zcHYIefxJIe3HizO!1pDziPE z*|lfM&rHZW`dhSY#7rpieqo!w>m&7!e)!(++5So5!vv0pL0Wxlkw z;_!rN(U5yR9=>CNO_J%S#)QEl@X^i< z$-v~-byW{BRXav4GT1VHt3jrFK9-@DZunt&iHnR->YIe?0!h%8oHlN&$VawG{+?<< zoY3lysffn`42Anr(od87p_%kBvtEl~1Jq51oU>0Cs?E%&n0t{t#)ExsgW$H{YuO*? z(`4X_deFhMU*%36&*Y&?o78sAOZl$&98gl@b9zEa>Ul`Eht&~4&@b1AzPD7{!Ati$ zwXVr7)>u0Sv&p#{4{|Qcx56H> zF?_X1-NV9Zi{jD!EQY!op(nLS=XU(DmJtXhf;wDL&4dvd`O>zAaBzN(?%law3sn1p z_#_Z!M+Gw0@Qk>REY&5+l&ECBG20Y4{6#618u0a_FxP38r-^@-!(PFvJl*UdjdBDn z11S4BYW3AgDE#Gc`TX_x<1XiTCER)+z?$_X z7n&6Ev$hKOggBsrg&CpBUpqPE1~%I*WKQW)@&B^`ZW5)SBHYAX27S#;6vo)8c5BcH z!iREPvmG%-xk%IahqAZVSke7KH%Rm!>V_tpH`>bSS4Y|tT-m!g!=Ni9VbK>Rx}WE8 z1ss1w(!|#dy?b|&w)Q0+&&lInD4O`WjJ{*tN3GHw8{8SD?rdB!ZRgxa1F<=81)1({ z2JvQ>m?i8VI<$}9MmtE)MyKN(H%%Ec)=3jmP)K#QS&7qL0o;%>!jhlVO3 z&jsJtdo5DnGgt&A^6{Y8a8ne9+lmC2B)oq7mWC?KoKbd`r)Uj|vMQx$o%)qPrk?b_ zW1Nh}Mw*Y_&LN|blw(R7 zFqMcuihIjBcSQDyLEoxd@%w52JEp%6+H?S#HPt_I1T@F@jW@935OmoG zE^SH~5V5=!n&E+yvOEFgM<8j%Fift}(j53d3V%1r9NT`}I%2p0$%QVx!#G2{NyO0x+|GF&XFcta601En$nx7I1 zQqAX}hG!*oND@sdrvXZQ=WU5MOE7QtKbgX45%?B?waqj`sNjDd- zUTH|{!iKvo{j~L-X=^?Us9D+2O!SG>$w%in^7zGGy+BMpnFr)#L4Zc0>7HJeEGS(u z(RiPD!>0L<(^-m_3%r!)MMdobk+T+6rOX^H>@PRjP^E3Fvx;U$0pz%a=(m-W6LZ}U zX2QnW7lPQm!-pgsRh$Rxq+tS|LfE_T9hZ*a3%%5EE8!rlmCi9s zC%T&Q39zQ(krY&I&{y3pYWA%5nHIL{j;9dmcaU{*@}l1i1fbF-HD&(6I+spEHr?l5 z6XUR+=CRY)I%wupKQI4-`6@A*Z2p1C5}Q+EOD4Yb@LB`10Ghl=YqM}RO`lWgijdXcY?-_PlpTe z5*pPp$8~kOI0r-}EJwDCeZBX!`~Vja_Xl`%VEZe$l0N#Q`pQFV5Kk9_nkJD}iNtEl z0C^Kr-ATPgZ(oeg!%ExcVXg|I_d=BoM=ZHAT`5PDZJr04Ur3RdN~zCSJui+P?cOm? zZ_4uvSbO6q9^3ohA?X&NT{--uRs)j1^n_QP0Q$3&rxFIzTz7O`nX?jRXhg1DeB#5) z(GfV1DF?0?JQ|Qk@MriD8NQBaWeKv2Q%Q{4hBkh-u_vne>zF%J~@`u;J25*=?$ zdhu8F1#*^Vel)g8@`n!4w}b9O5MZ9mGr6l(IoOWq9%{A1u0kLk75}< z&VTouJCQe<1WILdAsGA2MManwFz@+UBd8q0t~Z?>7i9wlMSc4rIngyRBL7^uYc7hA zBHUFVhg$Uoyx@ss=>vt^E5y7o;$7KRvv{t|CpAnB&qk`W5$c_mfC9N(b79uh8{1b@ z`%f{Lmb-*Z{$${zz}Myib@*kI7yMEizc6;Irq>h1)$KEnLBTf!E}{B15VVoV)p+aT z76}rh#zlkeIT-ez_6b@mR`!5_WT}T{kciOQ8yX_<@OT6_PmxrmJyWnWqxT>-Aho3b*pIl1(z(06k|pbILiK8h1e<%dkjsXB~8Vf{m4 z;ClZn{kzSkl4$w-j^Qx`(3BIce`g>_bgmJy8*cgJ=8Ty6LZs*o(tJ?TUi$1Et5WlE zPm1hE>IZ@-G>o3sf#8sEAr@8W4+aYgQTPkDDhUV$hNQpvpEmwC*qRWQY}4A92_0DZ zmPs>)&dZ8l5)X-zicS159QB4{Zwz=3=NVHv+vF*NB9 z1yz|msvE4PVio9vx4?D z{ZQdbB!aR@k>T3)149tjYac!k9CIDV$2WZDZLI0o-b>X4G9HSuePIX}6fDMrw_{k4w^WTJKctikHje-7u zn7gF^^f9vkrII_IBPZA9zyVn%O~I^a3h^!RY1?E;v_(46klc%M2I=TV%+aGbx1n_|{GwNit$QzspH)ZRKc+9Ky0a-Mj~~W; z9=1QW{@mQWZ0CL4h$4e)g#u@U;Tecj_=E}U`TnGM7>o{0dU4MT*|8>hhQ`?UB!zFB>>~9<{V@O>aC9U~Une3IWIR5R z_5_;sDvxI0ns0l_QeF?}X5QNM`1(*9drDI7dr~8llWtCKyo`HdZv%?+Yo+%2`Fb=5 zKSVr%FvKu>!KA)Y5&sPD zuJbS|=5`k){vruC`iTofuv9tp)kTGFd-$o@dfQ&XgVVImF;1#Xx#`I3vul#F$qWYb z%LOU(SbQDVH4RnT>9}Wa7hO`?yKvd%M<7B)^-9gvI0d9NpIMkS zRT00KAyowFDZ=SlDLo`s`r?978R0T>hJCU9`HXoWFBuyu7Ifhz-OU9hFUQuonGfWr zokmWPK)otgYn@!v?`Dtcubl8K1%*k2j$mrp>~SkW z=^_So$+T1|P2fC#QyVCNlVUHq?y@pBngYPoosbeTuE5F>N&Y)$kL=WDpkyH~cO!1J zMU8RHS*10ceS^H7l>?Ax-ySAEq;fFak>8M}foyYCs-;Rmzg$T;k1$Bi^ZQD=+=cv~ zbPGjC8@KD2%G>R7`kXxj(wO;v?YYy^+8h$cQIphb3NS8{p_AkYO+3 z@r-QEvcg|3shClf+$g=3b_M|nrQ|lu+E$yX&=MQ;_k3cF{6!0wx6Dg;;-oBc9EN>k zD#NH0R)&||qCZOZwIv9erOFWBUabK&8^iW^&#Oat0LxZ=F3cTrBau=&v4cK^>5k@gj#zWtyXj%YL_X!h>bYx@JNuVPpBwJE56w;HXl zZ1;k@d>8+2?a%T+rZv`KSlm|ckXJH62?JJAR z7ldHyEgPiZ7!yX$7!&3vTs-Y7hkx;Id(DrB6cEMyABU(*M((X7YWt-L#i`S$!5}fl zC#oXNEBbfMF4HSLYC0$tY1Q-u&Ykz7^Eumbt#?%(T*Y>yC7L`~p}oAkt~tH*7e4Q& z$EWB(at2C8c9em~sOw`1CvA#}IOF9Z2~%FBmb4G8IYeC!Dm&P!zH#Jna-NO;Qd{(7 zATVoYNg}*h`Jn02H$^WRu1L+psWjwYMr~!BZZ{afjMr|Rh^JQYjck*m8ZE0?)~vqw zSAykMDOKwNT}~IGR-3e435!bEmBPlvKn{**+>sru9y;ynv+RdQX`cNo_%uiQyM~gY zkNXTcZ~J38fc(I+Tg@T>ta#K|CyTKv73iu?Y3>J!+07C?lcTyZWvw|?(w33jJN{5- zynWxvFsqw231<32Aj^xVe zS{qBm^{P2re~|C%4rPHF|F>PqE#D4Gqy(PQqW(YSb36aV+ngr7;Z^rsa`1CFOVGl|5mBdB0*q*?%XBXPjPm^A~cwh}`D~ z?6gO&d^<6m>+l5?;>v6BSph|=1uthK(GEITC3RddQQ6I%I8e=$ZwLj#N5a1>8ivCg zc9PxY9k%zK80_2>^XcdCV4!Dqbplas_v^F62wKZCbfyb7Wbkyg+t5R?jVp_p=87)rAsVG;p?@}0DhfjF2KY=ur_sDRN5Z@ zBoczZ8+*l`4CNsWF7`5M9V-hSSKJz^0xO62%BvUldB37t{XX4Ba8~4nB7(_iRUV7C zZ;UVO848`?$wGFpL>#F1+QXS!7Eecu#h!577tuSg z6^-(>A_N+VK1MVMP=Fhb(cBTDWU#U9m4gz0I*3`Ekeu#d_-kiPg!qv3`67kym=Gc@ z4AmeEJ6{D5GT9l)0Nt?D)UZ!J6$_sfK%VCX&4dy{lH3oNgOFQ2La|}=(_+;?BPZhJ zbklwJ?_h@!#;1t8lY{2DbWMd63lRBe~A zUI018Hx{L;2 zP!4pmu_b}ynHxga0}8?m18nj=$kLnve9s^Ie^-H@{|7@7h%5N$^Is(t_dm!303><- zFJ^N8IbO0tDI&&}NbSz6da0ByoGx4z$_S2h1eJKQLn#puSq70^es*d-_l4(XJ#*_n zK*J}P(truL6NXuaq7uz`1IeN|p&1V&u2eyhN#=m1r|%dhlWusBQB&9Kj?1K#Hhvs^ z-dw2ubqArME!@rtqD~^LMn}(jgSFkP6{lq?QJpdKZ;mfckF6(uBjSn{+8(#`kG@;n zm3xcjQ0qycjaDG+MetaBT!=+z$|gzdx#dMIAswr_Th_kYiKDKk!&_UmUaRf(O6SR6 zzMcwVclitdu{K&Gt?B%0$DH%Ka)m`JL6Z#Jpcu<41@jFbBz1!FpuJbOJ)Z8kHKT}Q z_!}IRR?c>0&Nt&Qj;h!jwPEdQD`+lYT-#aWIWB5Cq~_MoaCWl~Jf%0pW3b z-Ku(nGC90fjj`rXh7Cc(Xf)$}yt?d+VM=r=6)FS@`OQ&6LV5%jY**8LDEo=q2-2;W zXLFz5Yj$C0KPF35%Za62bizyq5V&Un=D1ejqYy`jNUkEZx`7gG{jZU)SoHqE-`bUo zsxgy5URx|pOM9qlM|Bp2^+Otw#8?sx1ynFD)OACtwIT+Y1B}#snwfkd`ZNWUuZ1Dg z3J5J&JYAt6fN_#GTqdGv#wb8&nj)t%)0R_2(EHvf6Pta)r*dD@@=u{net~%WnTTt@ zjak199mId#cZ9@4m$bZo{wloNngnd}jm87j!n|hi9Gq)eq)1}J2NY6a=#-LWMACKc?Fn0eJgkvFVwzHPJSCda^P{jTCuDdIo7gYl<=sY)}+_Q3T%^*<8y46+?f*t zH^<~z8%7i-y{g&sZx`Wx(?%_9eB=1?F3Q=~ZWpcXS2{)%Z9?Cz?VlQHnd}xq*zI2y zC9dbVFHaskv)NGv?a~q}@_}vlro>|<@v`XmF4Xxq2O;^%wnr{e?a?y4zMGVO?J%x^ zqr6{Bq#9Sdib%!nZ>kG=6?f%d7)P_OZ)Dq)iWU>+(HwnZ2ea?AwD@Sgm6u&|?0uVx zHxW#~O1#4B=U!!E>x~yKjHM?d#H@c!rP-Zxm{VDkNw8W`WrERLYXUVKYIYoFqPj*A zFD}v?HkI1j_Hx{o@ika5m+~!ax#-9xYI>XIWkO7@)a8b3_C=V??O4fZ7soW&yvXmK z-Ps1%D+Tf_>unWrYEhe=B?nJ0+0j#f@%V`N7WrAJ=nVTZJE zu||VpNVe*I9}B7xo>6jqrpD3elbe=GMt4c$PzD=N*o1C^{TEqP{ol-`R~MW*V!kQ% zn+%OSPE%}dn?Wye?nKP0-xm5TJ80J_9&2daEWBpADhIPefDBt{al>tbKt)<2snTIu zZ=8K+!iMD>YoHCf*0G)b%;7n6H#1R~!v@As4^5D1lst)5TM3#`b+OnbI8 ze2bnPSnwdjYL}M91Q_*VgiH&E$IwTZ8S_za4*+yAgj5BfnG{is4=6UmO(6JZKUR5SgyC~B8+P%s38NFVIE@Q6rfXPzmilun?o|)VM7f+` zBdcF#M3FbOR$Q@j4_G#;NQenj3gRkK>d0ZD3{BN3G>@?AF2^t#o1j%e<=&-KcS+6# zm6Eq30rjfpO$--s?Bj7Y=s=H~<(V?^04ns*QVD^CIxlO0hb~rThyP*JH%;Os3o-J4%j@DjkQ* zLeNu35%fvejsqOEvSa^M)%+~Sb>V1HspK+y1Fw_zI1{Y*=POV}KhLx<6ibQ~4s47T z9GzXb!%Psmx}s#;glavT22gg7+Otqq7wiTH1hgtBRnI*GQ#>D9U4?Q(U=8Ef&r_)N z0=gyY`$sC*AdM`2lT31sy!%Z?Ys5TOU?=+5bRrov=-JL8B#s+Yvyd!I7ej~T!?yqB z0G*_hL^v2o@bg96In$!D)){V8(7HmoIrS38vkt=Hk`(G)a-;#YyjiDcdB0a)e+l(c zZm;JipJkXo>r!!n|Drb)#WeSzW$q%|2m4c~$7Z)uqb+w8Cuw%9_w^&^?xo*ck_nj3 z@uxkG#F&A0mw=OGT>nKcYT1XP=j~}ze zn><9CpZC;te(7Psr&pm%h}d%@$tGvUmk74-*flv?d+qOAVh6;i))(ag1T^!K6{7w~ue z!|EGUtV7CwfxW&=hxs>+K1hz!@B+U!ly3QxjW>KHQcY2c$WirWOqv|mZz>>sCYc8( zb%Zcz*FDj9+sw}1&G{$)chro>?Mq@q&LmDOu;2mtO(FN?UjNt5^ovxp;t5fo@QHzU z;@Re6YR|x?3ORQ%4G;Mm9#`^!7H|`;Xumbak->7ftC1n_fQOOC(Y%4vPXoHvvjLG> zc8D~=@;n6U(W)GDu&xX|!V_A-YIzVVtZDOu0=ci9mBwRhz zFqbia8@GeR7L*&w&8f2`d^!*4v5n9uA^pY1j~onD8Uz=Xti(&Y5Vt=jP7-gF6G4=5qf>o$TuBF<{bDQW z0b?DoR%bxUoO?s<1AS5!>{}@}*5I}_zrca*l2lfIwAeWp8$3sC3 ztEe~-=&EHrxI++EdY}cv7fZKqiMa;iYSBl>2Oym1mZ4f5e0y;F2GSZMs^!hUS$x*a z2x9lgyVN0Mf+2;s^Orv`y{3ztYA$?w2dJ!1D4*;^h;JGzMmFu3ry}jIu)6VTR`}{ypXCA07t@KT>O#Gs%@vd7>me@^RA7eN=#Q>CzXb-L%&MZzWdOV}12D8!Qm# z!NxL)Cak9k8f)TR!7r3e|{Z$-S|MS9FN8DrR3$qkh}! z<`ucgSNcmAQP!FnVJ+dIMQmR>##46@b&ruT(WY`9yt%YXg3x?K^J#|)6Kj>n_;2)0 zm3y_Qk*;Ud)nT%?iqrJm(>i>`eX-3+%cjK$o3rJfDbTKEad5T1T|O7#9NrqHu~rmt zN#ozS^(SDrA zsv(RB8@C1~R?f8Zekms{TPVD5IM3Z5td7{^#dnE0>oo=gjzot0pc|W2-CS6Sq_xY2 zKMDYyz&m62bzH&UjDIx#Y3dY%4v<=hB-68UFkV`UdO2n=$ z#L&BUcq-2)V8}*ybjF?kFjFJjt1T<@KGe!$-^(q=N1LgKCHaX=4v=|7;o~<0rzSEhRMu+*`oOKW z5?SX<;N?sF@l6-Kc}=7kTvS>_d~#^UkwD#!5W!16`VLA}O#fomaSk+2EKlne)J(XWzpHxYn7?p-1nR=c# zTBjb)7n*)FYNEN|o3!YkmYQ&hI$^e|!bc*!!0>rekNz!DNYZ#$6A^S^LvoH_P$Rlp7@a zv#OyyvAiwaMX5Am9pv?V@u_5A0mA!KU|3&r8 zpROC7?dY#2mr0fJZOR46^c1;}+FVaQ9q~Ysb}-iX@Fj05!hZBw3NZdz=k&|W(w7ht zbW%mADXI^t)}f#^V80V&k3;4+rO}GH9b8#W9#VgsSAjF*maJdH`dPzgJo81_2Xj6B zJ?M*!zA#+fIE5N^f$!-N9dpW~a%ubr zd_d2GxJYsVk4Ts)vAZiCi+n{SDW=MO5zSQ=ui$AD&S~!p9(aku@VF^KE&Dp%D0f|I?$O6l|8FC5g+$-iz8m9mo|L&C8{W5`2ds*u}tmk?Njg-NH$ zuYOT^Z6+X4k3hP4;z6TETdvNR=lR#Nrl9yIl_xy=)8Zrf?T?DGarFi;1Ez}5*}eDF z*k0GJ++IymAM%H#tFlzTmafY98Ox-XcLSY8SwvFPht`ItUu$z4q86N?zTuX>LiAb= zlK=f#yCxc&orpOyjF0y`XPSLU#kcRfrbv8KNQJvbMg)Z051D(nq^I#O+N~k_rE3^b z7d~@V=<*_xEmBf5X;pk)FMi%&)Db#b=!dc5kMQgRc5;-gb;nNfstPyH)^Ix8@L!5{ zlF1VP3$6U7zVU~d<_qiWn#c2qxq?4l>5EY05pwrj9OV5a;9Pd1I5*(JJPX!(wjzNZ ztk+_oHW*koHw&sj%v}q8^&1R8`YYHU@|{TOdBLH70I};=UY@EUkS01XT#dOHO5)we zAg~vu^3FrMVKr&i1H#u2m-wJuqWB1}w_x5H(JExSxDp4Qq{9U}k>OtiWp+5U@H6vL zBilZ%XL1Ifs^Mk%ad$;&xX#5S+!T>@H@Oek$1*TUQ21Cg<@w+eVAbh%`sIUJ;&s28 z&b|j-P)*TP#fmBIGS^y9D=0=;SE@SUw34e=<)|rOh7_X)eQ7I@l7#=2=zL~?Q_zyY-NH*)p__8 zXl=T?l&$Mk;T~zeH{2`IHP5}e<7FBv*>4~b*qco{T4Fe{QmTwndm8vgt**DfC7CYj^x4(3e#4BnUZyCm>k zsypku(lIZ7|KRtdLkDg0(`D|@fP#}ehZPFpUFrPB%_3QBQU4Pv^DH7{W{U;8ceoPy zV~^F5{ZZp<93x z9h#!%4@8_||RJ`FEIb~EFW}a)A)E--&5iii? z%}-rwtJHPYM=>hb??##Q1)hIGlDOZ+-FDeHJ%>og3OCN~H?Z~H=Cn>dYeGTf&^G!HJ;=j{ObHef}gi_Ld zJJ5hmjNqRtez^0*hgfd>{R0Zxyw&rJ0*4)#u8s9yzg-C?d25;-n4+(`D1;FQ>!(sUC3!(_REC? zbP^_^zyPg9hK;2vAV8PR6|A__<*1qLq6$Eq8l4S6miweXq5?a-nHN^HdIY!f_-o@u zp>Y<5g14Q{Vq)T-cj+<(iSIn49(9+qkL2C3?9iuc1&4aE89IqL*f&6a^^zfQ!1XvI zfXQM>34_t9t82$vL;XRil9PbsK+TGPzDy#&S3cjbOdEm~NI6t9>84uAq4u_*#>l9q z>VI>bQwUr-2dEYXydv#&S)X**ktfYGV57CIm05Omhc}Jl(!cnjYr1cFV7GftkGncB z&Hn2ZS{d3RwD9IFW43<+gepDlSxb;sKMd4%92<=IMHrjqXOhMtmgBT~)AzY1_Q_Nj zw@j(JDHekRvv=jqG7SP@l9|N~)7YfFU*pUw<#ReCAH21<$J61cB~wM-4wnZuf?!x8 z&@&FDqPxuKW1#{Qs|nwITE(P<^g=KYP1JZt=8t1#dyQx~P)ChKLSV$ir527yem+}C z&!-)ct4_`<5j}3Z5e_5){UC0`%OIs5&V!TEOyxa5zGJiDegY_wdbk620d=Q*!#?^i z2(l5VjooD9Z%&w*U%NHIDy}RGVS6`mlYp4y-LVW1;yhH5ADCa|jvjb^77b)wd5-wz zEa)Y94>QRui~kZH!G|4I!~88=%0&5G0eO<-nmHrap#K1XR^grjSe|Z|icAjz75nrP zACVIcUvi7-|NNp!+-;Hwr2EQhS0&}q%-04`%he-MLZ%u)DE3(ue zxb}WfOasYLv|TI5YXcSpqy`fNgeG}+nlPF93JI91>1BvY--xvJTv2LSv#U(gM20pcy6m*!qT-REi98kj;igw`RKd( zC~Lj(W4oNOhm!qSdy9MN+v(nUxk~==dUOJzzjMH4O1xV@F(@m5V@h|b4a{J?WriGBkzCCt>v1AD;OO~ud zS+hiL*0B>p#vMeuS<-!EH+B=*GRP8IgoH@h#@K0WF;|rG%kOEr_vJO6f6jBx^PclP zbLRXpXXg8SK7qpH#M2sM(~zwCG;wtNyn?vMWGJEWiqBj0IAtfzk9VBXz_y~AHU6~9 zecjKYtN>+acdRx@uVVO?`NcJ&LhT1VM{@&HtRG3?=|2^Z60B~K*p@boc23}r-TbaD z!>XBP(u5m`S#SH_8J3gct?H5V^cvy_&#begx)Yl6h2xK*oRO@Z_Bk#4%g%EXE^a;b zkdlQ0F~ST`@j9*Ukp#&{yF1LU&!?+q4-voEIiw6U1cY^&#p3_)YP{yLY(Agqbw4*} z8(ZHtUQ70I_%0rD;mz}WmdC+0xKo3QFeYCmLt{d-lfmT;q-hFyBwF=F%k9>_`t!PruazqK8B3CmUW_dDa zB)FO$wiBn55}KS%KJ)C|1^w#z0|)Q6S9)z{ffONO7hcJN5)R|W9vdu zoyY?Fc{jh}d(4(E0)-LvT6x;Xw+t|wZ!NgmE6k&T#;PUpagBt@kH>C#&)1QC7t?o_ zAGL6{))=~`ebD+i!0lx%G|ZSqFsmA;M>fkEdtL1C89?>1IG+_kb(Cs5{gGC1!-(ON zM}(4=p|PQTfWwU^_usPnyyi7ADZw^bJ=~J+bw8SzTDySd=E@>hxg8&3{L`~}(y3Z% zTbEOv62Z1^`_1$_4C`-6(Z~G7_vh=SAG#x|65B2UCPq!?^i5{&D_Tm_eSWw1uIHig zn@TUk&u!KYG7rm4?ApX8yR0$1&ey!0O9w)5rKNLOWZR)+LC!X^mE!XjZypOQMFo== zmvnO_yf}T-26K4YI!MOfmLivK-8F#=<~6fxyZh< zDenbKj-#aen^9$u0nf~#{nX>NLw5e4-uETs@zK<|UKD6Yl2Ed0Icys!G>* z`dZe_AfCIqLx1P1+N6?X{7YMGtt7VEB{zz~#I=XoGkH}LvBRHap207-`iz$gn{&4{ zh&b+cohV1@otped*^G;Fg|p-3hRt5gX+$C`FV>nOxo6+yY`w>cwW2^NMP27@_Lw}y zeaVVqMbe^?%#osXsOgU-hFW-hvZ9_)GLOA;>wpBC`+#W8jq)h_D@5#SkY(|uF!^Be zvpDxpLH;k;0&3`IV|#nk1OM7EvmXh2`2Dis?iDd54f*uw}jI5THWNIpIqj#NNJ0^2-^Wl*XFz;=xU8n9fv&FLCRIMSj7Q{ZWQ@hZc50(s; z3m6Qr;uqSO66T^?IXs83+G)5t6Sk}PG{2s=Wk-sPcMR5+`7w%`ajV|Oy3(43TSu+C zM~-Zmxa(}^%;=3m237SDD%R~xy8}xO5~CNQrV)Ltrk&z;N6jZt9)3}| z@p0saOnkL#elg?UO_@Ig`wP$CW^}0K&8wf#eIy++_>C90jd2LruH+s%w`}ihw92os zil}cNBDANCIN?G$uC+&?1()6!CWQzL*!D=s5W4p6HKG=QYwh{gCf&{3AST zrcNN5Ph~ju9%GXq_H!sthKqWX%||#6QQ)I!eFR95MgKL%q5H-4IkR`d3zHeeKHiFy z(u>-81|;aIADIjbIk)%244uctVlG#1_LwwztihjJ%A5%KqOMyC2rvu|l#eN|91lN5 z=Nt%}c-$Ej=SrDJCxNO7n}28o!M0qw?(~+_vJ6vZYt6Tye z6T%7!VXP5SO7V$#{fL1jMC{}K@z(d_t)^>op*uwbQ*~aco^uJ0YYm$`n&-3CT0M4^ zFXv+7eDBVP03x6O-dE>vRE;nbk$iI7r0?Z}g>Ni#E!lJJj2W&fiz6x=Nh+D04r|@# zfX;@vAkD%`Z1>BilpnVOI0lkfdtaiv2ozv;#fqmZm`>4^9_7-NWrc7gB~{=VO0r|6 zi%rTpc9bR18A3{*7gMjq+3UOVpKWMM)QH+;&%Km}>K;^!mqB|X7TOYb9#>(mT>XWq4gBjFX0woPN(1n^o!XP zq~rFHG`l8OKHGr&=M^G~PMXO+(xsUFhg$FK8?}<)`m7;V2eyLo#pS zkX&aXT3)!$R%e?x&V7=z5>efncx|Ql+l*CJ5z3#j#p$}#Gqc4tP0QJgNXW1p`S}VFsL_g(d*5kcnN{R|e&8PrW zKTs&SOM>;#Ax#=6M1~6G&d35Z&T2GJkrEZ6pOpa)9IJjGsXzsSkdS{BB;hyeOv! zKFJJDEwaGMyunY48gwI|%#ti{pmXrs)Mit$ZQHhO+qP}J;Tzko*tRRSU9oMal2ljs=<)aX`hJabHP3$5o@<>0 z+y`6!4c0*S13}rfE2|m?1cU(-1cWwa-VZZH@dqxz8+{Dp8!E4*e5J^>D2lW|f-j0x zo<(~QnFNO1pI8`Gd=Dh1B^mL?ab$;(Lh-=8JXtcDpd5?J1y(UPr2%wU(aZOC<-9lL zfcxF*)xE2UIN)87z5VfIhVHN5;|_d+;QhP>h}{S&#GHB~#GGp3!G^1MJbr%lo)4`o zc_%nvPRltX1nccyRLGDVhDq}twP!iOEwD#^U`j(>W|X!^l(A2Bq}thVpjupbJb$tJs_GSbRy=NhT>;2vm1Jp_7P7}k!J11JV$6$a@ojwipW`qx8>vXJJ zJ?zdA<96Wd;j-7&y8wUZb`0vX<7W{%()c?7O2Z!-sp^ecl~$6a?0}R|mAP(@jFxjh zIhxOTBZ1C!Nb1X5dw}fW(aiP!kXA5QDScnJ7E8 zW{-~6^Pn2k&Fjj}2Ckjx{MvEXtEAXY>rYahfIyx>Hw5VZ;Rj7GOVwBeZnpy+Dv>P! zGjqds6s?W0{q=I8gany>eP?xNX%WZKX==PuvH9xy+WvMz8S6wDjx)_Zewge9Gq_0k zEAWR=HIJ|Z#=i8{dR{C6TMglt_Hv?R_Lr}FzoWzvzrxeTP*T{hrUn}X4n&;~;bm)n zhjTJA;7Z3(7NN6M_mgz4;=Ac5MkX47SN*K1*q|LqUH{umM_55_r&15}m{Drjev2>) zSD%5XQJ(QP3Kf{R!Uun#|9FREeI%^-Jz|lJy~g+~DJU z@}jhnz%n*4U3{jH#O4aLo;oZ~;-*?!?e`q^m&_*lUsR@Vuugr{mlw7#;AMPBJq!28 zFJVD=aoQsXXU9xeE7pV7LVn#q{p!VZ3%Y7}jE47Oc_kZjN{$2I_Ih`Hid_gb!z77k zLEPp?R;<|(jHShvV>3q;6{-VZbkCCwhse5}9x5_xyKM(xnjv^V-XBsASA(EHumh^r zu4uRPY+C7=BU8QW{OGSZAfm^B!Ait0-jY>*sG>$R-+;7@n-8id2AU2mHkJf0=Ox7L z3wA>N`?)k>o~;OBOg*l9-c&2Ax>sd#(g1YY--PWe-tT@R^ihOGFOUaF!s{7t|8@Ch z_a_pXzZ3hE9!TK$1W#azp-gEOQ-WuU#0`utpn2;A8trA^l6q$YQF51^@s+gh=n(ox zoxo50I#y^dUD+qqZWwdRChW+6_RmN-hX4{Bk=n^oC1Z8WWcqd|_FqA#1Txzjttspk z$qnVX*9wL95^mN zFaghCQlK}=ONlTTi^uzFqhx1MtD@5q52vJ+NFxQ!u7FgleEERVM{9Q0KxyV+k(#!U zjP{AHSQz$~(Idp)Q>buZc_HZTh*;6r2LVj?1C+I;u46gWXMuJCdyY<=&+h zm4(^0&>UeXB@WOkTUHnuLdRJ}V^~#YwH&^#l%E<;i*sXUO>N1{m4ma@FJx=_#Nw;< z>DuvrnXPe9bTKX@WWBobWN|7oK=)Lm*uH{jQz)jjk}-j>shi7zn|@FwV-hX@U0v25h!EE-T`2>;fbnoybY~s9BLR+`KF%Q zDzbQ>Qv(mtg1L{<#PeylU~f84G=c~OVgw9kph^bB%mbG$j0Gi*<7%^`biLCi$6A3Ua2o<@&WZB%x_Qab`4f8RYu2zo&RGMRxDj1!RG($dfM3s(BZguTy zLQ~Oa_37Ex6x&lHa@^$nGLNS@^H2-MXqXBgn+7g$+NPHtFwcLI4Xtep*>ku19Ga^p zp#I$0_;mELs}quj#0<%t{k44%{7sS|V3?G1-3ZXqJ$R|-W>adjIc-=-Eg~5@2km53 z@Xnl(UkDbZjcc2EDxRKDmzlg3g;+`NXn<32Cs&Gr8M9>iNKNBkYED;3NV$c>%@2(7 zGuZSz;-4HW^C9IKoKie9{tDcJelMU3LgIin!vgno;{>zF^|F}Zn0+;$q2u1o;iwNQ z*ah^oyIql#CiRE(k02Ch-UkgWPBjjbKsFW>pRn$MumX$j zqFLTNU8r{i;*{D$hD+hOUa3_r7*l8 zv!m^zk9RI`jl^J^vt>t_yJad>q#1C=@BvNJ3MPiI931*tyGN(dfE8@a@$)+PFz%6ktHtd^7EFEspL&_D^Xzo&X6_DQ78wf zz1psXF}CZ($`6(2F%C09Pw5W0$pQWGyoi+#B$=AsBzZ;_@JF(*yWu_ba8?#NS)qv3 zq)8|X$tO8<*Cm-6pLzt=@HH~~Whyl@SnX7DTU)W*f~rdggk(W%Z<}b!YT6ltALyJV z&W{eSCYIj#IUky_2kCU`3+UF0CXWJ{R8hft0T~UY^%aGF@Oo1BC3Im`#{kkc7=7sS z8CyJwKM+!`5Ng(Bjw7C=YqBjR4pZ2q^G&dX1t1Bk9B9@gNUD)hE_4oC1LkMMj*Bml z!1|Cs$=oA49A5dB(J*y(pS)A`;qu&G&y}CmAx;G$aS6rh0|Wz#;j$XWiYE!A`t z-nl(heIYdB4%$A?#G8lH%12=MhxWT30nM>+I;h~}7?yr1=LE_C8i57|Wo6{sNQ^>; z76_DvAknlKbXXCYyWKW}OVJIAO$mR9f1kA z`gr)*`~ttfA25CqYm&2*ElP{2i^7qjnqohhLcekYd2ZllD!}7e;-T;lQF}5|iT6py z$l_@r6W(PRz>DAk+cMkZ60X498M-8S!#MJ%S_YjdN(}{_^tcey;R#>;6?L~{leV>u zPbWCJT!zM&*IJeiG+#{cHEvY+ z+Lzy+60#``hEJ4SM{BO+Om>~)RW=p6jE0QoZkC2X1^f$hGAhP8_=LV(#|^Z~1k`J`5Y4{&kph&!7&$xsda&#_|163LJY#sev-!dySjv~soVP|ZwnwS8hqE7eW=?jZIr zi|q0V2R4CbUK!WWlN?7FFNm=IV8vl((EGk<62$xUXcUio))$cnA|RzW;>9U(Bnp6*3SvPm@L)RUplH%j@jDW74248VZ*?j*TrNov+S$c>Dg~fOE1Sik8ABjAeJthLGdbJHnAQl>~+P~ z#8EO}Y7Or4mzgHx>OH=BF}4#ZoI}bJDIC?5J}a%Y(U;mvo%ZW1r2&8f2;ee-6!*6Q zFsae|^`2GCb)p)TzZ{-!^I1Vp@Gyr_M=`Yr)@w?iR~9Kw1~6sAY<}DOF4BFc>oH<+*sWy5S1`mn zF_U-HR381t#PQ`v5doZKTAbNU&Q!FVsUhGIj1!oSU@eSlp5BJPTk$s@L7bUstn`sLU5{#Kyg$T}jmaPaIaQUY)z>ik7Gtj+=Nj;AU=gg&6F~`6+*>>bh zaKRIBVV{_t+a0vt?L;AJae1#NN3)b4T4J^{&oTSdK$>TA&jL2srV0Bw&K~20G=K|j zcmh{_ur7h{M7$gy0P9R^qHnt{2bc55gi`-njR>CF3==d!!^0k-~D{^(9K>;EN-H(QO zcZVNtB+4?UGKW*dGw=#54>WJ8zmpFY%WPBA)rS~ zPf*sTprcOzJg7evUSu! zamXo{%o5}g-xEvC$qkF|h4Yc;6zl5`G@*CeNRuDYY_Il}tj5jasMb`Qx$ZH!@Y3k6 z+vHg^XC|{@Ma$u!yS5RwTtFrB_OZi>IH14e>hHj(Hr+h7{XhjbX zmagNjzDdLH2|so87G^T9=ht^OPok%n@-B7JZd+EBohHA~h|rvTnJWJ-cH5wU9a3e0 zvh1;5>}1vXA)efRhiI*5y=m#|(c|RZ5MCv^G^Vm~bPhcT-P#6llM1*B)Q=|}n#G%- z`-^P3y#>dghcZ-yeS&?^yJeObqdBxnZ6z*>=yfI!cY~2T5*cEWyWcUED2Q2p@DKoz z^OkzZ20>xZGW_|beg{&(M*r^H<#dy|iqOg^qS$Jzp;gQ?*iK&xyqwoSNqVV9;-wY>Bspr8Ti;34;h$o4MC1^b+y{g*55ZzjeWc6f)u8Ng9YEkK>jNC-{Gs}VJgcq(_Z-0ggT3-5t0G)sPE93~qXib;- z5LBi{NKsUJY%s)ymtC2A6uR|VkQQsmlZ8kUrOP}~K7(I=^oSkGxQw1GjA0^MV%;%L z0MBEeSY!ch`*juR$+7!jxlX!YaQFf2)qaVx6X=@~yOIY|;Q7Tu&urcxOemAGWQ(_% z&%;!GQtn8uG%}mcAx~*me%RC!O0xY2>NJ^*f>P#Kp-eBx45d;fTDndGZeXa&yJQ*0 za^P$+D(OSmdXmuwlJN$mZO$v0QWU^gG(CY-0dir%z;;(1zsS?Q1AKQj86wg$o7 ztaYCK?g)FeF_ehxGfp3bBUXIuApba`PhLixgH}sI7BA?5T!650fhsDPJussQVzT~L zP5z4y@!x}?g|=E(0Tcw}790dbGQ|XgAO(pKDn<8@0#K@EpoAuZF5va2QMp}pDk7RR zQo~vV)0?F%tU^IPdpV&b?6r{KV$U;U+A#_+^7mH^Q|6no{|gb${o(8lWT=GQf!OKn z7SHRJpQ4oz;O`yEFG^0h1{E6PX?mV5jwt~=Im%x9VoS4;QCgDzQhy8wG}fsV1JO1V zcM6lDQh@)v|NL%>uhf-KE=_w#{GDgG=1DGP^8y_P>Ioics)A5zUA;TspE3o<7$qF=&{j!*nQi@J1H*qy&fRj5}9W1>v(;&Vb7tAwk0(9 zX1sh-ItRzL-7*><-FadFS0C!q8K!i%5?|hQ67tW-8Q|}R+f@|t;Ic$CbWHI!seIY3 zIe^OgvEl}gt)2MvJ z;gtLYk>PVo4kG_^Iw>~XrqR+p-OR`089eK{vweJqASd7@vpFlX(jNH;^z~{Ws{A6+fmmO=-OL;THV; zus@QT@>O?g;0>5_oN7s6A7PvE~9pb-ae#N05e%sWJJtWYNI&ELSq4mldQ2=9# z`vU(jc>Y(av-6N3Ae1N|AOimb-s~ZM${Za5pr%El7L$$7&vy&yFYxq@%bWY6mo25l0o3OGDC2c!%j@--0`U3x+zz69A0F$wMN$02 zORhsol7=%CP5jV;jLF3iwdX9hOGcD6I_cCYPwEqhIezA^T%Q<77F`*0GiNr`~`L^B*Mo>e6ZO63)@J@Fqo>rU@%4g zBQ>m?f}iZCwpg7>R&Sj{rVPv+iupA-bbx1enWI+;``7|Oa603ZVjH;wL(-z&0Znn~ z5H9}mw0MTe1(!`*@n#Iwq7e=93k5VifES@sNo*bC9=`!3ii(saI8k~MU(3w{W)7{j zUX%$8JUix+_eX&S!K$iFTT_!=GiOa}i2>Qlq6IhOcG@ehjGEgLCyOEfv2W?$yv1pA zIb$!pW<8rs;3lQ>&p@Cd-A&~|d{)*yLI7wXBAv);-Uzk8`9NG(Ky@37L}C>qfUd6e zgMD-F76jWB3f@)Y8FvYnC7_nl=kLP-EIK8{+(i0@Bh^x9*Ey`dUcv1SFbl|8Wbv+X z+>Dkf5qZzB{ae|1+de+rvRmLoGeaFkTUW>|t2w31FZASyo~G8RV~8!DIzpA#uX0+B zXHtKPVE(#Qq>@_9kejW*=R5@qa7|1{-a~8>5rzd3_~-AbzRQ(`p<%kc!Q>RHp{|e4 z>=bO>kc~5O#H+3iU!9SYvvKvKb2bkFx_(qz&lP%RPW6rF=4zWu)Z>aAEaQj;Y>~C* zd`Ky5dZEUEtA5d*WDQDWo^GBzYRzxlwa^Miq`Dkc_xcY5)mpuSg>3PXOZ9jr@1l63yCA+^HtdWt8pJ@|jO!LFGFVy}u}e z`9~i8`sn_Hh=0)wWZv|J88rD}5%(K@m0GQ%LFkt2%%nt~pa*fxR4_oZ&z6)y*p{zV zRUn*J)hw+z%(U9$zKy`?{&d8xow>zdcD6xKtAXOU=+D5)B){w~17M;fWPpO18Wz$F zPpfrhxkK^mad29hK&^B(9#oyT-bQm*N)ngJ+l_Z0NGuDw{ zp-TM`@@k|JAodN{0HDOHmUqiSZjMZv*}sq(&f21cTnsw7^9vEr-tqJd5DV08SVD{1 zDi$GWtahLiXqnw(&tZ%5tDgmLru-2(yb4vjZ(qv5W3bNpeGw|#&y9OFCXZ9)J-kpE zU7p*%^z+d(+ha%34Ov~uopAsIdP(*$g;)#4oa*b1rnr}r77$-V?h9Y~C56Hp(qw%F zJ-9GRmRO`9g&Z|YW&CcEAca>8NAkmzX>yoQJ$j8rsV5k>5eX~uOPh3OcqOcP@HE!W znPD$aTWvp2dkyt=_;I>RMQkU?8!MSxIJ-YV*9F<(K+HWl zfgi3a;9LjJw*hu7#j*MvUvvTj?%W@Y7tDdn`!|@JbUr(@HCM^e?U%fAWYDIa&pXU9bBOn4OH)GDN@ z!C859;_}Q9pQ>Btil0}X`c44zc{qF2d0_zX_hEycusnBiKQCvX`r0HMy7gwSAF$ZS zf4Z#M1i(MwK8bchM%z_W2mBH^kcy2gXpsAiRk?@jO%5D#x#tT+1?*|L3_fb5`ZvWq zwB;P=M;{(_5>Bem&Y=Y(Z8m_}xu_*Vz#+%y9Z{{#P^mEPr}wM4p+l^Ba! z^ZK?EMLCCHGQ9UQ=|*cl&?WM3mGivfZtrv-tEkKkF~T?3@IW)kyU>5Lj(oVUsPtcx z_4F_A`2Q#Cc#iM@d1($xOUmeDf4%UwS21vCBNODsH^7<@l1M6GW+SkvvW=Msw6IpE zvu`k+_=@i1oSv56L{YwJaQt!9grhmvmP9@*uZn_1YHeMI>_XmPyjwHu}yYeQF zQ_0X$d+18Ra;isQFq1C8Dugvb=j^7A;-)T z8Kw>?m8MpJmwyhH10(K;hEnpTs$(9>q=neA*AeB=PclT})o$W0;XjvwlPGlY>qu$5 z%)3zAuD1jy#z8G)yz+!myes)LwIeKJcV+cauP-!z^ibZFRWn$Jj$HJypESxTxMs%E ze>(K3yoRkWh{Z1(r;RdLwaI*MJ@*htv`fr3Y+B?*Tk zPDkcp8W}1Y(Fcpzh&?}(5E+Ov{KJUC0zOyyw!#U|cpQBM6$~RJmDIz_zt>A?e1Af~ z|6Cl#{$l=BDx%hbDN2}Z!EU`yxISBGo=t!u;mK*g=+u*3cL+3ENWIM}%?^ecw&te5 zW_gC7GXcN&qcMoFNQF+E_xAt!FLiJ^!K!~m5C0?j|8;M>92CSQE(aatshs+g6eTnY z+j75!X?mS$FeESvi6JCto$$s|$T=AR!@b<75zp6Sfx(qnco*g)2L$0em0$*S%hbZ z`hR{Vo>@$__3*(XJr3L%zu&`(nXgo;G|8N=TXR&Gd5=~jJiw>ohjP*CYcIY4@=&rE z#Xct5tax4~5wZGoHx3C$T0J&7M{Gm8>ts5@f6=@3W}O+RDSWrtCR6kTzz-?+Jw^AQ zghRGphBr~sclWV>=aNiI7*K9ul%#XN0L_Sy$>YiW`mqe0N2Qjo%HtZJGoAims7@)$ zVV`7E#JR7X+f-JNM5O|kGMDB732L~GrrHBNKs{~ch6)pyDR{TwteT!X`9@2aHM;hy zz)X{d485vt%S>Lv)4<+}VBK;W9_yDArFAvn1fa4uq#NFBz%4(=Va{dR6{#y12G{=r zw|<4N=N`QNPIBsV%3PzXvTM0=e~VduZDwX>o`Fzcv^N#4``PH`*2NCcyi@AwT4&G9 zm|QqlDoM1640-GiR+*aX{SbyyNP-J8gwrG&2ECNMNaZ=;{(?ag;EJ`c^sO_m6WvU& z&KW{JWfJLc6TN_=I|p{1w+xMP3IYFTI>ua1UA^EfWIRHwk9uU_fq;KOET5Y30Cfb1 zk?ipC>Sui%?L`3!WtAX6cY{lOm!ucULQR)dG;3^!tTW=R%&CfK(}|8lW8zmCve^`iz7gS6@&q+I{Bt&^)2la;H9xqXTQ2Fm}r=k9Vqrd)7KLHr%9Fp6vDyI_5UvX;1dCZ4Zv>} z$ryCl=d0hZ1NyKUXwe#Ps)wBY*-M@Z=iYd)UZvQHuDZ1>wM;%h{+pgbM z)wWWm6In6A*7gjrvMBF64|94eJB^eNp6T@<>=JdtS@E8V!;aO+YJd^DfZO#Nj2wE6RN-CJ?_k8a;F8f z02oeQBD8u)&aFG<5~D*;8i7#oOmpg9UV#=Hc*jdM$QC3g*sfMlW@m?O*WxO5{6cd3 zX`ejZ3ysbJ4C^osr=4^_<}DyInJB!z@Tf3ms3<=>a}YcWQyM(IagxaqV5^+3PRm0S zETO@Ck9QOso5yG%6F3H6>UM8A{s|Z|+TQZKdP_YYw=42PI*Tz6EO+ZmT3cr0cyVA^y%#9?eYNQ2o-rbVekn1#E|tto40;x zKcvM&tt1g8<&8v4kVLh!d^QxbXF|0dDGpU)vO-C0#it~lciKZ0=teFhq38x5LHsW3 zmVFmKm-vu)H3_ccBrwtdF@;CkT(u*-lG9TC+)?U`%n}V%SHy4%WbPm557IYD&Mb8X(*P4x^A(SGZECio_ z*s4!Y947&NIu%xz8-5lJC+fEw@NF3@KZF}VwjNyT!HaQhw&u6R177I=cCNcov*|zL z4sKxdF&uJN0--#AC2sH_I?UBZ^j&k(?JP9jNu0gIORjh@^dCeLH$b;*K7N*MJdO03 zWg(1l!uXMI1#Dbp-GNQb85mVg|Kuo&%$_~6i#QO^jCanlgwna0MXz!njj2i_|HJs} z_=PkI8Q(iln)~HJ3Lw0pE`T1Vr8Mlqf1NhU=NF+#M(tAP-M(s9~Q+LW5xZ)iOJ z1(#je@5p6<(pG|a2{2uPbr}1k+3|h7!c&*6_haZcaoBWik=N?>@fi;aP7S7@xAUHE z*hn#x0M}eWpyz53`!jsehk_=6+;mtHtYVJ6*#Bs${WS;Y4k*=@q6a2jE}Ldvd@0RS zxX`!b5Q@(M9e0b9np0*xXq zOmUzs5|0}@2Q>f4|3$1sI>jOXD0tKvk4p3lRY@W&oln6`bg?^p6J>&7izET9lOlGX zab=n`!tbc^C|HpyPT>Uu^0LO)H)a$kVN8djN0gI8?-Sf1KJfI+?yp3OdW5L%Xo^b` zM-xA0ssWRA8Cb_r!LI=Mg}x9d6v2pyq`XmuCbQIADUu&UM+(y3T?u70KO-A&|4XT{ zLZAkCO1+p6VAp9;8U0(41|7~VXmgnd1BDA4Z>1L}mJ(G#e%vx-V`ztQzJc+0b<0!o zFO`x1!Z6fdkiXQ2oeVkK#3I=(r&9fodAGTn-`|gqSV3Sd4(2M&Nn#8MW1JV>rY2*e zp^1L`GEBZQfJHdqpb+Nd(mlJ4WVxXMC9@+r12TU!qw#5sgwj-wc}Q4jdCPPT{ETF?@Uj>Nt8%IAvk(o0faQv<++d z^?{2ephHKDBrzhm2lOkIhqLVJ^fhW2TD{@?xA_z1IGCgR-Mf!ATb5BBTW z<>EuEG9#_MtNM2?NFkdi`!x|invBmdf}BIi01*t0GdJHs_i+SZoI-BAG8E|ROq3vP z)j<=o%JEUO_Grn7S~%HV8Wa8z@6Wh1y7J9Q!l>En-QgU_Xmy8*^8Q#kxl~)->TA(v zef4ykvNXkEO(it9N^k|u9A#!R=ozZMO&PvT-a!#AIvk@yg9>dq<99g@HJO}R_J^FC zBn${l$A3ZpONaA}Hp2G5WVV9>0TKG2WM-Dsf=RQmWE$xFjS!((M_MX8>^?*%zX2k@Xy$a~*t`>n;%zt)IZVEq<~ z$RxOMPxD>j_Q8hmw|rme{S85It?&?zz~@bM$b^9G{?s3TV8Q=tjAaFXEeu^N=8ZyX z40~c_xY(@6`|CihpJU|>Ln1%kpy&^U(F}GKPNAjbhXuMv5@>(yYKiigyZ>OGMJ%P6 zN9rD0KLEWk!=(zRo}03Q@+Ww1$x(hyc9g7A%x$VaKU2#3UIk@}$Fg)IW%)%Wof>;q z)dV}iqeWM|E{}rB?0kv%n5nObtjBU?8ZOOJiT;=?#hpXeQ3kB91nr7!no-pXBb$a> z7i04gJV$ozM6Q2LI&Ob%<%B**Zh2eH^OS$-D*&{gUcDd7rb%0h4Ppuv|5*CM8+@|H z5~qGbwVz(ilVPn-I!lIP%bdt88T^TJug8iaNclGU|UAFJt|9q z96;UBx%57ZCC@F?B!Ie&(}=YOZsx+anhH%RudwPi=BCupCc^yN;saDfMU0y8boIs7 zpk`aQh{3}FhRt$rl*0xyw$*YLcH|(c?8af)PKtR^_J`a|oAvZ`_L{lbdYNPFr*2X%M5x^>k$K`6R_9iuS%>}$6YR!#e*x(9F^Y)fT zFJ8NQ5QCBlJJ?pKkf;nIXHUd&=BF(MGOOXAI9`0fqW_X z;!=^x<^JJaZOxT6?Q(J8R_XS*_D(i!;4!rv3WyX(?eL!^JdCE1GIXA;nG^FHq?vlj zk{WZ5s?kVJd_$`1_cg{ZiIR$V=z!DI12(eSSO-FRfl%V?SoULOtY-@HdHbTJ2|SON zSp-@bvu$}3baxB7TUSy?$P3Kk6b}utoD7@wj_IJYb6LpnoG}AYeTX|~Si6l`^agE? zPUQyM^{XM?;R!Gr(MV@dYC|j>=}a4nQ1H(1dPf-DnNK@BNBHh2obBYi34l?apkiBj zQ3xy+A}Y!pcrGQI2#}4{3KJemmHleLygC|QHAH2zN-TxjXuigz$H+A2C3G?ygw13v>_}Q)=jIGy(J;k;GZ)u$c9OXKm!Zk4L{=it zOtz-}!cADTgcd@Ua}TknHh?>i=Ah>2U!GV}D;)Qje1rwu#P2Z_|vpx0h50+0zWP@{TNcP;s0?A5KD4E$zWB(1)gq8MCVzJTr2npH)Wk9bQYzkJ0{|s zfSgN(g&S=+JF@WcLr9q_Raf|}Xg&C?AUuSv8p+*(Yw?O;hFO?VzK%Fb24G9H&7NO} zk}^N~6=L#03rmRt;CE-Jdj+sveP_3Vq$BS;uyy=h{ocMJ=^Ot%dEH;=h@gb8IW-IB*TzqHV`{AfTZAvjsWQMAAOx zrK8>Xt0X!Oi*?q+V4B^hE@UY}2NQvxD%I{*c_t6IMd3vi=ib29v~BMJnxMlYzrT@y zE!Ic%YM!YIz>0zJLuX|pr;SGF2?a2lx9c+nk@y`MiuEzQTDukma~(qgw+cq`LG8o{ zmG@7w2nz@&B6;zCAiNjq+mDAnAirig5-cQOOWYrrju?**(TNszhb!$iEKz`Z;n+LWu zM3sRu6IuFr$w7e;h6QO->}chMx_INTlVMSY5e5SOMoge~?tSG;Q&%lpRUfPI_0Zap zi`WZ*PJ%Ms-q8R3q;BeBFx79QY`MbqGQCMvEI*Oze3`^7isChyBns#+IESY?9A&sT z6y^2m)n>f92FQbl3RAk1EMViOCwMX^aul=@+Je9^I`v`2ZWlVuCYzn}(n4CvyE+on+*XzbWTn({Mq&|Lh!8xIr6BWqd4Y`+e(;ED! z8}OY%YYdEKpz)y7h4TdWYpcv~rcd%u#YpQ&4aHmW`#!ia=FXQ$k<}R8A9V=i7a-r@I|I}1Cc2k z$Hr64_0FCw9RBM@Yp*q6;_q^1fy4P z(bpznR@&%Kclg7aE87k#9EDJzM=(NYXL?PS6m%!s!P8 zt=)MxPIKMf7}{!W6SJd~s_shuy$C;q9?PW)AF(x#TrcHdIgSkro4 zahz;Q+4qLXxHZRNVdh4*uK=JD{PrYdb?~euzuzcniLv0(g_gGwGYE^SvMQq(|5*~a zM``!z@O|HDALpbIFaZACba;zWvX7U2?e%Vl;>vU2y79w%@?+mY5M-Ba+-LBhC$x5! zFcS>veT<7Aqj-Lc%i2_M#QP&@Z40Tl^UCJviNwemWb{X@_1W0?NfRtjkV@Qf z0QDZ+AlluNNsDoNPn~3VNdI7_u9L;D&6vjSB*~}X_~?M1gFOf zyGLns1g)gx_sIJxX9|0&nusXS)pfO3V_YTlcVb{ylxhIaP@laOTXBOyLN<&V z0}8fXRSSA4TB+swnqR~xi?rXWo)~KvS)?9PCHbg2E8Y(ISA5?Gg7jsK$#r$jeMn0Y zi*hLEt4TBVTVD2-7EFru>rN7p(dASs126pY#;EcVXcrBLbS{FM&(Nk|ZHJ&wKXJ57 z$(D@K%pBMVM==5Xad7u*>(NGsq&;$zuMG$V#Smi)v}DGU-YpX}))}Vm(lors^7a{& zVHRkf(o{u@;f$T2SW^m-6NbabD&K*Se8)Ub<5L~#JHuQ@V)`_IUmOoObtyuJzC1uY zH`mN`+83e`>x<(dBxj+`Zf2Z+YoYi8u_~*%k~8prXrVh``3XKSVW@?^J@^79zF=4l5r1YsRur~&`VroB>cy&XzE=IajU9avpDm28 zj?_Fcl8^d85er3&g)_fVA~K`RE_bu$?gYe=Bb7^&urdPA|y#{y*qP-Bnd!Gf@yZk>oc?|SUZ1E4fJcD>O|q7 za>m?fsDnGse3uJ6-GJS`hbSXZY5s#`Mw*4V53xznIp@qb*zj3J_g=+I`L|{AQdrWAXd}y3 zXs4q$<%((|qq6JC8WPVXH5ta?+pl4KsQVHAN)6gY$o+7}48I;a3O+6xm>PS9{0z4u z8s^ywr(LFNWFp&5?uF9bmsRuz_4(0@bP713{r52%w8v15Dkt5wKP@i(HDzT|ah~Rp z#xKnPWCRYw(Fju;{OQFsQ=QtL`3Mfo?$-ASjPO&R{ITCB`mOWi))ynZxa{?$HgoUn zrIFU1ea@i{sa&Bw8;8;@I0?Jc+&z0y>hOk>9VBK1CRdIG zzr2tP`Yw)=jVb&)7os6i>9}tF$P7SKXg2JsxuNruT+gWTYzo#rmv^2Ha$@;C-NUJA z`c@2=Hm^^`{iAn^&S`6t(}Cj-mO&i*a8)zq2N#G9Y5n#CFdwhw-*qGxZZ zNnM(8zlmYGE%88jxU7}B9R>4}Pb%bmOYjSKHY&Il~N#SFlVf}YJQ zEPU+9AOPD9{rANMT9aCS!066cpoLI24l5oWf6Sy&aJ}G;prH5R4ct54 zv;}C%13Kdhn%DLscVV*2`d8L}HwNH#CotTsmd~xeqwHd>;uu#x?lu{^uA_34rE%FR zynUIf6dY*pz}Pb`BjB_o0*+*i7sCp{#4z!^di6|YLhID}TojNXwggC0aI1~*8j1U= zu+dz3_z{LnOTRAH&r7LMCOm9*eq1SSI_Ia!k!t7D50ntNBN;s)+o2?CR{kp>@Csx1 zQ)vMxbl_TN5GTYkC1@275IK5J_VMHPfHhk%*`_tDi*I<4-lmOEZJ#7L)$B~Os(fJZ ziLf5qYiEontFR1G6a>Up8vXJ^m(XNqBQM8%yT5%yI<>5`tVdMrZ?Ma18!WMXUbM(oKC z;dZB286@@4LBTktO`7{TPx=n60%s?MqGVF3J!YkkRp5-(oFLp-Fef-GIMA1Kz-ZE+ z^2PWfK$zE)*Ad%4*4&@_g>ls{GC{UsH1VBtRsV2w*TUz5a9(c#AUM}VqcOZc{t{}Q z)l))30Q)YS{P-uKsQ!(IC{ylj@l$@CBLKqH_0*Px(ZAC%QDr+I)X|44h>=_GVQDL< z4_ZUmo>_k~$>~g*W-pu59pngseFrfKRv?X^Ros44k2M#HuFPge2y~ym1e`8@zrDZX z1+it${6rbTxf+Q4u{P`iM#ahuniH>J0GIE^&45qp9n{#r-B^*?(iTG^2_GN|*gYBPo&T~Vlmu#} z*|gG|0m(Xlf9)vPgRI#p;iaZG3%9(OdnP7<3dU73W$IDw?eD<2KgJ zgs$dS;DxRo#X3Co78@wp8O1S^s%D;SGmJHnA*{?c`?z&>9W-!U%;UfK;Q&jx83Jb3 zb3lHt80xjzvpFLl&juOp9VuGlG$B>*4XVP8auhtDuO8 zkdxIMcVp72m|D}oJ`=-EkpdQN+6j_vQy9uRIr%4Vuhim#wc9F~vFf6&qsKVtbT8G) zx$(=4bjY4EAeZb!t&n>8lVi<`|G-><8Q?Y)%$A97go3&2ZX%vZ5KUO(ivu{k5hYD8 zz1rs+;`5oLXEx5CwAg1$w>~km1qa@4`lu4rlUw7+t%=~_RqG0~uK-`%;1Ngr!x_&g z@D45*CkRQ4ie@*I(+Iil*Cz_*oXmT_874~CT5Aw@rquZ|{(`3OhTiU%FWrJ(XI|Icw^M z(FAMEe#t9+)LvXHG-_UOG=WC&Y0>+|{%_lO{hyx|`S-&Cq7>rGf7`|yyJ~nE=--Z< zIpG#)s?yZxy26{dpcEQ(ur_vj#JIS!6zJmBvlN{On~dEZ8^V8qf^W+ieP=04SVp{L zq8?=dOIhD!-@Xetc?&L*0q^L4>Q`fa2m6*Z6}RwJ85h* zww-*jZQE93+qTWdR&%;9&c)vUVLi`WbBr0WJ$0(TxqLxS^PB(X3S47h2m_CvjB zB7?Uy=zA>A7`#0RX!R2 z;o7Nr!cluI)=i!ozV4x|SQ56Da&V@1u$d0BagE$bBP#08#J&lWbU)&!rc7e3I~{2p zv>JsLOVU5L%K0_>gq*5Ae$T{uIB)?>`=$!3b6 zTBrT0a5kLQ{}wuon7oC4YIu}NA+T$WH1WB9m@J^_w9R9wH!9dFjqL{|-}QX`l~Cqh zn3l`wDa!&IM_uY*vogsvuKP^?d#mjpm=4Dc@jtCVC0q1*SB`!Yjhs9C?}@n`Bt1Fp zV*T}kFyfM_3%2|Uu2jB~*Q?mAgIp_l{N=_`YnkiB@F>4nE!Io3cK)#Tp1hpwR^E8& zT?YWh!J(*VRBJrQ#MaIz|88r^64~8Sf%j9(dW31rMA=;Cqxnz1x874+v$66THzFs? z!>mmj$Zc>4#u}6J=kL*yd?vE@kl`P%9rj6onBH0hFL0v6AGkHz0fhXAUYw?;=8zjO z^d-4w1n#wK>L)1HeTl&vRN_xr_q^N)2}U5M@`63zK0QO~5NWEMsa;7=N$n)3-j=$*Wn9dn+^T7noK(ucN@W9% z47Md5UMq809N9y}eC0a>Qbri^=ec`jhgpjp1}K*=;i2ZRh78$@XK2@j9-?26bFbfh z@asnq(O!^{o6ec_1i{t-BvJ{?!ebL+_4Fhe>?3E%7gxBrt9P`#0#IO-(?Y&j{5p?zJ- zoyysAuntO>Ym}of{o_W6edLMd73CSc8TRBgfo^1GKkPqlyF2|l6F6ky&M27V3#Ts@2vRIH*{iygOb~`f|oexMToOL4dkot;ZCLlfShXg?hY3*`P zTPqH5L{fWfRTDiz{0lCUolF#xtkXAcM2ktfHj6s;R%@uDQE#%2H2!*o^r=V~dxjJ1 z*vlm3mzr}qwm%(ZJYWoF$kB!uSiyQpxu?wIMjE1nUQT&lbxnl>89fa6JIuk?p70+P z2a>f0k(R0`6gy|9hk8(GZh+=nqjC41XK@MNgbS8@$^1~qzE!+aQSJtzD1j0Bk(-$| zIr8diKlRD6&y3?Zcm&d@o7{?N805=PMbXQz`|ck-X(-7=>iD_LI;WHRBk&Snp1-|3 z*rJ%TI6{JcYq$S+T?WWqsw-Zc81u)EL(2|Qe zE*ENq>O|eRvg$TDIrS~W6eq@WWJy@}de}C{sV=?BxxQjmts0_MjZPrh&%mFq+Db0j z*{`b?#d`s44Rzg7b12!*45f?JVHY3XgBpKIG8)Eh@9}$9YVy|DB1;jQpZ`>%?2%u` zo@dR7o}5LTW!8rFk;w@8hSLEJ#ygD5dMC(k4{A4urO9-M_Op%TXtJ zULnG0+8z1?5+54IVAqFLQOMJ0QAYYi`rYaUf=?M3=rOV;)aXQK=exsgN0BHYB&p}+ z{W(IbecGka*X=1FDGA{f(M{ERjkb^a=EqxXH_MVWM5r;8+Zxzouy3bwqYx(>0;(s* zxJ^-slyA3(pMbR%MJkp+QnW0|Cif+g#}`^&X!ib0=#DqIrx@rj#SBf|%`BpA@P5zH z8g0(csXG5dH4tJRx1cRVzR>=Rks$x(?T1hO*ZpJPMb zKvq;rmqeaa;-vxGL|5#bA5=U$i^A0>m`4xeb!P4Sbk>wj%`(~TYJTzextmh6Az11p z^E%V}*5^6L>#FS}=RViz>bL&aloKP$9L--P>Lp+fa6c6|>)}29Y%%vOpZ#(l6(e*% zb$Clo^_A#I(ZJque1c6pR9G~+y#=BW<@0c__ zx(vWc^}G8i0>8rE{m?V$93Ar1&pEpL+04$(fu&AiRyNp`3Z0YuC7o-M+uDG@mVm^Gfm67L>0tdcME^L5M z9;aNzjLZbb!1&JJd3U$HiOXnkax~9&ScvZWdV6uJvD#~8`Dt6Rt`yfg+v~x{^Os62 z0!PTCF&X>jq{=czY_Tk#sqIpsg*k@VUGtOO>g;w0E!yVx^q>%w5*yRh`sRj{s+|{A zQ)M++1AhOn*_!Ioj*hNsM4mtAaIV1b=ZELZb68hbNRi7lO~U^DBXrrn+fObRk<35Z z3UBue9b$sBZx8Jc?0+IkL=S&T@x}j0h|YFI$)Lee_5jU5^sQ?RWrBlNO2JOS3IWRNUR~Uz;ewb>#+%A(%H) z#f*>}gUf$=h7{&RH=%2%XW87=5vxQGMqNFe+LEr7UdQ0{&)o{~wW}(K53W*hPsKxj zcb%4P_K&!SJgE1n6E@F~N>M+__H-=p7-Cg!0~t6J^4_Sv-V}}@Pk`rFAW`sEbvXNh z(+Tkc7ZdOcU)DHwSx45lTiFwEy=H=(IzB_&OKONKN4y&1rk2|a>R+LS$8yQu@}F6M z=a@Nt*nwy;Ydk=!h3@6O`zq_z)RHP|gGR!OfG3?VIcCGYiLvY}3bEOW3$PX#f^V$v z;V_?w9>nDkEeJ^}JKd|BC6ua)Lmy+XE}E2_OyR4vrzcwXHJFtQlcED^Mz64=(#4re zBnG-HT5O@I4>W&2w5fYf>KjuTj^$+H?#7Pes4$85vIQ523WC{t$(+TdR!d#gX z>-!e<5Cs^`etP%!OIM=fG2glrVR4w*`Rp9I(FixK(tP5TNORc#=_E7$4h-Y=y*W+k zl9@j`^J9(L$xtRBXiR~?`VT4cVnpoEu~W2nmxA3AGe{9FXooD*^SyXgoG8In2vd zwy_A~#_d(@k~Q>d9JC<_3tCBkm?z^obvlV+87<(&>a`2mpnQR;xJgaDAsh<0%7*M@ z15=@nR?4*+%0lEmHjY@@9pMBA8-haZ0@!R1586ZB0%iGLlhM&+$)dosGFzNaE}1O- zP3_>3l$6LZnkot+XMi_+;RSYZ%-$eFSyv@MVzwElzOJ>%z1m-QoR+fGk=2dY1pRZ~ zohG-Hfs2#G78D2!gia-=W$cVA&o}p+SZY3VsW=2t^ANsucAQ1JjnRrbvPJ5|*%H%N ze1VJ>80N5iF!7Wu^g5H$R+9M{nuFud%5>W_%yByfyHjvW+^u>LdvAjS1R(xf(0}H# z{v{(^eo=nN8P3J%nz=D!d&Be5D~}~ z46>pkz{LOCYFPjB5(-TtFD{Z{yJlG|oT*Va6{vwiTo3rR;sK<~^omr5wp?OsMEhAS?(=bMc_|KrgcSOILA8 zal2i)CmrS5n){rG?08?f=u$>bE)8nzRS zR-At7_(`6UW1gH6x&I;!gFBtPfoR=zgHE7E-#}R2iNMPO<^9rraRAwDXbvg1Xq==uFW(SZ8Z|vW8mc9X6 zWX&%j|2~>q!a_GRuh~-5CidJIch{5EuLZaYx!fq2H4^_^XYBC*Vf|F^ zZ4%GMQ&K&a%6$3C_cd^A5G84?@6Gt(W`X?cPZ~B)8#o>Ovgd44&nTU%@a;sN*pdy) zo_wCs9orQ_1f_(FQv{$U_WdhA%(mpdEC$}F-JkccRQnX^tp!C1#wQD7*5)C6^X12I z?j$Y%d!TR|3i-8_@I^2`+mqTI_9T<{hlqpg zmcF+9sQnF9#W4Wy*P*vK^G@h;Amf}EYoyx3=joEhp9c^=sxLrGg`vf44HY(NG)J+| z|F?U2U_kV$f4xSVN0tuQufwaVu{g&Bm6DqFM3r%*Zb*E@1)0OknrZfV29iRO0Y;K6h1VcKwT!0*Za171EDtI+fsc@_|X>g|s zNk=>k9ZiZ0E6-{Lz%bU&j#34iXzzv_W z2D_9C?6=D=)@M#tf14cpSP_CZZ%J}Xf0&xQpY15NS`vU$89J3k;ZakLWw|a+-q1Sf zNppMF#yOe1wDEPAbLJ@w6t{^&-U#_r;o65=9~Hwp-A@0E@GGYUMy)A2`cmpuC`d$*xH`Q(~S z)I#_{A-VTwlQ$upw&Un*STJ3R3SNO8*A%K2k*2wUtpq|}{&)nn0b`9yM^+?Z1=mk+ zO0_MZYB0qslkYW?8q|d4XFKz1B7EPGyaoaeW=>7tV37Vg8P7eR5q*+wfymh&iaDd^ zN^smWa}TmP({jw(bfT=O865K){6a@r$6BUd<&vX>eueAMk(u!?Mavj8$KykMSd*Dq zfD8K~Hh(7ZG~pb<<_I*)x@IPgFAbF0CNnd; z(AwglQw8@c1&g4g+(vo)r^eALl*>f&SI|6l^EuEwmGfJSL19sOkmpcAzGQXi+8D|* z{O+Wc_>+=gvg!>I{!pu(M$`%0DGK?7GHTj zQvM5soNUybecue#S5)q-U*Q?+5f8Y)E2RhP-d<;d%}&V27sTGyiLYMIM_Ih#lyo*G8-5Tx!Q7JQc&3id{kCsLB(^v-K>GYyTAh6-=qBd9_d;JZ> zf|;n9nCRSF-K@|Igh^RhKzyTmRfs!n(k~K%ND*t3YMS8BZm`-tNGyn;8y9eXYW!$3 zMqZPmvu~L%04^w9_lELDnm!!7{bRXy6mDjEY|V)+ZM&FI`{|I19X)vuda{{RWW{;u z)z$P=YlmS3&RI9);fj05mWjaGhjL{;JR~GT$G3DRSn5}=(gp7HEHqY# zUco3+)h4Z)IGp-hwoX*X7&WlPM#D_;p-Qswh{4%|nePeLof2(nfGsRpS@+jFDH~EH zKqfw?rT2RmbS5(RG(G2ewd8ug-byd%ec$cK17+N-U+=r}Lss6T1j>t(yFEC2vw2Iw z_6Ni#xo4LoD-fL1I~t!=9V^+f9}+IJu5enLUsz{PpDb(O6&l0@dJ2@1Kt9QW@J-{v zfJ+S}3LwCUT&l7%`BDvy^JvapD zziav5dg)nrpE`uWB6jd`6s<(S(66{zrF~Ap@p)5d-_=;V0v58xzu-S^X$nr+&V?D) zrR*dloi#@4=zqp6e!9&MM81h=aa6S51#7|hzeg<};xhTy+7Tt*a=$F?L`3lPE z5H1EvfO`Cmu-Y(5j{>RS&4gCgYomh#AQ?AxwrA{VM=5(SdRmGQ^{@XdSD81*w>!Ao zE^Iu#f9$gk8367-I&tF11y18ZLNXl87dg^F33_)NFZ86ZA1}T`Sgeh4zuZK0>;FEvO*+*?-w{r=VKv zy7I4~fa>CoovB-6hvrWs{@hNE>#m*8_rJc^mup|V4?p}|UPefo`uBPiQ&|kcp#H2B)??6YgN!qdayMyd(4{)tV2>`Tya0;=&-t@O8~@_9dy#jKm0ZU&?FpfQpZ56ReK>*O==^LBb3jF>gc#o7LY<_t-5SNGmbo;#^< z0hOu}01(w}@f87R7!)t5SyWgst|&oS#Nof0i7M1+($=*nr7*CZm4);ytB1u;_bn7)KJ5|?g(C%K>6`(zmZ?%^{mh2B?bZO%s^QyQxX+2dmPhU)yY0WbPh@r!f=_dzI7$TRK=V)q~n=*Jbhb1Z;Z^k}pL; zKq3kOk(E;kC3zM~D=V%nM{Y^chcv==$Jj}_i}rEcmIc@uiubpmdqeG@Q`yOvH5cxB zz3^ivLx7ys7zPW(-H1R47}XFSP@?!&?3%r_1vtF~2k7rJLBt-Y!}?CW0fAVCK#4L7 zYv>vbfaWm4FCCE6Ye)Ve-*ydPG*7GdYk?XF8T#5@o`qrrGLmFj_(1N!tfB;7_4`@D*F!R7SYcyAU~V9b#XjE=5$ z#UzF>JWxE1bTbD z-*lGJM!zNQiL&BcMOAj91x@fRywj@hG2 zmB&N?8>X<41q^;r5qK?p|9!(x$$W6Af=xxL^h)Wn+^$-(?#icC?yce9!H7Za`z=b# z)fc%;dBskfHbX`X8gRWpcALR5nA>SUKNV^SdM292pk1e}FpZV4O zctIFCXlNo*(R!)pj?LUeLmAyYar<8S6oXODyF2uG+i*)K`xoy9Qn)ydQexLS^0|%g zLUse>W-lZw{h(j|{AGuV+ryjGUoWa_DGp3M+_jWU#{LxVL48?ZVuHrp1S0eAwOJEw z1l~EZrezdtl~J=4J!^!wguA+YE&H@~S-w8E4beMNS;c-SlHmRFq%0zdTM0)z&qCv9 z_Su$b53XnfD{{7um;S{+(3PN+@U|^rC{0 zryteC4KEJZAmTjm;Ej{IKp-W^;rZ=3l5H+9AQ#+O+|#=yKkG4R%nS*y3P3WkpyLMf zu!lw8mX<1P@MJ=;pi3`sW4wHuZ#4$R#how95rngW-hTL=B7ZQSGi*VZDHvCBM5$m1 zF_l`3O!AftmNR?)PV^c(aJ?aH^~I|8Sd-Jc+DTD0ojwa3Bfhc}46-uJ#Hr~Efy-Iw zNQqi3x`(RQzr=m9<{XKPUQ2a&5?S4{E;qH6&S03+A|~e!vw@q zZh0_Cp@#rq?^l=W#fom)@r25FtwLk>=LBI4Pd1aPoU4nkj}}^U?&^Jeb+dQ_5duG4 z*3fLz{E?tUb;wRfI(LQ^w^}2HT^CVowPAj51#S5D&+`jk{K%&g=Q%j-W9nbZ4yre;4{s(izp^_8u3ncj-&05|+T-Qp7?0}(k3(Z$P zV<^h|O_w)Z=~f{s{QifoEMb7`x>|h5R?seL&;y@}u5ZGYU)KXVk<`1?4u3yeK6l`! z)-5OGnTmnVrp)i(x$d#yUiNURMTiRFmYWe^WJh>7x?@MJ(XD6&&(q(3lBuj)_$s7r~F>yb<2`0!y$wYI-N6LbZfxQ%fR90m+Y)T>EyXtRccO$(u;y)?G zWg!cz?hVF|Gz3D!fmv8M5;~svg;%_g1ALLnL7u0T8Bbb!pO1640*7DU{@b6PJ5oCL z`WFqu{zoOC|9>h$B26h9U=6oy_W@EYOS(tP1zGHc5t_dX|k?eqS5gb{?CmmNt$KBO2txD$SYnf{b& z+~J?uOpad(FFtkPRpY+Ki2+|;E%G-JX49;f}=MDE2}}s>+49uOIu{@ zX`v!P%kfk;x|pJjS*tzL(eE|krh8Oj=+rXKCvm(d_StHq^{m}22Q%Q=+%w=%F_O#e zQu-QY=nKMJR8Er)*bs24IAp2ybozReiLTcesMW>cex`M z6@z6I7vtlgCMELB!W3I0;7oxWQ10{4JtMrC6}QVWF?L%^KX1yJlj&U2>L2i@GQrQolHhqp* z6Wce)ZKPo^(z@jLX@C~SeMJ1Pmk9~dzU9ZdoVZ&~2WY`~>!>aXP_m?RczA5hmz>Q8 zf6HLETIh2A8DWtzpTtTphq*9*m(WQD);O5XVFOB|7_X~@9Pfi%O+o{a(F9Hv)&P4I zLA4uz3%VbYH{|{0v@>a(&^f=nv!d^L?d8VxO!w8;naO*<14T$&5d2Xik9mV;5mB5@ zBNxuP0Km?I7jen!m0qY!v#{oz5&yj{kFE5mne~+S9q0GmaxRO|` z$sku2_ua8NSKZt@Lbi7CjMTdV-nVzgWxjU44aiY{Zxb?IhJG#`>;KK2Y+snWA_cS$ z%W=~mJmPR%G~taH+6S`Y7ITT5S|?P~`)<>bYO`)v+_DP*voqDqb-Jahogx{CXAda3 z<+qwRx%9Cor_S7&+|>u{(Hk!7M2jm9p}F)PXGs)A4yp3mt=b25(Q&UFxd$W#C@sbH4~!y6E2<-)^qezJl?^>>XzQ!xHscWi#=mg@adE8sVxNK{Lpu4^}x1GZ91rp#(>t=Brs9hOq2qH!~3wl!Kj=#`Zg z+K%NLDU62OEw%oLaxSY*u-5Q1JQzKxu_QEnc(WxkqFkRhpvW#{?uXZ8)C8>|*IT-h zPv#KNDlHUI)GzEH@1RExPJJ)Yw1vY}FFiR*B3QVp0gIe#4pZcxvl$rPWLtI40+u!i zq{s(&s@e9!R9Cib$rCT8(#qW{9SUddR}qL#w2@oA=t5vQY`)}5cXVbE!4B1bpLKtrBWKasWkkb>ukCNS0V7NwsdXoRD*a=bgYCz)8R zn+)Oh_G*>b&X?I8Jdd}LiWY!qG-%*M_xE(d;;*+ROLpYAHmsY7?p4#S02-AI(p!F^ zCzfuU54mGCU#dVIi|vuI;Dbt4@+CuW_^@60%L_WWv`$E`=N+A)VWF8R*hD=RS!Wri zE8R9X^K0xh$(4Y{xp5j~u!mHtMxZh|N7^*!wru}V;#_#ai594yBZw9lV09@?hIV^8 zvb0y`{cfDiFMVDw+_6s{4J@p+)x*#w9R?WwPPSGE^1{RQ;^~Kxeppj zkSDi)`5>LeDMSDvw^&2y>dm2t-83gJ*fajg3&PKtfdf8;N+&-N!;{y*&8}%0iYlAv z`cKn0yRC@PLsbx!+fak+La69{Ytk8pYO+&u-k+ z%x(qzE@TQJMJ*?w0{GmF@T_Vxu zShGX8L*T0oCfH}%&mm%1jwMMm?xNWJeXxMG!k;pqSRX^X&`!&ziICf%BVW#E zN_N=(%P?ax;B|zK!S#ZkMx@Axt;;rtj^&igb30F9&I*!GIu`rE>MdGGVKx!cCxC(N z^uRe>2&`!*ukz)d^Chi9Z_T+&NPRXLQdd0H>H{Ls4%o#-=nl7Ae!=i)TiV@taSgoQ z-B1ebMqI~)uIEAcOR@uj>_{#eXRfKO9^F5-%XpiLOzmjql!b*xM0>qgi}j(}y|G(+ zdxFp%+7sh3U>noVy1NnSE1&KIID|?bv@`7-jg45SlJl571 z)0zxF4D7oiq1W1k{1ReW4mE)(I%ys3_2>(6uKB)xYe2~?G%dUm{=8Y}rP!$7zW{)SaWc@brYM+LuuJn_wlShyIMFH=dU?=Xw z8dWP-o`xTzwZ<);bw#a$J}}q95dY)f=Nk8ewae&+<)f-^C%N>*K+sduTi6b6WZst! zJVyfEp%vB|yq!fK{q=Hdj#HXqrh!}r9{5Y(jiAzPcZ2v63i%}oBCyoOYz*5PgP33zGw zs2J{Hd3pYT3j7)c`X3ldyIEh@{x9CD-T*yD+-mP?U+2o&)bhJ{*4=qw!-R&+TjnvS+{zEIL#HRMsiBfk5~* zI~}7`ysPbIRp6YZS)F1+E7{`h9q^Vs*(YzQn#^x%<3Zjz@)nOF)LhD2{wJc4!lx*2 zG0Qp7N-d=ZC0(0DN6&XqPhPr06x*ko#3uO~X}+FbBwG|>9O-DtQag1OKodw^%bF2R zxXgb!b11V$*gWbcquad{h>x`YVVffVa_VFMX(d6Q^N@aYPHSE?z_KSw z-6064WZJ)w^a^UJ(y1w?h>l7*$N4=QQ;Xj%N5f#{JQRnxqpIuL(%+m#-JYm$erEFc zYsHK)ui`sn_J(5*{>)8&Fp!8aM}Vu}(=DHjy@j~=^W|Elp;gs4itPO3|YQrda-r3bnTmHw)5e;1RfLe0<&*@yO<-5|h!^0EhR~E?i@s82|vL{{~05FxrMq-Bec&b>9o|g|7 z<}4-$VUX2a90_e6I&btO`U z^Y5WwAG)J*7}>okw%FGzpP#yqIJ3A?J*R6RH4&Zn!V=vYwcF z;V0QP11JO|@V15yrlQCs>1n03N9Jki7v;lRQ{YHwfv);Ks;<-(JAAE5=?#17a46CN z!eeC)OAn41X^uf(l4uU28<-9oO5u~iFH)2fM5(6GubShD(#?zYNv9i$yk{zKR+O)= zxu$@+T$sM9a|;qZGEfx9v3prspxEu4D8e5V3-?fYiDQ6+Ek zM9d@-A2=%3K-AKjb7u=v&X-5b{GPVZQ-{Q{Ji~WsZ7DQ9#UbB~iS)YFRpiDX zdO%UHatl%h-SNrz40ZcG$MabHCBuPrkMxP;Z_bs6xA<0_D}T2wAMF1Te*bRq)GXKy zpKRMPIN}wOlX`Hx2}eOG$WL)5z(i81CaK%wR;jDR^iosp`D z5e{`n=1*>|x-hZj>BE6>476?-Y_q2|Lk(Yo9Wp?!*7UBj<&csb7aEnevR1z4bLv%%gGXA~-ZcCgw8 zQA2@9jVOf(vgp6m`a#@hRwB;oKoXRoC3_H-+^H$3PWV==DkMJ}mB8Mfv&*W+=G@`s zd3b<_!Dc)wPbF%w0*fT+8uqpOLe@+`DD12+hNC`QxPXKZNF(TMRWUB{qg>OsI9{lX zHu14a&dKvC<-Vk)g>R?qh$_?hP!>qsJO~*8bfcap)_ur))g)g4*W4EP9bQ46I8-c; zXk$JfN;jd*`xy(T2Cqmcn%A!Ft1 zB12n8V-#`+Wua+B1pK>=Y~_gLmYC=1o6}W+epmR$3|e=Nr{RqJme{vKgLRE_RL0+V z@j#E>3u}SR7efid{iu0%akfG8V?2@5BFFPB#_{-F<@E5&&!DC)H;-}w<$FHnj4p@d z#GVx~jQDSkSy*S<4C2QEOQt=5R0bcDZn`H?9_d;8v~`=BBTfl@_WSHOucOY@QNAYn*^DNHBd8VsGU8pPc7{+H83=K&a?n5R(xmos6g zoFmTdnkczR4a3L4?|j+mo~YXLkx%xqI;UW%&Ql4@`ujqy1$N#-)@c{U9BzE+Eukf#nUC?)*PiJwf(J%01@TLN}m{9N!`p?A%1SKVv&NdIk zDf>~|A=0}6-!}t+-{ZZ2YrP^8wlHoHe%?!d0n7Utoj-BAFLy`o^ctK+1ab{SDSbr` zM*e{Ro@++Lla%>8_31VC;e=WJK9}H)2khK)-rV)COT=9|fr9&gc!q9)p}(nuXAp-g zxdSwe{_By@8a;kqe^FXJu?>776hD7Am?Q4CM<4soKPOKl2P`834q6;j;6su2$0Y0E z?E>Glgq^v|zTlhNP^|PpTo_Mr+&z{2KX2(E3Dl>faImKD;2@rif`;`?`?dvrzmTRM z&8(wxJ)_ku9umYaSc8zcMH_!m2;LkskZ3kR$TUa81^k&n8VV09J&^OZbc}DyUB4=P z@;x`Nplf(5zt6D-AeWaC)cfwQlOB|_=`FeuMn7qfiahQ%Qd##Th%3Px)}@c6;O1Pa zYdr(T`Do45h*z=|^X=8yoQVB61og%;IevDZ@u*U0! zHg@^%pUGkEF|ra~%bZ*O-36wpm(kmdbd%7bDl~Co{4L~b)+lP+O)i-X1pJC(*$RVprFj3^ys{3g5 zpJ<`(#JQahL^)v!-dLxAX&j1uwy{+&hu{-Pv9MNf1)(cs)3Ro|W zvs2HkRZ0^;)Snj|7RkA**MoAXR~hvRKa^01?^-V)X5`&*r zN<>(F)cvW-lOmXx1-;|BD?^?n z#+Hw0h4=-!FfXN-CBMmz%^=knvAO`oVnaZO=6w+vJt8=-5ghD091i>ym2Tjgl7#F-V`!H}0^6wx zgFa{tkI;bTF4Ew!_fwno6aJQI^yk@BzB4#*SDrEH(}HU6t*Pl9Lzk!A+m4HW%{L-h zilpdx>98I9tIjVgF$@K zN#OW1nrh^bD2TG3Q8%gYstK_We*Az$b0+cZ7wj28;%1#`8){$geLPsTqFO3`-MfVNZOMVoK8(fk}W*P-c zBg=j6=jGMo%#MD~w>;1Z?xNoLT|?001Oq{_KnWOk**)HL2xf&*Uh>AWz68h_EG(!P zLU;K>R8E`JK0xs@3^-1)f?9rBhFoUZdStuWfNxMzi0qK7jA3h`e(pNyBMuaHtMDDA zy@z|8W&*pcbV89UpgNCcv=>*M-B4<&~!k%d}nZdn-;flQwz% zW1(-0!=QUbyqv{K!>#q#dh^I?{I%j(_{_4_(%D)4E{ckWeWpOSe|_x%pzL zx@#rV4yc4QHc0DB6K>yo`)2nWt7w|}A^8>3*l^X4Hyt#cSQ0m`kXrfcRh4LDh}4=r z=FcYx#Z7HO|Cc)6n>mTNPY}ji)eYC)eLtpfE~xm41W!Pv?j*|t$5d|br1jUo>I>@+ zw5A{OK@N9bRD@#MLEoA@!VHTJ;^0jqe}o7K<^lFdI-$6y*y1gN6d0Zr2x$U>U#|Rg z4B(ji{!X_xSeX0hf36B`o!-zM;L!Lc<@1i^IrFhx!eP+nx@Lz_R~^vFC<0|^gs%Ge z&?RLdsSAhyd=o|#!BwCUV#PKVhjG+LC>SGhDl2~g8H0_ZCLhg%XRZaOE*F9{i4$9- zdsGA&gNbWEAtMgtRS!tBj0=Kqh{*U&K;-d_xf)z*oJf^?6pT&sC*+#oR3-rt#5ZPC zOVj_gqa;4c5YhkjzvH2SfKdIX|2^RbD$#fW33vujPq4po=wA;HG?*c+;gN^^;;iAp zp=pa&)ApA|ep`nTS98gjy$dc=m!j^XWz5Yx7tz{e#9cYhrl(<8<8b7ot~+0My_+2_ zJb7&M6eV&}eF|NB<~+auIpOQNyT;Uqtb_PUxDAVv5OJ3kLf@u2uz?NWEEVkEcs+E$ z2Ckv^vYEGwcj33I^Dq>s(n6h>w+ju3r9=A>MwV<$9;7 zD}>&_&zyL;vj@fAd?-->QR;+;F@@1qpv-`$d;GALTJiuTP*3egpeBU+%_EXt(rjH1 z4;Sa`78C30)(!_V>nuwG)~SLs0{nLw=x4kYdCN;|dYQ0+9x0ACU; zC%IWV*H!}pAERM;p=TdE^JVxxS9wp~piA#)++R36`2p(_K8MAk$vQ{hFX*t48OJ`fLxBf(AZ2x9Rs{ zxE}q7hUE}7q)^z$@W85ZQLZVWQJ7up3S8QrMi*U1(AoPTJ-@c5)tKbmh zs3i&|>=+mXifkF0WrtIj4Kvu!N{>9*nq?ZTw@@5l&6hbfwNFR`lYZby!pOCtQW=hw zA^xQw?^j2MjT>;C%_7S@i3i^QVX1AZBDbqHAq9L?TZ~HISjE@&oUY~L=ik!QMmJA& zc&?$(!WdOX=LzW)^GnOAVkDt+j3u$vscWg~*DA@xFnE5q78Q`NH$cNo zeRa5w!rIkKhpFB0Y_Pj^)GuDC!0%`NUsqQi4rTX-^V+vDVaE0*W*TWi6Jabxk;qa+ ziI6QMvX+!4Ava#W*!veJZ|DFrqm=YzLK^wAE`r^z!=>U~OV3Vv_FfD>7J8*YHm%~! z{i2$(ys;3Q^6zJ3svhgcPcu)kzU!`Qa=1Y|cNDv)#f3atToQJP{ONW=!LxkU$Mcld ztLW?k?N7SYmd#;_m4=1Os%ApHx^Ba8;NHH+fy$_A^FXcpJylG%!WgOJf=U^g?f>xJ zXqy#?(DU%4a$^l-_A&!L?_MkfS(|DMT}8TY-Hu{hU4LxZJBW~e)tV{BJt}ZZU8(2q zut_g)!eT95b;k+g?hh01YAv;vLQUutuWJj;O*@3h|bZ*~>T+4tI=&sxe|5=m9Q4zZ8i6EnieuRfWb5(|$n zPd$}$I}g)N;`a$d+11?-_^bj23!vKak6}MnT$rSGxE_h+NiGf+Jc(|vlvajPC`Qn^o zxxQ26T3fy=U-IksLSv<7*>^);AEfAbolc9zY1mK0T6(d*Jno6X54&_6H@@z2F?7!j zsN-u84LoJkqvCdGOZtzs`Y~SU&~@#RySMq{e7o9L7_aPitz^iJi+S?&DBtRd4-#WU z@Xs_@S-45bGyH4l*U^jp`ZEk+$(85;*9(j0fda8H=G2LLlET3$Q?pXCQ86Xj{CYmi zfXBwN7FZKH=?60lLYis%$;h3ERO0QgIL0{JSaA29&Pio2wLE`5zmNxML0){*o%1%P zbvX5$=<4;$f*lqgB~py*gFXuls_9?QPIoS~6nInOeXVImyF<;8ihmhVdb^2xPz1*_ zFn3Gl#4{8D+qW%IHFhlE%RP#{e-7heb1RF0`MQ6P&=qyx%94v&hePEvgec?H>bXid z#|J^Ep4cYtFAMdKUiYHT>uoWd7F`D44mX+wBX+zp@-Y z(uK!`I8GcR)5xTx3Z4SfGe)*;iU>uIX>i;^W`2$PLctdPDpXZ_YgY^<+xCOq;f4l% zd4Wgrmq}c8Pnk1)VjsUZw+!8EsT~{{A`g5e8u9V!EZ$97=zR?N&GR)UZI?+|jnv3YA|K-``Z|OL|#yprTm(2Gyx`%v(yb(pbhK zru@vIzZ3&RHAN#Qx_kv5TG8}VyX~{Z!ySl(Kn>SOlB9+8>99CNnN)?GI1+XvePV6C z!RWlZx%KsH`D&_VYELq8Jd5u5J_|3dG!LO-m)-XD8AnwEb5z4Mb`pGAt1^x8kG03O z9t^B`_aphC^T73n?ehLa)|+7#Zb0?o%D@T)w)Vm0KD{zrLi>YiGD?tplqwb^^?5^R zVQ^cR0OXiN=z=hi7TJuLFi2sdpeA8(lc@(S34_Zb8UWQ#grZQ0DFe2NZ9rT!i0zk! zwn=~iWf;)=cS6mQY*T(f2O?tGW*=4r$j+g`R~RjV6cDkW!pHy^3F1NffE2tc{%(%w zm(Y>*=>0|@ZDFM2IyNYEkQZzoB*3dO*7?XAjS|Aeqrm}OQTPSK!EEhdBwMI3qF%)T z`iN(P<_0(OvUNm(!Vm^BMgFiTn*z!Z8s^Y=qOh!OD>@{%cx%@^TZDAx?4|M410{SqTm#yXk zaz`+b=5}`aRS}nw5iBoT5F>pQ18p_@)vqMSmLEVitr{UQQs>C103t_s%W)9UbHqcy zz^Dz(!8^|pFEd3p00#ocNRWUdU^yy-mN6oPaYsxXkQvwF(gFL&y&zFP&x%v8 z2tZGupne~qFrm+d22K+yavbDi921x!@l`4^Z79|cbezQi6w3rkKKaX(1QZqt`Vs=} zvov82nkJ4U-Ju9x9${_LgxOpx$k8~DoS$tRAir=BIB5d^p>tTXMv((>^gNPf9hjRW zL5-KeK)MDvjhubYDOspG4Ma}4K=d2zWm$0{aynBxpr|aiYcstb{1^|PEdhwm5+T3ZU#=){oFze(jcj+Sc^#n7qTxTE3w{>*{h6KdY89A1M}#@vzJ3Fc VwlMN}`%er%aGR6olj~j${vQ;P=LY}) diff --git a/example/application/gradle/wrapper/gradle-wrapper.properties b/example/application/gradle/wrapper/gradle-wrapper.properties index 070cb70..744c64d 100644 --- a/example/application/gradle/wrapper/gradle-wrapper.properties +++ b/example/application/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/example/application/gradlew b/example/application/gradlew index c53aefa..65dcd68 100644 --- a/example/application/gradlew +++ b/example/application/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright 2015-2021 the original authors. +# Copyright © 2015-2021 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -32,10 +32,10 @@ # Busybox and similar reduced shells will NOT work, because this script # requires all of these POSIX shell features: # * functions; -# * expansions $var, ${var}, ${var:-default}, ${var+SET}, -# ${var#prefix}, ${var%suffix}, and $( cmd ); -# * compound commands having a testable exit status, especially case; -# * various built-in commands including command, set, and ulimit. +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». # # Important for patching: # @@ -55,7 +55,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -80,10 +80,10 @@ do esac done -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" +# This is normally unused +# shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' @@ -143,12 +143,16 @@ fi if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac case $MAX_FD in #( '' | soft) :;; #( *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -205,6 +209,12 @@ set -- \ org.gradle.wrapper.GradleWrapperMain \ "$@" +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + # Use "xargs" to parse quoted args. # # With -n1 it outputs one arg per line, with the quotes and backslashes removed. diff --git a/example/application/gradlew.bat b/example/application/gradlew.bat index 107acd3..93e3f59 100644 --- a/example/application/gradlew.bat +++ b/example/application/gradlew.bat @@ -14,7 +14,7 @@ @rem limitations under the License. @rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +25,8 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,7 +41,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute +if %ERRORLEVEL% equ 0 goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -75,13 +76,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal diff --git a/example/application/src/main/kotlin/com/beeproduced/example/application/configuration/SecurityConfig.kt b/example/application/src/main/kotlin/com/beeproduced/example/application/configuration/SecurityConfig.kt index 63a9ff3..b087dbb 100644 --- a/example/application/src/main/kotlin/com/beeproduced/example/application/configuration/SecurityConfig.kt +++ b/example/application/src/main/kotlin/com/beeproduced/example/application/configuration/SecurityConfig.kt @@ -7,6 +7,8 @@ import org.springframework.core.env.Environment import org.springframework.security.config.annotation.web.builders.HttpSecurity import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity import org.springframework.security.web.SecurityFilterChain +import org.springframework.security.web.servlet.util.matcher.MvcRequestMatcher +import org.springframework.web.servlet.handler.HandlerMappingIntrospector /** * @@ -18,12 +20,13 @@ import org.springframework.security.web.SecurityFilterChain @Configuration @EnableWebSecurity class SecurityConfig( - private val env: Environment + private val env: Environment, ) { @Throws(Exception::class) @Bean - fun filterChain(http: HttpSecurity): SecurityFilterChain { + fun filterChain(http: HttpSecurity, introspector: HandlerMappingIntrospector): SecurityFilterChain { + val mvcMatcherBuilder = MvcRequestMatcher.Builder(introspector) // Disable csrf // See: https://github.com/graphql-java-kickstart/graphql-spring-boot/issues/184 http @@ -34,13 +37,13 @@ class SecurityConfig( .authorizeHttpRequests { authorize -> var auth = authorize .requestMatchers( - "/graphql", - "/graphiql", - "/schema.json", - "/subscriptions", - "/actuator/**", - "/graphiql/**", - "/h2-console" + mvcMatcherBuilder.pattern("/graphql"), + mvcMatcherBuilder.pattern("/graphiql"), + mvcMatcherBuilder.pattern("/schema.json"), + mvcMatcherBuilder.pattern("/subscriptions"), + mvcMatcherBuilder.pattern("/actuator/**"), + mvcMatcherBuilder.pattern("/graphiql/**"), + mvcMatcherBuilder.pattern("/h2-console") ) .permitAll() if (env.activeProfiles.contains("dev")) { diff --git a/example/service.media/build.gradle.kts b/example/service.media/build.gradle.kts index d26a5a8..b4d1732 100644 --- a/example/service.media/build.gradle.kts +++ b/example/service.media/build.gradle.kts @@ -1,8 +1,4 @@ -/* -The Library Loader plugin currently has an IDEA bug that causes it to not recognize the "libs" variable. -Until https://youtrack.jetbrains.com/issue/KTIJ-19369 is fixed the suppress annotation is required. - */ -@Suppress("DSL_SCOPE_VIOLATION") + plugins { alias(libs.plugins.kotlin.jvm) alias(libs.plugins.kotlin.spring) diff --git a/example/service.media/entities/build.gradle.kts b/example/service.media/entities/build.gradle.kts index 186b14b..35e7c1c 100644 --- a/example/service.media/entities/build.gradle.kts +++ b/example/service.media/entities/build.gradle.kts @@ -1,8 +1,4 @@ -/* -The Library Loader plugin currently has an IDEA bug that causes it to not recognize the "libs" variable. -Until https://youtrack.jetbrains.com/issue/KTIJ-19369 is fixed the suppress annotation is required. - */ -@Suppress("DSL_SCOPE_VIOLATION") + plugins { alias(libs.plugins.kotlin.jvm) alias(libs.plugins.kotlin.jpa) diff --git a/example/service.media/events/build.gradle.kts b/example/service.media/events/build.gradle.kts index 231ee73..b5c3437 100644 --- a/example/service.media/events/build.gradle.kts +++ b/example/service.media/events/build.gradle.kts @@ -1,8 +1,4 @@ -/* -The Library Loader plugin currently has an IDEA bug that causes it to not recognize the "libs" variable. -Until https://youtrack.jetbrains.com/issue/KTIJ-19369 is fixed the suppress annotation is required. - */ -@Suppress("DSL_SCOPE_VIOLATION") + plugins { alias(libs.plugins.kotlin.jvm) alias(libs.plugins.kotlin.serialization) diff --git a/example/service.organisation/build.gradle.kts b/example/service.organisation/build.gradle.kts index 6751395..e2ad50c 100644 --- a/example/service.organisation/build.gradle.kts +++ b/example/service.organisation/build.gradle.kts @@ -1,8 +1,4 @@ -/* -The Library Loader plugin currently has an IDEA bug that causes it to not recognize the "libs" variable. -Until https://youtrack.jetbrains.com/issue/KTIJ-19369 is fixed the suppress annotation is required. - */ -@Suppress("DSL_SCOPE_VIOLATION") + plugins { alias(libs.plugins.kotlin.jvm) alias(libs.plugins.kotlin.spring) diff --git a/example/service.organisation/entities/build.gradle.kts b/example/service.organisation/entities/build.gradle.kts index d63feef..4f9459c 100644 --- a/example/service.organisation/entities/build.gradle.kts +++ b/example/service.organisation/entities/build.gradle.kts @@ -1,8 +1,4 @@ -/* -The Library Loader plugin currently has an IDEA bug that causes it to not recognize the "libs" variable. -Until https://youtrack.jetbrains.com/issue/KTIJ-19369 is fixed the suppress annotation is required. - */ -@Suppress("DSL_SCOPE_VIOLATION") + plugins { alias(libs.plugins.kotlin.jvm) alias(libs.plugins.kotlin.jpa) diff --git a/example/service.organisation/events/build.gradle.kts b/example/service.organisation/events/build.gradle.kts index 6708ab6..9ad8bf7 100644 --- a/example/service.organisation/events/build.gradle.kts +++ b/example/service.organisation/events/build.gradle.kts @@ -1,8 +1,4 @@ -/* -The Library Loader plugin currently has an IDEA bug that causes it to not recognize the "libs" variable. -Until https://youtrack.jetbrains.com/issue/KTIJ-19369 is fixed the suppress annotation is required. - */ -@Suppress("DSL_SCOPE_VIOLATION") + plugins { alias(libs.plugins.kotlin.jvm) alias(libs.plugins.kotlin.serialization) diff --git a/example/utils/build.gradle.kts b/example/utils/build.gradle.kts index 278fbfc..b0b750a 100644 --- a/example/utils/build.gradle.kts +++ b/example/utils/build.gradle.kts @@ -1,8 +1,4 @@ -/* -The Library Loader plugin currently has an IDEA bug that causes it to not recognize the "libs" variable. -Until https://youtrack.jetbrains.com/issue/KTIJ-19369 is fixed the suppress annotation is required. - */ -@Suppress("DSL_SCOPE_VIOLATION") + plugins { alias(libs.plugins.kotlin.jvm) alias(libs.plugins.kotlin.spring) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 07e69d6..87f59c9 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,29 +1,29 @@ [versions] bee-built = "0.2.0-SNAPSHOT" -springboot-base = "3.0.2" -springboot-dependencymanagement = "1.1.0" -kotlin-base = "1.8.0" -kotlin-jvm = "1.8.0" -dgs = "6.0.1" -spring-security = "6.0.2" +springboot-base = "3.1.4" +springboot-dependencymanagement = "1.1.3" +kotlin-base = "1.9.10" +kotlin-jvm = "1.9.10" +dgs = "7.6.0" +spring-security = "6.1.4" mapstruct = "1.5.3.Final" junit = "5.8.1" kotlinter = "3.13.0" -dgs-codegen = "5.6.9" +dgs-codegen = "6.0.2" jackson-module-kotlin = "2.13.4" h2 = "2.1.214" konform = "0.4.0" -michael-result = "1.1.16" +michael-result = "1.1.18" jdsl = "2.2.0.RELEASE" aspectjrt = "1.9.19" jakarta-persistence-api = "3.1.0" -hibernate-core = "6.1.6.Final" +hibernate-core = "6.2.9.Final" caffeine = "3.1.2" springmockk = "4.0.2" datafaker = "1.14.0" jakarta-mail-api = "2.0.1" jakarta-mail = "2.0.1" -ksp-base = "1.8.0-1.0.9" +ksp-base = "1.9.10-1.0.13" [libraries] spring-boot-starter-test = { group = "org.springframework.boot", name = "spring-boot-starter-test", version.ref = "springboot-base" } @@ -84,5 +84,5 @@ kotlin-jpa = { id = "org.jetbrains.kotlin.plugin.jpa", version.ref = "kotlin-bas spring-boot = { id = "org.springframework.boot", version.ref = "springboot-base" } spring-dependencymanagement = { id = "io.spring.dependency-management", version.ref = "springboot-dependencymanagement" } kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin-base" } -dgs-codegen = { id = "com.netflix.dgs.codegen", version = "5.6.9" } +dgs-codegen = { id = "com.netflix.dgs.codegen", version.ref = "dgs-codegen" } ksp = { id = "com.google.devtools.ksp", version.ref = "ksp-base"} \ No newline at end of file diff --git a/lib.data/build.gradle.kts b/lib.data/build.gradle.kts index 642a1c3..326347d 100644 --- a/lib.data/build.gradle.kts +++ b/lib.data/build.gradle.kts @@ -1,10 +1,5 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile -/* -The Library Loader plugin currently has an IDEA bug that causes it to not recognize the "libs" variable. -Until https://youtrack.jetbrains.com/issue/KTIJ-19369 is fixed the suppress annotation is required. - */ -@Suppress("DSL_SCOPE_VIOLATION") plugins { alias(libs.plugins.kotlin.jvm) alias(libs.plugins.kotlin.jpa) diff --git a/lib.data/gradle/wrapper/gradle-wrapper.jar b/lib.data/gradle/wrapper/gradle-wrapper.jar index 249e5832f090a2944b7473328c07c9755baa3196..943f0cbfa754578e88a3dae77fce6e3dea56edbf 100644 GIT binary patch delta 36524 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%0DGK?7GHTj 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 VwlMN}`%er%aGR6olj~j${vQ;P=LY}) diff --git a/lib.data/gradle/wrapper/gradle-wrapper.properties b/lib.data/gradle/wrapper/gradle-wrapper.properties index 070cb70..744c64d 100644 --- a/lib.data/gradle/wrapper/gradle-wrapper.properties +++ b/lib.data/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/lib.data/gradlew b/lib.data/gradlew index a69d9cb..65dcd68 100644 --- a/lib.data/gradlew +++ b/lib.data/gradlew @@ -55,7 +55,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -80,10 +80,10 @@ do esac done -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" +# This is normally unused +# shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' @@ -143,12 +143,16 @@ fi if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac case $MAX_FD in #( '' | soft) :;; #( *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac diff --git a/lib.data/gradlew.bat b/lib.data/gradlew.bat index f127cfd..93e3f59 100644 --- a/lib.data/gradlew.bat +++ b/lib.data/gradlew.bat @@ -26,6 +26,7 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% diff --git a/lib.events/build.gradle.kts b/lib.events/build.gradle.kts index 69267b4..b7936c8 100644 --- a/lib.events/build.gradle.kts +++ b/lib.events/build.gradle.kts @@ -1,8 +1,4 @@ -/* -The Library Loader plugin currently has an IDEA bug that causes it to not recognize the "libs" variable. -Until https://youtrack.jetbrains.com/issue/KTIJ-19369 is fixed the suppress annotation is required. - */ -@Suppress("DSL_SCOPE_VIOLATION") + plugins { alias(libs.plugins.kotlin.jvm) alias(libs.plugins.spring.boot).apply(false) diff --git a/lib.events/gradle/wrapper/gradle-wrapper.properties b/lib.events/gradle/wrapper/gradle-wrapper.properties index 62f495d..3fa8f86 100644 --- a/lib.events/gradle/wrapper/gradle-wrapper.properties +++ b/lib.events/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/lib.result/build.gradle.kts b/lib.result/build.gradle.kts index 825b573..fe0b021 100644 --- a/lib.result/build.gradle.kts +++ b/lib.result/build.gradle.kts @@ -1,8 +1,4 @@ -/* -The Library Loader plugin currently has an IDEA bug that causes it to not recognize the "libs" variable. -Until https://youtrack.jetbrains.com/issue/KTIJ-19369 is fixed the suppress annotation is required. - */ -@Suppress("DSL_SCOPE_VIOLATION") + plugins { alias(libs.plugins.kotlin.jvm) java diff --git a/lib.result/gradle/wrapper/gradle-wrapper.properties b/lib.result/gradle/wrapper/gradle-wrapper.properties index 62f495d..3fa8f86 100644 --- a/lib.result/gradle/wrapper/gradle-wrapper.properties +++ b/lib.result/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From b6de6b05626eefc99ccc9942a1da9f043c8b9a80 Mon Sep 17 00:00:00 2001 From: Kacper Urbaniec Date: Mon, 23 Oct 2023 16:04:52 +0200 Subject: [PATCH 2/9] =?UTF-8?q?Renamed=20`lib`=20projects=20to=20`bee`=20n?= =?UTF-8?q?omenclature=20Notable:=20*=20`lib.data`=20=E2=86=92=20`bee.pers?= =?UTF-8?q?istent`=20*=20`lib.events`=20=E2=86=92=20`bee.buzz`=20*=20`lib.?= =?UTF-8?q?result`=20=E2=86=92=20`bee.functional`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- {lib.events => bee.buzz}/build.gradle.kts | 8 ++++++- {lib.events => bee.buzz}/gradle.properties | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 {lib.events => bee.buzz}/gradlew | 0 {lib.data => bee.buzz}/gradlew.bat | 0 {lib.events => bee.buzz}/settings.gradle.kts | 4 ++-- .../beeproduced/lib/events/Notification.kt | 0 .../com/beeproduced/lib/events/Request.kt | 0 .../lib/events/manager/EventError.kt | 0 .../lib/events/manager/EventManager.kt | 0 .../lib/events/manager/Mediator.kt | 0 .../lib/events/manager/Scheduler.kt | 0 .../lib/events/manager/SimpleEventManager.kt | 0 .../lib/events/manager/TestEventManager.kt | 0 .../exceptions/NotificationHandlerNotFound.kt | 0 .../exceptions/RequestHandlerNotFound.kt | 0 bee.fetched.test/build.gradle.kts | 16 +++++++------- bee.fetched.test/settings.gradle.kts | 6 +++--- .../build.gradle.kts | 20 ++++++++++++------ .../gradle.properties | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 {lib.result => bee.functional}/gradlew | 0 {lib.events => bee.functional}/gradlew.bat | 0 .../settings.gradle.kts | 2 +- .../dgs/DgsErrorHandlingConfiguration.kt | 0 .../result/dgs/aspect/AroundDgsDataAspect.kt | 0 .../dgs/data/fetcher/DataFetcherErrThrower.kt | 0 .../dgs/data/fetcher/DataFetcherResult.kt | 0 .../fetcher/TypedGraphlQLErrorExtensions.kt | 0 .../dgs/handler/AspectExceptionHandler.kt | 0 .../extensions/dgs/KotlinResultExtensions.kt | 0 .../com/beeproduced/result/AppResult.kt | 0 .../com/beeproduced/result/errors/Error.kt | 0 .../result/errors/deprecated/AnyError.kt | 0 .../result/errors/deprecated/AppError.kt | 0 .../errors/deprecated/ExceptionError.kt | 0 .../deprecated/util/ErrorTestingUtil.kt | 0 .../result/extensions/errors/And.kt | 0 .../result/extensions/errors/Map.kt | 0 .../result/extensions/errors/Unsafe.kt | 0 .../extensions/functional/MapFunctional.kt | 0 .../jpa/extensions/TransactionTemplate.kt | 0 .../jpa/transactional/TransactionalResult.kt | 0 .../TransactionalResultAspect.kt | 0 .../com/beeproduced/result/ErrorTest.kt | 0 .../kotlin/com/beeproduced/result/MapTest.kt | 0 {lib.data => bee.persistent}/.gitignore | 0 {lib.data => bee.persistent}/README.md | 0 {lib.data => bee.persistent}/build.gradle.kts | 6 ++++++ .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 {lib.data => bee.persistent}/gradlew | 0 {lib.result => bee.persistent}/gradlew.bat | 0 .../settings.gradle.kts | 2 +- .../dgs/kotlin/com/beeproduced/data/dgs/root | 0 .../data/dgs/selection/DgsGraphQLSelection.kt | 0 .../data/jpa/context/DataContext.kt | 0 .../beeproduced/data/jpa/entity/DataEntity.kt | 0 .../jpa/entity/annotations/SelectionName.kt | 0 .../data/jpa/exceptions/EntityNotFound.kt | 0 .../jpa/exceptions/UnsupportedRelationType.kt | 0 .../beeproduced/data/jpa/meta/EntityInfo.kt | 0 .../data/jpa/meta/GeneratedInfo.kt | 0 .../beeproduced/data/jpa/meta/MemberInfo.kt | 0 .../beeproduced/data/jpa/meta/MembersInfo.kt | 0 .../beeproduced/data/jpa/meta/MetaModel.kt | 0 .../com/beeproduced/data/jpa/proxy/Unproxy.kt | 0 .../data/jpa/repository/BaseDataRepository.kt | 0 .../data/jpa/repository/QueryBuilder.kt | 0 .../dsl/DummyCriteriaDeleteQueryDsl.kt | 0 .../repository/dsl/DummyCriteriaQueryDsl.kt | 0 .../jpa/repository/extensions/Pagination.kt | 0 .../jpa/kotlin/com/beeproduced/data/jpa/root | 0 .../data/jpa/selection/JpaSelection.kt | 0 .../data/fieldconverter/StringSetConverter.kt | 0 .../src/main/kotlin/com/beeproduced/data/root | 0 .../data/selection/DataSelection.kt | 0 .../data/selection/EmptySelection.kt | 0 .../data/selection/FieldNodeDefinition.kt | 0 .../selection/FullNonRecursiveSelection.kt | 0 .../data/selection/SimpleSelection.kt | 0 .../beeproduced/data/selection/SkipOver.kt | 0 .../src/main/resources/application.properties | 0 .../beeproduced/lib/data/DataSelectionTest.kt | 0 .../beeproduced/lib/data/IncubatingTest.kt | 0 .../beeproduced/lib/data/ManyToManyTest.kt | 0 .../com/beeproduced/lib/data/OneToManyTest.kt | 0 .../com/beeproduced/lib/data/OneToOneTest.kt | 0 .../beeproduced/lib/data/PaginationTest.kt | 0 .../lib/data/config/DummyApplication.kt | 0 .../config/PaginationTestConfiguration.kt | 0 .../data/config/PersistenceConfiguration.kt | 0 .../lib/data/many/to/many/Entities.kt | 0 .../lib/data/many/to/many/Repositories.kt | 0 .../lib/data/one/to/many/Entities.kt | 0 .../lib/data/one/to/many/Repositories.kt | 0 .../lib/data/one/to/one/Entities.kt | 0 .../lib/data/one/to/one/Repositories.kt | 0 .../lib/data/pagination/Entities.kt | 0 .../lib/data/pagination/Repositories.kt | 0 .../src/test/resources/application.properties | 0 example/application/build.gradle.kts | 16 +++++++------- example/application/settings.gradle.kts | 6 +++--- example/service.media/build.gradle.kts | 8 +++---- .../service.media/entities/build.gradle.kts | 6 +++--- example/service.media/events/build.gradle.kts | 2 +- example/service.organisation/build.gradle.kts | 8 +++---- .../entities/build.gradle.kts | 6 +++--- .../events/build.gradle.kts | 2 +- example/utils/build.gradle.kts | 6 +++--- 112 files changed, 71 insertions(+), 53 deletions(-) rename {lib.events => bee.buzz}/build.gradle.kts (85%) rename {lib.events => bee.buzz}/gradle.properties (100%) rename {lib.events => bee.buzz}/gradle/wrapper/gradle-wrapper.jar (100%) rename {lib.events => bee.buzz}/gradle/wrapper/gradle-wrapper.properties (100%) rename {lib.events => bee.buzz}/gradlew (100%) rename {lib.data => bee.buzz}/gradlew.bat (100%) rename {lib.events => bee.buzz}/settings.gradle.kts (68%) rename {lib.events => bee.buzz}/src/main/kotlin/com/beeproduced/lib/events/Notification.kt (100%) rename {lib.events => bee.buzz}/src/main/kotlin/com/beeproduced/lib/events/Request.kt (100%) rename {lib.events => bee.buzz}/src/main/kotlin/com/beeproduced/lib/events/manager/EventError.kt (100%) rename {lib.events => bee.buzz}/src/main/kotlin/com/beeproduced/lib/events/manager/EventManager.kt (100%) rename {lib.events => bee.buzz}/src/main/kotlin/com/beeproduced/lib/events/manager/Mediator.kt (100%) rename {lib.events => bee.buzz}/src/main/kotlin/com/beeproduced/lib/events/manager/Scheduler.kt (100%) rename {lib.events => bee.buzz}/src/simple/kotlin/com/beeproduced/lib/events/manager/SimpleEventManager.kt (100%) rename {lib.events => bee.buzz}/src/simple/kotlin/com/beeproduced/lib/events/manager/TestEventManager.kt (100%) rename {lib.events => bee.buzz}/src/simple/kotlin/com/beeproduced/lib/events/manager/exceptions/NotificationHandlerNotFound.kt (100%) rename {lib.events => bee.buzz}/src/simple/kotlin/com/beeproduced/lib/events/manager/exceptions/RequestHandlerNotFound.kt (100%) rename {lib.result => bee.functional}/build.gradle.kts (82%) rename {lib.result => bee.functional}/gradle.properties (100%) rename {lib.result => bee.functional}/gradle/wrapper/gradle-wrapper.jar (100%) rename {lib.result => bee.functional}/gradle/wrapper/gradle-wrapper.properties (100%) rename {lib.result => bee.functional}/gradlew (100%) rename {lib.events => bee.functional}/gradlew.bat (100%) rename {lib.result => bee.functional}/settings.gradle.kts (78%) rename {lib.result => bee.functional}/src/dgs/kotlin/com/beeproduced/result/dgs/DgsErrorHandlingConfiguration.kt (100%) rename {lib.result => bee.functional}/src/dgs/kotlin/com/beeproduced/result/dgs/aspect/AroundDgsDataAspect.kt (100%) rename {lib.result => bee.functional}/src/dgs/kotlin/com/beeproduced/result/dgs/data/fetcher/DataFetcherErrThrower.kt (100%) rename {lib.result => bee.functional}/src/dgs/kotlin/com/beeproduced/result/dgs/data/fetcher/DataFetcherResult.kt (100%) rename {lib.result => bee.functional}/src/dgs/kotlin/com/beeproduced/result/dgs/data/fetcher/TypedGraphlQLErrorExtensions.kt (100%) rename {lib.result => bee.functional}/src/dgs/kotlin/com/beeproduced/result/dgs/handler/AspectExceptionHandler.kt (100%) rename {lib.result => bee.functional}/src/dgs/kotlin/com/beeproduced/result/extensions/dgs/KotlinResultExtensions.kt (100%) rename {lib.result => bee.functional}/src/main/kotlin/com/beeproduced/result/AppResult.kt (100%) rename {lib.result => bee.functional}/src/main/kotlin/com/beeproduced/result/errors/Error.kt (100%) rename {lib.result => bee.functional}/src/main/kotlin/com/beeproduced/result/errors/deprecated/AnyError.kt (100%) rename {lib.result => bee.functional}/src/main/kotlin/com/beeproduced/result/errors/deprecated/AppError.kt (100%) rename {lib.result => bee.functional}/src/main/kotlin/com/beeproduced/result/errors/deprecated/ExceptionError.kt (100%) rename {lib.result => bee.functional}/src/main/kotlin/com/beeproduced/result/errors/deprecated/util/ErrorTestingUtil.kt (100%) rename {lib.result => bee.functional}/src/main/kotlin/com/beeproduced/result/extensions/errors/And.kt (100%) rename {lib.result => bee.functional}/src/main/kotlin/com/beeproduced/result/extensions/errors/Map.kt (100%) rename {lib.result => bee.functional}/src/main/kotlin/com/beeproduced/result/extensions/errors/Unsafe.kt (100%) rename {lib.result => bee.functional}/src/main/kotlin/com/beeproduced/result/extensions/functional/MapFunctional.kt (100%) rename {lib.result/src/jpa => bee.functional/src/persistant}/kotlin/com/beeproduced/result/jpa/extensions/TransactionTemplate.kt (100%) rename {lib.result/src/jpa => bee.functional/src/persistant}/kotlin/com/beeproduced/result/jpa/transactional/TransactionalResult.kt (100%) rename {lib.result/src/jpa => bee.functional/src/persistant}/kotlin/com/beeproduced/result/jpa/transactional/TransactionalResultAspect.kt (100%) rename {lib.result => bee.functional}/src/test/kotlin/com/beeproduced/result/ErrorTest.kt (100%) rename {lib.result => bee.functional}/src/test/kotlin/com/beeproduced/result/MapTest.kt (100%) rename {lib.data => bee.persistent}/.gitignore (100%) rename {lib.data => bee.persistent}/README.md (100%) rename {lib.data => bee.persistent}/build.gradle.kts (95%) rename {lib.data => bee.persistent}/gradle/wrapper/gradle-wrapper.jar (100%) rename {lib.data => bee.persistent}/gradle/wrapper/gradle-wrapper.properties (100%) rename {lib.data => bee.persistent}/gradlew (100%) rename {lib.result => bee.persistent}/gradlew.bat (100%) rename {lib.data => bee.persistent}/settings.gradle.kts (78%) rename {lib.data => bee.persistent}/src/dgs/kotlin/com/beeproduced/data/dgs/root (100%) rename {lib.data => bee.persistent}/src/dgs/kotlin/com/beeproduced/data/dgs/selection/DgsGraphQLSelection.kt (100%) rename {lib.data => bee.persistent}/src/jpa/kotlin/com/beeproduced/data/jpa/context/DataContext.kt (100%) rename {lib.data => bee.persistent}/src/jpa/kotlin/com/beeproduced/data/jpa/entity/DataEntity.kt (100%) rename {lib.data => bee.persistent}/src/jpa/kotlin/com/beeproduced/data/jpa/entity/annotations/SelectionName.kt (100%) rename {lib.data => bee.persistent}/src/jpa/kotlin/com/beeproduced/data/jpa/exceptions/EntityNotFound.kt (100%) rename {lib.data => bee.persistent}/src/jpa/kotlin/com/beeproduced/data/jpa/exceptions/UnsupportedRelationType.kt (100%) rename {lib.data => bee.persistent}/src/jpa/kotlin/com/beeproduced/data/jpa/meta/EntityInfo.kt (100%) rename {lib.data => bee.persistent}/src/jpa/kotlin/com/beeproduced/data/jpa/meta/GeneratedInfo.kt (100%) rename {lib.data => bee.persistent}/src/jpa/kotlin/com/beeproduced/data/jpa/meta/MemberInfo.kt (100%) rename {lib.data => bee.persistent}/src/jpa/kotlin/com/beeproduced/data/jpa/meta/MembersInfo.kt (100%) rename {lib.data => bee.persistent}/src/jpa/kotlin/com/beeproduced/data/jpa/meta/MetaModel.kt (100%) rename {lib.data => bee.persistent}/src/jpa/kotlin/com/beeproduced/data/jpa/proxy/Unproxy.kt (100%) rename {lib.data => bee.persistent}/src/jpa/kotlin/com/beeproduced/data/jpa/repository/BaseDataRepository.kt (100%) rename {lib.data => bee.persistent}/src/jpa/kotlin/com/beeproduced/data/jpa/repository/QueryBuilder.kt (100%) rename {lib.data => bee.persistent}/src/jpa/kotlin/com/beeproduced/data/jpa/repository/dsl/DummyCriteriaDeleteQueryDsl.kt (100%) rename {lib.data => bee.persistent}/src/jpa/kotlin/com/beeproduced/data/jpa/repository/dsl/DummyCriteriaQueryDsl.kt (100%) rename {lib.data => bee.persistent}/src/jpa/kotlin/com/beeproduced/data/jpa/repository/extensions/Pagination.kt (100%) rename {lib.data => bee.persistent}/src/jpa/kotlin/com/beeproduced/data/jpa/root (100%) rename {lib.data => bee.persistent}/src/jpa/kotlin/com/beeproduced/data/jpa/selection/JpaSelection.kt (100%) rename {lib.data => bee.persistent}/src/main/kotlin/com/beeproduced/data/fieldconverter/StringSetConverter.kt (100%) rename {lib.data => bee.persistent}/src/main/kotlin/com/beeproduced/data/root (100%) rename {lib.data => bee.persistent}/src/main/kotlin/com/beeproduced/data/selection/DataSelection.kt (100%) rename {lib.data => bee.persistent}/src/main/kotlin/com/beeproduced/data/selection/EmptySelection.kt (100%) rename {lib.data => bee.persistent}/src/main/kotlin/com/beeproduced/data/selection/FieldNodeDefinition.kt (100%) rename {lib.data => bee.persistent}/src/main/kotlin/com/beeproduced/data/selection/FullNonRecursiveSelection.kt (100%) rename {lib.data => bee.persistent}/src/main/kotlin/com/beeproduced/data/selection/SimpleSelection.kt (100%) rename {lib.data => bee.persistent}/src/main/kotlin/com/beeproduced/data/selection/SkipOver.kt (100%) rename {lib.data => bee.persistent}/src/main/resources/application.properties (100%) rename {lib.data => bee.persistent}/src/test/kotlin/com/beeproduced/lib/data/DataSelectionTest.kt (100%) rename {lib.data => bee.persistent}/src/test/kotlin/com/beeproduced/lib/data/IncubatingTest.kt (100%) rename {lib.data => bee.persistent}/src/test/kotlin/com/beeproduced/lib/data/ManyToManyTest.kt (100%) rename {lib.data => bee.persistent}/src/test/kotlin/com/beeproduced/lib/data/OneToManyTest.kt (100%) rename {lib.data => bee.persistent}/src/test/kotlin/com/beeproduced/lib/data/OneToOneTest.kt (100%) rename {lib.data => bee.persistent}/src/test/kotlin/com/beeproduced/lib/data/PaginationTest.kt (100%) rename {lib.data => bee.persistent}/src/test/kotlin/com/beeproduced/lib/data/config/DummyApplication.kt (100%) rename {lib.data => bee.persistent}/src/test/kotlin/com/beeproduced/lib/data/config/PaginationTestConfiguration.kt (100%) rename {lib.data => bee.persistent}/src/test/kotlin/com/beeproduced/lib/data/config/PersistenceConfiguration.kt (100%) rename {lib.data => bee.persistent}/src/test/kotlin/com/beeproduced/lib/data/many/to/many/Entities.kt (100%) rename {lib.data => bee.persistent}/src/test/kotlin/com/beeproduced/lib/data/many/to/many/Repositories.kt (100%) rename {lib.data => bee.persistent}/src/test/kotlin/com/beeproduced/lib/data/one/to/many/Entities.kt (100%) rename {lib.data => bee.persistent}/src/test/kotlin/com/beeproduced/lib/data/one/to/many/Repositories.kt (100%) rename {lib.data => bee.persistent}/src/test/kotlin/com/beeproduced/lib/data/one/to/one/Entities.kt (100%) rename {lib.data => bee.persistent}/src/test/kotlin/com/beeproduced/lib/data/one/to/one/Repositories.kt (100%) rename {lib.data => bee.persistent}/src/test/kotlin/com/beeproduced/lib/data/pagination/Entities.kt (100%) rename {lib.data => bee.persistent}/src/test/kotlin/com/beeproduced/lib/data/pagination/Repositories.kt (100%) rename {lib.data => bee.persistent}/src/test/resources/application.properties (100%) diff --git a/lib.events/build.gradle.kts b/bee.buzz/build.gradle.kts similarity index 85% rename from lib.events/build.gradle.kts rename to bee.buzz/build.gradle.kts index b7936c8..cc5cb0f 100644 --- a/lib.events/build.gradle.kts +++ b/bee.buzz/build.gradle.kts @@ -1,3 +1,4 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { alias(libs.plugins.kotlin.jvm) @@ -10,6 +11,11 @@ group = "com.beeproduced" version = libs.versions.bee.built.get() java.sourceCompatibility = JavaVersion.VERSION_17 java.targetCompatibility = JavaVersion.VERSION_17 +tasks.withType().configureEach { + kotlinOptions { + jvmTarget = "17" + } +} repositories { mavenCentral() @@ -41,7 +47,7 @@ java { } dependencies { - implementation("com.beeproduced:result") + implementation("com.beeproduced:bee.functional") implementation(libs.kotlin.stdlib) implementation(libs.spring.boot.starter.web) testImplementation(libs.junit.api) diff --git a/lib.events/gradle.properties b/bee.buzz/gradle.properties similarity index 100% rename from lib.events/gradle.properties rename to bee.buzz/gradle.properties diff --git a/lib.events/gradle/wrapper/gradle-wrapper.jar b/bee.buzz/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from lib.events/gradle/wrapper/gradle-wrapper.jar rename to bee.buzz/gradle/wrapper/gradle-wrapper.jar diff --git a/lib.events/gradle/wrapper/gradle-wrapper.properties b/bee.buzz/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from lib.events/gradle/wrapper/gradle-wrapper.properties rename to bee.buzz/gradle/wrapper/gradle-wrapper.properties diff --git a/lib.events/gradlew b/bee.buzz/gradlew similarity index 100% rename from lib.events/gradlew rename to bee.buzz/gradlew diff --git a/lib.data/gradlew.bat b/bee.buzz/gradlew.bat similarity index 100% rename from lib.data/gradlew.bat rename to bee.buzz/gradlew.bat diff --git a/lib.events/settings.gradle.kts b/bee.buzz/settings.gradle.kts similarity index 68% rename from lib.events/settings.gradle.kts rename to bee.buzz/settings.gradle.kts index b2a34d3..eb3ee25 100644 --- a/lib.events/settings.gradle.kts +++ b/bee.buzz/settings.gradle.kts @@ -1,4 +1,4 @@ -rootProject.name = "events" +rootProject.name = "bee.buzz" dependencyResolutionManagement { versionCatalogs { @@ -6,4 +6,4 @@ dependencyResolutionManagement { } } -includeBuild("../lib.result") \ No newline at end of file +includeBuild("../bee.functional") \ No newline at end of file diff --git a/lib.events/src/main/kotlin/com/beeproduced/lib/events/Notification.kt b/bee.buzz/src/main/kotlin/com/beeproduced/lib/events/Notification.kt similarity index 100% rename from lib.events/src/main/kotlin/com/beeproduced/lib/events/Notification.kt rename to bee.buzz/src/main/kotlin/com/beeproduced/lib/events/Notification.kt diff --git a/lib.events/src/main/kotlin/com/beeproduced/lib/events/Request.kt b/bee.buzz/src/main/kotlin/com/beeproduced/lib/events/Request.kt similarity index 100% rename from lib.events/src/main/kotlin/com/beeproduced/lib/events/Request.kt rename to bee.buzz/src/main/kotlin/com/beeproduced/lib/events/Request.kt diff --git a/lib.events/src/main/kotlin/com/beeproduced/lib/events/manager/EventError.kt b/bee.buzz/src/main/kotlin/com/beeproduced/lib/events/manager/EventError.kt similarity index 100% rename from lib.events/src/main/kotlin/com/beeproduced/lib/events/manager/EventError.kt rename to bee.buzz/src/main/kotlin/com/beeproduced/lib/events/manager/EventError.kt diff --git a/lib.events/src/main/kotlin/com/beeproduced/lib/events/manager/EventManager.kt b/bee.buzz/src/main/kotlin/com/beeproduced/lib/events/manager/EventManager.kt similarity index 100% rename from lib.events/src/main/kotlin/com/beeproduced/lib/events/manager/EventManager.kt rename to bee.buzz/src/main/kotlin/com/beeproduced/lib/events/manager/EventManager.kt diff --git a/lib.events/src/main/kotlin/com/beeproduced/lib/events/manager/Mediator.kt b/bee.buzz/src/main/kotlin/com/beeproduced/lib/events/manager/Mediator.kt similarity index 100% rename from lib.events/src/main/kotlin/com/beeproduced/lib/events/manager/Mediator.kt rename to bee.buzz/src/main/kotlin/com/beeproduced/lib/events/manager/Mediator.kt diff --git a/lib.events/src/main/kotlin/com/beeproduced/lib/events/manager/Scheduler.kt b/bee.buzz/src/main/kotlin/com/beeproduced/lib/events/manager/Scheduler.kt similarity index 100% rename from lib.events/src/main/kotlin/com/beeproduced/lib/events/manager/Scheduler.kt rename to bee.buzz/src/main/kotlin/com/beeproduced/lib/events/manager/Scheduler.kt diff --git a/lib.events/src/simple/kotlin/com/beeproduced/lib/events/manager/SimpleEventManager.kt b/bee.buzz/src/simple/kotlin/com/beeproduced/lib/events/manager/SimpleEventManager.kt similarity index 100% rename from lib.events/src/simple/kotlin/com/beeproduced/lib/events/manager/SimpleEventManager.kt rename to bee.buzz/src/simple/kotlin/com/beeproduced/lib/events/manager/SimpleEventManager.kt diff --git a/lib.events/src/simple/kotlin/com/beeproduced/lib/events/manager/TestEventManager.kt b/bee.buzz/src/simple/kotlin/com/beeproduced/lib/events/manager/TestEventManager.kt similarity index 100% rename from lib.events/src/simple/kotlin/com/beeproduced/lib/events/manager/TestEventManager.kt rename to bee.buzz/src/simple/kotlin/com/beeproduced/lib/events/manager/TestEventManager.kt diff --git a/lib.events/src/simple/kotlin/com/beeproduced/lib/events/manager/exceptions/NotificationHandlerNotFound.kt b/bee.buzz/src/simple/kotlin/com/beeproduced/lib/events/manager/exceptions/NotificationHandlerNotFound.kt similarity index 100% rename from lib.events/src/simple/kotlin/com/beeproduced/lib/events/manager/exceptions/NotificationHandlerNotFound.kt rename to bee.buzz/src/simple/kotlin/com/beeproduced/lib/events/manager/exceptions/NotificationHandlerNotFound.kt diff --git a/lib.events/src/simple/kotlin/com/beeproduced/lib/events/manager/exceptions/RequestHandlerNotFound.kt b/bee.buzz/src/simple/kotlin/com/beeproduced/lib/events/manager/exceptions/RequestHandlerNotFound.kt similarity index 100% rename from lib.events/src/simple/kotlin/com/beeproduced/lib/events/manager/exceptions/RequestHandlerNotFound.kt rename to bee.buzz/src/simple/kotlin/com/beeproduced/lib/events/manager/exceptions/RequestHandlerNotFound.kt diff --git a/bee.fetched.test/build.gradle.kts b/bee.fetched.test/build.gradle.kts index 29d5936..8e92a2c 100644 --- a/bee.fetched.test/build.gradle.kts +++ b/bee.fetched.test/build.gradle.kts @@ -56,16 +56,16 @@ repositories { dependencies { // in-house libraries - implementation("com.beeproduced:events") - implementation("com.beeproduced:events") { - capabilities { requireCapability("com.beeproduced:events-simple") } + implementation("com.beeproduced:bee.buzz") + implementation("com.beeproduced:bee.buzz") { + capabilities { requireCapability("com.beeproduced:bee.buzz-simple") } } - implementation("com.beeproduced:result") { - capabilities { requireCapability("com.beeproduced:result-dgs") } + implementation("com.beeproduced:bee.functional") { + capabilities { requireCapability("com.beeproduced:bee.functional-dgs") } } - implementation("com.beeproduced:data") - implementation("com.beeproduced:data") { - capabilities { requireCapability("com.beeproduced:data-dgs") } + implementation("com.beeproduced:bee.persistent") + implementation("com.beeproduced:bee.persistent") { + capabilities { requireCapability("com.beeproduced:bee.persistent-dgs") } } beeGenerative("com.beeproduced:bee.fetched") // external dependencies diff --git a/bee.fetched.test/settings.gradle.kts b/bee.fetched.test/settings.gradle.kts index 1bbd0ec..60557bc 100644 --- a/bee.fetched.test/settings.gradle.kts +++ b/bee.fetched.test/settings.gradle.kts @@ -8,8 +8,8 @@ dependencyResolutionManagement { includeBuild("../bee.generative") includeBuild("../bee.fetched") -includeBuild("../lib.data") -includeBuild("../lib.result") -includeBuild("../lib.events") +includeBuild("../bee.persistent") +includeBuild("../bee.functional") +includeBuild("../bee.buzz") diff --git a/lib.result/build.gradle.kts b/bee.functional/build.gradle.kts similarity index 82% rename from lib.result/build.gradle.kts rename to bee.functional/build.gradle.kts index fe0b021..eaa47c9 100644 --- a/lib.result/build.gradle.kts +++ b/bee.functional/build.gradle.kts @@ -1,3 +1,4 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { alias(libs.plugins.kotlin.jvm) @@ -10,6 +11,11 @@ group = "com.beeproduced" version = libs.versions.bee.built.get() java.sourceCompatibility = JavaVersion.VERSION_17 java.targetCompatibility = JavaVersion.VERSION_17 +tasks.withType().configureEach { + kotlinOptions { + jvmTarget = "17" + } +} repositories { mavenCentral() @@ -43,13 +49,13 @@ sourceSets { // configurations["dgsTestRuntimeOnly"].extendsFrom(configurations.runtimeOnly.get()) // } // } - create("jpa") { + create("persistant") { java { - srcDir("src/jpa/kotlin") + srcDir("src/persistant/kotlin") compileClasspath += main.get().output runtimeClasspath += main.get().output - configurations["jpaImplementation"].extendsFrom(configurations.implementation.get()) - configurations["jpaRuntimeOnly"].extendsFrom(configurations.runtimeOnly.get()) + configurations["persistantImplementation"].extendsFrom(configurations.implementation.get()) + configurations["persistantRuntimeOnly"].extendsFrom(configurations.runtimeOnly.get()) } } } @@ -58,8 +64,8 @@ java { registerFeature("dgs") { usingSourceSet(sourceSets["dgs"]) } - registerFeature("jpa") { - usingSourceSet(sourceSets["jpa"]) + registerFeature("persistant") { + usingSourceSet(sourceSets["persistant"]) } } @@ -73,7 +79,7 @@ dependencies { "dgsImplementation"(platform(libs.dgs.platform)) "dgsImplementation"(libs.dgs.spring.starter) "dgsImplementation"(libs.spring.boot.starter.aop) - "jpaImplementation"(libs.spring.boot.starter.data.jpa) + "persistantImplementation"(libs.spring.boot.starter.data.jpa) } tasks.withType { diff --git a/lib.result/gradle.properties b/bee.functional/gradle.properties similarity index 100% rename from lib.result/gradle.properties rename to bee.functional/gradle.properties diff --git a/lib.result/gradle/wrapper/gradle-wrapper.jar b/bee.functional/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from lib.result/gradle/wrapper/gradle-wrapper.jar rename to bee.functional/gradle/wrapper/gradle-wrapper.jar diff --git a/lib.result/gradle/wrapper/gradle-wrapper.properties b/bee.functional/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from lib.result/gradle/wrapper/gradle-wrapper.properties rename to bee.functional/gradle/wrapper/gradle-wrapper.properties diff --git a/lib.result/gradlew b/bee.functional/gradlew similarity index 100% rename from lib.result/gradlew rename to bee.functional/gradlew diff --git a/lib.events/gradlew.bat b/bee.functional/gradlew.bat similarity index 100% rename from lib.events/gradlew.bat rename to bee.functional/gradlew.bat diff --git a/lib.result/settings.gradle.kts b/bee.functional/settings.gradle.kts similarity index 78% rename from lib.result/settings.gradle.kts rename to bee.functional/settings.gradle.kts index e5a391f..542c7db 100644 --- a/lib.result/settings.gradle.kts +++ b/bee.functional/settings.gradle.kts @@ -1,4 +1,4 @@ -rootProject.name = "result" +rootProject.name = "bee.functional" dependencyResolutionManagement { versionCatalogs { diff --git a/lib.result/src/dgs/kotlin/com/beeproduced/result/dgs/DgsErrorHandlingConfiguration.kt b/bee.functional/src/dgs/kotlin/com/beeproduced/result/dgs/DgsErrorHandlingConfiguration.kt similarity index 100% rename from lib.result/src/dgs/kotlin/com/beeproduced/result/dgs/DgsErrorHandlingConfiguration.kt rename to bee.functional/src/dgs/kotlin/com/beeproduced/result/dgs/DgsErrorHandlingConfiguration.kt diff --git a/lib.result/src/dgs/kotlin/com/beeproduced/result/dgs/aspect/AroundDgsDataAspect.kt b/bee.functional/src/dgs/kotlin/com/beeproduced/result/dgs/aspect/AroundDgsDataAspect.kt similarity index 100% rename from lib.result/src/dgs/kotlin/com/beeproduced/result/dgs/aspect/AroundDgsDataAspect.kt rename to bee.functional/src/dgs/kotlin/com/beeproduced/result/dgs/aspect/AroundDgsDataAspect.kt diff --git a/lib.result/src/dgs/kotlin/com/beeproduced/result/dgs/data/fetcher/DataFetcherErrThrower.kt b/bee.functional/src/dgs/kotlin/com/beeproduced/result/dgs/data/fetcher/DataFetcherErrThrower.kt similarity index 100% rename from lib.result/src/dgs/kotlin/com/beeproduced/result/dgs/data/fetcher/DataFetcherErrThrower.kt rename to bee.functional/src/dgs/kotlin/com/beeproduced/result/dgs/data/fetcher/DataFetcherErrThrower.kt diff --git a/lib.result/src/dgs/kotlin/com/beeproduced/result/dgs/data/fetcher/DataFetcherResult.kt b/bee.functional/src/dgs/kotlin/com/beeproduced/result/dgs/data/fetcher/DataFetcherResult.kt similarity index 100% rename from lib.result/src/dgs/kotlin/com/beeproduced/result/dgs/data/fetcher/DataFetcherResult.kt rename to bee.functional/src/dgs/kotlin/com/beeproduced/result/dgs/data/fetcher/DataFetcherResult.kt diff --git a/lib.result/src/dgs/kotlin/com/beeproduced/result/dgs/data/fetcher/TypedGraphlQLErrorExtensions.kt b/bee.functional/src/dgs/kotlin/com/beeproduced/result/dgs/data/fetcher/TypedGraphlQLErrorExtensions.kt similarity index 100% rename from lib.result/src/dgs/kotlin/com/beeproduced/result/dgs/data/fetcher/TypedGraphlQLErrorExtensions.kt rename to bee.functional/src/dgs/kotlin/com/beeproduced/result/dgs/data/fetcher/TypedGraphlQLErrorExtensions.kt diff --git a/lib.result/src/dgs/kotlin/com/beeproduced/result/dgs/handler/AspectExceptionHandler.kt b/bee.functional/src/dgs/kotlin/com/beeproduced/result/dgs/handler/AspectExceptionHandler.kt similarity index 100% rename from lib.result/src/dgs/kotlin/com/beeproduced/result/dgs/handler/AspectExceptionHandler.kt rename to bee.functional/src/dgs/kotlin/com/beeproduced/result/dgs/handler/AspectExceptionHandler.kt diff --git a/lib.result/src/dgs/kotlin/com/beeproduced/result/extensions/dgs/KotlinResultExtensions.kt b/bee.functional/src/dgs/kotlin/com/beeproduced/result/extensions/dgs/KotlinResultExtensions.kt similarity index 100% rename from lib.result/src/dgs/kotlin/com/beeproduced/result/extensions/dgs/KotlinResultExtensions.kt rename to bee.functional/src/dgs/kotlin/com/beeproduced/result/extensions/dgs/KotlinResultExtensions.kt diff --git a/lib.result/src/main/kotlin/com/beeproduced/result/AppResult.kt b/bee.functional/src/main/kotlin/com/beeproduced/result/AppResult.kt similarity index 100% rename from lib.result/src/main/kotlin/com/beeproduced/result/AppResult.kt rename to bee.functional/src/main/kotlin/com/beeproduced/result/AppResult.kt diff --git a/lib.result/src/main/kotlin/com/beeproduced/result/errors/Error.kt b/bee.functional/src/main/kotlin/com/beeproduced/result/errors/Error.kt similarity index 100% rename from lib.result/src/main/kotlin/com/beeproduced/result/errors/Error.kt rename to bee.functional/src/main/kotlin/com/beeproduced/result/errors/Error.kt diff --git a/lib.result/src/main/kotlin/com/beeproduced/result/errors/deprecated/AnyError.kt b/bee.functional/src/main/kotlin/com/beeproduced/result/errors/deprecated/AnyError.kt similarity index 100% rename from lib.result/src/main/kotlin/com/beeproduced/result/errors/deprecated/AnyError.kt rename to bee.functional/src/main/kotlin/com/beeproduced/result/errors/deprecated/AnyError.kt diff --git a/lib.result/src/main/kotlin/com/beeproduced/result/errors/deprecated/AppError.kt b/bee.functional/src/main/kotlin/com/beeproduced/result/errors/deprecated/AppError.kt similarity index 100% rename from lib.result/src/main/kotlin/com/beeproduced/result/errors/deprecated/AppError.kt rename to bee.functional/src/main/kotlin/com/beeproduced/result/errors/deprecated/AppError.kt diff --git a/lib.result/src/main/kotlin/com/beeproduced/result/errors/deprecated/ExceptionError.kt b/bee.functional/src/main/kotlin/com/beeproduced/result/errors/deprecated/ExceptionError.kt similarity index 100% rename from lib.result/src/main/kotlin/com/beeproduced/result/errors/deprecated/ExceptionError.kt rename to bee.functional/src/main/kotlin/com/beeproduced/result/errors/deprecated/ExceptionError.kt diff --git a/lib.result/src/main/kotlin/com/beeproduced/result/errors/deprecated/util/ErrorTestingUtil.kt b/bee.functional/src/main/kotlin/com/beeproduced/result/errors/deprecated/util/ErrorTestingUtil.kt similarity index 100% rename from lib.result/src/main/kotlin/com/beeproduced/result/errors/deprecated/util/ErrorTestingUtil.kt rename to bee.functional/src/main/kotlin/com/beeproduced/result/errors/deprecated/util/ErrorTestingUtil.kt diff --git a/lib.result/src/main/kotlin/com/beeproduced/result/extensions/errors/And.kt b/bee.functional/src/main/kotlin/com/beeproduced/result/extensions/errors/And.kt similarity index 100% rename from lib.result/src/main/kotlin/com/beeproduced/result/extensions/errors/And.kt rename to bee.functional/src/main/kotlin/com/beeproduced/result/extensions/errors/And.kt diff --git a/lib.result/src/main/kotlin/com/beeproduced/result/extensions/errors/Map.kt b/bee.functional/src/main/kotlin/com/beeproduced/result/extensions/errors/Map.kt similarity index 100% rename from lib.result/src/main/kotlin/com/beeproduced/result/extensions/errors/Map.kt rename to bee.functional/src/main/kotlin/com/beeproduced/result/extensions/errors/Map.kt diff --git a/lib.result/src/main/kotlin/com/beeproduced/result/extensions/errors/Unsafe.kt b/bee.functional/src/main/kotlin/com/beeproduced/result/extensions/errors/Unsafe.kt similarity index 100% rename from lib.result/src/main/kotlin/com/beeproduced/result/extensions/errors/Unsafe.kt rename to bee.functional/src/main/kotlin/com/beeproduced/result/extensions/errors/Unsafe.kt diff --git a/lib.result/src/main/kotlin/com/beeproduced/result/extensions/functional/MapFunctional.kt b/bee.functional/src/main/kotlin/com/beeproduced/result/extensions/functional/MapFunctional.kt similarity index 100% rename from lib.result/src/main/kotlin/com/beeproduced/result/extensions/functional/MapFunctional.kt rename to bee.functional/src/main/kotlin/com/beeproduced/result/extensions/functional/MapFunctional.kt diff --git a/lib.result/src/jpa/kotlin/com/beeproduced/result/jpa/extensions/TransactionTemplate.kt b/bee.functional/src/persistant/kotlin/com/beeproduced/result/jpa/extensions/TransactionTemplate.kt similarity index 100% rename from lib.result/src/jpa/kotlin/com/beeproduced/result/jpa/extensions/TransactionTemplate.kt rename to bee.functional/src/persistant/kotlin/com/beeproduced/result/jpa/extensions/TransactionTemplate.kt diff --git a/lib.result/src/jpa/kotlin/com/beeproduced/result/jpa/transactional/TransactionalResult.kt b/bee.functional/src/persistant/kotlin/com/beeproduced/result/jpa/transactional/TransactionalResult.kt similarity index 100% rename from lib.result/src/jpa/kotlin/com/beeproduced/result/jpa/transactional/TransactionalResult.kt rename to bee.functional/src/persistant/kotlin/com/beeproduced/result/jpa/transactional/TransactionalResult.kt diff --git a/lib.result/src/jpa/kotlin/com/beeproduced/result/jpa/transactional/TransactionalResultAspect.kt b/bee.functional/src/persistant/kotlin/com/beeproduced/result/jpa/transactional/TransactionalResultAspect.kt similarity index 100% rename from lib.result/src/jpa/kotlin/com/beeproduced/result/jpa/transactional/TransactionalResultAspect.kt rename to bee.functional/src/persistant/kotlin/com/beeproduced/result/jpa/transactional/TransactionalResultAspect.kt diff --git a/lib.result/src/test/kotlin/com/beeproduced/result/ErrorTest.kt b/bee.functional/src/test/kotlin/com/beeproduced/result/ErrorTest.kt similarity index 100% rename from lib.result/src/test/kotlin/com/beeproduced/result/ErrorTest.kt rename to bee.functional/src/test/kotlin/com/beeproduced/result/ErrorTest.kt diff --git a/lib.result/src/test/kotlin/com/beeproduced/result/MapTest.kt b/bee.functional/src/test/kotlin/com/beeproduced/result/MapTest.kt similarity index 100% rename from lib.result/src/test/kotlin/com/beeproduced/result/MapTest.kt rename to bee.functional/src/test/kotlin/com/beeproduced/result/MapTest.kt diff --git a/lib.data/.gitignore b/bee.persistent/.gitignore similarity index 100% rename from lib.data/.gitignore rename to bee.persistent/.gitignore diff --git a/lib.data/README.md b/bee.persistent/README.md similarity index 100% rename from lib.data/README.md rename to bee.persistent/README.md diff --git a/lib.data/build.gradle.kts b/bee.persistent/build.gradle.kts similarity index 95% rename from lib.data/build.gradle.kts rename to bee.persistent/build.gradle.kts index 326347d..8129184 100644 --- a/lib.data/build.gradle.kts +++ b/bee.persistent/build.gradle.kts @@ -11,6 +11,12 @@ plugins { group = "com.beeproduced" version = libs.versions.bee.built.get() java.sourceCompatibility = JavaVersion.VERSION_17 +java.targetCompatibility = JavaVersion.VERSION_17 +tasks.withType().configureEach { + kotlinOptions { + jvmTarget = "17" + } +} repositories { mavenCentral() diff --git a/lib.data/gradle/wrapper/gradle-wrapper.jar b/bee.persistent/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from lib.data/gradle/wrapper/gradle-wrapper.jar rename to bee.persistent/gradle/wrapper/gradle-wrapper.jar diff --git a/lib.data/gradle/wrapper/gradle-wrapper.properties b/bee.persistent/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from lib.data/gradle/wrapper/gradle-wrapper.properties rename to bee.persistent/gradle/wrapper/gradle-wrapper.properties diff --git a/lib.data/gradlew b/bee.persistent/gradlew similarity index 100% rename from lib.data/gradlew rename to bee.persistent/gradlew diff --git a/lib.result/gradlew.bat b/bee.persistent/gradlew.bat similarity index 100% rename from lib.result/gradlew.bat rename to bee.persistent/gradlew.bat diff --git a/lib.data/settings.gradle.kts b/bee.persistent/settings.gradle.kts similarity index 78% rename from lib.data/settings.gradle.kts rename to bee.persistent/settings.gradle.kts index 7ea1abf..12b996e 100644 --- a/lib.data/settings.gradle.kts +++ b/bee.persistent/settings.gradle.kts @@ -1,4 +1,4 @@ -rootProject.name = "data" +rootProject.name = "bee.persistent" dependencyResolutionManagement { versionCatalogs { diff --git a/lib.data/src/dgs/kotlin/com/beeproduced/data/dgs/root b/bee.persistent/src/dgs/kotlin/com/beeproduced/data/dgs/root similarity index 100% rename from lib.data/src/dgs/kotlin/com/beeproduced/data/dgs/root rename to bee.persistent/src/dgs/kotlin/com/beeproduced/data/dgs/root diff --git a/lib.data/src/dgs/kotlin/com/beeproduced/data/dgs/selection/DgsGraphQLSelection.kt b/bee.persistent/src/dgs/kotlin/com/beeproduced/data/dgs/selection/DgsGraphQLSelection.kt similarity index 100% rename from lib.data/src/dgs/kotlin/com/beeproduced/data/dgs/selection/DgsGraphQLSelection.kt rename to bee.persistent/src/dgs/kotlin/com/beeproduced/data/dgs/selection/DgsGraphQLSelection.kt diff --git a/lib.data/src/jpa/kotlin/com/beeproduced/data/jpa/context/DataContext.kt b/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/context/DataContext.kt similarity index 100% rename from lib.data/src/jpa/kotlin/com/beeproduced/data/jpa/context/DataContext.kt rename to bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/context/DataContext.kt diff --git a/lib.data/src/jpa/kotlin/com/beeproduced/data/jpa/entity/DataEntity.kt b/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/entity/DataEntity.kt similarity index 100% rename from lib.data/src/jpa/kotlin/com/beeproduced/data/jpa/entity/DataEntity.kt rename to bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/entity/DataEntity.kt diff --git a/lib.data/src/jpa/kotlin/com/beeproduced/data/jpa/entity/annotations/SelectionName.kt b/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/entity/annotations/SelectionName.kt similarity index 100% rename from lib.data/src/jpa/kotlin/com/beeproduced/data/jpa/entity/annotations/SelectionName.kt rename to bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/entity/annotations/SelectionName.kt diff --git a/lib.data/src/jpa/kotlin/com/beeproduced/data/jpa/exceptions/EntityNotFound.kt b/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/exceptions/EntityNotFound.kt similarity index 100% rename from lib.data/src/jpa/kotlin/com/beeproduced/data/jpa/exceptions/EntityNotFound.kt rename to bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/exceptions/EntityNotFound.kt diff --git a/lib.data/src/jpa/kotlin/com/beeproduced/data/jpa/exceptions/UnsupportedRelationType.kt b/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/exceptions/UnsupportedRelationType.kt similarity index 100% rename from lib.data/src/jpa/kotlin/com/beeproduced/data/jpa/exceptions/UnsupportedRelationType.kt rename to bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/exceptions/UnsupportedRelationType.kt diff --git a/lib.data/src/jpa/kotlin/com/beeproduced/data/jpa/meta/EntityInfo.kt b/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/meta/EntityInfo.kt similarity index 100% rename from lib.data/src/jpa/kotlin/com/beeproduced/data/jpa/meta/EntityInfo.kt rename to bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/meta/EntityInfo.kt diff --git a/lib.data/src/jpa/kotlin/com/beeproduced/data/jpa/meta/GeneratedInfo.kt b/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/meta/GeneratedInfo.kt similarity index 100% rename from lib.data/src/jpa/kotlin/com/beeproduced/data/jpa/meta/GeneratedInfo.kt rename to bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/meta/GeneratedInfo.kt diff --git a/lib.data/src/jpa/kotlin/com/beeproduced/data/jpa/meta/MemberInfo.kt b/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/meta/MemberInfo.kt similarity index 100% rename from lib.data/src/jpa/kotlin/com/beeproduced/data/jpa/meta/MemberInfo.kt rename to bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/meta/MemberInfo.kt diff --git a/lib.data/src/jpa/kotlin/com/beeproduced/data/jpa/meta/MembersInfo.kt b/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/meta/MembersInfo.kt similarity index 100% rename from lib.data/src/jpa/kotlin/com/beeproduced/data/jpa/meta/MembersInfo.kt rename to bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/meta/MembersInfo.kt diff --git a/lib.data/src/jpa/kotlin/com/beeproduced/data/jpa/meta/MetaModel.kt b/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/meta/MetaModel.kt similarity index 100% rename from lib.data/src/jpa/kotlin/com/beeproduced/data/jpa/meta/MetaModel.kt rename to bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/meta/MetaModel.kt diff --git a/lib.data/src/jpa/kotlin/com/beeproduced/data/jpa/proxy/Unproxy.kt b/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/proxy/Unproxy.kt similarity index 100% rename from lib.data/src/jpa/kotlin/com/beeproduced/data/jpa/proxy/Unproxy.kt rename to bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/proxy/Unproxy.kt diff --git a/lib.data/src/jpa/kotlin/com/beeproduced/data/jpa/repository/BaseDataRepository.kt b/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/repository/BaseDataRepository.kt similarity index 100% rename from lib.data/src/jpa/kotlin/com/beeproduced/data/jpa/repository/BaseDataRepository.kt rename to bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/repository/BaseDataRepository.kt diff --git a/lib.data/src/jpa/kotlin/com/beeproduced/data/jpa/repository/QueryBuilder.kt b/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/repository/QueryBuilder.kt similarity index 100% rename from lib.data/src/jpa/kotlin/com/beeproduced/data/jpa/repository/QueryBuilder.kt rename to bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/repository/QueryBuilder.kt diff --git a/lib.data/src/jpa/kotlin/com/beeproduced/data/jpa/repository/dsl/DummyCriteriaDeleteQueryDsl.kt b/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/repository/dsl/DummyCriteriaDeleteQueryDsl.kt similarity index 100% rename from lib.data/src/jpa/kotlin/com/beeproduced/data/jpa/repository/dsl/DummyCriteriaDeleteQueryDsl.kt rename to bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/repository/dsl/DummyCriteriaDeleteQueryDsl.kt diff --git a/lib.data/src/jpa/kotlin/com/beeproduced/data/jpa/repository/dsl/DummyCriteriaQueryDsl.kt b/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/repository/dsl/DummyCriteriaQueryDsl.kt similarity index 100% rename from lib.data/src/jpa/kotlin/com/beeproduced/data/jpa/repository/dsl/DummyCriteriaQueryDsl.kt rename to bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/repository/dsl/DummyCriteriaQueryDsl.kt diff --git a/lib.data/src/jpa/kotlin/com/beeproduced/data/jpa/repository/extensions/Pagination.kt b/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/repository/extensions/Pagination.kt similarity index 100% rename from lib.data/src/jpa/kotlin/com/beeproduced/data/jpa/repository/extensions/Pagination.kt rename to bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/repository/extensions/Pagination.kt diff --git a/lib.data/src/jpa/kotlin/com/beeproduced/data/jpa/root b/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/root similarity index 100% rename from lib.data/src/jpa/kotlin/com/beeproduced/data/jpa/root rename to bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/root diff --git a/lib.data/src/jpa/kotlin/com/beeproduced/data/jpa/selection/JpaSelection.kt b/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/selection/JpaSelection.kt similarity index 100% rename from lib.data/src/jpa/kotlin/com/beeproduced/data/jpa/selection/JpaSelection.kt rename to bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/selection/JpaSelection.kt diff --git a/lib.data/src/main/kotlin/com/beeproduced/data/fieldconverter/StringSetConverter.kt b/bee.persistent/src/main/kotlin/com/beeproduced/data/fieldconverter/StringSetConverter.kt similarity index 100% rename from lib.data/src/main/kotlin/com/beeproduced/data/fieldconverter/StringSetConverter.kt rename to bee.persistent/src/main/kotlin/com/beeproduced/data/fieldconverter/StringSetConverter.kt diff --git a/lib.data/src/main/kotlin/com/beeproduced/data/root b/bee.persistent/src/main/kotlin/com/beeproduced/data/root similarity index 100% rename from lib.data/src/main/kotlin/com/beeproduced/data/root rename to bee.persistent/src/main/kotlin/com/beeproduced/data/root diff --git a/lib.data/src/main/kotlin/com/beeproduced/data/selection/DataSelection.kt b/bee.persistent/src/main/kotlin/com/beeproduced/data/selection/DataSelection.kt similarity index 100% rename from lib.data/src/main/kotlin/com/beeproduced/data/selection/DataSelection.kt rename to bee.persistent/src/main/kotlin/com/beeproduced/data/selection/DataSelection.kt diff --git a/lib.data/src/main/kotlin/com/beeproduced/data/selection/EmptySelection.kt b/bee.persistent/src/main/kotlin/com/beeproduced/data/selection/EmptySelection.kt similarity index 100% rename from lib.data/src/main/kotlin/com/beeproduced/data/selection/EmptySelection.kt rename to bee.persistent/src/main/kotlin/com/beeproduced/data/selection/EmptySelection.kt diff --git a/lib.data/src/main/kotlin/com/beeproduced/data/selection/FieldNodeDefinition.kt b/bee.persistent/src/main/kotlin/com/beeproduced/data/selection/FieldNodeDefinition.kt similarity index 100% rename from lib.data/src/main/kotlin/com/beeproduced/data/selection/FieldNodeDefinition.kt rename to bee.persistent/src/main/kotlin/com/beeproduced/data/selection/FieldNodeDefinition.kt diff --git a/lib.data/src/main/kotlin/com/beeproduced/data/selection/FullNonRecursiveSelection.kt b/bee.persistent/src/main/kotlin/com/beeproduced/data/selection/FullNonRecursiveSelection.kt similarity index 100% rename from lib.data/src/main/kotlin/com/beeproduced/data/selection/FullNonRecursiveSelection.kt rename to bee.persistent/src/main/kotlin/com/beeproduced/data/selection/FullNonRecursiveSelection.kt diff --git a/lib.data/src/main/kotlin/com/beeproduced/data/selection/SimpleSelection.kt b/bee.persistent/src/main/kotlin/com/beeproduced/data/selection/SimpleSelection.kt similarity index 100% rename from lib.data/src/main/kotlin/com/beeproduced/data/selection/SimpleSelection.kt rename to bee.persistent/src/main/kotlin/com/beeproduced/data/selection/SimpleSelection.kt diff --git a/lib.data/src/main/kotlin/com/beeproduced/data/selection/SkipOver.kt b/bee.persistent/src/main/kotlin/com/beeproduced/data/selection/SkipOver.kt similarity index 100% rename from lib.data/src/main/kotlin/com/beeproduced/data/selection/SkipOver.kt rename to bee.persistent/src/main/kotlin/com/beeproduced/data/selection/SkipOver.kt diff --git a/lib.data/src/main/resources/application.properties b/bee.persistent/src/main/resources/application.properties similarity index 100% rename from lib.data/src/main/resources/application.properties rename to bee.persistent/src/main/resources/application.properties diff --git a/lib.data/src/test/kotlin/com/beeproduced/lib/data/DataSelectionTest.kt b/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/DataSelectionTest.kt similarity index 100% rename from lib.data/src/test/kotlin/com/beeproduced/lib/data/DataSelectionTest.kt rename to bee.persistent/src/test/kotlin/com/beeproduced/lib/data/DataSelectionTest.kt diff --git a/lib.data/src/test/kotlin/com/beeproduced/lib/data/IncubatingTest.kt b/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/IncubatingTest.kt similarity index 100% rename from lib.data/src/test/kotlin/com/beeproduced/lib/data/IncubatingTest.kt rename to bee.persistent/src/test/kotlin/com/beeproduced/lib/data/IncubatingTest.kt diff --git a/lib.data/src/test/kotlin/com/beeproduced/lib/data/ManyToManyTest.kt b/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/ManyToManyTest.kt similarity index 100% rename from lib.data/src/test/kotlin/com/beeproduced/lib/data/ManyToManyTest.kt rename to bee.persistent/src/test/kotlin/com/beeproduced/lib/data/ManyToManyTest.kt diff --git a/lib.data/src/test/kotlin/com/beeproduced/lib/data/OneToManyTest.kt b/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/OneToManyTest.kt similarity index 100% rename from lib.data/src/test/kotlin/com/beeproduced/lib/data/OneToManyTest.kt rename to bee.persistent/src/test/kotlin/com/beeproduced/lib/data/OneToManyTest.kt diff --git a/lib.data/src/test/kotlin/com/beeproduced/lib/data/OneToOneTest.kt b/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/OneToOneTest.kt similarity index 100% rename from lib.data/src/test/kotlin/com/beeproduced/lib/data/OneToOneTest.kt rename to bee.persistent/src/test/kotlin/com/beeproduced/lib/data/OneToOneTest.kt diff --git a/lib.data/src/test/kotlin/com/beeproduced/lib/data/PaginationTest.kt b/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/PaginationTest.kt similarity index 100% rename from lib.data/src/test/kotlin/com/beeproduced/lib/data/PaginationTest.kt rename to bee.persistent/src/test/kotlin/com/beeproduced/lib/data/PaginationTest.kt diff --git a/lib.data/src/test/kotlin/com/beeproduced/lib/data/config/DummyApplication.kt b/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/config/DummyApplication.kt similarity index 100% rename from lib.data/src/test/kotlin/com/beeproduced/lib/data/config/DummyApplication.kt rename to bee.persistent/src/test/kotlin/com/beeproduced/lib/data/config/DummyApplication.kt diff --git a/lib.data/src/test/kotlin/com/beeproduced/lib/data/config/PaginationTestConfiguration.kt b/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/config/PaginationTestConfiguration.kt similarity index 100% rename from lib.data/src/test/kotlin/com/beeproduced/lib/data/config/PaginationTestConfiguration.kt rename to bee.persistent/src/test/kotlin/com/beeproduced/lib/data/config/PaginationTestConfiguration.kt diff --git a/lib.data/src/test/kotlin/com/beeproduced/lib/data/config/PersistenceConfiguration.kt b/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/config/PersistenceConfiguration.kt similarity index 100% rename from lib.data/src/test/kotlin/com/beeproduced/lib/data/config/PersistenceConfiguration.kt rename to bee.persistent/src/test/kotlin/com/beeproduced/lib/data/config/PersistenceConfiguration.kt diff --git a/lib.data/src/test/kotlin/com/beeproduced/lib/data/many/to/many/Entities.kt b/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/many/to/many/Entities.kt similarity index 100% rename from lib.data/src/test/kotlin/com/beeproduced/lib/data/many/to/many/Entities.kt rename to bee.persistent/src/test/kotlin/com/beeproduced/lib/data/many/to/many/Entities.kt diff --git a/lib.data/src/test/kotlin/com/beeproduced/lib/data/many/to/many/Repositories.kt b/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/many/to/many/Repositories.kt similarity index 100% rename from lib.data/src/test/kotlin/com/beeproduced/lib/data/many/to/many/Repositories.kt rename to bee.persistent/src/test/kotlin/com/beeproduced/lib/data/many/to/many/Repositories.kt diff --git a/lib.data/src/test/kotlin/com/beeproduced/lib/data/one/to/many/Entities.kt b/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/one/to/many/Entities.kt similarity index 100% rename from lib.data/src/test/kotlin/com/beeproduced/lib/data/one/to/many/Entities.kt rename to bee.persistent/src/test/kotlin/com/beeproduced/lib/data/one/to/many/Entities.kt diff --git a/lib.data/src/test/kotlin/com/beeproduced/lib/data/one/to/many/Repositories.kt b/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/one/to/many/Repositories.kt similarity index 100% rename from lib.data/src/test/kotlin/com/beeproduced/lib/data/one/to/many/Repositories.kt rename to bee.persistent/src/test/kotlin/com/beeproduced/lib/data/one/to/many/Repositories.kt diff --git a/lib.data/src/test/kotlin/com/beeproduced/lib/data/one/to/one/Entities.kt b/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/one/to/one/Entities.kt similarity index 100% rename from lib.data/src/test/kotlin/com/beeproduced/lib/data/one/to/one/Entities.kt rename to bee.persistent/src/test/kotlin/com/beeproduced/lib/data/one/to/one/Entities.kt diff --git a/lib.data/src/test/kotlin/com/beeproduced/lib/data/one/to/one/Repositories.kt b/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/one/to/one/Repositories.kt similarity index 100% rename from lib.data/src/test/kotlin/com/beeproduced/lib/data/one/to/one/Repositories.kt rename to bee.persistent/src/test/kotlin/com/beeproduced/lib/data/one/to/one/Repositories.kt diff --git a/lib.data/src/test/kotlin/com/beeproduced/lib/data/pagination/Entities.kt b/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/pagination/Entities.kt similarity index 100% rename from lib.data/src/test/kotlin/com/beeproduced/lib/data/pagination/Entities.kt rename to bee.persistent/src/test/kotlin/com/beeproduced/lib/data/pagination/Entities.kt diff --git a/lib.data/src/test/kotlin/com/beeproduced/lib/data/pagination/Repositories.kt b/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/pagination/Repositories.kt similarity index 100% rename from lib.data/src/test/kotlin/com/beeproduced/lib/data/pagination/Repositories.kt rename to bee.persistent/src/test/kotlin/com/beeproduced/lib/data/pagination/Repositories.kt diff --git a/lib.data/src/test/resources/application.properties b/bee.persistent/src/test/resources/application.properties similarity index 100% rename from lib.data/src/test/resources/application.properties rename to bee.persistent/src/test/resources/application.properties diff --git a/example/application/build.gradle.kts b/example/application/build.gradle.kts index 67004cb..289f1ea 100644 --- a/example/application/build.gradle.kts +++ b/example/application/build.gradle.kts @@ -62,16 +62,16 @@ dependencies { implementation(project(":service.organisation.events")) implementation(project(":utils")) // in-house libraries - implementation("com.beeproduced:events") - implementation("com.beeproduced:events") { - capabilities { requireCapability("com.beeproduced:events-simple") } + implementation("com.beeproduced:bee.buzz") + implementation("com.beeproduced:bee.buzz") { + capabilities { requireCapability("com.beeproduced:bee.buzz-simple") } } - implementation("com.beeproduced:result") { - capabilities { requireCapability("com.beeproduced:result-dgs") } + implementation("com.beeproduced:bee.functional") { + capabilities { requireCapability("com.beeproduced:bee.functional-dgs") } } - implementation("com.beeproduced:data") - implementation("com.beeproduced:data") { - capabilities { requireCapability("com.beeproduced:data-dgs") } + implementation("com.beeproduced:bee.persistent") + implementation("com.beeproduced:bee.persistent") { + capabilities { requireCapability("com.beeproduced:bee.persistent-dgs") } } beeGenerative("com.beeproduced:bee.fetched") // external dependencies diff --git a/example/application/settings.gradle.kts b/example/application/settings.gradle.kts index b53e2aa..bce868e 100644 --- a/example/application/settings.gradle.kts +++ b/example/application/settings.gradle.kts @@ -8,9 +8,9 @@ dependencyResolutionManagement { includeBuild("../../bee.generative") includeBuild("../../bee.fetched") -includeBuild("../../lib.data") -includeBuild("../../lib.result") -includeBuild("../../lib.events") +includeBuild("../../bee.persistent") +includeBuild("../../bee.functional") +includeBuild("../../bee.buzz") // Services include(":service.media") diff --git a/example/service.media/build.gradle.kts b/example/service.media/build.gradle.kts index b4d1732..335bb2e 100644 --- a/example/service.media/build.gradle.kts +++ b/example/service.media/build.gradle.kts @@ -26,10 +26,10 @@ dependencies { implementation(project(":service.media.events")) implementation(project(":service.organisation.events")) implementation(project(":utils")) - implementation("com.beeproduced:events") - implementation("com.beeproduced:data") - implementation("com.beeproduced:data") { - capabilities { requireCapability("com.beeproduced:data-dgs") } + implementation("com.beeproduced:bee.buzz") + implementation("com.beeproduced:bee.persistent") + implementation("com.beeproduced:bee.persistent") { + capabilities { requireCapability("com.beeproduced:bee.persistent-dgs") } } implementation(libs.kotlin.stdlib) implementation(libs.spring.boot.starter.web) diff --git a/example/service.media/entities/build.gradle.kts b/example/service.media/entities/build.gradle.kts index 35e7c1c..e5fc54b 100644 --- a/example/service.media/entities/build.gradle.kts +++ b/example/service.media/entities/build.gradle.kts @@ -21,9 +21,9 @@ dependencies { implementation(project(":utils")) api(libs.jakarta.persistence.api) api(libs.hibernate.core) - api("com.beeproduced:data") - api("com.beeproduced:data") { - capabilities { requireCapability("com.beeproduced:data-jpa") } + api("com.beeproduced:bee.persistent") + api("com.beeproduced:bee.persistent") { + capabilities { requireCapability("com.beeproduced:bee.persistent-jpa") } } } diff --git a/example/service.media/events/build.gradle.kts b/example/service.media/events/build.gradle.kts index b5c3437..39671ec 100644 --- a/example/service.media/events/build.gradle.kts +++ b/example/service.media/events/build.gradle.kts @@ -15,6 +15,6 @@ repositories { dependencies { implementation(libs.kotlin.stdlib) - implementation("com.beeproduced:events") + implementation("com.beeproduced:bee.buzz") api(project(":service.media.entities")) } diff --git a/example/service.organisation/build.gradle.kts b/example/service.organisation/build.gradle.kts index e2ad50c..3fabe2f 100644 --- a/example/service.organisation/build.gradle.kts +++ b/example/service.organisation/build.gradle.kts @@ -25,10 +25,10 @@ dependencyManagement { dependencies { implementation(project(":service.organisation.events")) implementation(project(":utils")) - implementation("com.beeproduced:events") - implementation("com.beeproduced:data") - implementation("com.beeproduced:data") { - capabilities { requireCapability("com.beeproduced:data-dgs") } + implementation("com.beeproduced:bee.buzz") + implementation("com.beeproduced:bee.persistent") + implementation("com.beeproduced:bee.persistent") { + capabilities { requireCapability("com.beeproduced:bee.persistent-dgs") } } implementation(libs.kotlin.stdlib) implementation(libs.spring.boot.starter.web) diff --git a/example/service.organisation/entities/build.gradle.kts b/example/service.organisation/entities/build.gradle.kts index 4f9459c..8d9815b 100644 --- a/example/service.organisation/entities/build.gradle.kts +++ b/example/service.organisation/entities/build.gradle.kts @@ -19,9 +19,9 @@ repositories { dependencies { api(libs.jakarta.persistence.api) api(libs.hibernate.core) - api("com.beeproduced:data") - api("com.beeproduced:data") { - capabilities { requireCapability("com.beeproduced:data-jpa") } + api("com.beeproduced:bee.persistent") + api("com.beeproduced:bee.persistent") { + capabilities { requireCapability("com.beeproduced:bee.persistent-jpa") } } } diff --git a/example/service.organisation/events/build.gradle.kts b/example/service.organisation/events/build.gradle.kts index 9ad8bf7..ec8bc65 100644 --- a/example/service.organisation/events/build.gradle.kts +++ b/example/service.organisation/events/build.gradle.kts @@ -15,6 +15,6 @@ repositories { dependencies { implementation(libs.kotlin.stdlib) - implementation("com.beeproduced:events") + implementation("com.beeproduced:bee.buzz") api(project(":service.organisation.entities")) } diff --git a/example/utils/build.gradle.kts b/example/utils/build.gradle.kts index b0b750a..62bc445 100644 --- a/example/utils/build.gradle.kts +++ b/example/utils/build.gradle.kts @@ -18,9 +18,9 @@ repositories { } dependencies { - api("com.beeproduced:result") - api("com.beeproduced:result") { - capabilities { requireCapability("com.beeproduced:result-jpa") } + api("com.beeproduced:bee.functional") + api("com.beeproduced:bee.functional") { + capabilities { requireCapability("com.beeproduced:bee.functional-persistant") } } api(libs.michael.result) implementation(libs.kotlin.stdlib) From 7b5b1a633aacc43e2b79c0bce5bd4cad2600bd65 Mon Sep 17 00:00:00 2001 From: Kacper Urbaniec Date: Mon, 23 Oct 2023 16:46:20 +0200 Subject: [PATCH 3/9] Renamed `bee.persistent` packages --- bee.functional/build.gradle.kts | 14 ++++----- .../jpa/extensions/TransactionTemplate.kt | 0 .../jpa/transactional/TransactionalResult.kt | 0 .../TransactionalResultAspect.kt | 0 .../dgs/selection/DgsGraphQLSelection.kt | 6 ++-- .../dgs/kotlin/com/beeproduced/data/dgs/root | 0 .../persistent}/jpa/context/DataContext.kt | 4 +-- .../persistent}/jpa/entity/DataEntity.kt | 2 +- .../jpa/entity/annotations/SelectionName.kt | 2 +- .../jpa/exceptions/EntityNotFound.kt | 2 +- .../jpa/exceptions/UnsupportedRelationType.kt | 2 +- .../persistent}/jpa/meta/EntityInfo.kt | 2 +- .../persistent}/jpa/meta/GeneratedInfo.kt | 2 +- .../persistent}/jpa/meta/MemberInfo.kt | 4 +-- .../persistent}/jpa/meta/MembersInfo.kt | 4 +-- .../persistent}/jpa/meta/MetaModel.kt | 4 +-- .../persistent}/jpa/proxy/Unproxy.kt | 6 ++-- .../jpa/repository/BaseDataRepository.kt | 30 ++++++++----------- .../jpa/repository/QueryBuilder.kt | 8 ++--- .../dsl/DummyCriteriaDeleteQueryDsl.kt | 2 +- .../repository/dsl/DummyCriteriaQueryDsl.kt | 2 +- .../jpa/repository/extensions/Pagination.kt | 10 +++---- .../persistent}/jpa/selection/JpaSelection.kt | 10 +++---- .../jpa/kotlin/com/beeproduced/data/jpa/root | 0 .../fieldconverter/StringSetConverter.kt | 2 +- .../persistent}/selection/DataSelection.kt | 2 +- .../persistent}/selection/EmptySelection.kt | 2 +- .../selection/FieldNodeDefinition.kt | 2 +- .../selection/FullNonRecursiveSelection.kt | 2 +- .../persistent}/selection/SimpleSelection.kt | 2 +- .../persistent}/selection/SkipOver.kt | 2 +- .../src/main/kotlin/com/beeproduced/data/root | 0 .../persistent}/DataSelectionTest.kt | 6 ++-- .../data => bee/persistent}/IncubatingTest.kt | 2 +- .../data => bee/persistent}/ManyToManyTest.kt | 17 +++++------ .../data => bee/persistent}/OneToManyTest.kt | 18 ++++++----- .../data => bee/persistent}/OneToOneTest.kt | 24 +++++++-------- .../data => bee/persistent}/PaginationTest.kt | 12 ++++---- .../persistent}/config/DummyApplication.kt | 2 +- .../config/PaginationTestConfiguration.kt | 6 ++-- .../config/PersistenceConfiguration.kt | 6 ++-- .../persistent}/many/to/many/Entities.kt | 4 +-- .../persistent}/many/to/many/Repositories.kt | 4 +-- .../persistent}/one/to/many/Entities.kt | 6 ++-- .../persistent}/one/to/many/Repositories.kt | 4 +-- .../persistent}/one/to/one/Entities.kt | 4 +-- .../persistent}/one/to/one/Repositories.kt | 4 +-- .../persistent}/pagination/Entities.kt | 4 +-- .../persistent}/pagination/Repositories.kt | 18 +++++------ .../example/application/DataGenerator.kt | 2 +- .../media/service/MediaController.kt | 2 +- .../application/media/service/MediaMapper.kt | 2 +- .../service/OrganisationController.kt | 2 +- .../service/OrganisationDataLoader.kt | 4 +-- .../service/media/entities/Film.kt | 2 +- .../service/media/events/Requests.kt | 4 +-- .../service/media/film.feature/FilmEvents.kt | 2 +- .../media/film.feature/FilmRepository.kt | 12 ++++---- .../service/media/film.feature/FilmService.kt | 4 +-- .../service/organisation/entities/Address.kt | 2 +- .../service/organisation/entities/Company.kt | 2 +- .../organisation/entities/CompanyMember.kt | 2 +- .../service/organisation/entities/Person.kt | 2 +- .../service/organisation/events/Requests.kt | 2 +- .../address/feature/AddressRepository.kt | 2 +- .../company/feature/CompanyRepository.kt | 2 +- .../company/feature/CompanyService.kt | 4 +-- .../person/feature/PersonRepository.kt | 2 +- .../person/feature/PersonService.kt | 2 +- .../organisation/utils/DataSelection.kt | 4 +-- example/utils/build.gradle.kts | 2 +- 71 files changed, 165 insertions(+), 170 deletions(-) rename bee.functional/src/{persistant => persistent}/kotlin/com/beeproduced/result/jpa/extensions/TransactionTemplate.kt (100%) rename bee.functional/src/{persistant => persistent}/kotlin/com/beeproduced/result/jpa/transactional/TransactionalResult.kt (100%) rename bee.functional/src/{persistant => persistent}/kotlin/com/beeproduced/result/jpa/transactional/TransactionalResultAspect.kt (100%) rename bee.persistent/src/dgs/kotlin/com/beeproduced/{data => bee/persistent}/dgs/selection/DgsGraphQLSelection.kt (74%) delete mode 100644 bee.persistent/src/dgs/kotlin/com/beeproduced/data/dgs/root rename bee.persistent/src/jpa/kotlin/com/beeproduced/{data => bee/persistent}/jpa/context/DataContext.kt (78%) rename bee.persistent/src/jpa/kotlin/com/beeproduced/{data => bee/persistent}/jpa/entity/DataEntity.kt (68%) rename bee.persistent/src/jpa/kotlin/com/beeproduced/{data => bee/persistent}/jpa/entity/annotations/SelectionName.kt (90%) rename bee.persistent/src/jpa/kotlin/com/beeproduced/{data => bee/persistent}/jpa/exceptions/EntityNotFound.kt (80%) rename bee.persistent/src/jpa/kotlin/com/beeproduced/{data => bee/persistent}/jpa/exceptions/UnsupportedRelationType.kt (84%) rename bee.persistent/src/jpa/kotlin/com/beeproduced/{data => bee/persistent}/jpa/meta/EntityInfo.kt (98%) rename bee.persistent/src/jpa/kotlin/com/beeproduced/{data => bee/persistent}/jpa/meta/GeneratedInfo.kt (85%) rename bee.persistent/src/jpa/kotlin/com/beeproduced/{data => bee/persistent}/jpa/meta/MemberInfo.kt (93%) rename bee.persistent/src/jpa/kotlin/com/beeproduced/{data => bee/persistent}/jpa/meta/MembersInfo.kt (95%) rename bee.persistent/src/jpa/kotlin/com/beeproduced/{data => bee/persistent}/jpa/meta/MetaModel.kt (97%) rename bee.persistent/src/jpa/kotlin/com/beeproduced/{data => bee/persistent}/jpa/proxy/Unproxy.kt (97%) rename bee.persistent/src/jpa/kotlin/com/beeproduced/{data => bee/persistent}/jpa/repository/BaseDataRepository.kt (94%) rename bee.persistent/src/jpa/kotlin/com/beeproduced/{data => bee/persistent}/jpa/repository/QueryBuilder.kt (97%) rename bee.persistent/src/jpa/kotlin/com/beeproduced/{data => bee/persistent}/jpa/repository/dsl/DummyCriteriaDeleteQueryDsl.kt (95%) rename bee.persistent/src/jpa/kotlin/com/beeproduced/{data => bee/persistent}/jpa/repository/dsl/DummyCriteriaQueryDsl.kt (97%) rename bee.persistent/src/jpa/kotlin/com/beeproduced/{data => bee/persistent}/jpa/repository/extensions/Pagination.kt (95%) rename bee.persistent/src/jpa/kotlin/com/beeproduced/{data => bee/persistent}/jpa/selection/JpaSelection.kt (95%) delete mode 100644 bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/root rename bee.persistent/src/main/kotlin/com/beeproduced/{data => bee/persistent}/fieldconverter/StringSetConverter.kt (90%) rename bee.persistent/src/main/kotlin/com/beeproduced/{data => bee/persistent}/selection/DataSelection.kt (92%) rename bee.persistent/src/main/kotlin/com/beeproduced/{data => bee/persistent}/selection/EmptySelection.kt (93%) rename bee.persistent/src/main/kotlin/com/beeproduced/{data => bee/persistent}/selection/FieldNodeDefinition.kt (76%) rename bee.persistent/src/main/kotlin/com/beeproduced/{data => bee/persistent}/selection/FullNonRecursiveSelection.kt (92%) rename bee.persistent/src/main/kotlin/com/beeproduced/{data => bee/persistent}/selection/SimpleSelection.kt (99%) rename bee.persistent/src/main/kotlin/com/beeproduced/{data => bee/persistent}/selection/SkipOver.kt (97%) delete mode 100644 bee.persistent/src/main/kotlin/com/beeproduced/data/root rename bee.persistent/src/test/kotlin/com/beeproduced/{lib/data => bee/persistent}/DataSelectionTest.kt (98%) rename bee.persistent/src/test/kotlin/com/beeproduced/{lib/data => bee/persistent}/IncubatingTest.kt (98%) rename bee.persistent/src/test/kotlin/com/beeproduced/{lib/data => bee/persistent}/ManyToManyTest.kt (94%) rename bee.persistent/src/test/kotlin/com/beeproduced/{lib/data => bee/persistent}/OneToManyTest.kt (97%) rename bee.persistent/src/test/kotlin/com/beeproduced/{lib/data => bee/persistent}/OneToOneTest.kt (91%) rename bee.persistent/src/test/kotlin/com/beeproduced/{lib/data => bee/persistent}/PaginationTest.kt (97%) rename bee.persistent/src/test/kotlin/com/beeproduced/{lib/data => bee/persistent}/config/DummyApplication.kt (86%) rename bee.persistent/src/test/kotlin/com/beeproduced/{lib/data => bee/persistent}/config/PaginationTestConfiguration.kt (60%) rename bee.persistent/src/test/kotlin/com/beeproduced/{lib/data => bee/persistent}/config/PersistenceConfiguration.kt (93%) rename bee.persistent/src/test/kotlin/com/beeproduced/{lib/data => bee/persistent}/many/to/many/Entities.kt (95%) rename bee.persistent/src/test/kotlin/com/beeproduced/{lib/data => bee/persistent}/many/to/many/Repositories.kt (83%) rename bee.persistent/src/test/kotlin/com/beeproduced/{lib/data => bee/persistent}/one/to/many/Entities.kt (90%) rename bee.persistent/src/test/kotlin/com/beeproduced/{lib/data => bee/persistent}/one/to/many/Repositories.kt (80%) rename bee.persistent/src/test/kotlin/com/beeproduced/{lib/data => bee/persistent}/one/to/one/Entities.kt (93%) rename bee.persistent/src/test/kotlin/com/beeproduced/{lib/data => bee/persistent}/one/to/one/Repositories.kt (79%) rename bee.persistent/src/test/kotlin/com/beeproduced/{lib/data => bee/persistent}/pagination/Entities.kt (76%) rename bee.persistent/src/test/kotlin/com/beeproduced/{lib/data => bee/persistent}/pagination/Repositories.kt (78%) diff --git a/bee.functional/build.gradle.kts b/bee.functional/build.gradle.kts index eaa47c9..6956d6b 100644 --- a/bee.functional/build.gradle.kts +++ b/bee.functional/build.gradle.kts @@ -49,13 +49,13 @@ sourceSets { // configurations["dgsTestRuntimeOnly"].extendsFrom(configurations.runtimeOnly.get()) // } // } - create("persistant") { + create("persistent") { java { - srcDir("src/persistant/kotlin") + srcDir("src/persistent/kotlin") compileClasspath += main.get().output runtimeClasspath += main.get().output - configurations["persistantImplementation"].extendsFrom(configurations.implementation.get()) - configurations["persistantRuntimeOnly"].extendsFrom(configurations.runtimeOnly.get()) + configurations["persistentImplementation"].extendsFrom(configurations.implementation.get()) + configurations["persistentRuntimeOnly"].extendsFrom(configurations.runtimeOnly.get()) } } } @@ -64,8 +64,8 @@ java { registerFeature("dgs") { usingSourceSet(sourceSets["dgs"]) } - registerFeature("persistant") { - usingSourceSet(sourceSets["persistant"]) + registerFeature("persistent") { + usingSourceSet(sourceSets["persistent"]) } } @@ -79,7 +79,7 @@ dependencies { "dgsImplementation"(platform(libs.dgs.platform)) "dgsImplementation"(libs.dgs.spring.starter) "dgsImplementation"(libs.spring.boot.starter.aop) - "persistantImplementation"(libs.spring.boot.starter.data.jpa) + "persistentImplementation"(libs.spring.boot.starter.data.jpa) } tasks.withType { diff --git a/bee.functional/src/persistant/kotlin/com/beeproduced/result/jpa/extensions/TransactionTemplate.kt b/bee.functional/src/persistent/kotlin/com/beeproduced/result/jpa/extensions/TransactionTemplate.kt similarity index 100% rename from bee.functional/src/persistant/kotlin/com/beeproduced/result/jpa/extensions/TransactionTemplate.kt rename to bee.functional/src/persistent/kotlin/com/beeproduced/result/jpa/extensions/TransactionTemplate.kt diff --git a/bee.functional/src/persistant/kotlin/com/beeproduced/result/jpa/transactional/TransactionalResult.kt b/bee.functional/src/persistent/kotlin/com/beeproduced/result/jpa/transactional/TransactionalResult.kt similarity index 100% rename from bee.functional/src/persistant/kotlin/com/beeproduced/result/jpa/transactional/TransactionalResult.kt rename to bee.functional/src/persistent/kotlin/com/beeproduced/result/jpa/transactional/TransactionalResult.kt diff --git a/bee.functional/src/persistant/kotlin/com/beeproduced/result/jpa/transactional/TransactionalResultAspect.kt b/bee.functional/src/persistent/kotlin/com/beeproduced/result/jpa/transactional/TransactionalResultAspect.kt similarity index 100% rename from bee.functional/src/persistant/kotlin/com/beeproduced/result/jpa/transactional/TransactionalResultAspect.kt rename to bee.functional/src/persistent/kotlin/com/beeproduced/result/jpa/transactional/TransactionalResultAspect.kt diff --git a/bee.persistent/src/dgs/kotlin/com/beeproduced/data/dgs/selection/DgsGraphQLSelection.kt b/bee.persistent/src/dgs/kotlin/com/beeproduced/bee/persistent/dgs/selection/DgsGraphQLSelection.kt similarity index 74% rename from bee.persistent/src/dgs/kotlin/com/beeproduced/data/dgs/selection/DgsGraphQLSelection.kt rename to bee.persistent/src/dgs/kotlin/com/beeproduced/bee/persistent/dgs/selection/DgsGraphQLSelection.kt index 9054fb9..95aa52a 100644 --- a/bee.persistent/src/dgs/kotlin/com/beeproduced/data/dgs/selection/DgsGraphQLSelection.kt +++ b/bee.persistent/src/dgs/kotlin/com/beeproduced/bee/persistent/dgs/selection/DgsGraphQLSelection.kt @@ -1,6 +1,8 @@ -package com.beeproduced.data.dgs.selection +package com.beeproduced.bee.persistent.dgs.selection -import com.beeproduced.data.selection.* +import com.beeproduced.bee.persistent.selection.DataSelection +import com.beeproduced.bee.persistent.selection.FieldNodeDefinition +import com.beeproduced.bee.persistent.selection.SimpleSelection import graphql.schema.DataFetchingFieldSelectionSet import graphql.schema.SelectedField diff --git a/bee.persistent/src/dgs/kotlin/com/beeproduced/data/dgs/root b/bee.persistent/src/dgs/kotlin/com/beeproduced/data/dgs/root deleted file mode 100644 index e69de29..0000000 diff --git a/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/context/DataContext.kt b/bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/context/DataContext.kt similarity index 78% rename from bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/context/DataContext.kt rename to bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/context/DataContext.kt index 6522d16..8c7e3d9 100644 --- a/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/context/DataContext.kt +++ b/bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/context/DataContext.kt @@ -1,6 +1,6 @@ -package com.beeproduced.data.jpa.context +package com.beeproduced.bee.persistent.jpa.context -import com.beeproduced.data.selection.DataSelection +import com.beeproduced.bee.persistent.selection.DataSelection /** * diff --git a/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/entity/DataEntity.kt b/bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/entity/DataEntity.kt similarity index 68% rename from bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/entity/DataEntity.kt rename to bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/entity/DataEntity.kt index 22f86c6..c9a6cbf 100644 --- a/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/entity/DataEntity.kt +++ b/bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/entity/DataEntity.kt @@ -1,4 +1,4 @@ -package com.beeproduced.data.jpa.entity +package com.beeproduced.bee.persistent.jpa.entity /** * diff --git a/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/entity/annotations/SelectionName.kt b/bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/entity/annotations/SelectionName.kt similarity index 90% rename from bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/entity/annotations/SelectionName.kt rename to bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/entity/annotations/SelectionName.kt index 0897394..2d7cdf5 100644 --- a/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/entity/annotations/SelectionName.kt +++ b/bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/entity/annotations/SelectionName.kt @@ -1,4 +1,4 @@ -package com.beeproduced.data.jpa.entity.annotations +package com.beeproduced.bee.persistent.jpa.entity.annotations /** * diff --git a/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/exceptions/EntityNotFound.kt b/bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/exceptions/EntityNotFound.kt similarity index 80% rename from bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/exceptions/EntityNotFound.kt rename to bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/exceptions/EntityNotFound.kt index a29d11f..05590ad 100644 --- a/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/exceptions/EntityNotFound.kt +++ b/bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/exceptions/EntityNotFound.kt @@ -1,4 +1,4 @@ -package com.beeproduced.data.jpa.exceptions +package com.beeproduced.bee.persistent.jpa.exceptions /** * diff --git a/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/exceptions/UnsupportedRelationType.kt b/bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/exceptions/UnsupportedRelationType.kt similarity index 84% rename from bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/exceptions/UnsupportedRelationType.kt rename to bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/exceptions/UnsupportedRelationType.kt index 391f581..4c8168e 100644 --- a/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/exceptions/UnsupportedRelationType.kt +++ b/bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/exceptions/UnsupportedRelationType.kt @@ -1,4 +1,4 @@ -package com.beeproduced.data.jpa.exceptions +package com.beeproduced.bee.persistent.jpa.exceptions import kotlin.reflect.KType diff --git a/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/meta/EntityInfo.kt b/bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/meta/EntityInfo.kt similarity index 98% rename from bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/meta/EntityInfo.kt rename to bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/meta/EntityInfo.kt index 3cb6261..2703188 100644 --- a/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/meta/EntityInfo.kt +++ b/bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/meta/EntityInfo.kt @@ -1,4 +1,4 @@ -package com.beeproduced.data.jpa.meta +package com.beeproduced.bee.persistent.jpa.meta import jakarta.persistence.EmbeddedId import jakarta.persistence.IdClass diff --git a/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/meta/GeneratedInfo.kt b/bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/meta/GeneratedInfo.kt similarity index 85% rename from bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/meta/GeneratedInfo.kt rename to bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/meta/GeneratedInfo.kt index cf7d249..ecccfb7 100644 --- a/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/meta/GeneratedInfo.kt +++ b/bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/meta/GeneratedInfo.kt @@ -1,4 +1,4 @@ -package com.beeproduced.data.jpa.meta +package com.beeproduced.bee.persistent.jpa.meta /** * diff --git a/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/meta/MemberInfo.kt b/bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/meta/MemberInfo.kt similarity index 93% rename from bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/meta/MemberInfo.kt rename to bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/meta/MemberInfo.kt index ab7e204..534d418 100644 --- a/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/meta/MemberInfo.kt +++ b/bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/meta/MemberInfo.kt @@ -1,6 +1,6 @@ -package com.beeproduced.data.jpa.meta +package com.beeproduced.bee.persistent.jpa.meta -import com.beeproduced.data.jpa.exceptions.UnsupportedRelationType +import com.beeproduced.bee.persistent.jpa.exceptions.UnsupportedRelationType import java.lang.reflect.Field import java.util.* import kotlin.reflect.KProperty diff --git a/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/meta/MembersInfo.kt b/bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/meta/MembersInfo.kt similarity index 95% rename from bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/meta/MembersInfo.kt rename to bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/meta/MembersInfo.kt index c5a9831..7c91303 100644 --- a/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/meta/MembersInfo.kt +++ b/bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/meta/MembersInfo.kt @@ -1,6 +1,6 @@ -package com.beeproduced.data.jpa.meta +package com.beeproduced.bee.persistent.jpa.meta -import com.beeproduced.data.jpa.entity.annotations.SelectionName +import com.beeproduced.bee.persistent.jpa.entity.annotations.SelectionName import jakarta.persistence.* import java.lang.reflect.Field diff --git a/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/meta/MetaModel.kt b/bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/meta/MetaModel.kt similarity index 97% rename from bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/meta/MetaModel.kt rename to bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/meta/MetaModel.kt index 6c1513b..1b7783d 100644 --- a/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/meta/MetaModel.kt +++ b/bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/meta/MetaModel.kt @@ -1,6 +1,6 @@ -package com.beeproduced.data.jpa.meta +package com.beeproduced.bee.persistent.jpa.meta -import com.beeproduced.data.jpa.exceptions.EntityNotFound +import com.beeproduced.bee.persistent.jpa.exceptions.EntityNotFound import org.hibernate.persister.entity.EntityPersister import org.slf4j.Logger import org.slf4j.LoggerFactory diff --git a/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/proxy/Unproxy.kt b/bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/proxy/Unproxy.kt similarity index 97% rename from bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/proxy/Unproxy.kt rename to bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/proxy/Unproxy.kt index efe9b22..5c87244 100644 --- a/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/proxy/Unproxy.kt +++ b/bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/proxy/Unproxy.kt @@ -1,9 +1,9 @@ @file:Suppress("NAME_SHADOWING") -package com.beeproduced.data.jpa.proxy +package com.beeproduced.bee.persistent.jpa.proxy -import com.beeproduced.data.jpa.meta.MemberInfo -import com.beeproduced.data.jpa.meta.MetaModel +import com.beeproduced.bee.persistent.jpa.meta.MemberInfo +import com.beeproduced.bee.persistent.jpa.meta.MetaModel import org.hibernate.Hibernate import org.hibernate.metamodel.spi.MetamodelImplementor import org.hibernate.proxy.HibernateProxy diff --git a/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/repository/BaseDataRepository.kt b/bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/repository/BaseDataRepository.kt similarity index 94% rename from bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/repository/BaseDataRepository.kt rename to bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/repository/BaseDataRepository.kt index 015c08c..063f26e 100644 --- a/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/repository/BaseDataRepository.kt +++ b/bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/repository/BaseDataRepository.kt @@ -1,30 +1,24 @@ -package com.beeproduced.data.jpa.repository - -import com.beeproduced.data.jpa.entity.DataEntity -import com.beeproduced.data.jpa.meta.* -import com.beeproduced.data.jpa.proxy.Unproxy -import com.beeproduced.data.jpa.repository.dsl.DummyCriteriaDeleteQueryDsl -import com.beeproduced.data.jpa.repository.dsl.DummyCriteriaQueryDsl -import com.beeproduced.data.jpa.selection.JpaSelection -import com.beeproduced.data.selection.DataSelection -import com.beeproduced.data.selection.EmptySelection +package com.beeproduced.bee.persistent.jpa.repository + +import com.beeproduced.bee.persistent.jpa.entity.DataEntity +import com.beeproduced.bee.persistent.jpa.meta.* +import com.beeproduced.bee.persistent.jpa.proxy.Unproxy +import com.beeproduced.bee.persistent.jpa.repository.dsl.DummyCriteriaDeleteQueryDsl +import com.beeproduced.bee.persistent.jpa.repository.dsl.DummyCriteriaQueryDsl +import com.beeproduced.bee.persistent.jpa.selection.JpaSelection +import com.beeproduced.bee.persistent.selection.DataSelection +import com.beeproduced.bee.persistent.selection.EmptySelection import com.linecorp.kotlinjdsl.QueryFactoryImpl -import com.linecorp.kotlinjdsl.listQuery import com.linecorp.kotlinjdsl.query.creator.CriteriaQueryCreatorImpl import com.linecorp.kotlinjdsl.query.creator.SubqueryCreatorImpl import com.linecorp.kotlinjdsl.query.spec.expression.EntitySpec import com.linecorp.kotlinjdsl.querydsl.CriteriaDeleteQueryDsl import com.linecorp.kotlinjdsl.querydsl.CriteriaQueryDsl -import com.linecorp.kotlinjdsl.selectQuery +import jakarta.persistence.EntityManager +import org.hibernate.metamodel.model.domain.internal.MappingMetamodelImpl import org.slf4j.Logger import org.slf4j.LoggerFactory import java.lang.reflect.ParameterizedType -import jakarta.persistence.EntityManager -import org.hibernate.Session -import org.hibernate.metamodel.MappingMetamodel -import org.hibernate.metamodel.model.domain.internal.MappingMetamodelImpl -import org.hibernate.metamodel.spi.MappingMetamodelImplementor -import org.hibernate.metamodel.spi.MetamodelImplementor import kotlin.reflect.KClass /** diff --git a/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/repository/QueryBuilder.kt b/bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/repository/QueryBuilder.kt similarity index 97% rename from bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/repository/QueryBuilder.kt rename to bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/repository/QueryBuilder.kt index c312c08..65863a0 100644 --- a/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/repository/QueryBuilder.kt +++ b/bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/repository/QueryBuilder.kt @@ -1,8 +1,8 @@ -package com.beeproduced.data.jpa.repository +package com.beeproduced.bee.persistent.jpa.repository -import com.beeproduced.data.jpa.meta.EntityInfo -import com.beeproduced.data.jpa.meta.Fields -import com.beeproduced.data.jpa.meta.Ids +import com.beeproduced.bee.persistent.jpa.meta.EntityInfo +import com.beeproduced.bee.persistent.jpa.meta.Fields +import com.beeproduced.bee.persistent.jpa.meta.Ids import com.linecorp.kotlinjdsl.query.spec.expression.ColumnSpec import com.linecorp.kotlinjdsl.query.spec.expression.EntitySpec import com.linecorp.kotlinjdsl.query.spec.expression.ExpressionSpec diff --git a/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/repository/dsl/DummyCriteriaDeleteQueryDsl.kt b/bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/repository/dsl/DummyCriteriaDeleteQueryDsl.kt similarity index 95% rename from bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/repository/dsl/DummyCriteriaDeleteQueryDsl.kt rename to bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/repository/dsl/DummyCriteriaDeleteQueryDsl.kt index 358d548..9e25ae4 100644 --- a/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/repository/dsl/DummyCriteriaDeleteQueryDsl.kt +++ b/bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/repository/dsl/DummyCriteriaDeleteQueryDsl.kt @@ -1,4 +1,4 @@ -package com.beeproduced.data.jpa.repository.dsl +package com.beeproduced.bee.persistent.jpa.repository.dsl import com.linecorp.kotlinjdsl.query.spec.expression.EntitySpec import com.linecorp.kotlinjdsl.query.spec.predicate.PredicateSpec diff --git a/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/repository/dsl/DummyCriteriaQueryDsl.kt b/bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/repository/dsl/DummyCriteriaQueryDsl.kt similarity index 97% rename from bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/repository/dsl/DummyCriteriaQueryDsl.kt rename to bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/repository/dsl/DummyCriteriaQueryDsl.kt index da45faa..522c83d 100644 --- a/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/repository/dsl/DummyCriteriaQueryDsl.kt +++ b/bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/repository/dsl/DummyCriteriaQueryDsl.kt @@ -1,4 +1,4 @@ -package com.beeproduced.data.jpa.repository.dsl +package com.beeproduced.bee.persistent.jpa.repository.dsl import com.linecorp.kotlinjdsl.query.clause.select.MultiSelectClause import com.linecorp.kotlinjdsl.query.clause.select.SingleSelectClause diff --git a/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/repository/extensions/Pagination.kt b/bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/repository/extensions/Pagination.kt similarity index 95% rename from bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/repository/extensions/Pagination.kt rename to bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/repository/extensions/Pagination.kt index 791db8c..1250d98 100644 --- a/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/repository/extensions/Pagination.kt +++ b/bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/repository/extensions/Pagination.kt @@ -1,9 +1,9 @@ -package com.beeproduced.data.jpa.repository.extensions +package com.beeproduced.bee.persistent.jpa.repository.extensions -import com.beeproduced.data.jpa.entity.DataEntity -import com.beeproduced.data.jpa.repository.BaseDataRepository -import com.beeproduced.data.selection.DataSelection -import com.beeproduced.data.selection.EmptySelection +import com.beeproduced.bee.persistent.jpa.entity.DataEntity +import com.beeproduced.bee.persistent.jpa.repository.BaseDataRepository +import com.beeproduced.bee.persistent.selection.DataSelection +import com.beeproduced.bee.persistent.selection.EmptySelection import com.linecorp.kotlinjdsl.query.spec.expression.ColumnSpec import com.linecorp.kotlinjdsl.query.spec.predicate.GreaterThanValueSpec import com.linecorp.kotlinjdsl.query.spec.predicate.LessThanValueSpec diff --git a/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/selection/JpaSelection.kt b/bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/selection/JpaSelection.kt similarity index 95% rename from bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/selection/JpaSelection.kt rename to bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/selection/JpaSelection.kt index a1327f6..aa9d951 100644 --- a/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/selection/JpaSelection.kt +++ b/bee.persistent/src/jpa/kotlin/com/beeproduced/bee/persistent/jpa/selection/JpaSelection.kt @@ -1,9 +1,9 @@ -package com.beeproduced.data.jpa.selection +package com.beeproduced.bee.persistent.jpa.selection -import com.beeproduced.data.jpa.meta.MetaModel -import com.beeproduced.data.jpa.meta.Relations -import com.beeproduced.data.selection.DataSelection -import com.beeproduced.data.selection.FullNonRecursiveSelection +import com.beeproduced.bee.persistent.jpa.meta.MetaModel +import com.beeproduced.bee.persistent.jpa.meta.Relations +import com.beeproduced.bee.persistent.selection.DataSelection +import com.beeproduced.bee.persistent.selection.FullNonRecursiveSelection import jakarta.persistence.EntityGraph import jakarta.persistence.EntityManager import jakarta.persistence.Subgraph diff --git a/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/root b/bee.persistent/src/jpa/kotlin/com/beeproduced/data/jpa/root deleted file mode 100644 index e69de29..0000000 diff --git a/bee.persistent/src/main/kotlin/com/beeproduced/data/fieldconverter/StringSetConverter.kt b/bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/fieldconverter/StringSetConverter.kt similarity index 90% rename from bee.persistent/src/main/kotlin/com/beeproduced/data/fieldconverter/StringSetConverter.kt rename to bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/fieldconverter/StringSetConverter.kt index e67af72..baa190b 100644 --- a/bee.persistent/src/main/kotlin/com/beeproduced/data/fieldconverter/StringSetConverter.kt +++ b/bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/fieldconverter/StringSetConverter.kt @@ -1,4 +1,4 @@ -package com.beeproduced.data.fieldconverter +package com.beeproduced.bee.persistent.fieldconverter import jakarta.persistence.AttributeConverter import jakarta.persistence.Converter diff --git a/bee.persistent/src/main/kotlin/com/beeproduced/data/selection/DataSelection.kt b/bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/selection/DataSelection.kt similarity index 92% rename from bee.persistent/src/main/kotlin/com/beeproduced/data/selection/DataSelection.kt rename to bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/selection/DataSelection.kt index d7988da..72987cd 100644 --- a/bee.persistent/src/main/kotlin/com/beeproduced/data/selection/DataSelection.kt +++ b/bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/selection/DataSelection.kt @@ -1,4 +1,4 @@ -package com.beeproduced.data.selection +package com.beeproduced.bee.persistent.selection /** * diff --git a/bee.persistent/src/main/kotlin/com/beeproduced/data/selection/EmptySelection.kt b/bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/selection/EmptySelection.kt similarity index 93% rename from bee.persistent/src/main/kotlin/com/beeproduced/data/selection/EmptySelection.kt rename to bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/selection/EmptySelection.kt index b6fd182..6a6c837 100644 --- a/bee.persistent/src/main/kotlin/com/beeproduced/data/selection/EmptySelection.kt +++ b/bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/selection/EmptySelection.kt @@ -1,4 +1,4 @@ -package com.beeproduced.data.selection +package com.beeproduced.bee.persistent.selection /** * diff --git a/bee.persistent/src/main/kotlin/com/beeproduced/data/selection/FieldNodeDefinition.kt b/bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/selection/FieldNodeDefinition.kt similarity index 76% rename from bee.persistent/src/main/kotlin/com/beeproduced/data/selection/FieldNodeDefinition.kt rename to bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/selection/FieldNodeDefinition.kt index f58f5f4..ea408ce 100644 --- a/bee.persistent/src/main/kotlin/com/beeproduced/data/selection/FieldNodeDefinition.kt +++ b/bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/selection/FieldNodeDefinition.kt @@ -1,4 +1,4 @@ -package com.beeproduced.data.selection +package com.beeproduced.bee.persistent.selection /** * diff --git a/bee.persistent/src/main/kotlin/com/beeproduced/data/selection/FullNonRecursiveSelection.kt b/bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/selection/FullNonRecursiveSelection.kt similarity index 92% rename from bee.persistent/src/main/kotlin/com/beeproduced/data/selection/FullNonRecursiveSelection.kt rename to bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/selection/FullNonRecursiveSelection.kt index 7cce0bb..a9f8e86 100644 --- a/bee.persistent/src/main/kotlin/com/beeproduced/data/selection/FullNonRecursiveSelection.kt +++ b/bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/selection/FullNonRecursiveSelection.kt @@ -1,4 +1,4 @@ -package com.beeproduced.data.selection +package com.beeproduced.bee.persistent.selection /** * diff --git a/bee.persistent/src/main/kotlin/com/beeproduced/data/selection/SimpleSelection.kt b/bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/selection/SimpleSelection.kt similarity index 99% rename from bee.persistent/src/main/kotlin/com/beeproduced/data/selection/SimpleSelection.kt rename to bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/selection/SimpleSelection.kt index 5313405..2972ba4 100644 --- a/bee.persistent/src/main/kotlin/com/beeproduced/data/selection/SimpleSelection.kt +++ b/bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/selection/SimpleSelection.kt @@ -1,4 +1,4 @@ -package com.beeproduced.data.selection +package com.beeproduced.bee.persistent.selection import java.io.File import java.nio.file.FileSystems diff --git a/bee.persistent/src/main/kotlin/com/beeproduced/data/selection/SkipOver.kt b/bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/selection/SkipOver.kt similarity index 97% rename from bee.persistent/src/main/kotlin/com/beeproduced/data/selection/SkipOver.kt rename to bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/selection/SkipOver.kt index 47a378e..e55b493 100644 --- a/bee.persistent/src/main/kotlin/com/beeproduced/data/selection/SkipOver.kt +++ b/bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/selection/SkipOver.kt @@ -1,4 +1,4 @@ -package com.beeproduced.data.selection +package com.beeproduced.bee.persistent.selection /** * diff --git a/bee.persistent/src/main/kotlin/com/beeproduced/data/root b/bee.persistent/src/main/kotlin/com/beeproduced/data/root deleted file mode 100644 index e69de29..0000000 diff --git a/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/DataSelectionTest.kt b/bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/DataSelectionTest.kt similarity index 98% rename from bee.persistent/src/test/kotlin/com/beeproduced/lib/data/DataSelectionTest.kt rename to bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/DataSelectionTest.kt index 10990ac..a560fa1 100644 --- a/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/DataSelectionTest.kt +++ b/bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/DataSelectionTest.kt @@ -1,7 +1,7 @@ -package com.beeproduced.lib.data +package com.beeproduced.bee.persistent -import com.beeproduced.data.selection.SimpleSelection -import com.beeproduced.data.selection.SimpleSelection.FieldNode +import com.beeproduced.bee.persistent.selection.SimpleSelection +import com.beeproduced.bee.persistent.selection.SimpleSelection.FieldNode import org.junit.jupiter.api.Test import kotlin.test.* diff --git a/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/IncubatingTest.kt b/bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/IncubatingTest.kt similarity index 98% rename from bee.persistent/src/test/kotlin/com/beeproduced/lib/data/IncubatingTest.kt rename to bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/IncubatingTest.kt index 3bee6e1..65f7810 100644 --- a/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/IncubatingTest.kt +++ b/bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/IncubatingTest.kt @@ -1,4 +1,4 @@ -package com.beeproduced.lib.data +package com.beeproduced.bee.persistent /** * diff --git a/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/ManyToManyTest.kt b/bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/ManyToManyTest.kt similarity index 94% rename from bee.persistent/src/test/kotlin/com/beeproduced/lib/data/ManyToManyTest.kt rename to bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/ManyToManyTest.kt index f8e7e48..bbf9c26 100644 --- a/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/ManyToManyTest.kt +++ b/bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/ManyToManyTest.kt @@ -1,12 +1,11 @@ -package com.beeproduced.lib.data - -import com.beeproduced.data.selection.DataSelection -import com.beeproduced.data.selection.EmptySelection -import com.beeproduced.data.selection.FullNonRecursiveSelection -import com.beeproduced.lib.data.config.DummyApplication -import com.beeproduced.lib.data.config.PersistenceConfiguration -import com.beeproduced.lib.data.many.to.many.* -import com.beeproduced.lib.data.one.to.many.* +package com.beeproduced.bee.persistent + +import com.beeproduced.bee.persistent.selection.DataSelection +import com.beeproduced.bee.persistent.selection.EmptySelection +import com.beeproduced.bee.persistent.selection.FullNonRecursiveSelection +import com.beeproduced.bee.persistent.config.DummyApplication +import com.beeproduced.bee.persistent.config.PersistenceConfiguration +import com.beeproduced.bee.persistent.many.to.many.* import com.linecorp.kotlinjdsl.querydsl.expression.column import org.junit.jupiter.api.* import org.junit.jupiter.api.extension.ExtendWith diff --git a/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/OneToManyTest.kt b/bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/OneToManyTest.kt similarity index 97% rename from bee.persistent/src/test/kotlin/com/beeproduced/lib/data/OneToManyTest.kt rename to bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/OneToManyTest.kt index b1fa6f1..80aab09 100644 --- a/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/OneToManyTest.kt +++ b/bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/OneToManyTest.kt @@ -1,11 +1,13 @@ -package com.beeproduced.lib.data - -import com.beeproduced.data.selection.EmptySelection -import com.beeproduced.data.selection.FullNonRecursiveSelection -import com.beeproduced.data.selection.SimpleSelection -import com.beeproduced.lib.data.config.DummyApplication -import com.beeproduced.lib.data.config.PersistenceConfiguration -import com.beeproduced.lib.data.one.to.many.* +package com.beeproduced.bee.persistent + +import com.beeproduced.bee.persistent.selection.EmptySelection +import com.beeproduced.bee.persistent.selection.FullNonRecursiveSelection +import com.beeproduced.bee.persistent.selection.SimpleSelection +import com.beeproduced.bee.persistent.config.DummyApplication +import com.beeproduced.bee.persistent.config.PersistenceConfiguration +import com.beeproduced.bee.persistent.one.to.many.* +import com.beeproduced.bee.persistent.one.to.one.* +import com.beeproduced.bee.persistent.many.to.many.* import com.linecorp.kotlinjdsl.querydsl.expression.column import org.junit.jupiter.api.* import org.junit.jupiter.api.Test diff --git a/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/OneToOneTest.kt b/bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/OneToOneTest.kt similarity index 91% rename from bee.persistent/src/test/kotlin/com/beeproduced/lib/data/OneToOneTest.kt rename to bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/OneToOneTest.kt index 6f271b1..af3454e 100644 --- a/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/OneToOneTest.kt +++ b/bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/OneToOneTest.kt @@ -1,16 +1,16 @@ -package com.beeproduced.lib.data - -import com.beeproduced.data.selection.EmptySelection -import com.beeproduced.data.selection.FullNonRecursiveSelection -import com.beeproduced.data.selection.SimpleSelection -import com.beeproduced.data.selection.SimpleSelection.FieldNode -import com.beeproduced.lib.data.config.DummyApplication -import com.beeproduced.lib.data.config.PersistenceConfiguration +package com.beeproduced.bee.persistent + +import com.beeproduced.bee.persistent.selection.EmptySelection +import com.beeproduced.bee.persistent.selection.FullNonRecursiveSelection +import com.beeproduced.bee.persistent.selection.SimpleSelection +import com.beeproduced.bee.persistent.selection.SimpleSelection.FieldNode +import com.beeproduced.bee.persistent.config.DummyApplication +import com.beeproduced.bee.persistent.config.PersistenceConfiguration import com.beeproduced.lib.data.one.to.many.* -import com.beeproduced.lib.data.one.to.one.Branch -import com.beeproduced.lib.data.one.to.one.BranchRepository -import com.beeproduced.lib.data.one.to.one.Root -import com.beeproduced.lib.data.one.to.one.RootRepository +import com.beeproduced.bee.persistent.one.to.one.Branch +import com.beeproduced.bee.persistent.one.to.one.BranchRepository +import com.beeproduced.bee.persistent.one.to.one.Root +import com.beeproduced.bee.persistent.one.to.one.RootRepository import org.junit.jupiter.api.* import org.junit.jupiter.api.extension.ExtendWith import org.springframework.beans.factory.annotation.Autowired diff --git a/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/PaginationTest.kt b/bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/PaginationTest.kt similarity index 97% rename from bee.persistent/src/test/kotlin/com/beeproduced/lib/data/PaginationTest.kt rename to bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/PaginationTest.kt index a12fb71..cdb6cd4 100644 --- a/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/PaginationTest.kt +++ b/bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/PaginationTest.kt @@ -1,10 +1,10 @@ -package com.beeproduced.lib.data +package com.beeproduced.bee.persistent -import com.beeproduced.data.selection.EmptySelection -import com.beeproduced.lib.data.config.DummyApplication -import com.beeproduced.lib.data.config.PaginationTestConfiguration -import com.beeproduced.lib.data.pagination.PaginatedFoo -import com.beeproduced.lib.data.pagination.PaginatedFooRepository +import com.beeproduced.bee.persistent.selection.EmptySelection +import com.beeproduced.bee.persistent.config.DummyApplication +import com.beeproduced.bee.persistent.config.PaginationTestConfiguration +import com.beeproduced.bee.persistent.pagination.PaginatedFoo +import com.beeproduced.bee.persistent.pagination.PaginatedFooRepository import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test diff --git a/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/config/DummyApplication.kt b/bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/config/DummyApplication.kt similarity index 86% rename from bee.persistent/src/test/kotlin/com/beeproduced/lib/data/config/DummyApplication.kt rename to bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/config/DummyApplication.kt index f787924..7431756 100644 --- a/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/config/DummyApplication.kt +++ b/bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/config/DummyApplication.kt @@ -1,4 +1,4 @@ -package com.beeproduced.lib.data.config +package com.beeproduced.bee.persistent.config import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.boot.context.properties.EnableConfigurationProperties diff --git a/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/config/PaginationTestConfiguration.kt b/bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/config/PaginationTestConfiguration.kt similarity index 60% rename from bee.persistent/src/test/kotlin/com/beeproduced/lib/data/config/PaginationTestConfiguration.kt rename to bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/config/PaginationTestConfiguration.kt index d0cb554..325e733 100644 --- a/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/config/PaginationTestConfiguration.kt +++ b/bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/config/PaginationTestConfiguration.kt @@ -1,4 +1,4 @@ -package com.beeproduced.lib.data.config +package com.beeproduced.bee.persistent.config import org.springframework.boot.test.context.TestConfiguration import org.springframework.context.annotation.ComponentScan @@ -6,8 +6,8 @@ import org.springframework.context.annotation.ComponentScan @TestConfiguration @ComponentScan( basePackages = [ - "com.beeproduced.lib.data.config", - "com.beeproduced.lib.data.pagination" + "com.beeproduced.bee.persistent.config", + "com.beeproduced.bee.persistent.pagination" ] ) class PaginationTestConfiguration { diff --git a/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/config/PersistenceConfiguration.kt b/bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/config/PersistenceConfiguration.kt similarity index 93% rename from bee.persistent/src/test/kotlin/com/beeproduced/lib/data/config/PersistenceConfiguration.kt rename to bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/config/PersistenceConfiguration.kt index 9a1cfc4..9a38ef8 100644 --- a/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/config/PersistenceConfiguration.kt +++ b/bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/config/PersistenceConfiguration.kt @@ -1,4 +1,4 @@ -package com.beeproduced.lib.data.config +package com.beeproduced.bee.persistent.config import org.springframework.beans.factory.annotation.Autowired import org.springframework.beans.factory.annotation.Qualifier @@ -17,7 +17,7 @@ import javax.sql.DataSource @Configuration("PersistenceOrder") @EnableJpaRepositories( - basePackages = ["com.beeproduced.lib.data"], + basePackages = ["com.beeproduced.bee.persistent"], entityManagerFactoryRef = "orderEntityManager", transactionManagerRef = "orderTransactionManager" ) @@ -39,7 +39,7 @@ class PersistenceConfiguration { ): LocalContainerEntityManagerFactoryBean { val em = LocalContainerEntityManagerFactoryBean() em.setDataSource(orderDataSource) - em.setPackagesToScan("com.beeproduced.lib.data") + em.setPackagesToScan("com.beeproduced.bee.persistent") val vendorAdapter = HibernateJpaVendorAdapter() em.setJpaVendorAdapter(vendorAdapter) val properties: HashMap = HashMap() diff --git a/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/many/to/many/Entities.kt b/bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/many/to/many/Entities.kt similarity index 95% rename from bee.persistent/src/test/kotlin/com/beeproduced/lib/data/many/to/many/Entities.kt rename to bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/many/to/many/Entities.kt index 7f5347d..23a7f64 100644 --- a/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/many/to/many/Entities.kt +++ b/bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/many/to/many/Entities.kt @@ -1,6 +1,6 @@ -package com.beeproduced.lib.data.many.to.many +package com.beeproduced.bee.persistent.many.to.many -import com.beeproduced.data.jpa.entity.DataEntity +import com.beeproduced.bee.persistent.jpa.entity.DataEntity import java.io.Serializable import jakarta.persistence.* diff --git a/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/many/to/many/Repositories.kt b/bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/many/to/many/Repositories.kt similarity index 83% rename from bee.persistent/src/test/kotlin/com/beeproduced/lib/data/many/to/many/Repositories.kt rename to bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/many/to/many/Repositories.kt index 912c901..f132b2c 100644 --- a/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/many/to/many/Repositories.kt +++ b/bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/many/to/many/Repositories.kt @@ -1,6 +1,6 @@ -package com.beeproduced.lib.data.many.to.many +package com.beeproduced.bee.persistent.many.to.many -import com.beeproduced.data.jpa.repository.BaseDataRepository +import com.beeproduced.bee.persistent.jpa.repository.BaseDataRepository import org.springframework.beans.factory.annotation.Qualifier import org.springframework.stereotype.Component import jakarta.persistence.EntityManager diff --git a/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/one/to/many/Entities.kt b/bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/one/to/many/Entities.kt similarity index 90% rename from bee.persistent/src/test/kotlin/com/beeproduced/lib/data/one/to/many/Entities.kt rename to bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/one/to/many/Entities.kt index 7347a74..dcae4f2 100644 --- a/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/one/to/many/Entities.kt +++ b/bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/one/to/many/Entities.kt @@ -1,10 +1,8 @@ -package com.beeproduced.lib.data.one.to.many +package com.beeproduced.bee.persistent.one.to.many -import com.beeproduced.data.jpa.entity.DataEntity +import com.beeproduced.bee.persistent.jpa.entity.DataEntity import java.io.Serializable import jakarta.persistence.* -import org.hibernate.annotations.LazyToOne -import org.hibernate.annotations.LazyToOneOption /** * diff --git a/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/one/to/many/Repositories.kt b/bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/one/to/many/Repositories.kt similarity index 80% rename from bee.persistent/src/test/kotlin/com/beeproduced/lib/data/one/to/many/Repositories.kt rename to bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/one/to/many/Repositories.kt index 8d156bf..222167a 100644 --- a/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/one/to/many/Repositories.kt +++ b/bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/one/to/many/Repositories.kt @@ -1,6 +1,6 @@ -package com.beeproduced.lib.data.one.to.many +package com.beeproduced.bee.persistent.one.to.many -import com.beeproduced.data.jpa.repository.BaseDataRepository +import com.beeproduced.bee.persistent.jpa.repository.BaseDataRepository import org.springframework.beans.factory.annotation.Qualifier import org.springframework.stereotype.Component import jakarta.persistence.EntityManager diff --git a/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/one/to/one/Entities.kt b/bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/one/to/one/Entities.kt similarity index 93% rename from bee.persistent/src/test/kotlin/com/beeproduced/lib/data/one/to/one/Entities.kt rename to bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/one/to/one/Entities.kt index 945492b..611a93d 100644 --- a/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/one/to/one/Entities.kt +++ b/bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/one/to/one/Entities.kt @@ -1,6 +1,6 @@ -package com.beeproduced.lib.data.one.to.one +package com.beeproduced.bee.persistent.one.to.one -import com.beeproduced.data.jpa.entity.DataEntity +import com.beeproduced.bee.persistent.jpa.entity.DataEntity import org.hibernate.annotations.LazyToOne import org.hibernate.annotations.LazyToOneOption import jakarta.persistence.* diff --git a/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/one/to/one/Repositories.kt b/bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/one/to/one/Repositories.kt similarity index 79% rename from bee.persistent/src/test/kotlin/com/beeproduced/lib/data/one/to/one/Repositories.kt rename to bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/one/to/one/Repositories.kt index 9908ed4..c4b8630 100644 --- a/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/one/to/one/Repositories.kt +++ b/bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/one/to/one/Repositories.kt @@ -1,6 +1,6 @@ -package com.beeproduced.lib.data.one.to.one +package com.beeproduced.bee.persistent.one.to.one -import com.beeproduced.data.jpa.repository.BaseDataRepository +import com.beeproduced.bee.persistent.jpa.repository.BaseDataRepository import org.springframework.beans.factory.annotation.Qualifier import org.springframework.stereotype.Component import jakarta.persistence.* diff --git a/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/pagination/Entities.kt b/bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/pagination/Entities.kt similarity index 76% rename from bee.persistent/src/test/kotlin/com/beeproduced/lib/data/pagination/Entities.kt rename to bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/pagination/Entities.kt index a5282c9..539b719 100644 --- a/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/pagination/Entities.kt +++ b/bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/pagination/Entities.kt @@ -1,6 +1,6 @@ -package com.beeproduced.lib.data.pagination +package com.beeproduced.bee.persistent.pagination -import com.beeproduced.data.jpa.entity.DataEntity +import com.beeproduced.bee.persistent.jpa.entity.DataEntity import jakarta.persistence.* import java.time.Instant diff --git a/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/pagination/Repositories.kt b/bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/pagination/Repositories.kt similarity index 78% rename from bee.persistent/src/test/kotlin/com/beeproduced/lib/data/pagination/Repositories.kt rename to bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/pagination/Repositories.kt index bd0bb83..4e99729 100644 --- a/bee.persistent/src/test/kotlin/com/beeproduced/lib/data/pagination/Repositories.kt +++ b/bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/pagination/Repositories.kt @@ -1,11 +1,11 @@ -package com.beeproduced.lib.data.pagination +package com.beeproduced.bee.persistent.pagination -import com.beeproduced.data.jpa.repository.BaseDataRepository -import com.beeproduced.data.jpa.repository.extensions.Cursor -import com.beeproduced.data.jpa.repository.extensions.Pagination -import com.beeproduced.data.jpa.repository.extensions.PaginationException -import com.beeproduced.data.jpa.repository.extensions.PaginationResult -import com.beeproduced.data.selection.DataSelection +import com.beeproduced.bee.persistent.jpa.repository.BaseDataRepository +import com.beeproduced.bee.persistent.jpa.repository.extensions.Cursor +import com.beeproduced.bee.persistent.jpa.repository.extensions.Pagination +import com.beeproduced.bee.persistent.jpa.repository.extensions.PaginationException +import com.beeproduced.bee.persistent.jpa.repository.extensions.PaginationResult +import com.beeproduced.bee.persistent.selection.DataSelection import com.linecorp.kotlinjdsl.query.spec.expression.ColumnSpec import com.linecorp.kotlinjdsl.query.spec.expression.EntitySpec import com.linecorp.kotlinjdsl.query.spec.predicate.EqualValueSpec @@ -47,8 +47,8 @@ class PaginatedFooRepository( repository = this, orderBy = ColumnSpec(EntitySpec(PaginatedFoo::class.java), PaginatedFoo::createdOn.name), cursor = Cursor( - decode = ::decodeCursor, - encode = ::encodeCursor + decode = Companion::decodeCursor, + encode = Companion::encodeCursor ), where = { w: String -> EqualValueSpec( diff --git a/example/application/src/main/kotlin/com/beeproduced/example/application/DataGenerator.kt b/example/application/src/main/kotlin/com/beeproduced/example/application/DataGenerator.kt index 60c4c6d..9388663 100644 --- a/example/application/src/main/kotlin/com/beeproduced/example/application/DataGenerator.kt +++ b/example/application/src/main/kotlin/com/beeproduced/example/application/DataGenerator.kt @@ -1,6 +1,6 @@ package com.beeproduced.example.application -import com.beeproduced.data.selection.SimpleSelection +import com.beeproduced.bee.persistent.selection.SimpleSelection import com.beeproduced.lib.events.manager.EventManager import com.beeproduced.result.AppResult import com.beeproduced.service.media.entities.Film diff --git a/example/application/src/main/kotlin/com/beeproduced/example/application/media/service/MediaController.kt b/example/application/src/main/kotlin/com/beeproduced/example/application/media/service/MediaController.kt index 2277e49..352b0dc 100644 --- a/example/application/src/main/kotlin/com/beeproduced/example/application/media/service/MediaController.kt +++ b/example/application/src/main/kotlin/com/beeproduced/example/application/media/service/MediaController.kt @@ -1,6 +1,6 @@ package com.beeproduced.example.application.media.service -import com.beeproduced.data.dgs.selection.toDataSelection +import com.beeproduced.bee.persistent.dgs.selection.toDataSelection import com.beeproduced.example.application.graphql.dto.AddFilm import com.beeproduced.example.application.graphql.dto.EditFilm import com.beeproduced.example.application.graphql.dto.Foo diff --git a/example/application/src/main/kotlin/com/beeproduced/example/application/media/service/MediaMapper.kt b/example/application/src/main/kotlin/com/beeproduced/example/application/media/service/MediaMapper.kt index 17162cb..b344e3f 100644 --- a/example/application/src/main/kotlin/com/beeproduced/example/application/media/service/MediaMapper.kt +++ b/example/application/src/main/kotlin/com/beeproduced/example/application/media/service/MediaMapper.kt @@ -1,6 +1,6 @@ package com.beeproduced.example.application.media.service -import com.beeproduced.data.jpa.repository.extensions.PaginationResult +import com.beeproduced.bee.persistent.jpa.repository.extensions.PaginationResult import com.beeproduced.service.media.entities.Film import com.beeproduced.service.media.entities.input.CreateFilmInput import com.beeproduced.service.media.entities.input.FilmPagination diff --git a/example/application/src/main/kotlin/com/beeproduced/example/application/organisation/service/OrganisationController.kt b/example/application/src/main/kotlin/com/beeproduced/example/application/organisation/service/OrganisationController.kt index be19d3c..c3f4a55 100644 --- a/example/application/src/main/kotlin/com/beeproduced/example/application/organisation/service/OrganisationController.kt +++ b/example/application/src/main/kotlin/com/beeproduced/example/application/organisation/service/OrganisationController.kt @@ -1,6 +1,6 @@ package com.beeproduced.example.application.organisation.service -import com.beeproduced.data.dgs.selection.toDataSelection +import com.beeproduced.bee.persistent.dgs.selection.toDataSelection import com.beeproduced.lib.events.manager.EventManager import com.beeproduced.result.extensions.dgs.getDataFetcher import com.beeproduced.service.organisation.events.GetAllCompanies diff --git a/example/application/src/main/kotlin/com/beeproduced/example/application/organisation/service/OrganisationDataLoader.kt b/example/application/src/main/kotlin/com/beeproduced/example/application/organisation/service/OrganisationDataLoader.kt index 7696f10..5c3ebea 100644 --- a/example/application/src/main/kotlin/com/beeproduced/example/application/organisation/service/OrganisationDataLoader.kt +++ b/example/application/src/main/kotlin/com/beeproduced/example/application/organisation/service/OrganisationDataLoader.kt @@ -2,8 +2,8 @@ package com.beeproduced.example.application.organisation.service import com.beeproduced.bee.fetched.annotations.BeeFetched import com.beeproduced.bee.fetched.annotations.FetcherIgnore -import com.beeproduced.data.dgs.selection.toDataSelection -import com.beeproduced.data.selection.EmptySelection +import com.beeproduced.bee.persistent.dgs.selection.toDataSelection +import com.beeproduced.bee.persistent.selection.EmptySelection import com.beeproduced.lib.events.manager.EventManager import com.beeproduced.service.organisation.events.GetCompaniesByIds import com.beeproduced.service.organisation.events.GetPersonsByIds diff --git a/example/service.media/entities/src/main/kotlin/com/beeproduced/service/media/entities/Film.kt b/example/service.media/entities/src/main/kotlin/com/beeproduced/service/media/entities/Film.kt index 6905005..0b1c81f 100644 --- a/example/service.media/entities/src/main/kotlin/com/beeproduced/service/media/entities/Film.kt +++ b/example/service.media/entities/src/main/kotlin/com/beeproduced/service/media/entities/Film.kt @@ -1,6 +1,6 @@ package com.beeproduced.service.media.entities -import com.beeproduced.data.jpa.entity.DataEntity +import com.beeproduced.bee.persistent.jpa.entity.DataEntity import com.beeproduced.service.organisation.entities.CompanyId import com.beeproduced.service.organisation.entities.PersonId import com.beeproduced.utils.UUIDSetConverter diff --git a/example/service.media/events/src/main/kotlin/com/beeproduced/service/media/events/Requests.kt b/example/service.media/events/src/main/kotlin/com/beeproduced/service/media/events/Requests.kt index 1f61ce4..1dd136e 100644 --- a/example/service.media/events/src/main/kotlin/com/beeproduced/service/media/events/Requests.kt +++ b/example/service.media/events/src/main/kotlin/com/beeproduced/service/media/events/Requests.kt @@ -1,7 +1,7 @@ package com.beeproduced.service.media.events -import com.beeproduced.data.jpa.repository.extensions.PaginationResult -import com.beeproduced.data.selection.DataSelection +import com.beeproduced.bee.persistent.jpa.repository.extensions.PaginationResult +import com.beeproduced.bee.persistent.selection.DataSelection import com.beeproduced.lib.events.Request import com.beeproduced.service.media.entities.Film import com.beeproduced.service.media.entities.input.CreateFilmInput diff --git a/example/service.media/src/main/kotlin/com/beeproduced/service/media/film.feature/FilmEvents.kt b/example/service.media/src/main/kotlin/com/beeproduced/service/media/film.feature/FilmEvents.kt index 358435d..8c192c9 100644 --- a/example/service.media/src/main/kotlin/com/beeproduced/service/media/film.feature/FilmEvents.kt +++ b/example/service.media/src/main/kotlin/com/beeproduced/service/media/film.feature/FilmEvents.kt @@ -1,6 +1,6 @@ package com.beeproduced.service.media.film.feature -import com.beeproduced.data.jpa.repository.extensions.PaginationResult +import com.beeproduced.bee.persistent.jpa.repository.extensions.PaginationResult import com.beeproduced.lib.events.manager.EventManager import com.beeproduced.lib.events.requestHandler import com.beeproduced.result.AppResult diff --git a/example/service.media/src/main/kotlin/com/beeproduced/service/media/film.feature/FilmRepository.kt b/example/service.media/src/main/kotlin/com/beeproduced/service/media/film.feature/FilmRepository.kt index 8e91f3f..0277753 100644 --- a/example/service.media/src/main/kotlin/com/beeproduced/service/media/film.feature/FilmRepository.kt +++ b/example/service.media/src/main/kotlin/com/beeproduced/service/media/film.feature/FilmRepository.kt @@ -1,11 +1,11 @@ package com.beeproduced.service.media.film.feature -import com.beeproduced.data.jpa.repository.BaseDataRepository -import com.beeproduced.data.jpa.repository.extensions.Cursor -import com.beeproduced.data.jpa.repository.extensions.Pagination -import com.beeproduced.data.jpa.repository.extensions.PaginationException -import com.beeproduced.data.jpa.repository.extensions.PaginationResult -import com.beeproduced.data.selection.DataSelection +import com.beeproduced.bee.persistent.jpa.repository.BaseDataRepository +import com.beeproduced.bee.persistent.jpa.repository.extensions.Cursor +import com.beeproduced.bee.persistent.jpa.repository.extensions.Pagination +import com.beeproduced.bee.persistent.jpa.repository.extensions.PaginationException +import com.beeproduced.bee.persistent.jpa.repository.extensions.PaginationResult +import com.beeproduced.bee.persistent.selection.DataSelection import com.beeproduced.service.media.entities.Film import com.beeproduced.service.media.entities.FilmId import com.linecorp.kotlinjdsl.query.spec.expression.ColumnSpec diff --git a/example/service.media/src/main/kotlin/com/beeproduced/service/media/film.feature/FilmService.kt b/example/service.media/src/main/kotlin/com/beeproduced/service/media/film.feature/FilmService.kt index 26f31ca..4af3341 100644 --- a/example/service.media/src/main/kotlin/com/beeproduced/service/media/film.feature/FilmService.kt +++ b/example/service.media/src/main/kotlin/com/beeproduced/service/media/film.feature/FilmService.kt @@ -1,7 +1,7 @@ package com.beeproduced.service.media.film.feature -import com.beeproduced.data.jpa.repository.extensions.PaginationResult -import com.beeproduced.data.selection.DataSelection +import com.beeproduced.bee.persistent.jpa.repository.extensions.PaginationResult +import com.beeproduced.bee.persistent.selection.DataSelection import com.beeproduced.lib.events.manager.EventManager import com.beeproduced.result.AppResult import com.beeproduced.result.errors.BadRequestError diff --git a/example/service.organisation/entities/src/main/kotlin/com/beeproduced/service/organisation/entities/Address.kt b/example/service.organisation/entities/src/main/kotlin/com/beeproduced/service/organisation/entities/Address.kt index ace1c2e..56afcb5 100644 --- a/example/service.organisation/entities/src/main/kotlin/com/beeproduced/service/organisation/entities/Address.kt +++ b/example/service.organisation/entities/src/main/kotlin/com/beeproduced/service/organisation/entities/Address.kt @@ -1,6 +1,6 @@ package com.beeproduced.service.organisation.entities -import com.beeproduced.data.jpa.entity.DataEntity +import com.beeproduced.bee.persistent.jpa.entity.DataEntity import jakarta.persistence.Column import jakarta.persistence.Entity import jakarta.persistence.GeneratedValue diff --git a/example/service.organisation/entities/src/main/kotlin/com/beeproduced/service/organisation/entities/Company.kt b/example/service.organisation/entities/src/main/kotlin/com/beeproduced/service/organisation/entities/Company.kt index 93e1797..f04f74b 100644 --- a/example/service.organisation/entities/src/main/kotlin/com/beeproduced/service/organisation/entities/Company.kt +++ b/example/service.organisation/entities/src/main/kotlin/com/beeproduced/service/organisation/entities/Company.kt @@ -1,6 +1,6 @@ package com.beeproduced.service.organisation.entities -import com.beeproduced.data.jpa.entity.DataEntity +import com.beeproduced.bee.persistent.jpa.entity.DataEntity import jakarta.persistence.* import java.util.UUID diff --git a/example/service.organisation/entities/src/main/kotlin/com/beeproduced/service/organisation/entities/CompanyMember.kt b/example/service.organisation/entities/src/main/kotlin/com/beeproduced/service/organisation/entities/CompanyMember.kt index 9661974..bbad92b 100644 --- a/example/service.organisation/entities/src/main/kotlin/com/beeproduced/service/organisation/entities/CompanyMember.kt +++ b/example/service.organisation/entities/src/main/kotlin/com/beeproduced/service/organisation/entities/CompanyMember.kt @@ -1,6 +1,6 @@ package com.beeproduced.service.organisation.entities -import com.beeproduced.data.jpa.entity.DataEntity +import com.beeproduced.bee.persistent.jpa.entity.DataEntity import jakarta.persistence.* import java.io.Serializable diff --git a/example/service.organisation/entities/src/main/kotlin/com/beeproduced/service/organisation/entities/Person.kt b/example/service.organisation/entities/src/main/kotlin/com/beeproduced/service/organisation/entities/Person.kt index c5e072d..7ad1a4d 100644 --- a/example/service.organisation/entities/src/main/kotlin/com/beeproduced/service/organisation/entities/Person.kt +++ b/example/service.organisation/entities/src/main/kotlin/com/beeproduced/service/organisation/entities/Person.kt @@ -1,6 +1,6 @@ package com.beeproduced.service.organisation.entities -import com.beeproduced.data.jpa.entity.DataEntity +import com.beeproduced.bee.persistent.jpa.entity.DataEntity import jakarta.persistence.* import java.util.UUID diff --git a/example/service.organisation/events/src/main/kotlin/com/beeproduced/service/organisation/events/Requests.kt b/example/service.organisation/events/src/main/kotlin/com/beeproduced/service/organisation/events/Requests.kt index 07e083f..26362a1 100644 --- a/example/service.organisation/events/src/main/kotlin/com/beeproduced/service/organisation/events/Requests.kt +++ b/example/service.organisation/events/src/main/kotlin/com/beeproduced/service/organisation/events/Requests.kt @@ -1,6 +1,6 @@ package com.beeproduced.service.organisation.events -import com.beeproduced.data.selection.DataSelection +import com.beeproduced.bee.persistent.selection.DataSelection import com.beeproduced.lib.events.Request import com.beeproduced.service.organisation.entities.Company import com.beeproduced.service.organisation.entities.CompanyId diff --git a/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/address/feature/AddressRepository.kt b/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/address/feature/AddressRepository.kt index 4299016..4b1718e 100644 --- a/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/address/feature/AddressRepository.kt +++ b/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/address/feature/AddressRepository.kt @@ -1,6 +1,6 @@ package com.beeproduced.service.organisation.address.feature -import com.beeproduced.data.jpa.repository.BaseDataRepository +import com.beeproduced.bee.persistent.jpa.repository.BaseDataRepository import com.beeproduced.service.organisation.entities.Address import com.beeproduced.service.organisation.entities.AddressId import jakarta.persistence.EntityManager diff --git a/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/company/feature/CompanyRepository.kt b/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/company/feature/CompanyRepository.kt index d155157..a98e4f0 100644 --- a/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/company/feature/CompanyRepository.kt +++ b/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/company/feature/CompanyRepository.kt @@ -1,6 +1,6 @@ package com.beeproduced.service.organisation.company.feature -import com.beeproduced.data.jpa.repository.BaseDataRepository +import com.beeproduced.bee.persistent.jpa.repository.BaseDataRepository import com.beeproduced.service.organisation.entities.Company import com.beeproduced.service.organisation.entities.CompanyId import com.beeproduced.service.organisation.entities.CompanyMember diff --git a/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/company/feature/CompanyService.kt b/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/company/feature/CompanyService.kt index d8c56a3..aac9006 100644 --- a/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/company/feature/CompanyService.kt +++ b/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/company/feature/CompanyService.kt @@ -1,7 +1,7 @@ package com.beeproduced.service.organisation.company.feature -import com.beeproduced.data.selection.DataSelection -import com.beeproduced.data.selection.EmptySelection +import com.beeproduced.bee.persistent.selection.DataSelection +import com.beeproduced.bee.persistent.selection.EmptySelection import com.beeproduced.result.AppResult import com.beeproduced.result.errors.BadRequestError import com.beeproduced.result.extensions.functional.andThenToPair diff --git a/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/person/feature/PersonRepository.kt b/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/person/feature/PersonRepository.kt index 9a208b4..d543a1e 100644 --- a/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/person/feature/PersonRepository.kt +++ b/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/person/feature/PersonRepository.kt @@ -1,6 +1,6 @@ package com.beeproduced.service.organisation.person.feature -import com.beeproduced.data.jpa.repository.BaseDataRepository +import com.beeproduced.bee.persistent.jpa.repository.BaseDataRepository import com.beeproduced.service.organisation.entities.Person import com.beeproduced.service.organisation.entities.PersonId import jakarta.persistence.EntityManager diff --git a/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/person/feature/PersonService.kt b/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/person/feature/PersonService.kt index 1e9391b..6be1b52 100644 --- a/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/person/feature/PersonService.kt +++ b/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/person/feature/PersonService.kt @@ -1,6 +1,6 @@ package com.beeproduced.service.organisation.person.feature -import com.beeproduced.data.selection.DataSelection +import com.beeproduced.bee.persistent.selection.DataSelection import com.beeproduced.result.AppResult import com.beeproduced.result.errors.BadRequestError import com.beeproduced.result.jpa.transactional.TransactionalResult diff --git a/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/utils/DataSelection.kt b/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/utils/DataSelection.kt index 74495f4..9ff27d8 100644 --- a/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/utils/DataSelection.kt +++ b/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/utils/DataSelection.kt @@ -1,7 +1,7 @@ package com.beeproduced.service.organisation.utils -import com.beeproduced.data.selection.DataSelection -import com.beeproduced.data.selection.SkipOverAll +import com.beeproduced.bee.persistent.selection.DataSelection +import com.beeproduced.bee.persistent.selection.SkipOverAll import com.beeproduced.service.organisation.entities.Company import com.beeproduced.service.organisation.entities.CompanyMember import com.beeproduced.service.organisation.entities.Person diff --git a/example/utils/build.gradle.kts b/example/utils/build.gradle.kts index 62bc445..065c9ed 100644 --- a/example/utils/build.gradle.kts +++ b/example/utils/build.gradle.kts @@ -20,7 +20,7 @@ repositories { dependencies { api("com.beeproduced:bee.functional") api("com.beeproduced:bee.functional") { - capabilities { requireCapability("com.beeproduced:bee.functional-persistant") } + capabilities { requireCapability("com.beeproduced:bee.functional-persistent") } } api(libs.michael.result) implementation(libs.kotlin.stdlib) From 93dcfd9d89104acb6eb713aa0700466d0f257fb0 Mon Sep 17 00:00:00 2001 From: Kacper Urbaniec Date: Mon, 23 Oct 2023 17:05:41 +0200 Subject: [PATCH 4/9] Renamed `bee.buzz` packages & added autoconfiguration for spring --- .../{lib/events => bee/buzz}/Notification.kt | 2 +- .../{lib/events => bee/buzz}/Request.kt | 2 +- .../events => bee/buzz}/manager/EventError.kt | 2 +- .../buzz}/manager/EventManager.kt | 2 +- .../events => bee/buzz}/manager/Mediator.kt | 10 ++++---- .../events => bee/buzz}/manager/Scheduler.kt | 2 +- .../autoconfig/BeeBuzzAutoConfiguration.kt | 24 +++++++++++++++++++ .../buzz}/manager/SimpleEventManager.kt | 14 +++++------ .../buzz}/manager/TestEventManager.kt | 4 ++-- .../exceptions/NotificationHandlerNotFound.kt | 2 +- .../exceptions/RequestHandlerNotFound.kt | 2 +- ...ot.autoconfigure.AutoConfiguration.imports | 1 + .../LibrarySetupConfiguration.kt | 11 +-------- .../example/application/DataGenerator.kt | 2 +- .../LibrarySetupConfiguration.kt | 11 +-------- .../media/service/MediaController.kt | 2 +- .../service/OrganisationController.kt | 2 +- .../service/OrganisationDataLoader.kt | 2 +- .../service/media/events/Requests.kt | 2 +- .../service/media/film.feature/FilmEvents.kt | 4 ++-- .../service/media/film.feature/FilmService.kt | 2 +- .../service/organisation/events/Requests.kt | 2 +- .../company/feature/CompanyEvents.kt | 4 ++-- .../person/feature/PersonEvents.kt | 5 ++-- 24 files changed, 61 insertions(+), 55 deletions(-) rename bee.buzz/src/main/kotlin/com/beeproduced/{lib/events => bee/buzz}/Notification.kt (94%) rename bee.buzz/src/main/kotlin/com/beeproduced/{lib/events => bee/buzz}/Request.kt (95%) rename bee.buzz/src/main/kotlin/com/beeproduced/{lib/events => bee/buzz}/manager/EventError.kt (94%) rename bee.buzz/src/main/kotlin/com/beeproduced/{lib/events => bee/buzz}/manager/EventManager.kt (71%) rename bee.buzz/src/main/kotlin/com/beeproduced/{lib/events => bee/buzz}/manager/Mediator.kt (74%) rename bee.buzz/src/main/kotlin/com/beeproduced/{lib/events => bee/buzz}/manager/Scheduler.kt (85%) create mode 100644 bee.buzz/src/simple/kotlin/com/beeproduced/bee/buzz/autoconfig/BeeBuzzAutoConfiguration.kt rename bee.buzz/src/simple/kotlin/com/beeproduced/{lib/events => bee/buzz}/manager/SimpleEventManager.kt (94%) rename bee.buzz/src/simple/kotlin/com/beeproduced/{lib/events => bee/buzz}/manager/TestEventManager.kt (87%) rename bee.buzz/src/simple/kotlin/com/beeproduced/{lib/events => bee/buzz}/manager/exceptions/NotificationHandlerNotFound.kt (70%) rename bee.buzz/src/simple/kotlin/com/beeproduced/{lib/events => bee/buzz}/manager/exceptions/RequestHandlerNotFound.kt (69%) create mode 100644 bee.buzz/src/simple/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports diff --git a/bee.buzz/src/main/kotlin/com/beeproduced/lib/events/Notification.kt b/bee.buzz/src/main/kotlin/com/beeproduced/bee/buzz/Notification.kt similarity index 94% rename from bee.buzz/src/main/kotlin/com/beeproduced/lib/events/Notification.kt rename to bee.buzz/src/main/kotlin/com/beeproduced/bee/buzz/Notification.kt index 7324f5b..b274450 100644 --- a/bee.buzz/src/main/kotlin/com/beeproduced/lib/events/Notification.kt +++ b/bee.buzz/src/main/kotlin/com/beeproduced/bee/buzz/Notification.kt @@ -1,4 +1,4 @@ -package com.beeproduced.lib.events +package com.beeproduced.bee.buzz /** * Inspired by https://github.com/jbogard/MediatR/wiki. diff --git a/bee.buzz/src/main/kotlin/com/beeproduced/lib/events/Request.kt b/bee.buzz/src/main/kotlin/com/beeproduced/bee/buzz/Request.kt similarity index 95% rename from bee.buzz/src/main/kotlin/com/beeproduced/lib/events/Request.kt rename to bee.buzz/src/main/kotlin/com/beeproduced/bee/buzz/Request.kt index 1c38211..f466ff5 100644 --- a/bee.buzz/src/main/kotlin/com/beeproduced/lib/events/Request.kt +++ b/bee.buzz/src/main/kotlin/com/beeproduced/bee/buzz/Request.kt @@ -1,4 +1,4 @@ -package com.beeproduced.lib.events +package com.beeproduced.bee.buzz import com.beeproduced.result.errors.AppError import com.github.michaelbull.result.Result diff --git a/bee.buzz/src/main/kotlin/com/beeproduced/lib/events/manager/EventError.kt b/bee.buzz/src/main/kotlin/com/beeproduced/bee/buzz/manager/EventError.kt similarity index 94% rename from bee.buzz/src/main/kotlin/com/beeproduced/lib/events/manager/EventError.kt rename to bee.buzz/src/main/kotlin/com/beeproduced/bee/buzz/manager/EventError.kt index 2df885d..e89ef31 100644 --- a/bee.buzz/src/main/kotlin/com/beeproduced/lib/events/manager/EventError.kt +++ b/bee.buzz/src/main/kotlin/com/beeproduced/bee/buzz/manager/EventError.kt @@ -1,4 +1,4 @@ -package com.beeproduced.lib.events.manager +package com.beeproduced.bee.buzz.manager import com.beeproduced.result.errors.InternalAppError import com.beeproduced.result.errors.ResultError diff --git a/bee.buzz/src/main/kotlin/com/beeproduced/lib/events/manager/EventManager.kt b/bee.buzz/src/main/kotlin/com/beeproduced/bee/buzz/manager/EventManager.kt similarity index 71% rename from bee.buzz/src/main/kotlin/com/beeproduced/lib/events/manager/EventManager.kt rename to bee.buzz/src/main/kotlin/com/beeproduced/bee/buzz/manager/EventManager.kt index dd8d5ae..db8af03 100644 --- a/bee.buzz/src/main/kotlin/com/beeproduced/lib/events/manager/EventManager.kt +++ b/bee.buzz/src/main/kotlin/com/beeproduced/bee/buzz/manager/EventManager.kt @@ -1,4 +1,4 @@ -package com.beeproduced.lib.events.manager +package com.beeproduced.bee.buzz.manager /** * diff --git a/bee.buzz/src/main/kotlin/com/beeproduced/lib/events/manager/Mediator.kt b/bee.buzz/src/main/kotlin/com/beeproduced/bee/buzz/manager/Mediator.kt similarity index 74% rename from bee.buzz/src/main/kotlin/com/beeproduced/lib/events/manager/Mediator.kt rename to bee.buzz/src/main/kotlin/com/beeproduced/bee/buzz/manager/Mediator.kt index 98da060..65419bd 100644 --- a/bee.buzz/src/main/kotlin/com/beeproduced/lib/events/manager/Mediator.kt +++ b/bee.buzz/src/main/kotlin/com/beeproduced/bee/buzz/manager/Mediator.kt @@ -1,9 +1,9 @@ -package com.beeproduced.lib.events.manager +package com.beeproduced.bee.buzz.manager -import com.beeproduced.lib.events.Notification -import com.beeproduced.lib.events.NotificationHandler -import com.beeproduced.lib.events.Request -import com.beeproduced.lib.events.RequestHandler +import com.beeproduced.bee.buzz.Notification +import com.beeproduced.bee.buzz.NotificationHandler +import com.beeproduced.bee.buzz.Request +import com.beeproduced.bee.buzz.RequestHandler import com.beeproduced.result.errors.AppError import com.github.michaelbull.result.Result diff --git a/bee.buzz/src/main/kotlin/com/beeproduced/lib/events/manager/Scheduler.kt b/bee.buzz/src/main/kotlin/com/beeproduced/bee/buzz/manager/Scheduler.kt similarity index 85% rename from bee.buzz/src/main/kotlin/com/beeproduced/lib/events/manager/Scheduler.kt rename to bee.buzz/src/main/kotlin/com/beeproduced/bee/buzz/manager/Scheduler.kt index 8517170..f339b28 100644 --- a/bee.buzz/src/main/kotlin/com/beeproduced/lib/events/manager/Scheduler.kt +++ b/bee.buzz/src/main/kotlin/com/beeproduced/bee/buzz/manager/Scheduler.kt @@ -1,4 +1,4 @@ -package com.beeproduced.lib.events.manager +package com.beeproduced.bee.buzz.manager import java.util.concurrent.ScheduledFuture import java.util.concurrent.TimeUnit diff --git a/bee.buzz/src/simple/kotlin/com/beeproduced/bee/buzz/autoconfig/BeeBuzzAutoConfiguration.kt b/bee.buzz/src/simple/kotlin/com/beeproduced/bee/buzz/autoconfig/BeeBuzzAutoConfiguration.kt new file mode 100644 index 0000000..b531fb3 --- /dev/null +++ b/bee.buzz/src/simple/kotlin/com/beeproduced/bee/buzz/autoconfig/BeeBuzzAutoConfiguration.kt @@ -0,0 +1,24 @@ +package com.beeproduced.bee.buzz.autoconfig + +import com.beeproduced.bee.buzz.manager.EventManager +import com.beeproduced.bee.buzz.manager.Mediator +import com.beeproduced.bee.buzz.manager.Scheduler +import com.beeproduced.bee.buzz.manager.SimpleEventManager +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration + +/** + * + * + * @author Kacper Urbaniec + * @version 2023-10-23 + */ +@Configuration +@ConditionalOnClass(value = [EventManager::class, Mediator::class, Scheduler::class]) +open class BeeBuzzAutoConfiguration { + @Bean + open fun beeBuzzEventManager() : EventManager { + return SimpleEventManager() + } +} \ No newline at end of file diff --git a/bee.buzz/src/simple/kotlin/com/beeproduced/lib/events/manager/SimpleEventManager.kt b/bee.buzz/src/simple/kotlin/com/beeproduced/bee/buzz/manager/SimpleEventManager.kt similarity index 94% rename from bee.buzz/src/simple/kotlin/com/beeproduced/lib/events/manager/SimpleEventManager.kt rename to bee.buzz/src/simple/kotlin/com/beeproduced/bee/buzz/manager/SimpleEventManager.kt index a20181b..53c923b 100644 --- a/bee.buzz/src/simple/kotlin/com/beeproduced/lib/events/manager/SimpleEventManager.kt +++ b/bee.buzz/src/simple/kotlin/com/beeproduced/bee/buzz/manager/SimpleEventManager.kt @@ -1,11 +1,11 @@ -package com.beeproduced.lib.events.manager +package com.beeproduced.bee.buzz.manager -import com.beeproduced.lib.events.Notification -import com.beeproduced.lib.events.NotificationHandler -import com.beeproduced.lib.events.Request -import com.beeproduced.lib.events.RequestHandler -import com.beeproduced.lib.events.manager.exceptions.NotificationHandlerNotFound -import com.beeproduced.lib.events.manager.exceptions.RequestHandlerNotFound +import com.beeproduced.bee.buzz.Notification +import com.beeproduced.bee.buzz.NotificationHandler +import com.beeproduced.bee.buzz.Request +import com.beeproduced.bee.buzz.RequestHandler +import com.beeproduced.bee.buzz.manager.exceptions.NotificationHandlerNotFound +import com.beeproduced.bee.buzz.manager.exceptions.RequestHandlerNotFound import com.beeproduced.result.errors.AppError import com.github.michaelbull.result.Result import org.slf4j.LoggerFactory diff --git a/bee.buzz/src/simple/kotlin/com/beeproduced/lib/events/manager/TestEventManager.kt b/bee.buzz/src/simple/kotlin/com/beeproduced/bee/buzz/manager/TestEventManager.kt similarity index 87% rename from bee.buzz/src/simple/kotlin/com/beeproduced/lib/events/manager/TestEventManager.kt rename to bee.buzz/src/simple/kotlin/com/beeproduced/bee/buzz/manager/TestEventManager.kt index d756a73..e287a79 100644 --- a/bee.buzz/src/simple/kotlin/com/beeproduced/lib/events/manager/TestEventManager.kt +++ b/bee.buzz/src/simple/kotlin/com/beeproduced/bee/buzz/manager/TestEventManager.kt @@ -1,6 +1,6 @@ -package com.beeproduced.lib.events.manager +package com.beeproduced.bee.buzz.manager -import com.beeproduced.lib.events.Request +import com.beeproduced.bee.buzz.Request import com.beeproduced.result.errors.AppError import com.github.michaelbull.result.Result diff --git a/bee.buzz/src/simple/kotlin/com/beeproduced/lib/events/manager/exceptions/NotificationHandlerNotFound.kt b/bee.buzz/src/simple/kotlin/com/beeproduced/bee/buzz/manager/exceptions/NotificationHandlerNotFound.kt similarity index 70% rename from bee.buzz/src/simple/kotlin/com/beeproduced/lib/events/manager/exceptions/NotificationHandlerNotFound.kt rename to bee.buzz/src/simple/kotlin/com/beeproduced/bee/buzz/manager/exceptions/NotificationHandlerNotFound.kt index 77578bf..96c8aa8 100644 --- a/bee.buzz/src/simple/kotlin/com/beeproduced/lib/events/manager/exceptions/NotificationHandlerNotFound.kt +++ b/bee.buzz/src/simple/kotlin/com/beeproduced/bee/buzz/manager/exceptions/NotificationHandlerNotFound.kt @@ -1,4 +1,4 @@ -package com.beeproduced.lib.events.manager.exceptions +package com.beeproduced.bee.buzz.manager.exceptions /** * diff --git a/bee.buzz/src/simple/kotlin/com/beeproduced/lib/events/manager/exceptions/RequestHandlerNotFound.kt b/bee.buzz/src/simple/kotlin/com/beeproduced/bee/buzz/manager/exceptions/RequestHandlerNotFound.kt similarity index 69% rename from bee.buzz/src/simple/kotlin/com/beeproduced/lib/events/manager/exceptions/RequestHandlerNotFound.kt rename to bee.buzz/src/simple/kotlin/com/beeproduced/bee/buzz/manager/exceptions/RequestHandlerNotFound.kt index e8685a8..d73af08 100644 --- a/bee.buzz/src/simple/kotlin/com/beeproduced/lib/events/manager/exceptions/RequestHandlerNotFound.kt +++ b/bee.buzz/src/simple/kotlin/com/beeproduced/bee/buzz/manager/exceptions/RequestHandlerNotFound.kt @@ -1,4 +1,4 @@ -package com.beeproduced.lib.events.manager.exceptions +package com.beeproduced.bee.buzz.manager.exceptions /** * diff --git a/bee.buzz/src/simple/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/bee.buzz/src/simple/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..41ad4ad --- /dev/null +++ b/bee.buzz/src/simple/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +com.beeproduced.bee.buzz.autoconfig.BeeBuzzAutoConfiguration \ No newline at end of file diff --git a/bee.fetched.test/src/main/kotlin/com/beeproduced/bee/fetched/application/configuration/LibrarySetupConfiguration.kt b/bee.fetched.test/src/main/kotlin/com/beeproduced/bee/fetched/application/configuration/LibrarySetupConfiguration.kt index df69249..acead30 100644 --- a/bee.fetched.test/src/main/kotlin/com/beeproduced/bee/fetched/application/configuration/LibrarySetupConfiguration.kt +++ b/bee.fetched.test/src/main/kotlin/com/beeproduced/bee/fetched/application/configuration/LibrarySetupConfiguration.kt @@ -1,17 +1,8 @@ package com.beeproduced.example.application.configuration -import com.beeproduced.lib.events.manager.EventManager -import com.beeproduced.lib.events.manager.SimpleEventManager -import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.context.annotation.EnableAspectJAutoProxy @EnableAspectJAutoProxy @Configuration -class LibrarySetupConfiguration { - - @Bean - fun eventManager() : EventManager { - return SimpleEventManager() - } -} \ No newline at end of file +class LibrarySetupConfiguration \ No newline at end of file diff --git a/example/application/src/main/kotlin/com/beeproduced/example/application/DataGenerator.kt b/example/application/src/main/kotlin/com/beeproduced/example/application/DataGenerator.kt index 9388663..388ffcf 100644 --- a/example/application/src/main/kotlin/com/beeproduced/example/application/DataGenerator.kt +++ b/example/application/src/main/kotlin/com/beeproduced/example/application/DataGenerator.kt @@ -1,7 +1,7 @@ package com.beeproduced.example.application import com.beeproduced.bee.persistent.selection.SimpleSelection -import com.beeproduced.lib.events.manager.EventManager +import com.beeproduced.bee.buzz.manager.EventManager import com.beeproduced.result.AppResult import com.beeproduced.service.media.entities.Film import com.beeproduced.service.media.entities.input.CreateFilmInput diff --git a/example/application/src/main/kotlin/com/beeproduced/example/application/configuration/LibrarySetupConfiguration.kt b/example/application/src/main/kotlin/com/beeproduced/example/application/configuration/LibrarySetupConfiguration.kt index df69249..acead30 100644 --- a/example/application/src/main/kotlin/com/beeproduced/example/application/configuration/LibrarySetupConfiguration.kt +++ b/example/application/src/main/kotlin/com/beeproduced/example/application/configuration/LibrarySetupConfiguration.kt @@ -1,17 +1,8 @@ package com.beeproduced.example.application.configuration -import com.beeproduced.lib.events.manager.EventManager -import com.beeproduced.lib.events.manager.SimpleEventManager -import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.context.annotation.EnableAspectJAutoProxy @EnableAspectJAutoProxy @Configuration -class LibrarySetupConfiguration { - - @Bean - fun eventManager() : EventManager { - return SimpleEventManager() - } -} \ No newline at end of file +class LibrarySetupConfiguration \ No newline at end of file diff --git a/example/application/src/main/kotlin/com/beeproduced/example/application/media/service/MediaController.kt b/example/application/src/main/kotlin/com/beeproduced/example/application/media/service/MediaController.kt index 352b0dc..90a4b28 100644 --- a/example/application/src/main/kotlin/com/beeproduced/example/application/media/service/MediaController.kt +++ b/example/application/src/main/kotlin/com/beeproduced/example/application/media/service/MediaController.kt @@ -5,7 +5,7 @@ import com.beeproduced.example.application.graphql.dto.AddFilm import com.beeproduced.example.application.graphql.dto.EditFilm import com.beeproduced.example.application.graphql.dto.Foo import com.beeproduced.example.application.organisation.service.setContext -import com.beeproduced.lib.events.manager.EventManager +import com.beeproduced.bee.buzz.manager.EventManager import com.beeproduced.result.extensions.dgs.getDataFetcher import com.beeproduced.service.media.events.CreateFilm import com.beeproduced.service.media.events.GetRecentlyAddedFilms diff --git a/example/application/src/main/kotlin/com/beeproduced/example/application/organisation/service/OrganisationController.kt b/example/application/src/main/kotlin/com/beeproduced/example/application/organisation/service/OrganisationController.kt index c3f4a55..a346b2b 100644 --- a/example/application/src/main/kotlin/com/beeproduced/example/application/organisation/service/OrganisationController.kt +++ b/example/application/src/main/kotlin/com/beeproduced/example/application/organisation/service/OrganisationController.kt @@ -1,7 +1,7 @@ package com.beeproduced.example.application.organisation.service import com.beeproduced.bee.persistent.dgs.selection.toDataSelection -import com.beeproduced.lib.events.manager.EventManager +import com.beeproduced.bee.buzz.manager.EventManager import com.beeproduced.result.extensions.dgs.getDataFetcher import com.beeproduced.service.organisation.events.GetAllCompanies import com.beeproduced.service.organisation.events.GetAllPersons diff --git a/example/application/src/main/kotlin/com/beeproduced/example/application/organisation/service/OrganisationDataLoader.kt b/example/application/src/main/kotlin/com/beeproduced/example/application/organisation/service/OrganisationDataLoader.kt index 5c3ebea..46e6042 100644 --- a/example/application/src/main/kotlin/com/beeproduced/example/application/organisation/service/OrganisationDataLoader.kt +++ b/example/application/src/main/kotlin/com/beeproduced/example/application/organisation/service/OrganisationDataLoader.kt @@ -4,7 +4,7 @@ import com.beeproduced.bee.fetched.annotations.BeeFetched import com.beeproduced.bee.fetched.annotations.FetcherIgnore import com.beeproduced.bee.persistent.dgs.selection.toDataSelection import com.beeproduced.bee.persistent.selection.EmptySelection -import com.beeproduced.lib.events.manager.EventManager +import com.beeproduced.bee.buzz.manager.EventManager import com.beeproduced.service.organisation.events.GetCompaniesByIds import com.beeproduced.service.organisation.events.GetPersonsByIds import com.beeproduced.utils.logFor diff --git a/example/service.media/events/src/main/kotlin/com/beeproduced/service/media/events/Requests.kt b/example/service.media/events/src/main/kotlin/com/beeproduced/service/media/events/Requests.kt index 1dd136e..0732f6b 100644 --- a/example/service.media/events/src/main/kotlin/com/beeproduced/service/media/events/Requests.kt +++ b/example/service.media/events/src/main/kotlin/com/beeproduced/service/media/events/Requests.kt @@ -2,7 +2,7 @@ package com.beeproduced.service.media.events import com.beeproduced.bee.persistent.jpa.repository.extensions.PaginationResult import com.beeproduced.bee.persistent.selection.DataSelection -import com.beeproduced.lib.events.Request +import com.beeproduced.bee.buzz.Request import com.beeproduced.service.media.entities.Film import com.beeproduced.service.media.entities.input.CreateFilmInput import com.beeproduced.service.media.entities.input.FilmPagination diff --git a/example/service.media/src/main/kotlin/com/beeproduced/service/media/film.feature/FilmEvents.kt b/example/service.media/src/main/kotlin/com/beeproduced/service/media/film.feature/FilmEvents.kt index 8c192c9..a47c624 100644 --- a/example/service.media/src/main/kotlin/com/beeproduced/service/media/film.feature/FilmEvents.kt +++ b/example/service.media/src/main/kotlin/com/beeproduced/service/media/film.feature/FilmEvents.kt @@ -1,8 +1,8 @@ package com.beeproduced.service.media.film.feature import com.beeproduced.bee.persistent.jpa.repository.extensions.PaginationResult -import com.beeproduced.lib.events.manager.EventManager -import com.beeproduced.lib.events.requestHandler +import com.beeproduced.bee.buzz.manager.EventManager +import com.beeproduced.bee.buzz.requestHandler import com.beeproduced.result.AppResult import com.beeproduced.service.media.entities.Film import com.beeproduced.service.media.events.CreateFilm diff --git a/example/service.media/src/main/kotlin/com/beeproduced/service/media/film.feature/FilmService.kt b/example/service.media/src/main/kotlin/com/beeproduced/service/media/film.feature/FilmService.kt index 4af3341..591f0fc 100644 --- a/example/service.media/src/main/kotlin/com/beeproduced/service/media/film.feature/FilmService.kt +++ b/example/service.media/src/main/kotlin/com/beeproduced/service/media/film.feature/FilmService.kt @@ -2,7 +2,7 @@ package com.beeproduced.service.media.film.feature import com.beeproduced.bee.persistent.jpa.repository.extensions.PaginationResult import com.beeproduced.bee.persistent.selection.DataSelection -import com.beeproduced.lib.events.manager.EventManager +import com.beeproduced.bee.buzz.manager.EventManager import com.beeproduced.result.AppResult import com.beeproduced.result.errors.BadRequestError import com.beeproduced.result.extensions.errors.andThenOnSuccess diff --git a/example/service.organisation/events/src/main/kotlin/com/beeproduced/service/organisation/events/Requests.kt b/example/service.organisation/events/src/main/kotlin/com/beeproduced/service/organisation/events/Requests.kt index 26362a1..406fbfd 100644 --- a/example/service.organisation/events/src/main/kotlin/com/beeproduced/service/organisation/events/Requests.kt +++ b/example/service.organisation/events/src/main/kotlin/com/beeproduced/service/organisation/events/Requests.kt @@ -1,7 +1,7 @@ package com.beeproduced.service.organisation.events import com.beeproduced.bee.persistent.selection.DataSelection -import com.beeproduced.lib.events.Request +import com.beeproduced.bee.buzz.Request import com.beeproduced.service.organisation.entities.Company import com.beeproduced.service.organisation.entities.CompanyId import com.beeproduced.service.organisation.entities.Person diff --git a/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/company/feature/CompanyEvents.kt b/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/company/feature/CompanyEvents.kt index a170925..5b7070d 100644 --- a/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/company/feature/CompanyEvents.kt +++ b/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/company/feature/CompanyEvents.kt @@ -1,7 +1,7 @@ package com.beeproduced.service.organisation.company.feature -import com.beeproduced.lib.events.manager.EventManager -import com.beeproduced.lib.events.requestHandler +import com.beeproduced.bee.buzz.manager.EventManager +import com.beeproduced.bee.buzz.requestHandler import com.beeproduced.result.AppResult import com.beeproduced.service.organisation.entities.Company import com.beeproduced.service.organisation.events.CompaniesExist diff --git a/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/person/feature/PersonEvents.kt b/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/person/feature/PersonEvents.kt index 3a0b996..8521d4f 100644 --- a/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/person/feature/PersonEvents.kt +++ b/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/person/feature/PersonEvents.kt @@ -1,9 +1,8 @@ package com.beeproduced.service.organisation.person.feature -import com.beeproduced.lib.events.manager.EventManager -import com.beeproduced.lib.events.requestHandler +import com.beeproduced.bee.buzz.manager.EventManager +import com.beeproduced.bee.buzz.requestHandler import com.beeproduced.result.AppResult -import com.beeproduced.service.organisation.entities.Company import com.beeproduced.service.organisation.entities.Person import com.beeproduced.service.organisation.events.* import com.beeproduced.service.organisation.utils.organisationAdapter From 42b9ec83e75827622a7633451b9f6e270a7a5364 Mon Sep 17 00:00:00 2001 From: Kacper Urbaniec Date: Mon, 23 Oct 2023 18:00:10 +0200 Subject: [PATCH 5/9] Renamed `bee.functional` packages & added autoconfiguration for spring --- .../kotlin/com/beeproduced/bee/buzz/Request.kt | 2 +- .../beeproduced/bee/buzz/manager/EventError.kt | 4 ++-- .../beeproduced/bee/buzz/manager/Mediator.kt | 2 +- .../bee/buzz/manager/SimpleEventManager.kt | 2 +- .../bee/buzz/manager/TestEventManager.kt | 2 +- .../configuration/DgsConfiguration.kt | 13 ------------- .../configuration/LibrarySetupConfiguration.kt | 8 -------- .../dgs/aspect/AroundDgsDataAspect.kt | 4 ++-- .../BeeFunctionalDgsAutoConfiguration.kt | 15 +++++++++++++++ .../config}/DgsErrorHandlingConfiguration.kt | 12 ++++++------ .../dgs}/fetcher/DataFetcherErrThrower.kt | 2 +- .../dgs}/fetcher/DataFetcherResult.kt | 2 +- .../fetcher/TypedGraphlQLErrorExtensions.kt | 2 +- .../dgs/handler/AspectExceptionHandler.kt | 6 +++--- .../KotlinResultDataFetcherExtensions.kt} | 10 +++++----- ...boot.autoconfigure.AutoConfiguration.imports | 1 + .../com/github/michaelbull/result}/And.kt | 4 ++-- .../com/github/michaelbull/result}/Map.kt | 10 +++++----- .../github/michaelbull/result}/MapFunctional.kt | 4 ++-- .../com/github/michaelbull/result}/Unsafe.kt | 4 ++-- .../{ => bee/functional}/result/AppResult.kt | 4 ++-- .../{ => bee/functional}/result/errors/Error.kt | 2 +- .../result/errors/deprecated/AnyError.kt | 16 ---------------- .../result/errors/deprecated/AppError.kt | 14 -------------- .../result/errors/deprecated/ExceptionError.kt | 16 ---------------- .../errors/deprecated/util/ErrorTestingUtil.kt | 17 ----------------- .../transaction/support}/TransactionTemplate.kt | 10 ++++++---- .../transactional/TransactionalResult.kt | 2 +- .../transactional/TransactionalResultAspect.kt | 8 ++++---- .../{result => bee/functional}/ErrorTest.kt | 16 ++++++++-------- .../{result => bee/functional}/MapTest.kt | 6 +++--- .../example/application/DataGenerator.kt | 2 +- .../configuration/DgsConfiguration.kt | 12 ------------ .../configuration/LibrarySetupConfiguration.kt | 8 -------- .../media/service/MediaController.kt | 2 +- .../service/OrganisationController.kt | 2 +- .../service/media/film.feature/FilmEvents.kt | 2 +- .../service/media/film.feature/FilmService.kt | 8 ++++---- .../address/feature/AddressService.kt | 4 ++-- .../company/feature/CompanyEvents.kt | 2 +- .../company/feature/CompanyService.kt | 8 ++++---- .../organisation/person/feature/PersonEvents.kt | 2 +- .../person/feature/PersonService.kt | 6 +++--- 43 files changed, 96 insertions(+), 182 deletions(-) delete mode 100644 bee.fetched.test/src/main/kotlin/com/beeproduced/bee/fetched/application/configuration/LibrarySetupConfiguration.kt rename bee.functional/src/dgs/kotlin/com/beeproduced/{result => bee/functional}/dgs/aspect/AroundDgsDataAspect.kt (93%) create mode 100644 bee.functional/src/dgs/kotlin/com/beeproduced/bee/functional/dgs/autoconfig/BeeFunctionalDgsAutoConfiguration.kt rename bee.functional/src/dgs/kotlin/com/beeproduced/{result/dgs => bee/functional/dgs/config}/DgsErrorHandlingConfiguration.kt (68%) rename bee.functional/src/dgs/kotlin/com/beeproduced/{result/dgs/data => bee/functional/dgs}/fetcher/DataFetcherErrThrower.kt (78%) rename bee.functional/src/dgs/kotlin/com/beeproduced/{result/dgs/data => bee/functional/dgs}/fetcher/DataFetcherResult.kt (97%) rename bee.functional/src/dgs/kotlin/com/beeproduced/{result/dgs/data => bee/functional/dgs}/fetcher/TypedGraphlQLErrorExtensions.kt (93%) rename bee.functional/src/dgs/kotlin/com/beeproduced/{result => bee/functional}/dgs/handler/AspectExceptionHandler.kt (90%) rename bee.functional/src/dgs/kotlin/com/beeproduced/{result/extensions/dgs/KotlinResultExtensions.kt => bee/functional/extensions/com/github/michaelbull/result/KotlinResultDataFetcherExtensions.kt} (76%) create mode 100644 bee.functional/src/dgs/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports rename bee.functional/src/main/kotlin/com/beeproduced/{result/extensions/errors => bee/functional/extensions/com/github/michaelbull/result}/And.kt (82%) rename bee.functional/src/main/kotlin/com/beeproduced/{result/extensions/errors => bee/functional/extensions/com/github/michaelbull/result}/Map.kt (86%) rename bee.functional/src/main/kotlin/com/beeproduced/{result/extensions/functional => bee/functional/extensions/com/github/michaelbull/result}/MapFunctional.kt (97%) rename bee.functional/src/main/kotlin/com/beeproduced/{result/extensions/errors => bee/functional/extensions/com/github/michaelbull/result}/Unsafe.kt (80%) rename bee.functional/src/main/kotlin/com/beeproduced/{ => bee/functional}/result/AppResult.kt (59%) rename bee.functional/src/main/kotlin/com/beeproduced/{ => bee/functional}/result/errors/Error.kt (98%) delete mode 100644 bee.functional/src/main/kotlin/com/beeproduced/result/errors/deprecated/AnyError.kt delete mode 100644 bee.functional/src/main/kotlin/com/beeproduced/result/errors/deprecated/AppError.kt delete mode 100644 bee.functional/src/main/kotlin/com/beeproduced/result/errors/deprecated/ExceptionError.kt delete mode 100644 bee.functional/src/main/kotlin/com/beeproduced/result/errors/deprecated/util/ErrorTestingUtil.kt rename bee.functional/src/persistent/kotlin/com/beeproduced/{result/jpa/extensions => bee/functional/extensions/org/springframework/transaction/support}/TransactionTemplate.kt (87%) rename bee.functional/src/persistent/kotlin/com/beeproduced/{result/jpa => bee/functional/persistent}/transactional/TransactionalResult.kt (98%) rename bee.functional/src/persistent/kotlin/com/beeproduced/{result/jpa => bee/functional/persistent}/transactional/TransactionalResultAspect.kt (87%) rename bee.functional/src/test/kotlin/com/beeproduced/{result => bee/functional}/ErrorTest.kt (96%) rename bee.functional/src/test/kotlin/com/beeproduced/{result => bee/functional}/MapTest.kt (90%) delete mode 100644 example/application/src/main/kotlin/com/beeproduced/example/application/configuration/LibrarySetupConfiguration.kt diff --git a/bee.buzz/src/main/kotlin/com/beeproduced/bee/buzz/Request.kt b/bee.buzz/src/main/kotlin/com/beeproduced/bee/buzz/Request.kt index f466ff5..77b9f99 100644 --- a/bee.buzz/src/main/kotlin/com/beeproduced/bee/buzz/Request.kt +++ b/bee.buzz/src/main/kotlin/com/beeproduced/bee/buzz/Request.kt @@ -1,6 +1,6 @@ package com.beeproduced.bee.buzz -import com.beeproduced.result.errors.AppError +import com.beeproduced.bee.functional.result.errors.AppError import com.github.michaelbull.result.Result /** diff --git a/bee.buzz/src/main/kotlin/com/beeproduced/bee/buzz/manager/EventError.kt b/bee.buzz/src/main/kotlin/com/beeproduced/bee/buzz/manager/EventError.kt index e89ef31..bef8f6a 100644 --- a/bee.buzz/src/main/kotlin/com/beeproduced/bee/buzz/manager/EventError.kt +++ b/bee.buzz/src/main/kotlin/com/beeproduced/bee/buzz/manager/EventError.kt @@ -1,7 +1,7 @@ package com.beeproduced.bee.buzz.manager -import com.beeproduced.result.errors.InternalAppError -import com.beeproduced.result.errors.ResultError +import com.beeproduced.bee.functional.result.errors.InternalAppError +import com.beeproduced.bee.functional.result.errors.ResultError /** * diff --git a/bee.buzz/src/main/kotlin/com/beeproduced/bee/buzz/manager/Mediator.kt b/bee.buzz/src/main/kotlin/com/beeproduced/bee/buzz/manager/Mediator.kt index 65419bd..bcf117d 100644 --- a/bee.buzz/src/main/kotlin/com/beeproduced/bee/buzz/manager/Mediator.kt +++ b/bee.buzz/src/main/kotlin/com/beeproduced/bee/buzz/manager/Mediator.kt @@ -4,7 +4,7 @@ import com.beeproduced.bee.buzz.Notification import com.beeproduced.bee.buzz.NotificationHandler import com.beeproduced.bee.buzz.Request import com.beeproduced.bee.buzz.RequestHandler -import com.beeproduced.result.errors.AppError +import com.beeproduced.bee.functional.result.errors.AppError import com.github.michaelbull.result.Result /** diff --git a/bee.buzz/src/simple/kotlin/com/beeproduced/bee/buzz/manager/SimpleEventManager.kt b/bee.buzz/src/simple/kotlin/com/beeproduced/bee/buzz/manager/SimpleEventManager.kt index 53c923b..9fe21c5 100644 --- a/bee.buzz/src/simple/kotlin/com/beeproduced/bee/buzz/manager/SimpleEventManager.kt +++ b/bee.buzz/src/simple/kotlin/com/beeproduced/bee/buzz/manager/SimpleEventManager.kt @@ -6,7 +6,7 @@ import com.beeproduced.bee.buzz.Request import com.beeproduced.bee.buzz.RequestHandler import com.beeproduced.bee.buzz.manager.exceptions.NotificationHandlerNotFound import com.beeproduced.bee.buzz.manager.exceptions.RequestHandlerNotFound -import com.beeproduced.result.errors.AppError +import com.beeproduced.bee.functional.result.errors.AppError import com.github.michaelbull.result.Result import org.slf4j.LoggerFactory import org.springframework.util.LinkedMultiValueMap diff --git a/bee.buzz/src/simple/kotlin/com/beeproduced/bee/buzz/manager/TestEventManager.kt b/bee.buzz/src/simple/kotlin/com/beeproduced/bee/buzz/manager/TestEventManager.kt index e287a79..b2cf3f9 100644 --- a/bee.buzz/src/simple/kotlin/com/beeproduced/bee/buzz/manager/TestEventManager.kt +++ b/bee.buzz/src/simple/kotlin/com/beeproduced/bee/buzz/manager/TestEventManager.kt @@ -1,7 +1,7 @@ package com.beeproduced.bee.buzz.manager import com.beeproduced.bee.buzz.Request -import com.beeproduced.result.errors.AppError +import com.beeproduced.bee.functional.result.errors.AppError import com.github.michaelbull.result.Result open class TestEventManager : SimpleEventManager() { diff --git a/bee.fetched.test/src/main/kotlin/com/beeproduced/bee/fetched/application/configuration/DgsConfiguration.kt b/bee.fetched.test/src/main/kotlin/com/beeproduced/bee/fetched/application/configuration/DgsConfiguration.kt index 660d69a..1ad4afb 100644 --- a/bee.fetched.test/src/main/kotlin/com/beeproduced/bee/fetched/application/configuration/DgsConfiguration.kt +++ b/bee.fetched.test/src/main/kotlin/com/beeproduced/bee/fetched/application/configuration/DgsConfiguration.kt @@ -1,29 +1,16 @@ package com.beeproduced.example.application.configuration -import com.beeproduced.result.dgs.DgsErrorHandlingConfiguration import com.netflix.graphql.dgs.DgsScalar import graphql.language.StringValue import graphql.schema.Coercing import graphql.schema.CoercingParseLiteralException import graphql.schema.CoercingParseValueException import graphql.schema.CoercingSerializeException -import org.springframework.context.annotation.Configuration -import org.springframework.context.annotation.EnableAspectJAutoProxy import java.time.Instant import java.time.ZoneId import java.time.ZoneOffset import java.time.format.DateTimeFormatter -/** - * - * - * @author Kacper Urbaniec - * @version 2022-10-10 - */ -@Configuration -@EnableAspectJAutoProxy -class DgsConfiguration : DgsErrorHandlingConfiguration() - /** * Based on: https://netflix.github.io/dgs/scalars/ * diff --git a/bee.fetched.test/src/main/kotlin/com/beeproduced/bee/fetched/application/configuration/LibrarySetupConfiguration.kt b/bee.fetched.test/src/main/kotlin/com/beeproduced/bee/fetched/application/configuration/LibrarySetupConfiguration.kt deleted file mode 100644 index acead30..0000000 --- a/bee.fetched.test/src/main/kotlin/com/beeproduced/bee/fetched/application/configuration/LibrarySetupConfiguration.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.beeproduced.example.application.configuration - -import org.springframework.context.annotation.Configuration -import org.springframework.context.annotation.EnableAspectJAutoProxy - -@EnableAspectJAutoProxy -@Configuration -class LibrarySetupConfiguration \ No newline at end of file diff --git a/bee.functional/src/dgs/kotlin/com/beeproduced/result/dgs/aspect/AroundDgsDataAspect.kt b/bee.functional/src/dgs/kotlin/com/beeproduced/bee/functional/dgs/aspect/AroundDgsDataAspect.kt similarity index 93% rename from bee.functional/src/dgs/kotlin/com/beeproduced/result/dgs/aspect/AroundDgsDataAspect.kt rename to bee.functional/src/dgs/kotlin/com/beeproduced/bee/functional/dgs/aspect/AroundDgsDataAspect.kt index 9f9e7f8..08e9521 100644 --- a/bee.functional/src/dgs/kotlin/com/beeproduced/result/dgs/aspect/AroundDgsDataAspect.kt +++ b/bee.functional/src/dgs/kotlin/com/beeproduced/bee/functional/dgs/aspect/AroundDgsDataAspect.kt @@ -1,6 +1,6 @@ -package com.beeproduced.result.dgs.aspect +package com.beeproduced.bee.functional.dgs.aspect -import com.beeproduced.result.dgs.data.fetcher.DataFetcherErrThrower +import com.beeproduced.bee.functional.dgs.fetcher.DataFetcherErrThrower import graphql.execution.DataFetcherResult import org.aspectj.lang.ProceedingJoinPoint import org.aspectj.lang.annotation.Around diff --git a/bee.functional/src/dgs/kotlin/com/beeproduced/bee/functional/dgs/autoconfig/BeeFunctionalDgsAutoConfiguration.kt b/bee.functional/src/dgs/kotlin/com/beeproduced/bee/functional/dgs/autoconfig/BeeFunctionalDgsAutoConfiguration.kt new file mode 100644 index 0000000..b8a79cf --- /dev/null +++ b/bee.functional/src/dgs/kotlin/com/beeproduced/bee/functional/dgs/autoconfig/BeeFunctionalDgsAutoConfiguration.kt @@ -0,0 +1,15 @@ +package com.beeproduced.bee.functional.dgs.autoconfig + +import com.beeproduced.bee.functional.dgs.config.DgsErrorHandlingConfiguration +import org.springframework.context.annotation.Configuration +import org.springframework.context.annotation.EnableAspectJAutoProxy + +/** + * + * + * @author Kacper Urbaniec + * @version 2023-10-23 + */ +@Configuration +@EnableAspectJAutoProxy +open class BeeFunctionalDgsAutoConfiguration : DgsErrorHandlingConfiguration() \ No newline at end of file diff --git a/bee.functional/src/dgs/kotlin/com/beeproduced/result/dgs/DgsErrorHandlingConfiguration.kt b/bee.functional/src/dgs/kotlin/com/beeproduced/bee/functional/dgs/config/DgsErrorHandlingConfiguration.kt similarity index 68% rename from bee.functional/src/dgs/kotlin/com/beeproduced/result/dgs/DgsErrorHandlingConfiguration.kt rename to bee.functional/src/dgs/kotlin/com/beeproduced/bee/functional/dgs/config/DgsErrorHandlingConfiguration.kt index 61b38de..d05c2f8 100644 --- a/bee.functional/src/dgs/kotlin/com/beeproduced/result/dgs/DgsErrorHandlingConfiguration.kt +++ b/bee.functional/src/dgs/kotlin/com/beeproduced/bee/functional/dgs/config/DgsErrorHandlingConfiguration.kt @@ -1,8 +1,8 @@ -package com.beeproduced.result.dgs +package com.beeproduced.bee.functional.dgs.config -import com.beeproduced.result.dgs.aspect.AroundDgsDataAspect -import com.beeproduced.result.dgs.aspect.DefaultAroundDgsDataAspect -import com.beeproduced.result.dgs.handler.AspectExceptionHandler +import com.beeproduced.bee.functional.dgs.aspect.AroundDgsDataAspect +import com.beeproduced.bee.functional.dgs.aspect.DefaultAroundDgsDataAspect +import com.beeproduced.bee.functional.dgs.handler.AspectExceptionHandler import graphql.execution.DataFetcherExceptionHandler import org.springframework.context.annotation.Bean import org.springframework.context.annotation.EnableAspectJAutoProxy @@ -26,12 +26,12 @@ abstract class DgsErrorHandlingConfiguration { } @Bean - open fun createDataFetcherExceptionHandler(): DataFetcherExceptionHandler { + open fun beeFunctionalDgsDataFetcherExceptionHandler(): DataFetcherExceptionHandler { return AspectExceptionHandler() } @Bean - open fun createAspect(): AroundDgsDataAspect { + open fun beeFunctionalDgsAspect(): AroundDgsDataAspect { return DefaultAroundDgsDataAspect() } } diff --git a/bee.functional/src/dgs/kotlin/com/beeproduced/result/dgs/data/fetcher/DataFetcherErrThrower.kt b/bee.functional/src/dgs/kotlin/com/beeproduced/bee/functional/dgs/fetcher/DataFetcherErrThrower.kt similarity index 78% rename from bee.functional/src/dgs/kotlin/com/beeproduced/result/dgs/data/fetcher/DataFetcherErrThrower.kt rename to bee.functional/src/dgs/kotlin/com/beeproduced/bee/functional/dgs/fetcher/DataFetcherErrThrower.kt index da3e515..f6e6507 100644 --- a/bee.functional/src/dgs/kotlin/com/beeproduced/result/dgs/data/fetcher/DataFetcherErrThrower.kt +++ b/bee.functional/src/dgs/kotlin/com/beeproduced/bee/functional/dgs/fetcher/DataFetcherErrThrower.kt @@ -1,4 +1,4 @@ -package com.beeproduced.result.dgs.data.fetcher +package com.beeproduced.bee.functional.dgs.fetcher import graphql.execution.DataFetcherResult diff --git a/bee.functional/src/dgs/kotlin/com/beeproduced/result/dgs/data/fetcher/DataFetcherResult.kt b/bee.functional/src/dgs/kotlin/com/beeproduced/bee/functional/dgs/fetcher/DataFetcherResult.kt similarity index 97% rename from bee.functional/src/dgs/kotlin/com/beeproduced/result/dgs/data/fetcher/DataFetcherResult.kt rename to bee.functional/src/dgs/kotlin/com/beeproduced/bee/functional/dgs/fetcher/DataFetcherResult.kt index 43bdd1e..c64050b 100644 --- a/bee.functional/src/dgs/kotlin/com/beeproduced/result/dgs/data/fetcher/DataFetcherResult.kt +++ b/bee.functional/src/dgs/kotlin/com/beeproduced/bee/functional/dgs/fetcher/DataFetcherResult.kt @@ -1,6 +1,6 @@ @file:Suppress("FunctionName") -package com.beeproduced.result.dgs.data.fetcher +package com.beeproduced.bee.functional.dgs.fetcher import com.netflix.graphql.types.errors.TypedGraphQLError import graphql.execution.DataFetcherResult diff --git a/bee.functional/src/dgs/kotlin/com/beeproduced/result/dgs/data/fetcher/TypedGraphlQLErrorExtensions.kt b/bee.functional/src/dgs/kotlin/com/beeproduced/bee/functional/dgs/fetcher/TypedGraphlQLErrorExtensions.kt similarity index 93% rename from bee.functional/src/dgs/kotlin/com/beeproduced/result/dgs/data/fetcher/TypedGraphlQLErrorExtensions.kt rename to bee.functional/src/dgs/kotlin/com/beeproduced/bee/functional/dgs/fetcher/TypedGraphlQLErrorExtensions.kt index 7547cc2..d40f8e8 100644 --- a/bee.functional/src/dgs/kotlin/com/beeproduced/result/dgs/data/fetcher/TypedGraphlQLErrorExtensions.kt +++ b/bee.functional/src/dgs/kotlin/com/beeproduced/bee/functional/dgs/fetcher/TypedGraphlQLErrorExtensions.kt @@ -1,4 +1,4 @@ -package com.beeproduced.result.dgs.data.fetcher +package com.beeproduced.bee.functional.dgs.fetcher import com.netflix.graphql.types.errors.ErrorType import com.netflix.graphql.types.errors.TypedGraphQLError diff --git a/bee.functional/src/dgs/kotlin/com/beeproduced/result/dgs/handler/AspectExceptionHandler.kt b/bee.functional/src/dgs/kotlin/com/beeproduced/bee/functional/dgs/handler/AspectExceptionHandler.kt similarity index 90% rename from bee.functional/src/dgs/kotlin/com/beeproduced/result/dgs/handler/AspectExceptionHandler.kt rename to bee.functional/src/dgs/kotlin/com/beeproduced/bee/functional/dgs/handler/AspectExceptionHandler.kt index cab7681..7b38752 100644 --- a/bee.functional/src/dgs/kotlin/com/beeproduced/result/dgs/handler/AspectExceptionHandler.kt +++ b/bee.functional/src/dgs/kotlin/com/beeproduced/bee/functional/dgs/handler/AspectExceptionHandler.kt @@ -1,7 +1,7 @@ -package com.beeproduced.result.dgs.handler +package com.beeproduced.bee.functional.dgs.handler -import com.beeproduced.result.dgs.data.fetcher.extendWithHandlerParameters -import com.beeproduced.result.dgs.data.fetcher.DataFetcherErrThrower +import com.beeproduced.bee.functional.dgs.fetcher.extendWithHandlerParameters +import com.beeproduced.bee.functional.dgs.fetcher.DataFetcherErrThrower import com.netflix.graphql.dgs.exceptions.DefaultDataFetcherExceptionHandler import com.netflix.graphql.types.errors.TypedGraphQLError import graphql.execution.DataFetcherExceptionHandler diff --git a/bee.functional/src/dgs/kotlin/com/beeproduced/result/extensions/dgs/KotlinResultExtensions.kt b/bee.functional/src/dgs/kotlin/com/beeproduced/bee/functional/extensions/com/github/michaelbull/result/KotlinResultDataFetcherExtensions.kt similarity index 76% rename from bee.functional/src/dgs/kotlin/com/beeproduced/result/extensions/dgs/KotlinResultExtensions.kt rename to bee.functional/src/dgs/kotlin/com/beeproduced/bee/functional/extensions/com/github/michaelbull/result/KotlinResultDataFetcherExtensions.kt index 07df892..ec55210 100644 --- a/bee.functional/src/dgs/kotlin/com/beeproduced/result/extensions/dgs/KotlinResultExtensions.kt +++ b/bee.functional/src/dgs/kotlin/com/beeproduced/bee/functional/extensions/com/github/michaelbull/result/KotlinResultDataFetcherExtensions.kt @@ -1,9 +1,9 @@ -package com.beeproduced.result.extensions.dgs +package com.beeproduced.bee.functional.extensions.com.github.michaelbull.result -import com.beeproduced.result.dgs.data.fetcher.DataFetcher -import com.beeproduced.result.errors.AppError -import com.beeproduced.result.errors.BadRequestError -import com.beeproduced.result.errors.InternalAppError +import com.beeproduced.bee.functional.dgs.fetcher.DataFetcher +import com.beeproduced.bee.functional.result.errors.AppError +import com.beeproduced.bee.functional.result.errors.BadRequestError +import com.beeproduced.bee.functional.result.errors.InternalAppError import com.github.michaelbull.result.Err import com.github.michaelbull.result.Ok import com.github.michaelbull.result.Result diff --git a/bee.functional/src/dgs/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/bee.functional/src/dgs/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..53e59b3 --- /dev/null +++ b/bee.functional/src/dgs/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +com.beeproduced.bee.functional.dgs.autoconfig.BeeFunctionalDgsAutoConfiguration \ No newline at end of file diff --git a/bee.functional/src/main/kotlin/com/beeproduced/result/extensions/errors/And.kt b/bee.functional/src/main/kotlin/com/beeproduced/bee/functional/extensions/com/github/michaelbull/result/And.kt similarity index 82% rename from bee.functional/src/main/kotlin/com/beeproduced/result/extensions/errors/And.kt rename to bee.functional/src/main/kotlin/com/beeproduced/bee/functional/extensions/com/github/michaelbull/result/And.kt index 1bf6a09..b00d97e 100644 --- a/bee.functional/src/main/kotlin/com/beeproduced/result/extensions/errors/And.kt +++ b/bee.functional/src/main/kotlin/com/beeproduced/bee/functional/extensions/com/github/michaelbull/result/And.kt @@ -1,6 +1,6 @@ -package com.beeproduced.result.extensions.errors +package com.beeproduced.bee.functional.extensions.com.github.michaelbull.result -import com.beeproduced.result.errors.AppError +import com.beeproduced.bee.functional.result.errors.AppError import com.github.michaelbull.result.Err import com.github.michaelbull.result.Ok import com.github.michaelbull.result.Result diff --git a/bee.functional/src/main/kotlin/com/beeproduced/result/extensions/errors/Map.kt b/bee.functional/src/main/kotlin/com/beeproduced/bee/functional/extensions/com/github/michaelbull/result/Map.kt similarity index 86% rename from bee.functional/src/main/kotlin/com/beeproduced/result/extensions/errors/Map.kt rename to bee.functional/src/main/kotlin/com/beeproduced/bee/functional/extensions/com/github/michaelbull/result/Map.kt index 98d3519..2638555 100644 --- a/bee.functional/src/main/kotlin/com/beeproduced/result/extensions/errors/Map.kt +++ b/bee.functional/src/main/kotlin/com/beeproduced/bee/functional/extensions/com/github/michaelbull/result/Map.kt @@ -1,4 +1,4 @@ -package com.beeproduced.result.extensions.errors +package com.beeproduced.bee.functional.extensions.com.github.michaelbull.result import com.github.michaelbull.result.Result import com.github.michaelbull.result.Err @@ -6,10 +6,10 @@ import com.github.michaelbull.result.Ok import kotlin.contracts.ExperimentalContracts import kotlin.contracts.InvocationKind import kotlin.contracts.contract -import com.beeproduced.result.errors.AppError -import com.beeproduced.result.errors.BadRequestError -import com.beeproduced.result.errors.InternalAppError -import com.beeproduced.result.errors.ResultError +import com.beeproduced.bee.functional.result.errors.AppError +import com.beeproduced.bee.functional.result.errors.BadRequestError +import com.beeproduced.bee.functional.result.errors.InternalAppError +import com.beeproduced.bee.functional.result.errors.ResultError /** * diff --git a/bee.functional/src/main/kotlin/com/beeproduced/result/extensions/functional/MapFunctional.kt b/bee.functional/src/main/kotlin/com/beeproduced/bee/functional/extensions/com/github/michaelbull/result/MapFunctional.kt similarity index 97% rename from bee.functional/src/main/kotlin/com/beeproduced/result/extensions/functional/MapFunctional.kt rename to bee.functional/src/main/kotlin/com/beeproduced/bee/functional/extensions/com/github/michaelbull/result/MapFunctional.kt index 8702789..558f138 100644 --- a/bee.functional/src/main/kotlin/com/beeproduced/result/extensions/functional/MapFunctional.kt +++ b/bee.functional/src/main/kotlin/com/beeproduced/bee/functional/extensions/com/github/michaelbull/result/MapFunctional.kt @@ -1,6 +1,6 @@ -package com.beeproduced.result.extensions.functional +package com.beeproduced.bee.functional.extensions.com.github.michaelbull.result -import com.beeproduced.result.errors.AppError +import com.beeproduced.bee.functional.result.errors.AppError import com.github.michaelbull.result.* import kotlin.contracts.ExperimentalContracts import kotlin.contracts.InvocationKind diff --git a/bee.functional/src/main/kotlin/com/beeproduced/result/extensions/errors/Unsafe.kt b/bee.functional/src/main/kotlin/com/beeproduced/bee/functional/extensions/com/github/michaelbull/result/Unsafe.kt similarity index 80% rename from bee.functional/src/main/kotlin/com/beeproduced/result/extensions/errors/Unsafe.kt rename to bee.functional/src/main/kotlin/com/beeproduced/bee/functional/extensions/com/github/michaelbull/result/Unsafe.kt index bba888a..b364848 100644 --- a/bee.functional/src/main/kotlin/com/beeproduced/result/extensions/errors/Unsafe.kt +++ b/bee.functional/src/main/kotlin/com/beeproduced/bee/functional/extensions/com/github/michaelbull/result/Unsafe.kt @@ -1,6 +1,6 @@ -package com.beeproduced.result.extensions.errors +package com.beeproduced.bee.functional.extensions.com.github.michaelbull.result -import com.beeproduced.result.errors.InternalAppError +import com.beeproduced.bee.functional.result.errors.InternalAppError import com.github.michaelbull.result.Err import com.github.michaelbull.result.Ok import com.github.michaelbull.result.Result diff --git a/bee.functional/src/main/kotlin/com/beeproduced/result/AppResult.kt b/bee.functional/src/main/kotlin/com/beeproduced/bee/functional/result/AppResult.kt similarity index 59% rename from bee.functional/src/main/kotlin/com/beeproduced/result/AppResult.kt rename to bee.functional/src/main/kotlin/com/beeproduced/bee/functional/result/AppResult.kt index 86730a4..c5fd495 100644 --- a/bee.functional/src/main/kotlin/com/beeproduced/result/AppResult.kt +++ b/bee.functional/src/main/kotlin/com/beeproduced/bee/functional/result/AppResult.kt @@ -1,6 +1,6 @@ -package com.beeproduced.result +package com.beeproduced.bee.functional.result -import com.beeproduced.result.errors.AppError +import com.beeproduced.bee.functional.result.errors.AppError import com.github.michaelbull.result.Result /** diff --git a/bee.functional/src/main/kotlin/com/beeproduced/result/errors/Error.kt b/bee.functional/src/main/kotlin/com/beeproduced/bee/functional/result/errors/Error.kt similarity index 98% rename from bee.functional/src/main/kotlin/com/beeproduced/result/errors/Error.kt rename to bee.functional/src/main/kotlin/com/beeproduced/bee/functional/result/errors/Error.kt index 7d77fee..69eb978 100644 --- a/bee.functional/src/main/kotlin/com/beeproduced/result/errors/Error.kt +++ b/bee.functional/src/main/kotlin/com/beeproduced/bee/functional/result/errors/Error.kt @@ -1,4 +1,4 @@ -package com.beeproduced.result.errors +package com.beeproduced.bee.functional.result.errors /** * Inspired by diff --git a/bee.functional/src/main/kotlin/com/beeproduced/result/errors/deprecated/AnyError.kt b/bee.functional/src/main/kotlin/com/beeproduced/result/errors/deprecated/AnyError.kt deleted file mode 100644 index 7f4d499..0000000 --- a/bee.functional/src/main/kotlin/com/beeproduced/result/errors/deprecated/AnyError.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.beeproduced.result.errors.deprecated - -/** - * - * - * @author Kacper Urbaniec - * @version 2022-03-10 - */ -@Deprecated("Use new error handling") -class AnyError( - val any: Any, - description: String? = null, - override val source: AppError? = null -) : AppError { - override val description: String = description ?: any.toString() -} diff --git a/bee.functional/src/main/kotlin/com/beeproduced/result/errors/deprecated/AppError.kt b/bee.functional/src/main/kotlin/com/beeproduced/result/errors/deprecated/AppError.kt deleted file mode 100644 index f8beb32..0000000 --- a/bee.functional/src/main/kotlin/com/beeproduced/result/errors/deprecated/AppError.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.beeproduced.result.errors.deprecated - -/** - * - * - * @author Kacper Urbaniec - * @version 2022-01-29 - */ -@Deprecated("Use new error handling") -interface AppError { - val description: String - val source: AppError? - // val exception: Exception? TODO: Discuss if this should be introduced, leads to transparten error handling when using java functions -} diff --git a/bee.functional/src/main/kotlin/com/beeproduced/result/errors/deprecated/ExceptionError.kt b/bee.functional/src/main/kotlin/com/beeproduced/result/errors/deprecated/ExceptionError.kt deleted file mode 100644 index b4cf648..0000000 --- a/bee.functional/src/main/kotlin/com/beeproduced/result/errors/deprecated/ExceptionError.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.beeproduced.result.errors.deprecated - -/** - * - * - * @author Kacper Urbaniec - * @version 2022-01-29 - */ -@Deprecated("Use new error handling") -class ExceptionError( - val exception: Throwable, - description: String? = null, - override val source: AppError? = null -) : AppError { - override val description: String = description ?: exception.stackTraceToString() -} diff --git a/bee.functional/src/main/kotlin/com/beeproduced/result/errors/deprecated/util/ErrorTestingUtil.kt b/bee.functional/src/main/kotlin/com/beeproduced/result/errors/deprecated/util/ErrorTestingUtil.kt deleted file mode 100644 index 90b554f..0000000 --- a/bee.functional/src/main/kotlin/com/beeproduced/result/errors/deprecated/util/ErrorTestingUtil.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.beeproduced.result.errors.deprecated.util - -import com.beeproduced.result.errors.deprecated.AppError - -// inline should result in better readability during test -inline fun assertError(expected: AppError, actual: AppError) { - assert(expected::class == actual::class) { "Types do not match, expected: ${expected::class} - actual: ${actual::class}" } - var curExcpected: AppError = expected - var curActual: AppError = actual - while (curExcpected.source != null) { - curExcpected.source?.let { - assert(it::class == actual.source!!::class) { "Embedded types do not match, expected: ${it::class} - actual: ${actual.source!!::class}" } - curExcpected = it - curActual = actual.source!! - } - } -} diff --git a/bee.functional/src/persistent/kotlin/com/beeproduced/result/jpa/extensions/TransactionTemplate.kt b/bee.functional/src/persistent/kotlin/com/beeproduced/bee/functional/extensions/org/springframework/transaction/support/TransactionTemplate.kt similarity index 87% rename from bee.functional/src/persistent/kotlin/com/beeproduced/result/jpa/extensions/TransactionTemplate.kt rename to bee.functional/src/persistent/kotlin/com/beeproduced/bee/functional/extensions/org/springframework/transaction/support/TransactionTemplate.kt index d96ff1c..3834a1c 100644 --- a/bee.functional/src/persistent/kotlin/com/beeproduced/result/jpa/extensions/TransactionTemplate.kt +++ b/bee.functional/src/persistent/kotlin/com/beeproduced/bee/functional/extensions/org/springframework/transaction/support/TransactionTemplate.kt @@ -1,11 +1,12 @@ -package com.beeproduced.result.jpa.extensions +package com.beeproduced.bee.functional.extensions.org.springframework.transaction.support -import com.beeproduced.result.errors.AppError -import com.beeproduced.result.errors.InternalAppError +import com.beeproduced.bee.functional.result.errors.AppError +import com.beeproduced.bee.functional.result.errors.InternalAppError import com.github.michaelbull.result.Err import com.github.michaelbull.result.Result import com.github.michaelbull.result.getOrElse import com.github.michaelbull.result.onFailure +import org.slf4j.Logger import org.slf4j.LoggerFactory import org.springframework.transaction.TransactionStatus import org.springframework.transaction.support.TransactionTemplate @@ -31,7 +32,8 @@ open class TransactionError( skipStackTraceElements, limitStackTraceElements ) -val logger = LoggerFactory.getLogger(TransactionTemplate::class.java) + +val logger: Logger = LoggerFactory.getLogger(TransactionTemplate::class.java) @OptIn(ExperimentalContracts::class) inline fun TransactionTemplate.executeToResult( diff --git a/bee.functional/src/persistent/kotlin/com/beeproduced/result/jpa/transactional/TransactionalResult.kt b/bee.functional/src/persistent/kotlin/com/beeproduced/bee/functional/persistent/transactional/TransactionalResult.kt similarity index 98% rename from bee.functional/src/persistent/kotlin/com/beeproduced/result/jpa/transactional/TransactionalResult.kt rename to bee.functional/src/persistent/kotlin/com/beeproduced/bee/functional/persistent/transactional/TransactionalResult.kt index 5f7f612..22330c9 100644 --- a/bee.functional/src/persistent/kotlin/com/beeproduced/result/jpa/transactional/TransactionalResult.kt +++ b/bee.functional/src/persistent/kotlin/com/beeproduced/bee/functional/persistent/transactional/TransactionalResult.kt @@ -1,4 +1,4 @@ -package com.beeproduced.result.jpa.transactional +package com.beeproduced.bee.functional.persistent.transactional import org.springframework.core.annotation.AliasFor import org.springframework.transaction.TransactionDefinition diff --git a/bee.functional/src/persistent/kotlin/com/beeproduced/result/jpa/transactional/TransactionalResultAspect.kt b/bee.functional/src/persistent/kotlin/com/beeproduced/bee/functional/persistent/transactional/TransactionalResultAspect.kt similarity index 87% rename from bee.functional/src/persistent/kotlin/com/beeproduced/result/jpa/transactional/TransactionalResultAspect.kt rename to bee.functional/src/persistent/kotlin/com/beeproduced/bee/functional/persistent/transactional/TransactionalResultAspect.kt index e0be02e..9d83ac2 100644 --- a/bee.functional/src/persistent/kotlin/com/beeproduced/result/jpa/transactional/TransactionalResultAspect.kt +++ b/bee.functional/src/persistent/kotlin/com/beeproduced/bee/functional/persistent/transactional/TransactionalResultAspect.kt @@ -1,7 +1,7 @@ -package com.beeproduced.result.jpa.transactional +package com.beeproduced.bee.functional.persistent.transactional -import com.beeproduced.result.errors.AppError -import com.beeproduced.result.errors.InternalAppError +import com.beeproduced.bee.functional.result.errors.AppError +import com.beeproduced.bee.functional.result.errors.InternalAppError import com.github.michaelbull.result.Err import com.github.michaelbull.result.Result import com.github.michaelbull.result.onFailure @@ -25,7 +25,7 @@ class TransactionalResultAspect( private val context: ApplicationContext ) { private val logger = LoggerFactory.getLogger(TransactionalResultAspect::class.java) - @Pointcut("execution(@com.beeproduced.result.jpa.transactional.TransactionalResult com.github.michaelbull.result.Result *(..))") + @Pointcut("execution(@com.beeproduced.bee.functional.persistent.transactional.TransactionalResult com.github.michaelbull.result.Result *(..))") fun transactionalMethodReturningResult() = Unit @Suppress("UNCHECKED_CAST") diff --git a/bee.functional/src/test/kotlin/com/beeproduced/result/ErrorTest.kt b/bee.functional/src/test/kotlin/com/beeproduced/bee/functional/ErrorTest.kt similarity index 96% rename from bee.functional/src/test/kotlin/com/beeproduced/result/ErrorTest.kt rename to bee.functional/src/test/kotlin/com/beeproduced/bee/functional/ErrorTest.kt index 41792d1..2c98248 100644 --- a/bee.functional/src/test/kotlin/com/beeproduced/result/ErrorTest.kt +++ b/bee.functional/src/test/kotlin/com/beeproduced/bee/functional/ErrorTest.kt @@ -1,11 +1,11 @@ -package com.beeproduced.result - -import com.beeproduced.result.errors.BadRequestError -import com.beeproduced.result.errors.ExceptionError -import com.beeproduced.result.errors.InternalAppError -import com.beeproduced.result.errors.ResultError -import com.beeproduced.result.extensions.errors.mapBadRequestError -import com.beeproduced.result.extensions.errors.mapInternalError +package com.beeproduced.bee.functional + +import com.beeproduced.bee.functional.result.errors.BadRequestError +import com.beeproduced.bee.functional.result.errors.ExceptionError +import com.beeproduced.bee.functional.result.errors.InternalAppError +import com.beeproduced.bee.functional.result.errors.ResultError +import com.beeproduced.bee.functional.extensions.com.github.michaelbull.result.mapBadRequestError +import com.beeproduced.bee.functional.extensions.com.github.michaelbull.result.mapInternalError import com.github.michaelbull.result.Err import com.github.michaelbull.result.getErrorOrElse import org.junit.jupiter.api.Test diff --git a/bee.functional/src/test/kotlin/com/beeproduced/result/MapTest.kt b/bee.functional/src/test/kotlin/com/beeproduced/bee/functional/MapTest.kt similarity index 90% rename from bee.functional/src/test/kotlin/com/beeproduced/result/MapTest.kt rename to bee.functional/src/test/kotlin/com/beeproduced/bee/functional/MapTest.kt index bc82010..50f2e06 100644 --- a/bee.functional/src/test/kotlin/com/beeproduced/result/MapTest.kt +++ b/bee.functional/src/test/kotlin/com/beeproduced/bee/functional/MapTest.kt @@ -1,7 +1,7 @@ -package com.beeproduced.result +package com.beeproduced.bee.functional -import com.beeproduced.result.extensions.functional.mapWithPair -import com.beeproduced.result.extensions.functional.mapWithTriple +import com.beeproduced.bee.functional.extensions.com.github.michaelbull.result.mapWithPair +import com.beeproduced.bee.functional.extensions.com.github.michaelbull.result.mapWithTriple import com.github.michaelbull.result.Ok import com.github.michaelbull.result.getOrThrow import com.github.michaelbull.result.map diff --git a/example/application/src/main/kotlin/com/beeproduced/example/application/DataGenerator.kt b/example/application/src/main/kotlin/com/beeproduced/example/application/DataGenerator.kt index 388ffcf..338170e 100644 --- a/example/application/src/main/kotlin/com/beeproduced/example/application/DataGenerator.kt +++ b/example/application/src/main/kotlin/com/beeproduced/example/application/DataGenerator.kt @@ -2,7 +2,7 @@ package com.beeproduced.example.application import com.beeproduced.bee.persistent.selection.SimpleSelection import com.beeproduced.bee.buzz.manager.EventManager -import com.beeproduced.result.AppResult +import com.beeproduced.bee.functional.result.AppResult import com.beeproduced.service.media.entities.Film import com.beeproduced.service.media.entities.input.CreateFilmInput import com.beeproduced.service.media.events.CreateFilm diff --git a/example/application/src/main/kotlin/com/beeproduced/example/application/configuration/DgsConfiguration.kt b/example/application/src/main/kotlin/com/beeproduced/example/application/configuration/DgsConfiguration.kt index 660d69a..af0f0d1 100644 --- a/example/application/src/main/kotlin/com/beeproduced/example/application/configuration/DgsConfiguration.kt +++ b/example/application/src/main/kotlin/com/beeproduced/example/application/configuration/DgsConfiguration.kt @@ -1,28 +1,16 @@ package com.beeproduced.example.application.configuration -import com.beeproduced.result.dgs.DgsErrorHandlingConfiguration import com.netflix.graphql.dgs.DgsScalar import graphql.language.StringValue import graphql.schema.Coercing import graphql.schema.CoercingParseLiteralException import graphql.schema.CoercingParseValueException import graphql.schema.CoercingSerializeException -import org.springframework.context.annotation.Configuration -import org.springframework.context.annotation.EnableAspectJAutoProxy import java.time.Instant import java.time.ZoneId import java.time.ZoneOffset import java.time.format.DateTimeFormatter -/** - * - * - * @author Kacper Urbaniec - * @version 2022-10-10 - */ -@Configuration -@EnableAspectJAutoProxy -class DgsConfiguration : DgsErrorHandlingConfiguration() /** * Based on: https://netflix.github.io/dgs/scalars/ diff --git a/example/application/src/main/kotlin/com/beeproduced/example/application/configuration/LibrarySetupConfiguration.kt b/example/application/src/main/kotlin/com/beeproduced/example/application/configuration/LibrarySetupConfiguration.kt deleted file mode 100644 index acead30..0000000 --- a/example/application/src/main/kotlin/com/beeproduced/example/application/configuration/LibrarySetupConfiguration.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.beeproduced.example.application.configuration - -import org.springframework.context.annotation.Configuration -import org.springframework.context.annotation.EnableAspectJAutoProxy - -@EnableAspectJAutoProxy -@Configuration -class LibrarySetupConfiguration \ No newline at end of file diff --git a/example/application/src/main/kotlin/com/beeproduced/example/application/media/service/MediaController.kt b/example/application/src/main/kotlin/com/beeproduced/example/application/media/service/MediaController.kt index 90a4b28..b48ea46 100644 --- a/example/application/src/main/kotlin/com/beeproduced/example/application/media/service/MediaController.kt +++ b/example/application/src/main/kotlin/com/beeproduced/example/application/media/service/MediaController.kt @@ -6,7 +6,7 @@ import com.beeproduced.example.application.graphql.dto.EditFilm import com.beeproduced.example.application.graphql.dto.Foo import com.beeproduced.example.application.organisation.service.setContext import com.beeproduced.bee.buzz.manager.EventManager -import com.beeproduced.result.extensions.dgs.getDataFetcher +import com.beeproduced.bee.functional.extensions.com.github.michaelbull.result.getDataFetcher import com.beeproduced.service.media.events.CreateFilm import com.beeproduced.service.media.events.GetRecentlyAddedFilms import com.beeproduced.service.media.events.UpdateFilm diff --git a/example/application/src/main/kotlin/com/beeproduced/example/application/organisation/service/OrganisationController.kt b/example/application/src/main/kotlin/com/beeproduced/example/application/organisation/service/OrganisationController.kt index a346b2b..191eff8 100644 --- a/example/application/src/main/kotlin/com/beeproduced/example/application/organisation/service/OrganisationController.kt +++ b/example/application/src/main/kotlin/com/beeproduced/example/application/organisation/service/OrganisationController.kt @@ -2,7 +2,7 @@ package com.beeproduced.example.application.organisation.service import com.beeproduced.bee.persistent.dgs.selection.toDataSelection import com.beeproduced.bee.buzz.manager.EventManager -import com.beeproduced.result.extensions.dgs.getDataFetcher +import com.beeproduced.bee.functional.extensions.com.github.michaelbull.result.getDataFetcher import com.beeproduced.service.organisation.events.GetAllCompanies import com.beeproduced.service.organisation.events.GetAllPersons import com.beeproduced.utils.logFor diff --git a/example/service.media/src/main/kotlin/com/beeproduced/service/media/film.feature/FilmEvents.kt b/example/service.media/src/main/kotlin/com/beeproduced/service/media/film.feature/FilmEvents.kt index a47c624..72a253f 100644 --- a/example/service.media/src/main/kotlin/com/beeproduced/service/media/film.feature/FilmEvents.kt +++ b/example/service.media/src/main/kotlin/com/beeproduced/service/media/film.feature/FilmEvents.kt @@ -3,7 +3,7 @@ package com.beeproduced.service.media.film.feature import com.beeproduced.bee.persistent.jpa.repository.extensions.PaginationResult import com.beeproduced.bee.buzz.manager.EventManager import com.beeproduced.bee.buzz.requestHandler -import com.beeproduced.result.AppResult +import com.beeproduced.bee.functional.result.AppResult import com.beeproduced.service.media.entities.Film import com.beeproduced.service.media.events.CreateFilm import com.beeproduced.service.media.events.GetAllFilms diff --git a/example/service.media/src/main/kotlin/com/beeproduced/service/media/film.feature/FilmService.kt b/example/service.media/src/main/kotlin/com/beeproduced/service/media/film.feature/FilmService.kt index 591f0fc..15ddca8 100644 --- a/example/service.media/src/main/kotlin/com/beeproduced/service/media/film.feature/FilmService.kt +++ b/example/service.media/src/main/kotlin/com/beeproduced/service/media/film.feature/FilmService.kt @@ -3,10 +3,10 @@ package com.beeproduced.service.media.film.feature import com.beeproduced.bee.persistent.jpa.repository.extensions.PaginationResult import com.beeproduced.bee.persistent.selection.DataSelection import com.beeproduced.bee.buzz.manager.EventManager -import com.beeproduced.result.AppResult -import com.beeproduced.result.errors.BadRequestError -import com.beeproduced.result.extensions.errors.andThenOnSuccess -import com.beeproduced.result.jpa.transactional.TransactionalResult +import com.beeproduced.bee.functional.result.AppResult +import com.beeproduced.bee.functional.result.errors.BadRequestError +import com.beeproduced.bee.functional.extensions.com.github.michaelbull.result.andThenOnSuccess +import com.beeproduced.bee.functional.persistent.transactional.TransactionalResult import com.beeproduced.service.media.entities.Film import com.beeproduced.service.media.entities.FilmId import com.beeproduced.service.media.entities.input.CreateFilmInput diff --git a/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/address/feature/AddressService.kt b/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/address/feature/AddressService.kt index 20dae47..197f15d 100644 --- a/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/address/feature/AddressService.kt +++ b/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/address/feature/AddressService.kt @@ -1,7 +1,7 @@ package com.beeproduced.service.organisation.address.feature -import com.beeproduced.result.AppResult -import com.beeproduced.result.jpa.transactional.TransactionalResult +import com.beeproduced.bee.functional.result.AppResult +import com.beeproduced.bee.functional.persistent.transactional.TransactionalResult import com.beeproduced.service.organisation.entities.Address import com.beeproduced.service.organisation.entities.input.CreateAddressInput import com.beeproduced.utils.logFor diff --git a/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/company/feature/CompanyEvents.kt b/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/company/feature/CompanyEvents.kt index 5b7070d..057b260 100644 --- a/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/company/feature/CompanyEvents.kt +++ b/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/company/feature/CompanyEvents.kt @@ -2,7 +2,7 @@ package com.beeproduced.service.organisation.company.feature import com.beeproduced.bee.buzz.manager.EventManager import com.beeproduced.bee.buzz.requestHandler -import com.beeproduced.result.AppResult +import com.beeproduced.bee.functional.result.AppResult import com.beeproduced.service.organisation.entities.Company import com.beeproduced.service.organisation.events.CompaniesExist import com.beeproduced.service.organisation.events.CreateCompany diff --git a/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/company/feature/CompanyService.kt b/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/company/feature/CompanyService.kt index aac9006..783f905 100644 --- a/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/company/feature/CompanyService.kt +++ b/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/company/feature/CompanyService.kt @@ -2,10 +2,10 @@ package com.beeproduced.service.organisation.company.feature import com.beeproduced.bee.persistent.selection.DataSelection import com.beeproduced.bee.persistent.selection.EmptySelection -import com.beeproduced.result.AppResult -import com.beeproduced.result.errors.BadRequestError -import com.beeproduced.result.extensions.functional.andThenToPair -import com.beeproduced.result.jpa.transactional.TransactionalResult +import com.beeproduced.bee.functional.result.AppResult +import com.beeproduced.bee.functional.result.errors.BadRequestError +import com.beeproduced.bee.functional.extensions.com.github.michaelbull.result.andThenToPair +import com.beeproduced.bee.functional.persistent.transactional.TransactionalResult import com.beeproduced.service.organisation.address.feature.AddressService import com.beeproduced.service.organisation.entities.* import com.beeproduced.service.organisation.entities.input.CreateAddressInput diff --git a/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/person/feature/PersonEvents.kt b/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/person/feature/PersonEvents.kt index 8521d4f..9e3e6d4 100644 --- a/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/person/feature/PersonEvents.kt +++ b/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/person/feature/PersonEvents.kt @@ -2,7 +2,7 @@ package com.beeproduced.service.organisation.person.feature import com.beeproduced.bee.buzz.manager.EventManager import com.beeproduced.bee.buzz.requestHandler -import com.beeproduced.result.AppResult +import com.beeproduced.bee.functional.result.AppResult import com.beeproduced.service.organisation.entities.Person import com.beeproduced.service.organisation.events.* import com.beeproduced.service.organisation.utils.organisationAdapter diff --git a/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/person/feature/PersonService.kt b/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/person/feature/PersonService.kt index 6be1b52..e833cc7 100644 --- a/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/person/feature/PersonService.kt +++ b/example/service.organisation/src/main/kotlin/com/beeproduced/service/organisation/person/feature/PersonService.kt @@ -1,9 +1,9 @@ package com.beeproduced.service.organisation.person.feature import com.beeproduced.bee.persistent.selection.DataSelection -import com.beeproduced.result.AppResult -import com.beeproduced.result.errors.BadRequestError -import com.beeproduced.result.jpa.transactional.TransactionalResult +import com.beeproduced.bee.functional.result.AppResult +import com.beeproduced.bee.functional.result.errors.BadRequestError +import com.beeproduced.bee.functional.persistent.transactional.TransactionalResult import com.beeproduced.service.organisation.address.feature.AddressService import com.beeproduced.service.organisation.entities.Address import com.beeproduced.service.organisation.entities.Person From 87cad36d8c4d64b1c0c8fabade70c6af372426ad Mon Sep 17 00:00:00 2001 From: Kacper Urbaniec Date: Mon, 23 Oct 2023 18:15:24 +0200 Subject: [PATCH 6/9] Updated documentation --- README.md | 8 ++++---- bee.persistent/README.md | 39 ++++++++++++++++++++------------------- 2 files changed, 24 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index a7d9450..5fc223d 100644 --- a/README.md +++ b/README.md @@ -23,10 +23,10 @@ Extend DGS: Some changes are currently being made: -* `lib.data` +* `bee.persistent` Easier data handling for GraphQL + JPA, [documentation](./lib.data/README.md) -* `lib.result` - Functional kotlin bindings, integration with DGS & more -* `lib.events` +* `bee.functional` + Functional kotlin bindings, integration with DGS, `bee.persistent` & more +* `bee.buzz` Simple event manager based on the mediator pattern, based on C#'s [MediatR library](https://github.com/jbogard/MediatR) diff --git a/bee.persistent/README.md b/bee.persistent/README.md index b99c41a..44fb024 100644 --- a/bee.persistent/README.md +++ b/bee.persistent/README.md @@ -1,17 +1,18 @@
-

lib.data

+

bee.persistent

Easier data handling for GraphQL + JPA

+ ## 💡 Motivation * *Query what you need*: Automatic query translation from e.g. GraphQL * *Idiomatic*: Focus on idiomatic Kotlin (e.g. allow data classes) * *Functional*: Prefer immutable records & minimize side effects -But this comes at a cost by design: `lib.data`'s JPA flavour is more a sophisticated database mapping utility than a fully fletched ORM. +But this comes at a cost by design: `bee.persistent`'s JPA flavour is more a sophisticated database mapping utility than a fully fletched ORM. > Each approach has its advantages and disadvantages; it is therefore not surprising that Object-Relational Mapping is referred to as the [Vietnam of computer science](https://blog.codinghorror.com/object-relational-mapping-is-the-vietnam-of-computer-science/). There is probably no universally good solution, only compromises. @@ -19,13 +20,13 @@ But this comes at a cost by design: `lib.data`'s JPA flavour is more a sophistic ### Define Entities -If one has worked with JPA, the following will be familiar. `lib.data` is a JPA superset which ironically limits functionality by design. +If one has worked with JPA, the following will be familiar. `bee.persistent` is a JPA superset which ironically limits functionality by design. -> No JPA experience? Start with some [fundamentals](https://www.baeldung.com/jpa-entities) before continuing your `lib.data` journey! +> No JPA experience? Start with some [fundamentals](https://www.baeldung.com/jpa-entities) before continuing your `bee.persistent` journey! -In contrast to JPA one can use and is even encouraged to use data classes for entities. Immutability is not a problem for `lib.data` as all changes to entities are flushed at any step or [even directly mapped to database circumventing the persistence context](https://thorben-janssen.com/criteria-updatedelete-easy-way-to/). +In contrast to JPA one can use and is even encouraged to use data classes for entities. Immutability is not a problem for `bee.persistent` as all changes to entities are flushed at any step or [even directly mapped to database circumventing the persistence context](https://thorben-janssen.com/criteria-updatedelete-easy-way-to/). -However, there are some important gotchas that can be tolerated in JPA but not in `lib.data`: +However, there are some important gotchas that can be tolerated in JPA but not in `bee.persistent`: * Use `Set` instead of `List` for collections @@ -60,13 +61,13 @@ However, there are some important gotchas that can be tolerated in JPA but not i > ⚠️ Inheritance support is not verified / tested yet. -Also, all entities must implement the `DataEntity` interface to be compatible with `lib.data`. +Also, all entities must implement the `DataEntity` interface to be compatible with `bee.persistent`. > 🪧 This requirement may be lifted in the future. In view of this, a simple one-to-many association with a composite key can be modelled as follows. -> 🪧 The code is taken from the examples in the folder `lib.data` - `test`. +> 🪧 The code is taken from the examples in the folder `bee.persistent` - `test`. ```kotlin data class WorkId( @@ -139,7 +140,7 @@ data class WorkCollection( ### Create Repositories -`lib.data` uses custom repositories for data access and not standard ones like Spring Data's `CrudRepository`. +`bee.persistent` uses custom repositories for data access and not standard ones like Spring Data's `CrudRepository`. But no worries, they are quite comparable and easy to define. One major difference might be that JPA's entity manager has to be passed explicitly. This was introduced to easily implement support for multiple data sources with independent entity managers. Apart from that, one only has to specify the entity type and its id type as generic parameters. @@ -157,11 +158,11 @@ class WorkCollectionRepository( > ⚠️ Favour `@Component` over the `@Repository` annotation as the latter one can introduce unexpected side effects on non Spring Data repositories. -> ⚠️ Each entity in `lib.data` requires a repository even when it is not explicitly used. Without it, the internal metamodel of `lib.data` will be incomplete, which may lead to unexpected exceptions when the entity is referenced by another, for example by a relationship. +> ⚠️ Each entity in `bee.persistent` requires a repository even when it is not explicitly used. Without it, the internal metamodel of `bee.persistent` will be incomplete, which may lead to unexpected exceptions when the entity is referenced by another, for example by a relationship. ### Create Simple Queries -`lib.data`'s repository API is quite comparable to Spring Data's [`CrudRepository`](https://docs.spring.io/spring-data/data-commons/docs/current/api/org/springframework/data/repository/CrudRepository.html). A notable difference, however, is that there is no universal `save` method for persisting and updating; `lib.data` explicitly provides a `persist` method for entering new entities and an `update` method for the operation of the same name. +`bee.persistent`'s repository API is quite comparable to Spring Data's [`CrudRepository`](https://docs.spring.io/spring-data/data-commons/docs/current/api/org/springframework/data/repository/CrudRepository.html). A notable difference, however, is that there is no universal `save` method for persisting and updating; `bee.persistent` explicitly provides a `persist` method for entering new entities and an `update` method for the operation of the same name. ```kotlin var collectionId: Long = -1 @@ -191,7 +192,7 @@ assertEquals("Update!", workUpdate.txt) #### Fun with Selections or: Query within the Query -In JPA, relation properties marked with `FetchType.LAZY` are returned as proxies. When accessing a field or method of such a proxy, a database query is executed to retrieve the data for that entity. Since `lib.data` strives to minimise side effects, no proxies are returned in such cases, but a `null` value is returned. +In JPA, relation properties marked with `FetchType.LAZY` are returned as proxies. When accessing a field or method of such a proxy, a database query is executed to retrieve the data for that entity. Since `bee.persistent` strives to minimise side effects, no proxies are returned in such cases, but a `null` value is returned. ```kotlin var collectionId: Long = -1 @@ -206,11 +207,11 @@ val collection = collectionRepo.selectById(collectionId) println(collection.works) ``` -To load a lazy relation in `lib.data`, it must be explicitly mentioned in a *data selection*. Each select method takes an additional optional parameter of the `DataSelection` interface, which is a graph listing all the relations to be eagerly loaded for the query. +To load a lazy relation in `bee.persistent`, it must be explicitly mentioned in a *data selection*. Each select method takes an additional optional parameter of the `DataSelection` interface, which is a graph listing all the relations to be eagerly loaded for the query. -> 🪧 `lib.data` internally uses the [Jakarta Persistence Entity Graph](https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#fetching-strategies-dynamic-fetching-entity-graph), specifically a load graph, in combination with the Criteria API to achieve this functionality. Each data selection is converted into a load graph and passed as a query hint. +> 🪧 `bee.persistent` internally uses the [Jakarta Persistence Entity Graph](https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#fetching-strategies-dynamic-fetching-entity-graph), specifically a load graph, in combination with the Criteria API to achieve this functionality. Each data selection is converted into a load graph and passed as a query hint. -On default, all select methods default to `EmptySelection` which loads no relations. `lib.data` also features following `DataSelection` implementations: +On default, all select methods default to `EmptySelection` which loads no relations. `bee.persistent` also features following `DataSelection` implementations: * `SimpleSelection`: Graph of nested sets where relations to be loaded are marked with their property name @@ -242,7 +243,7 @@ println(collection.works) Most JPA implementations such as Hibernate provide Automatic Dirty checking whereby changes to a managed entity are automatically saved to the database when the session is flushed or the transaction is committed. -In `lib.data`, all entities are automatically detached after persistence. One reason for this is that the Criteria API bypasses the persistence context for update or delete operations, leaving managed entities in an inconsistent state. Also, queries to the Criteria API can reuse the entity cache, which can result in missing relationships that were explicitly marked in the load graph converted from a data selection. In summary, this means that in `lib.data` every entity is free of side effects; every operation must be performed explicitly. This should not be an obstacle, as `lib.data` recommends, in the spirit of immutable design, to perform operations with updated copies of an existing entities. +In `bee.persistent`, all entities are automatically detached after persistence. One reason for this is that the Criteria API bypasses the persistence context for update or delete operations, leaving managed entities in an inconsistent state. Also, queries to the Criteria API can reuse the entity cache, which can result in missing relationships that were explicitly marked in the load graph converted from a data selection. In summary, this means that in `bee.persistent` every entity is free of side effects; every operation must be performed explicitly. This should not be an obstacle, as `bee.persistent` recommends, in the spirit of immutable design, to perform operations with updated copies of an existing entities. When working with [kotlin result](https://github.com/michaelbull/kotlin-result) for error handling, one can use `@TransactionalResult` on methods that return `Result` to implicitly wrap method execution in a database transaction. This should be familiar if one has already used [`@Transactionl` from Spring Data](https://www.baeldung.com/transaction-configuration-with-jpa-and-spring); in fact, the `@TransactionalResult` API is based heavily on its Spring counterpart. @@ -258,7 +259,7 @@ However, there is a difference in how exceptions are handled. `@Transactional` o ### Model `m:n` Relations -In `lib.data` relations should be modelled explicitly therefore it is not advised to propagate (cascade) operations to related entities. In JPA one can persist an entity with included relation entities in one step, in `lib.data` each relation is inserted on its own via its own repository. +In `bee.persistent` relations should be modelled explicitly therefore it is not advised to propagate (cascade) operations to related entities. In JPA one can persist an entity with included relation entities in one step, in `bee.persistent` each relation is inserted on its own via its own repository. ```kotlin @Entity @@ -331,7 +332,7 @@ assertEquals(barId, foo1.bars?.first()?.id) ### Advanced Queries -In the previous examples, only simple, predefined operations were shown. It has also been mentioned that `lib.data` is built on top of the Criteria API, but no Criteria Queries have been shown so far. +In the previous examples, only simple, predefined operations were shown. It has also been mentioned that `bee.persistent` is built on top of the Criteria API, but no Criteria Queries have been shown so far. Repository operations that provide extensibility of Criteria Queries contain a parameter `dsl` that represents a lambda. User-defined queries can be inserted into these lambdas. @@ -443,7 +444,7 @@ A skip over can be of type `SkipOverOnce` & `SkipOverAll`. Prefer the latter one ### About `@OneToOne`, `@ManyToOne` and `FetchType.LAZY` -With `lib.data` pre Hibernate 6.X lazy loading for single entities was working as expected. But since migrating to Hibernate 6.X, it seems that this feature is not supported and/or working as intended. +With `bee.persistent` pre Hibernate 6.X lazy loading for single entities was working as expected. But since migrating to Hibernate 6.X, it seems that this feature is not supported and/or working as intended. The [Hibernate 6.1 documentation](https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#fetching-strategies) specifically notes to mark all associations lazy and to use dynamic fetching strategies for eagerness. From 121f47acbdd6bd81311785ef5f93b868567219d2 Mon Sep 17 00:00:00 2001 From: Kacper Urbaniec Date: Mon, 23 Oct 2023 18:50:20 +0200 Subject: [PATCH 7/9] `SimpleSelection` stores now optional type information --- .../dgs/selection/DgsGraphQLSelection.kt | 10 +++++++++- .../selection/FieldNodeDefinition.kt | 1 + .../persistent/selection/SimpleSelection.kt | 18 ++++++++++++++++-- .../beeproduced/bee/persistent/OneToOneTest.kt | 2 +- 4 files changed, 27 insertions(+), 4 deletions(-) diff --git a/bee.persistent/src/dgs/kotlin/com/beeproduced/bee/persistent/dgs/selection/DgsGraphQLSelection.kt b/bee.persistent/src/dgs/kotlin/com/beeproduced/bee/persistent/dgs/selection/DgsGraphQLSelection.kt index 95aa52a..1f11774 100644 --- a/bee.persistent/src/dgs/kotlin/com/beeproduced/bee/persistent/dgs/selection/DgsGraphQLSelection.kt +++ b/bee.persistent/src/dgs/kotlin/com/beeproduced/bee/persistent/dgs/selection/DgsGraphQLSelection.kt @@ -3,6 +3,8 @@ package com.beeproduced.bee.persistent.dgs.selection import com.beeproduced.bee.persistent.selection.DataSelection import com.beeproduced.bee.persistent.selection.FieldNodeDefinition import com.beeproduced.bee.persistent.selection.SimpleSelection +import com.beeproduced.bee.persistent.selection.SimpleSelection.Companion.substringBeforeOrNull +import graphql.schema.DataFetchingEnvironment import graphql.schema.DataFetchingFieldSelectionSet import graphql.schema.SelectedField @@ -20,8 +22,14 @@ fun DataFetchingFieldSelectionSet.toDataSelection(): DataSelection { return SimpleSelection(fields) } +fun DataFetchingEnvironment.toDataSelection(): DataSelection { + return selectionSet.toDataSelection() +} + private fun toDataSelection(node: SelectedField): FieldNodeDefinition { + val field = node.qualifiedName + val fieldType = node.fullyQualifiedName.substringBeforeOrNull(".") val immediateFields = node.selectionSet.immediateFields val nodeFields = if (immediateFields.isNullOrEmpty()) null @@ -29,6 +37,6 @@ private fun toDataSelection(node: SelectedField): FieldNodeDefinition { immediateFields.mapTo(HashSet()) { toDataSelection(it) } } - return SimpleSelection.FieldNode(field, nodeFields) + return SimpleSelection.TypedFiledNode(field, fieldType, nodeFields) } \ No newline at end of file diff --git a/bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/selection/FieldNodeDefinition.kt b/bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/selection/FieldNodeDefinition.kt index ea408ce..99083fa 100644 --- a/bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/selection/FieldNodeDefinition.kt +++ b/bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/selection/FieldNodeDefinition.kt @@ -8,5 +8,6 @@ package com.beeproduced.bee.persistent.selection */ interface FieldNodeDefinition { val field: String + val type: String? val fields: Set? } \ No newline at end of file diff --git a/bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/selection/SimpleSelection.kt b/bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/selection/SimpleSelection.kt index 2972ba4..07462b6 100644 --- a/bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/selection/SimpleSelection.kt +++ b/bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/selection/SimpleSelection.kt @@ -36,6 +36,11 @@ class SimpleSelection internal constructor( val osFieldGlobPattern = removeLeadingSlash(fieldGlobPattern) return FileSystems.getDefault().getPathMatcher("glob:$osFieldGlobPattern") } + + fun String.substringBeforeOrNull(delimiter: String): String? { + val index = indexOf(delimiter) + return if (index == -1) null else substring(0, index) + } } constructor(fields: Set, skips: Collection = emptyList()) : this( @@ -85,10 +90,19 @@ class SimpleSelection internal constructor( data class FieldNode( override val field: String, override val fields: Set? = null + ) : FieldNodeDefinition { + override val type: String? = null + } + + data class TypedFiledNode( + override val field: String, + override val type: String?, + override val fields: Set? = null ) : FieldNodeDefinition private data class MutableFieldNode( override val field: String, + override val type: String?, override var fields: MutableSet? = null ) : FieldNodeDefinition @@ -141,7 +155,7 @@ class SimpleSelection internal constructor( for (node in immediateFields) { val mutableNode = if (!immediateFieldsTmp.contains(node.field)) { - val mutableNode = MutableFieldNode(node.field) + val mutableNode = MutableFieldNode(node.field, node.type) immediateFieldsTmp[node.field] = mutableNode fieldsTmp[node.field] = mutableNode fieldGlobPathsTmp.add(mutableNode.field) @@ -180,7 +194,7 @@ class SimpleSelection internal constructor( val mutableFieldNode = if (fieldsTmp.contains(path)) { fieldsTmp.getValue(path) } else { - val currentNode = MutableFieldNode(node.field) + val currentNode = MutableFieldNode(node.field, node.type) fieldsTmp[path] = currentNode currentNode } as MutableFieldNode diff --git a/bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/OneToOneTest.kt b/bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/OneToOneTest.kt index af3454e..70f2a50 100644 --- a/bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/OneToOneTest.kt +++ b/bee.persistent/src/test/kotlin/com/beeproduced/bee/persistent/OneToOneTest.kt @@ -6,7 +6,7 @@ import com.beeproduced.bee.persistent.selection.SimpleSelection import com.beeproduced.bee.persistent.selection.SimpleSelection.FieldNode import com.beeproduced.bee.persistent.config.DummyApplication import com.beeproduced.bee.persistent.config.PersistenceConfiguration -import com.beeproduced.lib.data.one.to.many.* +import com.beeproduced.bee.persistent.one.to.many.* import com.beeproduced.bee.persistent.one.to.one.Branch import com.beeproduced.bee.persistent.one.to.one.BranchRepository import com.beeproduced.bee.persistent.one.to.one.Root From 3cbc9a8ca90dbf3423246ba4571113009d115aab Mon Sep 17 00:00:00 2001 From: Kacper Urbaniec Date: Mon, 23 Oct 2023 19:01:56 +0200 Subject: [PATCH 8/9] Implemented `typeSelect` that loads all type specific fields to a new selection --- .../dgs/selection/DgsGraphQLSelection.kt | 23 +----------------- .../graphql/schema/DataFetchingExtensions.kt | 24 +++++++++++++++++++ .../bee/persistent/selection/DataSelection.kt | 8 +++++++ .../persistent/selection/EmptySelection.kt | 2 ++ .../selection/FullNonRecursiveSelection.kt | 2 ++ .../persistent/selection/SimpleSelection.kt | 13 ++++++++++ .../media/service/MediaController.kt | 2 +- .../service/OrganisationController.kt | 2 +- .../service/OrganisationDataLoader.kt | 2 +- 9 files changed, 53 insertions(+), 25 deletions(-) create mode 100644 bee.persistent/src/dgs/kotlin/com/beeproduced/bee/persistent/extensions/graphql/schema/DataFetchingExtensions.kt diff --git a/bee.persistent/src/dgs/kotlin/com/beeproduced/bee/persistent/dgs/selection/DgsGraphQLSelection.kt b/bee.persistent/src/dgs/kotlin/com/beeproduced/bee/persistent/dgs/selection/DgsGraphQLSelection.kt index 1f11774..1277ddb 100644 --- a/bee.persistent/src/dgs/kotlin/com/beeproduced/bee/persistent/dgs/selection/DgsGraphQLSelection.kt +++ b/bee.persistent/src/dgs/kotlin/com/beeproduced/bee/persistent/dgs/selection/DgsGraphQLSelection.kt @@ -1,32 +1,11 @@ package com.beeproduced.bee.persistent.dgs.selection -import com.beeproduced.bee.persistent.selection.DataSelection import com.beeproduced.bee.persistent.selection.FieldNodeDefinition import com.beeproduced.bee.persistent.selection.SimpleSelection import com.beeproduced.bee.persistent.selection.SimpleSelection.Companion.substringBeforeOrNull -import graphql.schema.DataFetchingEnvironment -import graphql.schema.DataFetchingFieldSelectionSet import graphql.schema.SelectedField -/** - * - * - * @author Kacper Urbaniec - * @version 2023-01-30 - */ - -fun DataFetchingFieldSelectionSet.toDataSelection(): DataSelection { - val fields = immediateFields - .mapTo(HashSet()) { toDataSelection(it) } - - return SimpleSelection(fields) -} - -fun DataFetchingEnvironment.toDataSelection(): DataSelection { - return selectionSet.toDataSelection() -} - -private fun toDataSelection(node: SelectedField): FieldNodeDefinition { +fun toDataSelection(node: SelectedField): FieldNodeDefinition { val field = node.qualifiedName val fieldType = node.fullyQualifiedName.substringBeforeOrNull(".") diff --git a/bee.persistent/src/dgs/kotlin/com/beeproduced/bee/persistent/extensions/graphql/schema/DataFetchingExtensions.kt b/bee.persistent/src/dgs/kotlin/com/beeproduced/bee/persistent/extensions/graphql/schema/DataFetchingExtensions.kt new file mode 100644 index 0000000..4eb77e4 --- /dev/null +++ b/bee.persistent/src/dgs/kotlin/com/beeproduced/bee/persistent/extensions/graphql/schema/DataFetchingExtensions.kt @@ -0,0 +1,24 @@ +package com.beeproduced.bee.persistent.extensions.graphql.schema + +import com.beeproduced.bee.persistent.selection.DataSelection +import com.beeproduced.bee.persistent.selection.SimpleSelection +import graphql.schema.DataFetchingEnvironment +import graphql.schema.DataFetchingFieldSelectionSet + +/** + * + * + * @author Kacper Urbaniec + * @version 2023-01-30 + */ + +fun DataFetchingFieldSelectionSet.toDataSelection(): DataSelection { + val fields = immediateFields + .mapTo(HashSet()) { com.beeproduced.bee.persistent.dgs.selection.toDataSelection(it) } + + return SimpleSelection(fields) +} + +fun DataFetchingEnvironment.toDataSelection(): DataSelection { + return selectionSet.toDataSelection() +} \ No newline at end of file diff --git a/bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/selection/DataSelection.kt b/bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/selection/DataSelection.kt index 72987cd..5563074 100644 --- a/bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/selection/DataSelection.kt +++ b/bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/selection/DataSelection.kt @@ -19,4 +19,12 @@ interface DataSelection { fun merge(vararg selections: SimpleSelection): DataSelection fun merge(selections: Collection): DataSelection + + fun typeSelect(typeName: String): DataSelection? +} + +inline fun DataSelection.typeSelect(): DataSelection? { + val typeName = C::class.simpleName ?: + throw Exception("Given class has no name") + return typeSelect(typeName) } \ No newline at end of file diff --git a/bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/selection/EmptySelection.kt b/bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/selection/EmptySelection.kt index 6a6c837..8d3afed 100644 --- a/bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/selection/EmptySelection.kt +++ b/bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/selection/EmptySelection.kt @@ -21,4 +21,6 @@ class EmptySelection : DataSelection { val selection = SimpleSelection(setOf()) return selection.merge(selections) } + + override fun typeSelect(typeName: String): DataSelection? = null } \ No newline at end of file diff --git a/bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/selection/FullNonRecursiveSelection.kt b/bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/selection/FullNonRecursiveSelection.kt index a9f8e86..5d88bd4 100644 --- a/bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/selection/FullNonRecursiveSelection.kt +++ b/bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/selection/FullNonRecursiveSelection.kt @@ -19,4 +19,6 @@ class FullNonRecursiveSelection(skips: Collection = emptyList()) : Dat override fun merge(selections: Collection): DataSelection { return this } + + override fun typeSelect(typeName: String): DataSelection? = this } \ No newline at end of file diff --git a/bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/selection/SimpleSelection.kt b/bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/selection/SimpleSelection.kt index 07462b6..0fc27b1 100644 --- a/bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/selection/SimpleSelection.kt +++ b/bee.persistent/src/main/kotlin/com/beeproduced/bee/persistent/selection/SimpleSelection.kt @@ -183,6 +183,19 @@ class SimpleSelection internal constructor( ) } + override fun typeSelect(typeName: String): DataSelection? { + if (typeName.isEmpty()) return null + + val start = mutableSetOf() + for ((_, node) in fields) { + if (node.type != null && node.type == typeName) + start.add(node) + } + + return if (start.isEmpty()) null + else SimpleSelection(start, skipOvers.remainingSkips()) + } + private fun merge( node: FieldNodeDefinition, parent: MutableFieldNode, diff --git a/example/application/src/main/kotlin/com/beeproduced/example/application/media/service/MediaController.kt b/example/application/src/main/kotlin/com/beeproduced/example/application/media/service/MediaController.kt index b48ea46..4c7dce9 100644 --- a/example/application/src/main/kotlin/com/beeproduced/example/application/media/service/MediaController.kt +++ b/example/application/src/main/kotlin/com/beeproduced/example/application/media/service/MediaController.kt @@ -1,6 +1,6 @@ package com.beeproduced.example.application.media.service -import com.beeproduced.bee.persistent.dgs.selection.toDataSelection +import com.beeproduced.bee.persistent.extensions.graphql.schema.toDataSelection import com.beeproduced.example.application.graphql.dto.AddFilm import com.beeproduced.example.application.graphql.dto.EditFilm import com.beeproduced.example.application.graphql.dto.Foo diff --git a/example/application/src/main/kotlin/com/beeproduced/example/application/organisation/service/OrganisationController.kt b/example/application/src/main/kotlin/com/beeproduced/example/application/organisation/service/OrganisationController.kt index 191eff8..7d69172 100644 --- a/example/application/src/main/kotlin/com/beeproduced/example/application/organisation/service/OrganisationController.kt +++ b/example/application/src/main/kotlin/com/beeproduced/example/application/organisation/service/OrganisationController.kt @@ -1,6 +1,6 @@ package com.beeproduced.example.application.organisation.service -import com.beeproduced.bee.persistent.dgs.selection.toDataSelection +import com.beeproduced.bee.persistent.extensions.graphql.schema.toDataSelection import com.beeproduced.bee.buzz.manager.EventManager import com.beeproduced.bee.functional.extensions.com.github.michaelbull.result.getDataFetcher import com.beeproduced.service.organisation.events.GetAllCompanies diff --git a/example/application/src/main/kotlin/com/beeproduced/example/application/organisation/service/OrganisationDataLoader.kt b/example/application/src/main/kotlin/com/beeproduced/example/application/organisation/service/OrganisationDataLoader.kt index 46e6042..089eda7 100644 --- a/example/application/src/main/kotlin/com/beeproduced/example/application/organisation/service/OrganisationDataLoader.kt +++ b/example/application/src/main/kotlin/com/beeproduced/example/application/organisation/service/OrganisationDataLoader.kt @@ -2,7 +2,7 @@ package com.beeproduced.example.application.organisation.service import com.beeproduced.bee.fetched.annotations.BeeFetched import com.beeproduced.bee.fetched.annotations.FetcherIgnore -import com.beeproduced.bee.persistent.dgs.selection.toDataSelection +import com.beeproduced.bee.persistent.extensions.graphql.schema.toDataSelection import com.beeproduced.bee.persistent.selection.EmptySelection import com.beeproduced.bee.buzz.manager.EventManager import com.beeproduced.service.organisation.events.GetCompaniesByIds From 3345fc5c4412e31e53987d55dbffa55b5f33bfef Mon Sep 17 00:00:00 2001 From: Kacper Urbaniec Date: Mon, 23 Oct 2023 19:04:42 +0200 Subject: [PATCH 9/9] Bumped version --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 87f59c9..cf9493d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -bee-built = "0.2.0-SNAPSHOT" +bee-built = "0.3.0-SNAPSHOT" springboot-base = "3.1.4" springboot-dependencymanagement = "1.1.3" kotlin-base = "1.9.10"