BindingSetKeySerializer.java

/*******************************************************************************
 * Copyright (c) 2023 Eclipse RDF4J contributors.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Distribution License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 *******************************************************************************/
package org.eclipse.rdf4j.collection.factory.mapdb;

import java.io.IOException;

import org.eclipse.rdf4j.collection.factory.api.BindingSetKey;
import org.eclipse.rdf4j.collection.factory.mapdb.MapDb3CollectionFactory.RDF4jMapDB3Exception;
import org.eclipse.rdf4j.model.Value;
import org.mapdb.DataInput2;
import org.mapdb.DataOutput2;
import org.mapdb.Serializer;
import org.mapdb.serializer.SerializerBoolean;
import org.mapdb.serializer.SerializerIntegerPacked;

class BindingSetKeySerializer implements Serializer<BindingSetKey> {

	private final SerializerBoolean sb = new SerializerBoolean();
	private final SerializerIntegerPacked si = new SerializerIntegerPacked();
	private final Serializer<Value> vs;

	public BindingSetKeySerializer(Serializer<Value> vs) {
		this.vs = vs;
	}

	@Override
	public void serialize(DataOutput2 out, BindingSetKey value) throws IOException {
		if (value == null) {
			sb.serialize(out, true);
		} else {
			sb.serialize(out, false);
			try {
				MapDb3BindingSetKey k = (MapDb3BindingSetKey) value;
				si.serialize(out, k.hashCode());
				si.serialize(out, k.values.length);
				for (int i = 0; i < k.values.length; i++) {
					vs.serialize(out, k.values[i]);
				}
			} catch (ClassCastException e) {
				throw new RDF4jMapDB3Exception("Collection factory overriden in an non conformat way", e);
			}
		}

	}

	@Override
	public BindingSetKey deserialize(DataInput2 input, int available) throws IOException {
		if (sb.deserialize(input, available)) {
			return null;
		} else {
			int hashCode = si.deserialize(input, available);
			int length = si.deserialize(input, available);
			Value[] values = new Value[length];
			for (int i = 0; i < length; i++) {
				values[i] = vs.deserialize(input, available);
			}
			return new MapDb3BindingSetKey(values, hashCode);
		}
	}

}