ObjectType argsObjectType = ClassObjectType.DroolsQuery_ObjectType;
InternalReadAccessor arrayExtractor = PatternBuilder.getFieldReadAccessor( context, queryDescr, argsObjectType, "elements", null, true );
Query query = ((Query) context.getRule());
String[] params;
String[] types;
int numParams = queryDescr.getParameters().length;
if ( query.isAbductive() ) {
params = Arrays.copyOf( queryDescr.getParameters(), queryDescr.getParameters().length + 1 );
types = Arrays.copyOf( queryDescr.getParameterTypes(), queryDescr.getParameterTypes().length + 1 );
} else {
params = queryDescr.getParameters();
types = queryDescr.getParameterTypes();
}
Declaration[] declarations = new Declaration[ params.length ];
if ( query.isAbductive() ) {
AnnotationDescr ann = queryDescr.getAnnotation( Abductive.class.getSimpleName() );
String returnName = ann.getValue( "target" );
try {
Class<?> returnKlass = context.getPkg().getTypeResolver().resolveType( returnName.replace( ".class", "" ) );
ClassObjectType objectType = new ClassObjectType( returnKlass, false );
objectType = context.getPkg().getClassFieldAccessorStore().getClassObjectType( objectType,
(AbductiveQuery) query );
params[ numParams ] = "";
types[ numParams ] = returnKlass.getName();
((AbductiveQuery) query).setReturnType( objectType, params );
} catch ( ClassNotFoundException e ) {
context.addError( new DescrBuildError( context.getParentDescr(),
queryDescr,
e,
"Unable to resolve abducible type : " + returnName ) );
} catch ( NoSuchMethodException e ) {
context.addError( new DescrBuildError( context.getParentDescr(),
queryDescr,
e,
"Unable to resolve abducible constructor for type : " + returnName +
" with types " + types ) );
}
}
int i = 0;
try {
for ( i = 0; i < params.length; i++ ) {
Declaration declr = pattern.addDeclaration( params[i] );
// this bit is different, notice its the ArrayElementReader that we wire up to, not the declaration.
ArrayElementReader reader = new ArrayElementReader( arrayExtractor,
i,
context.getDialect().getTypeResolver().resolveType( types[i] ) );
PatternBuilder.registerReadAccessor( context, argsObjectType, "elements", reader );
declr.setReadAccessor( reader );
declarations[i] = declr;
}
query.setParameters( declarations );
} catch ( ClassNotFoundException e ) {
context.addError( new DescrBuildError( context.getParentDescr(),
queryDescr,
e,