com.moz.fiji.mapreduce.kvstore.impl.KeyValueStoreConfigSerializer.java Source code

Java tutorial

Introduction

Here is the source code for com.moz.fiji.mapreduce.kvstore.impl.KeyValueStoreConfigSerializer.java

Source

/**
 * (c) Copyright 2012 WibiData, Inc.
 *
 * See the NOTICE file distributed with this work for additional
 * information regarding copyright ownership.
 *
 * 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 com.moz.fiji.mapreduce.kvstore.impl;

import java.io.IOException;
import java.util.Map;

import org.apache.hadoop.conf.Configuration;

import com.moz.fiji.annotations.ApiAudience;
import com.moz.fiji.mapreduce.kvstore.KeyValueStore;
import com.moz.fiji.mapreduce.kvstore.framework.KeyValueStoreConfiguration;

/**
 * Serialize multiple KeyValueStoreConfigurations into a Hadoop Configuration
 * or deserialize the reverse.
 */
@ApiAudience.Private
public final class KeyValueStoreConfigSerializer {

    /** KeyValueStoreConfiguration variable storing the class name to deserialize the store. */
    public static final String CONF_CLASS = "fiji$kvstore$class";

    /** KeyValueStoreConfiguration variable storing the name of this KeyValueStore. */
    public static final String CONF_NAME = "fiji$kvstore$name";

    /** How many KeyValueStore definitions were serialized in the configuration? */
    public static final String CONF_KEY_VALUE_STORE_COUNT = "fiji.job.kvstores.count";

    /** Default value for CONF_KEY_VALUE_STORE_COUNT. */
    public static final int DEFAULT_KEY_VALUE_STORE_COUNT = 0;

    /** Construct a new KeyValueStoreConfigSerializer. */
    private KeyValueStoreConfigSerializer() {
    }

    // Singleton instance.
    private static final KeyValueStoreConfigSerializer INSTANCE = new KeyValueStoreConfigSerializer();

    /**
     * This method returns a KeyValueStoreConfigSerializer instance.
     *
     * @return a KeyValueStoreConfigSerializer.
     */
    public static KeyValueStoreConfigSerializer get() {
        return INSTANCE;
    }

    /**
     * Given a set of KeyValueStores, add their configuration data to the provided Configuration.
     * This replaces any previous KeyValueStore configs in the Configuration.
     *
     * @param stores the map from names to KeyValueStores to serialize.
     * @param conf the Configuration to hold the stores.
     * @throws IOException if there is an error serializing the configuration of a store.
     */
    public void addStoreMapToConfiguration(Map<String, KeyValueStore<?, ?>> stores, Configuration conf)
            throws IOException {
        int i = 0;
        for (Map.Entry<String, KeyValueStore<?, ?>> entry : stores.entrySet()) {
            String storeName = entry.getKey();
            KeyValueStore<?, ?> store = entry.getValue();

            if (null != store) {
                KeyValueStoreConfiguration kvStoreConf = KeyValueStoreConfiguration.createInConfiguration(conf, i);

                // Set the default deserializer class to the same one that serialized it.
                // This is done first, so the store itself can override it.
                kvStoreConf.set(CONF_CLASS, store.getClass().getName());

                // Serialize the class' inner data itself.
                store.storeToConf(kvStoreConf);

                // Then store the name binding associated with this KeyValueStore.
                kvStoreConf.set(CONF_NAME, storeName);

                i++;
            }
        }

        // Record the number of KeyValueStore instances we wrote to the conf, so we can
        // deserialize the same number afterward.
        conf.setInt(CONF_KEY_VALUE_STORE_COUNT, i);
    }
}