common Package Structure
The common module is organized into logical packages for better code organization and discoverability.
Package Organization
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
org.trustweave.core/
├── exception/ # Exception types and error handling
│ ├── TrustWeaveException.kt
│ ├── PluginException.kt
│ ├── ProviderException.kt
│ ├── ConfigException.kt
│ └── SerializationException.kt
│
├── plugin/ # Plugin infrastructure
│ ├── PluginRegistry.kt
│ ├── PluginMetadata.kt
│ ├── PluginConfiguration.kt
│ ├── PluginConfigurationLoader.kt
│ ├── PluginLifecycle.kt
│ ├── PluginType.kt
│ └── ProviderChain.kt
│
├── identifiers/ # Identifier value/open classes
│ └── Identifiers.kt # Iri, KeyId, IriSerializer, KeyIdSerializer
│
├── serialization/ # Serialization helpers
│ ├── InstantSerializer.kt
│ └── SerializationModule.kt
│
└── util/ # General utilities
├── DigestUtils.kt # JSON canonicalization and digest computation
├── ResultExtensions.kt # Result<T> extension functions
└── Validation.kt # Generic validation infrastructure (ValidationResult)
Package Details
org.trustweave.core.exception
Exception types and error handling:
TrustWeaveException–open classbase type. Nested types:ValidationFailed,InvalidOperation,InvalidState,Unknown,DigestFailed,EncodeFailed,NotFound,UnsupportedAlgorithmPluginException– sealed sibling class extendingTrustWeaveException. Subtypes:NotFound,InitializationFailed,AlreadyRegistered,BlankId(object)ProviderException– sealed sibling class. Subtypes:NoneFound,PartiallyFound,AllFailedConfigException– sealed sibling class. Subtypes:NotFound,ReadFailed,InvalidFormatSerializationException– sealed sibling class. Subtypes:InvalidJson,EncodeFailed
Example:
1
2
3
4
5
6
7
8
9
10
import org.trustweave.core.exception.TrustWeaveException
import org.trustweave.core.exception.PluginException
try {
// operation
} catch (e: PluginException.NotFound) {
// handle missing plugin
} catch (e: TrustWeaveException) {
// handle other structured errors
}
org.trustweave.core.plugin
Plugin infrastructure for extensibility:
PluginMetadata– Metadata about plugins (capabilities, dependencies, configuration)PluginCapabilities– Domain-agnostic capabilities (features, extensions)PluginConfiguration– Configuration loaded from YAML/JSON filesPluginConfigurationLoader– Loader for YAML/JSON plugin configurationsPluginType– Framework-level plugin type enumeration (BLOCKCHAIN, CREDENTIAL_SERVICE, DID_METHOD, KMS, etc.)PluginLifecycle– Lifecycle interface for plugin initialization, startup, shutdown, and cleanupPluginRegistry/ProviderChain– Internal infrastructure (internalvisibility). Use domain registries (DidMethodRegistry,BlockchainAnchorRegistry, etc.) instead.
TODO: Add a public example for the domain-specific registries;
PluginRegistryis no longer a public entry point.
org.trustweave.core.util
General utilities used across TrustWeave:
DigestUtils– JSON canonicalization and SHA-256 digest computation with multibase encoding (base58btc)ResultExtensions– Extension functions forResult<T>(mapError, combine, mapSequential, onSuccess, onFailure, etc.)Validation– Generic validation infrastructure (ValidationResultsealed class)
Example:
1
2
3
4
5
6
7
8
9
10
11
12
import org.trustweave.core.util.DigestUtils
import org.trustweave.core.util.ValidationResult
val digest = DigestUtils.sha256DigestMultibase(jsonElement)
val canonical = DigestUtils.canonicalizeJson(jsonString)
// Generic validation result
val validation: ValidationResult = someValidation()
if (!validation.isValid()) {
val error = validation as ValidationResult.Invalid
println("Validation failed: ${error.message}")
}
Note: Domain-specific validators are in their respective modules:
DidValidator→org.trustweave.did.validation.DidValidator(indid:did-core)ChainIdValidator→org.trustweave.anchor.validation.ChainIdValidator(inanchors:anchor-core)
Related Packages
Domain-Specific Components
Domain-specific functionality is located in their respective modules:
- Proof Types →
org.trustweave.credential.proof.ProofType(incredentials:credential-api) - Schema Format →
org.trustweave.credential.SchemaFormat(incredentials:credential-api) - DID Validation →
org.trustweave.did.validation.DidValidator(indid:did-core) - Chain ID Validation →
org.trustweave.anchor.validation.ChainIdValidator(inanchors:anchor-core) - DID errors →
org.trustweave.did.exception.DidException(indid:did-core) - Blockchain errors →
org.trustweave.anchor.exceptions.BlockchainException(inanchors:anchor-core)
Migration Notes
If you’re migrating from an older version:
org.trustweave.json.DigestUtils→org.trustweave.core.util.DigestUtilsorg.trustweave.core.TrustWeaveException→org.trustweave.core.exception.TrustWeaveException- Legacy docs referring to
TrustWeaveError→ useTrustWeaveExceptionand domain types (DidException,BlockchainException,PluginException, …) org.trustweave.core.types.ProofType→org.trustweave.credential.model.ProofType(incredentials:credential-api)org.trustweave.core.DidValidator→org.trustweave.did.validation.DidValidator(indid:did-core)org.trustweave.core.ChainIdValidator→org.trustweave.anchor.validation.ChainIdValidator(inanchors:anchor-core)org.trustweave.core.ValidationResult→org.trustweave.core.util.ValidationResult(still in common, but validators moved)
Benefits of This Organization
- Clear Separation of Concerns – Related functionality is grouped together
- Easier Discovery – Developers can find related classes more easily
- Better Scalability – New utilities have a clear place to go
- Consistent Naming – Follows common Kotlin/Java package conventions
- Reduced Coupling – Clear boundaries between different concerns