All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.labijie.application.ForwardTokenCodec.kt Maven / Gradle / Ivy

package com.labijie.application

import org.springframework.util.Base64Utils

/**
 * Created with IntelliJ IDEA.
 * @author Anders Xiao
 * @date 2019-10-25
 */
object ForwardTokenCodec {

    /**
     *  编码游标
     *  @param queryResult 查询结果,一个列表
     *  @param offsetField 用于排序的字段(例如 A::createdTime)
     *  @param keyField 数据的 key (主键, 例如: A::id)
     */
    fun  encode(
        queryResult: List,
        offsetField:(element:TElement)->Any?,
        keyField:(element:TElement)->Any?):String{

        if(queryResult.isEmpty()){
            return ""
        }
        val keys = mutableSetOf()
        val last = queryResult.last()
        var lastIndex = queryResult.size - 1
        val lastOffset = offsetField(last)
        val lastKey = keyField(last)
        keys.add(lastKey.toString())
        while (lastIndex > 0) {
            lastIndex--
            val nextEntry = queryResult[lastIndex]
            val nextOffset = offsetField(nextEntry)
            if (lastOffset == nextOffset) {
                val nextKey = keyField(nextEntry)
                keys.add(nextKey.toString())
            } else {
                break
            }
        }
        val token = "${lastOffset}:${keys.joinToString(":")}"
        return Base64Utils.encodeToUrlSafeString(token.toByteArray(Charsets.US_ASCII))
    }

    fun decode(forwardToken:String): ForwardOffset {
        val tokenString = Base64Utils.decodeFromUrlSafeString(forwardToken).toString(Charsets.US_ASCII)
        val elements = tokenString.split(":")
        val offset = elements.first()
        val keys = elements.subList(1, elements.size)
        return ForwardOffset(offset, keys)
    }

    class ForwardOffset(val offsetValue: String, val excludeKeys:List)
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy