private Declaration[] getUsedDeclarations( Map<String, Declaration> decls, AnalysisResult analysis) { final BoundIdentifiers usedIdentifiers = analysis.getBoundIdentifiers(); List<Declaration> usedDeclarations = new ArrayList<Declaration>(); for (String id : usedIdentifiers.getDeclrClasses().keySet()) { if (decls.containsKey(id)) { usedDeclarations.add(decls.get(id)); } } if (!usedDeclarations.isEmpty()) { Collections.sort(usedDeclarations, SortDeclarations.instance); } return usedDeclarations.toArray(new Declaration[usedDeclarations.size()]); }
public void build(final RuleBuildContext context, String consequenceName) { // pushing consequence LHS into the stack for variable resolution context.getBuildStack().push(context.getRule().getLhs()); try { MVELDialect dialect = (MVELDialect) context.getDialect(context.getDialect().getId()); final RuleDescr ruleDescr = context.getRuleDescr(); String text = (Rule.DEFAULT_CONSEQUENCE_NAME.equals(consequenceName)) ? (String) ruleDescr.getConsequence() : (String) ruleDescr.getNamedConsequences().get(consequenceName); text = processMacros(text); Map<String, Declaration> decls = context.getDeclarationResolver().getDeclarations(context.getRule()); AnalysisResult analysis = dialect.analyzeBlock( context, context.getRuleDescr(), dialect.getInterceptors(), text, new BoundIdentifiers( DeclarationScopeResolver.getDeclarationClasses(decls), context.getPackageBuilder().getGlobals(), null, KnowledgeHelper.class), null, "drools", KnowledgeHelper.class); if (analysis == null) { // something bad happened, issue already logged in errors return; } final BoundIdentifiers usedIdentifiers = analysis.getBoundIdentifiers(); final Declaration[] declarations = new Declaration[usedIdentifiers.getDeclrClasses().size()]; String[] declrStr = new String[declarations.length]; int j = 0; for (String str : usedIdentifiers.getDeclrClasses().keySet()) { declrStr[j] = str; declarations[j++] = decls.get(str); } Arrays.sort(declarations, SortDeclarations.instance); for (int i = 0; i < declrStr.length; i++) { declrStr[i] = declarations[i].getIdentifier(); } context.getRule().setRequiredDeclarationsForConsequence(consequenceName, declrStr); MVELCompilationUnit unit = dialect.getMVELCompilationUnit( text, analysis, declarations, null, null, context, "drools", KnowledgeHelper.class, false); MVELConsequence expr = new MVELConsequence(unit, dialect.getId()); if (Rule.DEFAULT_CONSEQUENCE_NAME.equals(consequenceName)) { context.getRule().setConsequence(expr); } else { context.getRule().addNamedConsequence(consequenceName, expr); } MVELDialectRuntimeData data = (MVELDialectRuntimeData) context.getPkg().getDialectRuntimeRegistry().getDialectData("mvel"); data.addCompileable(context.getRule(), expr); expr.compile(data); } catch (final Exception e) { copyErrorLocation(e, context.getRuleDescr()); context.addError( new DescrBuildError( context.getParentDescr(), context.getRuleDescr(), null, "Unable to build expression for 'consequence': " + e.getMessage() + " '" + context.getRuleDescr().getConsequence() + "'")); } }