/*
* Copyright 2012 LinkedIn, Inc
*
* 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.linkedin.parseq.trace.codec.json;
import java.io.IOException;
import java.util.Map;
import org.codehaus.jackson.JsonGenerator;
import com.linkedin.parseq.trace.ShallowTrace;
import com.linkedin.parseq.trace.Trace;
import com.linkedin.parseq.trace.TraceRelationship;
/**
* @author Chris Pettitt (cpettitt@linkedin.com)
* @author Chi Chan (ckchan@linkedin.com)
* @author Jaroslaw Odzga (jodzga@linkedin.com)
*/
class JsonTraceSerializer {
private JsonTraceSerializer() {
}
public static void serialize(Trace trace, JsonGenerator generator) throws IOException {
generator.writeStartObject();
writeTraces(trace, generator);
writeRelationships(trace, generator);
generator.writeEndObject();
}
private static void writeTraces(final Trace trace, final JsonGenerator generator) throws IOException {
generator.writeNumberField(JsonTraceCodec.PLAN_ID, trace.getPlanId());
generator.writeStringField(JsonTraceCodec.PLAN_CLASS, trace.getPlanClass());
generator.writeArrayFieldStart(JsonTraceCodec.TRACES);
for (Map.Entry<Long, ShallowTrace> entry : trace.getTraceMap().entrySet()) {
final ShallowTrace t = entry.getValue();
writeTrace(t, generator);
}
generator.writeEndArray();
}
private static void writeTrace(final ShallowTrace trace, final JsonGenerator generator) throws IOException {
generator.writeStartObject();
generator.writeNumberField(JsonTraceCodec.TRACE_ID, trace.getId());
generator.writeStringField(JsonTraceCodec.TRACE_NAME, trace.getName());
generator.writeStringField(JsonTraceCodec.TRACE_RESULT_TYPE, trace.getResultType().toString());
generator.writeBooleanField(JsonTraceCodec.TRACE_HIDDEN, trace.getHidden());
generator.writeBooleanField(JsonTraceCodec.TRACE_SYSTEM_HIDDEN, trace.getSystemHidden());
if (trace.getValue() != null) {
generator.writeStringField(JsonTraceCodec.TRACE_VALUE, trace.getValue());
}
if (trace.getStartNanos() != null) {
generator.writeNumberField(JsonTraceCodec.TRACE_START_NANOS, trace.getStartNanos());
}
if (trace.getPendingNanos() != null) {
generator.writeNumberField(JsonTraceCodec.TRACE_PENDING_NANOS, trace.getPendingNanos());
}
if (trace.getEndNanos() != null) {
generator.writeNumberField(JsonTraceCodec.TRACE_END_NANOS, trace.getEndNanos());
}
if (trace.getAttributes() != null && trace.getAttributes().size() > 0) {
generator.writeArrayFieldStart(JsonTraceCodec.TRACE_ATTRIBUTES);
for (Map.Entry<String, String> attribute : trace.getAttributes().entrySet()) {
generator.writeStartObject();
generator.writeStringField(JsonTraceCodec.TRACE_ATTRIBUTE_KEY, attribute.getKey());
generator.writeStringField(JsonTraceCodec.TRACE_ATTRIBUTE_VALUE, attribute.getValue());
generator.writeEndObject();
}
generator.writeEndArray();
}
if (trace.getTaskType() != null) {
generator.writeStringField(JsonTraceCodec.TRACE_TASK_TYPE, trace.getTaskType());
}
generator.writeEndObject();
}
private static void writeRelationships(final Trace trace, final JsonGenerator generator) throws IOException {
generator.writeArrayFieldStart(JsonTraceCodec.RELATIONSHIPS);
for (TraceRelationship rel : trace.getRelationships()) {
generator.writeStartObject();
generator.writeStringField(JsonTraceCodec.RELATIONSHIP_RELATIONSHIP, rel.getRelationhsip().name());
generator.writeNumberField(JsonTraceCodec.RELATIONSHIP_FROM, rel.getFrom());
generator.writeNumberField(JsonTraceCodec.RELATIONSHIP_TO, rel.getTo());
generator.writeEndObject();
}
generator.writeEndArray();
}
}