package jdk.jfr.internal.handlers;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import jdk.jfr.EventType;
import jdk.jfr.internal.EventControl;
import jdk.jfr.internal.JVM;
import jdk.jfr.internal.PlatformEventType;
import jdk.jfr.internal.PrivateAccess;
import jdk.jfr.internal.StringPool;
public abstract class EventHandler {
protected final PlatformEventType platformEventType;
private final EventType eventType;
private final EventControl eventControl;
EventHandler(boolean registered, EventType eventType, EventControl eventControl) {
this.eventType = eventType;
this.platformEventType = PrivateAccess.getInstance().getPlatformEventType(eventType);
this.eventControl = eventControl;
platformEventType.setRegistered(registered);
}
final protected StringPool createStringFieldWriter() {
return new StringPool();
}
public final boolean shouldCommit(long duration) {
return isEnabled() && duration >= platformEventType.getThresholdTicks();
}
public final boolean isEnabled() {
return platformEventType.isCommittable();
}
public final EventType getEventType() {
return eventType;
}
public final PlatformEventType getPlatformEventType() {
return platformEventType;
}
public final EventControl getEventControl() {
return eventControl;
}
public static long timestamp() {
return JVM.counterTime();
}
public static long duration(long startTime) {
if (startTime == 0) {
return 0;
}
return timestamp() - startTime;
}
@Override
public final Object clone() throws java.lang.CloneNotSupportedException {
throw new CloneNotSupportedException();
}
private final void writeObject(ObjectOutputStream out) throws IOException {
throw new IOException("Object cannot be serialized");
}
private final void readObject(ObjectInputStream in) throws IOException {
throw new IOException("Class cannot be deserialized");
}
public boolean isRegistered() {
return platformEventType.isRegistered();
}
public boolean setRegistered(boolean registered) {
return platformEventType.setRegistered(registered);
}
public void write(long start, long duration, String host, String address, int port, long timeout, long bytesRead, boolean endOfSTream) {
throwError("SocketReadEvent");
}
public void write(long start, long duration, String host, String address, int port, long bytesWritten) {
throwError("SocketWriteEvent");
}
public void write(long start, long duration, String path, boolean metadata) {
throwError("FileForceEvent");
}
public void write(long start, long duration, String path, long bytesRead, boolean endOfFile) {
throwError("FileReadEvent");
}
public void write(long start, long duration, String path, long bytesWritten) {
throwError("FileWriteEvent");
}
public void write(long start, long duration, String path, Class<?> exceptionClass) {
throwError("ExceptionThrownEvent or ErrorThrownEvent");
}
private void throwError(String classes) {
throw new InternalError("Method parameters don't match fields in class " + classes);
}
}