All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.mongodb.spark.pickle.BSONValueBox Maven / Gradle / Ivy

package com.mongodb.spark.pickle;

import com.mongodb.hadoop.io.BSONWritable;
import org.apache.hadoop.io.Writable;
import org.bson.BasicBSONObject;
import org.bson.Transformer;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.io.Serializable;

/**
 * Base class for containers that hold BSON values.
 * These containers are used when unpickling objects from Python. Generally,
 * these objects implement a "__setstate__" method that allows their internal
 * state to be set after they are created.
 *
 * @param  the type of BSON value to be held.
 */
abstract class BSONValueBox implements Writable, Serializable {

    private static final Transformer TRANSFORMER = new Transformer() {
        @Override
        public Object transform(final Object objectToTransform) {
            if (!(objectToTransform instanceof BSONValueBox)) {
                throw new IllegalArgumentException(
                  "Can only transform instances of BSONValueBox, not "
                    + objectToTransform);
            }
            return ((BSONValueBox) objectToTransform).get();
        }
    };

    public abstract T get();

    static Transformer getTransformer() {
        return TRANSFORMER;
    }

    /**
     * Inflate a BSONValueBox from a DataInput.
     * This method is here so that BSONValueBox implements Hadoop's Writable
     * interface, which is a requirement to use this type with Spark Hadoop
     * RDDs. However, you should never call this method directly.
     *
     * @param in the DataInput.
     * @throws IOException is always thrown when this method is called.
     */
    @Override
    public void readFields(final DataInput in) throws IOException {
        throw new IOException("Cannot read fields into a BSONValueBox.");
    }

    /**
     * Write a BSONValueBox type to a DataOutput.
     * This method is here so that BSONValueBox implements Hadoop's Writable
     * interface, which is a requirement to use this type with Spark's Hadoop
     * RDDs. Calling this method will write into the output a document of the
     * form:
     * 
     *     {"value": (boxed value)}
     * 
     * @param out the DataOutput
     * @throws IOException when there is an error writing to the DataOutput
     */
    @Override
    public void write(final DataOutput out) throws IOException {
        (new BSONWritable(new BasicBSONObject("value", get()))).write(out);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy