package org.nd4j.parameterserver.distributed.messages;
import lombok.extern.slf4j.Slf4j;
import org.agrona.concurrent.UnsafeBuffer;
import org.apache.commons.io.input.ClassLoaderObjectInputStream;
import org.apache.commons.lang3.SerializationUtils;
import org.nd4j.parameterserver.distributed.conf.VoidConfiguration;
import org.nd4j.parameterserver.distributed.enums.NodeRole;
import org.nd4j.parameterserver.distributed.logic.completion.Clipboard;
import org.nd4j.parameterserver.distributed.logic.Storage;
import org.nd4j.parameterserver.distributed.training.TrainingDriver;
import org.nd4j.parameterserver.distributed.transport.Transport;
import java.io.ByteArrayInputStream;
import java.io.ObjectInputStream;
import java.io.Serializable;
/**
* @author raver119@gmail.com
*/
public interface VoidMessage extends Serializable {
void setTargetId(short id);
short getTargetId();
long getTaskId();
int getMessageType();
long getOriginatorId();
void setOriginatorId(long id);
byte[] asBytes();
UnsafeBuffer asUnsafeBuffer();
static <T extends VoidMessage> T fromBytes(byte[] array) {
try {
ObjectInputStream in = new ClassLoaderObjectInputStream(Thread.currentThread().getContextClassLoader(),
new ByteArrayInputStream(array));
T result = (T) in.readObject();
return result;
} catch (Exception e) {
throw new RuntimeException(e);
}
//return SerializationUtils.deserialize(array);
}
/**
* This method initializes message for further processing
*/
void attachContext(VoidConfiguration voidConfiguration, TrainingDriver<? extends TrainingMessage> trainer,
Clipboard clipboard, Transport transport, Storage storage, NodeRole role, short shardIndex);
void extractContext(BaseVoidMessage message);
/**
* This method will be started in context of executor, either Shard, Client or Backup node
*/
void processMessage();
boolean isJoinSupported();
boolean isBlockingMessage();
void joinMessage(VoidMessage message);
int getRetransmitCount();
void incrementRetransmitCount();
}