/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.apache.ignite.internal.processors.cache.binary;

import org.apache.ignite.configuration.CacheConfiguration;
import org.apache.ignite.internal.GridKernalContext;
import org.apache.ignite.internal.processors.cache.CacheDefaultBinaryAffinityKeyMapper;
import org.apache.ignite.internal.processors.cache.CacheObjectContext;
import org.apache.ignite.internal.processors.cache.GridCacheDefaultAffinityKeyMapper;

/**
 *
 */
public class CacheObjectBinaryContext extends CacheObjectContext {
    /** */
    private boolean binaryEnabled;

    /**
     * @param kernalCtx Kernal context.
     * @param ccfg Cache configuration.
     * @param binaryEnabled Binary enabled flag.
     * @param cpyOnGet Copy on get flag.
     * @param storeVal {@code True} if should store unmarshalled value in cache.
     * @param depEnabled {@code true} if deployment is enabled for the given cache.
     */
    public CacheObjectBinaryContext(GridKernalContext kernalCtx,
        CacheConfiguration ccfg,
        boolean cpyOnGet,
        boolean storeVal,
        boolean binaryEnabled,
        boolean depEnabled) {
        super(kernalCtx,
            ccfg.getName(),
            binaryEnabled ? new CacheDefaultBinaryAffinityKeyMapper(ccfg.getKeyConfiguration()) :
                new GridCacheDefaultAffinityKeyMapper(),
            cpyOnGet,
            storeVal,
            depEnabled);

        this.binaryEnabled = binaryEnabled;
    }

    /** {@inheritDoc} */
    @Override public boolean binaryEnabled() {
        return binaryEnabled;
    }
}
