public static Object getParameterStamp(Type type) { if (type instanceof Class<?>) { Class<?> clazz = (Class<?>) type; if (CommonUtils.isJavaBase(clazz) || clazz.isArray() || isStruct(clazz)) { return getJavaBaseOrArrayOrJavaBeanStamp((Class<?>) type); } else { return clazz; ParameterizedType parameterizedType = (ParameterizedType) type; Class<?> clazz = (Class<?>) parameterizedType.getRawType(); if (isStruct(clazz)) { return getJavaBaseOrArrayOrJavaBeanStamp((Class<?>) type); } else if (isMap(clazz)) { Type[] types = parameterizedType.getActualTypeArguments(); Type keyType = types[0]; Type valueType = types[1]; Object key = getParameterStamp(keyType); Object value = getParameterStamp(valueType); Map<Object, Object> map = new HashMap<Object, Object>(1); map.put(key, value); return map; } else if (isCollection(clazz)) { Type[] types = parameterizedType.getActualTypeArguments(); Type valueType = types[0]; Object e = getParameterStamp(valueType); List<Object> list = new ArrayList<Object>(1); list.add(e); return list; } else if (isHolder(clazz)) {
public void registry(Class<?> api, String objName) { cache.putIfAbsent(api.getName(), TarsHelper.getMethodInfo(api, objName)); }
public static TarsMethodInfo getMethodInfo(Class<?> api, Method method, String objectName) { if (!isServant(api) && !isCallback(api)) { return null; Annotation[][] allParameterAnnotations = method.getParameterAnnotations(); for (Type genericParameterType : genericParameterTypes) { String name = getParameterName(allParameterAnnotations[order]); if (name == null) { name = "args" + order; try { parameterInfo.setName(name); parameterInfo.setOrder(isAsync(method.getName()) ? order : order + 1); parameterInfo.setAnnotations(allParameterAnnotations[order]); if (!isCallback(allParameterAnnotations[order])) { parameterInfo.setStamp(TarsHelper.getParameterStamp(genericParameterType)); if (isRoutekey(allParameterAnnotations[order])) { methodInfo.setRouteKeyIndex(order); if (returnType != void.class) { TarsMethodParameterInfo returnInfo = new TarsMethodParameterInfo(); returnInfo.setStamp(TarsHelper.getParameterStamp(returnType)); returnInfo.setName("result"); returnInfo.setOrder(0);
protected byte[] encodeRequestParams(TarsServantRequest request, String charsetName) throws ProtocolException { TarsOutputStream os = new TarsOutputStream(0); os.setServerEncoding(charsetName); TarsMethodInfo methodInfo = request.getMethodInfo(); List<TarsMethodParameterInfo> parameterInfoList = methodInfo.getParametersList(); Object value = null; Object[] parameter = request.getMethodParameters(); for (TarsMethodParameterInfo parameterInfo : parameterInfoList) { if (TarsHelper.isContext(parameterInfo.getAnnotations()) || TarsHelper.isCallback(parameterInfo.getAnnotations())) { continue; } value = parameter[request.isAsync() ? parameterInfo.getOrder() : parameterInfo.getOrder() - 1]; if (TarsHelper.isHolder(parameterInfo.getAnnotations()) && value != null) { try { value = TarsHelper.getHolderValue(value); } catch (Exception e) { throw new ProtocolException(e); } if (value != null) { os.write(value, parameterInfo.getOrder()); } } else if (value != null) { os.write(value, parameterInfo.getOrder()); } } return os.toByteArray(); }
protected Object[] decodeCallbackArgs(byte[] data, String charset, TarsMethodInfo methodInfo) throws ProtocolException, NoSuchMethodException, Exception { TarsInputStream jis = new TarsInputStream(data); jis.setServerEncoding(charset); List<Object> list = new ArrayList<Object>(); TarsMethodParameterInfo returnInfo = methodInfo.getReturnInfo(); if (returnInfo != null && Void.TYPE != returnInfo.getType()) { list.add(jis.read(returnInfo.getStamp(), returnInfo.getOrder(), true)); } List<TarsMethodParameterInfo> parameterInfoList = methodInfo.getParametersList(); for (TarsMethodParameterInfo info : parameterInfoList) { if (TarsHelper.isContext(info.getAnnotations()) || TarsHelper.isCallback(info.getAnnotations())) { continue; } if (TarsHelper.isHolder(info.getAnnotations())) { list.add(jis.read(info.getStamp(), info.getOrder(), false)); } } return list.toArray(); }
protected byte[] encodeResult(TarsServantResponse response, String charsetName) { TarsServantRequest request = response.getRequest(); if (TarsHelper.isPing(request.getFunctionName())) { return new byte[]{}; List<TarsMethodParameterInfo> parametersList = methodInfo.getParametersList(); for (TarsMethodParameterInfo parameterInfo : parametersList) { if (TarsHelper.isHolder(parameterInfo.getAnnotations())) { value = request.getMethodParameters()[parameterInfo.getOrder() - 1]; if (value != null) { try { ajos.write(TarsHelper.getHolderValue(value), parameterInfo.getOrder()); } catch (Exception e) { System.err.println("server encodec response holder:" + value + " with ex:" + e);
return request; if (TarsHelper.isPing(request.getFunctionName())) { return request; if (TarsHelper.isHolder(parameterInfo.getAnnotations())) { String holderName = TarsHelper.getHolderName(parameterInfo.getAnnotations()); if (!StringUtils.isEmpty(holderName)) { value = new Holder<Object>(unaIn.getByClass(holderName, parameterInfo.getStamp()));
private ServantHomeSkeleton loadServant(Object bean) throws Exception { String homeName; Class<?> homeApiClazz = null; Object homeClassImpl; ServantHomeSkeleton skeleton; int maxLoadLimit = -1; ServerConfig serverCfg = ConfigurationManager.getInstance().getServerConfig(); homeName = bean.getClass().getAnnotation(TarsServant.class).name(); if (StringUtils.isEmpty(homeName)) { throw new RuntimeException("servant name is null."); } homeName = String.format("%s.%s.%s", serverCfg.getApplication(), serverCfg.getServerName(), homeName); for (Class clazz : bean.getClass().getInterfaces()) { if (clazz.isAnnotationPresent(Servant.class)) { homeApiClazz = clazz; break; } } homeClassImpl = bean; if (TarsHelper.isServant(homeApiClazz)) { String servantName = homeApiClazz != null ? homeApiClazz.getAnnotation(Servant.class).name() : null; if (!StringUtils.isEmpty(servantName) && servantName.matches("^[\\w]+\\.[\\w]+\\.[\\w]+$")) { homeName = servantName; } } skeleton = new ServantHomeSkeleton(homeName, homeClassImpl, homeApiClazz, null, null, maxLoadLimit); skeleton.setAppContext(this); ConfigurationManager.getInstance().getServerConfig().getServantAdapterConfMap().put(homeName, servantAdapterConfig); return skeleton; }
List<TarsMethodParameterInfo> parametersList = methodInfo.getParametersList(); for (TarsMethodParameterInfo parameterInfo : parametersList) { if (TarsHelper.isHolder(parameterInfo.getAnnotations())) { value = request.getMethodParameters()[parameterInfo.getOrder() - 1]; if (value != null) { try { String holderName = TarsHelper.getHolderName(parameterInfo.getAnnotations()); if (!StringUtils.isEmpty(holderName)) { unaOut.put(holderName, TarsHelper.getHolderValue(value));
Object stamp = null; try { stamp = getParameterStamp(type); } catch (Exception e) { throw new RuntimeException("class[" + clazz + "] , Field[" + field.getName() + "] create stamp failed:" + e.getMessage(), e); propertyInfo.setComment(propertyAnnotation.comment()); propertyInfo.setDefaultValue(getPropertyDefaultValue(BeanAccessor.getBeanValue(bean, field.getName())));
@Override protected byte[] encodeRequestParams(TarsServantRequest request, String charsetName) throws ProtocolException { Object[] parameter = request.getMethodParameters(); if (TarsHelper.isCallback(request.getMethodInfo().getParametersList().get(0).getAnnotations())) { return ((GeneratedMessage) parameter[1]).toByteArray(); } return ((GeneratedMessage) parameter[0]).toByteArray(); }
@Override protected byte[] encodeResult(TarsServantResponse response, String charsetName) { TarsServantRequest request = response.getRequest(); byte[] result = new byte[] {}; if (TarsHelper.isPing(request.getFunctionName())) { return result; } result = ((GeneratedMessage) response.getResult()).toByteArray(); return result; }
public static TarsMethodParameterInfo createParameterInfo(Type genericParameterType) { if (genericParameterType == null) { throw new NullPointerException("genericParameterType is null."); } TarsMethodParameterInfo parameterInfo = new TarsMethodParameterInfo(); Object stamp = getParameterStamp(genericParameterType); parameterInfo.setStamp(stamp); return parameterInfo; }
Class<?> componentType = clazz.getComponentType(); Object[] array = (Object[]) Array.newInstance(componentType, 1); Object e = getJavaBaseOrArrayOrJavaBeanStamp(componentType); array[0] = e; stamp = array;
public static TarsMethodInfo getMethodInfo(Class<?> api, Method method, String objectName) { if (!isServant(api) && !isCallback(api)) { return null; Annotation[][] allParameterAnnotations = method.getParameterAnnotations(); for (Type genericParameterType : genericParameterTypes) { String name = getParameterName(allParameterAnnotations[order]); if (name == null) { name = "args" + order; try { parameterInfo.setName(name); parameterInfo.setOrder(isAsync(method.getName()) ? order : order + 1); parameterInfo.setAnnotations(allParameterAnnotations[order]); if (!isCallback(allParameterAnnotations[order])) { parameterInfo.setStamp(TarsHelper.getParameterStamp(genericParameterType)); if (isRoutekey(allParameterAnnotations[order])) { methodInfo.setRouteKeyIndex(order); if (returnType != void.class) { TarsMethodParameterInfo returnInfo = new TarsMethodParameterInfo(); returnInfo.setStamp(TarsHelper.getParameterStamp(returnType)); returnInfo.setName("result"); returnInfo.setOrder(0);
protected byte[] encodeRequestParams(TarsServantRequest request, String charsetName) throws ProtocolException { TarsOutputStream os = new TarsOutputStream(0); os.setServerEncoding(charsetName); TarsMethodInfo methodInfo = request.getMethodInfo(); List<TarsMethodParameterInfo> parameterInfoList = methodInfo.getParametersList(); Object value = null; Object[] parameter = request.getMethodParameters(); for (TarsMethodParameterInfo parameterInfo : parameterInfoList) { if (TarsHelper.isContext(parameterInfo.getAnnotations()) || TarsHelper.isCallback(parameterInfo.getAnnotations())) { continue; } value = parameter[request.isAsync() ? parameterInfo.getOrder() : parameterInfo.getOrder() - 1]; if (TarsHelper.isHolder(parameterInfo.getAnnotations()) && value != null) { try { value = TarsHelper.getHolderValue(value); } catch (Exception e) { throw new ProtocolException(e); } if (value != null) { os.write(value, parameterInfo.getOrder()); } } else if (value != null) { os.write(value, parameterInfo.getOrder()); } } return os.toByteArray(); }
protected Object[] decodeCallbackArgs(byte[] data, String charset, TarsMethodInfo methodInfo) throws ProtocolException, NoSuchMethodException, Exception { TarsInputStream jis = new TarsInputStream(data); jis.setServerEncoding(charset); List<Object> list = new ArrayList<Object>(); TarsMethodParameterInfo returnInfo = methodInfo.getReturnInfo(); if (returnInfo != null && Void.TYPE != returnInfo.getType()) { list.add(jis.read(returnInfo.getStamp(), returnInfo.getOrder(), true)); } List<TarsMethodParameterInfo> parameterInfoList = methodInfo.getParametersList(); for (TarsMethodParameterInfo info : parameterInfoList) { if (TarsHelper.isContext(info.getAnnotations()) || TarsHelper.isCallback(info.getAnnotations())) { continue; } if (TarsHelper.isHolder(info.getAnnotations())) { list.add(jis.read(info.getStamp(), info.getOrder(), false)); } } return list.toArray(); }
protected byte[] encodeResult(TarsServantResponse response, String charsetName) { TarsServantRequest request = response.getRequest(); if (TarsHelper.isPing(request.getFunctionName())) { return new byte[]{}; List<TarsMethodParameterInfo> parametersList = methodInfo.getParametersList(); for (TarsMethodParameterInfo parameterInfo : parametersList) { if (TarsHelper.isHolder(parameterInfo.getAnnotations())) { value = request.getMethodParameters()[parameterInfo.getOrder() - 1]; if (value != null) { try { ajos.write(TarsHelper.getHolderValue(value), parameterInfo.getOrder()); } catch (Exception e) { System.err.println("server encodec response holder:" + value + " with ex:" + e);
return request; if (TarsHelper.isPing(request.getFunctionName())) { return request; if (TarsHelper.isHolder(parameterInfo.getAnnotations())) { String holderName = TarsHelper.getHolderName(parameterInfo.getAnnotations()); if (!StringUtils.isEmpty(holderName)) { value = new Holder<Object>(unaIn.getByClass(holderName, parameterInfo.getStamp()));
if (TarsHelper.isServant(homeApiClazz)) { String servantName = homeApiClazz.getAnnotation(Servant.class).name(); if (!StringUtils.isEmpty(servantName) && servantName.matches("^[\\w]+\\.[\\w]+\\.[\\w]+$")) {