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); }