List of usage examples for org.apache.thrift.meta_data FieldMetaData getStructMetaDataMap
public static synchronized Hashtable getStructMetaDataMap(Class sClass)
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); }