package org.jboss.capedwarf.log;
import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import com.google.appengine.api.log.AppLogLine;
import com.google.appengine.api.log.LogService;
import com.google.appengine.api.log.RequestLogs;
import com.google.appengine.api.utils.SystemProperty;
import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.Indexed;
import org.hibernate.search.annotations.NumericField;
import org.hibernate.search.annotations.ProvidedId;
import org.jboss.capedwarf.shared.reflection.MethodInvocation;
import org.jboss.capedwarf.shared.reflection.ReflectionUtils;
import org.jboss.util.Base64;
/**
* @author <a href="mailto:mluksa@redhat.com">Marko Luksa</a>
* @author <a href="mailto:ales.justin@jboss.org">Ales Justin</a>
*/
@Indexed
@ProvidedId
public class CapedwarfRequestLogs extends CapedwarfLogElement implements Externalizable, Cloneable {
public static final String END_TIME_USEC = "endTimeUsec";
public static final String MAX_LOG_LEVEL = "maxLogLevel";
public static final String FINISHED = "finished";
private static final int EXTERNALIZER_VERSION = 3;
private static MethodInvocation<String> getAppEngineRelease = ReflectionUtils.optionalMethod(RequestLogs.class, "getAppEngineRelease");
private static MethodInvocation<Void> setAppEngineRelease = ReflectionUtils.optionalMethod(RequestLogs.class, "setAppEngineRelease", String.class);
private RequestLogs requestLogs = new RequestLogs();
private Integer maxLogLevel;
public CapedwarfRequestLogs() {
// TODO -- right values?
setAppEngineRelease.invokeWithTarget(requestLogs, SystemProperty.version.get());
requestLogs.setUrlMapEntry("");
requestLogs.setOffset(Base64.encodeBytes(String.valueOf(System.nanoTime()).getBytes()));
}
public RequestLogs getRequestLogs() {
return requestLogs;
}
@NumericField
@Field(name = MAX_LOG_LEVEL)
public Integer getMaxLogLevel() {
return maxLogLevel;
}
public void setMaxLogLevel(int maxLogLevel) {
this.maxLogLevel = maxLogLevel;
}
public void logLineAdded(AppLogLine appLogLine) {
LogService.LogLevel logLevel = appLogLine.getLogLevel();
if (maxLogLevel == null || logLevel.ordinal() > maxLogLevel) {
setMaxLogLevel(logLevel.ordinal());
}
requestLogs.setEndTimeUsec(appLogLine.getTimeUsec());
}
@NumericField
@Field(name = END_TIME_USEC)
public long getEndTimeUsec() {
return requestLogs.getEndTimeUsec();
}
@Field(name = FINISHED)
public boolean isFinished() {
return requestLogs.isFinished();
}
@Override
public void writeExternal(ObjectOutput out) throws IOException {
out.writeInt(EXTERNALIZER_VERSION);
out.writeObject(maxLogLevel);
writeUTF(out, requestLogs.getAppId());
writeUTF(out, requestLogs.getModuleId());
writeUTF(out, requestLogs.getVersionId());
writeUTF(out, requestLogs.getRequestId());
writeUTF(out, requestLogs.getOffset());
writeUTF(out, requestLogs.getIp());
writeUTF(out, requestLogs.getNickname());
out.writeLong(requestLogs.getStartTimeUsec());
out.writeLong(requestLogs.getEndTimeUsec());
out.writeLong(requestLogs.getLatencyUsec());
out.writeLong(requestLogs.getMcycles());
writeUTF(out, requestLogs.getMethod());
writeUTF(out, requestLogs.getResource());
writeUTF(out, requestLogs.getHttpVersion());
out.writeInt(requestLogs.getStatus());
out.writeLong(requestLogs.getResponseSize());
writeUTF(out, requestLogs.getReferrer());
writeUTF(out, requestLogs.getUserAgent());
writeUTF(out, requestLogs.getUrlMapEntry());
writeUTF(out, requestLogs.getCombined());
out.writeLong(requestLogs.getApiMcycles());
writeUTF(out, requestLogs.getHost());
out.writeDouble(requestLogs.getCost());
writeUTF(out, requestLogs.getTaskQueueName());
writeUTF(out, requestLogs.getTaskName());
out.writeBoolean(requestLogs.isLoadingRequest());
out.writeLong(requestLogs.getPendingTimeUsec());
out.writeInt(requestLogs.getReplicaIndex());
out.writeBoolean(requestLogs.isFinished());
writeUTF(out, requestLogs.getInstanceKey());
writeUTF(out, getAppEngineRelease.invokeWithTarget(requestLogs));
}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
int version = in.readInt();
if (version == EXTERNALIZER_VERSION) {
maxLogLevel = (Integer) in.readObject();
requestLogs.setAppId(readUTF(in));
requestLogs.setModuleId(readUTF(in));
requestLogs.setVersionId(readUTF(in));
requestLogs.setRequestId(readUTF(in));
requestLogs.setOffset(readUTF(in));
requestLogs.setIp(readUTF(in));
requestLogs.setNickname(readUTF(in));
requestLogs.setStartTimeUsec(in.readLong());
requestLogs.setEndTimeUsec(in.readLong());
requestLogs.setLatency(in.readLong());
requestLogs.setMcycles(in.readLong());
requestLogs.setMethod(readUTF(in));
requestLogs.setResource(readUTF(in));
requestLogs.setHttpVersion(readUTF(in));
requestLogs.setStatus(in.readInt());
requestLogs.setResponseSize(in.readLong());
requestLogs.setReferrer(readUTF(in));
requestLogs.setUserAgent(readUTF(in));
requestLogs.setUrlMapEntry(readUTF(in));
requestLogs.setCombined(readUTF(in));
requestLogs.setApiMcycles(in.readLong());
requestLogs.setHost(readUTF(in));
requestLogs.setCost(in.readDouble());
requestLogs.setTaskQueueName(readUTF(in));
requestLogs.setTaskName(readUTF(in));
requestLogs.setWasLoadingRequest(in.readBoolean());
requestLogs.setPendingTime(in.readLong());
requestLogs.setReplicaIndex(in.readInt());
requestLogs.setFinished(in.readBoolean());
requestLogs.setInstanceKey(readUTF(in));
setAppEngineRelease.invokeWithTarget(requestLogs, readUTF(in));
} else {
throw new IOException("Unsupported version " + version);
}
}
private void writeUTF(ObjectOutput out, String str) throws IOException {
if (str == null) {
out.writeBoolean(true);
} else {
out.writeBoolean(false);
out.writeUTF(str);
}
}
private String readUTF(ObjectInput in) throws IOException, ClassNotFoundException {
boolean isNull = in.readBoolean();
if (isNull) {
return null;
} else {
return in.readUTF();
}
}
@SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
@Override
public CapedwarfRequestLogs clone() {
try {
CapedwarfRequestLogs clone = (CapedwarfRequestLogs) super.clone();
clone.requestLogs = new RequestLogs();
clone.requestLogs.setAppId(requestLogs.getAppId());
clone.requestLogs.setModuleId(requestLogs.getModuleId());
clone.requestLogs.setVersionId(requestLogs.getVersionId());
clone.requestLogs.setRequestId(requestLogs.getRequestId());
clone.requestLogs.setOffset(requestLogs.getOffset());
clone.requestLogs.setIp(requestLogs.getIp());
clone.requestLogs.setNickname(requestLogs.getNickname());
clone.requestLogs.setStartTimeUsec(requestLogs.getStartTimeUsec());
clone.requestLogs.setEndTimeUsec(requestLogs.getEndTimeUsec());
clone.requestLogs.setLatency(requestLogs.getLatencyUsec());
clone.requestLogs.setMcycles(requestLogs.getMcycles());
clone.requestLogs.setMethod(requestLogs.getMethod());
clone.requestLogs.setResource(requestLogs.getResource());
clone.requestLogs.setHttpVersion(requestLogs.getHttpVersion());
clone.requestLogs.setStatus(requestLogs.getStatus());
clone.requestLogs.setResponseSize(requestLogs.getResponseSize());
clone.requestLogs.setReferrer(requestLogs.getReferrer());
clone.requestLogs.setUserAgent(requestLogs.getUserAgent());
clone.requestLogs.setUrlMapEntry(requestLogs.getUrlMapEntry());
clone.requestLogs.setCombined(requestLogs.getCombined());
clone.requestLogs.setApiMcycles(requestLogs.getApiMcycles());
clone.requestLogs.setHost(requestLogs.getHost());
clone.requestLogs.setCost(requestLogs.getCost());
clone.requestLogs.setTaskQueueName(requestLogs.getTaskQueueName());
clone.requestLogs.setTaskName(requestLogs.getTaskName());
clone.requestLogs.setWasLoadingRequest(requestLogs.isLoadingRequest());
clone.requestLogs.setPendingTime(requestLogs.getPendingTimeUsec());
clone.requestLogs.setReplicaIndex(requestLogs.getReplicaIndex());
clone.requestLogs.setFinished(requestLogs.isFinished());
clone.requestLogs.setInstanceKey(requestLogs.getInstanceKey());
setAppEngineRelease.invokeWithTarget(clone.requestLogs, requestLogs.getAppEngineRelease());
return clone;
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
}
}