X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fkotlin%2Fnet%2Fpterodactylus%2Fsone%2Ffreenet%2Fwot%2FIdentityManagerImpl.kt;h=eac1fa9fdaa72bead1e52741559df35ea17fa1e5;hb=b8ff66197e789af7aead1e2a332ad00f0b6a3c95;hp=ae5dd1e9bc20a6ffb1d9c7e1496bc0149c7b7b0b;hpb=884606571eff6e4f80af9485695848bfb5e7fa95;p=Sone.git diff --git a/src/main/kotlin/net/pterodactylus/sone/freenet/wot/IdentityManagerImpl.kt b/src/main/kotlin/net/pterodactylus/sone/freenet/wot/IdentityManagerImpl.kt index ae5dd1e..eac1fa9 100644 --- a/src/main/kotlin/net/pterodactylus/sone/freenet/wot/IdentityManagerImpl.kt +++ b/src/main/kotlin/net/pterodactylus/sone/freenet/wot/IdentityManagerImpl.kt @@ -17,12 +17,18 @@ package net.pterodactylus.sone.freenet.wot -import com.google.common.eventbus.* -import com.google.inject.* -import net.pterodactylus.util.service.* -import java.util.concurrent.TimeUnit.* -import java.util.logging.* -import java.util.logging.Logger.* +import com.google.common.eventbus.EventBus +import com.google.common.eventbus.Subscribe +import com.google.inject.Inject +import com.google.inject.Singleton +import net.pterodactylus.sone.core.event.StrictFilteringActivatedEvent +import net.pterodactylus.sone.core.event.StrictFilteringDeactivatedEvent +import net.pterodactylus.util.service.AbstractService +import java.util.concurrent.TimeUnit.SECONDS +import java.util.concurrent.atomic.AtomicBoolean +import java.util.logging.Level +import java.util.logging.Logger +import java.util.logging.Logger.getLogger /** * The identity manager takes care of loading and storing identities, their @@ -42,6 +48,8 @@ class IdentityManagerImpl @Inject constructor( ) : AbstractService("Sone Identity Manager", false), IdentityManager { private val currentOwnIdentities = mutableSetOf() + private val strictFiltering = AtomicBoolean(false) + private val noNegativeIdentityFilter = NoNegativeIdentityFilter() override val isConnected: Boolean get() = notThrowing { webOfTrustConnector.ping() } @@ -56,34 +64,16 @@ class IdentityManagerImpl @Inject constructor( while (!shouldStop()) { try { - val currentIdentities = identityLoader.loadAllIdentities() - - val identitiesWithTrust = currentIdentities.values.flatten() - .groupBy { it.id } - .mapValues { (_, identities) -> - identities.reduce { accIdentity, identity -> - identity.trust.forEach { (ownIdentity: OwnIdentity?, trust: Trust?) -> - accIdentity.setTrust(ownIdentity, trust) - } - accIdentity - } - } - - val onlyTrustedByAll = currentIdentities.mapValues { (_, trustedIdentities) -> - trustedIdentities.filter { trustedIdentity -> - identitiesWithTrust[trustedIdentity.id]!!.trust.all { it.value.hasZeroOrPositiveTrust() } - } - } - logger.log(Level.FINE, "Reduced (${currentIdentities.size},(${currentIdentities.values.joinToString { it.size.toString() }})) identities to (${onlyTrustedByAll.size},(${onlyTrustedByAll.values.joinToString { it.size.toString() }})).") + val currentIdentities = identityLoader.loadAllIdentities().applyStrictFiltering() val identityChangeEventSender = IdentityChangeEventSender(eventBus, oldIdentities) - identityChangeEventSender.detectChanges(onlyTrustedByAll) + identityChangeEventSender.detectChanges(currentIdentities) - oldIdentities = onlyTrustedByAll + oldIdentities = currentIdentities synchronized(currentOwnIdentities) { currentOwnIdentities.clear() - currentOwnIdentities.addAll(onlyTrustedByAll.keys) + currentOwnIdentities.addAll(currentIdentities.keys) } } catch (wote1: WebOfTrustException) { logger.log(Level.WARNING, "WoT has disappeared!", wote1) @@ -96,6 +86,23 @@ class IdentityManagerImpl @Inject constructor( } } + private fun Map>.applyStrictFiltering() = + if (strictFiltering.get()) { + noNegativeIdentityFilter.filter(this) + } else { + this + } + + @Subscribe + fun strictFilteringActivated(event: StrictFilteringActivatedEvent) { + strictFiltering.set(true) + } + + @Subscribe + fun strictFilteringDeactivated(event: StrictFilteringDeactivatedEvent) { + strictFiltering.set(false) + } + } private val logger: Logger = getLogger(IdentityManagerImpl::class.java.name) @@ -107,10 +114,3 @@ private fun notThrowing(action: () -> Unit): Boolean = } catch (e: Exception) { false } - -private fun Trust.hasZeroOrPositiveTrust() = - if (explicit == null) { - implicit == null || implicit >= 0 - } else { - explicit >= 0 - }