001package net.gdface.thrift; 002 003import static com.google.common.base.Preconditions.*; 004import static net.gdface.thrift.ThriftUtils.*; 005import static net.gdface.thrift.ThriftyStructMetadata.STRUCTS_CACHE; 006 007import java.util.Map; 008 009import com.facebook.swift.codec.metadata.ThriftStructMetadata; 010import com.google.common.base.Function; 011 012/** 013 * 有{@link com.facebook.swift.codec.ThriftStruct}æ³¨é‡Šçš„å¼‚å¸¸ç±»åž‹ä¹‹é—´çš„è½¬æ¢ 014 * @author guyadong 015 * 016 * @param <L> thrift 生æˆçš„client异常类型 017 * @param <R> 实现 {@link ThriftDecorator}的装饰类异常类型 018 */ 019public class Swift2ThriftyExceptionTransformer<L extends Exception,R extends ThriftDecorator<? extends Exception>> 020 implements Function<L,R>{ 021 private final ThriftStructMetadata leftMetadata; 022 private final ThriftyStructMetadata rightMetadata; 023 public Swift2ThriftyExceptionTransformer(Class<L> left, Class<R> right) { 024 checkArgument(isThriftException(left) && isThriftyException(right), 025 "left must be Exception with @com.facebook.swift.codec.ThriftStruct annotation," 026 + "right must be Exception implement com.microsoft.thrifty.Struct interface" ); 027 this.leftMetadata = CATALOG.getThriftStructMetadata(left); 028 this.rightMetadata = STRUCTS_CACHE.getUnchecked(checkNotNull(right,"right is null")); 029 } 030 @Override 031 public R apply(L input) { 032 if(null == input){ 033 return null; 034 } 035 Map<String, TypeValue> data = getFieldValues(input,leftMetadata); 036 return rightMetadata.constructStruct(data); 037 038 } 039 040 @Override 041 public String toString() { 042 StringBuilder builder = new StringBuilder() 043 .append("Swift2ThriftyExceptionTransformer [leftClass=") 044 .append(leftMetadata.getStructType()) 045 .append(", rightClass=") 046 .append(rightMetadata.getStructType()) 047 .append("]"); 048 return builder.toString(); 049 } 050}