Skip to content

Commit

Permalink
Persist connection parameters (#2)
Browse files Browse the repository at this point in the history
Persist all connection parameters (Java Home, Gradle User Home and
Gradle Distribution) for each build in the local database.

* Fixes #1
  • Loading branch information
eskatos authored Apr 25, 2024
2 parents 69be8c4 + 3dee7a3 commit e6c310d
Show file tree
Hide file tree
Showing 12 changed files with 250 additions and 96 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
-- Application Database Migration #2

ALTER TABLE DbBuild
ADD javaHomeDir TEXT;

ALTER TABLE DbBuild
ADD gradleUserHomeDir TEXT;

ALTER TABLE DbBuild
ADD gradleDistributionJson TEXT;
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,25 @@ SELECT DbBuild.* FROM DbBuild WHERE id = :id;
insert:
INSERT INTO DbBuild (
id,
rootDir
rootDir,
javaHomeDir,
gradleUserHomeDir,
gradleDistributionJson
) VALUES (
:id,
:rootDir
:rootDir,
:javaHomeDir,
:gradleUserHomeDir,
:gradleDistributionJson
);

delete:
DELETE FROM DbBuild WHERE id = :id;

update:
UPDATE DbBuild SET
rootDir = :rootDir,
javaHomeDir = :javaHomeDir,
gradleUserHomeDir = :gradleUserHomeDir,
gradleDistributionJson = :gradleDistributionJson
WHERE id = :id;
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
package org.gradle.client.core.database

import org.gradle.client.core.gradle.GradleDistribution
import org.gradle.client.core.util.generateIdentity
import java.io.File

data class Build(
val id: String = generateIdentity(),
val rootDir: File,
val javaHomeDir: File? = null,
val gradleUserHomeDir: File? = null,
val gradleDistribution: GradleDistribution = GradleDistribution.Default,
)
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,10 @@ import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.mapNotNull
import kotlinx.coroutines.withContext
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import org.gradle.client.core.database.sqldelight.generated.queries.BuildsQueries
import org.gradle.client.core.gradle.GradleDistribution
import java.io.File

class BuildsRepository(
Expand All @@ -29,6 +32,9 @@ class BuildsRepository(
queries.insert(
id = build.id,
rootDir = build.rootDir.absolutePath,
javaHomeDir = build.javaHomeDir?.absolutePath,
gradleUserHomeDir = build.gradleUserHomeDir?.absolutePath,
gradleDistributionJson = Json.encodeToString(build.gradleDistribution)
)
}

Expand All @@ -37,8 +43,32 @@ class BuildsRepository(
queries.delete(build.id)
}

object DbBuildMapper : (String, String) -> Build {
override fun invoke(id: String, rootDir: String): Build =
Build(id, File(rootDir))
suspend fun update(build: Build) =
withContext(writeDispatcher) {
queries.update(
id = build.id,
rootDir = build.rootDir.absolutePath,
javaHomeDir = build.javaHomeDir?.absolutePath,
gradleUserHomeDir = build.gradleUserHomeDir?.absolutePath,
gradleDistributionJson = Json.encodeToString(build.gradleDistribution)
)
}

object DbBuildMapper : (String, String, String?, String?, String?) -> Build {
override fun invoke(
id: String,
rootDir: String,
javaHomeDir: String?,
gradleUserHomeDir: String?,
gradleDistributionJson: String?,
) = Build(
id = id,
rootDir = File(rootDir),
javaHomeDir = javaHomeDir?.let(::File),
gradleUserHomeDir = gradleUserHomeDir?.let(::File),
gradleDistribution = gradleDistributionJson
?.let { Json.decodeFromString(it) }
?: GradleDistribution.Default,
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,22 @@ data class GradleConnectionParameters(
companion object {

fun isValidJavaHome(path: String): Boolean =
path.isNotBlank() && File(path).let {
it.isDirectory && it.resolve("bin").listFiles { file ->
file.nameWithoutExtension == "java"
}?.isNotEmpty() ?: false
}
(path.isBlank() && isEnvironmentValidJavaHome()) || isValidJavaHome(File(path))

private fun isEnvironmentValidJavaHome(): Boolean =
System.getenv("JAVA_HOME")?.takeIf { it.isNotBlank() }
?.let { isValidJavaHome(File(it)) }
?: false

private fun isValidJavaHome(path: File): Boolean =
path.isDirectory && path.resolve("bin").listFiles { file ->
file.nameWithoutExtension == "java"
}?.isNotEmpty() ?: false

fun isValidGradleUserHome(path: String): Boolean =
path.isBlank() || File(path).let { !it.exists() || it.isDirectory }

fun isValidGradleVersion(version: String) : Boolean =
fun isValidGradleVersion(version: String): Boolean =
version.isNotBlank()

fun isValidGradleInstallation(path: String): Boolean =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,14 @@ import org.gradle.client.core.database.Build
import org.gradle.client.core.database.BuildsRepository
import org.gradle.client.core.files.AppDirs
import org.gradle.client.core.gradle.GradleConnectionParameters
import org.gradle.client.core.gradle.GradleDistribution
import org.gradle.client.ui.AppDispatchers
import java.io.File
import java.lang.Exception

sealed interface BuildModel {
data object Loading : BuildModel
data class Failed(val exception: Exception) : BuildModel
data class Loaded(val build: Build) : BuildModel
}

Expand All @@ -46,8 +50,8 @@ class BuildComponent(
val fetch = scope.launch {
buildsRepository.fetch(id).cancellable().collect { build ->
mutableModel.value = when (val state = model.value) {
BuildModel.Loading -> BuildModel.Loaded(build)
is BuildModel.Loaded -> state.copy(build = build)
else -> BuildModel.Loaded(build)
}
}
}
Expand Down Expand Up @@ -80,6 +84,42 @@ class BuildComponent(
}
}

fun onJavaHomeChanged(javaHomeDir: File?) {
when (val current = model.value) {
is BuildModel.Loaded -> scope.launch {
buildsRepository.update(build = current.build.copy(javaHomeDir = javaHomeDir))
}

else -> mutableModel.value = BuildModel.Failed(
IllegalStateException("Cannot change Java Home when the Build is not loaded")
)
}
}

fun onGradleUserHomeChanged(gradleUserHomeDir: File?) {
when (val current = model.value) {
is BuildModel.Loaded -> scope.launch {
buildsRepository.update(build = current.build.copy(gradleUserHomeDir = gradleUserHomeDir))
}

else -> mutableModel.value = BuildModel.Failed(
IllegalStateException("Cannot change Gradle User Home when the Build is not loaded")
)
}
}

fun onGradleDistributionChanged(gradleDistribution: GradleDistribution) {
when (val current = model.value) {
is BuildModel.Loaded -> scope.launch {
buildsRepository.update(build = current.build.copy(gradleDistribution = gradleDistribution))
}

else -> mutableModel.value = BuildModel.Failed(
IllegalStateException("Cannot change Gradle Distribution when the Build is not loaded")
)
}
}

fun onCloseClicked() {
onFinished()
}
Expand Down
Loading

0 comments on commit e6c310d

Please sign in to comment.