package com.dianping.pigeon.util; import com.dianping.pigeon.log.LoggerLoader; import com.facebook.swift.codec.metadata.ReflectionHelper; import com.facebook.swift.service.ThriftService; import com.dianping.pigeon.log.Logger; import java.util.HashSet; import java.util.Set; /** * @author qi.yin * 2016/05/16 下午3:12. */ public class ThriftUtils { private static final Logger logger = LoggerLoader.getLogger(ThriftUtils.class); public static boolean isSupportedThrift(Class<?> clazz) { return (isAnnotation(clazz) || isIDL(clazz)); } public static boolean isAnnotation(Class<?> clazz) { Set<ThriftService> serviceAnnotations = ReflectionHelper .getEffectiveClassAnnotations( clazz, ThriftService.class); if (serviceAnnotations.size() == 1) { return true; } else if (serviceAnnotations.size() > 1) { logger.error("Service class" + clazz.getName() + "has multiple conflicting @ThriftService annotations:" + serviceAnnotations); } return false; } public static boolean isIDL(Class<?> clazz) { String name = clazz.getName(); int index = name.indexOf("$"); String clazzType; if (index < 0) { return false; } clazzType = name.substring(0, index); Class<?> claz = null; try { claz = ClassUtils.loadClass(clazzType); } catch (ClassNotFoundException e) { return false; } Class<?>[] classes = claz.getClasses(); Set<String> classNames = new HashSet<String>(); for (Class c : classes) { classNames.add(c.getSimpleName()); } if (classNames.contains("Iface") && classNames.contains("AsyncIface") && classNames.contains("Client") && classNames.contains("AsyncClient") && classNames.contains("Processor")) { return true; } return false; } public static String generateSetMethodName(String fieldName) { return new StringBuilder(16) .append("set") .append(Character.toUpperCase(fieldName.charAt(0))) .append(fieldName.substring(1)) .toString(); } public static String generateGetMethodName(String fieldName) { return new StringBuffer(16) .append("get") .append(Character.toUpperCase(fieldName.charAt(0))) .append(fieldName.substring(1)) .toString(); } public static String generateBoolMethodName(String fieldName) { return new StringBuffer(16) .append("is") .append(Character.toUpperCase(fieldName.charAt(0))) .append(fieldName.substring(1)) .toString(); } public static String generateMethodArgsClassName(String serviceName, String methodName) { int index = serviceName.indexOf("$"); if (index > 0) { return new StringBuilder(32) .append(serviceName.substring(0, index + 1)) .append(methodName) .append("_args") .toString(); } return null; } public static String generateMethodResultClassName(String serviceName, String methodName) { int index = serviceName.indexOf("$"); if (index > 0) { return new StringBuilder(32) .append(serviceName.substring(0, index + 1)) .append(methodName) .append("_result") .toString(); } return null; } }