/*
 * Copyright 2017-present Open Networking Foundation
 *
 * 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.cfm;

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 class CfmCodecContext implements CodecContext {

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

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

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

    @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;
    }
}
