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;
}
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);
}
}
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;
}
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);
}
}
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;
}
}
Aggregations