src/jdk.jfr/share/classes/jdk/jfr/internal/MetadataReader.java
author mgronlun
Wed, 30 Oct 2019 19:43:52 +0100
changeset 58863 c16ac7a2eba4
parent 52413 6372f5af9612
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: 52413
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 static jdk.jfr.internal.MetadataDescriptor.ATTRIBUTE_CONSTANT_POOL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    29
import static jdk.jfr.internal.MetadataDescriptor.ATTRIBUTE_DIMENSION;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    30
import static jdk.jfr.internal.MetadataDescriptor.ATTRIBUTE_ID;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    31
import static jdk.jfr.internal.MetadataDescriptor.ATTRIBUTE_NAME;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    32
import static jdk.jfr.internal.MetadataDescriptor.ATTRIBUTE_SIMPLE_TYPE;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    33
import static jdk.jfr.internal.MetadataDescriptor.ATTRIBUTE_SUPER_TYPE;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    34
import static jdk.jfr.internal.MetadataDescriptor.ATTRIBUTE_TYPE_ID;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    35
import static jdk.jfr.internal.MetadataDescriptor.ELEMENT_ANNOTATION;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    36
import static jdk.jfr.internal.MetadataDescriptor.ELEMENT_FIELD;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    37
import static jdk.jfr.internal.MetadataDescriptor.ELEMENT_SETTING;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    38
import static jdk.jfr.internal.MetadataDescriptor.ELEMENT_TYPE;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    39
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    40
import java.io.DataInput;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    41
import java.io.IOException;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    42
import java.util.ArrayList;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    43
import java.util.Collections;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    44
import java.util.HashMap;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    45
import java.util.List;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    46
import java.util.Map;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    47
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    48
import jdk.jfr.AnnotationElement;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    49
import jdk.jfr.SettingDescriptor;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    50
import jdk.jfr.ValueDescriptor;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    51
import jdk.jfr.internal.MetadataDescriptor.Element;
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52413
diff changeset
    52
import jdk.jfr.internal.consumer.RecordingInput;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52413
diff changeset
    53
import jdk.jfr.internal.consumer.StringParser;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    54
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    55
/**
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    56
 * Parses metadata.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    57
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    58
 */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    59
final class MetadataReader {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    60
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    61
    private final DataInput input;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    62
    private final List<String> pool;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    63
    private final MetadataDescriptor descriptor;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    64
    private final Map<Long, Type> types = new HashMap<>();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    65
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52413
diff changeset
    66
    public MetadataReader(RecordingInput input) throws IOException {
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    67
        this.input = input;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    68
        int size = input.readInt();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    69
        this.pool = new ArrayList<>(size);
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52413
diff changeset
    70
        StringParser p = new StringParser(null, false);
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    71
        for (int i = 0; i < size; i++) {
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52413
diff changeset
    72
            this.pool.add((String) p.parse(input));
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    73
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    74
        descriptor = new MetadataDescriptor();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    75
        Element root = createElement();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    76
        Element metadata = root.elements("metadata").get(0);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    77
        declareTypes(metadata);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    78
        defineTypes(metadata);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    79
        annotateTypes(metadata);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    80
        buildEvenTypes();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    81
        Element time = root.elements("region").get(0);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    82
        descriptor.gmtOffset = time.attribute(MetadataDescriptor.ATTRIBUTE_GMT_OFFSET, 1);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    83
        descriptor.locale = time.attribute(MetadataDescriptor.ATTRIBUTE_LOCALE, "");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    84
        descriptor.root = root;
52413
6372f5af9612 8209960: -Xlog:jfr* doesn't work with the JFR
egahlin
parents: 50113
diff changeset
    85
        if (Logger.shouldLog(LogTag.JFR_SYSTEM_PARSER, LogLevel.TRACE)) {
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    86
             List<Type> ts = new ArrayList<>(types.values());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    87
             Collections.sort(ts, (x,y) -> x.getName().compareTo(y.getName()));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    88
             for (Type t : ts) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    89
                 t.log("Found", LogTag.JFR_SYSTEM_PARSER, LogLevel.TRACE);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    90
             }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    91
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    92
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    93
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    94
    private String readString() throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    95
        return pool.get(readInt());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    96
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    97
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    98
    private int readInt() throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    99
        return input.readInt();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   100
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   101
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   102
    private Element createElement() throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   103
        String name = readString();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   104
        Element e = new Element(name);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   105
        int attributeCount = readInt();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   106
        for (int i = 0; i < attributeCount; i++) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   107
            e.addAttribute(readString(), readString());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   108
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   109
        int childrenCount = readInt();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   110
        for (int i = 0; i < childrenCount; i++) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   111
            e.add(createElement());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   112
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   113
        return e;
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
    private void annotateTypes(Element metadata) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   117
        for (Element typeElement : metadata.elements(ELEMENT_TYPE)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   118
            Type type = getType(ATTRIBUTE_ID, typeElement);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   119
            ArrayList<AnnotationElement> aes = new ArrayList<>();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   120
            for (Element annotationElement : typeElement.elements(ELEMENT_ANNOTATION)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   121
                aes.add(makeAnnotation(annotationElement));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   122
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   123
            aes.trimToSize();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   124
            type.setAnnotations(aes);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   125
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   126
            int index = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   127
            if (type instanceof PlatformEventType) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   128
                List<SettingDescriptor> settings = ((PlatformEventType) type).getAllSettings();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   129
                for (Element settingElement : typeElement.elements(ELEMENT_SETTING)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   130
                    ArrayList<AnnotationElement> annotations = new ArrayList<>();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   131
                    for (Element annotationElement : settingElement.elements(ELEMENT_ANNOTATION)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   132
                        annotations.add(makeAnnotation(annotationElement));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   133
                    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   134
                    annotations.trimToSize();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   135
                    PrivateAccess.getInstance().setAnnotations(settings.get(index), annotations);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   136
                    index++;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   137
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   138
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   139
            index = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   140
            List<ValueDescriptor> fields = type.getFields();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   141
            for (Element fieldElement : typeElement.elements(ELEMENT_FIELD)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   142
                ArrayList<AnnotationElement> annotations = new ArrayList<>();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   143
                for (Element annotationElement : fieldElement.elements(ELEMENT_ANNOTATION)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   144
                    annotations.add(makeAnnotation(annotationElement));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   145
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   146
                annotations.trimToSize();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   147
                PrivateAccess.getInstance().setAnnotations(fields.get(index), annotations);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   148
                index++;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   149
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   150
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   151
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   152
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   153
    private AnnotationElement makeAnnotation(Element annotationElement) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   154
        Type annotationType = getType(ATTRIBUTE_TYPE_ID, annotationElement);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   155
        List<Object> values = new ArrayList<>();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   156
        for (ValueDescriptor v : annotationType.getFields()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   157
            if (v.isArray()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   158
                List<Object> list = new ArrayList<>();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   159
                int index = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   160
                while (true) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   161
                    String text = annotationElement.attribute(v.getName() + "-" + index);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   162
                    if (text == null) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   163
                        break;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   164
                    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   165
                    list.add(objectify(v.getTypeName(), text));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   166
                    index++;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   167
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   168
                Object object = Utils.makePrimitiveArray(v.getTypeName(), list);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   169
                if (object == null) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   170
                    throw new IOException("Unsupported type " + list + " in array");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   171
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   172
                values.add(object);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   173
            } else {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   174
                String text = annotationElement.attribute(v.getName());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   175
                values.add(objectify(v.getTypeName(), text));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   176
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   177
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   178
        return PrivateAccess.getInstance().newAnnotation(annotationType, values, false);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   179
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   180
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   181
    private Object objectify(String typeName, String text) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   182
        try {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   183
            switch (typeName) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   184
            case "int":
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   185
                return Integer.valueOf(text);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   186
            case "long":
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   187
                return Long.valueOf(text);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   188
            case "double":
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   189
                return Double.valueOf(text);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   190
            case "float":
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   191
                return Float.valueOf(text);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   192
            case "short":
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   193
                return Short.valueOf(text);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   194
            case "char":
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   195
                if (text.length() != 1) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   196
                    throw new IOException("Unexpected size of char");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   197
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   198
                return text.charAt(0);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   199
            case "byte":
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   200
                return Byte.valueOf(text);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   201
            case "boolean":
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   202
                return Boolean.valueOf(text);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   203
            case "java.lang.String":
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   204
                return text;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   205
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   206
        } catch (IllegalArgumentException iae) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   207
            throw new IOException("Could not parse text representation of " + typeName);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   208
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   209
        throw new IOException("Unsupported type for annotation " + typeName);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   210
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   211
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   212
    private Type getType(String attribute, Element element) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   213
        long id = element.longValue(attribute);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   214
        Type type = types.get(id);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   215
        if (type == null) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   216
            String name = element.attribute("type");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   217
            throw new IllegalStateException("Type '" + id + "' is not defined for " + name);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   218
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   219
        return type;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   220
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   221
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   222
    private void buildEvenTypes() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   223
        for (Type type : descriptor.types) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   224
            if (type instanceof PlatformEventType) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   225
                descriptor.eventTypes.add(PrivateAccess.getInstance().newEventType((PlatformEventType) type));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   226
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   227
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   228
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   229
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   230
    private void defineTypes(Element metadata) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   231
        for (Element typeElement : metadata.elements(ELEMENT_TYPE)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   232
            long id = typeElement.attribute(ATTRIBUTE_ID, -1);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   233
            Type t = types.get(id);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   234
            for (Element fieldElement : typeElement.elements(ELEMENT_SETTING)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   235
                String name = fieldElement.attribute(ATTRIBUTE_NAME);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   236
                String defaultValue = fieldElement.attribute(ATTRIBUTE_NAME);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   237
                Type settingType = getType(ATTRIBUTE_TYPE_ID, fieldElement);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   238
                PlatformEventType eventType = (PlatformEventType) t;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   239
                eventType.add(PrivateAccess.getInstance().newSettingDescriptor(settingType, name, defaultValue, new ArrayList<>(2)));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   240
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   241
            for (Element fieldElement : typeElement.elements(ELEMENT_FIELD)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   242
                String name = fieldElement.attribute(ATTRIBUTE_NAME);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   243
                Type fieldType = getType(ATTRIBUTE_TYPE_ID, fieldElement);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   244
                long dimension = fieldElement.attribute(ATTRIBUTE_DIMENSION, 0);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   245
                boolean constantPool = fieldElement.attribute(ATTRIBUTE_CONSTANT_POOL) != null;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   246
                // Add annotation later, because they may refer to undefined
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   247
                // types at this stage
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   248
                t.add(PrivateAccess.getInstance().newValueDescriptor(name, fieldType, new ArrayList<>(), (int) dimension, constantPool, null));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   249
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   250
            t.trimFields();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   251
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   252
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   253
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   254
    private void declareTypes(Element metadata) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   255
        for (Element typeElement : metadata.elements(ELEMENT_TYPE)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   256
            String typeName = typeElement.attribute(ATTRIBUTE_NAME);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   257
            String superType = typeElement.attribute(ATTRIBUTE_SUPER_TYPE);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   258
            boolean simpleType = typeElement.attribute(ATTRIBUTE_SIMPLE_TYPE) != null;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   259
            long id = typeElement.attribute(ATTRIBUTE_ID, -1);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   260
            Type t;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   261
            if (Type.SUPER_TYPE_EVENT.equals(superType)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   262
                t = new PlatformEventType(typeName, id, false, false);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   263
            } else {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   264
                t = new Type(typeName, superType, id, false, simpleType);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   265
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   266
            types.put(id, t);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   267
            descriptor.types.add(t);
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
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   271
    public MetadataDescriptor getDescriptor() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   272
        return descriptor;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   273
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   274
}