Skip to content

Commit 4f23c39

Browse files
authored
Merge pull request #24 from kdroidFilter/dev
Refactor and restructure policy and store generators
2 parents f4b917c + 620262c commit 4f23c39

File tree

16 files changed

+173
-137
lines changed

16 files changed

+173
-137
lines changed

.github/workflows/release-sqlite-db.yml

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -35,19 +35,12 @@ jobs:
3535

3636
- name: Build project and export SQLite DBs
3737
run: |
38-
# Build and export policies database
39-
./gradlew :generator:build --quiet
40-
./gradlew :generator:jvmRun \
41-
-DmainClass=io.github.kdroidfilter.database.generator.SqlLiteExtractorKt \
42-
--quiet
43-
ls -l generator/build/policies.db
38+
# Build and run both generators using the new task
39+
./gradlew runGenerators --quiet
4440
45-
# Build and export store database
46-
./gradlew :storegenerator:build --quiet
47-
./gradlew :storegenerator:jvmRun \
48-
-DmainClass=io.github.kdroidfilter.database.storegenerator.SqliteStoreBuilderKt \
49-
--quiet
50-
ls -l storegenerator/build/store-database.db
41+
# Verify the generated database files
42+
ls -l generators/policies/build/policies-database.db
43+
ls -l generators/store/build/store-database.db
5144
5245
- name: Define release name
5346
id: relname
@@ -68,5 +61,5 @@ jobs:
6861
tag_name: ${{ env.RELEASE_NAME }}
6962
name: ${{ env.RELEASE_NAME }}
7063
files: |
71-
generator/build/policies.db
72-
storegenerator/build/store-database.db
64+
generators/policies/build/policies-database.db
65+
generators/store/build/store-database.db

build.gradle.kts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,11 @@ plugins {
55
alias(libs.plugins.android.application).apply(false)
66
alias(libs.plugins.vannitktech.maven.publish).apply(false)
77
}
8+
9+
// Task to run both generators
10+
tasks.register("runGenerators") {
11+
group = "extraction"
12+
description = "Runs both the SQLite policy extractor and the SQLite store extractor"
13+
14+
dependsOn(":generators:policies:runPolicyExtractor", ":generators:store:runStoreExtractor")
15+
}

generator/src/commonMain/kotlin/io/github/kdroidfilter/database/generator/SQLitePolicyExporter.kt

Lines changed: 0 additions & 88 deletions
This file was deleted.

generator/src/commonMain/kotlin/io/github/kdroidfilter/database/generator/SqlLiteExtractor.kt

Lines changed: 0 additions & 11 deletions
This file was deleted.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,16 @@ kotlin {
1010
jvmToolchain(17)
1111

1212
jvm()
13+
14+
1315
sourceSets {
1416
commonMain.dependencies {
1517
implementation(project(":core"))
1618
implementation(libs.kotlinx.coroutines.core)
1719
implementation(libs.kotlinx.coroutines.test)
1820
implementation(libs.kotlinx.serialization.json)
1921
implementation(libs.kermit)
22+
implementation(libs.platform.tools.release.fetcher)
2023
}
2124

2225
commonTest.dependencies {
@@ -42,3 +45,16 @@ kotlin {
4245
}
4346

4447
}
48+
49+
tasks.register<JavaExec>("runPolicyExtractor") {
50+
group = "extraction"
51+
description = "Runs the SQLite policy extractor"
52+
53+
dependsOn(kotlin.jvm().compilations["main"].compileTaskProvider)
54+
classpath = files(
55+
kotlin.jvm().compilations["main"].output.allOutputs,
56+
kotlin.jvm().compilations["main"].runtimeDependencyFiles
57+
)
58+
mainClass.set("SqlitePolicyExtractorKt")
59+
60+
}

generator/src/commonMain/kotlin/io/github/kdroidfilter/database/generator/JsonExtractor.kt renamed to generators/policies/src/jvmMain/kotlin/JsonExtractor.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1-
import io.github.kdroidfilter.database.generator.PolicyRepository
21
import java.nio.file.Paths
32

43
fun main() {
54
val projectDir = Paths.get("").toAbsolutePath()
6-
val root = projectDir.parent.resolve("app-policies")
5+
val root = projectDir.parent.resolve("../app-policies")
76
val output = Paths.get("build","all-policies.json")
87
PolicyRepository.exportAll(root, output)
98
}

generator/src/commonMain/kotlin/io/github/kdroidfilter/database/generator/PolicyRepository.kt renamed to generators/policies/src/jvmMain/kotlin/PolicyRepository.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
package io.github.kdroidfilter.database.generator
2-
31
import io.github.kdroidfilter.database.core.ModeSpec
42
import io.github.kdroidfilter.database.core.policies.AppPolicy
53
import io.github.kdroidfilter.database.core.policies.FixedPolicy
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
import co.touchlab.kermit.Logger
2+
import io.github.kdroidfilter.database.core.policies.AppPolicy
3+
import kotlinx.serialization.json.Json
4+
import java.nio.file.Files
5+
import java.nio.file.Path
6+
import java.sql.Connection
7+
import java.sql.DriverManager
8+
import java.time.LocalDateTime
9+
import java.time.format.DateTimeFormatter
10+
11+
object SqlitePolicyBuilder {
12+
private val logger = Logger.withTag("SqlitePolicyBuilder")
13+
private val json = Json {
14+
classDiscriminator = "type"
15+
ignoreUnknownKeys = true
16+
encodeDefaults = false
17+
prettyPrint = false
18+
serializersModule = PolicyRepository.json.serializersModule
19+
}
20+
21+
fun buildDatabase(policiesDir: Path, outputDbPath: Path) {
22+
// Always create the database from scratch
23+
logger.i { "🔄 Creating database from scratch..." }
24+
25+
// Delete existing database file if it exists
26+
if (Files.exists(outputDbPath)) {
27+
logger.i { "🗑️ Deleting existing database file..." }
28+
Files.delete(outputDbPath)
29+
}
30+
31+
// Get release name from environment variable or generate timestamp
32+
val releaseName = System.getenv("RELEASE_NAME") ?: LocalDateTime.now()
33+
.format(DateTimeFormatter.ofPattern("yyyyMMddHHmm"))
34+
logger.i { "🏷️ Using release name: $releaseName" }
35+
36+
Class.forName("org.sqlite.JDBC")
37+
Files.createDirectories(outputDbPath.parent)
38+
val url = "jdbc:sqlite:${outputDbPath.toAbsolutePath()}"
39+
DriverManager.getConnection(url).use { conn ->
40+
conn.autoCommit = false
41+
createTables(conn)
42+
insertVersion(conn, releaseName)
43+
insertPolicies(conn, policiesDir)
44+
conn.commit()
45+
}
46+
logger.i { "✅ SQLite database created at $outputDbPath" }
47+
}
48+
49+
private fun createTables(conn: Connection) = with(conn.createStatement()) {
50+
executeUpdate("""
51+
CREATE TABLE IF NOT EXISTS policies (
52+
package_name TEXT PRIMARY KEY,
53+
data TEXT NOT NULL
54+
)
55+
""".trimIndent())
56+
57+
executeUpdate("""
58+
CREATE TABLE IF NOT EXISTS version (
59+
id INTEGER PRIMARY KEY AUTOINCREMENT,
60+
release_name TEXT NOT NULL
61+
)
62+
""".trimIndent())
63+
close()
64+
}
65+
66+
private fun insertVersion(conn: Connection, releaseName: String) {
67+
// Clear existing entries
68+
conn.createStatement().use { stmt ->
69+
stmt.executeUpdate("DELETE FROM version")
70+
}
71+
72+
// Insert new release name
73+
conn.prepareStatement("INSERT INTO version (release_name) VALUES (?)").use { ps ->
74+
ps.setString(1, releaseName)
75+
ps.executeUpdate()
76+
}
77+
logger.i { "✅ Inserted version info: $releaseName" }
78+
}
79+
80+
private fun insertPolicies(conn: Connection, policiesDir: Path) {
81+
val insertSql = """
82+
INSERT OR REPLACE INTO policies(package_name, data)
83+
VALUES(?, ?)
84+
""".trimIndent()
85+
86+
conn.prepareStatement(insertSql).use { ps ->
87+
val policies = PolicyRepository.loadAll(policiesDir)
88+
policies.forEach { policy ->
89+
val jsonStr = json.encodeToString(AppPolicy.serializer(), policy)
90+
ps.setString(1, policy.packageName)
91+
ps.setString(2, jsonStr)
92+
ps.addBatch()
93+
}
94+
ps.executeBatch()
95+
logger.i { "✅ Inserted ${policies.size} policies" }
96+
}
97+
}
98+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import java.nio.file.Path
2+
3+
fun main() {
4+
val projectDir = Path.of("").toAbsolutePath()
5+
val policiesDir = projectDir.parent.resolve("../app-policies")
6+
val outputDb = projectDir.resolve("build/policies-database.db")
7+
8+
SqlitePolicyBuilder.buildDatabase(policiesDir, outputDb)
9+
}

generator/src/commonTest/kotlin/io/github/kdroidfilter/database/generator/JsonExtractorTest.kt renamed to generators/policies/src/jvmTest/kotlin/JsonExtractorTest.kt

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,25 @@
1-
package io.github.kdroidfilter.database.generator
2-
31
import io.github.kdroidfilter.database.core.AppCategory
42
import io.github.kdroidfilter.database.core.ModeSpec
5-
import io.github.kdroidfilter.database.core.UserMode
63
import io.github.kdroidfilter.database.core.NetworkMode
74
import io.github.kdroidfilter.database.core.NetworkPolicy
5+
import io.github.kdroidfilter.database.core.UserMode
86
import io.github.kdroidfilter.database.core.policies.AppPolicy
97
import io.github.kdroidfilter.database.core.policies.FixedPolicy
108
import io.github.kdroidfilter.database.core.policies.ModeBasedPolicy
119
import kotlinx.serialization.builtins.ListSerializer
10+
import java.nio.file.Files
11+
import java.nio.file.Path
1212
import kotlin.test.Test
1313
import kotlin.test.assertEquals
1414
import kotlin.test.assertTrue
15-
import java.nio.file.Files
16-
import java.nio.file.Path
1715

1816
class JsonExtractorTest {
1917

2018
@Test
2119
fun `exportAll should serialize all existing policies without error`() {
2220
// Arrange: point to the real app-policies folder in the project
2321
val projectDir = Path.of("").toAbsolutePath()
24-
val root = projectDir.parent.resolve("app-policies")
22+
val root = projectDir.parent.resolve("../app-policies")
2523
val output = Files.createTempFile("all-policies", ".json")
2624

2725
// Act: generate the single JSON array
@@ -75,4 +73,4 @@ class JsonExtractorTest {
7573
val names = policies.map { it.packageName }.toSet()
7674
assertTrue(names.containsAll(setOf("com.example.foo", "com.example.bar")), "Both package names must be present")
7775
}
78-
}
76+
}

0 commit comments

Comments
 (0)