summaryrefslogtreecommitdiff
path: root/support/arara/source/src/main/kotlin/org/islandoftex/arara/model/Session.kt
diff options
context:
space:
mode:
Diffstat (limited to 'support/arara/source/src/main/kotlin/org/islandoftex/arara/model/Session.kt')
-rw-r--r--support/arara/source/src/main/kotlin/org/islandoftex/arara/model/Session.kt119
1 files changed, 119 insertions, 0 deletions
diff --git a/support/arara/source/src/main/kotlin/org/islandoftex/arara/model/Session.kt b/support/arara/source/src/main/kotlin/org/islandoftex/arara/model/Session.kt
new file mode 100644
index 0000000000..c2093429e1
--- /dev/null
+++ b/support/arara/source/src/main/kotlin/org/islandoftex/arara/model/Session.kt
@@ -0,0 +1,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 }
+ }
+}