Class coreKlass = core.getClass();
// get the trait classDef
ClassDefinition tdef = ruleBase.getTraitRegistry().getTrait( trait.getName() );
ClassDefinition cdef = ruleBase.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 RuntimeDroolsException( "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 RuntimeDroolsException( "Unable to create definition for class " + trait + " : " + e.getMessage() );
}
ruleBase.getTraitRegistry().addTrait( tdef );
} else {
throw new RuntimeDroolsException( "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 RuntimeDroolsException( "Unable to create definition for class " + coreKlass.getName() + " : " + e.getMessage() );
}
ruleBase.getTraitRegistry().addTraitable( cdef );
} else {
throw new RuntimeDroolsException( "Unable to find Core class definition for class " + coreKlass.getName() + ". It should have been DECLARED as traitable" );
}
}
String proxyName = getProxyName( tdef, cdef );
String wrapperName = getPropertyWrapperName( tdef, cdef );
ReteooComponentFactory rcf = ruleBase.getConfiguration().getComponentFactory();
TraitPropertyWrapperClassBuilder propWrapperBuilder = (TraitPropertyWrapperClassBuilder) rcf.getClassBuilderFactory().getPropertyWrapperBuilder();
propWrapperBuilder.init( tdef, ruleBase.getTraitRegistry() );
try {
byte[] propWrapper = propWrapperBuilder.buildClass( cdef );
ruleBase.registerAndLoadTypeDefinition( wrapperName, propWrapper );
} catch (Exception e) {
e.printStackTrace();
}
TraitProxyClassBuilder proxyBuilder = (TraitProxyClassBuilder) rcf.getClassBuilderFactory().getTraitProxyBuilder();
proxyBuilder.init( tdef, rcf.getBaseTraitProxyClass(), ruleBase.getTraitRegistry() );
try {
byte[] proxy = proxyBuilder.buildClass( cdef );
ruleBase.registerAndLoadTypeDefinition( proxyName, proxy );
} catch (Exception e) {
e.printStackTrace();
}
try {
BitSet mask = ruleBase.getTraitRegistry().getFieldMask( trait.getName(), cdef.getDefinedClass().getName() );
Class<T> proxyClass = (Class<T>) ruleBase.getRootClassLoader().loadClass( proxyName, true );
Class<T> wrapperClass = (Class<T>) ruleBase.getRootClassLoader().loadClass( wrapperName, true );
return proxyClass;
} catch (ClassNotFoundException e) {
e.printStackTrace();