/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.protolog.tool import com.android.json.stream.JsonReader open class ViewerConfigParser { data class MessageEntry( val messageString: String, val level: String, val groupName: String ) fun parseMessage(jsonReader: JsonReader): MessageEntry { jsonReader.beginObject() var message: String? = null var level: String? = null var groupName: String? = null while (jsonReader.hasNext()) { when (jsonReader.nextName()) { "message" -> message = jsonReader.nextString() "level" -> level = jsonReader.nextString() "group" -> groupName = jsonReader.nextString() else -> jsonReader.skipValue() } } jsonReader.endObject() if (message.isNullOrBlank() || level.isNullOrBlank() || groupName.isNullOrBlank()) { throw InvalidViewerConfigException("Invalid message entry in viewer config") } return MessageEntry(message, level, groupName) } data class GroupEntry(val tag: String) fun parseGroup(jsonReader: JsonReader): GroupEntry { jsonReader.beginObject() var tag: String? = null while (jsonReader.hasNext()) { when (jsonReader.nextName()) { "tag" -> tag = jsonReader.nextString() else -> jsonReader.skipValue() } } jsonReader.endObject() if (tag.isNullOrBlank()) { throw InvalidViewerConfigException("Invalid group entry in viewer config") } return GroupEntry(tag) } fun parseMessages(jsonReader: JsonReader): Map { val config: MutableMap = mutableMapOf() jsonReader.beginObject() while (jsonReader.hasNext()) { val key = jsonReader.nextName() val hash = key.toIntOrNull() ?: throw InvalidViewerConfigException("Invalid key in messages viewer config") config[hash] = parseMessage(jsonReader) } jsonReader.endObject() return config } fun parseGroups(jsonReader: JsonReader): Map { val config: MutableMap = mutableMapOf() jsonReader.beginObject() while (jsonReader.hasNext()) { val key = jsonReader.nextName() config[key] = parseGroup(jsonReader) } jsonReader.endObject() return config } data class ConfigEntry(val messageString: String, val level: String, val tag: String) open fun parseConfig(jsonReader: JsonReader): Map { var messages: Map? = null var groups: Map? = null var version: String? = null jsonReader.beginObject() while (jsonReader.hasNext()) { when (jsonReader.nextName()) { "messages" -> messages = parseMessages(jsonReader) "groups" -> groups = parseGroups(jsonReader) "version" -> version = jsonReader.nextString() else -> jsonReader.skipValue() } } jsonReader.endObject() if (messages == null || groups == null || version == null) { throw InvalidViewerConfigException("Invalid config - definitions missing") } if (version != Constants.VERSION) { throw InvalidViewerConfigException("Viewer config version not supported by this tool," + " config version $version, viewer version ${Constants.VERSION}") } return messages.map { msg -> msg.key to ConfigEntry( msg.value.messageString, msg.value.level, groups[msg.value.groupName]?.tag ?: throw InvalidViewerConfigException( "Group definition missing for ${msg.value.groupName}")) }.toMap() } }