/*
 * Copyright 2015-present Open Networking Laboratory
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.onosproject.faultmanagement.web;

import org.onosproject.codec.CodecContext;
import org.onosproject.codec.CodecService;
import org.onosproject.codec.JsonCodec;
import org.onosproject.codec.impl.CodecManager;

import com.fasterxml.jackson.databind.ObjectMapper;

/**
 * Mock codec context for use in codec unit tests.
 */
public final class AlarmCodecContext implements CodecContext {

    private final ObjectMapper mapper = new ObjectMapper();
    private final CodecManager codecManager = new CodecManager();
    private final AlarmCodecRegistrator manager = new AlarmCodecRegistrator();

    /**
     * Constructs a new mock codec context.
     */
    public AlarmCodecContext() {
        codecManager.activate();
        manager.codecService = codecManager;
        manager.activate();
    }

    @Override
    public ObjectMapper mapper() {
        return mapper;
    }

    @SuppressWarnings("unchecked")
    @Override
    public <T> T getService(Class<T> serviceClass) {
        return null;
    }

    @Override
    public <T> JsonCodec<T> codec(Class<T> entityClass) {
        return codecManager.getCodec(entityClass);
    }

    /**
     * Get the codec manager.
     *
     * @return instance of codec manager
     */
    public CodecService codecManager() {
        return codecManager;
    }
}
