blob: f4728c9366270858869549ac03ad5789e15c6cd3 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
// SPDX-License-Identifier: BSD-3-Clause
package org.islandoftex.arara.filehandling
import com.charleskorn.kaml.Yaml
import java.io.File
import org.islandoftex.arara.Arara
import org.islandoftex.arara.configuration.AraraSpec
import org.islandoftex.arara.localization.LanguageController
import org.islandoftex.arara.localization.Messages
import org.islandoftex.arara.model.AraraException
/**
* Implements database utilitary methods.
*
* @author Island of TeX
* @version 5.0
* @since 4.0
*/
object DatabaseUtils {
// the application messages obtained from the
// language controller
private val messages = LanguageController
/**
* Gets the file representing the YAML file (database).
*
* @throws AraraException Something wrong happened, to be caught in the
* higher levels.
*/
private val file: File
@Throws(AraraException::class)
get() {
val reference = Arara.config[AraraSpec.Execution.reference]
val name = "${Arara.config[AraraSpec.Execution.databaseName]}.yaml"
val path = FileHandlingUtils.getParentCanonicalFile(reference)
return path.resolve(name)
}
/**
* Loads the YAML file representing the database.
*
* @return The database object.
* @throws AraraException Something wrong happened, to be caught in the
* higher levels.
*/
@Throws(AraraException::class)
fun load(): Database {
return if (!exists()) {
Database()
} else {
file.runCatching {
val text = readText()
if (!text.startsWith("!database"))
throw Exception("Database should start with !database")
Yaml.default.parse(Database.serializer(), text)
}.getOrElse {
it.printStackTrace()
throw AraraException(messages.getMessage(Messages
.ERROR_LOAD_COULD_NOT_LOAD_XML, file.name), it)
}
}
}
/**
* Saves the database on a YAML file.
*
* @param database The database object.
* @throws AraraException Something wrong happened, to be caught in the
* higher levels.
*/
@Throws(AraraException::class)
fun save(database: Database) {
file.runCatching {
val content = "!database\n" +
Yaml.default.stringify(Database.serializer(), database)
writeText(content)
}.getOrElse {
throw AraraException(
messages.getMessage(
Messages.ERROR_SAVE_COULD_NOT_SAVE_XML,
file.name
), it)
}
}
/**
* Checks if the YAML file representing the database exists.
*
* @return A boolean value indicating if the YAML file exists.
* @throws AraraException Something wrong happened, to be caught in the
* higher levels.
*/
@Throws(AraraException::class)
private fun exists(): Boolean {
return file.exists()
}
}
|