Example usage for org.apache.thrift.meta_data FieldMetaData getStructMetaDataMap

List of usage examples for org.apache.thrift.meta_data FieldMetaData getStructMetaDataMap

Introduction

In this page you can find the example usage for org.apache.thrift.meta_data FieldMetaData getStructMetaDataMap.

Prototype

public static synchronized Hashtable getStructMetaDataMap(Class sClass) 

Source Link

Document

Returns a map with metadata (i.e.

Usage

From source file:cereal.impl.ThriftStructMapping.java

License:Apache License

@Override
public List<Field> getFields(E obj) {
    checkNotNull(obj, "The struct was null");

    List<Field> fields;
    try {/*from   w ww. java2  s  .  co  m*/
        @SuppressWarnings("rawtypes")
        Class<? extends TBase> tbaseClz = obj.getClass();
        if (null == getFieldValue) {
            synchronized (this) {
                if (null == getFieldValue) {
                    Class<?> fieldsClz = Class.forName(obj.getClass().getName() + "$_Fields");
                    getFieldValue = tbaseClz.getMethod("getFieldValue", fieldsClz);
                    isSet = tbaseClz.getMethod("isSet", fieldsClz);
                }
            }
        }

        Map<? extends TFieldIdEnum, FieldMetaData> thriftFields = FieldMetaData.getStructMetaDataMap(tbaseClz);
        fields = new ArrayList<>();

        for (Entry<? extends TFieldIdEnum, FieldMetaData> entry : thriftFields.entrySet()) {
            TFieldIdEnum field = entry.getKey();
            FieldMetaData fMetaData = entry.getValue();
            if ((boolean) isSet.invoke(obj, field)) {
                Object value = getFieldValue.invoke(obj, field);
                FieldValueMetaData fvMetaData = fMetaData.valueMetaData;
                switch (fvMetaData.type) {
                case TType.BOOL:
                    Boolean booleanVal = (Boolean) value;
                    fields.add(new FieldImpl(text(fMetaData.fieldName), getGrouping(fMetaData),
                            getVisibility(fMetaData), value(booleanVal.toString())));
                    break;
                case TType.BYTE:
                    Byte byteVal = (Byte) value;
                    fields.add(new FieldImpl(text(fMetaData.fieldName), getGrouping(fMetaData),
                            getVisibility(fMetaData), value(byteVal.toString())));
                    break;
                case TType.DOUBLE:
                    Double dblVal = (Double) value;
                    fields.add(new FieldImpl(text(fMetaData.fieldName), getGrouping(fMetaData),
                            getVisibility(fMetaData), value(dblVal.toString())));
                    break;
                case TType.I16:
                    Short shortVal = (Short) value;
                    fields.add(new FieldImpl(text(fMetaData.fieldName), getGrouping(fMetaData),
                            getVisibility(fMetaData), value(shortVal.toString())));
                    break;
                case TType.I32:
                    Integer intVal = (Integer) value;
                    fields.add(new FieldImpl(text(fMetaData.fieldName), getGrouping(fMetaData),
                            getVisibility(fMetaData), value(intVal.toString())));
                    break;
                case TType.I64:
                    Long longVal = (Long) value;
                    fields.add(new FieldImpl(text(fMetaData.fieldName), getGrouping(fMetaData),
                            getVisibility(fMetaData), value(longVal.toString())));
                    break;
                case TType.STRING:
                    byte[] bytes;
                    if (fvMetaData.isBinary()) {
                        bytes = (byte[]) value;
                    } else {
                        String strVal = (String) value;
                        bytes = strVal.getBytes(UTF_8);
                    }
                    fields.add(new FieldImpl(text(fMetaData.fieldName), getGrouping(fMetaData),
                            getVisibility(fMetaData), new Value(bytes)));
                    break;
                default:
                    log.warn("Ignoring field: {}", field.getFieldName());
                    break;
                }
            }
        }
    } catch (Exception e) {
        throw new RuntimeException(e);
    }

    return fields;
}

From source file:cereal.impl.ThriftStructMapping.java

License:Apache License

@Override
public void update(Iterable<Entry<Key, Value>> iter, InstanceOrBuilder<E> instOrBuilder) {
    checkNotNull(iter, "Iterator is null");
    checkNotNull(instOrBuilder, "InstOrBuilder is null");
    checkArgument(Type.INSTANCE == instOrBuilder.getType(), "Expected INSTANCE in InstanceOrBuilder");

    try {// w  w w . ja  v  a  2s . co  m
        @SuppressWarnings("rawtypes")
        Class<? extends TBase> tbaseClz = instOrBuilder.getWrappedClass();
        if (null == setFieldValue) {
            synchronized (this) {
                if (null == setFieldValue) {
                    Class<?> fieldsClz = Class.forName(instOrBuilder.getWrappedClass().getName() + "$_Fields");
                    setFieldValue = tbaseClz.getMethod("setFieldValue", fieldsClz, Object.class);
                }
            }
        }

        for (Entry<Key, Value> entry : iter) {
            String fieldName = entry.getKey().getColumnQualifier().toString();
            Map<? extends TFieldIdEnum, FieldMetaData> thriftFields = FieldMetaData
                    .getStructMetaDataMap(tbaseClz);
            for (Entry<? extends TFieldIdEnum, FieldMetaData> fieldEntry : thriftFields.entrySet()) {
                TFieldIdEnum fieldId = fieldEntry.getKey();
                if (fieldName.equals(fieldId.getFieldName())) {
                    FieldValueMetaData fvMetaData = fieldEntry.getValue().valueMetaData;
                    Value v = entry.getValue();
                    Object obj = instOrBuilder.get();
                    switch (fvMetaData.type) {
                    case TType.BOOL:
                        Boolean booleanVal = Boolean.parseBoolean(v.toString());
                        setFieldValue.invoke(obj, fieldId, booleanVal);
                        break;
                    case TType.BYTE:
                        Byte byteVal = Byte.parseByte(v.toString());
                        setFieldValue.invoke(obj, fieldId, byteVal);
                        break;
                    case TType.DOUBLE:
                        Double dblVal = Double.parseDouble(v.toString());
                        setFieldValue.invoke(obj, fieldId, dblVal);
                        break;
                    case TType.I16:
                        Short shortVal = Short.parseShort(v.toString());
                        setFieldValue.invoke(obj, fieldId, shortVal);
                        break;
                    case TType.I32:
                        Integer intVal = Integer.parseInt(v.toString());
                        setFieldValue.invoke(obj, fieldId, intVal);
                        break;
                    case TType.I64:
                        Long longVal = Long.parseLong(v.toString());
                        setFieldValue.invoke(obj, fieldId, longVal);
                        break;
                    case TType.STRING:
                        if (fvMetaData.isBinary()) {
                            setFieldValue.invoke(obj, fieldId, ByteBuffer.wrap(v.get()));
                        } else {
                            String strVal = v.toString();
                            setFieldValue.invoke(obj, fieldId, strVal);
                        }
                        break;
                    default:
                        log.warn("Ignoring field: {}", fieldName);
                        break;
                    }
                }
            }
        }
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

From source file:com.cloudera.exhibit.thrift.ThriftObsDescriptor.java

License:Open Source License

public ThriftObsDescriptor(Class<? extends TBase> thriftClass) {
    Map<? extends TFieldIdEnum, FieldMetaData> mdm = FieldMetaData.getStructMetaDataMap(thriftClass);
    this.fields = Lists.newArrayListWithExpectedSize(mdm.size());
    for (Map.Entry<? extends TFieldIdEnum, FieldMetaData> e : mdm.entrySet()) {
        fields.add(new FieldData(e.getKey(), e.getValue()));
    }/*from  w  w w  . j a  v  a  2s  .  c om*/
}

From source file:com.linecorp.armeria.client.thrift.ThriftMethod.java

License:Apache License

@SuppressWarnings({ "unchecked", "SuspiciousArrayCast" })
ThriftMethod(Class<?> clientClass, Method method, String thriftServiceName) {
    requireNonNull(clientClass);//  ww w.  ja v  a  2  s .  c om
    requireNonNull(method);
    requireNonNull(thriftServiceName);
    name = method.getName();
    declaredThrowableException = method.getExceptionTypes();

    boolean oneWay = false;
    try {
        clientClass.getMethod("recv_" + name);
    } catch (NoSuchMethodException ignore) {
        oneWay = true;
    }
    this.oneWay = oneWay;

    String argClassName = thriftServiceName + '$' + name + "_args";
    final Class<TBase<? extends TBase, TFieldIdEnum>> argClass;
    try {
        argClass = (Class<TBase<? extends TBase, TFieldIdEnum>>) Class.forName(argClassName);
        argsObject = argClass.newInstance();
    } catch (Exception e) {
        throw new IllegalArgumentException("fail to create a new instance: " + argClassName, e);
    }

    String argFieldEnumName = thriftServiceName + '$' + name + "_args$_Fields";
    try {
        Class<?> fieldIdEnumClass = Class.forName(argFieldEnumName);
        argsFieldIdEnums = (TFieldIdEnum[]) requireNonNull(fieldIdEnumClass.getEnumConstants(),
                "field enum may not be empty");
    } catch (Exception e) {
        throw new IllegalArgumentException("fail to create a new instance : " + argFieldEnumName, e);
    }

    FieldValueMetaData successFieldMetadata = null;
    if (oneWay) {
        resultObject = null;
        successField = null;
        exceptionFields = Collections.emptyList();
    } else {
        String resultClassName = thriftServiceName + '$' + name + "_result";
        final Class resultClass;
        try {
            resultClass = Class.forName(resultClassName);
            resultObject = (TBase<? extends TBase, TFieldIdEnum>) resultClass.newInstance();
        } catch (Exception e) {
            throw new IllegalArgumentException("fail to create a new instance : " + resultClassName, e);
        }

        try {

            @SuppressWarnings("unchecked")
            final Map<TFieldIdEnum, FieldMetaData> resultMetaDataMap = (Map<TFieldIdEnum, FieldMetaData>) FieldMetaData
                    .getStructMetaDataMap(resultClass);

            TFieldIdEnum successField = null;
            List<TFieldIdEnum> exceptionFields = new ArrayList<>(resultMetaDataMap.size());
            for (Entry<TFieldIdEnum, FieldMetaData> e : resultMetaDataMap.entrySet()) {
                final TFieldIdEnum key = e.getKey();
                final String fieldName = key.getFieldName();
                if ("success".equals(fieldName)) {
                    successField = key;
                    successFieldMetadata = e.getValue().valueMetaData;
                    continue;
                }

                Class<?> fieldType = resultClass.getField(fieldName).getType();
                if (Throwable.class.isAssignableFrom(fieldType)) {
                    exceptionFields.add(key);
                }
            }

            this.successField = successField;
            this.exceptionFields = Collections.unmodifiableList(exceptionFields);
        } catch (Exception e) {
            throw new IllegalArgumentException(
                    "failed to find the result metaDataMap: " + resultClass.getName(), e);
        }
    }

    // Determine the parameter types of the function.
    paramTypes = Collections.unmodifiableList(FieldMetaData.getStructMetaDataMap(argClass).values().stream()
            .map(e -> ThriftUtil.toJavaType(e.valueMetaData)).collect(Collectors.toList()));

    if (successFieldMetadata != null) {
        returnType = ThriftUtil.toJavaType(successFieldMetadata);
    } else {
        returnType = Void.class;
    }
}

From source file:com.linecorp.armeria.common.thrift.text.StructContext.java

License:Apache License

/**
 * Compute a new field name map for the current thrift message
 * we are parsing.//from   w  w  w .  java  2  s .  c o  m
 */
private Map<String, TField> computeFieldNameMap(Class<?> clazz) {
    Map<String, TField> map = new HashMap<>();

    if (isTBase(clazz)) {
        // Get the metaDataMap for this Thrift class
        @SuppressWarnings("unchecked")
        Map<? extends TFieldIdEnum, FieldMetaData> metaDataMap = FieldMetaData
                .getStructMetaDataMap((Class<? extends TBase<?, ?>>) clazz);

        for (Entry<? extends TFieldIdEnum, FieldMetaData> e : metaDataMap.entrySet()) {
            final String fieldName = e.getKey().getFieldName();
            final FieldMetaData metaData = e.getValue();

            final FieldValueMetaData elementMetaData;
            if (metaData.valueMetaData.isContainer()) {
                if (metaData.valueMetaData instanceof SetMetaData) {
                    elementMetaData = ((SetMetaData) metaData.valueMetaData).elemMetaData;
                } else if (metaData.valueMetaData instanceof ListMetaData) {
                    elementMetaData = ((ListMetaData) metaData.valueMetaData).elemMetaData;
                } else if (metaData.valueMetaData instanceof MapMetaData) {
                    elementMetaData = ((MapMetaData) metaData.valueMetaData).valueMetaData;
                } else {
                    // Unrecognized container type, but let's still continue processing without
                    // special enum support.
                    elementMetaData = metaData.valueMetaData;
                }
            } else {
                elementMetaData = metaData.valueMetaData;
            }

            if (elementMetaData instanceof EnumMetaData) {
                classMap.put(fieldName, ((EnumMetaData) elementMetaData).enumClass);
            } else if (elementMetaData instanceof StructMetaData) {
                classMap.put(fieldName, ((StructMetaData) elementMetaData).structClass);
            }

            // Workaround a bug in the generated thrift message read()
            // method by mapping the ENUM type to the INT32 type
            // The thrift generated parsing code requires that, when expecting
            // a value of enum, we actually parse a value of type int32. The
            // generated read() method then looks up the enum value in a map.
            byte type = TType.ENUM == metaData.valueMetaData.type ? TType.I32 : metaData.valueMetaData.type;

            map.put(fieldName, new TField(fieldName, type, e.getKey().getThriftFieldId()));
        }
    } else { // TApplicationException
        map.put("message", new TField("message", (byte) 11, (short) 1));
        map.put("type", new TField("type", (byte) 8, (short) 2));
    }

    return map;
}

From source file:com.linecorp.armeria.common.thrift.ThriftUtil.java

License:Apache License

/**
 * Converts the specified Thrift call parameters to a list of Java objects.
 *//* w  ww  .ja  v  a  2s .co  m*/
public static List<Object> toJavaParams(TBase<TBase<?, ?>, TFieldIdEnum> params) {
    return Collections.unmodifiableList(FieldMetaData.getStructMetaDataMap(params.getClass()).keySet().stream()
            .map(params::getFieldValue).collect(Collectors.toList()));
}

From source file:com.linecorp.armeria.internal.thrift.ThriftFunction.java

License:Apache License

private ThriftFunction(Class<?> serviceType, String name, Object func, Type type, TFieldIdEnum[] argFields,
        TBase<TBase<?, ?>, TFieldIdEnum> result, Class<?>[] declaredExceptions) throws Exception {

    this.func = func;
    this.type = type;
    this.serviceType = serviceType;
    this.name = name;
    this.argFields = argFields;
    this.result = result;
    this.declaredExceptions = declaredExceptions;

    // Determine the success and exception fields of the function.
    final ImmutableMap.Builder<Class<Throwable>, TFieldIdEnum> exceptionFieldsBuilder = ImmutableMap.builder();
    TFieldIdEnum successField = null;/*from  www.j a v a2 s.  c  o m*/

    if (result != null) { // if not oneway
        @SuppressWarnings("rawtypes")
        final Class<? extends TBase> resultType = result.getClass();
        @SuppressWarnings("unchecked")
        final Map<TFieldIdEnum, FieldMetaData> metaDataMap = (Map<TFieldIdEnum, FieldMetaData>) FieldMetaData
                .getStructMetaDataMap(resultType);

        for (Entry<TFieldIdEnum, FieldMetaData> e : metaDataMap.entrySet()) {
            final TFieldIdEnum key = e.getKey();
            final String fieldName = key.getFieldName();
            if ("success".equals(fieldName)) {
                successField = key;
                continue;
            }

            Class<?> fieldType = resultType.getField(fieldName).getType();
            if (Throwable.class.isAssignableFrom(fieldType)) {
                @SuppressWarnings("unchecked")
                Class<Throwable> exceptionFieldType = (Class<Throwable>) fieldType;
                exceptionFieldsBuilder.put(exceptionFieldType, key);
            }
        }
    }

    this.successField = successField;
    exceptionFields = exceptionFieldsBuilder.build();
}

From source file:com.linecorp.armeria.server.docs.FunctionInfo.java

License:Apache License

private FunctionInfo(String namespace, String name, Class<? extends TBase<?, ?>> argsClass,
        Class<? extends TBase<?, ?>> resultClass, Class<? extends TException>[] exceptionClasses,
        String sampleJsonRequest, Map<String, String> docStrings) {
    this.name = requireNonNull(name, "name");
    this.sampleJsonRequest = requireNonNull(sampleJsonRequest, "sampleJsonRequest");
    final String functionNamespace = ThriftDocString.key(namespace, name);
    this.docString = docStrings.get(functionNamespace);
    requireNonNull(argsClass, "argsClass");
    requireNonNull(resultClass, "resultClass");
    requireNonNull(exceptionClasses, "exceptionClasses");

    final Map<? extends TFieldIdEnum, FieldMetaData> argsMetaData = FieldMetaData
            .getStructMetaDataMap(argsClass);
    parameters = Collections.unmodifiableList(argsMetaData.values().stream()
            .map(fieldMetaData -> FieldInfo.of(fieldMetaData, functionNamespace, docStrings))
            .collect(Collectors.toList()));

    final Map<? extends TFieldIdEnum, FieldMetaData> resultMetaData = FieldMetaData
            .getStructMetaDataMap(resultClass);
    FieldInfo fieldInfo = null;/*w  w  w . j ava2 s  .c o  m*/
    for (FieldMetaData fieldMetaData : resultMetaData.values()) {
        if ("success".equals(fieldMetaData.fieldName)) {
            fieldInfo = FieldInfo.of(fieldMetaData, functionNamespace, docStrings);
            break;
        }
    }
    if (fieldInfo == null) {
        returnType = TypeInfo.VOID;
    } else {
        returnType = fieldInfo.type();
    }

    final List<ExceptionInfo> exceptions0 = new ArrayList<>(exceptionClasses.length);
    for (Class<? extends TException> exceptionClass : exceptionClasses) {
        if (exceptionClass == TException.class) {
            continue;
        }
        exceptions0.add(ExceptionInfo.of(exceptionClass, docStrings));
    }
    exceptions = Collections.unmodifiableList(exceptions0);
}

From source file:com.linecorp.armeria.server.docs.StructInfo.java

License:Apache License

static StructInfo of(StructMetaData structMetaData, Map<String, String> docStrings) {
    final Class<?> structClass = structMetaData.structClass;
    final String name = structClass.getName();

    assert structMetaData.type == TType.STRUCT;
    assert !structMetaData.isBinary();

    final Map<?, FieldMetaData> metaDataMap = FieldMetaData.getStructMetaDataMap(structMetaData.structClass);
    final List<FieldInfo> fields = metaDataMap.values().stream()
            .map(fieldMetaData -> FieldInfo.of(fieldMetaData, name, docStrings)).collect(Collectors.toList());

    return new StructInfo(name, fields, docStrings.get(name));
}

From source file:com.linecorp.armeria.server.thrift.ThriftDocServicePlugin.java

License:Apache License

private static MethodInfo newMethodInfo(String name, Class<? extends TBase<?, ?>> argsClass,
        @Nullable Class<? extends TBase<?, ?>> resultClass, Class<? extends TException>[] exceptionClasses,
        Iterable<EndpointInfo> endpoints) {
    requireNonNull(name, "name");
    requireNonNull(argsClass, "argsClass");
    requireNonNull(exceptionClasses, "exceptionClasses");
    requireNonNull(endpoints, "endpoints");

    final List<FieldInfo> parameters = FieldMetaData.getStructMetaDataMap(argsClass).values().stream()
            .map(fieldMetaData -> newFieldInfo(argsClass, fieldMetaData)).collect(toImmutableList());

    // Find the 'success' field.
    FieldInfo fieldInfo = null;/*from  www.  j  av  a  2s  .  c om*/
    if (resultClass != null) { // Function isn't "oneway" function
        final Map<? extends TFieldIdEnum, FieldMetaData> resultMetaData = FieldMetaData
                .getStructMetaDataMap(resultClass);

        for (FieldMetaData fieldMetaData : resultMetaData.values()) {
            if ("success".equals(fieldMetaData.fieldName)) {
                fieldInfo = newFieldInfo(resultClass, fieldMetaData);
                break;
            }
        }
    }

    final TypeSignature returnTypeSignature;
    if (fieldInfo == null) {
        returnTypeSignature = VOID;
    } else {
        returnTypeSignature = fieldInfo.typeSignature();
    }

    final List<TypeSignature> exceptionTypeSignatures = Arrays.stream(exceptionClasses)
            .filter(e -> e != TException.class).map(TypeSignature::ofNamed).collect(toImmutableList());

    return new MethodInfo(name, returnTypeSignature, parameters, exceptionTypeSignatures, endpoints);
}