@Override
    public DelayMeasurementCreate decode(ObjectNode json,
            CodecContext context) {

        if (json == null || !json.isObject()) {
            return null;
        }

        JsonNode dmNode = json.get(DM);
        Version version = Version.Y17312011;
        if (dmNode.get(VERSION) != null) {
            version = Version.valueOf(dmNode.get(VERSION).asText());
        }
        DmType dmCfgType = DmType.DMDMM;
        if (dmNode.get(DM_CFG_TYPE) != null) {
            dmCfgType = DmType.valueOf(dmNode.get(DM_CFG_TYPE).asText(DMDMM));
        }
        MepId remoteMepId = MepId.valueOf(
                nullIsIllegal(dmNode.get(REMOTE_MEP_ID), REMOTE_MEP_ID + " is required")
                .shortValue());
        Priority prio = Priority.valueOf(nullIsIllegal(dmNode.get(PRIORITY),
                PRIORITY + " is required in the format 'PRIOn'").asText());

        try {
            DmCreateBuilder builder = DefaultDelayMeasurementCreate
                    .builder(dmCfgType, version, remoteMepId, prio);

            if (dmNode.get(MEASUREMENTS_ENABLED) != null) {
                context.codec(MeasurementOption.class)
                    .decode((ArrayNode) (dmNode.get(MEASUREMENTS_ENABLED)), context)
                    .forEach(builder::addToMeasurementsEnabled);
            }

            if (dmNode.get(BINS_PER_FD_INTERVAL) != null) {
                builder = builder.binsPerFdInterval(
                        (short) dmNode.get(BINS_PER_FD_INTERVAL).asInt());
            }
            if (dmNode.get(BINS_PER_IFDV_INTERVAL) != null) {
                builder = builder.binsPerIfdvInterval(
                        (short) dmNode.get(BINS_PER_IFDV_INTERVAL).asInt());
            }
            if (dmNode.get(IFDV_SELECTION_OFFSET) != null) {
                builder = builder.ifdvSelectionOffset(
                        (short) dmNode.get(IFDV_SELECTION_OFFSET).asInt());
            }
            if (dmNode.get(BINS_PER_FDR_INTERVAL) != null) {
                builder = builder.binsPerFdrInterval(
                        (short) dmNode.get(BINS_PER_FDR_INTERVAL).asInt());
            }
            if (dmNode.get(FRAME_SIZE) != null) {
                builder = (DmCreateBuilder) builder.frameSize(
                        (short) dmNode.get(FRAME_SIZE).asInt());
            }
            if (dmNode.get(MESSAGE_PERIOD_MS) != null) {
                builder = (DmCreateBuilder) builder.messagePeriod(Duration.ofMillis(
                        dmNode.get(MESSAGE_PERIOD_MS).asInt()));
            }
            if (dmNode.get(MEASUREMENT_INTERVAL_MINS) != null) {
                builder = (DmCreateBuilder) builder.measurementInterval(
                        Duration.ofMinutes(
                        dmNode.get(MEASUREMENT_INTERVAL_MINS).asInt()));
            }
            if (dmNode.get(ALIGN_MEASUREMENT_INTERVALS) != null) {
                builder = (DmCreateBuilder) builder.alignMeasurementIntervals(
                        dmNode.get(ALIGN_MEASUREMENT_INTERVALS).asBoolean());
            }
            if (dmNode.get(ALIGN_MEASUREMENT_OFFSET_MINS) != null) {
                builder = (DmCreateBuilder) builder.alignMeasurementOffset(Duration.ofMinutes(
                        dmNode.get(ALIGN_MEASUREMENT_OFFSET_MINS).asInt()));
            }
            if (dmNode.get(START_TIME) != null) {
                builder = (DmCreateBuilder) builder.startTime(context.codec(StartTime.class)
                .decode((ObjectNode) dmNode.get(START_TIME), context));
            }
            if (dmNode.get(STOP_TIME) != null) {
                builder = (DmCreateBuilder) builder.stopTime(context.codec(StopTime.class)
                .decode((ObjectNode) dmNode.get(STOP_TIME), context));
            }

            return builder.build();
        } catch (SoamConfigException e) {
            throw new IllegalArgumentException(e);
        }
    }
@Test
    public void testDecodeObjectNodeCodecContext1()
            throws JsonProcessingException, IOException {
        String moStr = "{\"dm\": {}}";

        InputStream input = new ByteArrayInputStream(
                moStr.getBytes(StandardCharsets.UTF_8));
        JsonNode cfg = mapper.readTree(input);

        try {
            context.codec(DelayMeasurementCreate.class)
                .decode((ObjectNode) cfg, context);
            fail("Expecting an exception");
        } catch (IllegalArgumentException e) {
            assertEquals("remoteMepId is required", e.getMessage());
        }
    }