70105bca34f8518ff91d60fcbebd8d4a6e702da9
[Sone.git] / src / main / kotlin / net / pterodactylus / sone / web / PageToadletRegistry.kt
1 package net.pterodactylus.sone.web
2
3 import freenet.clients.http.*
4 import net.pterodactylus.sone.main.*
5 import net.pterodactylus.sone.web.page.*
6 import net.pterodactylus.util.web.*
7 import java.util.concurrent.atomic.*
8 import javax.inject.*
9
10 private const val soneMenu = "Navigation.Menu.Sone"
11 private const val soneMenuName = "$soneMenu.Name"
12
13 class PageToadletRegistry @Inject constructor(
14                 private val pageMaker: PageMaker,
15                 private val toadletContainer: ToadletContainer,
16                 private val sonePlugin: SonePlugin,
17                 private val pageToadletFactory: PageToadletFactory
18 ) {
19
20         private val pages = mutableListOf<Page<FreenetRequest>>()
21         private val debugPages = mutableListOf<Page<FreenetRequest>>()
22         private val registeredToadlets = mutableListOf<PageToadlet>()
23         private val registered = AtomicBoolean(false)
24
25         fun addPage(page: Page<FreenetRequest>) {
26                 if (registered.get()) throw IllegalStateException()
27                 pages += page
28         }
29
30         fun addDebugPage(page: Page<FreenetRequest>) {
31                 if (registered.get()) throw IllegalStateException()
32                 debugPages += page
33         }
34
35         fun registerToadlets() {
36                 registered.set(true)
37                 pageMaker.addNavigationCategory("/Sone/index.html", soneMenuName, "$soneMenu.Tooltip", sonePlugin)
38                 addPages()
39         }
40
41         private fun addPages(pages: List<Page<FreenetRequest>> = this.pages) =
42                         pages
43                                         .map { pageToadletFactory.createPageToadlet(it) }
44                                         .onEach(registeredToadlets::plusAssign)
45                                         .forEach { pageToadlet ->
46                                                 if (pageToadlet.menuName == null) {
47                                                         registerToadletWithoutMenuname(pageToadlet)
48                                                 } else {
49                                                         registerToadletWithMenuname(pageToadlet)
50                                                 }
51                                         }
52
53         private fun registerToadletWithoutMenuname(pageToadlet: PageToadlet) =
54                         toadletContainer.register(pageToadlet, null, pageToadlet.path(), true, false)
55
56         private fun registerToadletWithMenuname(pageToadlet: PageToadlet) =
57                         toadletContainer.register(pageToadlet, soneMenuName, pageToadlet.path(), true, "$soneMenu.Item.${pageToadlet.menuName}.Name", "$soneMenu.Item.${pageToadlet.menuName}.Tooltip", false, pageToadlet)
58
59         fun unregisterToadlets() {
60                 pageMaker.removeNavigationCategory(soneMenuName)
61                 registeredToadlets.forEach(toadletContainer::unregister)
62         }
63
64         fun activateDebugMode() =
65                         addPages(debugPages)
66
67 }