Search in sources :

Example 1 with BaseClassFieldWriter

use of org.drools.core.base.BaseClassFieldWriter in project drools by kiegroup.

the class ClassFieldAccessorStore method wire.

public BaseClassFieldWriter wire(ClassFieldWriter writer) {
    WriteAccessor accessor = cache.getWriteAccessor(writer.getClassName(), writer.getFieldName());
    writer.setWriteAccessor(accessor);
    return (BaseClassFieldWriter) accessor;
}
Also used : WriteAccessor(org.drools.core.spi.WriteAccessor) BaseClassFieldWriter(org.drools.core.base.BaseClassFieldWriter)

Example 2 with BaseClassFieldWriter

use of org.drools.core.base.BaseClassFieldWriter in project drools by kiegroup.

the class ClassFieldAccessorFactory method getClassFieldWriter.

@Override
public BaseClassFieldWriter getClassFieldWriter(Class<?> clazz, String fieldName, CacheEntry cache) {
    ByteArrayClassLoader byteArrayClassLoader = cache.getByteArrayClassLoader();
    Map<Class<?>, ClassFieldInspector> inspectors = cache.getInspectors();
    try {
        // otherwise, bytecode generate a specific extractor
        ClassFieldInspector inspector = inspectors.get(clazz);
        if (inspector == null) {
            inspector = new ClassFieldInspectorImpl(clazz);
            inspectors.put(clazz, inspector);
        }
        Method setterMethod = inspector.getSetterMethods().get(fieldName);
        Integer index = inspector.getFieldNames().get(fieldName);
        if (setterMethod == 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);
            setterMethod = inspector.getSetterMethods().get(altFieldName);
            index = inspector.getFieldNames().get(altFieldName);
        }
        if (setterMethod != null) {
            final Class<?> fieldType = setterMethod.getParameterTypes()[0];
            final String className = ClassFieldAccessorFactory.BASE_PACKAGE + "/" + Type.getInternalName(clazz) + Math.abs((long) System.identityHashCode(clazz)) + "$" + setterMethod.getName();
            // generating byte array to create target class
            final byte[] bytes = dumpWriter(clazz, className, setterMethod, fieldType);
            // use bytes to get a class
            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 (BaseClassFieldWriter) newClass.getConstructors()[0].newInstance(params);
        } else {
            if (inspector.getFieldNames().containsKey(fieldName)) {
                return null;
            } else {
                throw new RuntimeException("Field/method '" + fieldName + "' not found for class '" + clazz.getName() + "'");
            }
        }
    } 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) BaseClassFieldWriter(org.drools.core.base.BaseClassFieldWriter) ClassFieldAccessorStore.getClassFieldInspector(org.drools.mvel.accessors.ClassFieldAccessorStore.getClassFieldInspector) ClassFieldInspector(org.drools.core.base.ClassFieldInspector)

Aggregations

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