You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by jo...@apache.org on 2021/12/10 15:08:02 UTC

[isis] branch master updated: ISIS-2913 SessionManager extracted from UiManager, sample icons changed

This is an automated email from the ASF dual-hosted git repository.

joergrade pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/master by this push:
     new 9cbcde5  ISIS-2913 SessionManager extracted from UiManager, sample icons changed
     new f29d238  Merge remote-tracking branch 'origin/master'
9cbcde5 is described below

commit 9cbcde574419a89dc8accba4068f10171045279d
Author: Jörg Rade <jo...@kuehne-nagel.com>
AuthorDate: Fri Dec 10 16:07:29 2021 +0100

    ISIS-2913 SessionManager extracted from UiManager, sample icons changed
---
 .../org/apache/isis/client/kroviz/core/Session.kt  |  10 ++++-
 .../kroviz/core/aggregator/ErrorDispatcher.kt      |   4 +-
 .../client/kroviz/core/event/ReplayController.kt   |   8 ++--
 .../isis/client/kroviz/core/event/ResourceProxy.kt |   7 ++--
 .../client/kroviz/core/event/RoXmlHttpRequest.kt   |  15 +++----
 .../isis/client/kroviz/core/model/ObjectDM.kt      |   5 ++-
 .../apache/isis/client/kroviz/ui/core/Constants.kt |   2 +
 .../isis/client/kroviz/ui/core/MenuFactory.kt      |   2 +-
 .../apache/isis/client/kroviz/ui/core/RoIconBar.kt |   2 +-
 .../apache/isis/client/kroviz/ui/core/RoMenuBar.kt |  31 ++++++++------
 .../{core/Session.kt => ui/core/SessionManager.kt} |  46 ++++++++++++++-------
 .../apache/isis/client/kroviz/ui/core/UiManager.kt |  37 +++--------------
 .../client/kroviz/ui/diagram/LinkTreeDiagram.kt    |   5 ++-
 .../isis/client/kroviz/ui/dialog/DiagramDialog.kt  |   7 +---
 .../isis/client/kroviz/ui/dialog/EventDialog.kt    |   5 ++-
 .../client/kroviz/ui/dialog/EventExportDialog.kt   |   7 ++--
 .../client/kroviz/ui/dialog/EventImportDialog.kt   |   7 ++--
 .../isis/client/kroviz/ui/dialog/EventLogDetail.kt |   7 +---
 .../client/kroviz/ui/dialog/EventReplayDialog.kt   |   5 ++-
 .../isis/client/kroviz/ui/dialog/LoginPrompt.kt    |   7 +---
 .../client/kroviz/ui/panel/DynamicMenuBuilder.kt   |   3 +-
 .../apache/isis/client/kroviz/utils/StringUtils.kt |   3 +-
 .../resources/img/1200px-DEU_Hamburg_COA.svg.png   | Bin 0 -> 84730 bytes
 .../kroviz/src/main/resources/img/incode_org.gif   | Bin 6591 -> 0 bytes
 .../main/resources/img/wv-amsterdam-favicon-05.png | Bin 0 -> 3999 bytes
 .../apache/isis/client/kroviz/IntegrationTest.kt   |   5 ++-
 .../core/aggregator/CollectionAggregatorTest.kt    |   5 ++-
 .../kroviz/snapshots/ResponseRegressionTest.kt     |   4 +-
 .../org/apache/isis/client/kroviz/to/ActionTest.kt |   3 +-
 .../isis/client/kroviz/to/ResultValueTest.kt       |   3 +-
 .../isis/client/kroviz/ui/ClassDiagramTest.kt      |   3 +-
 .../isis/client/kroviz/util/StringUtilsTest.kt     |   5 ++-
 32 files changed, 132 insertions(+), 121 deletions(-)

diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/Session.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/Session.kt
index afb43b5..02862c8 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/Session.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/Session.kt
@@ -18,8 +18,9 @@
  */
 package org.apache.isis.client.kroviz.core
 
+import io.kvision.core.ResString
 import org.apache.isis.client.kroviz.core.event.EventStore
-import org.apache.isis.client.kroviz.ui.core.UiManager
+import org.apache.isis.client.kroviz.ui.core.Constants
 import org.apache.isis.client.kroviz.utils.StringUtils
 
 /**
@@ -29,13 +30,18 @@ class Session {
     private var user: String = ""
     private var pw: String = ""
     var baseUrl: String = ""
+    var resString: ResString? = null
     val eventStore = EventStore()
 
     fun login(url: String, user: String, pw: String) {
         this.user = user
         this.pw = pw
         this.baseUrl = url
-        UiManager.updateUser(user)
+        if (url.contains("localhost")) {
+            this.resString = Constants.demoImage
+        } else {
+            this.resString = Constants.demoRemoteImage
+        }
     }
 
     fun getCredentials(): String {
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/ErrorDispatcher.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/ErrorDispatcher.kt
index 6b3a17c..97391b3 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/ErrorDispatcher.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/ErrorDispatcher.kt
@@ -21,7 +21,7 @@ package org.apache.isis.client.kroviz.core.aggregator
 import org.apache.isis.client.kroviz.core.event.LogEntry
 import org.apache.isis.client.kroviz.core.event.ResourceSpecification
 import org.apache.isis.client.kroviz.to.HttpErrorResponse
-import org.apache.isis.client.kroviz.ui.core.UiManager
+import org.apache.isis.client.kroviz.ui.core.SessionManager
 import org.apache.isis.client.kroviz.ui.dialog.ErrorDialog
 
 class ErrorDispatcher : BaseAggregator() {
@@ -31,7 +31,7 @@ class ErrorDispatcher : BaseAggregator() {
         val url = logEntry.url
         val message = error.getMessage()
         val reSpec = ResourceSpecification(url)
-        UiManager.getEventStore().fault(reSpec, message)
+        SessionManager.getEventStore().fault(reSpec, message)
         ErrorDialog(logEntry).open()
     }
 
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/ReplayController.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/ReplayController.kt
index b10daf9..830ce85 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/ReplayController.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/ReplayController.kt
@@ -23,11 +23,13 @@ import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.asCoroutineDispatcher
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.launch
+import org.apache.isis.client.kroviz.core.Session
 import org.apache.isis.client.kroviz.main
 import org.apache.isis.client.kroviz.to.Link
 import org.apache.isis.client.kroviz.to.Represention
 import org.apache.isis.client.kroviz.to.TObject
 import org.apache.isis.client.kroviz.ui.core.Constants
+import org.apache.isis.client.kroviz.ui.core.SessionManager
 import org.apache.isis.client.kroviz.ui.core.UiManager
 import org.apache.isis.client.kroviz.ui.dialog.Controller
 import org.apache.isis.client.kroviz.ui.dialog.EventReplayDialog
@@ -35,8 +37,8 @@ import org.apache.isis.client.kroviz.ui.dialog.EventReplayDialog
 val AppScope = CoroutineScope(window.asCoroutineDispatcher())
 
 class ReplayController : Controller() {
-    private val eventStore = UiManager.getEventStore()
-    private val oldBaseUrl = UiManager.getBaseUrl()
+    private val eventStore = SessionManager.getEventStore()
+    private val oldBaseUrl = SessionManager.getBaseUrl()
     private var urlUnderTest: String = Constants.demoUrlRemote
     private var userUnderTest: String = Constants.demoUser
     private var passUnderTest: String = Constants.demoPass
@@ -51,7 +53,7 @@ class ReplayController : Controller() {
         val expectedEvents = copyEvents(eventStore.log)
         eventStore.reset()
         main() // re-creates the UI, but keeps the UiManager(singleton/object) and the session
-        UiManager.login(urlUnderTest, userUnderTest, passUnderTest)
+        SessionManager.login(urlUnderTest, userUnderTest, passUnderTest)
 
         val uiEvents = filterReplayEvents(expectedEvents)
         replay(uiEvents, urlUnderTest)
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/ResourceProxy.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/ResourceProxy.kt
index 0ef46f7..0c7f7c7 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/ResourceProxy.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/ResourceProxy.kt
@@ -26,6 +26,7 @@ import org.apache.isis.client.kroviz.handler.ResponseHandler
 import org.apache.isis.client.kroviz.to.Link
 import org.apache.isis.client.kroviz.to.TObject
 import org.apache.isis.client.kroviz.ui.core.Constants
+import org.apache.isis.client.kroviz.ui.core.SessionManager
 import org.apache.isis.client.kroviz.ui.core.UiManager
 import org.apache.isis.client.kroviz.ui.diagram.Node
 import org.apache.isis.client.kroviz.ui.diagram.Tree
@@ -46,7 +47,7 @@ class ResourceProxy {
     fun load(tObject: TObject) {
         val aggregator = ObjectAggregator(tObject.title)
         // ASSUMPTION: there can be max one LogEntry for an Object
-        val le = UiManager.getEventStore().findBy(tObject)
+        val le = SessionManager.getEventStore().findBy(tObject)
         if (le != null) {
             le.addAggregator(aggregator)
             aggregator.update(le, le.subType)
@@ -60,7 +61,7 @@ class ResourceProxy {
               isRest: Boolean = true,
               referrer: String = "") {
         val rs = ResourceSpecification(link.href, subType = subType, referrerUrl = referrer)
-        val isCached = when (val le = UiManager.getEventStore().findBy(rs)) {
+        val isCached = when (val le = SessionManager.getEventStore().findBy(rs)) {
             null -> false
             else -> le.isCached(rs, link.method)
         }
@@ -84,7 +85,7 @@ class ResourceProxy {
     }
 
     private fun processCached(rs: ResourceSpecification, aggregator: BaseAggregator?) {
-        val es = UiManager.getEventStore()
+        val es = SessionManager.getEventStore()
         val le = es.findBy(rs)!!
         le.retrieveResponse()
         if (aggregator == null) {
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/RoXmlHttpRequest.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/RoXmlHttpRequest.kt
index 2a0b544..a56d2d6 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/RoXmlHttpRequest.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/RoXmlHttpRequest.kt
@@ -25,6 +25,7 @@ import org.apache.isis.client.kroviz.to.Link
 import org.apache.isis.client.kroviz.to.Method
 import org.apache.isis.client.kroviz.to.TObject
 import org.apache.isis.client.kroviz.ui.core.Constants
+import org.apache.isis.client.kroviz.ui.core.SessionManager
 import org.apache.isis.client.kroviz.ui.core.UiManager
 import org.apache.isis.client.kroviz.utils.StringUtils
 import org.apache.isis.client.kroviz.utils.UrlUtils
@@ -49,7 +50,7 @@ class RoXmlHttpRequest(val aggregator: BaseAggregator?) {
         if (method != Method.POST.operation) {
             url += StringUtils.argumentsAsUrlParameter(link)
         }
-        val credentials: String = UiManager.getCredentials()
+        val credentials: String = SessionManager.getCredentials()
 
         xhr.open(method, url, true)
         xhr.setRequestHeader("Authorization", "Basic $credentials")
@@ -66,14 +67,14 @@ class RoXmlHttpRequest(val aggregator: BaseAggregator?) {
             body.isEmpty() -> xhr.send()
             else -> xhr.send(body)
         }
-        UiManager.getEventStore().start(rs, method, body, aggregator)
+        SessionManager.getEventStore().start(rs, method, body, aggregator)
     }
 
     private fun buildBody(link: Link): String {
         return when {
             link.hasArguments() -> StringUtils.argumentsAsBody(link)
             link.method == Method.PUT.operation -> {
-                val logEntry = UiManager.getEventStore().findBy(aggregator!!)
+                val logEntry = SessionManager.getEventStore().findBy(aggregator!!)
                 when (val obj = logEntry?.obj) {
                     is TObject -> StringUtils.propertiesAsBody(obj)
                     else -> ""
@@ -95,7 +96,7 @@ class RoXmlHttpRequest(val aggregator: BaseAggregator?) {
         xhr.send(body)
         val rs = buildResourceSpecificationAndSetupHandler(url, subType, body)
 
-        UiManager.getEventStore().start(rs, method, body, aggregator)
+        SessionManager.getEventStore().start(rs, method, body, aggregator)
     }
 
     internal fun invokeKroki(pumlCode: String) {
@@ -109,7 +110,7 @@ class RoXmlHttpRequest(val aggregator: BaseAggregator?) {
         val rs = buildResourceSpecificationAndSetupHandler(url, Constants.subTypeJson, pumlCode)
 
         xhr.send(pumlCode)
-        UiManager.getEventStore().start(rs, method, pumlCode, aggregator)
+        SessionManager.getEventStore().start(rs, method, pumlCode, aggregator)
     }
 
     private fun buildResourceSpecificationAndSetupHandler(
@@ -126,7 +127,7 @@ class RoXmlHttpRequest(val aggregator: BaseAggregator?) {
 
     private fun handleResult(rs: ResourceSpecification, body: String) {
         val response: Any? = xhr.response
-        val le: LogEntry? = UiManager.getEventStore().end(rs, body, response)
+        val le: LogEntry? = SessionManager.getEventStore().end(rs, body, response)
         if (le != null) {
             when {
                 aggregator == null -> ResponseHandler.handle(le)
@@ -143,7 +144,7 @@ class RoXmlHttpRequest(val aggregator: BaseAggregator?) {
             XMLHttpRequestResponseType.TEXT -> xhr.responseText
             else -> "neither text nor blob"
         }
-        UiManager.getEventStore().fault(rs, error)
+        SessionManager.getEventStore().fault(rs, error)
     }
 
 }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/ObjectDM.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/ObjectDM.kt
index 94f4e07..6de2857 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/ObjectDM.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/ObjectDM.kt
@@ -21,6 +21,7 @@ package org.apache.isis.client.kroviz.core.model
 import org.apache.isis.client.kroviz.core.event.ResourceProxy
 import org.apache.isis.client.kroviz.core.event.ResourceSpecification
 import org.apache.isis.client.kroviz.to.*
+import org.apache.isis.client.kroviz.ui.core.SessionManager
 import org.apache.isis.client.kroviz.ui.core.UiManager
 
 class ObjectDM(override val title: String) : DisplayModelWithLayout() {
@@ -50,7 +51,7 @@ class ObjectDM(override val title: String) : DisplayModelWithLayout() {
             val delegate = (data as Exposer).delegate
             val selfLink = delegate.getSelfLink()
             val rs = ResourceSpecification(selfLink.href)
-            val es = UiManager.getEventStore()
+            val es = SessionManager.getEventStore()
             val le = es.findBy(rs)!!
             val aggt = le.getAggregator()
             console.log(aggt)
@@ -94,7 +95,7 @@ class ObjectDM(override val title: String) : DisplayModelWithLayout() {
             val getLink = tObject.links.first()
             val href = getLink.href
             val reSpec = ResourceSpecification(href)
-            val es = UiManager.getEventStore()
+            val es = SessionManager.getEventStore()
             //WATCHOUT this is sequence dependent: GET and PUT share the same URL - if called after PUTting, it may fail
             val getLogEntry = es.findBy(reSpec)!!
             getLogEntry.setReload()
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/Constants.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/Constants.kt
index b546274..9115225 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/Constants.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/Constants.kt
@@ -36,9 +36,11 @@ object Constants {
     // docker run -d --name kroki -p 8080:8000 yuzutech/kroki
 
     const val demoUrl = "http://localhost:8080/"
+    val demoImage = io.kvision.require("img/1200px-DEU_Hamburg_COA.svg.png")
     const val demoUser = "sven"
     const val demoPass = "pass"
     const val demoUrlRemote = "https://demo-wicket.jdo.isis.incode.work/"
+    val demoRemoteImage = io.kvision.require("img/wv-amsterdam-favicon-05.png")
     const val domoxUrl = "http://localhost:8081/"
 
     const val spacing = 10
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/MenuFactory.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/MenuFactory.kt
index e0dd415..ecc551c 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/MenuFactory.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/MenuFactory.kt
@@ -103,7 +103,7 @@ object MenuFactory {
     }
 
     private fun findMenuByTitle(menuTitle: String): Menu? {
-        val menuBars = UiManager.getEventStore().findMenuBars()!!.obj as Menubars
+        val menuBars = SessionManager.getEventStore().findMenuBars()!!.obj as Menubars
         var menu = findMenu(menuBars.primary, menuTitle)
         if (menu == null) menu = findMenu(menuBars.secondary, menuTitle)
         if (menu == null) menu = findMenu(menuBars.tertiary, menuTitle)
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/RoIconBar.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/RoIconBar.kt
index 99bd36e..53c7a9a 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/RoIconBar.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/RoIconBar.kt
@@ -100,7 +100,7 @@ class RoIconBar : SimplePanel() {
 
     private fun createObjectIcon(url: String): DropDown? {
         val reSpec = ResourceSpecification(url)
-        val logEntry = UiManager.getEventStore().findBy(reSpec)!!
+        val logEntry = SessionManager.getEventStore().findBy(reSpec)!!
         return when (val obj = logEntry.obj) {
             (obj == null) -> null
             is TObject -> {
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/RoMenuBar.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/RoMenuBar.kt
index 90932d5..21aaa62 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/RoMenuBar.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/RoMenuBar.kt
@@ -26,12 +26,12 @@ import io.kvision.dropdown.DropDown
 import io.kvision.dropdown.separator
 import io.kvision.html.ButtonStyle
 import io.kvision.html.Link
-import io.kvision.html.image
 import io.kvision.navbar.*
 import io.kvision.panel.SimplePanel
 import io.kvision.panel.vPanel
-import io.kvision.require
 import io.kvision.utils.px
+import org.apache.isis.client.kroviz.core.Session
+import org.apache.isis.client.kroviz.core.event.EventStore
 import org.apache.isis.client.kroviz.to.mb.Menubars
 import org.apache.isis.client.kroviz.ui.chart.SampleChartModel
 import org.apache.isis.client.kroviz.ui.dialog.*
@@ -61,21 +61,26 @@ class RoMenuBar : SimplePanel() {
         }
     }
 
-    fun updateMainIcon() {
-        val resString = require("img/gift_48.png")
-        mainEntry.image = resString
-        mainEntry.icon = null
-        mainEntry.image.apply { systemIconStyle }
-        insertConnection()
+    private fun testFirstSession() {
+        mainEntry.separator()
+        val session = SessionManager.getSession()
+        insertSession(session)
     }
 
-    fun insertConnection() {
-        mainEntry.separator()
-        val resString = require("img/gift_48.png")
-        val menuEntry = buildMenuEntryWithImage("Connection 1", image = resString, { LoginPrompt().open() })
+    private fun insertSession(session:Session) {
+        val menuEntry = buildMenuEntryWithImage(
+            session.baseUrl,
+            image = session.resString,
+            { this.switch(session) })
         mainEntry.add(menuEntry)
     }
 
+    private fun switch(session: Session) {
+        mainEntry.image = session.resString
+        mainEntry.icon = null
+        mainEntry.image.apply { systemIconStyle }
+    }
+
     private fun buildMenuEntryWithImage(label: String, image: ResString?, action: dynamic): Link {
         val link = Link(label, image = image, className = "dropdown-item").apply { appIconStyle }
         link.onClick { e ->
@@ -158,7 +163,7 @@ class RoMenuBar : SimplePanel() {
 
         val testTitle = "Test"
         mainMenu.add(
-            buildMenuEntry(testTitle, "Test", { this.updateMainIcon() })
+            buildMenuEntry(testTitle, "Test", { this.testFirstSession() })
         )
 
         mainMenu.add(
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/Session.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/SessionManager.kt
similarity index 54%
copy from incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/Session.kt
copy to incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/SessionManager.kt
index afb43b5..fdfd729 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/Session.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/SessionManager.kt
@@ -16,30 +16,44 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.client.kroviz.core
+package org.apache.isis.client.kroviz.ui.core
 
+import org.apache.isis.client.kroviz.core.Session
 import org.apache.isis.client.kroviz.core.event.EventStore
-import org.apache.isis.client.kroviz.ui.core.UiManager
-import org.apache.isis.client.kroviz.utils.StringUtils
 
 /**
- * Keep track of connected server.
+ * Single point of contact for view components consisting of:
+ * @item Session
  */
-class Session {
-    private var user: String = ""
-    private var pw: String = ""
-    var baseUrl: String = ""
-    val eventStore = EventStore()
-
-    fun login(url: String, user: String, pw: String) {
-        this.user = user
-        this.pw = pw
-        this.baseUrl = url
-        UiManager.updateUser(user)
+object SessionManager {
+
+    private val sessions = mutableListOf<Session>()
+
+    fun getSession(): Session {
+        return sessions.first()
+    }
+
+    fun getBaseUrl(): String {
+        val s = getSession()
+        return when (s) {
+            null -> ""
+            else -> s.baseUrl
+        }
+    }
+
+    fun getEventStore(): EventStore {
+        return getSession().eventStore
+    }
+
+    fun login(url: String, username: String, password: String) {
+        val s = Session()
+        s.login(url, username, password)
+        sessions.add(0, s)
+        UiManager.updateUser(username)
     }
 
     fun getCredentials(): String {
-        return StringUtils.base64encoded("$user:$pw")
+        return getSession().getCredentials()
     }
 
 }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/UiManager.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/UiManager.kt
index 9f7a6ad..d107020 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/UiManager.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/UiManager.kt
@@ -27,7 +27,6 @@ import io.kvision.utils.ESC_KEY
 import kotlinx.browser.document
 import kotlinx.browser.window
 import org.apache.isis.client.kroviz.App
-import org.apache.isis.client.kroviz.core.Session
 import org.apache.isis.client.kroviz.core.aggregator.BaseAggregator
 import org.apache.isis.client.kroviz.core.aggregator.ObjectAggregator
 import org.apache.isis.client.kroviz.core.aggregator.UndefinedDispatcher
@@ -48,12 +47,10 @@ import org.w3c.dom.events.KeyboardEvent
  * @item RoMenubar,
  * @item RoView (tabs, etc.),
  * @item RoStatusbar,
- * @item Session
  */
 object UiManager {
 
     var app: App? = null
-    private val sessions = mutableListOf<Session>()
     private val popups = mutableListOf<Widget>()
     private val settings = mutableMapOf<String, Any>()
     var position: Point? = null
@@ -196,23 +193,7 @@ object UiManager {
         pop()
     }
 
-    fun getSession(): Session {
-        return sessions.first()
-    }
-
-    fun getBaseUrl(): String {
-        val s = getSession()
-        return when (s) {
-            null -> ""
-            else -> s.baseUrl
-        }
-    }
-
-    fun getEventStore(): EventStore {
-        return getSession().eventStore
-    }
-
-    fun loadDomainTypes(): Boolean {
+     fun loadDomainTypes(): Boolean {
         val k = "loadDomainTypes"
         return when {
             settings.containsKey(k) -> settings.getValue(k) as Boolean
@@ -220,17 +201,7 @@ object UiManager {
         }
     }
 
-    fun login(url: String, username: String, password: String) {
-        val s = Session()
-        s.login(url, username, password)
-        sessions.add(0, s)
-    }
-
-    fun getCredentials(): String {
-        return getSession().getCredentials()
-    }
-
-    private fun push(widget: Widget) {
+     private fun push(widget: Widget) {
         popups.add(widget)
     }
 
@@ -258,4 +229,8 @@ object UiManager {
         setNormalCursor()
     }
 
+    private fun getEventStore() : EventStore {
+        return SessionManager.getEventStore()
+    }
+
 }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/LinkTreeDiagram.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/LinkTreeDiagram.kt
index 1e80749..893c320 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/LinkTreeDiagram.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/LinkTreeDiagram.kt
@@ -26,12 +26,13 @@ import org.apache.isis.client.kroviz.to.HasLinks
 import org.apache.isis.client.kroviz.to.Property
 import org.apache.isis.client.kroviz.to.Relation
 import org.apache.isis.client.kroviz.to.Represention
+import org.apache.isis.client.kroviz.ui.core.SessionManager
 import org.apache.isis.client.kroviz.ui.core.UiManager
 import org.apache.isis.client.kroviz.utils.StringUtils
 
 object LinkTreeDiagram {
 
-    private val protocolHostPort = UiManager.getBaseUrl()
+    private val protocolHostPort = SessionManager.getBaseUrl()
 
     fun build(aggregator: BaseAggregator): String {
         val pc = PumlCode()
@@ -47,7 +48,7 @@ object LinkTreeDiagram {
     private fun toPumlCode(node: Node, level: Int): String {
         val url = node.name
         val rs = ResourceSpecification(url)
-        val le = UiManager.getEventStore().findBy(rs)
+        val le = SessionManager.getEventStore().findBy(rs)
         val pc = PumlCode()
         if (le != null) {
             val title = StringUtils.shortTitle(url)
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/DiagramDialog.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/DiagramDialog.kt
index 78df630..23670f7 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/DiagramDialog.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/DiagramDialog.kt
@@ -19,10 +19,7 @@
 package org.apache.isis.client.kroviz.ui.dialog
 
 import org.apache.isis.client.kroviz.to.ValueType
-import org.apache.isis.client.kroviz.ui.core.FormItem
-import org.apache.isis.client.kroviz.ui.core.MenuFactory
-import org.apache.isis.client.kroviz.ui.core.RoDialog
-import org.apache.isis.client.kroviz.ui.core.UiManager
+import org.apache.isis.client.kroviz.ui.core.*
 import org.apache.isis.client.kroviz.utils.*
 import io.kvision.html.Link as KvisionHtmlLink
 
@@ -65,7 +62,7 @@ class DiagramDialog(
     }
 
     private fun getDiagramCode(): String {
-        val logEntry = UiManager.getEventStore().findByDispatcher(callBack as UUID)
+        val logEntry = SessionManager.getEventStore().findByDispatcher(callBack as UUID)
         return logEntry.getResponse()
     }
 
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/EventDialog.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/EventDialog.kt
index eb0535f..ebe7657 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/EventDialog.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/EventDialog.kt
@@ -27,6 +27,7 @@ import org.apache.isis.client.kroviz.core.event.ReplayController
 import org.apache.isis.client.kroviz.to.ValueType
 import org.apache.isis.client.kroviz.ui.core.FormItem
 import org.apache.isis.client.kroviz.ui.core.RoDialog
+import org.apache.isis.client.kroviz.ui.core.SessionManager
 import org.apache.isis.client.kroviz.ui.core.UiManager
 import org.apache.isis.client.kroviz.ui.panel.EventLogTable
 
@@ -57,7 +58,7 @@ class EventDialog : Controller() {
             heightPerc = 70,
             customButtons = customButtons
         )
-        val eventTable = EventLogTable(UiManager.getEventStore().log)
+        val eventTable = EventLogTable(SessionManager.getEventStore().log)
         eventTable.tabulator.addCssClass("tabulator-in-dialog")
         eventPanel.add(eventTable)
 
@@ -71,7 +72,7 @@ class EventDialog : Controller() {
     override fun execute(action: String?) {
         when {
             action.isNullOrEmpty() -> {
-                UiManager.add("Event Log", EventLogTable(UiManager.getEventStore().log))
+                UiManager.add("Event Log", EventLogTable(SessionManager.getEventStore().log))
                 dialog.close()
             }
             action == EXP -> {
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/EventExportDialog.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/EventExportDialog.kt
index e8af8bb..83b0ce0 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/EventExportDialog.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/EventExportDialog.kt
@@ -26,6 +26,7 @@ import org.apache.isis.client.kroviz.ui.core.RoDialog
 import io.kvision.core.StringPair
 import io.kvision.form.select.SimpleSelect
 import org.apache.isis.client.kroviz.ui.core.FormItem
+import org.apache.isis.client.kroviz.ui.core.SessionManager
 import org.apache.isis.client.kroviz.ui.core.UiManager
 
 class EventExportDialog : Controller() {
@@ -35,7 +36,7 @@ class EventExportDialog : Controller() {
     val events = mutableListOf<ReplayEvent>()
 
     private fun collectReplayEvents() {
-        UiManager.getEventStore().log.forEach {
+        SessionManager.getEventStore().log.forEach {
             val re = buildExportEvent(it)
             when (it.state) {
                 EventState.SUCCESS_JS -> events.add(re)
@@ -100,7 +101,7 @@ class EventExportDialog : Controller() {
     }
 
     private fun collectUnfinishedEvents() {
-        UiManager.getEventStore().log.forEach {
+        SessionManager.getEventStore().log.forEach {
             val re = buildExportEvent(it)
             when (it.state) {
                 EventState.RUNNING -> events.add(re)
@@ -112,7 +113,7 @@ class EventExportDialog : Controller() {
     }
 
     private fun collectAllEvents() {
-        UiManager.getEventStore().log.forEach {
+        SessionManager.getEventStore().log.forEach {
             val re = buildExportEvent(it)
             events.add(re)
         }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/EventImportDialog.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/EventImportDialog.kt
index 42fa7ff..12d0689 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/EventImportDialog.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/EventImportDialog.kt
@@ -26,6 +26,7 @@ import org.apache.isis.client.kroviz.ui.core.RoDialog
 import io.kvision.core.StringPair
 import io.kvision.form.select.SimpleSelect
 import org.apache.isis.client.kroviz.ui.core.FormItem
+import org.apache.isis.client.kroviz.ui.core.SessionManager
 import org.apache.isis.client.kroviz.ui.core.UiManager
 
 class EventImportDialog : Controller() {
@@ -35,7 +36,7 @@ class EventImportDialog : Controller() {
     val events = mutableListOf<ReplayEvent>()
 
     private fun collectReplayEvents() {
-        UiManager.getEventStore().log.forEach {
+        SessionManager.getEventStore().log.forEach {
             val re = buildExportEvent(it)
             when (it.state) {
                 EventState.SUCCESS_JS -> events.add(re)
@@ -100,7 +101,7 @@ class EventImportDialog : Controller() {
     }
 
     private fun collectUnfinishedEvents() {
-        UiManager.getEventStore().log.forEach {
+        SessionManager.getEventStore().log.forEach {
             val re = buildExportEvent(it)
             when (it.state) {
                 EventState.RUNNING -> events.add(re)
@@ -112,7 +113,7 @@ class EventImportDialog : Controller() {
     }
 
     private fun collectAllEvents() {
-        UiManager.getEventStore().log.forEach {
+        SessionManager.getEventStore().log.forEach {
             val re = buildExportEvent(it)
             events.add(re)
         }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/EventLogDetail.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/EventLogDetail.kt
index 22f6f0f..b388f2e 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/EventLogDetail.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/EventLogDetail.kt
@@ -22,10 +22,7 @@ import org.apache.isis.client.kroviz.core.event.LogEntry
 import org.apache.isis.client.kroviz.core.event.ResourceSpecification
 import org.apache.isis.client.kroviz.to.ValueType
 import org.apache.isis.client.kroviz.to.bs3.Grid
-import org.apache.isis.client.kroviz.ui.core.Constants
-import org.apache.isis.client.kroviz.ui.core.FormItem
-import org.apache.isis.client.kroviz.ui.core.RoDialog
-import org.apache.isis.client.kroviz.ui.core.UiManager
+import org.apache.isis.client.kroviz.ui.core.*
 import org.apache.isis.client.kroviz.ui.diagram.JsonDiagram
 import org.apache.isis.client.kroviz.ui.diagram.LayoutDiagram
 import org.apache.isis.client.kroviz.ui.diagram.LinkTreeDiagram
@@ -40,7 +37,7 @@ class EventLogDetail(logEntryFromTabulator: LogEntry) : Controller() {
         // For a yet unknown reason, aggregators are not transmitted via tabulator.
         // As a WORKAROUND, we fetch the full-blown LogEntry from the EventStore again.
         val rs = ResourceSpecification(logEntryFromTabulator.title)
-        logEntry = UiManager.getEventStore().findBy(rs) ?: logEntryFromTabulator  // in case of xml, we use the entry passed in
+        logEntry = SessionManager.getEventStore().findBy(rs) ?: logEntryFromTabulator  // in case of xml, we use the entry passed in
     }
 
     // callback parameter
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/EventReplayDialog.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/EventReplayDialog.kt
index 748cf16..7157b0a 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/EventReplayDialog.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/EventReplayDialog.kt
@@ -30,6 +30,7 @@ import org.apache.isis.client.kroviz.core.event.LogEntry
 import org.apache.isis.client.kroviz.core.event.LogEntryComparison
 import org.apache.isis.client.kroviz.core.event.ResourceSpecification
 import org.apache.isis.client.kroviz.ui.core.RoDialog
+import org.apache.isis.client.kroviz.ui.core.SessionManager
 import org.apache.isis.client.kroviz.ui.core.UiManager
 import org.apache.isis.client.kroviz.ui.panel.EventLogTable
 import org.apache.isis.client.kroviz.utils.StringUtils
@@ -58,7 +59,7 @@ class EventReplayDialog(
         )
         val expectedTable = EventLogTable(expectedEvents)
         expectedTable.tabulator.addCssClass("tabulator-in-dialog")
-        val actualEvents: MutableList<LogEntry> = UiManager.getEventStore().log
+        val actualEvents: MutableList<LogEntry> = SessionManager.getEventStore().log
 
         val actualTable = EventLogTable(actualEvents)
         actualTable.tabulator.addCssClass("tabulator-in-dialog")
@@ -76,7 +77,7 @@ class EventReplayDialog(
     override fun execute(action: String?) {
         val comparisonMap = mutableMapOf<String, LogEntryComparison>()
         // first pass: iterate over expected
-        val actualStore = UiManager.getEventStore()
+        val actualStore = SessionManager.getEventStore()
         expectedEvents.forEach {
             val shortTitle = StringUtils.shortTitle(it.title)
             val actualEvent: LogEntry? = actualStore.findBy(shortTitle)
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/LoginPrompt.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/LoginPrompt.kt
index b7246ca..2d157ae 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/LoginPrompt.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/LoginPrompt.kt
@@ -25,10 +25,7 @@ import io.kvision.form.text.Text
 import org.apache.isis.client.kroviz.core.event.ReplayController
 import org.apache.isis.client.kroviz.to.Link
 import org.apache.isis.client.kroviz.to.ValueType
-import org.apache.isis.client.kroviz.ui.core.Constants
-import org.apache.isis.client.kroviz.ui.core.FormItem
-import org.apache.isis.client.kroviz.ui.core.RoDialog
-import org.apache.isis.client.kroviz.ui.core.UiManager
+import org.apache.isis.client.kroviz.ui.core.*
 
 class LoginPrompt(val nextController: Controller? = null) : Controller() {
 
@@ -57,7 +54,7 @@ class LoginPrompt(val nextController: Controller? = null) : Controller() {
             nextController.initUnderTest(url, username, password)
             nextController.open()
         } else {
-            UiManager.login(url, username, password)
+            SessionManager.login(url, username, password)
             val link = Link(href = url + Constants.restInfix)
             invoke(link)
             UiManager.closeDialog(dialog)
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/panel/DynamicMenuBuilder.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/panel/DynamicMenuBuilder.kt
index 51d1792..d4f2f6e 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/panel/DynamicMenuBuilder.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/panel/DynamicMenuBuilder.kt
@@ -23,6 +23,7 @@ import io.kvision.utils.obj
 import org.apache.isis.client.kroviz.core.event.ResourceProxy
 import org.apache.isis.client.kroviz.to.TObject
 import org.apache.isis.client.kroviz.ui.chart.ChartFactory
+import org.apache.isis.client.kroviz.ui.core.SessionManager
 import org.apache.isis.client.kroviz.ui.core.UiManager
 import org.apache.isis.client.kroviz.ui.dialog.EventExportDialog
 import org.apache.isis.client.kroviz.utils.IconManager
@@ -59,7 +60,7 @@ class DynamicMenuBuilder {
 
         val title = "Chart"
         val a4 = buildMenuEntry(title, title, {
-            UiManager.add(title, ChartFactory().build(UiManager.getEventStore().log))
+            UiManager.add(title, ChartFactory().build(SessionManager.getEventStore().log))
         })
         menu.add(a4)
 
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/StringUtils.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/StringUtils.kt
index a27637a..9f736c1 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/StringUtils.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/StringUtils.kt
@@ -22,6 +22,7 @@ import org.apache.isis.client.kroviz.to.Argument
 import org.apache.isis.client.kroviz.to.Link
 import org.apache.isis.client.kroviz.to.TObject
 import org.apache.isis.client.kroviz.ui.core.Constants
+import org.apache.isis.client.kroviz.ui.core.SessionManager
 import org.apache.isis.client.kroviz.ui.core.UiManager
 
 object StringUtils {
@@ -228,7 +229,7 @@ object StringUtils {
         val signature = Constants.restInfix
         if (url.contains(signature)) {
             // strip off protocol, host, port
-            val protocolHostPort = UiManager.getBaseUrl()
+            val protocolHostPort = SessionManager.getBaseUrl()
             result = result.replace(protocolHostPort + signature, "")
             result = StringUtils.removeHexCode(result)
         }
diff --git a/incubator/clients/kroviz/src/main/resources/img/1200px-DEU_Hamburg_COA.svg.png b/incubator/clients/kroviz/src/main/resources/img/1200px-DEU_Hamburg_COA.svg.png
new file mode 100644
index 0000000..294cca0
Binary files /dev/null and b/incubator/clients/kroviz/src/main/resources/img/1200px-DEU_Hamburg_COA.svg.png differ
diff --git a/incubator/clients/kroviz/src/main/resources/img/incode_org.gif b/incubator/clients/kroviz/src/main/resources/img/incode_org.gif
deleted file mode 100644
index 20ee1d3..0000000
Binary files a/incubator/clients/kroviz/src/main/resources/img/incode_org.gif and /dev/null differ
diff --git a/incubator/clients/kroviz/src/main/resources/img/wv-amsterdam-favicon-05.png b/incubator/clients/kroviz/src/main/resources/img/wv-amsterdam-favicon-05.png
new file mode 100644
index 0000000..66ad072
Binary files /dev/null and b/incubator/clients/kroviz/src/main/resources/img/wv-amsterdam-favicon-05.png differ
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/IntegrationTest.kt b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/IntegrationTest.kt
index 8214df4..63db8ea 100644
--- a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/IntegrationTest.kt
+++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/IntegrationTest.kt
@@ -29,6 +29,7 @@ import org.apache.isis.client.kroviz.handler.ResponseHandler
 import org.apache.isis.client.kroviz.snapshots.Response
 import org.apache.isis.client.kroviz.to.Method
 import org.apache.isis.client.kroviz.ui.core.Constants
+import org.apache.isis.client.kroviz.ui.core.SessionManager
 import org.apache.isis.client.kroviz.ui.core.UiManager
 import org.apache.isis.client.kroviz.utils.XmlHelper
 import org.w3c.xhr.XMLHttpRequest
@@ -41,8 +42,8 @@ open class IntegrationTest {
         val user = "sven"
         val pw = "pass"
         val url = "http://${user}:${pw}@localhost:8080/restful/"
-        UiManager.login(url, user, pw)
-        val credentials: String = UiManager.getCredentials()
+        SessionManager.login(url, user, pw)
+        val credentials: String = SessionManager.getCredentials()
         val xhr = XMLHttpRequest()
         xhr.open("GET", url, false, user, pw)
         xhr.setRequestHeader("Authorization", "Basic $credentials")
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/core/aggregator/CollectionAggregatorTest.kt b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/core/aggregator/CollectionAggregatorTest.kt
index 557b0a6..14bc623 100644
--- a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/core/aggregator/CollectionAggregatorTest.kt
+++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/core/aggregator/CollectionAggregatorTest.kt
@@ -24,6 +24,7 @@ import org.apache.isis.client.kroviz.core.model.CollectionDM
 import org.apache.isis.client.kroviz.snapshots.simpleapp1_16_0.*
 import org.apache.isis.client.kroviz.to.Property
 import org.apache.isis.client.kroviz.to.Relation
+import org.apache.isis.client.kroviz.ui.core.SessionManager
 import org.apache.isis.client.kroviz.ui.core.UiManager
 import kotlin.test.assertEquals
 import kotlin.test.assertNotNull
@@ -37,7 +38,7 @@ class CollectionAggregatorTest : IntegrationTest() {
     fun testFixtureResult() {
         if (isAppAvailable()) {
             // given
-            val es = UiManager.getEventStore()
+            val es = SessionManager.getEventStore()
             es.reset()
             val obs = CollectionAggregator("test")
             // when
@@ -82,7 +83,7 @@ class CollectionAggregatorTest : IntegrationTest() {
     fun testService() {
         if (isAppAvailable()) {
             // given
-            UiManager.getEventStore().reset()
+            SessionManager.getEventStore().reset()
             val obs = CollectionAggregator("test")
             // when
             mockResponse(SO_LIST_ALL, obs)
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/ResponseRegressionTest.kt b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/ResponseRegressionTest.kt
index b22451b..0846b10 100644
--- a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/ResponseRegressionTest.kt
+++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/ResponseRegressionTest.kt
@@ -42,7 +42,7 @@ class ResponseRegressionTest {
         val user = "sven"
         val pw = "pass"
         val url = "http://${user}:${pw}@localhost:8080/restful/"
-        UiManager.login(url, user, pw)
+        SessionManager.login(url, user, pw)
     }
 
     @ExperimentalCoroutinesApi
@@ -50,7 +50,7 @@ class ResponseRegressionTest {
     fun testCompareSnapshotWithResponse() {
         //given
         val map = Response2Handler.map
-        val credentials = UiManager.getCredentials()
+        val credentials = SessionManager.getCredentials()
         //when
         console.log("[RRT.testCompareSnapshotWithResponse]")
         map.forEach { rh ->
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/to/ActionTest.kt b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/to/ActionTest.kt
index 11abd50..d348d25 100644
--- a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/to/ActionTest.kt
+++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/to/ActionTest.kt
@@ -24,6 +24,7 @@ import org.apache.isis.client.kroviz.core.event.ResourceProxy
 import org.apache.isis.client.kroviz.core.event.ResourceSpecification
 import org.apache.isis.client.kroviz.handler.ActionHandler
 import org.apache.isis.client.kroviz.snapshots.simpleapp1_16_0.*
+import org.apache.isis.client.kroviz.ui.core.SessionManager
 import org.apache.isis.client.kroviz.ui.core.UiManager
 import org.apache.isis.client.kroviz.utils.StringUtils
 import kotlin.test.Test
@@ -64,7 +65,7 @@ class ActionTest : IntegrationTest() {
             console.log(json)
             ResourceProxy().fetch(link, ActionDispatcher())
             val urlSpec = ResourceSpecification(url)
-            val es = UiManager.getEventStore()
+            val es = SessionManager.getEventStore()
             val le = es.findBy(urlSpec)!!
             console.log(es.log)
             console.log(le)
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/to/ResultValueTest.kt b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/to/ResultValueTest.kt
index 640ee7d..665cd39 100644
--- a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/to/ResultValueTest.kt
+++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/to/ResultValueTest.kt
@@ -24,6 +24,7 @@ import org.apache.isis.client.kroviz.core.aggregator.ObjectAggregator
 import org.apache.isis.client.kroviz.handler.ResultValueHandler
 import org.apache.isis.client.kroviz.snapshots.simpleapp1_16_0.ACTIONS_DOWNLOAD_VALUE
 import org.apache.isis.client.kroviz.snapshots.simpleapp1_16_0.ACTIONS_OPEN_SWAGGER_UI
+import org.apache.isis.client.kroviz.ui.core.SessionManager
 import org.apache.isis.client.kroviz.ui.core.UiManager
 import kotlin.test.Test
 import kotlin.test.assertEquals
@@ -48,7 +49,7 @@ class ResultValueTest : IntegrationTest() {
             // given
             val aggregator = ObjectAggregator("object test")
             // when
-            UiManager.getEventStore().reset()
+            SessionManager.getEventStore().reset()
             val logEntry = mockResponse(ACTIONS_DOWNLOAD_VALUE, aggregator)
             val ro = logEntry.getTransferObject() as ResultValue
             val type = ro.resulttype
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/ui/ClassDiagramTest.kt b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/ui/ClassDiagramTest.kt
index 318f674..7484ee8 100644
--- a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/ui/ClassDiagramTest.kt
+++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/ui/ClassDiagramTest.kt
@@ -22,6 +22,7 @@ package org.apache.isis.client.kroviz.ui
 import org.apache.isis.client.kroviz.handler.DomainTypeHandler
 import org.apache.isis.client.kroviz.snapshots.demo2_0_0.FILE_NODE
 import org.apache.isis.client.kroviz.to.DomainType
+import org.apache.isis.client.kroviz.ui.core.SessionManager
 import org.apache.isis.client.kroviz.ui.core.UiManager
 import org.apache.isis.client.kroviz.ui.diagram.ClassDiagram
 import kotlin.test.BeforeTest
@@ -35,7 +36,7 @@ class ClassDiagramTest {
         val user = "sven"
         val pw = "pass"
         val url = "http://${user}:${pw}@localhost:8080/restful/"
-        UiManager.login(url, user, pw)
+        SessionManager.login(url, user, pw)
     }
 
     @Test
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/util/StringUtilsTest.kt b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/util/StringUtilsTest.kt
index e545aee..7c25785 100644
--- a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/util/StringUtilsTest.kt
+++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/util/StringUtilsTest.kt
@@ -1,6 +1,7 @@
 package org.apache.isis.client.kroviz.util
 
 import org.apache.isis.client.kroviz.ui.core.Constants
+import org.apache.isis.client.kroviz.ui.core.SessionManager
 import org.apache.isis.client.kroviz.ui.core.UiManager
 import org.apache.isis.client.kroviz.utils.StringUtils
 import kotlin.test.Test
@@ -11,11 +12,11 @@ class StringUtilsTest {
     @Test
     fun testShortTitle() {
         // given
-        UiManager.login(Constants.demoUrl, Constants.demoUser, Constants.demoPass)
+        SessionManager.login(Constants.demoUrl, Constants.demoUser, Constants.demoPass)
         val url = "http://localhost:8080/restful/domain-types/demo.JavaLangStrings/collections/entities"
 
         // when
-        val protocolHostPort = UiManager.getBaseUrl()
+        val protocolHostPort = SessionManager.getBaseUrl()
         // then
         assertTrue(protocolHostPort.startsWith("http://"))