Skip to content

Commit

Permalink
Add: Improve organization
Browse files Browse the repository at this point in the history
  • Loading branch information
acrusage-iaik committed Apr 26, 2024
1 parent e19cde4 commit 300de4b
Show file tree
Hide file tree
Showing 34 changed files with 152 additions and 88 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package at.asitplus.jsonpath

import at.asitplus.jsonpath.core.JsonPathCompiler
import at.asitplus.jsonpath.core.NodeList
import kotlinx.serialization.json.JsonElement

class JsonPath(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,19 @@
package at.asitplus.jsonpath

import at.asitplus.jsonpath.functionExtensions.LengthFunctionExtension
import at.asitplus.jsonpath.functionExtensions.MatchFunctionExtension
import at.asitplus.jsonpath.functionExtensions.SearchFunctionExtension
import at.asitplus.jsonpath.functionExtensions.ValueFunctionExtension
import at.asitplus.jsonpath.implementation.AntlrJsonPathCompiler
import at.asitplus.jsonpath.implementation.AntlrJsonPathCompilerErrorListener
import at.asitplus.jsonpath.implementation.JsonPathExpression
import at.asitplus.jsonpath.core.JsonPathCompiler
import at.asitplus.jsonpath.core.JsonPathFunctionExtension
import at.asitplus.jsonpath.core.functionExtensions.LengthFunctionExtension
import at.asitplus.jsonpath.core.functionExtensions.MatchFunctionExtension
import at.asitplus.jsonpath.core.functionExtensions.SearchFunctionExtension
import at.asitplus.jsonpath.core.functionExtensions.ValueFunctionExtension
import at.asitplus.wallet.lib.data.jsonpath.functionExtensions.CountFunctionExtension
import com.strumenta.antlrkotlin.runtime.BitSet
import io.github.aakira.napier.Napier
import org.antlr.v4.kotlinruntime.BaseErrorListener
import org.antlr.v4.kotlinruntime.Parser
import org.antlr.v4.kotlinruntime.RecognitionException
import org.antlr.v4.kotlinruntime.Recognizer
import org.antlr.v4.kotlinruntime.atn.ATNConfigSet
import org.antlr.v4.kotlinruntime.dfa.DFA

object JsonPathDependencyManager {
/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package at.asitplus.jsonpath

import at.asitplus.jsonpath.core.JsonPathFunctionExtension

class JsonPathFunctionExtensionMapRepository(
private val extensions: MutableMap<String, JsonPathFunctionExtension<*>> = mutableMapOf()
) : JsonPathFunctionExtensionRepository {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package at.asitplus.jsonpath

import at.asitplus.jsonpath.core.JsonPathFunctionExtension

/**
* This class is not specified in the rfc standard, it's but an implementation detail.
* It's a way to provide users with a way to add custom function extensions.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package at.asitplus.jsonpath
package at.asitplus.jsonpath.core

interface JsonPathCompiler {
fun compile(jsonPath: String): JsonPathQuery
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package at.asitplus.jsonpath
package at.asitplus.jsonpath.core

/**
* specification: https://datatracker.ietf.org/doc/rfc9535/
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package at.asitplus.jsonpath
package at.asitplus.jsonpath.core

import kotlinx.serialization.json.JsonElement

Expand All @@ -11,17 +11,21 @@ sealed interface JsonPathFilterExpressionValue {
val expressionType: JsonPathFilterExpressionType

sealed class ValueTypeValue : JsonPathFilterExpressionValue {
override val expressionType: JsonPathFilterExpressionType = JsonPathFilterExpressionType.ValueType
override val expressionType: JsonPathFilterExpressionType =
JsonPathFilterExpressionType.ValueType
data class JsonValue(val jsonElement: JsonElement) : ValueTypeValue()
data object Nothing : ValueTypeValue()
}

data class LogicalTypeValue(val isTrue: Boolean) : JsonPathFilterExpressionValue {
override val expressionType: JsonPathFilterExpressionType = JsonPathFilterExpressionType.LogicalType
override val expressionType: JsonPathFilterExpressionType =
JsonPathFilterExpressionType.LogicalType
}

sealed class NodesTypeValue(open val nodeList: List<JsonElement>) : JsonPathFilterExpressionValue {
override val expressionType: JsonPathFilterExpressionType = JsonPathFilterExpressionType.NodesType
sealed class NodesTypeValue(open val nodeList: List<JsonElement>) :
JsonPathFilterExpressionValue {
override val expressionType: JsonPathFilterExpressionType =
JsonPathFilterExpressionType.NodesType

sealed class FilterQueryResult(nodeList: List<JsonElement>): NodesTypeValue(nodeList) {
data class SingularQueryResult(override val nodeList: List<JsonElement>): FilterQueryResult(nodeList)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package at.asitplus.jsonpath
package at.asitplus.jsonpath.core

/**
* specification: https://datatracker.ietf.org/doc/rfc9535/
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package at.asitplus.jsonpath.core

import kotlinx.serialization.json.JsonElement

interface JsonPathQuery {
fun invoke(currentNode: JsonElement, rootNode: JsonElement = currentNode): NodeList
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,7 @@
package at.asitplus.wallet.lib.data.jsonpath

import at.asitplus.jsonpath.JsonPathEvaluationContext
import at.asitplus.jsonpath.NodeList
import at.asitplus.jsonpath.NodeListEntry
import at.asitplus.jsonpath.NormalizedJsonPath
import at.asitplus.jsonpath.NormalizedJsonPathSegment.IndexSegment
import at.asitplus.jsonpath.NormalizedJsonPathSegment.NameSegment
package at.asitplus.jsonpath.core

import at.asitplus.jsonpath.core.NormalizedJsonPathSegment.IndexSegment
import at.asitplus.jsonpath.core.NormalizedJsonPathSegment.NameSegment
import kotlinx.serialization.json.JsonArray
import kotlinx.serialization.json.JsonElement
import kotlinx.serialization.json.JsonObject
Expand Down Expand Up @@ -311,7 +307,7 @@ sealed interface JsonPathSelector {
* section: 2.3.5. Filter Selector
*/
data class FilterSelector(
private val filterPredicate: (JsonPathEvaluationContext) -> Boolean,
private val filterPredicate: FilterPredicate,
) : JsonPathSelector {
override fun invoke(
currentNode: JsonElement,
Expand All @@ -335,12 +331,17 @@ sealed interface JsonPathSelector {
}
}.filter {
filterPredicate.invoke(
JsonPathEvaluationContext(
currentNode = it.value,
rootNode = rootNode,
)
currentNode = it.value,
rootNode = rootNode,
)
}
}
}
}

interface FilterPredicate {
fun invoke(
currentNode: JsonElement,
rootNode: JsonElement,
): Boolean
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package at.asitplus.jsonpath
package at.asitplus.jsonpath.core

import kotlinx.serialization.json.JsonElement

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package at.asitplus.jsonpath
package at.asitplus.jsonpath.core

/**
* specification: https://datatracker.ietf.org/doc/rfc9535/
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package at.asitplus.jsonpath
package at.asitplus.jsonpath.core

/**
* specification: https://datatracker.ietf.org/doc/rfc9535/
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package at.asitplus.jsonpath
package at.asitplus.jsonpath.core

import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package at.asitplus.jsonpath
package at.asitplus.jsonpath.core

object Rfc9535Utils {
fun switchToDoubleQuotedString(string: String) = if (string.startsWith("\"")) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package at.asitplus.wallet.lib.data.jsonpath.functionExtensions

import at.asitplus.jsonpath.JsonPathFilterExpressionValue
import at.asitplus.jsonpath.JsonPathFilterExpressionType
import at.asitplus.jsonpath.JsonPathFunctionExtension
import at.asitplus.jsonpath.core.JsonPathFilterExpressionValue
import at.asitplus.jsonpath.core.JsonPathFilterExpressionType
import at.asitplus.jsonpath.core.JsonPathFunctionExtension
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.json.JsonPrimitive

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
package at.asitplus.jsonpath.functionExtensions
package at.asitplus.jsonpath.core.functionExtensions

import at.asitplus.jsonpath.JsonPathFilterExpressionType
import at.asitplus.jsonpath.JsonPathFilterExpressionValue
import at.asitplus.jsonpath.JsonPathFunctionExtension
import com.strumenta.antlrkotlin.runtime.ext.codePointIndices
import at.asitplus.jsonpath.core.JsonPathFilterExpressionType
import at.asitplus.jsonpath.core.JsonPathFilterExpressionValue
import at.asitplus.jsonpath.core.JsonPathFunctionExtension
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.json.JsonArray
import kotlinx.serialization.json.JsonObject
Expand Down Expand Up @@ -43,7 +42,15 @@ data object LengthFunctionExtension : JsonPathFunctionExtension.ValueTypeFunctio

is JsonPrimitive -> if (argument.jsonElement.isString) {
JsonPathFilterExpressionValue.ValueTypeValue.JsonValue(
JsonPrimitive(argument.jsonElement.content.codePointIndices().size.toUInt())
JsonPrimitive(
run {
val codePoints =
argument.jsonElement.content.count() + argument.jsonElement.content.count {
it.code > 0xffff
}
codePoints.toUInt()
}
)
)
} else JsonPathFilterExpressionValue.ValueTypeValue.Nothing
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package at.asitplus.jsonpath.functionExtensions
package at.asitplus.jsonpath.core.functionExtensions

import at.asitplus.jsonpath.JsonPathFilterExpressionType
import at.asitplus.jsonpath.JsonPathFilterExpressionValue
import at.asitplus.jsonpath.JsonPathFunctionExtension
import at.asitplus.jsonpath.core.JsonPathFilterExpressionType
import at.asitplus.jsonpath.core.JsonPathFilterExpressionValue
import at.asitplus.jsonpath.core.JsonPathFunctionExtension
import kotlinx.serialization.json.JsonPrimitive

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package at.asitplus.jsonpath.functionExtensions
package at.asitplus.jsonpath.core.functionExtensions

import at.asitplus.jsonpath.JsonPathFilterExpressionType
import at.asitplus.jsonpath.JsonPathFilterExpressionValue
import at.asitplus.jsonpath.JsonPathFunctionExtension
import at.asitplus.jsonpath.core.JsonPathFilterExpressionType
import at.asitplus.jsonpath.core.JsonPathFilterExpressionValue
import at.asitplus.jsonpath.core.JsonPathFunctionExtension
import kotlinx.serialization.json.JsonPrimitive

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package at.asitplus.jsonpath.functionExtensions
package at.asitplus.jsonpath.core.functionExtensions

import at.asitplus.jsonpath.JsonPathFilterExpressionType
import at.asitplus.jsonpath.JsonPathFilterExpressionValue
import at.asitplus.jsonpath.JsonPathFunctionExtension
import at.asitplus.jsonpath.core.JsonPathFilterExpressionType
import at.asitplus.jsonpath.core.JsonPathFilterExpressionValue
import at.asitplus.jsonpath.core.JsonPathFunctionExtension

/**
* specification: https://datatracker.ietf.org/doc/rfc9535/
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package at.asitplus.jsonpath
package at.asitplus.jsonpath.implementation

import org.antlr.v4.kotlinruntime.ParserRuleContext
import org.antlr.v4.kotlinruntime.Token
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
package at.asitplus.jsonpath
package at.asitplus.jsonpath.implementation

import at.asitplus.jsonpath.core.JsonPathCompiler
import at.asitplus.jsonpath.core.JsonPathFunctionExtension
import at.asitplus.jsonpath.core.JsonPathQuery
import at.asitplus.jsonpath.core.NodeList
import at.asitplus.parser.generated.JsonPathLexer
import at.asitplus.parser.generated.JsonPathParser
import kotlinx.serialization.json.JsonElement
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package at.asitplus.jsonpath
package at.asitplus.jsonpath.implementation

import org.antlr.v4.kotlinruntime.ANTLRErrorListener

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package at.asitplus.jsonpath
package at.asitplus.jsonpath.implementation

import at.asitplus.jsonpath.core.JsonPathFilterExpressionValue
import at.asitplus.jsonpath.core.Rfc9535Utils
import kotlinx.serialization.json.JsonObject
import org.antlr.v4.kotlinruntime.ParserRuleContext

Expand Down Expand Up @@ -46,7 +48,11 @@ class InvalidComparableValueException(expression: ParserRuleContext, value: Json
)

class MissingKeyException(jsonObject: JsonObject, key: String) : JsonPathRuntimeException(
"Missing key ${Rfc9535Utils.escapeToDoubleQuoted(key)} at object ${Rfc9535Utils.escapeToDoubleQuoted(jsonObject.toString())}"
"Missing key ${Rfc9535Utils.escapeToDoubleQuoted(key)} at object ${
Rfc9535Utils.escapeToDoubleQuoted(
jsonObject.toString()
)
}"
)

class UnknownFunctionExtensionException(functionExtensionName: String) : JsonPathRuntimeException(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package at.asitplus.jsonpath
package at.asitplus.jsonpath.implementation

import at.asitplus.jsonpath.core.Rfc9535Utils
import at.asitplus.parser.generated.JsonPathParser

fun JsonPathParser.StringLiteralContext.toUnescapedString(): String {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
package at.asitplus.jsonpath
package at.asitplus.jsonpath.implementation

import at.asitplus.jsonpath.core.JsonPathFunctionExtension

interface AntlrJsonPathSemanticAnalyzerErrorListener {
fun unknownFunctionExtension(functionExtensionName: String)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
package at.asitplus.jsonpath
package at.asitplus.jsonpath.implementation

import at.asitplus.jsonpath.core.FilterPredicate
import at.asitplus.jsonpath.core.JsonPathFilterExpressionType
import at.asitplus.jsonpath.core.JsonPathFilterExpressionValue
import at.asitplus.jsonpath.core.JsonPathFunctionExtension
import at.asitplus.parser.generated.JsonPathParser
import at.asitplus.parser.generated.JsonPathParserBaseVisitor
import at.asitplus.wallet.lib.data.jsonpath.JsonPathSelector
import at.asitplus.jsonpath.core.JsonPathSelector
import kotlinx.serialization.json.JsonArray
import kotlinx.serialization.json.JsonElement
import kotlinx.serialization.json.JsonNull
import kotlinx.serialization.json.JsonObject
import kotlinx.serialization.json.JsonPrimitive
Expand Down Expand Up @@ -217,9 +222,19 @@ class AntlrJsonPathSemanticAnalyzerVisitor(
context = ctx,
value = if (logicalExpressionNode.value is JsonPathExpression.FilterExpression.LogicalExpression) {
JsonPathExpression.SelectorExpression(
JsonPathSelector.FilterSelector { context ->
logicalExpressionNode.value.evaluate(context).isTrue
}
JsonPathSelector.FilterSelector(
object : FilterPredicate {
override fun invoke(
currentNode: JsonElement,
rootNode: JsonElement
): Boolean = logicalExpressionNode.value.evaluate(
JsonPathExpressionEvaluationContext(
currentNode = currentNode,
rootNode = rootNode,
)
).isTrue
}
)
)
} else JsonPathExpression.ErrorType,
children = listOf(logicalExpressionNode)
Expand Down Expand Up @@ -545,8 +560,8 @@ class AntlrJsonPathSemanticAnalyzerVisitor(
}

private fun evaluateComparison(
firstComparable: (JsonPathEvaluationContext) -> JsonPathFilterExpressionValue.ValueTypeValue,
secondComparable: (JsonPathEvaluationContext) -> JsonPathFilterExpressionValue.ValueTypeValue,
firstComparable: (JsonPathExpressionEvaluationContext) -> JsonPathFilterExpressionValue.ValueTypeValue,
secondComparable: (JsonPathExpressionEvaluationContext) -> JsonPathFilterExpressionValue.ValueTypeValue,
comparisonOpContext: JsonPathParser.ComparisonOpContext,
): JsonPathExpression = comparisonOpContext.let {
when {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package at.asitplus.jsonpath
package at.asitplus.jsonpath.implementation

import org.antlr.v4.kotlinruntime.BaseErrorListener
import org.antlr.v4.kotlinruntime.RecognitionException
Expand Down
Loading

0 comments on commit 300de4b

Please sign in to comment.