1 /*
<lambda>null2  * Copyright (C) 2019 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.protolog.tool
18 
19 import com.android.json.stream.JsonReader
20 
21 open class ViewerConfigParser {
22     data class MessageEntry(
23         val messageString: String,
24         val level: String,
25         val groupName: String
26     )
27 
28     fun parseMessage(jsonReader: JsonReader): MessageEntry {
29         jsonReader.beginObject()
30         var message: String? = null
31         var level: String? = null
32         var groupName: String? = null
33         while (jsonReader.hasNext()) {
34             when (jsonReader.nextName()) {
35                 "message" -> message = jsonReader.nextString()
36                 "level" -> level = jsonReader.nextString()
37                 "group" -> groupName = jsonReader.nextString()
38                 else -> jsonReader.skipValue()
39             }
40         }
41         jsonReader.endObject()
42         if (message.isNullOrBlank() || level.isNullOrBlank() || groupName.isNullOrBlank()) {
43             throw InvalidViewerConfigException("Invalid message entry in viewer config")
44         }
45         return MessageEntry(message, level, groupName)
46     }
47 
48     data class GroupEntry(val tag: String)
49 
50     fun parseGroup(jsonReader: JsonReader): GroupEntry {
51         jsonReader.beginObject()
52         var tag: String? = null
53         while (jsonReader.hasNext()) {
54             when (jsonReader.nextName()) {
55                 "tag" -> tag = jsonReader.nextString()
56                 else -> jsonReader.skipValue()
57             }
58         }
59         jsonReader.endObject()
60         if (tag.isNullOrBlank()) {
61             throw InvalidViewerConfigException("Invalid group entry in viewer config")
62         }
63         return GroupEntry(tag)
64     }
65 
66     fun parseMessages(jsonReader: JsonReader): Map<Int, MessageEntry> {
67         val config: MutableMap<Int, MessageEntry> = mutableMapOf()
68         jsonReader.beginObject()
69         while (jsonReader.hasNext()) {
70             val key = jsonReader.nextName()
71             val hash = key.toIntOrNull()
72                     ?: throw InvalidViewerConfigException("Invalid key in messages viewer config")
73             config[hash] = parseMessage(jsonReader)
74         }
75         jsonReader.endObject()
76         return config
77     }
78 
79     fun parseGroups(jsonReader: JsonReader): Map<String, GroupEntry> {
80         val config: MutableMap<String, GroupEntry> = mutableMapOf()
81         jsonReader.beginObject()
82         while (jsonReader.hasNext()) {
83             val key = jsonReader.nextName()
84             config[key] = parseGroup(jsonReader)
85         }
86         jsonReader.endObject()
87         return config
88     }
89 
90     data class ConfigEntry(val messageString: String, val level: String, val tag: String)
91 
92     open fun parseConfig(jsonReader: JsonReader): Map<Int, ConfigEntry> {
93         var messages: Map<Int, MessageEntry>? = null
94         var groups: Map<String, GroupEntry>? = null
95         var version: String? = null
96 
97         jsonReader.beginObject()
98         while (jsonReader.hasNext()) {
99             when (jsonReader.nextName()) {
100                 "messages" -> messages = parseMessages(jsonReader)
101                 "groups" -> groups = parseGroups(jsonReader)
102                 "version" -> version = jsonReader.nextString()
103 
104                 else -> jsonReader.skipValue()
105             }
106         }
107         jsonReader.endObject()
108         if (messages == null || groups == null || version == null) {
109             throw InvalidViewerConfigException("Invalid config - definitions missing")
110         }
111         if (version != Constants.VERSION) {
112             throw InvalidViewerConfigException("Viewer config version not supported by this tool," +
113                     " config version $version, viewer version ${Constants.VERSION}")
114         }
115         return messages.map { msg ->
116             msg.key to ConfigEntry(
117                     msg.value.messageString, msg.value.level, groups[msg.value.groupName]?.tag
118                     ?: throw InvalidViewerConfigException(
119                             "Group definition missing for ${msg.value.groupName}"))
120         }.toMap()
121     }
122 }
123