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}