Github user aljoscha commented on a diff in the pull request:
https://github.com/apache/flink/pull/5097#discussion_r156090443
--- Diff:
flink-core/src/main/java/org/apache/flink/api/java/typeutils/TypeExtractor.java
---
@@ -1837,56 +1845,111 @@ private boolean isValidPojoField(Field f, Class<?>
clazz, ArrayList<Type> typeHi
Class<?> fieldTypeWrapper =
ClassUtils.primitiveToWrapper(f.getType());
TypeVariable<?> fieldTypeGeneric = null;
- if(fieldType instanceof TypeVariable) {
+ if (fieldType instanceof TypeVariable) {
fieldTypeGeneric = (TypeVariable<?>) fieldType;
fieldType =
materializeTypeVariable(typeHierarchy, (TypeVariable<?>)fieldType);
}
- for(Method m : clazz.getMethods()) {
+ for (Method m : clazz.getMethods()) {
final String methodNameLow =
m.getName().endsWith("_$eq") ?
m.getName().toLowerCase().replaceAll("_", "").replaceFirst("\\$eq$", "_\\$eq") :
m.getName().toLowerCase().replaceAll("_", "");
// check for getter
- if( // The name should be "get<FieldName>"
or "<fieldName>" (for scala) or "is<fieldName>" for boolean fields.
+ if ( // The name should be "get<FieldName>"
or "<fieldName>" (for scala) or "is<fieldName>" for boolean fields.
(methodNameLow.equals("get"+fieldNameLow) ||
methodNameLow.equals("is"+fieldNameLow) || methodNameLow.equals(fieldNameLow))
&&
// no arguments for the getter
m.getParameterTypes().length == 0 &&
// return type is same as field type
(or the generic variant of it)
- (m.getGenericReturnType().equals(
fieldType ) || (fieldTypeWrapper != null && m.getReturnType().equals(
fieldTypeWrapper )) || (fieldTypeGeneric != null &&
m.getGenericReturnType().equals(fieldTypeGeneric)) )
+
(m.getGenericReturnType().equals(fieldType) || (fieldTypeWrapper != null &&
m.getReturnType().equals(fieldTypeWrapper)) || (fieldTypeGeneric != null &&
m.getGenericReturnType().equals(fieldTypeGeneric)))
) {
hasGetter = true;
}
// check for setters (<FieldName>_$eq for scala)
- if((methodNameLow.equals("set"+fieldNameLow) ||
methodNameLow.equals(fieldNameLow+"_$eq")) &&
+ if ((methodNameLow.equals("set"+fieldNameLow)
|| methodNameLow.equals(fieldNameLow+"_$eq")) &&
m.getParameterTypes().length == 1 && //
one parameter of the field's type
-
(m.getGenericParameterTypes()[0].equals( fieldType ) || (fieldTypeWrapper !=
null && m.getParameterTypes()[0].equals( fieldTypeWrapper )) ||
(fieldTypeGeneric != null &&
m.getGenericParameterTypes()[0].equals(fieldTypeGeneric) ) )&&
+
(m.getGenericParameterTypes()[0].equals( fieldType ) || (fieldTypeWrapper !=
null && m.getParameterTypes()[0].equals(fieldTypeWrapper)) || (fieldTypeGeneric
!= null && m.getGenericParameterTypes()[0].equals(fieldTypeGeneric)))&&
// return type is void.
m.getReturnType().equals(Void.TYPE)
) {
hasSetter = true;
}
}
if(hasGetter && hasSetter) {
- return true;
- } else {
- if(!hasGetter) {
- LOG.info(clazz+" does not contain a
getter for field "+f.getName() );
- }
- if(!hasSetter) {
- LOG.info(clazz+" does not contain a
setter for field "+f.getName() );
+ return Optional.empty();
+ } else if (!hasGetter && !hasSetter) {
+ return Optional.of("No getter and setter found
for field " + f.getName());
+ }
+ else if(!hasGetter) {
+ return Optional.of("No getter found for field "
+ f.getName());
+ }
+ else {
+ return Optional.of("No setter found for field "
+ f.getName());
+ }
+ }
+ }
+
+ /**
+ * Returns whether the given class can be instantiated. This requires a
public, static, class
+ * with default constructor. Custom serialization logic must not be
present.
+ *
+ * @param clazz class to be analyzed
+ * @param allowAbstract if true, allows abstract classes but prints an
info to the log
+ */
+ private static Optional<String> checkSerialization(Class<?> clazz,
boolean allowAbstract) {
--- End diff --
Same as above
---