Kotlin remote proxy pattern

How to write a remote proxy pattern in Kotlin

An example of a remote proxy pattern in Kotlin.

Table of contents for design patterns in Kotlin

A remote proxy provides a local object that references a subject object in another location, generally via a network connection. Wikipedia blackwasp.co.uk

Example:

ReportGenerator

import java.rmi.Remote
import java.rmi.RemoteException

interface ReportGenerator: Remote {

    @Throws(RemoteException::class)
    fun generateReport(): String
}

ReportService

import java.rmi.server.UnicastRemoteObject
import java.util.Date

class ReportService : UnicastRemoteObject(), ReportGenerator {

    override fun generateReport(): String = """
        Report
        date: ${Date()} ${System.currentTimeMillis()}
    """.trimIndent()

    companion object {
        private const  val serialVersionUID = -104899L
    }
}

ReportRemoteProxy

import java.rmi.Naming

class ReportRemoteProxy(rmi: String) : ReportGenerator {

    private val reportGenerator: ReportGenerator = Naming.lookup(rmi) as ReportGenerator

    override fun generateReport(): String = reportGenerator.generateReport()
}

Usage:

fun main() {
    val reportGeneratorService: ReportGenerator = ReportService()
    requestReport("Local report call", reportGeneratorService)

    LocateRegistry.createRegistry(1099)
    Naming.rebind("rmi://localhost:1099/ABC", reportGeneratorService)

    val reportGeneratorProxy = ReportRemoteProxy("rmi://localhost:1099/ABC")
    requestReport("Remote report call", reportGeneratorProxy)
}

fun requestReport(name: String, reportGenerator: ReportGenerator) {
    println(name)
    println(reportGenerator.generateReport())
    println()
}

Result

Local report call
Report
date: Sun Aug 16 21:35:18 NOVT 2020 1597588518502

Remote report call
Report
date: Sun Aug 16 21:35:18 NOVT 2020 1597588518612