use of org.apache.thrift.TBase in project hive by apache.
the class JSONMessageFactory method getTObj.
/*
* TODO: Some thoughts here : We have a current todo to move some of these methods over to
* MessageFactory instead of being here, so we can override them, but before we move them over,
* we should keep the following in mind:
*
* a) We should return Iterables, not Lists. That makes sure that we can be memory-safe when
* implementing it rather than forcing ourselves down a path wherein returning List is part of
* our interface, and then people use .size() or somesuch which makes us need to materialize
* the entire list and not change. Also, returning Iterables allows us to do things like
* Iterables.transform for some of these.
* b) We should not have "magic" names like "tableObjJson", because that breaks expectation of a
* couple of things - firstly, that of serialization format, although that is fine for this
* JSONMessageFactory, and secondly, that makes us just have a number of mappings, one for each
* obj type, and sometimes, as the case is with alter, have multiples. Also, any event-specific
* item belongs in that event message / event itself, as opposed to in the factory. It's okay to
* have utility accessor methods here that are used by each of the messages to provide accessors.
* I'm adding a couple of those here.
*
*/
public static TBase getTObj(String tSerialized, Class<? extends TBase> objClass) throws Exception {
TBase obj = objClass.newInstance();
thriftDeSerializer.deserialize(obj, tSerialized, "UTF-8");
return obj;
}
use of org.apache.thrift.TBase in project storm by apache.
the class ThriftSerializationDelegate method deserialize.
@Override
public <T> T deserialize(byte[] bytes, Class<T> clazz) {
try {
TBase instance = (TBase) clazz.newInstance();
new TDeserializer().deserialize(instance, bytes);
return (T) instance;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
use of org.apache.thrift.TBase in project storm by apache.
the class LocalState method deserialize.
private TBase deserialize(ThriftSerializedObject obj, TDeserializer td) {
try {
Class<?> clazz = Class.forName(obj.get_name());
TBase instance = (TBase) clazz.newInstance();
td.deserialize(instance, obj.get_bits());
return instance;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
use of org.apache.thrift.TBase in project storm by apache.
the class LocalState method get.
public TBase get(String key) {
TDeserializer td = new TDeserializer();
Map<String, ThriftSerializedObject> partial = partialSnapshot(td);
ThriftSerializedObject tso = partial.get(key);
TBase ret = null;
if (tso != null) {
ret = deserialize(tso, td);
}
return ret;
}
use of org.apache.thrift.TBase in project dubbo by alibaba.
the class ThriftCodec method encodeRequest.
private void encodeRequest(Channel channel, ChannelBuffer buffer, Request request) throws IOException {
RpcInvocation inv = (RpcInvocation) request.getData();
int seqId = nextSeqId();
String serviceName = inv.getAttachment(Constants.INTERFACE_KEY);
if (StringUtils.isEmpty(serviceName)) {
throw new IllegalArgumentException(new StringBuilder(32).append("Could not find service name in attachment with key ").append(Constants.INTERFACE_KEY).toString());
}
TMessage message = new TMessage(inv.getMethodName(), TMessageType.CALL, seqId);
String methodArgs = ExtensionLoader.getExtensionLoader(ClassNameGenerator.class).getExtension(channel.getUrl().getParameter(ThriftConstants.CLASS_NAME_GENERATOR_KEY, ThriftClassNameGenerator.NAME)).generateArgsClassName(serviceName, inv.getMethodName());
if (StringUtils.isEmpty(methodArgs)) {
throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, new StringBuilder(32).append("Could not encode request, the specified interface may be incorrect.").toString());
}
Class<?> clazz = cachedClass.get(methodArgs);
if (clazz == null) {
try {
clazz = ClassHelper.forNameWithThreadContextClassLoader(methodArgs);
cachedClass.putIfAbsent(methodArgs, clazz);
} catch (ClassNotFoundException e) {
throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);
}
}
TBase args;
try {
args = (TBase) clazz.newInstance();
} catch (InstantiationException e) {
throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);
} catch (IllegalAccessException e) {
throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);
}
for (int i = 0; i < inv.getArguments().length; i++) {
Object obj = inv.getArguments()[i];
if (obj == null) {
continue;
}
TFieldIdEnum field = args.fieldForId(i + 1);
String setMethodName = ThriftUtils.generateSetMethodName(field.getFieldName());
Method method;
try {
method = clazz.getMethod(setMethodName, inv.getParameterTypes()[i]);
} catch (NoSuchMethodException e) {
throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);
}
try {
method.invoke(args, obj);
} catch (IllegalAccessException e) {
throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);
} catch (InvocationTargetException e) {
throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);
}
}
RandomAccessByteArrayOutputStream bos = new RandomAccessByteArrayOutputStream(1024);
TIOStreamTransport transport = new TIOStreamTransport(bos);
TBinaryProtocol protocol = new TBinaryProtocol(transport);
int headerLength, messageLength;
byte[] bytes = new byte[4];
try {
// magic
protocol.writeI16(MAGIC);
// message length placeholder
protocol.writeI32(Integer.MAX_VALUE);
// message header length placeholder
protocol.writeI16(Short.MAX_VALUE);
// version
protocol.writeByte(VERSION);
// service name
protocol.writeString(serviceName);
// dubbo request id
protocol.writeI64(request.getId());
protocol.getTransport().flush();
// header size
headerLength = bos.size();
// message body
protocol.writeMessageBegin(message);
args.write(protocol);
protocol.writeMessageEnd();
protocol.getTransport().flush();
int oldIndex = messageLength = bos.size();
// fill in message length and header length
try {
TFramedTransport.encodeFrameSize(messageLength, bytes);
bos.setWriteIndex(MESSAGE_LENGTH_INDEX);
protocol.writeI32(messageLength);
bos.setWriteIndex(MESSAGE_HEADER_LENGTH_INDEX);
protocol.writeI16((short) (0xffff & headerLength));
} finally {
bos.setWriteIndex(oldIndex);
}
} catch (TException e) {
throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);
}
buffer.writeBytes(bytes);
buffer.writeBytes(bos.toByteArray());
}
Aggregations