package nbtool.data.log;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.Vector;
import com.google.protobuf.Message;
import nbtool.data.SExpr;
import nbtool.data.group.Group;
import nbtool.data.json.Json.JsonValue;
import nbtool.data.json.JsonObject;
import nbtool.images.YUYV8888Image;
import nbtool.util.Debug;
import nbtool.util.Debug.DebugSettings;
import nbtool.util.SharedConstants;
import nbtool.util.test.TestBase;
import nbtool.util.test.Tests;
public abstract class Log {
//very rough.
public static final int MINIMUM_LOG_SIZE = 32;
protected LogReference logReference;
public LogReference getReference(){ return logReference; }
public abstract boolean temporary();
public Vector<Block> blocks = null;
public JsonObject topLevelDictionary = null;
public abstract String getFullDescription();
public abstract JsonObject getFullDictionary();
public long createdWhen = 0;
public String logClass = "";
public String host_type = null;
public String host_name = null;
public String host_addr = null;
//Used for ordering. Comparing two Log objects can be done by comparing pointers, i.e. ==
public final long jvm_unique_id = getUniqueID();
public abstract byte[] serialize();
public abstract void writeTo(OutputStream os) throws IOException;
public abstract void saveChangesToTempFile() throws Exception;
public abstract void saveChangesToLoadFile() throws Exception;
public abstract int version();
protected abstract long getUniqueID();
public abstract boolean addBlockFromProtobuf(Message message,
String whereFrom, long imageIndex, long createdWhen);
public abstract boolean addBlockFromImage(YUYV8888Image image,
String whereFrom, long imageIndex, long createdWhen);
public abstract boolean addBlockFromSexpr(SExpr sexpr,
String whereFrom, long imageIndex, long createdWhen);
public abstract boolean addBlockFromJson(JsonValue val,
String whereFrom, long imageIndex, long createdWhen);
public abstract boolean addBlockFromLog(Log log);
public abstract Block find(String type);
public abstract Log deepCopy();
public static Log emptyLog() {
return LogInternal.emptyLog();
}
public static Log explicitLog(Vector<Block> blocks, JsonObject topLevel, String logClass,
long created) {
return LogInternal.explicitLog( blocks != null ? blocks : new Vector<Block>(),
topLevel != null ? topLevel : new JsonObject(), logClass, created);
}
public static Log explicitLogFromArray(Block[] blocks, JsonObject topLevel, String logClass,
long created) {
return Log.explicitLog( new Vector<Block>(Arrays.asList(blocks)),
topLevel, logClass, created);
}
public static Log parseFrom(byte[] bytes) {
return LogInternal.parseFrom(bytes);
}
public static Log parseFromParts(byte[] json, byte[] data) {
return LogInternal.parseFromParts(json, data);
}
public static Log parseFromStream(InputStream is) throws IOException {
return LogInternal.parseFromStream(is);
}
}