This document covers the Java implementation of Dotprompt, which provides a Java API for parsing, compiling, and rendering Dotprompt templates. The implementation is organized under the com.google.dotprompt package and follows the same specification-driven architecture as other language implementations.
For the core concepts underlying all implementations, see Core Concepts. For language-specific implementations in other ecosystems, see JavaScript Implementation, Python Implementation, or Go Implementation.
The Java implementation (v0.1.0) provides a complete Dotprompt runtime with strong typing through sealed interfaces, asynchronous resolution via CompletableFuture, and integration with the Bazel build system. Key characteristics include:
Sources: java/com/google/dotprompt/parser/package-info.java1-118 java/com/google/dotprompt/helpers/package-info.java1-130 java/com/google/dotprompt/models/package-info.java1-132
The Java implementation is organized into four primary packages under com.google.dotprompt:
| Package | Purpose | Key Classes |
|---|---|---|
models | Data structures for prompts, messages, and parts | Prompt, Message, Part, RenderedPrompt |
parser | Template parsing and Picoschema conversion | Parser, Picoschema |
helpers | Handlebars helper functions | Helpers |
resolvers | Interfaces for dynamic resource loading | PartialResolver, SchemaResolver, ToolResolver |
Diagram: Java Package Architecture
Sources: java/com/google/dotprompt/parser/BUILD.bazel1-58 java/com/google/dotprompt/helpers/BUILD.bazel1-44 java/com/google/dotprompt/models/BUILD.bazel1-99
The models package defines the core data structures using Java records and sealed interfaces for type safety.
The Part sealed interface represents different types of content within a message:
Diagram: Part Type Hierarchy
The sealed interface pattern ensures exhaustive pattern matching and prevents external implementations:
| Part Type | Purpose | Key Fields |
|---|---|---|
TextPart | Plain text content | text |
MediaPart | Images, audio, video | media (MediaContent) |
DataPart | Structured JSON data | data (Map) |
ToolRequestPart | Function call requests | toolRequest (ToolArgument) |
ToolResponsePart | Function call responses | toolResponse (ToolArgument) |
PendingPart | Unresolved content | pending (Map) |
Sources: java/com/google/dotprompt/models/BUILD.bazel21-56 java/com/google/dotprompt/models/package-info.java26-50
The core types for representing prompts and their rendered output:
Diagram: Prompt Processing Types
Sources: java/com/google/dotprompt/models/BUILD.bazel21-56 java/com/google/dotprompt/models/package-info.java72-81
Types for working with prompt storage systems:
| Type | Purpose | Key Fields |
|---|---|---|
PromptRef | Reference to a stored prompt | name, version, variant |
PromptData | Raw prompt source from storage | template, config |
PartialRef | Reference to a stored partial | name |
PartialData | Raw partial template source | template |
PromptBundle | Collection of prompts | name, prompts |
PaginatedPrompts | Paginated prompt listing | items, nextPageToken |
PaginatedPartials | Paginated partial listing | items, nextPageToken |
Sources: java/com/google/dotprompt/models/BUILD.bazel36-46 java/com/google/dotprompt/models/package-info.java83-90
The parser package handles document parsing, Picoschema conversion, and message generation from rendered templates.
The Parser class provides the core parsing functionality:
Diagram: Parser Class Methods
The parsing pipeline extracts YAML frontmatter, parses the template body, and converts Picoschema definitions:
--- delimiterMap<String, Object> using JacksonSources: java/com/google/dotprompt/parser/package-info.java26-55 java/com/google/dotprompt/parser/BUILD.bazel19-33
The Picoschema class converts compact Picoschema notation to full JSON Schema:
Diagram: Picoschema Conversion Pipeline
The conversion algorithm:
? for optional, (array) for arrays)SchemaResolver to fetch named schemasSources: java/com/google/dotprompt/parser/package-info.java70-86 java/com/google/dotprompt/parser/BUILD.bazel48-57
The Parser.toMessages() method converts rendered template strings into structured messages by processing special marker strings:
| Marker Pattern | Purpose | Example |
|---|---|---|
<<<dotprompt:role:X>>> | Start new message with role X | <<<dotprompt:role:user>>> |
<<<dotprompt:history>>> | Insert conversation history | <<<dotprompt:history>>> |
<<<dotprompt:media:url X>>> | Add media part | <<<dotprompt:media:url https://...>>> |
<<<dotprompt:section X>>> | Create named section | <<<dotprompt:section intro>>> |
Sources: java/com/google/dotprompt/parser/package-info.java88-101
The helpers package provides custom Handlebars helpers that emit marker strings processed by the parser.
Diagram: Handlebars Helpers Architecture
Each helper is implemented as a com.github.jknack.handlebars.Helper that:
Example helper signatures:
json(Object, Options): Serializes object with optional indent parameterrole(String, Options): Emits role marker for the specified rolehistory(Options): Emits history insertion markersection(String, Options): Emits section marker with namemedia(Options): Emits media marker with URL and content type from hash parametersifEquals(Object, Object, Options): Block helper for equality comparisonunlessEquals(Object, Object, Options): Block helper for inequality comparisonSources: java/com/google/dotprompt/helpers/package-info.java44-107 java/com/google/dotprompt/helpers/BUILD.bazel19-32
The resolvers package defines functional interfaces for asynchronous resource resolution using CompletableFuture.
Diagram: Resolver Pattern Architecture
| Interface | Method Signature | Purpose |
|---|---|---|
PartialResolver | CompletableFuture<String> resolve(String name) | Load partial templates by name |
SchemaResolver | CompletableFuture<Map<String, Object>> resolve(String name) | Load JSON schemas by name |
ToolResolver | CompletableFuture<ToolDefinition> resolve(String name) | Load tool definitions by name |
All resolvers return CompletableFuture to support:
Sources: java/com/google/dotprompt/resolvers/package-info.java1-113
The Java implementation uses Bazel for building, testing, and publishing to Maven Central.
Each package has a BUILD.bazel file defining its targets:
Diagram: Bazel Build Graph
Sources: java/com/google/dotprompt/parser/BUILD.bazel1-58 java/com/google/dotprompt/helpers/BUILD.bazel1-44 java/com/google/dotprompt/models/BUILD.bazel1-99
The Java implementation relies on the following external libraries:
| Dependency | Purpose | Maven Coordinates |
|---|---|---|
| Jackson Databind | JSON parsing and serialization | com.fasterxml.jackson.core:jackson-databind |
| Jackson YAML | YAML frontmatter parsing | com.fasterxml.jackson.dataformat:jackson-dataformat-yaml |
| Handlebars.java | Template compilation and rendering | com.github.jknack:handlebars |
| Guava | Immutable collections and utilities | com.google.guava:guava |
| Google Truth | Test assertions | com.google.truth:truth |
| JUnit | Test framework | junit:junit |
Sources: java/com/google/dotprompt/parser/BUILD.bazel27-32 java/com/google/dotprompt/helpers/BUILD.bazel26-30 java/com/google/dotprompt/models/BUILD.bazel58-61
The Java implementation uses JUnit for test execution and Google Truth for assertions. Tests are organized into three categories:
Unit Tests: Test individual classes and methods
ParserTest: Tests for Parser.parse() and message generationPicoschemaTest: Tests for Picoschema-to-JSON-Schema conversionHelpersTest: Tests for Handlebars helper functionsModel Tests: Test data structures and serialization
TypeParityTest: Validates type consistency across implementationsModelTest: Tests model construction and validationJsonSerializationTest: Tests Jackson serialization/deserializationSpec Tests: (Referenced but not shown in provided files)
Sources: java/com/google/dotprompt/parser/BUILD.bazel35-57 java/com/google/dotprompt/helpers/BUILD.bazel34-43 java/com/google/dotprompt/models/BUILD.bazel64-98
The Java implementation follows Google Java style guidelines:
google-java-format for automatic code formattingpackage-info.java with detailed documentationPart interface is sealed for exhaustive pattern matching@JsonProperty, @JsonIgnoreProperties for serialization controlCompletableFuture for async operationsRefresh this wiki
This wiki was recently refreshed. Please wait 4 days to refresh again.