⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rulebuilder.java

📁 jboss规则引擎
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
                    ce.addChild( not );
                } else if ( object instanceof ExistsDescr ) {
                    final Exists exists = new Exists();
                    this.columnCounter.setParent( exists );
                    build( rule,
                           (ConditionalElementDescr) object,
                           exists,
                           true,   // when EXIST is used, offset MUST be decremented
                           true ); // when EXIST is used, offset MUST be decremented for first column
                    ce.addChild( exists );
                } else if ( object instanceof EvalDescr ) {
                    final EvalCondition eval = build( (EvalDescr) object );
                    if ( eval != null ) {
                        ce.addChild( eval );
                    }
                }
            } else if ( object instanceof ColumnDescr ) {
                if ( decrementOffset && decrementFirst ) {
                    this.columnOffset--;
                } else {
                    decrementFirst = true;
                }
                final Column column = build( (ColumnDescr) object );
                if ( column != null ) {
                    ce.addChild( column );
                }
            }
        }
    }

    private Column build(final ColumnDescr columnDescr) {
        if ( columnDescr.getObjectType() == null || columnDescr.getObjectType().equals( "" ) ) {
            this.errors.add( new RuleError( this.rule,
                                            columnDescr,
                                            null,
                                            "ObjectType not correctly defined" ) );
            return null;
        }

        Class clazz = null;

        try {
            //clazz = Class.forName( columnDescr.getObjectType() );
            clazz = this.typeResolver.resolveType( columnDescr.getObjectType() );
        } catch ( final ClassNotFoundException e ) {
            this.errors.add( new RuleError( this.rule,
                                            columnDescr,
                                            null,
                                            "Unable to resolve ObjectType '" + columnDescr.getObjectType() + "'" ) );
            return null;
        }

        Column column;
        if ( columnDescr.getIdentifier() != null && !columnDescr.getIdentifier().equals( "" ) ) {
            column = new Column( this.columnCounter.getNext(),
                                 this.columnOffset,
                                 new ClassObjectType( clazz ),
                                 columnDescr.getIdentifier() );;
            this.declarations.put( column.getDeclaration().getIdentifier(),
                                   column.getDeclaration() );

            if ( this.notDeclarations != null ) {
                this.notDeclarations.put( column.getDeclaration().getIdentifier(),
                                          column.getDeclaration() );
            }
        } else {
            column = new Column( this.columnCounter.getNext(),
                                 this.columnOffset,
                                 new ClassObjectType( clazz ),
                                 null );
        }

        for ( final Iterator it = columnDescr.getDescrs().iterator(); it.hasNext(); ) {
            final Object object = it.next();
            if ( object instanceof FieldBindingDescr ) {
                build( column,
                       (FieldBindingDescr) object );
            } else if ( object instanceof LiteralDescr ) {
                build( column,
                       (LiteralDescr) object );
            } else if ( object instanceof BoundVariableDescr ) {
                build( column,
                       (BoundVariableDescr) object );
            } else if ( object instanceof ReturnValueDescr ) {
                build( column,
                       (ReturnValueDescr) object );
            } else if ( object instanceof PredicateDescr ) {
                build( column,
                       (PredicateDescr) object );
            }
        }
        return column;
    }

    private void build(final Column column,
                       final FieldBindingDescr fieldBindingDescr) {
        Declaration declaration = (Declaration) this.declarations.get( fieldBindingDescr.getIdentifier() );
        if ( declaration != null ) {
            // This declaration already  exists, so throw an Exception
            this.errors.add( new RuleError( this.rule,
                                            fieldBindingDescr,
                                            null,
                                            "Duplicate declaration for variable '" + fieldBindingDescr.getIdentifier() + "' in the rule '" + this.rule.getName() + "'" ) );
            return;
        }

        final Class clazz = ((ClassObjectType) column.getObjectType()).getClassType();

        final FieldExtractor extractor = getFieldExtractor( fieldBindingDescr,
                                                            clazz,
                                                            fieldBindingDescr.getFieldName() );
        if ( extractor == null ) {
            return;
        }

        declaration = column.addDeclaration( fieldBindingDescr.getIdentifier(),
                                             extractor );

        this.declarations.put( declaration.getIdentifier(),
                               declaration );

        if ( this.notDeclarations != null ) {
            this.notDeclarations.put( declaration.getIdentifier(),
                                      declaration );
        }
    }

    private void build(final Column column,
                       final BoundVariableDescr boundVariableDescr) {
        if ( boundVariableDescr.getIdentifier() == null || boundVariableDescr.getIdentifier().equals( "" ) ) {
            this.errors.add( new RuleError( this.rule,
                                            boundVariableDescr,
                                            null,
                                            "Identifier not defined for binding field '" + boundVariableDescr.getFieldName() + "'" ) );
            return;
        }

        final Class clazz = ((ClassObjectType) column.getObjectType()).getClassType();

        final FieldExtractor extractor = getFieldExtractor( boundVariableDescr,
                                                            clazz,
                                                            boundVariableDescr.getFieldName() );
        if ( extractor == null ) {
            return;
        }

        final Declaration declaration = (Declaration) this.declarations.get( boundVariableDescr.getIdentifier() );

        if ( declaration == null ) {
            this.errors.add( new RuleError( this.rule,
                                            boundVariableDescr,
                                            null,
                                            "Unable to return Declaration for identifier '" + boundVariableDescr.getIdentifier() + "'" ) );
            return;
        }

        final Evaluator evaluator = getEvaluator( boundVariableDescr,
                                                  extractor.getObjectType().getValueType(),
                                                  boundVariableDescr.getEvaluator() );
        if ( evaluator == null ) {
            return;
        }

        column.addConstraint( new BoundVariableConstraint( extractor,
                                                           declaration,
                                                           evaluator ) );
    }

    private void build(final Column column,
                       final LiteralDescr literalDescr) {

        final Class clazz = ((ClassObjectType) column.getObjectType()).getClassType();

        final FieldExtractor extractor = getFieldExtractor( literalDescr,
                                                            clazz,
                                                            literalDescr.getFieldName() );
        if ( extractor == null ) {
            return;
        }

        FieldValue field = null;
        if ( literalDescr.isStaticFieldValue() ) {
            final int lastDot = literalDescr.getText().lastIndexOf( '.' );
            final String className = literalDescr.getText().substring( 0,
                                                                       lastDot );
            final String fieldName = literalDescr.getText().substring( lastDot + 1 );
            try {
                final Class staticClass = this.typeResolver.resolveType( className );
                field = new FieldImpl( staticClass.getField( fieldName ).get( null ) );
            } catch ( final ClassNotFoundException e ) {
                this.errors.add( new RuleError( this.rule,
                                                literalDescr,
                                                e,
                                                e.getMessage() ) );
            } catch ( final Exception e ) {
                this.errors.add( new RuleError( this.rule,
                                                literalDescr,
                                                e,
                                                "Unable to create a Field value of type  '" + extractor.getObjectType().getValueType() + "' and value '" + literalDescr.getText() + "'" ) );
            }

        } else {
            try {
                field = FieldFactory.getFieldValue( literalDescr.getText(),
                                                    extractor.getObjectType().getValueType() );
            } catch ( final Exception e ) {
                this.errors.add( new RuleError( this.rule,
                                                literalDescr,
                                                e,
                                                "Unable to create a Field value of type  '" + extractor.getObjectType().getValueType() + "' and value '" + literalDescr.getText() + "'" ) );
            }
        }

        final Evaluator evaluator = getEvaluator( literalDescr,
                                                  extractor.getObjectType().getValueType(),
                                                  literalDescr.getEvaluator() );
        if ( evaluator == null ) {
            return;
        }

        column.addConstraint( new LiteralConstraint( field,
                                                     extractor,
                                                     evaluator ) );
    }

    private void build(final Column column,
                       final ReturnValueDescr returnValueDescr) {
        final String classMethodName = "returnValue" + this.counter++;
        returnValueDescr.setClassMethodName( classMethodName );

        final List[] usedIdentifiers = getUsedIdentifiers( returnValueDescr,
                                                           returnValueDescr.getText() );

        final Declaration[] declarations = new Declaration[usedIdentifiers[0].size()];
        for ( int i = 0, size = usedIdentifiers[0].size(); i < size; i++ ) {
            declarations[i] = (Declaration) this.declarations.get( (String) usedIdentifiers[0].get( i ) );
        }

        final Class clazz = ((ClassObjectType) column.getObjectType()).getClassType();
        final FieldExtractor extractor = getFieldExtractor( returnValueDescr,
                                                            clazz,
                                                            returnValueDescr.getFieldName() );
        if ( extractor == null ) {
            return;
        }

        final Evaluator evaluator = getEvaluator( returnValueDescr,
                                                  extractor.getObjectType().getValueType(),
                                                  returnValueDescr.getEvaluator() );
        if ( evaluator == null ) {
            return;
        }

        final ReturnValueConstraint returnValueConstraint = new ReturnValueConstraint( extractor,
                                                                                       declarations,
                                                                                       evaluator );
        column.addConstraint( returnValueConstraint );

        StringTemplate st = RuleBuilder.ruleGroup.getInstanceOf( "returnValueMethod" );

        setStringTemplateAttributes( st,
                                     declarations,
                                     (String[]) usedIdentifiers[1].toArray( new String[usedIdentifiers[1].size()] ),
                                     returnValueDescr.getText() );

        st.setAttribute( "methodName",
                         classMethodName );

        final String returnValueText = RuleBuilder.functionFixer.fix( returnValueDescr.getText() );
        st.setAttribute( "text",
                         returnValueText );

        this.methods.add( st.toString() );

        st = RuleBuilder.invokerGroup.getInstanceOf( "returnValueInvoker" );

        st.setAttribute( "package",
                         this.pkg.getName() );
        st.setAttribute( "ruleClassName",
                         ucFirst( this.ruleDescr.getClassName() ) );
        st.setAttribute( "invokerClassName",
                         this.ruleDescr.getClassName() + ucFirst( classMethodName ) + "Invoker" );
        st.setAttribute( "methodName",
                         classMethodName );

        setStringTemplateAttributes( st,
                                     declarations,
                                     (String[]) usedIdentifiers[1].toArray( new String[usedIdentifiers[1].size()] ),
                                     returnValueDescr.getText() );

        st.setAttribute( "hashCode",
                         returnValueText.hashCode() );

        final String invokerClassName = this.pkg.getName() + "." + this.ruleDescr.getClassName() + ucFirst( classMethodName ) + "Invoker";
        this.invokers.put( invokerClassName,
                           st.toString() );
        this.invokerLookups.put( invokerClassName,
                                 returnValueConstraint );
        this.descrLookups.put( invokerClassName,
                               returnValueDescr );
    }

    private void build(final Column column,
                       final PredicateDescr predicateDescr) {
        // generate method
        // generate Invoker
        final String classMethodName = "predicate" + this.counter++;
        predicateDescr.setClassMethodName( classMethodName );

        final Class clazz = ((ClassObjectType) column.getObjectType()).getClassType();

        final FieldExtractor extractor = getFieldExtractor( predicateDescr,
                                                            clazz,
                                                            predicateDescr.getFieldName() );
        if ( extractor == null ) {
            return;
        }

        final Declaration declaration = column.addDeclaration( predicateDescr.getDeclaration(),
                                                               extractor );

        this.declarations.put( declaration.getIdentifier(),
                               declaration );

        if ( this.notDeclarations != null ) {
            this.notDeclarations.put( declaration.getIdentifier(),
                                      declaration );
        }

        final List[] usedIdentifiers = getUsedIdentifiers( predicateDescr,
                                                           predicateDescr.getText() );
        // Don't include the focus declaration, that hasn't been merged into the tuple yet.
        usedIdentifiers[0].remove( predicateDescr.getDeclaration() );

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -