use of org.drools.core.base.BaseClassFieldReader in project drools by kiegroup.
the class ClassFieldAccessorStore method wire.
public BaseClassFieldReader wire(InternalReadAccessor reader) {
if (reader instanceof ClassFieldReader) {
InternalReadAccessor accessor = cache.getReadAccessor(((ClassFieldReader) reader).getClassName(), ((ClassFieldReader) reader).getFieldName());
((ClassFieldReader) reader).setReadAccessor(accessor);
return (BaseClassFieldReader) accessor;
}
return null;
}
use of org.drools.core.base.BaseClassFieldReader in project drools by kiegroup.
the class ClassFieldAccessorFactory method getClassFieldReader.
@Override
public BaseClassFieldReader getClassFieldReader(Class<?> clazz, String fieldName, CacheEntry cache) {
try {
// if it is a self reference
if (SELF_REFERENCE_FIELD.equals(fieldName)) {
// then just create an instance of the special class field extractor
return new SelfReferenceClassFieldReader(clazz);
} else {
// otherwise, bytecode generate a specific extractor
ClassFieldInspector inspector = getClassFieldInspector(clazz, cache);
Method getterMethod = inspector.getGetterMethods().get(fieldName);
Integer index = inspector.getFieldNames().get(fieldName);
Class<?> fieldType = inspector.getFieldType(fieldName);
if (fieldType == null && fieldName.length() > 1 && Character.isLowerCase(fieldName.charAt(0)) && Character.isUpperCase(fieldName.charAt(1))) {
// it might be that odd case of javabeans naming conventions that does not use lower case first letters if the second is uppercase
String altFieldName = Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1);
fieldType = inspector.getFieldType(altFieldName);
if (fieldType != null) {
// it seems it is the corner case indeed.
getterMethod = inspector.getGetterMethods().get(altFieldName);
index = inspector.getFieldNames().get(altFieldName);
}
}
if (fieldType != null && getterMethod != null) {
final String className = ClassFieldAccessorFactory.BASE_PACKAGE + "/" + Type.getInternalName(clazz) + Math.abs((long) System.identityHashCode(clazz)) + "$" + getterMethod.getName();
// generating byte array to create target class
final byte[] bytes = dumpReader(clazz, className, getterMethod, fieldType);
// use bytes to get a class
ByteArrayClassLoader byteArrayClassLoader = cache.getByteArrayClassLoader();
final Class<?> newClass = byteArrayClassLoader.defineClass(className.replace('/', '.'), bytes, PROTECTION_DOMAIN);
// instantiating target class
final ValueType valueType = ValueType.determineValueType(fieldType);
final Object[] params = { index, fieldType, valueType };
return (BaseClassFieldReader) newClass.getConstructors()[0].newInstance(params);
} else {
// must be a public field
return null;
}
}
} catch (final RuntimeException e) {
throw e;
} catch (final Exception e) {
throw new RuntimeException(e);
}
}
Aggregations