/*
 * 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.rya.indexing.pcj.storage.accumulo;

import static java.util.Objects.requireNonNull;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectOutputStream;

import org.apache.commons.io.serialization.ValidatingObjectInputStream;
import org.apache.fluo.api.data.Bytes;
import org.apache.rya.api.model.BindingSetDecorator;
import org.apache.rya.api.model.VisibilityBindingSet;
import org.eclipse.rdf4j.query.AbstractBindingSet;

import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
import edu.umd.cs.findbugs.annotations.NonNull;

/**
 * Serializes and deserializes a {@link VisibilityBindingSet} to and from {@link Bytes} objects.
 */
@DefaultAnnotation(NonNull.class)
public class VisibilityBindingSetSerDe {

    /**
     * Serializes a {@link VisibilityBindingSet} into a {@link Bytes} object.
     *
     * @param bindingSet - The binding set that will be serialized. (not null)
     * @return The serialized object.
     * @throws Exception A problem was encountered while serializing the object.
     */
    public Bytes serialize(final VisibilityBindingSet bindingSet) throws Exception {
        requireNonNull(bindingSet);

        final ByteArrayOutputStream boas = new ByteArrayOutputStream();
        try(final ObjectOutputStream oos = new ObjectOutputStream(boas)) {
            oos.writeObject(bindingSet);
        }

        return Bytes.of(boas.toByteArray());
    }

    /**
     * Deserializes a {@link VisibilityBindingSet} from a {@link Bytes} object.
     *
     * @param bytes - The bytes that will be deserialized. (not null)
     * @return The deserialized object.
     * @throws Exception A problem was encountered while deserializing the object.
     */
    public VisibilityBindingSet deserialize(final Bytes bytes) throws Exception {
        requireNonNull(bytes);
        try (final ValidatingObjectInputStream vois = new ValidatingObjectInputStream(new ByteArrayInputStream(bytes.toArray()))) {
            // Perform input validation.  Only the following classes are allowed to be deserialized.
            vois.accept(
                    VisibilityBindingSet.class,
                    java.lang.Byte.class,
                    java.lang.Double.class,
                    java.lang.Float.class,
                    java.lang.Integer.class,
                    java.lang.Long.class,
                    java.lang.Number.class,
                    java.lang.Short.class,
                    java.math.BigDecimal.class,
                    java.math.BigInteger.class,
                    java.util.LinkedHashMap.class,
                    java.util.HashMap.class,
                    org.apache.rya.api.model.BindingSetDecorator.class,
                    org.eclipse.rdf4j.query.impl.SimpleBinding.class,
                    org.eclipse.rdf4j.model.impl.SimpleIRI.class,
                    org.eclipse.rdf4j.model.impl.SimpleLiteral.class,
                    org.eclipse.rdf4j.model.impl.IntegerLiteral.class,
                    org.eclipse.rdf4j.model.impl.DecimalLiteral.class,
                    org.eclipse.rdf4j.model.impl.NumericLiteral.class,
                    org.eclipse.rdf4j.query.AbstractBindingSet.class,
                    org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet.class,
                    org.eclipse.rdf4j.query.impl.MapBindingSet.class
                );
            vois.accept("[B");
            final Object o = vois.readObject();
            if(o instanceof VisibilityBindingSet) {
                return (VisibilityBindingSet) o;
            } else {
                throw new Exception("Deserialized Object is not a VisibilityBindingSet. Was: " + o.getClass());
            }
        }
    }
}