/*
 * Copyright 2016-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.pce.rest;

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 MockPceCodecContext implements CodecContext {

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

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

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

    @SuppressWarnings("unchecked")
    @Override
    public <T> T getService(Class<T> serviceClass) {
        // TODO
        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;
    }
}
