diff --git a/gameyfin/build.gradle.kts b/gameyfin/build.gradle.kts index 4a49985..0679649 100644 --- a/gameyfin/build.gradle.kts +++ b/gameyfin/build.gradle.kts @@ -100,6 +100,10 @@ tasks.register("uberJar") { from({ configurations.runtimeClasspath.get().filter { it.name.endsWith("jar") }.map { zipTree(it) } }) + + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + isZip64 = true + manifest { attributes["Main-Class"] = appMainClass } diff --git a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/GameyfinApplication.kt b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/GameyfinApplication.kt index b29d3b5..944d6b9 100644 --- a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/GameyfinApplication.kt +++ b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/GameyfinApplication.kt @@ -12,6 +12,5 @@ import org.springframework.transaction.annotation.EnableTransactionManagement class GameyfinApplication fun main(args: Array) { - System.setProperty("spring.devtools.restart.enabled", "false"); runApplication(*args) } \ No newline at end of file diff --git a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/PluginManagerConfig.kt b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/plugins/PluginManagerConfig.kt similarity index 84% rename from gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/PluginManagerConfig.kt rename to gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/plugins/PluginManagerConfig.kt index def64de..f9932b4 100644 --- a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/PluginManagerConfig.kt +++ b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/plugins/PluginManagerConfig.kt @@ -1,7 +1,6 @@ -package de.grimsi.gameyfin.core +package de.grimsi.gameyfin.core.plugins import io.github.oshai.kotlinlogging.KotlinLogging -import org.pf4j.DefaultPluginManager import org.springframework.boot.context.event.ApplicationReadyEvent import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration @@ -14,7 +13,7 @@ class PluginManagerConfig { private val pluginPath = Path.of("plugins") @Bean - fun pluginManager() = DefaultPluginManager(pluginPath) + fun pluginManager() = SpringDevtoolsPluginManager(pluginPath) @EventListener(ApplicationReadyEvent::class) fun loadedPlugins() { diff --git a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/plugins/SpringDevtoolsDevelopmentPluginLoader.kt b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/plugins/SpringDevtoolsDevelopmentPluginLoader.kt new file mode 100644 index 0000000..6072204 --- /dev/null +++ b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/plugins/SpringDevtoolsDevelopmentPluginLoader.kt @@ -0,0 +1,20 @@ +package de.grimsi.gameyfin.core.plugins + +import org.pf4j.DevelopmentPluginLoader +import org.pf4j.PluginClassLoader +import org.pf4j.PluginDescriptor +import org.pf4j.PluginManager +import java.nio.file.Path + +/** + * @see https://stackoverflow.com/questions/73654174/my-application-cant-find-the-extension-with-pf4j + */ +class SpringDevtoolsDevelopmentPluginLoader( + pluginManager: PluginManager, + private val parentClassLoader: ClassLoader +) : DevelopmentPluginLoader(pluginManager) { + + override fun createPluginClassLoader(pluginPath: Path, pluginDescriptor: PluginDescriptor): PluginClassLoader { + return PluginClassLoader(pluginManager, pluginDescriptor, parentClassLoader) + } +} \ No newline at end of file diff --git a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/plugins/SpringDevtoolsPluginManager.kt b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/plugins/SpringDevtoolsPluginManager.kt new file mode 100644 index 0000000..30986f6 --- /dev/null +++ b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/core/plugins/SpringDevtoolsPluginManager.kt @@ -0,0 +1,38 @@ +package de.grimsi.gameyfin.core.plugins + +import org.pf4j.CompoundPluginLoader +import org.pf4j.CompoundPluginRepository +import org.pf4j.DefaultPluginLoader +import org.pf4j.DefaultPluginManager +import org.pf4j.DefaultPluginRepository +import org.pf4j.DevelopmentPluginRepository +import org.pf4j.JarPluginLoader +import org.pf4j.JarPluginRepository +import org.pf4j.PluginLoader +import org.pf4j.PluginRepository +import java.nio.file.Path + +/** + * @see https://stackoverflow.com/questions/73654174/my-application-cant-find-the-extension-with-pf4j + */ +class SpringDevtoolsPluginManager(path: Path) : DefaultPluginManager(path) { + + override fun createPluginRepository(): PluginRepository { + return CompoundPluginRepository() + .add(DevelopmentPluginRepository(pluginsRoots), this::isDevelopment) + .add(JarPluginRepository(pluginsRoots), this::isNotDevelopment) + .add(DefaultPluginRepository(pluginsRoots), this::isNotDevelopment) + } + + override fun createPluginLoader(): PluginLoader { + val compoundPluginLoader = CompoundPluginLoader() + val developmentPluginLoader = SpringDevtoolsDevelopmentPluginLoader(this, javaClass.classLoader) + val jarPluginLoader = JarPluginLoader(this) + val defaultPluginLoader = DefaultPluginLoader(this) + + return compoundPluginLoader + .add(developmentPluginLoader, this::isDevelopment) + .add(jarPluginLoader, this::isNotDevelopment) + .add(defaultPluginLoader, this::isNotDevelopment) + } +} \ No newline at end of file diff --git a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/Game.kt b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/Game.kt index 58dd6a9..290e6ab 100644 --- a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/Game.kt +++ b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/Game.kt @@ -1,13 +1,12 @@ package de.grimsi.gameyfin.games import jakarta.persistence.* -import java.nio.file.Path @Entity class Game( @Id @GeneratedValue(strategy = GenerationType.AUTO) - val id: Long? = null, + var id: Long? = null, val title: String, diff --git a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/GameRepository.kt b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/GameRepository.kt index f63faf2..67257b2 100644 --- a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/GameRepository.kt +++ b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/GameRepository.kt @@ -2,4 +2,6 @@ package de.grimsi.gameyfin.games import org.springframework.data.jpa.repository.JpaRepository -interface GameRepository : JpaRepository \ No newline at end of file +interface GameRepository : JpaRepository { + fun findByPath(path: String): Game? +} \ No newline at end of file diff --git a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/GameService.kt b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/GameService.kt index b1ccde6..ffb0347 100644 --- a/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/GameService.kt +++ b/gameyfin/src/main/kotlin/de/grimsi/gameyfin/games/GameService.kt @@ -18,6 +18,9 @@ class GameService( get() = pluginManager.getExtensions(GameMetadataFetcher::class.java) fun createOrUpdate(game: Game): Game { + gameRepository.findByPath(game.path)?.let { + game.id = it.id + } return gameRepository.save(game) } @@ -50,7 +53,7 @@ class GameService( } return GameDto( - id = game.id, + id = game.id!!, title = game.title ) }