src/jdk.jfr/share/classes/jdk/jfr/internal/MetadataDescriptor.java
author mgronlun
Wed, 30 Oct 2019 19:43:52 +0100
changeset 58863 c16ac7a2eba4
parent 50113 caf115bb98ad
permissions -rw-r--r--
8226511: Implement JFR Event Streaming Reviewed-by: egahlin, mseledtsov, mgronlun Contributed-by: erik.gahlin@oracle.com, mikhailo.seledtsov@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
/*
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 50113
diff changeset
     2
 * Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved.
50113
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;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    27
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    28
import java.io.DataOutput;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    29
import java.io.IOException;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    30
import java.util.ArrayList;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    31
import java.util.Collection;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    32
import java.util.List;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    33
import java.util.Locale;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    34
import java.util.TimeZone;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    35
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    36
import jdk.jfr.EventType;
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 50113
diff changeset
    37
import jdk.jfr.internal.consumer.RecordingInput;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    38
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    39
/**
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    40
 * Metadata about a chunk
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    41
 */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    42
public final class MetadataDescriptor {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    43
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    44
    static final class Attribute {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    45
        final String name;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    46
        final String value;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    47
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    48
        private Attribute(String name, String value) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    49
            this.name = name;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    50
            this.value = value;
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
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    54
    static final class Element {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    55
        final String name;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    56
        final List<Element> elements = new ArrayList<>();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    57
        final List<Attribute> attributes = new ArrayList<>();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    58
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    59
        Element(String name) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    60
            this.name = name;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    61
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    62
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    63
        long longValue(String name) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    64
            String v = attribute(name);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    65
            if (v != null)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    66
                return Long.parseLong(v);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    67
            else
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    68
                throw new IllegalArgumentException(name);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    69
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    70
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    71
        String attribute(String name) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    72
            for (Attribute a : attributes) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    73
                if (a.name.equals(name)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    74
                    return a.value;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    75
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    76
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    77
            return null;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    78
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    79
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    80
        @Override
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    81
        public String toString() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    82
            StringBuilder sb = new StringBuilder();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    83
            try {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    84
                prettyPrintXML(sb, "", this);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    85
            } catch (IOException e) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    86
                // should not happen
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    87
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    88
            return sb.toString();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    89
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    90
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    91
        long attribute(String name, long defaultValue) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    92
            String text = attribute(name);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    93
            if (text == null) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    94
                return defaultValue;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    95
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    96
            return Long.parseLong(text);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    97
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    98
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    99
        String attribute(String name, String defaultValue) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   100
            String text = attribute(name);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   101
            if (text == null) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   102
                return defaultValue;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   103
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   104
            return text;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   105
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   106
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   107
        List<Element> elements(String... names) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   108
            List<Element> filteredElements = new ArrayList<>();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   109
            for (String name : names) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   110
                for (Element e : elements) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   111
                    if (e.name.equals(name)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   112
                        filteredElements.add(e);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   113
                    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   114
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   115
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   116
            return filteredElements;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   117
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   118
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   119
        void add(Element element) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   120
            elements.add(element);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   121
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   122
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   123
        void addAttribute(String name, Object value) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   124
            attributes.add(new Attribute(name, String.valueOf(value)));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   125
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   126
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   127
        Element newChild(String name) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   128
            Element e = new Element(name);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   129
            elements.add(e);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   130
            return e;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   131
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   132
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   133
        public void addArrayAttribute(Element element, String name, Object value) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   134
            String typeName = value.getClass().getComponentType().getName();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   135
            switch (typeName) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   136
            case "int":
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   137
                int[] ints = (int[]) value;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   138
                for (int i = 0; i < ints.length; i++) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   139
                    addAttribute(name  + "-" + i , ints[i]);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   140
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   141
                break;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   142
            case "long":
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   143
                long[] longs = (long[]) value;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   144
                for (int i = 0; i < longs.length; i++) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   145
                    addAttribute(name  + "-" + i , longs[i]);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   146
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   147
                break;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   148
            case "float":
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   149
                float[] floats = (float[]) value;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   150
                for (int i = 0; i < floats.length; i++) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   151
                    addAttribute(name  + "-" + i , floats[i]);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   152
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   153
                break;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   154
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   155
            case "double":
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   156
                double[] doubles = (double[]) value;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   157
                for (int i = 0; i < doubles.length; i++) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   158
                    addAttribute(name  + "-" + i , doubles[i]);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   159
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   160
                break;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   161
            case "short":
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   162
                short[] shorts = (short[]) value;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   163
                for (int i = 0; i < shorts.length; i++) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   164
                    addAttribute(name  + "-" + i , shorts[i]);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   165
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   166
                break;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   167
            case "char":
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   168
                char[] chars = (char[]) value;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   169
                for (int i = 0; i < chars.length; i++) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   170
                    addAttribute(name  + "-" + i , chars[i]);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   171
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   172
                break;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   173
            case "byte":
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   174
                byte[] bytes = (byte[]) value;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   175
                for (int i = 0; i < bytes.length; i++) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   176
                    addAttribute(name  + "-" + i , bytes[i]);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   177
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   178
                break;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   179
            case "boolean":
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   180
                boolean[] booleans = (boolean[]) value;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   181
                for (int i = 0; i < booleans.length; i++) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   182
                    addAttribute(name  + "-" + i , booleans[i]);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   183
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   184
                break;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   185
            case "java.lang.String":
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   186
                String[] strings = (String[]) value;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   187
                for (int i = 0; i < strings.length; i++) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   188
                    addAttribute(name  + "-" + i , strings[i]);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   189
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   190
                break;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   191
            default:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   192
                throw new InternalError("Array type of " + typeName + " is not supported");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   193
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   194
        }
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
    static final String ATTRIBUTE_ID = "id";
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   198
    static final String ATTRIBUTE_SIMPLE_TYPE = "simpleType";
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   199
    static final String ATTRIBUTE_GMT_OFFSET = "gmtOffset";
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   200
    static final String ATTRIBUTE_LOCALE = "locale";
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   201
    static final String ELEMENT_TYPE = "class";
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   202
    static final String ELEMENT_SETTING = "setting";
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   203
    static final String ELEMENT_ANNOTATION = "annotation";
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   204
    static final String ELEMENT_FIELD = "field";
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   205
    static final String ATTRIBUTE_SUPER_TYPE = "superType";
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   206
    static final String ATTRIBUTE_TYPE_ID = "class";
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   207
    static final String ATTRIBUTE_DIMENSION = "dimension";
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   208
    static final String ATTRIBUTE_NAME = "name";
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   209
    static final String ATTRIBUTE_CONSTANT_POOL = "constantPool";
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   210
    static final String ATTRIBUTE_DEFAULT_VALUE = "defaultValue";
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   211
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   212
    final List<EventType> eventTypes = new ArrayList<>();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   213
    final Collection<Type> types = new ArrayList<>();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   214
    long gmtOffset;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   215
    String locale;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   216
    Element root;
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 50113
diff changeset
   217
    public long metadataId;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   218
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   219
    // package private
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   220
    MetadataDescriptor() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   221
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   222
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   223
    private static void prettyPrintXML(Appendable sb, String indent, Element e) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   224
        sb.append(indent + "<" + e.name);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   225
        for (Attribute a : e.attributes) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   226
            sb.append(" ").append(a.name).append("=\"").append(a.value).append("\"");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   227
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   228
        if (e.elements.size() == 0) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   229
            sb.append("/");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   230
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   231
        sb.append(">\n");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   232
        for (Element child : e.elements) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   233
            prettyPrintXML(sb, indent + "  ", child);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   234
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   235
        if (e.elements.size() != 0) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   236
            sb.append(indent).append("</").append(e.name).append(">\n");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   237
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   238
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   239
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   240
    public Collection<Type> getTypes() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   241
        return types;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   242
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   243
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   244
    public List<EventType> getEventTypes() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   245
        return eventTypes;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   246
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   247
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   248
    public int getGMTOffset() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   249
        return (int) gmtOffset;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   250
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   251
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   252
    public String getLocale() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   253
        return locale;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   254
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   255
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 50113
diff changeset
   256
    public static MetadataDescriptor read(RecordingInput input) throws IOException {
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   257
        MetadataReader r = new MetadataReader(input);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   258
        return r.getDescriptor();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   259
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   260
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   261
    static void write(List<Type> types, DataOutput output) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   262
        MetadataDescriptor m = new MetadataDescriptor();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   263
        m.locale = Locale.getDefault().toString();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   264
        m.gmtOffset = TimeZone.getDefault().getRawOffset();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   265
        m.types.addAll(types);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   266
        MetadataWriter w = new MetadataWriter(m);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   267
        w.writeBinary(output);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   268
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   269
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   270
    @Override
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   271
    public String toString() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   272
        return root.toString();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   273
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   274
}