blob: fc23dac608c49f02eea4a1e0d9676487ec5e6811 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.dubbo.erlang.analysis.parse;
import org.objectweb.asm.Type;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.*;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.jar.JarInputStream;
public class ParseJarInterfaceInfo {
private final static Logger logger = LoggerFactory.getLogger(ParseJarInterfaceInfo.class);
static final String CLAZZ = ".class";
public List<InterfaceInfo> parseJar(String jarfile) {
List<InterfaceInfo> list_interfaces = getInterfaceList(jarfile);
JarFile jarFile = null;
InputStream inputInteface = null;
try {
jarFile = new JarFile(jarfile);
String interfacePathName;
for (InterfaceInfo interfaceItem : list_interfaces) {
}
} catch (IOException e) {
logger.debug("parse:", e);
} finally {
if (jarFile != null) {
try {
jarFile.close();
} catch (IOException e) {
logger.error("", e);
}
}
if (inputInteface != null)
try {
inputInteface.close();
} catch (IOException e) {
logger.error("", e);
}
}
// parseArgs(jarfile);
return list_interfaces;
}
private List<InterfaceInfo> getInterfaceList(String jarfilePath) {
JarInputStream jarFile = null;
JarEntry jarEntry;
String name;
List<InterfaceInfo> list_interfaces = new ArrayList<InterfaceInfo>();
try {
jarFile = new JarInputStream(new FileInputStream(jarfilePath));
jarEntry = jarFile.getNextJarEntry();
while (jarEntry != null) {
name = jarEntry.getName();
if (name.endsWith(CLAZZ)) {
logger.debug(name);
if (name.indexOf("WEB-INF/classes/") > -1)
name = name.substring(16, name.length());
name = name.replace("/", ".").substring(0, name.length() - 6);
logger.debug("get interfaceName {}", name);
Class tmpClass = Class.forName(name, false, Thread.currentThread().getContextClassLoader());
if (tmpClass.isInterface()) {
InterfaceInfo newInterface = new InterfaceInfo();
newInterface.setInterfaceName(name);
parseClassMethods(tmpClass, newInterface);
list_interfaces.add(newInterface);
}
}
jarEntry = jarFile.getNextJarEntry();
}
} catch (IOException e) {
logger.error("", e);
} catch (Exception e) {
logger.error("", e);
} finally {
if (jarFile != null) {
try {
jarFile.close();
} catch (IOException e) {
logger.error("", e);
}
}
}
return list_interfaces;
}
private void parseClassMethods(Class classObj, InterfaceInfo interfaceInfo) {
Method[] methodsList = classObj.getDeclaredMethods();
for (int i = 0; i < methodsList.length; i++) {
Method method = methodsList[i];
MethodInfo methodInfo = new MethodInfo();
methodInfo.setName(method.getName());
String methodDescriptor = Type.getMethodDescriptor(method);
methodInfo.setMethodDescriptor(methodDescriptor);
int tmpIndex = methodDescriptor.indexOf(")");
String argsDescriptor = methodDescriptor.substring(1, tmpIndex);
String returnDescriptor = methodDescriptor.substring(tmpIndex);
methodInfo.setArgsType(argsDescriptor);
methodInfo.setReturnType(returnDescriptor);
methodInfo.setArgsLength(Type.getArgumentTypes(method).length);
Parameter[] parameters = method.getParameters();
String[] paramterNames = new String[parameters.length];
for (int index = 0; index < parameters.length; index++) {
paramterNames[index] = parameters[index].getName();
}
methodInfo.setParameterName(paramterNames);
// 通过asm获取存在为null的情况。
// try {
// String[] paramterNames = MethodParseUtil.getMethodParamNames(method);
// methodInfo.setParameterName(paramterNames);
// } catch (IOException e) {
// logger.warn("无法获取参数名称",e);
// Parameter[] parameters = method.getParameters();
// String[] paramterNames=new String[parameters.length];
// for(int index=0;index<parameters.length;index++){
// paramterNames[i]=parameters[i].getName();
// }
// methodInfo.setParameterName(paramterNames);
// }
interfaceInfo.addMethods(methodInfo);
checkCommonType(Type.getArgumentTypes(method));
checkCommonType(Type.getReturnType(method));
}
}
private void checkCommonType(Type[] types) {
for (int i = 0; i < types.length; i++) {
checkCommonType(types[i]);
}
}
private void checkCommonType(Type type) {
CommonTypeInfo.add(type.getClassName());
// switch (type.getSort()){
// case Type.ARRAY:
//
// break;
// case Type.OBJECT:
// type.getClassName();
// if(!type.getClassName().startsWith("java.lang")){
// CommonTypeInfo.add(type.getClassName());
// }
// break;
// default:
// }
}
// private String[] generalMethodId(Method method, ClassUtils utils, String classPath){
// String[] pathOfMethods = utils.getPathOfMethod(method);
// String requestType = utils.getRequestType(method);
// List<String> annotationParameters = utils.getAnnotationParameters(method,false);
// String[] methodIds = new String[pathOfMethods.length];
// int count = 0;
// for(String pathOfMethod:pathOfMethods){
// String urlPath = utils.getUrlPath(annotationParameters, classPath, pathOfMethod);
// if(urlPath.indexOf("/{")>0)
// urlPath = urlPath.replace("/{","/${");
// if(urlPath.indexOf("={")>0)
// urlPath = urlPath.replace("={","=${");
// String methodId = requestType+"#"+urlPath;
// methodIds[count++]=methodId;
// }
//
// return methodIds;
// }
private String formatData(List<String> list, String prefix, String suffix, boolean isJsonFormat) {
StringBuilder jsonSb = new StringBuilder(prefix);
for (String key : list) {
if (jsonSb.length() > 1)
jsonSb.append(",");
if (isJsonFormat)
jsonSb.append("\"" + key + "\":" + ",\"\"");
else
jsonSb.append(key);
}
jsonSb.append(suffix);
if (jsonSb.length() < 2)
jsonSb.delete(0, jsonSb.length());
return jsonSb.toString();
}
}