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.protolog.tool.Constants.ENUM_VALUES_METHOD 20 import com.android.server.protolog.common.IProtoLogGroup 21 import java.io.File 22 import java.net.URLClassLoader 23 24 class ProtoLogGroupReader { 25 private fun getClassloaderForJar(jarPath: String): ClassLoader { 26 val jarFile = File(jarPath) 27 val url = jarFile.toURI().toURL() 28 return URLClassLoader(arrayOf(url), ProtoLogGroupReader::class.java.classLoader) 29 } 30 31 private fun getEnumValues(clazz: Class<*>): List<IProtoLogGroup> { 32 val valuesMethod = clazz.getMethod(ENUM_VALUES_METHOD) 33 @Suppress("UNCHECKED_CAST") 34 return (valuesMethod.invoke(null) as Array<IProtoLogGroup>).toList() 35 } 36 37 fun loadFromJar(jarPath: String, className: String): Map<String, LogGroup> { 38 try { 39 val classLoader = getClassloaderForJar(jarPath) 40 val clazz = classLoader.loadClass(className) 41 val values = getEnumValues(clazz) 42 return values.map { group -> 43 group.name() to 44 LogGroup(group.name(), group.isEnabled, group.isLogToLogcat, group.tag) 45 }.toMap() 46 } catch (ex: ReflectiveOperationException) { 47 throw RuntimeException("Unable to load ProtoLogGroup enum class", ex) 48 } 49 } 50 } 51