1 package net.pterodactylus.sone.main
3 import com.codahale.metrics.*
4 import com.google.common.base.*
5 import com.google.common.eventbus.*
6 import com.google.inject.*
7 import com.google.inject.matcher.*
8 import com.google.inject.name.Names.*
9 import com.google.inject.spi.*
10 import net.pterodactylus.sone.core.SoneUriCreator
11 import net.pterodactylus.sone.database.*
12 import net.pterodactylus.sone.database.memory.*
13 import net.pterodactylus.sone.freenet.*
14 import net.pterodactylus.sone.freenet.wot.*
15 import net.pterodactylus.sone.web.FreenetSessionProvider
16 import net.pterodactylus.sone.web.SessionProvider
17 import net.pterodactylus.util.config.*
18 import net.pterodactylus.util.config.ConfigurationException
19 import net.pterodactylus.util.version.Version
21 import java.util.concurrent.*
22 import java.util.concurrent.Executors.*
23 import java.util.logging.Logger
25 import javax.inject.Singleton
27 open class SoneModule(private val sonePlugin: SonePlugin, private val eventBus: EventBus) : AbstractModule() {
29 override fun configure() {
30 val sonePropertiesFile = File("sone.properties")
31 val firstStart = !sonePropertiesFile.exists()
33 val configuration = try {
34 Configuration(MapConfigurationBackend(sonePropertiesFile, false))
35 } catch (ce: ConfigurationException) {
36 sonePropertiesFile.delete()
38 Configuration(MapConfigurationBackend(sonePropertiesFile, true))
40 val context = Context("Sone")
41 val loaders = configuration.getStringValue("Developer.LoadFromFilesystem")
44 configuration.getStringValue("Developer.FilesystemPath")
46 ?.let { DebugLoaders(it) }
49 bind(Configuration::class.java).toInstance(configuration)
50 bind(EventBus::class.java).toInstance(eventBus)
51 bind(Boolean::class.java).annotatedWith(named("FirstStart")).toInstance(firstStart)
52 bind(Boolean::class.java).annotatedWith(named("NewConfig")).toInstance(newConfig)
53 bind(Context::class.java).toInstance(context)
54 bind(object : TypeLiteral<Optional<Context>>() {}).toInstance(Optional.of(context))
55 bind(SonePlugin::class.java).toInstance(sonePlugin)
56 bind(Version::class.java).toInstance(sonePlugin.version.drop(1).parseVersion())
57 bind(PluginVersion::class.java).toInstance(PluginVersion(sonePlugin.version))
58 bind(PluginYear::class.java).toInstance(PluginYear(sonePlugin.year))
59 bind(PluginHomepage::class.java).toInstance(PluginHomepage(sonePlugin.homepage))
60 bind(Database::class.java).to(MemoryDatabase::class.java).`in`(Singleton::class.java)
61 bind(Translation::class.java).toInstance(BaseL10nTranslation { sonePlugin.l10n().base })
62 loaders?.let { bind(Loaders::class.java).toInstance(it) }
63 bind(MetricRegistry::class.java).`in`(Singleton::class.java)
64 bind(WebOfTrustConnector::class.java).to(PluginWebOfTrustConnector::class.java).`in`(Singleton::class.java)
65 bind(TickerShutdown::class.java).`in`(Singleton::class.java)
66 bind(SoneUriCreator::class.java).`in`(Singleton::class.java)
67 bind(SessionProvider::class.java).to(FreenetSessionProvider::class.java).`in`(Singleton::class.java)
69 bindListener(Matchers.any(), object : TypeListener {
70 override fun <I> hear(typeLiteral: TypeLiteral<I>, typeEncounter: TypeEncounter<I>) {
71 typeEncounter.register(InjectionListener { injectee ->
72 logger.fine { "Injecting $injectee..." }
73 eventBus.register(injectee)
81 @Named("notification")
82 fun getNotificationTicker(): ScheduledExecutorService =
83 newSingleThreadScheduledExecutor()
85 private val logger: Logger = Logger.getLogger(javaClass.name)
89 private fun String.parseVersion(): Version = Version.parse(this)