Search in sources :

Example 1 with BaseClassFieldReader

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;
}
Also used : BaseClassFieldReader(org.drools.core.base.BaseClassFieldReader) BaseClassFieldReader(org.drools.core.base.BaseClassFieldReader) InternalReadAccessor(org.drools.core.spi.InternalReadAccessor)

Example 2 with BaseClassFieldReader

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);
    }
}
Also used : ValueType(org.drools.core.base.ValueType) ByteArrayClassLoader(org.drools.wiring.api.util.ByteArrayClassLoader) Method(java.lang.reflect.Method) BaseClassFieldReader(org.drools.core.base.BaseClassFieldReader) SelfReferenceClassFieldReader(org.drools.core.base.extractors.SelfReferenceClassFieldReader) ClassFieldAccessorStore.getClassFieldInspector(org.drools.mvel.accessors.ClassFieldAccessorStore.getClassFieldInspector) ClassFieldInspector(org.drools.core.base.ClassFieldInspector)

Aggregations

BaseClassFieldReader (org.drools.core.base.BaseClassFieldReader)2 Method (java.lang.reflect.Method)1 ClassFieldInspector (org.drools.core.base.ClassFieldInspector)1 ValueType (org.drools.core.base.ValueType)1 SelfReferenceClassFieldReader (org.drools.core.base.extractors.SelfReferenceClassFieldReader)1 InternalReadAccessor (org.drools.core.spi.InternalReadAccessor)1 ClassFieldAccessorStore.getClassFieldInspector (org.drools.mvel.accessors.ClassFieldAccessorStore.getClassFieldInspector)1 ByteArrayClassLoader (org.drools.wiring.api.util.ByteArrayClassLoader)1