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

com.epam.deltix.qsrv.hf.pub.serializers.PolyObjectDeserializer Maven / Gradle / Ivy

/*
 * Copyright 2021 EPAM Systems, 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.epam.deltix.qsrv.hf.pub.serializers;


import com.epam.deltix.qsrv.hf.pub.codec.BoundDecoder;
import com.epam.deltix.qsrv.hf.pub.codec.TimeCodec;
import com.epam.deltix.qsrv.hf.pub.md.BooleanDataType;
import com.epam.deltix.timebase.messages.InstrumentMessage;
import com.epam.deltix.util.memory.MemoryDataInput;

class PolyObjectDeserializer implements Deserializer {

	private final BoundDecoder[] _decoders;
	private final Class[] _types;

	/**
	 * Constructor.
	 * @param decoders An array of BoundDecoder instances.
	 * @param types An array of types of objects to deserialize.
	 */
	public PolyObjectDeserializer(BoundDecoder[] decoders, Class[] types) {
		_decoders = decoders.clone();
		_types = types.clone();
	}

	/**
	 * Deserializes an object using the IDataReader as an input stream.
	 *
	 * @param input An instance of MemoryDataInput to read the serialized object
	 * @return The instance of deserialized object, or null if null was serialized.
	 */
	public Object deserialize(MemoryDataInput input) {

		if (!input.hasAvail() || input.readByte() != BooleanDataType.TRUE)
			return null;

		long messageTime = 0;
		CharSequence symbol = null;

		int codecId = input.readUnsignedShort();
		Class objectType = _types[codecId];

		if (InstrumentMessage.class.isAssignableFrom(objectType)) {
			messageTime = TimeCodec.readNanoTime(input);
			symbol = input.readString();
		}

		Object message = readMessageBody(input, codecId);

		if (message instanceof InstrumentMessage) {
			InstrumentMessage instrument = (InstrumentMessage)message;
			instrument.setNanoTime(messageTime);
			instrument.setSymbol(symbol);
		}
		return message;
	}

	protected Object readMessageBody(MemoryDataInput input, int codecId) {
		BoundDecoder decoder = getDecoder(codecId);
		return decoder.decode(input);
	}

	protected BoundDecoder getDecoder(int codecId) {
		assert codecId < _decoders.length;
		BoundDecoder decoder = _decoders[codecId];
		assert decoder != null;
		return decoder;
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy