src/jdk.jfr/share/classes/jdk/jfr/internal/cmd/JSONWriter.java
author egahlin
Tue, 15 May 2018 20:24:34 +0200
changeset 50113 caf115bb98ad
permissions -rw-r--r--
8199712: Flight Recorder Reviewed-by: coleenp, ihse, erikj, dsamersoff, mseledtsov, egahlin, mgronlun Contributed-by: erik.gahlin@oracle.com, markus.gronlund@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     1
/*
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     2
 * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     4
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    10
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    15
 * accompanied this code).
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    16
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    20
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    23
 * questions.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    24
 */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    25
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    26
package jdk.jfr.internal.cmd;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    27
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    28
import java.io.IOException;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    29
import java.io.PrintWriter;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    30
import java.nio.file.Path;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    31
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    32
import jdk.jfr.EventType;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    33
import jdk.jfr.ValueDescriptor;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    34
import jdk.jfr.consumer.RecordedEvent;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    35
import jdk.jfr.consumer.RecordedObject;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    36
import jdk.jfr.consumer.RecordingFile;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    37
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    38
final class JSONWriter extends StructuredWriter {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    39
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    40
    public JSONWriter(PrintWriter writer) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    41
        super(writer);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    42
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    43
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    44
    public void print(Path source) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    45
        try (RecordingFile es = new RecordingFile(source)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    46
            printObjectBegin();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    47
            printRecording(es);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    48
            printObjectEnd();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    49
            flush();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    50
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    51
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    52
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    53
    private void printRecording(RecordingFile es) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    54
        printDataStructureName("recording");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    55
        printObjectBegin();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    56
        printEvents(es);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    57
        printObjectEnd();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    58
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    59
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    60
    private void printEvents(RecordingFile es) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    61
        printDataStructureName("events");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    62
        printArrayBegin();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    63
        boolean first = true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    64
        while (es.hasMoreEvents()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    65
            RecordedEvent e = es.readEvent();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    66
            printNewDataStructure(first, true, null);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    67
            printEvent(e);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    68
            flush();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    69
            first = false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    70
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    71
        printArrayEnd();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    72
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    73
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    74
    private void printEvent(RecordedEvent e) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    75
        printObjectBegin();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    76
        EventType type = e.getEventType();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    77
        printValue(true, false, "name", type.getName());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    78
        printValue(false, false, "typeId", type.getId());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    79
        printValue(false, false, "startTime", e.getStartTime());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    80
        printValue(false, false, "duration", e.getDuration());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    81
        printNewDataStructure(false, false, "values");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    82
        printObject(e);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    83
        printObjectEnd();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    84
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    85
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    86
    void printValue(boolean first, boolean arrayElement, String name, Object value) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    87
        printNewDataStructure(first, arrayElement, name);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    88
        if (!printIfNull(value)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    89
            if (value instanceof Boolean) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    90
                printAsString(value);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    91
                return;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    92
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    93
            if (value instanceof Double) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    94
                Double dValue = (Double) value;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    95
                if (Double.isNaN(dValue) || Double.isInfinite(dValue)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    96
                    printNull();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    97
                    return;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    98
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    99
                printAsString(value);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   100
                return;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   101
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   102
            if (value instanceof Float) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   103
                Float fValue = (Float) value;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   104
                if (Float.isNaN(fValue) || Float.isInfinite(fValue)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   105
                    printNull();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   106
                    return;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   107
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   108
                printAsString(value);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   109
                return;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   110
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   111
            if (value instanceof Number) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   112
                printAsString(value);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   113
                return;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   114
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   115
            print("\"");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   116
            printEscaped(String.valueOf(value));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   117
            print("\"");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   118
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   119
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   120
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   121
    public void printObject(RecordedObject object) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   122
        printObjectBegin();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   123
        boolean first = true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   124
        for (ValueDescriptor v : object.getFields()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   125
            printValueDescriptor(first, false, v, object.getValue(v.getName()));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   126
            first = false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   127
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   128
        printObjectEnd();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   129
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   130
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   131
    private void printArray(ValueDescriptor v, Object[] array) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   132
        printArrayBegin();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   133
        boolean first = true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   134
        for (Object arrayElement : array) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   135
            printValueDescriptor(first, true, v, arrayElement);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   136
            first = false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   137
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   138
        printArrayEnd();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   139
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   140
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   141
    private void printValueDescriptor(boolean first, boolean arrayElement, ValueDescriptor vd, Object value) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   142
        if (vd.isArray() && !arrayElement) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   143
            printNewDataStructure(first, arrayElement, vd.getName());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   144
            if (!printIfNull(value)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   145
                printArray(vd, (Object[]) value);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   146
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   147
            return;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   148
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   149
        if (!vd.getFields().isEmpty()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   150
            printNewDataStructure(first, arrayElement, vd.getName());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   151
            if (!printIfNull(value)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   152
                printObject((RecordedObject) value);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   153
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   154
            return;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   155
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   156
        printValue(first, arrayElement, vd.getName(), value);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   157
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   158
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   159
    private void printNewDataStructure(boolean first, boolean arrayElement, String name) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   160
        if (!first) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   161
            print(", ");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   162
            if (!arrayElement) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   163
                println();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   164
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   165
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   166
        if (!arrayElement) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   167
            printDataStructureName(name);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   168
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   169
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   170
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   171
    private boolean printIfNull(Object value) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   172
        if (value == null) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   173
            printNull();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   174
            return true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   175
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   176
        return false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   177
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   178
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   179
    private void printNull() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   180
        print("null");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   181
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   182
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   183
    private void printDataStructureName(String text) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   184
        printIndent();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   185
        print("\"");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   186
        print(text);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   187
        print("\": ");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   188
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   189
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   190
    private void printObjectEnd() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   191
        retract();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   192
        println();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   193
        printIndent();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   194
        print("}");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   195
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   196
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   197
    private void printObjectBegin() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   198
        println("{");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   199
        indent();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   200
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   201
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   202
    private void printArrayEnd() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   203
        print("]");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   204
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   205
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   206
    private void printArrayBegin() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   207
        print("[");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   208
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   209
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   210
    private void printEscaped(String text) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   211
        for (int i = 0; i < text.length(); i++) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   212
            printEscaped(text.charAt(i));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   213
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   214
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   215
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   216
    private void printEscaped(char c) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   217
        if (c == '\b') {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   218
            print("\\b");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   219
            return;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   220
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   221
        if (c == '\n') {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   222
            print("\\n");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   223
            return;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   224
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   225
        if (c == '\t') {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   226
            print("\\t");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   227
            return;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   228
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   229
        if (c == '\f') {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   230
            print("\\f");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   231
            return;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   232
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   233
        if (c == '\r') {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   234
            print("\\r");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   235
            return;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   236
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   237
        if (c == '\"') {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   238
            print("\\\"");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   239
            return;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   240
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   241
        if (c == '\\') {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   242
            print("\\\\");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   243
            return;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   244
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   245
        if (c == '/') {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   246
            print("\\/");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   247
            return;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   248
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   249
        if (c > 0x7F || c < 32) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   250
            print("\\u");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   251
            // 0x10000 will pad with zeros.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   252
            print(Integer.toHexString(0x10000 + (int) c).substring(1));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   253
            return;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   254
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   255
        print(c);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   256
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   257
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   258
}