object RouteBuilder {
private val log = LoggerFactory.getLogger(this.javaClass)
// private val instancesInternal: MutableMap<Route, KClass<*>> = mutableMapOf()
// val instances: Map<Route, KClass<*>>
// get() = instancesInternal.toMap()
private val routeTypeMapPrivate =
mutableMapOf<String, RouteType>()
val routeTypeMap: Map<String, RouteType>
get() = routeTypeMapPrivate
// async upload
private val asyncUploadRouteMapPrivate =
mutableMapOf<String, Triple<Route, KClass<*>, KFunction2<Any, AsyncUploadRequest, AsyncUploadResponse>>>()
val asyncUploadRouteMap: Map<String, Triple<Route, KClass<*>, KFunction2<Any, AsyncUploadRequest, AsyncUploadResponse>>>
get() = asyncUploadRouteMapPrivate
// blocking upload
private val blockingUploadRouteMapPrivate =
mutableMapOf<String, Triple<Route, KClass<*>, KFunction2<Any, BlockingUploadRequest, BlockingUploadResponse>>>()
val blockingUploadRouteMap: Map<String, Triple<Route, KClass<*>, KFunction2<Any, BlockingUploadRequest, BlockingUploadResponse>>>
get() = blockingUploadRouteMapPrivate
// blocking download
private val blockingDownloadRouteMapPrivate =
mutableMapOf<String, Triple<Route, KClass<*>, KFunction2<Any, BlockingDownloadRequest, BlockingDownloadResponse>>>()
val blockingDownloadRouteMap: Map<String, Triple<Route, KClass<*>, KFunction2<Any, BlockingDownloadRequest, BlockingDownloadResponse>>>
get() = blockingDownloadRouteMapPrivate
// blocking post
private val blockingPostRouteMapPrivate =
mutableMapOf<String, Triple<Route, KClass<*>, KFunction2<Any, BlockingPostRequest, BlockingPostResponse>>>()
val blockingPostRouteMap: Map<String, Triple<Route, KClass<*>, KFunction2<Any, BlockingPostRequest, BlockingPostResponse>>>
get() = blockingPostRouteMapPrivate
// async post
private val asyncPostRouteMapPrivate =
mutableMapOf<String, Triple<Route, KClass<*>, KFunction2<Any, AsyncPostRequest, AsyncPostResponse>>>()
val asyncPostRouteMap: Map<String, Triple<Route, KClass<*>, KFunction2<Any, AsyncPostRequest, AsyncPostResponse>>>
get() = asyncPostRouteMapPrivate
// blocking get
private val blockingGetRouteMapPrivate =
mutableMapOf<String, Triple<Route, KClass<*>, KFunction2<Any, BlockingGetRequest, BlockingGetResponse>>>()
val blockingGetRouteMap: Map<String, Triple<Route, KClass<*>, KFunction2<Any, BlockingGetRequest, BlockingGetResponse>>>
get() = blockingGetRouteMapPrivate
// async get
private val asyncGetRouteMapPrivate =
mutableMapOf<String, Triple<Route, KClass<*>, KFunction2<Any, AsyncGetRequest, AsyncGetResponse>>>()
val asyncGetRouteMap: Map<String, Triple<Route, KClass<*>, KFunction2<Any, AsyncGetRequest, AsyncGetResponse>>>
get() = asyncGetRouteMapPrivate
// static get
private val staticGetRouteMapPrivate =
mutableMapOf<String, Triple<Route, KClass<*>, KFunction2<Any, StaticGetRequest, StaticGetResponse>>>()
val staticGetRouteMap: Map<String, Triple<Route, KClass<*>, KFunction2<Any, StaticGetRequest, StaticGetResponse>>>
get() = staticGetRouteMapPrivate
val routes =
mutableMapOf<String, Triple<Route, Any, KFunction2<Any, *, *>>>()
private var routeCount = 0
@Suppress("UNCHECKED_CAST")
fun setup(controllers: Set<KClass<*>>) {
log.info("Setting up controllers: ")
log.info(controllers.size.toString())
LulaServer.log.info("Scanning ${controllers.size} controllers for Route Annotations...")
val duration = durationOf {
controllers.forEach { clazz ->
log.info(clazz.simpleName)
log.info("Number of functions: " + clazz.functions.size.toString())
clazz.functions.forEach { function ->
log.info(function.name)
log.info("Number of annotations: " + function.annotations.size.toString())
function.annotations.forEach { annotation ->
if (annotation is Route) {
log.info("Annotation is route: " + annotation.url)
routeTypeMapPrivate.putIfAbsent(annotation.url, annotation.routeType)
when (annotation.routeType) {
ASYNC_UPLOAD -> {
asyncUploadRouteMapPrivate.putIfAbsent(
annotation.url,
Triple(
annotation,
clazz,
function as KFunction2<Any, AsyncUploadRequest, AsyncUploadResponse>,
)
)
}
BLOCKING_UPLOAD -> {
blockingUploadRouteMapPrivate.putIfAbsent(
annotation.url,
Triple(
annotation,
clazz,
function as KFunction2<Any, BlockingUploadRequest, BlockingUploadResponse>,
)
)
}
BLOCKING_DOWNLOAD -> {
blockingDownloadRouteMapPrivate.putIfAbsent(
annotation.url,
Triple(
annotation,
clazz,
function as KFunction2<Any, BlockingDownloadRequest, BlockingDownloadResponse>,
)
)
}
BLOCKING_POST -> {
blockingPostRouteMapPrivate.putIfAbsent(
annotation.url,
Triple(
annotation,
clazz,
function as KFunction2<Any, BlockingPostRequest, BlockingPostResponse>,
)
)
}
ASYNC_POST -> {
asyncPostRouteMapPrivate.putIfAbsent(
annotation.url,
Triple(
annotation,
clazz,
function as KFunction2<Any, AsyncPostRequest, AsyncPostResponse>,
)
)
}
BLOCKING_GET -> {
blockingGetRouteMapPrivate.putIfAbsent(
annotation.url,
Triple(
annotation,
clazz,
function as KFunction2<Any, BlockingGetRequest, BlockingGetResponse>,
)
)
}
ASYNC_GET -> {
asyncGetRouteMapPrivate.putIfAbsent(
annotation.url,
Triple(
annotation,
clazz,
function as KFunction2<Any, AsyncGetRequest, AsyncGetResponse>,
)
)
}
STATIC_GET -> {
staticGetRouteMapPrivate.putIfAbsent(
annotation.url,
Triple(
annotation,
clazz,
function as KFunction2<Any, StaticGetRequest, StaticGetResponse>,
)
)
}
else -> LulaServer.log.error("Unsure how to routify $function")
}
routeCount++
}
}
}
}
}