test/jdk/jdk/jfr/event/metadata/TestEventMetadata.java
author egahlin
Tue, 15 May 2018 20:24:34 +0200
changeset 50113 caf115bb98ad
child 51214 67736b4846a0
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) 2013, 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.event.metadata;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    27
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    28
import java.util.HashSet;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    29
import java.util.List;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    30
import java.util.Set;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    31
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    32
import jdk.jfr.EventType;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    33
import jdk.jfr.FlightRecorder;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    34
import jdk.jfr.ValueDescriptor;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    35
import jdk.test.lib.Asserts;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    36
import jdk.test.lib.jfr.EventNames;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    37
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    38
/*
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    39
 * @test
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    40
 * @key jfr
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    41
 * @library /test/lib
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    42
 * @run main/othervm jdk.jfr.event.metadata.TestEventMetadata
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    43
 */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    44
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    45
public class TestEventMetadata {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    46
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    47
    /*
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    48
     * Short guide to writing event metadata
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    49
     * =====================================
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    50
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    51
     * Name
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
     * Symbolic name that is used to identify an event, or a field. Referred to
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    55
     * as "id" and "field" in trace.xml-files and @Name in the Java API. If it is
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    56
     * the name of an event, the name should be prefixed "jdk.", which
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    57
     * happens automatically for native events.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    58
     *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    59
     * The name should be short, but not so brief that collision is likely with
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    60
     * future events or fields. It should only consist of letters and numbers.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    61
     * Use Java naming convention , i.e. "FileRead" for an event and
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    62
     * "allocationRate" for a field. Do not use "_" and don't add the word
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    63
     * "Event" to the event name.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    64
     *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    65
     * Abbreviations should be avoided, but may be acceptable if the name
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    66
     * becomes long, or if it is a well established acronym. Write whole words,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    67
     * i.e. "allocation" instead of "alloc". The name should not be a reserved
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    68
     * Java keyword, i.e "void" or "class".
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    69
     *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    70
     * Label
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    71
     * -----
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    72
     *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    73
     * Describes a human-readable name, typically 1-3 words. Use headline-style
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    74
     * capitalization, capitalize the first and last words, and all nouns,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    75
     * pronouns, adjectives, verbs and adverbs. Do not include ending
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    76
     * punctuation.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    77
     *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    78
     * Description
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    79
     * -----------
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    80
     *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    81
     * Describes an event with a sentence or two. It's better to omit the
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    82
     * description then copying the label. Use sentence-style
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    83
     * capitalization, capitalize the first letter of the first word, and any
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    84
     * proper names such as the word Java. If the description is one sentence,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    85
     * period should not be included.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    86
     *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    87
     *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    88
     * Do not forget to set proper units for fields, i.e "NANOS", "MILLS",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    89
     * "TICKSPAN" ,"BYETS", "PECENTAGE" etc. in native and @Timespan, @Timespan
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    90
     * etc. in Java.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    91
     */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    92
    public static void main(String[] args) throws Exception {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    93
        Set<String> types = new HashSet<>();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    94
        List<EventType> eventTypes = FlightRecorder.getFlightRecorder().getEventTypes();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    95
        Set<String> eventNames= new HashSet<>();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    96
        for (EventType eventType : eventTypes) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    97
            verifyEventType(eventType);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    98
            verifyValueDesscriptors(eventType.getFields(), types);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    99
            System.out.println();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   100
            String eventName = eventType.getName();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   101
            if (eventNames.contains(eventName)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   102
                throw new Exception("Event with name " +eventName+ " already exists");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   103
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   104
            eventNames.add(eventName);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   105
            Set<String> fieldNames = new HashSet<>();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   106
            for (ValueDescriptor v : eventType.getFields()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   107
                String fieldName = v.getName();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   108
                if (fieldNames.contains(fieldName)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   109
                    throw new Exception("Field with name " + fieldName +" is already in use in event name " +eventName);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   110
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   111
                fieldNames.add(fieldName);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   112
            }
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
    private static void verifyValueDesscriptors(List<ValueDescriptor> fields, Set<String> visitedTypes) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   117
        for (ValueDescriptor v : fields) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   118
            if (!visitedTypes.contains(v.getTypeName())) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   119
                visitedTypes.add(v.getTypeName());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   120
                verifyValueDesscriptors(v.getFields(), visitedTypes);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   121
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   122
            verifyValueDescriptor(v);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   123
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   124
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   125
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   126
    private static void verifyValueDescriptor(ValueDescriptor v) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   127
        verifyName(v.getName());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   128
        verifyLabel(v.getLabel());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   129
        verifyDescription(v.getDescription());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   130
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   131
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   132
    private static void verifyDescription(String description) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   133
        if (description == null) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   134
            return;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   135
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   136
        Asserts.assertTrue(description.length() > 10, "Description must be at least ten characters");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   137
        Asserts.assertTrue(description.length() < 300, "Description should not exceed 300 characters. Found " + description);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   138
        Asserts.assertTrue(description.length() == description.trim().length(), "Description should not have trim character at start or end");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   139
        Asserts.assertFalse(description.endsWith(".") && description.indexOf(".") == description.length() - 1, "Single sentence descriptions should not use end punctuation");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   140
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   141
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   142
    private static void verifyName(String name) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   143
        System.out.println("Verifying name: " + name);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   144
        Asserts.assertNotEquals(name, null, "Name not allowed to be null");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   145
        Asserts.assertTrue(name.length() > 1, "Name must be at least two characters");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   146
        Asserts.assertTrue(name.length() < 32, "Name should not exceed 32 characters");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   147
        Asserts.assertFalse(isReservedKeyword(name),"Name must not be reserved keyword in the Java language (" + name + ")");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   148
        char firstChar = name.charAt(0);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   149
        Asserts.assertTrue(Character.isAlphabetic(firstChar), "Name must start with a character");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   150
        Asserts.assertTrue(Character.isLowerCase(firstChar), "Name must start with lower case letter");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   151
        Asserts.assertTrue(Character.isJavaIdentifierStart(firstChar), "Not valid first character for Java identifier");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   152
        for (int i = 1; i < name.length(); i++) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   153
            Asserts.assertTrue(Character.isJavaIdentifierPart(name.charAt(i)), "Not valid character for a Java identifier");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   154
            Asserts.assertTrue(Character.isAlphabetic(name.charAt(i)), "Name must consists of characters, found '" + name.charAt(i) + "'");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   155
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   156
        Asserts.assertFalse(name.contains("ID"), "'ID' should not be used in name, consider using 'Id'");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   157
        checkCommonAbbreviations(name);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   158
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   159
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   160
    private static void verifyLabel(String label) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   161
        Asserts.assertNotEquals(label, null, "Label not allowed to be null");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   162
        Asserts.assertTrue(label.length() > 1, "Name must be at least two characters");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   163
        Asserts.assertTrue(label.length() < 45, "Label should not exceed 45 characters, use description to explain " + label);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   164
        Asserts.assertTrue(label.length() == label.trim().length(), "Label should not have trim character at start and end");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   165
        Asserts.assertTrue(Character.isUpperCase(label.charAt(0)), "Label should start with upper case letter");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   166
        for (int i = 0; i < label.length(); i++) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   167
            char c = label.charAt(i);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   168
            Asserts.assertTrue(Character.isDigit(c) || Character.isAlphabetic(label.charAt(i)) || c == ' ' || c == '(' || c == ')' || c == '-', "Label should only consist of letters or space, found '" + label.charAt(i)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   169
                    + "'");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   170
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   171
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   172
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   173
    private static void verifyEventType(EventType eventType) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   174
        System.out.println("Verifying event: " + eventType.getName());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   175
        verifyDescription(eventType.getDescription());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   176
        verifyLabel(eventType.getLabel());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   177
        Asserts.assertNotEquals(eventType.getName(), null, "Name not allowed to be null");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   178
        Asserts.assertTrue(eventType.getName().startsWith(EventNames.PREFIX), "OpenJDK events must start with " + EventNames.PREFIX);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   179
        String name = eventType.getName().substring(EventNames.PREFIX.length());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   180
        Asserts.assertFalse(isReservedKeyword(name),"Name must not be reserved keyword in the Java language (" + name + ")");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   181
        checkCommonAbbreviations(name);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   182
          char firstChar = name.charAt(0);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   183
        Asserts.assertFalse(name.contains("ID"), "'ID' should not be used in name, consider using 'Id'");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   184
        Asserts.assertTrue(Character.isAlphabetic(firstChar), "Name " + name + " must start with a character");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   185
        Asserts.assertTrue(Character.isUpperCase(firstChar), "Name " + name + " must start with upper case letter");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   186
        for (int i = 0; i < name.length(); i++) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   187
            char c = name.charAt(i);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   188
            Asserts.assertTrue(Character.isAlphabetic(c) || Character.isDigit(c), "Name " + name + " must consists of characters or numbers, found '" + name.charAt(i) + "'");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   189
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   190
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   191
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   192
    static boolean isReservedKeyword(String s) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   193
        String[] keywords = new String[] {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   194
                // "module", "requires", "exports", "to", "uses", "provides", "with", module-info.java
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   195
                "abstract", "assert", "boolean", "break", "byte", "case", "catch", "char", "class", "const", "continue", "default", "do", "double", "else", "enum",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   196
                "extends", "false", "final", "finally", "float", "for", "goto", "if", "implements", "import", "instanceof", "int", "interface", "long", "native", "new", "null", "package", "private",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   197
                "protected", "public", "return", "short", "static", "strictfp", "super", "switch", "synchronized", "this", "throw", "throws", "transient", "true", "try", "void", "volatile", "while" };
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   198
        for (int i = 0; i < keywords.length; i++) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   199
            if (s.equals(keywords[i])) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   200
                return true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   201
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   202
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   203
        return false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   204
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   205
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   206
    private static void checkCommonAbbreviations(String name) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   207
        String lowerCased = name.toLowerCase();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   208
        Asserts.assertFalse(lowerCased.contains("info") && !lowerCased.contains("information"), "Use 'information' instead 'info' in name");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   209
        Asserts.assertFalse(lowerCased.contains("alloc") && !lowerCased.contains("alloca"), "Use 'allocation' instead 'alloc' in name");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   210
        Asserts.assertFalse(lowerCased.contains("config") && !lowerCased.contains("configuration"), "Use 'configuration' instead of 'config' in name");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   211
        Asserts.assertFalse(lowerCased.contains("evac") && !lowerCased.contains("evacu"), "Use 'evacuation' instead of 'evac' in name");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   212
        Asserts.assertFalse(lowerCased.contains("stat") && !(lowerCased.contains("state") ||lowerCased.contains("statistic")) , "Use 'statistics' instead of 'stat' in name");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   213
        Asserts.assertFalse(name.contains("ID") , "Use 'id' or 'Id' instead of 'ID' in name");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   214
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   215
}