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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
// SPDX-License-Identifier: BSD-3-Clause
package org.islandoftex.arara.model
import org.islandoftex.arara.localization.LanguageController
import org.islandoftex.arara.localization.Messages
/**
* Implements the session.
*
* This class wraps a map that holds the execution session, that is, a dirty
* maneuver to exchange pretty much any data between commands and even rules.
*
* @author Island of TeX
* @version 5.0
* @since 4.0
*/
object Session {
// the application messages obtained from the
// language controller
private val messages = LanguageController
// the session map which holds the execution session;
// the idea here is to provide wrappers to the map
// methods, so it could be easily manipulated
private val map = mutableMapOf<String, Any>()
/**
* Gets the object indexed by the provided key from the session. This method
* holds the map method of the very same name.
*
* @param key The provided key.
* @return The object indexed by the provided key.
* @throws AraraException Something wrong happened, to be caught in the
* higher levels.
*/
@Throws(AraraException::class)
operator fun get(key: String): Any {
return if (contains(key)) {
map.getValue(key)
} else {
throw AraraException(
messages.getMessage(
Messages.ERROR_SESSION_OBTAIN_UNKNOWN_KEY,
key
)
)
}
}
/**
* Inserts (or overwrites) the object indexed by the provided key into the
* session. This method holds the map method of the very same name.
*
* @param key The provided key.
* @param value The value to be inserted.
*/
fun put(key: String, value: Any) {
map[key] = value
}
/**
* Removes the entry indexed by the provided key from the session. This method
* holds the map method of the same name.
*
* @param key The provided key.
* @throws AraraException Something wrong happened, to be caught in the
* higher levels.
*/
@Throws(AraraException::class)
fun remove(key: String) {
if (contains(key)) {
map.remove(key)
} else {
throw AraraException(
messages.getMessage(
Messages.ERROR_SESSION_REMOVE_UNKNOWN_KEY,
key
)
)
}
}
/**
* Checks if the provided key exists in the session.
*
* @param key The provided key.
* @return A boolean value indicating if the provided key exists in the
* session.
*/
operator fun contains(key: String): Boolean = map.containsKey(key)
/**
* Clears the session (map). This method, as usual, holds the map method of
* the same name.
*/
fun clear() = map.clear()
/**
* Update the environment variables stored in the session.
*
* @param additionFilter Which environment variables to include. You can
* filter their names (the string parameter) but not their values. By
* default all values will be added.
* @param removalFilter Which environment variables to remove beforehand.
* By default all values will be removed.
*/
fun updateEnvironmentVariables(
additionFilter: (String) -> Boolean = { true },
removalFilter: (String) -> Boolean = { true }
) {
// remove all current environment variables to clean up the session
map.filterKeys { it.startsWith("environment:") }
.filterKeys(removalFilter)
.forEach { remove(it.key) }
// add all relevant new environment variables
System.getenv().filterKeys(additionFilter)
.forEach { map["environment:${it.key}"] = it.value }
}
}
|