Skip to content

Codec V2 Reference Information

This file contains reference information extracted from the development guide. For the main guide, see codec-v2-development-guide.md.

1. EMF Concepts

EMF TermCodec V2 Context
EClassType being serialized/deserialized
EAttributeSimple feature (String, int, Date)
EReferenceObject reference (containment or non-containment)
EPackageRegistered with MetadataService for metadata
EAnnotationSource of configuration (lowest priority)
EFactoryUsed to create instances during deserialization

2. Codec V2 Terminology

TermDefinition
AspectMetadata object (ClassConfig, FeatureConfig)
DiscriminatorValue used to identify EClass (e.g., "temp-sensor" → TempSensor)
EntrySerialization/Deserialization unit (Type, ID, Feature, Reference)
Effective ConfigResolved configuration after merging 5 sources
Scope ChainGlobal → Class → Feature (3 levels)
Source HierarchyOptions → Resource → Factory → Module → Annotation (5 levels)
Visibility GateFirst gate: ignore/ignoreWrite/ignoreRead/force*
Value GateSecond gate: serializeNull/Empty/Default

3. Jackson Integration

java
// Serialization context
CodecWriterContext ctx = new CodecWriterContextImpl(generator, context, effectiveConfig);

// Deserialization context
CodecReaderContext ctx = new CodecReaderContextImpl(parser, context, effectiveConfig);

// Custom value reader/writer
public class MyValueReader implements AttributeValueReader {
    @Override
    public Object read(CodecReaderContext context, EAttribute attribute) {
        JsonParser parser = context.getParser();
        return parser.readValueAs(MyType.class);
    }
}

4. Metadata Service Usage

java
// Register EPackage (triggers aspect parsing)
MetadataService metadataService = MetadataServiceFactory.getInstance();
DiagnosticCollector diagnostics = new DiagnosticCollectorImpl();
metadataService.registerPackage(MyPackage.eINSTANCE, diagnostics);

// Get aspects
ClassConfig classConfig = metadataService.getClassConfig(eClass);
FeatureConfig featureConfig = metadataService.getFeatureConfig(eClass, feature);

// Type discriminator service
TypeDiscriminatorService typeService = metadataService.getTypeDiscriminatorService();
EClass resolved = typeService.resolve("temp-sensor");

5. Configuration Builder Pattern

java
ConfigurationResolver config = ConfigurationResolver.builder()
    .typeStrategy(TypeStrategy.NAME)
    .idKeyMode(IdKeyMode.ID_ONLY)
    .idFeatures(List.of("id"))
    .superTypeStrategy(SuperTypeStrategy.ALL)
    .build();

// Per-class override
ClassConfig classConfig = ClassConfig.builder()
    .typeStrategy(TypeStrategy.URI)
    .build();

// Per-feature override
FeatureConfig featureConfig = FeatureConfig.builder()
    .ignore(true)
    .build();

6. Diagnostic Severity Levels

SeverityMeaningExample
ERRORInvalid configuration, feature disabledtypeValueReaderName on EReference
WARNINGQuestionable but allowedRuntime-only key in EAnnotation
INFOInformational messageDeprecated key usage

7. Type Resolution Priority Chain

During deserialization:

  1. ValueReader (if registered) — full delegation, bypass all type logic
  2. Explicit _type field (in JSON) — highest priority from data
  3. Discriminator mapping (TypeDiscriminatorService) — inline or global
  4. Type hints (CODEC_FEATURE_TYPE_HINTS) — EAnnotation on EReference
  5. Declared type (EReference.eReferenceType) — fallback
  6. Error (if abstract and no resolution) — DeserializationMode controls behavior

Released under the EPL-2.0 License. Eclipse Fennec is part of the Eclipse Foundation.