lm-sistemi-software-distrib.../src/main/kotlin/util/network/epidemic/EpidemicNode.kt

127 lines
3.4 KiB
Kotlin
Raw Normal View History

2020-05-02 11:12:44 +00:00
package util.network.epidemic
import util.network.epidemic.packet.EpidemicPacket
2020-05-02 11:12:44 +00:00
import util.network.simulator.Address
import util.network.simulator.Network
import util.network.simulator.Node
2020-05-03 17:38:55 +00:00
abstract class EpidemicNode<T, P : EpidemicPacket<T>>(
2020-05-02 11:12:44 +00:00
address: Address,
network: Network,
2020-05-02 20:27:43 +00:00
initialValue: T,
2020-05-02 11:12:44 +00:00
bufferSize: Int = 1
) : Node(address, network, bufferSize) {
@Volatile
var nodeValue = initialValue
private set
2020-05-03 15:30:17 +00:00
protected var nodeState = State.SUSCEPTIBLE
2020-05-02 11:12:44 +00:00
@Synchronized
2020-05-02 20:27:43 +00:00
fun changeValue(value: T) {
2020-05-02 11:12:44 +00:00
nodeValue = value
}
2020-05-02 20:27:43 +00:00
private fun sendToRandom(
2020-05-03 09:04:28 +00:00
type: EpidemicPacket.Type,
2020-05-02 20:27:43 +00:00
numberOfReceiver: Int = 1
) {
2020-05-02 11:12:44 +00:00
val toExclude = mutableListOf(address)
repeat(numberOfReceiver) {
var receiverAddress = network.getRandomAddress()
while (toExclude.contains(receiverAddress))
receiverAddress = network.getRandomAddress()
toExclude.add(receiverAddress)
2020-05-03 09:04:28 +00:00
send(makeInfectionPacket(receiverAddress, type))
2020-05-02 11:12:44 +00:00
}
}
2020-05-03 09:04:28 +00:00
abstract fun makeInfectionPacket(
receiverAddress: Address,
2020-05-02 20:27:43 +00:00
type: EpidemicPacket.Type
2020-05-03 09:04:28 +00:00
): EpidemicPacket<T>
2020-05-02 20:27:43 +00:00
2020-05-03 17:38:55 +00:00
protected fun sendPushToRandom(numberOfReceiver: Int = 1) {
2020-05-02 20:27:43 +00:00
sendToRandom(
2020-05-03 09:04:28 +00:00
EpidemicPacket.Type.PUSH,
2020-05-02 20:27:43 +00:00
numberOfReceiver
)
2020-05-02 11:12:44 +00:00
}
2020-05-03 17:38:55 +00:00
protected fun sendPullToRandom(numberOfReceiver: Int = 1) {
2020-05-02 20:27:43 +00:00
sendToRandom(
2020-05-03 09:04:28 +00:00
EpidemicPacket.Type.PULL,
2020-05-02 20:27:43 +00:00
numberOfReceiver
)
2020-05-02 11:12:44 +00:00
}
2020-05-03 17:38:55 +00:00
protected fun sendPushPullToRandom(numberOfReceiver: Int = 1) {
2020-05-02 20:27:43 +00:00
sendToRandom(
2020-05-03 09:04:28 +00:00
EpidemicPacket.Type.PUSHPULL,
2020-05-02 20:27:43 +00:00
numberOfReceiver
)
2020-05-02 11:12:44 +00:00
}
2020-05-02 20:27:43 +00:00
protected abstract fun receivePushOrReply(packet: P)
2020-05-02 11:12:44 +00:00
2020-05-02 20:27:43 +00:00
protected abstract fun receivePull(packet: P)
2020-05-02 11:12:44 +00:00
2020-05-02 20:27:43 +00:00
protected abstract fun infect()
2020-05-02 11:12:44 +00:00
2020-05-03 15:30:17 +00:00
protected fun onReceive(packet: P) {
when (packet.type) {
EpidemicPacket.Type.PUSH -> receivePushOrReply(packet)
EpidemicPacket.Type.PULL -> receivePull(packet)
EpidemicPacket.Type.REPLY -> receivePushOrReply(packet)
EpidemicPacket.Type.PUSHPULL -> {
receivePull(packet)
receivePushOrReply(packet)
}
}
}
2020-05-02 11:12:44 +00:00
override fun communicatorFactory(threadGroup: ThreadGroup): CommunicatorFactory {
return EpidemicCommunicatorFactory(threadGroup)
}
2020-05-03 15:30:17 +00:00
protected enum class State {
SUSCEPTIBLE, INFECTED, REMOVED
2020-05-02 11:12:44 +00:00
}
enum class InfectStrategy {
PUSH, PULL, PUSHPULL
}
2020-05-02 11:12:44 +00:00
protected inner class EpidemicReceiver(
threadGroup: ThreadGroup
) : Node.Receiver(threadGroup) {
override fun run() {
2020-05-03 15:30:17 +00:00
while (!isInterrupted) {
val packet = receive() as P
onReceive(packet)
2020-05-02 11:12:44 +00:00
}
}
}
protected inner class EpidemicSender(
threadGroup: ThreadGroup
) : Node.Sender(threadGroup) {
override fun run() {
while (!isInterrupted)
infect()
}
}
protected inner class EpidemicCommunicatorFactory(
threadGroup: ThreadGroup
) : Node.CommunicatorFactory(threadGroup) {
override fun createReceiver(): Receiver {
return EpidemicReceiver(threadGroup)
}
override fun createSender(): Sender {
return EpidemicSender(threadGroup)
}
}
2020-05-03 17:38:55 +00:00
}