Documentation
¶
Overview ¶
Package javatype classifies a Java type for two decisions we make repeatedly: do we need an @type tag when generic-invoking (contract side), and what JSON placeholder do we render when describing a method (schema side). Today both decisions live in ~12 scattered string whitelists; this package centralises them.
The package has no external Go dependencies; callers pass a tiny ClassLookup so we stay free of facadesemantic and can be unit-tested with hand-built fakes.
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func RenderPlaceholder ¶
func RenderPlaceholder(kind PlaceholderKind) json.RawMessage
RenderPlaceholder returns the JSON literal for kind. Kept as a separate function from Placeholder so callers can override the literal without re-implementing classification.
Types ¶
type ClassLookup ¶
type ClassLookup interface {
Superclass(fqn string) (string, bool)
Interfaces(fqn string) ([]string, bool)
}
ClassLookup exposes the superclass / interface chain of a user-space Java type. Implementations must return empty strings / empty slices for types they do not know about; they MUST NOT panic.
type PlaceholderKind ¶
type PlaceholderKind int
PlaceholderKind labels the JSON skeleton we render for a type. Each kind maps to exactly one placeholder literal. The set is intentionally small (six entries) — any type we cannot classify falls back to PlaceholderObject, which renders `null` and leaves the agent to describe it further.
const ( PlaceholderObject PlaceholderKind = iota PlaceholderString PlaceholderBool PlaceholderNumber PlaceholderDecimal PlaceholderDate PlaceholderCollection PlaceholderMap )
func Placeholder ¶
func Placeholder(fqn string) PlaceholderKind
Placeholder returns the kind of JSON skeleton for fqn. It is independent of Classify: a type may be Passthrough for invocation but still need a specific literal for describe-time rendering (e.g. LocalDate → "1970-…").
type Role ¶
type Role int
Role names the invocation-time treatment of a type.
- UserType the agent must attach an @type tag when the value is nested inside a generic container (Object field, List<?>, Map<?,?>). Plain DTOs, custom exceptions, @JsonSubTypes bases, etc.
- Container the type is a Collection or Map. Child values still need @type decisions; the container itself is transparent to Hessian2.
- Passthrough the type is a primitive, wrapper, String, Number, Date, Temporal, CharSequence, or enum. Never needs @type.
func Classify ¶
func Classify(fqn string, lookup ClassLookup) Role
Classify returns the Role of fqn by walking the supertype chain. Unknown types (not in the registry, not in any built-in set) are treated as UserType — the safer default for @type injection, since a missing tag causes Hessian2 deserialisation failures at the server, while a redundant tag is usually tolerated.
The walk terminates when any ancestor matches one of the built-in sets:
passthrough: primitives, wrappers, Number, CharSequence, Date, Temporal,
Enum, UUID, BigInteger, BigDecimal
container: Collection, Map (and their subtypes)
Arrays (trailing "[]") and parameterised names ("List<String>") are normalised by stripping the suffix before lookup.