This is a fast check to see if the argument matches expected
value class. If it does not it does not make sense to invoke
the serializer, as it will fail.
Change-Id: I4ca556fea057f2188fa1c34d303467565af38d5c
Signed-off-by: Robert Varga <rovarga@cisco.com>
(cherry picked from commit
a6d0735732b202f40bd37f7ae291c8a4af9e3ccf)
private static final MethodType OBJ_METHOD = MethodType.methodType(Object.class, Object.class);
private final MethodHandle constructor;
private final MethodHandle getter;
private static final MethodType OBJ_METHOD = MethodType.methodType(Object.class, Object.class);
private final MethodHandle constructor;
private final MethodHandle getter;
+ private final Class<?> valueType;
- private EncapsulatedValueCodec(final Class<?> typeClz, final MethodHandle constructor, final MethodHandle getter) {
+ private EncapsulatedValueCodec(final Class<?> typeClz, final MethodHandle constructor, final MethodHandle getter,
+ final Class<?> valueType) {
super(typeClz);
this.constructor = Preconditions.checkNotNull(constructor);
this.getter = Preconditions.checkNotNull(getter);
super(typeClz);
this.constructor = Preconditions.checkNotNull(constructor);
this.getter = Preconditions.checkNotNull(getter);
+ this.valueType = Preconditions.checkNotNull(valueType);
}
static Callable<EncapsulatedValueCodec> loader(final Class<?> typeClz) {
return new Callable<EncapsulatedValueCodec>() {
@Override
}
static Callable<EncapsulatedValueCodec> loader(final Class<?> typeClz) {
return new Callable<EncapsulatedValueCodec>() {
@Override
- public EncapsulatedValueCodec call() throws Exception {
+ public EncapsulatedValueCodec call() throws IllegalAccessException, NoSuchMethodException, SecurityException {
final Method m = typeClz.getMethod("getValue");
final MethodHandle getter = LOOKUP.unreflect(m).asType(OBJ_METHOD);
final Method m = typeClz.getMethod("getValue");
final MethodHandle getter = LOOKUP.unreflect(m).asType(OBJ_METHOD);
- final MethodHandle constructor = LOOKUP.findConstructor(typeClz, MethodType.methodType(void.class, m.getReturnType())).asType(OBJ_METHOD);
- return new EncapsulatedValueCodec(typeClz, constructor, getter);
+ final Class<?> valueType = m.getReturnType();
+
+ final MethodHandle constructor = LOOKUP.findConstructor(typeClz,
+ MethodType.methodType(void.class, valueType)).asType(OBJ_METHOD);
+ return new EncapsulatedValueCodec(typeClz, constructor, getter, valueType);
+ /**
+ * Quick check if a value object has a chance to deserialize using {@link #deserialize(Object)}.
+ *
+ * @param value Value to be checked
+ * @return True if the value can be encapsulated
+ */
+ boolean canAcceptObject(final Object value) {
+ return valueType.isInstance(value);
+ }
+
@Override
public Object deserialize(final Object input) {
try {
@Override
public Object deserialize(final Object input) {
try {
}
Object deserializeUnion(final Object input) {
}
Object deserializeUnion(final Object input) {
+ // Side-step potential exceptions by checking the type if it is available
+ if (codec instanceof EncapsulatedValueCodec && !((EncapsulatedValueCodec) codec).canAcceptObject(input)) {
+ return null;
+ }
try {
value = codec.deserialize(input);
} catch (Exception e) {
try {
value = codec.deserialize(input);
} catch (Exception e) {