/* * Copyright 2016 NAVER Corp. * * 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.navercorp.pinpoint.test; import com.navercorp.pinpoint.common.util.ArrayUtils; import com.navercorp.pinpoint.common.util.StringUtils; import java.lang.reflect.Constructor; /** * test only * @author Woonduk Kang(emeroad) */ final class MethodDescriptionUtils { private final static String EMPTY_ARRAY = "()"; private MethodDescriptionUtils() { } public static String toJavaMethodDescriptor(String className, String methodName, String[] parameterType) { if (className == null) { throw new NullPointerException("className must not be null"); } if (methodName == null) { throw new NullPointerException("methodName must not be null"); } StringBuilder buffer = new StringBuilder(256); buffer.append(className); buffer.append('.'); buffer.append(methodName); appendParameter(buffer, parameterType); return buffer.toString(); } /** * remove parameter variableName * @return */ public static String toJavaMethodDescriptor(String apiMetaDataDescriptor) { if (apiMetaDataDescriptor == null) { return ""; } final int methodDescBegin = apiMetaDataDescriptor.indexOf('('); if (methodDescBegin == -1) { throw new IllegalArgumentException("invalid api descriptor=" + apiMetaDataDescriptor); } final int methodDescEnd = apiMetaDataDescriptor.indexOf(')', methodDescBegin); if (methodDescEnd == -1) { throw new IllegalArgumentException("invalid api descriptor=" + apiMetaDataDescriptor); } final int classNameEnd = apiMetaDataDescriptor.lastIndexOf('.', methodDescBegin); if (classNameEnd == -1) { throw new IllegalArgumentException("invalid api descriptor=" + apiMetaDataDescriptor); } final String className = apiMetaDataDescriptor.substring(0, classNameEnd); final String methodName = apiMetaDataDescriptor.substring(classNameEnd + 1, methodDescBegin); final String methodDesc = apiMetaDataDescriptor.substring(methodDescBegin + 1, methodDescEnd); final String[] parameterTypes = methodDesc.split(","); for (int i = 0; i < parameterTypes.length; i++) { final String parameterType = parameterTypes[i]; parameterTypes[i] = extractParameterClass(parameterType); } return toJavaMethodDescriptor(className, methodName, parameterTypes); } private static void appendParameter(StringBuilder buffer, String[] parameterType) { if (ArrayUtils.isEmpty(parameterType)) { buffer.append(EMPTY_ARRAY); } else { buffer.append('('); int end = parameterType.length - 1; for (int i = 0; i < parameterType.length; i++) { buffer.append(parameterType[i]); if (i < end) { buffer.append(", "); } } buffer.append(')'); } } private static String extractParameterClass(String parameterType) { parameterType = safeTrim(parameterType); final int classEndIndex = parameterType.indexOf(' '); if (classEndIndex != -1) { return parameterType.substring(0, classEndIndex); } return parameterType; } private static String safeTrim(String parameterType) { if (StringUtils.isEmpty(parameterType)) { return parameterType; } return parameterType.trim(); } public static String getConstructorSimpleName(Constructor<?> constructor) { final String name = constructor.getName(); return getConstructorSimpleName(name); } static String getConstructorSimpleName(String name) { final int startIndex = name.lastIndexOf('.'); if (startIndex == -1) { return name; } else { return name.substring(startIndex + 1, name.length()); } } }