lm-sistemi-software-distrib.../src/main/kotlin/util/network/simulator/Node.kt

62 lines
1.5 KiB
Kotlin

package util.network.simulator
import util.network.simulator.packet.Packet
import java.util.concurrent.LinkedBlockingQueue
abstract class Node(
val address: Address,
protected val network: Network,
bufferSize: Int = 1
) {
private val buffer = LinkedBlockingQueue<Packet>(bufferSize)
private val receiver: Receiver
private val sender: Sender
init {
network.addNode(this)
val factory = communicatorFactory(network.threadGroup)
receiver = factory.createReceiver()
sender = factory.createSender()
}
fun start() {
receiver.start()
sender.start()
}
private fun setPacket(packet: Packet) {
buffer.put(packet)
}
private fun getPacket(): Packet {
return buffer.take()
}
fun send(packet: Packet) {
network[packet.receiverAddress]?.setPacket(packet)
}
protected fun receive(): Packet = getPacket()
protected abstract fun communicatorFactory(
threadGroup: ThreadGroup
): CommunicatorFactory
protected abstract inner class CommunicatorFactory(
protected val threadGroup: ThreadGroup
) {
abstract fun createReceiver(): Receiver
abstract fun createSender(): Sender
}
protected abstract inner class Receiver(threadGroup: ThreadGroup) : Thread(
threadGroup,
"${threadGroup.name}-receiver"
)
protected abstract inner class Sender(threadGroup: ThreadGroup) : Thread(
threadGroup,
"${threadGroup.name}-sender"
)
}