From ea8ad4f8ce1208a08efc8557240c5499b06e4b9a Mon Sep 17 00:00:00 2001
From: Kai Reinhard <K.Reinhard@micromata.de>
Date: Sun, 18 Apr 2021 21:09:41 +0000
Subject: [PATCH] Code cleanup, json.prettyprint removed.

---
 borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/ServerConfiguration.kt      |    4 
 borgbutler-core/src/main/kotlin/de/micromata/borgbutler/config/Configuration.kt              |    2 
 borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/ReposRest.kt           |   26 +---
 borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/RunningMode.kt              |    2 
 borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/ArchivesRest.kt        |   17 +--
 borgbutler-docker/buildDocker.sh                                                             |   10 +
 borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/JobsRest.kt            |   79 +++++++--------
 borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/BorgButlerApplication.kt    |    6 
 borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/ConfigurationRest.kt   |   27 +---
 borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/JacksonConfig.kt       |   36 +++++++
 borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/VersionRest.kt         |   23 +---
 borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/SystemInfoRest.kt      |    4 
 borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/LoggingRest.kt         |   27 ++---
 borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/BorgRepoConfigsRest.kt |    9 -
 borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/I18nRest.kt            |    8 -
 15 files changed, 131 insertions(+), 149 deletions(-)

diff --git a/borgbutler-core/src/main/kotlin/de/micromata/borgbutler/config/Configuration.kt b/borgbutler-core/src/main/kotlin/de/micromata/borgbutler/config/Configuration.kt
index 6959a37..e375483 100644
--- a/borgbutler-core/src/main/kotlin/de/micromata/borgbutler/config/Configuration.kt
+++ b/borgbutler-core/src/main/kotlin/de/micromata/borgbutler/config/Configuration.kt
@@ -30,6 +30,8 @@
     /**
      * The borg version to install from github (optional).
      */
+    // @JsonIgnore needed by client: ConfigurationserverTab.jsx fails otherwise (conflicting borgVersion fields).
+    @JsonIgnore
     var borgVersion: String? = null
 
     /**
diff --git a/borgbutler-docker/buildDocker.sh b/borgbutler-docker/buildDocker.sh
index 437e6d1..7a4f5dd 100755
--- a/borgbutler-docker/buildDocker.sh
+++ b/borgbutler-docker/buildDocker.sh
@@ -11,7 +11,13 @@
 echo "Building docker file..."
 (cd app; docker build -t kreinhard/borgbutler .)
 
-echo "Push: docker push kreinhard/borgbutler:tagname"
-echo "Run without ssh: 'docker run -v $HOME/BorgButler:/BorgButler -p 127.0.0.1:9042:9042 --name borgbutler kreinhard/borgbutler'"
+echo "docker tag ..... version"
+echo "docker push kreinhard/borgbutler:version"
+echo "docker push kreinhard/borgbutler:latest"
+echo
+echo
 
+echo "Run without ssh: 'docker run -v $HOME/BorgButler:/BorgButler -p 127.0.0.1:9042:9042 --name borgbutler kreinhard/borgbutler'"
 echo "Run with ssh: 'docker run -v $HOME/BorgButler:/BorgButler -v $HOME/.ssh:/home/borgbutler/.ssh:ro -p 127.0.0.1:9042:9042 --name borgbutler kreinhard/borgbutler'"
+echo
+echo 'Increase Java memory: docker run -e JAVA_OPTS="-Xms4g -Xmx4g" -v ...'
diff --git a/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/BorgButlerApplication.kt b/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/BorgButlerApplication.kt
index 41ef2d9..6207080 100644
--- a/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/BorgButlerApplication.kt
+++ b/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/BorgButlerApplication.kt
@@ -112,7 +112,7 @@
             }
             val uri = URI.create(url)
             val quietMode = line.hasOption('q')
-            if (!quietMode && RunningMode.desktopSupportsBrowse && RunningMode.headlessMode) {
+            if (!quietMode && RunningMode.desktopSupportsBrowse) {
                 try {
                     log.info { "Trying to open your local web browser: $uri" }
                     Desktop.getDesktop().browse(uri)
@@ -123,10 +123,10 @@
             } else {
                 if (quietMode) {
                     log.info("Server started in quiet mode (option -q). Please open your browser manually: $uri")
-                } else if (!RunningMode.desktopSupportsBrowse) {
-                    log.info("Desktop not available. Please open your browser manually: $uri")
                 } else if (RunningMode.headlessMode) {
                     log.info("Desktop not available in headless mode. Please open your browser manually: $uri")
+                } else if (!RunningMode.desktopSupportsBrowse) {
+                    log.info("Desktop not available. Please open your browser manually: $uri")
                 }
             }
         } catch (ex: ParseException) {
diff --git a/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/RunningMode.kt b/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/RunningMode.kt
index 3de994d..95939fe 100644
--- a/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/RunningMode.kt
+++ b/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/RunningMode.kt
@@ -10,7 +10,7 @@
     var webDevelopment: Boolean = false
         internal set
     val headlessMode: Boolean = System.getProperty("java.awt.headless") == "true"
-    val desktopSupported = Desktop.isDesktopSupported()
+    val desktopSupported = !headlessMode && Desktop.isDesktopSupported()
     val desktopSupportsBrowse = desktopSupported && Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)
 
     @JvmStatic
diff --git a/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/ServerConfiguration.kt b/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/ServerConfiguration.kt
index d4419d9..fb59362 100644
--- a/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/ServerConfiguration.kt
+++ b/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/ServerConfiguration.kt
@@ -3,10 +3,6 @@
 import de.micromata.borgbutler.config.Configuration
 import de.micromata.borgbutler.config.ConfigurationHandler.Companion.getConfiguration
 import mu.KotlinLogging
-import org.apache.commons.lang3.StringUtils
-import org.slf4j.LoggerFactory
-import org.springframework.beans.factory.annotation.Value
-import org.springframework.stereotype.Component
 
 private val log = KotlinLogging.logger {}
 
diff --git a/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/ArchivesRest.kt b/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/ArchivesRest.kt
index b51921b..8f73dcc 100644
--- a/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/ArchivesRest.kt
+++ b/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/ArchivesRest.kt
@@ -34,7 +34,6 @@
     /**
      * @param repoName      Name of repository ([Repository.getName].
      * @param archiveId     Id or name of archive.
-     * @param prettyPrinter If true then the json output will be in pretty format.
      * @return Repository (including list of archives) as json string.
      * @see JsonUtils.toJson
      */
@@ -42,14 +41,12 @@
     fun getArchive(
         @RequestParam("repo") repoName: String,
         @RequestParam("archiveId") archiveId: String,
-        @RequestParam("force", required = false) force: Boolean,
-        @RequestParam("prettyPrinter", required = false) prettyPrinter: Boolean
-    ): String {
-        val archive: Archive = ButlerCache.getInstance().getArchive(repoName, archiveId, force == true)
+        @RequestParam("force", required = false) force: Boolean?    ): Archive? {
+        val archive = ButlerCache.getInstance().getArchive(repoName, archiveId, force == true)
         if (force == true) {
             ButlerCache.getInstance().deleteCachedArchiveContent(repoName, archiveId)
         }
-        return JsonUtils.toJson(archive, prettyPrinter == true)
+        return archive
     }
 
     /**
@@ -61,8 +58,7 @@
      * @param diffArchiveId                 If given, the differences between archiveId and diffArchiveId will be returned.
      * @param autoChangeDirectoryToLeafItem If given, this method will step automatically into single sub directories.
      * @param force                         If false (default), non cached file lists will not be loaded by borg.
-     * @param prettyPrinter                 If true then the json output will be in pretty format.
-     * @return Repository (including list of archives) as json string.
+     * @return Repository (including list of archives) as json string or [{"mode": "notLoaded"}] if no file list loaded.
      * @see JsonUtils.toJson
      */
     @GetMapping("filelist")
@@ -74,8 +70,7 @@
         @RequestParam("maxResultSize", required = false) maxResultSize: String?,
         @RequestParam("diffArchiveId", required = false) diffArchiveId: String?,
         @RequestParam("autoChangeDirectoryToLeafItem", required = false) autoChangeDirectoryToLeafItem: Boolean?,
-        @RequestParam("force", required = false) force: Boolean?,
-        @RequestParam("prettyPrinter", required = false) prettyPrinter: Boolean?
+        @RequestParam("force", required = false) force: Boolean?
     ): String {
         val diffMode = StringUtils.isNotBlank(diffArchiveId)
         val maxSize = NumberUtils.toInt(maxResultSize, 50)
@@ -107,7 +102,7 @@
                 return "[{\"mode\": \"notLoaded\"}]"
             }
         }
-        return JsonUtils.toJson(items, prettyPrinter == true)
+        return JsonUtils.toJson(items)
     }
 
     /**
diff --git a/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/BorgRepoConfigsRest.kt b/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/BorgRepoConfigsRest.kt
index f392664..8d7b9a3 100644
--- a/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/BorgRepoConfigsRest.kt
+++ b/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/BorgRepoConfigsRest.kt
@@ -18,17 +18,14 @@
 class BorgRepoConfigsRest {
     /**
      * @param id            id or name of repo.
-     * @param prettyPrinter If true then the json output will be in pretty format.
      * @return [BorgRepoConfig] as json string.
      * @see JsonUtils.toJson
      */
     @GetMapping
     fun getRepoConfig(
-        @RequestParam("id") id: String,
-        @RequestParam("prettyPrinter", required = false) prettyPrinter: Boolean?
-    ): String {
-        val repoConfig = ConfigurationHandler.getConfiguration().getRepoConfig(id)
-        return JsonUtils.toJson(repoConfig, prettyPrinter == true)
+        @RequestParam("id") id: String
+    ): BorgRepoConfig? {
+        return ConfigurationHandler.getConfiguration().getRepoConfig(id)
     }
 
     @PostMapping
diff --git a/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/ConfigurationRest.kt b/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/ConfigurationRest.kt
index c0ac4b2..29dba18 100644
--- a/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/ConfigurationRest.kt
+++ b/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/ConfigurationRest.kt
@@ -17,16 +17,12 @@
 @RequestMapping("/rest/configuration")
 class ConfigurationRest {
 
-    /**
-     * @param prettyPrinter If true then the json output will be in pretty format.
-     * @see JsonUtils.toJson
-     */
     @GetMapping("config")
-    fun getConfig(@RequestParam("prettyPrinter", required = false) prettyPrinter: Boolean?): String {
+    fun getConfig(): ConfigurationInfo {
         val configurationInfo = ConfigurationInfo()
         configurationInfo.serverConfiguration = ServerConfiguration.get()
-        configurationInfo.borgVersion = BorgInstallation.getInstance().getBorgVersion()
-        return JsonUtils.toJson(configurationInfo, prettyPrinter)
+        configurationInfo.borgVersion = BorgInstallation.getInstance().borgVersion
+        return configurationInfo
     }
 
     @PostMapping("config")
@@ -41,25 +37,20 @@
         configurationHandler.save()
     }
 
-    /**
-     * @param prettyPrinter If true then the json output will be in pretty format.
-     * @see JsonUtils.toJson
-     */
     @GetMapping("user")
-    fun getUser(@RequestParam("prettyPrinter", required = false) prettyPrinter: Boolean?): String {
-        val user: UserData = RestUtils.getUser()
-        return JsonUtils.toJson(user, prettyPrinter)
+    fun getUser(): UserData {
+        return RestUtils.getUser()
     }
 
     @PostMapping("user")
     fun setUser(@RequestBody user: UserData) {
-        if (user.getLocale() != null && StringUtils.isBlank(user.getLocale().getLanguage())) {
+        if (user.locale?.language?.isBlank() == true) {
             // Don't set locale with "" as language.
-            user.setLocale(null)
+            user.locale = null
         }
-        if (StringUtils.isBlank(user.getDateFormat())) {
+        if (user.dateFormat?.isBlank() == true) {
             // Don't set dateFormat as "".
-            user.setDateFormat(null)
+            user.dateFormat = null
         }
         UserManager.instance().saveUser(user)
     }
diff --git a/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/I18nRest.kt b/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/I18nRest.kt
index f59f183..6ab0e6c 100644
--- a/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/I18nRest.kt
+++ b/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/I18nRest.kt
@@ -19,24 +19,20 @@
      * @param request For detecting the user's client locale.
      * @param locale If not given, the client's language (browser) will be used.
      * @param keysOnly If true, only the keys will be returned. Default is false.
-     * @param prettyPrinter If true then the json output will be in pretty format.
      * @see JsonUtils.toJson
      */
     @GetMapping("list")
     fun getList(
         request: HttpServletRequest,
-        @RequestParam("prettyPrinter", required = false) prettyPrinter: Boolean?,
         @RequestParam("keysOnly", required = false) keysOnly: Boolean?,
         @RequestParam("locale", required = false) locale: String?
-    ): String {
+    ): Map<String, String> {
         val localeObject: Locale?
         if (StringUtils.isNotBlank(locale)) {
             localeObject = Locale(locale)
         } else {
             localeObject = RestUtils.getUserLocale(request)
         }
-        val translations: Map<String, String> =
-            I18nClientMessages.getInstance().getAllMessages(localeObject, keysOnly == true)
-        return JsonUtils.toJson(translations, prettyPrinter)
+        return I18nClientMessages.getInstance().getAllMessages(localeObject, keysOnly == true)
     }
 }
diff --git a/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/JacksonConfig.kt b/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/JacksonConfig.kt
new file mode 100644
index 0000000..f6726a9
--- /dev/null
+++ b/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/JacksonConfig.kt
@@ -0,0 +1,36 @@
+package de.micromata.borgbutler.server.rest
+
+import com.fasterxml.jackson.databind.DeserializationFeature
+import com.fasterxml.jackson.databind.ObjectMapper
+import com.fasterxml.jackson.module.kotlin.KotlinModule
+import de.micromata.borgbutler.server.RunningMode
+import mu.KotlinLogging
+import org.springframework.context.annotation.Bean
+import org.springframework.context.annotation.Configuration
+import org.springframework.context.annotation.Primary
+
+private val log = KotlinLogging.logger {}
+
+@Configuration
+open class JacksonConfig {
+    private var objectMapper: ObjectMapper? = null
+
+    @Bean
+    @Primary
+    open fun objectMapper(): ObjectMapper {
+        objectMapper?.let {
+            return it
+        }
+        val mapper = ObjectMapper()
+        mapper.registerModule(KotlinModule())
+        mapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true)
+        mapper.configure(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES, false)
+        val failOnUnknownJsonProperties = RunningMode.runningInIDE
+        if (failOnUnknownJsonProperties) {
+            log.warn("Unknown JSON properties are not allowed in REST call, due to configuration in projectforge.properties:projectforge.rest.json.failOnUnknownJsonProperties (OK, but Rest calls may fail).")
+        }
+        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, failOnUnknownJsonProperties) // Should be true in development mode!
+        objectMapper = mapper
+        return mapper
+    }
+}
diff --git a/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/JobsRest.kt b/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/JobsRest.kt
index f614f8b..9dc408e 100644
--- a/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/JobsRest.kt
+++ b/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/JobsRest.kt
@@ -23,7 +23,6 @@
     /**
      * @param repo If given, only the job queue of the given repo will be returned.
      * @param testMode If true, then a test job list is created.
-     * @param prettyPrinter If true then the json output will be in pretty format.
      * @return Job queues as json string.
      * @see JsonUtils.toJson
      */
@@ -31,13 +30,12 @@
     fun getJobs(
         @RequestParam("repo", required = false) repo: String?,
         @RequestParam("testMode", required = false) testMode: Boolean?,
-        @RequestParam("oldJobs", required = false) oldJobs: Boolean?,
-        @RequestParam("prettyPrinter", required = false) prettyPrinter: Boolean?
-    ): String {
+        @RequestParam("oldJobs", required = false) oldJobs: Boolean?
+    ): List<JsonJobQueue> {
         log.debug("getJobs repo=$repo, oldJobs=$oldJobs")
         if (testMode == true) {
             // Return dynamic test queue:
-            return returnTestList(oldJobs, prettyPrinter)
+            return returnTestList(oldJobs)
         }
         var validRepo = false
         if (StringUtils.isNotBlank(repo) && "null" != repo && "undefined" != repo) {
@@ -46,19 +44,17 @@
         val borgQueueExecutor = BorgQueueExecutor.getInstance()
         val queueList = mutableListOf<JsonJobQueue>()
         if (validRepo) { // Get only the queue of the given repo:
-            val queue = getQueue(repo, oldJobs)
-            if (queue != null) {
-                queueList.add(queue)
+            getQueue(repo, oldJobs)?.let {
+                queueList.add(it)
             }
         } else { // Get all the queues (of all repos).
-            for (rep in borgQueueExecutor.getRepos()) {
-                val queue = getQueue(rep, oldJobs)
-                if (queue != null) {
-                    queueList.add(queue)
+            for (rep in borgQueueExecutor.repos) {
+                getQueue(rep, oldJobs)?.let {
+                    queueList.add(it)
                 }
             }
         }
-        return JsonUtils.toJson(queueList, prettyPrinter)
+        return queueList
     }
 
     private fun getQueue(repo: String?, oldJobs: Boolean?): JsonJobQueue? {
@@ -66,12 +62,8 @@
         val repoConfig = ConfigurationHandler.getConfiguration().getRepoConfig(repo) ?: return null
         val borgJobList = borgQueueExecutor.getJobListCopy(repoConfig, oldJobs == true)
         if (CollectionUtils.isEmpty(borgJobList)) return null
-        val queue: JsonJobQueue = JsonJobQueue().setRepo(repoConfig.getDisplayName())
-        queue.setJobs(mutableListOf())
-        for (borgJob in borgJobList) {
-            val job = JsonJob(borgJob)
-            queue.getJobs().add(job)
-        }
+        val queue: JsonJobQueue = JsonJobQueue().setRepo(repoConfig.displayName)
+        queue.jobs = borgJobList.map { JsonJob(it) }
         return queue
     }
 
@@ -94,10 +86,9 @@
      * Only for test purposes and development.
      *
      * @param oldJobs
-     * @param prettyPrinter
      * @return
      */
-    private fun returnTestList(oldJobs: Boolean?, prettyPrinter: Boolean?): String {
+    private fun returnTestList(oldJobs: Boolean?): List<JsonJobQueue> {
         var list = if (oldJobs == true) oldJobsTestList else testList
         if (list == null) {
             list = mutableListOf()
@@ -117,11 +108,11 @@
             }
         } else if (oldJobs != true) {
             for (jobQueue in list) {
-                for (job in jobQueue.getJobs()) {
-                    if (job.getStatus() != AbstractJob.Status.RUNNING) continue
-                    var current: Long = job.getProgressInfo().getCurrent()
-                    val total: Long = job.getProgressInfo().getTotal()
-                    current += if (StringUtils.startsWith(job.getProgressInfo().getMessage(), "Calculating")) {
+                for (job in jobQueue.jobs) {
+                    if (job.status != AbstractJob.Status.RUNNING) continue
+                    var current: Long = job.progressInfo.current
+                    val total: Long = job.progressInfo.total
+                    current += if (StringUtils.startsWith(job.progressInfo.message, "Calculating")) {
                         // Info is a faster operation:
                         (Math.random() * total / 5).toLong()
                     } else {
@@ -131,16 +122,16 @@
                     if (current > total) {
                         current = 0 // Reset to beginning.
                     }
-                    job.getProgressInfo().setCurrent(current)
-                    if (job.getProgressText().startsWith("Calculating")) {
-                        job.getProgressInfo()
-                            .setMessage("Calculating statistics...  " + Math.round((100 * current / total).toFloat()) + "%")
+                    job.progressInfo.current = current
+                    if (job.progressText.startsWith("Calculating")) {
+                        job.progressInfo.message =
+                            "Calculating statistics...  " + Math.round((100 * current / total).toFloat()) + "%"
                     }
                     job.buildProgressText()
                 }
             }
         }
-        return JsonUtils.toJson(list, prettyPrinter)
+        return list
     }
 
     /**
@@ -169,28 +160,28 @@
             .setProgressInfo(progressInfo)
             .setStatus(AbstractJob.Status.QUEUED)
         if ("info" == operation) {
-            progressInfo.setMessage("Calculating statistics... ")
-            job.setDescription("Loading info of archive '" + host + "-2018-12-05T23:10:33' of repo '" + queue.getRepo() + "'.")
-                .setCommandLineAsString("borg info --json --log-json --progress ssh://...:23/./backups/$host::$host-2018-12-05T23:10:33")
+            progressInfo.message = "Calculating statistics... "
+            job.setDescription("Loading info of archive '" + host + "-2018-12-05T23:10:33' of repo '" + queue.repo + "'.").commandLineAsString =
+                "borg info --json --log-json --progress ssh://...:23/./backups/$host::$host-2018-12-05T23:10:33"
         } else {
-            progressInfo.setMessage("Getting file list... ")
-            job.setDescription("Loading list of files of archive '" + host + "-2018-12-05T17:30:38' of repo '" + queue.getRepo() + "'.")
-                .setCommandLineAsString("borg list --json-lines ssh://...:23/./backups/$host::$host-2018-12-05T17:30:38")
+            progressInfo.message = "Getting file list... "
+            job.setDescription("Loading list of files of archive '" + host + "-2018-12-05T17:30:38' of repo '" + queue.repo + "'.").commandLineAsString =
+                "borg list --json-lines ssh://...:23/./backups/$host::$host-2018-12-05T17:30:38"
         }
         job.buildProgressText()
         if (current >= 0) {
-            job.setStatus(AbstractJob.Status.RUNNING)
+            job.status = AbstractJob.Status.RUNNING
         } else {
-            job.setStatus(AbstractJob.Status.QUEUED)
+            job.status = AbstractJob.Status.QUEUED
         }
-        if (queue.getJobs() == null) {
-            queue.setJobs(ArrayList<JsonJob>())
+        if (queue.jobs == null) {
+            queue.jobs = ArrayList<JsonJob>()
         }
-        job.setUniqueJobNumber(uniqueNumber)
+        job.uniqueJobNumber = uniqueNumber
         if (oldJobs) {
-            job.setStatus(if (uniqueNumber % 2 == 0L) AbstractJob.Status.CANCELLED else AbstractJob.Status.DONE)
+            job.status = if (uniqueNumber % 2 == 0L) AbstractJob.Status.CANCELLED else AbstractJob.Status.DONE
         }
-        queue.getJobs().add(job)
+        queue.jobs.add(job)
         return job
     }
 
diff --git a/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/LoggingRest.kt b/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/LoggingRest.kt
index 24036a3..fa2a56e 100644
--- a/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/LoggingRest.kt
+++ b/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/LoggingRest.kt
@@ -1,11 +1,10 @@
 package de.micromata.borgbutler.server.rest
 
-import de.micromata.borgbutler.json.JsonUtils
-import de.micromata.borgbutler.server.logging.LoggerMemoryAppender
 import de.micromata.borgbutler.server.logging.LogFilter
 import de.micromata.borgbutler.server.logging.LogLevel
+import de.micromata.borgbutler.server.logging.LoggerMemoryAppender
+import de.micromata.borgbutler.server.logging.LoggingEventData
 import mu.KotlinLogging
-import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.web.bind.annotation.GetMapping
 import org.springframework.web.bind.annotation.RequestMapping
 import org.springframework.web.bind.annotation.RequestParam
@@ -24,7 +23,6 @@
      * @param maxSize          Max size of the result list.
      * @param ascendingOrder   Default is false (default is descending order).
      * @param lastReceivedOrderNumber The last received order number for updating log entries (preventing querying all entries again).
-     * @param prettyPrinter
      * @return
      */
     @GetMapping("query")
@@ -34,34 +32,33 @@
         @RequestParam("treshold", required = false) logLevelTreshold: String?,
         @RequestParam("maxSize", required = false) maxSize: Int?,
         @RequestParam("ascendingOrder", required = false) ascendingOrder: Boolean?,
-        @RequestParam("lastReceivedOrderNumber", required = false) lastReceivedOrderNumber: Int?,
-        @RequestParam("prettyPrinter", required = false) prettyPrinter: Boolean?
-    ): String {
+        @RequestParam("lastReceivedOrderNumber", required = false) lastReceivedOrderNumber: Int?
+    ): List<LoggingEventData> {
         val filter = LogFilter()
-        filter.setSearch(search)
+        filter.search = search
         if (logLevelTreshold != null) {
             try {
                 val treshold =
                     LogLevel.valueOf(logLevelTreshold.trim { it <= ' ' }
                         .toUpperCase())
-                filter.setThreshold(treshold)
+                filter.threshold = treshold
             } catch (ex: IllegalArgumentException) {
                 log.error("Can't parse log level treshold: " + logLevelTreshold + ". Supported values (case insensitive): " + LogLevel.getSupportedValues())
             }
         }
-        if (filter.getThreshold() == null) {
-            filter.setThreshold(LogLevel.INFO)
+        if (filter.threshold == null) {
+            filter.threshold = LogLevel.INFO
         }
         if (maxSize != null) {
-            filter.setMaxSize(maxSize)
+            filter.maxSize = maxSize
         }
         if (ascendingOrder != null && ascendingOrder == true) {
-            filter.setAscendingOrder(true)
+            filter.isAscendingOrder = true
         }
         if (lastReceivedOrderNumber != null) {
-            filter.setLastReceivedLogOrderNumber(lastReceivedOrderNumber)
+            filter.lastReceivedLogOrderNumber = lastReceivedOrderNumber
         }
         val loggerMemoryAppender = LoggerMemoryAppender.getInstance()
-        return JsonUtils.toJson(loggerMemoryAppender.query(filter, RestUtils.getUserLocale(request!!)), prettyPrinter)
+        return loggerMemoryAppender.query(filter, RestUtils.getUserLocale(request!!))
     }
 }
diff --git a/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/ReposRest.kt b/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/ReposRest.kt
index eed277a..3466991 100644
--- a/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/ReposRest.kt
+++ b/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/ReposRest.kt
@@ -4,7 +4,6 @@
 import de.micromata.borgbutler.data.Repository
 import de.micromata.borgbutler.json.JsonUtils
 import mu.KotlinLogging
-import org.apache.commons.collections4.CollectionUtils
 import org.springframework.web.bind.annotation.GetMapping
 import org.springframework.web.bind.annotation.RequestMapping
 import org.springframework.web.bind.annotation.RequestParam
@@ -16,51 +15,40 @@
 @RequestMapping("/rest/repos")
 class ReposRest {
     /**
-     *
-     * @param prettyPrinter If true then the json output will be in pretty format.
      * @return A list of repositories of type [BorgRepository].
      * @see JsonUtils.toJson
      */
     @GetMapping("list")
-    fun getList(@RequestParam("prettyPrinter", required = false) prettyPrinter: Boolean?): String {
-        val repositories: List<Repository?> = ButlerCache.getInstance().getAllRepositories()
-        return if (CollectionUtils.isEmpty(repositories)) {
-            "[]"
-        } else JsonUtils.toJson(repositories, prettyPrinter)
+    fun getList(): List<Repository> {
+        return ButlerCache.getInstance().allRepositories
     }
 
     /**
      *
      * @param id id or name of repo.
-     * @param prettyPrinter If true then the json output will be in pretty format.
      * @return [Repository] (without list of archives) as json string.
      * @see JsonUtils.toJson
      */
     @GetMapping("repo")
-    fun getRepo(@RequestParam("id") id: String,
-                @RequestParam("prettyPrinter", required = false) prettyPrinter: Boolean?): String {
-        val repository: Repository = ButlerCache.getInstance().getRepository(id)
-        return JsonUtils.toJson(repository, prettyPrinter)
+    fun getRepo(@RequestParam("id") id: String): Repository? {
+        return ButlerCache.getInstance().getRepository(id)
     }
 
     /**
      *
      * @param id id or name of repo.
-     * @param prettyPrinter If true then the json output will be in pretty format.
      * @return [Repository] (including list of archives) as json string.
      * @see JsonUtils.toJson
      */
     @GetMapping("repoArchiveList")
     fun getRepoArchiveList(
         @RequestParam("id") id: String,
-        @RequestParam("force", required = false) force: Boolean?,
-        @RequestParam("prettyPrinter", required = false) prettyPrinter: Boolean?
-    ): String {
+        @RequestParam("force", required = false) force: Boolean?
+    ): Repository? {
         if (force == true) {
             val repo: Repository = ButlerCache.getInstance().getRepository(id)
             ButlerCache.getInstance().clearRepoCacheAccess(repo)
         }
-        val repository: Repository = ButlerCache.getInstance().getRepositoryArchives(id)
-        return JsonUtils.toJson(repository, prettyPrinter)
+        return ButlerCache.getInstance().getRepositoryArchives(id)
     }
 }
diff --git a/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/SystemInfoRest.kt b/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/SystemInfoRest.kt
index 28e6b87..90a79f1 100644
--- a/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/SystemInfoRest.kt
+++ b/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/SystemInfoRest.kt
@@ -16,9 +16,9 @@
      */
     @GetMapping("info")
     fun statistics(): SystemInfo {
-        val borgVersion = BorgInstallation.getInstance().getBorgVersion()
+        val borgVersion = BorgInstallation.getInstance().borgVersion
         val systemInfonfo = SystemInfo()
-            .setQueueStatistics(BorgQueueExecutor.getInstance().getStatistics())
+            .setQueueStatistics(BorgQueueExecutor.getInstance().statistics)
             .setConfigurationOK(borgVersion.isVersionOK)
             .setBorgVersion(borgVersion)
         return systemInfonfo
diff --git a/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/VersionRest.kt b/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/VersionRest.kt
index dfa3165..548bbdd 100644
--- a/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/VersionRest.kt
+++ b/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/VersionRest.kt
@@ -6,7 +6,6 @@
 import org.apache.commons.lang3.StringUtils
 import org.springframework.web.bind.annotation.GetMapping
 import org.springframework.web.bind.annotation.RequestMapping
-import org.springframework.web.bind.annotation.RequestParam
 import org.springframework.web.bind.annotation.RestController
 import java.util.*
 import javax.servlet.http.HttpServletRequest
@@ -17,28 +16,21 @@
     /**
      *
      * @param request For detecting the user's client locale.
-     * @param prettyPrinter If true then the json output will be in pretty format.
      * @see JsonUtils.toJson
      */
     @GetMapping("version")
-    fun getVersion(
-        request: HttpServletRequest,
-        @RequestParam("prettyPrinter", required = false) prettyPrinter: Boolean?
-    ): String {
+    fun getVersion(request: HttpServletRequest): MyVersion {
         val user = RestUtils.getUser()
         var language = Languages.asString(user.getLocale())
         if (StringUtils.isBlank(language)) {
             val locale: Locale = request.locale
-            language = locale.getLanguage()
+            language = locale.language
         }
-        val version = MyVersion(language, RestUtils.checkLocalDesktopAvailable(request) == null)
-        return JsonUtils.toJson(version, prettyPrinter)
+        return MyVersion(language, RestUtils.checkLocalDesktopAvailable(request) == null)
     }
 
-    inner class MyVersion(language: String, localDesktopAvailable: Boolean) {
-        private val version: Version
-        val language: String
-        val isLocalDesktopAvailable: Boolean
+    inner class MyVersion(val language: String, val localDesktopAvailable: Boolean) {
+        private val version: Version = Version.getInstance()
         val appName: String
             get() = version.appName
 
@@ -57,10 +49,5 @@
         val updateVersion: String?
             get() = version.updateVersion
 
-        init {
-            version = Version.getInstance()
-            this.language = language
-            isLocalDesktopAvailable = localDesktopAvailable
-        }
     }
 }

--
Gitblit v1.10.0