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