Search in sources :

Example 1 with Trait

use of org.drools.core.factmodel.traits.Trait in project drools by kiegroup.

the class StandaloneTraitFactory method extendAsProperTrait.

private Class<T> extendAsProperTrait(Class<T> trait) {
    String extName = trait.getName() + TraitFactory.SUFFIX;
    if (!classLoader.isClassInUse(extName)) {
        try {
            ClassDefinition extDef = new ClassDefinition(extName);
            extDef.setSuperClass(Object.class.getName());
            AnnotationDefinition annot = new AnnotationDefinition(Trait.class.getName());
            extDef.addAnnotation(annot);
            String[] supers = new String[] { Thing.class.getName(), trait.getName() };
            extDef.setInterfaces(supers);
            byte[] ext = getComponentFactory().getClassBuilderFactory().getTraitBuilder().buildClass(extDef, classLoader);
            Class<?> klass = registerAndLoadTypeDefinition(extName, ext);
            ClassDefinition tDef = buildClassDefinition(trait, trait);
            tDef.setDefinedClass(klass);
            getTraitRegistry().addTrait(tDef);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    try {
        return (Class<T>) Class.forName(extName, false, classLoader);
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    return null;
}
Also used : AnnotationDefinition(org.drools.core.factmodel.AnnotationDefinition) Trait(org.drools.core.factmodel.traits.Trait) ClassDefinition(org.drools.core.factmodel.ClassDefinition) IOException(java.io.IOException) LogicalTypeInconsistencyException(org.drools.core.factmodel.traits.LogicalTypeInconsistencyException)

Example 2 with Trait

use of org.drools.core.factmodel.traits.Trait in project drools by kiegroup.

the class AbstractProxyClassBuilderImpl method helpSet.

public void helpSet(ClassDefinition core, FieldDefinition field, MethodVisitor mv, String proxyName) {
    // The trait field update will be done by the core setter. However, types may mismatch here
    FieldDefinition hardField = core.getFieldByAlias(field.resolveAlias());
    boolean isHardField = field.getTypeName().equals(hardField.getTypeName());
    if (!field.getType().isPrimitive() && !isHardField) {
        boolean isCoreTrait = hardField.getType().getAnnotation(Trait.class) != null;
        boolean isTraitTrait = field.getType().getAnnotation(Trait.class) != null;
        Label l0 = new Label();
        mv.visitVarInsn(ALOAD, 1);
        mv.visitJumpInsn(IFNULL, l0);
        if (isCoreTrait && !isTraitTrait) {
            mv.visitVarInsn(ALOAD, 1);
            mv.visitTypeInsn(CHECKCAST, Type.getInternalName(TraitableBean.class));
            mv.visitLdcInsn(hardField.getTypeName());
            mv.visitMethodInsn(INVOKEINTERFACE, Type.getInternalName(TraitableBean.class), "getTrait", Type.getMethodDescriptor(Type.getType(Thing.class), Type.getType(String.class)), true);
            mv.visitVarInsn(ASTORE, 1);
        } else if (!isCoreTrait && isTraitTrait) {
            mv.visitVarInsn(ALOAD, 1);
            mv.visitTypeInsn(CHECKCAST, Type.getInternalName(TraitProxyImpl.class));
            mv.visitMethodInsn(INVOKEVIRTUAL, Type.getInternalName(TraitProxyImpl.class), "getObject", Type.getMethodDescriptor(Type.getType(TraitableBean.class)), false);
            mv.visitVarInsn(ASTORE, 1);
        } else if (isCoreTrait) {
            mv.visitVarInsn(ALOAD, 1);
            mv.visitTypeInsn(CHECKCAST, Type.getInternalName(TraitProxyImpl.class));
            mv.visitMethodInsn(INVOKEVIRTUAL, Type.getInternalName(TraitProxyImpl.class), "getObject", Type.getMethodDescriptor(Type.getType(TraitableBean.class)), false);
            mv.visitTypeInsn(CHECKCAST, Type.getInternalName(TraitableBean.class));
            mv.visitLdcInsn(hardField.getTypeName());
            mv.visitMethodInsn(INVOKEINTERFACE, Type.getInternalName(TraitableBean.class), "getTrait", Type.getMethodDescriptor(Type.getType(Thing.class), Type.getType(String.class)), true);
            mv.visitVarInsn(ASTORE, 1);
        } else {
            // handled by normal inheritance, exceptions should have been thrown
            if (!hardField.getType().isAssignableFrom(field.getType())) {
                mv.visitInsn(RETURN);
            }
        }
        Label l1 = new Label();
        mv.visitJumpInsn(GOTO, l1);
        mv.visitLabel(l0);
        mv.visitInsn(ACONST_NULL);
        mv.visitVarInsn(ASTORE, 1);
        mv.visitLabel(l1);
    } else if (field.getType().isPrimitive()) {
        if (!hardField.getType().equals(field.getType())) {
            mv.visitInsn(RETURN);
        }
    }
    if (isHardField && CoreWrapper.class.isAssignableFrom(core.getDefinedClass())) {
        logicalSetter(mv, field, proxyName, core);
    }
}
Also used : CoreWrapper(org.drools.core.factmodel.traits.CoreWrapper) FieldDefinition(org.drools.core.factmodel.FieldDefinition) Label(org.mvel2.asm.Label) TraitableBean(org.drools.core.factmodel.traits.TraitableBean) Trait(org.drools.core.factmodel.traits.Trait)

Example 3 with Trait

use of org.drools.core.factmodel.traits.Trait in project drools by kiegroup.

the class StandaloneTraitFactory method extendAsProperTrait.

private Class<T> extendAsProperTrait(Class<T> trait) {
    String extName = trait.getName() + SUFFIX;
    if (!classLoader.isClassInUse(extName)) {
        try {
            ClassDefinition extDef = new ClassDefinition(extName);
            extDef.setSuperClass(Object.class.getName());
            AnnotationDefinition annot = new AnnotationDefinition(Trait.class.getName());
            extDef.addAnnotation(annot);
            String[] supers = new String[] { Thing.class.getName(), trait.getName() };
            extDef.setInterfaces(supers);
            byte[] ext = new TraitClassBuilderImpl().buildClass(extDef, classLoader);
            Class<?> klass = registerAndLoadTypeDefinition(extName, ext);
            ClassDefinition tDef = buildClassDefinition(trait, trait);
            tDef.setDefinedClass(klass);
            getTraitRegistry().addTrait(tDef);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    try {
        return (Class<T>) Class.forName(extName, false, classLoader);
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    return null;
}
Also used : AnnotationDefinition(org.drools.core.factmodel.AnnotationDefinition) TraitClassBuilderImpl(org.drools.traits.core.factmodel.TraitClassBuilderImpl) Trait(org.drools.core.factmodel.traits.Trait) ClassDefinition(org.drools.core.factmodel.ClassDefinition) IOException(java.io.IOException) LogicalTypeInconsistencyException(org.drools.traits.core.factmodel.LogicalTypeInconsistencyException)

Example 4 with Trait

use of org.drools.core.factmodel.traits.Trait in project drools by kiegroup.

the class TraitBuilderUtil method findMixinMethodImpls.

private static void findMixinMethodImpls(Class<?> traitClass, Map<Class<?>, List<Method>> map) {
    Trait annTrait = getAnnotation(traitClass, Trait.class);
    if (hasImpl(annTrait)) {
        Class<?> mixinClass = annTrait.impl();
        map.put(mixinClass, asList(mixinClass.getMethods()));
    }
    if (traitClass.getSuperclass() != null) {
        findMixinMethodImpls(traitClass.getSuperclass(), map);
    }
    for (Class<?> intf : traitClass.getInterfaces()) {
        findMixinMethodImpls(intf, map);
    }
}
Also used : Trait(org.drools.core.factmodel.traits.Trait)

Example 5 with Trait

use of org.drools.core.factmodel.traits.Trait in project drools by kiegroup.

the class AbstractTraitFactory method buildProxyClass.

protected Class<T> buildProxyClass(K core, Class<?> trait) {
    Class coreKlass = core.getClass();
    // get the trait classDef
    ClassDefinition tdef = getTraitRegistry().getTrait(trait.getName());
    ClassDefinition cdef = getTraitRegistry().getTraitable(coreKlass.getName());
    if (tdef == null) {
        if (trait.getAnnotation(Trait.class) != null) {
            try {
                if (Thing.class.isAssignableFrom(trait)) {
                    tdef = buildClassDefinition(trait, null);
                } else {
                    throw new RuntimeException("Unable to create definition for class " + trait + " : trait interfaces should extend " + Thing.class.getName() + " or be DECLARED as traits explicitly");
                }
            } catch (IOException e) {
                throw new UncheckedIOException("Unable to create definition for class " + trait + " : " + e.getMessage(), e);
            }
            getTraitRegistry().addTrait(tdef);
        } else {
            throw new RuntimeException("Unable to find Trait definition for class " + trait.getName() + ". It should have been DECLARED as a trait");
        }
    }
    if (cdef == null) {
        if (core.getClass().getAnnotation(Traitable.class) != null) {
            try {
                cdef = buildClassDefinition(core.getClass(), core.getClass());
            } catch (IOException e) {
                throw new UncheckedIOException("Unable to create definition for class " + coreKlass.getName() + " : " + e.getMessage(), e);
            }
            getTraitRegistry().addTraitable(cdef);
        } else {
            throw new RuntimeException("Unable to find Core class definition for class " + coreKlass.getName() + ". It should have been DECLARED as a trait");
        }
    }
    String proxyName = getProxyName(tdef, cdef);
    String wrapperName = getPropertyWrapperName(tdef, cdef);
    TraitPropertyWrapperClassBuilder propWrapperBuilder = (TraitPropertyWrapperClassBuilder) traitClassBuilderFactory.getPropertyWrapperBuilder();
    propWrapperBuilder.init(tdef, getTraitRegistry());
    try {
        byte[] propWrapper = propWrapperBuilder.buildClass(cdef, getRootClassLoader());
        registerAndLoadTypeDefinition(wrapperName, propWrapper);
    } catch (Exception e) {
        e.printStackTrace();
    }
    TraitProxyClassBuilder proxyBuilder = traitClassBuilderFactory.getTraitProxyBuilder();
    proxyBuilder.init(tdef, TraitProxyImpl.class, getTraitRegistry());
    try {
        byte[] proxy = proxyBuilder.buildClass(cdef, getRootClassLoader());
        registerAndLoadTypeDefinition(proxyName, proxy);
    } catch (Exception e) {
        e.printStackTrace();
    }
    try {
        getTraitRegistry().getFieldMask(trait.getName(), cdef.getDefinedClass().getName());
        getRootClassLoader().loadClass(wrapperName);
        return (Class<T>) getRootClassLoader().loadClass(proxyName);
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
        return null;
    }
}
Also used : UncheckedIOException(java.io.UncheckedIOException) IOException(java.io.IOException) UncheckedIOException(java.io.UncheckedIOException) ClassDefinition(org.drools.core.factmodel.ClassDefinition) IOException(java.io.IOException) InvocationTargetException(java.lang.reflect.InvocationTargetException) UncheckedIOException(java.io.UncheckedIOException) Trait(org.drools.core.factmodel.traits.Trait) Traitable(org.drools.core.factmodel.traits.Traitable) Thing(org.drools.core.factmodel.traits.Thing)

Aggregations

Trait (org.drools.core.factmodel.traits.Trait)5 IOException (java.io.IOException)3 ClassDefinition (org.drools.core.factmodel.ClassDefinition)3 AnnotationDefinition (org.drools.core.factmodel.AnnotationDefinition)2 UncheckedIOException (java.io.UncheckedIOException)1 InvocationTargetException (java.lang.reflect.InvocationTargetException)1 FieldDefinition (org.drools.core.factmodel.FieldDefinition)1 CoreWrapper (org.drools.core.factmodel.traits.CoreWrapper)1 LogicalTypeInconsistencyException (org.drools.core.factmodel.traits.LogicalTypeInconsistencyException)1 Thing (org.drools.core.factmodel.traits.Thing)1 Traitable (org.drools.core.factmodel.traits.Traitable)1 TraitableBean (org.drools.core.factmodel.traits.TraitableBean)1 LogicalTypeInconsistencyException (org.drools.traits.core.factmodel.LogicalTypeInconsistencyException)1 TraitClassBuilderImpl (org.drools.traits.core.factmodel.TraitClassBuilderImpl)1 Label (org.mvel2.asm.Label)1