Package org.drools.verifier.visitor

Source Code of org.drools.verifier.visitor.FieldConstraintDescrVisitor

/**
* Copyright 2010 JBoss Inc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package org.drools.verifier.visitor;

import java.util.List;

import org.drools.base.evaluators.Operator;
import org.drools.lang.descr.FieldConstraintDescr;
import org.drools.lang.descr.LiteralRestrictionDescr;
import org.drools.lang.descr.PredicateDescr;
import org.drools.lang.descr.QualifiedIdentifierRestrictionDescr;
import org.drools.lang.descr.RestrictionConnectiveDescr;
import org.drools.lang.descr.RestrictionDescr;
import org.drools.lang.descr.ReturnValueRestrictionDescr;
import org.drools.lang.descr.VariableRestrictionDescr;
import org.drools.verifier.components.Constraint;
import org.drools.verifier.components.EnumField;
import org.drools.verifier.components.EnumRestriction;
import org.drools.verifier.components.Field;
import org.drools.verifier.components.Import;
import org.drools.verifier.components.LiteralRestriction;
import org.drools.verifier.components.ObjectType;
import org.drools.verifier.components.OperatorDescrType;
import org.drools.verifier.components.Pattern;
import org.drools.verifier.components.QualifiedIdentifierRestriction;
import org.drools.verifier.components.ReturnValueRestriction;
import org.drools.verifier.components.Variable;
import org.drools.verifier.components.VariableRestriction;
import org.drools.verifier.components.VerifierComponentType;
import org.drools.verifier.data.VerifierData;
import org.drools.verifier.solver.Solvers;

public class FieldConstraintDescrVisitor {

    private final VerifierData data;

    private final ObjectType   objectType;
    private final Pattern      pattern;
    private Field              field;
    private Constraint         constraint;

    private final int          orderNumber;

    private final Solvers      solvers;

    public FieldConstraintDescrVisitor(VerifierData data,
                                       Pattern pattern,
                                       Solvers solvers,
                                       int orderNumber) {
        this.data = data;
        this.pattern = pattern;
        this.solvers = solvers;
        this.orderNumber = orderNumber;
        this.objectType = data.getVerifierObject( VerifierComponentType.OBJECT_TYPE,
                                                  pattern.getObjectTypePath() );
    }

    public void visitFieldConstraintDescr(FieldConstraintDescr descr) throws UnknownDescriptionException {

        field = data.getFieldByObjectTypeAndFieldName( objectType.getFullName(),
                                                       descr.getFieldName() );
        if ( field == null ) {
            field = ObjectTypeFactory.createField( descr.getFieldName(),
                                                   objectType );
            data.add( field );
        }

        constraint = new Constraint( pattern );

        constraint.setFieldPath( field.getPath() );
        constraint.setFieldName( field.getName() );
        constraint.setPatternIsNot( pattern.isPatternNot() );
        constraint.setFieldPath( field.getPath() );
        constraint.setOrderNumber( orderNumber );
        constraint.setParentPath( pattern.getPath() );
        constraint.setParentType( pattern.getVerifierComponentType() );

        data.add( constraint );

        visit( descr.getRestriction() );
    }

    public void visit(RestrictionDescr restrictionDescr) throws UnknownDescriptionException {
        if ( restrictionDescr instanceof LiteralRestrictionDescr ) {
            visit( (LiteralRestrictionDescr) restrictionDescr );
        } else if ( restrictionDescr instanceof QualifiedIdentifierRestrictionDescr ) {
            visit( (QualifiedIdentifierRestrictionDescr) restrictionDescr );
        } else if ( restrictionDescr instanceof ReturnValueRestrictionDescr ) {
            visit( (ReturnValueRestrictionDescr) restrictionDescr );
        } else if ( restrictionDescr instanceof VariableRestrictionDescr ) {
            visit( (VariableRestrictionDescr) restrictionDescr );
        } else if ( restrictionDescr instanceof PredicateDescr ) {
            visit( (PredicateDescr) restrictionDescr );
        } else if ( restrictionDescr instanceof RestrictionConnectiveDescr ) {
            visit( (RestrictionConnectiveDescr) restrictionDescr );
        } else {
            throw new UnknownDescriptionException( restrictionDescr );
        }
    }

    private void visit(List<RestrictionDescr> restrictions) throws UnknownDescriptionException {
        for ( RestrictionDescr restrictionDescr : restrictions ) {
            visit( restrictionDescr );
        }
    }

    private void visit(RestrictionConnectiveDescr descr) throws UnknownDescriptionException {

        if ( descr.getConnective() == RestrictionConnectiveDescr.AND ) {

            solvers.startOperator( OperatorDescrType.AND );
            visit( descr.getRestrictions() );
            solvers.endOperator();

        } else if ( descr.getConnective() == RestrictionConnectiveDescr.OR ) {

            solvers.startOperator( OperatorDescrType.OR );
            visit( descr.getRestrictions() );
            solvers.endOperator();

        } else {
            throw new UnknownDescriptionException( descr );
        }
    }

    /**
     * End
     *
     * @param descr
     */
    private void visit(LiteralRestrictionDescr descr) {

        LiteralRestriction restriction = LiteralRestriction.createRestriction( pattern,
                                                                               descr.getText() );

        restriction.setPatternIsNot( pattern.isPatternNot() );
        restriction.setConstraintPath( constraint.getPath() );
        restriction.setFieldPath( constraint.getFieldPath() );
        restriction.setOperator( Operator.determineOperator( descr.getEvaluator(),
                                                             descr.isNegated() ) );
        restriction.setOrderNumber( orderNumber );
        restriction.setParentPath( pattern.getPath() );
        restriction.setParentType( pattern.getVerifierComponentType() );

        // Set field value, if it is unset.
        field.setFieldType( restriction.getValueType() );

        data.add( restriction );
        solvers.addPatternComponent( restriction );
    }

    /**
     * End
     *
     * @param descr
     */
    private void visit(QualifiedIdentifierRestrictionDescr descr) {

        String text = descr.getText();

        String base = text.substring( 0,
                                      text.indexOf( "." ) );
        String fieldName = text.substring( text.indexOf( "." ) );

        Variable variable = data.getVariableByRuleAndVariableName( pattern.getRuleName(),
                                                                   base );

        if ( variable != null ) {

            QualifiedIdentifierRestriction restriction = new QualifiedIdentifierRestriction( pattern );

            restriction.setPatternIsNot( pattern.isPatternNot() );
            restriction.setConstraintPath( constraint.getPath() );
            restriction.setFieldPath( constraint.getFieldPath() );
            restriction.setOperator( Operator.determineOperator( descr.getEvaluator(),
                                                                 descr.isNegated() ) );
            restriction.setVariablePath( variable.getPath() );
            restriction.setVariableName( base );
            restriction.setVariablePath( fieldName );
            restriction.setOrderNumber( orderNumber );
            restriction.setParentPath( pattern.getPath() );
            restriction.setParentType( pattern.getVerifierComponentType() );

            // Set field value, if it is not set.
            field.setFieldType( Field.VARIABLE );

            variable.setObjectTypeType( VerifierComponentType.FIELD.getType() );

            data.add( restriction );
            solvers.addPatternComponent( restriction );
        } else {

            EnumField enumField = (EnumField) data.getFieldByObjectTypeAndFieldName( base,
                                                                                     fieldName );
            if ( enumField == null ) {

                ObjectType objectType = data.getObjectTypeByFullName( base );

                if ( objectType == null ) {
                    Import objectImport = data.getImportByName( base );

                    if ( objectImport != null ) {
                        objectType = ObjectTypeFactory.createObjectType( objectImport );
                    } else {
                        objectType = ObjectTypeFactory.createObjectType( base );
                    }

                    data.add( objectType );
                }

                enumField = new EnumField();

                enumField.setObjectTypePath( objectType.getPath() );
                enumField.setObjectTypeName( objectType.getName() );
                enumField.setName( fieldName );

                objectType.getFields().add( enumField );

                data.add( enumField );
            }

            EnumRestriction restriction = new EnumRestriction( pattern );

            restriction.setPatternIsNot( pattern.isPatternNot() );
            restriction.setConstraintPath( constraint.getPath() );
            restriction.setFieldPath( constraint.getFieldPath() );
            restriction.setOperator( Operator.determineOperator( descr.getEvaluator(),
                                                                 descr.isNegated() ) );
            restriction.setEnumBasePath( enumField.getPath() );
            restriction.setEnumBase( base );
            restriction.setEnumName( fieldName );
            restriction.setOrderNumber( orderNumber );
            restriction.setParentPath( pattern.getPath() );
            restriction.setParentType( pattern.getVerifierComponentType() );

            // Set field value, if it is not set.
            field.setFieldType( Field.ENUM );

            data.add( restriction );
            solvers.addPatternComponent( restriction );
        }
    }

    /**
     * End
     *
     * Foo( bar == $bar )<br>
     * $bar is a VariableRestrictionDescr
     *
     * @param descr
     */
    private void visit(VariableRestrictionDescr descr) {

        Variable variable = data.getVariableByRuleAndVariableName( pattern.getRuleName(),
                                                                   descr.getIdentifier() );
        VariableRestriction restriction = new VariableRestriction( pattern );

        restriction.setPatternIsNot( pattern.isPatternNot() );
        restriction.setConstraintPath( constraint.getPath() );
        restriction.setFieldPath( constraint.getFieldPath() );
        restriction.setOperator( Operator.determineOperator( descr.getEvaluator(),
                                                             descr.isNegated() ) );
        restriction.setVariable( variable );
        restriction.setOrderNumber( orderNumber );
        restriction.setParentPath( pattern.getPath() );
        restriction.setParentType( pattern.getVerifierComponentType() );

        // Set field value, if it is unset.
        field.setFieldType( Field.VARIABLE );

        data.add( restriction );
        solvers.addPatternComponent( restriction );
    }

    /**
     * End
     *
     * @param descr
     */
    private void visit(ReturnValueRestrictionDescr descr) {

        ReturnValueRestriction restriction = new ReturnValueRestriction( pattern );

        restriction.setPatternIsNot( pattern.isPatternNot() );
        restriction.setConstraintPath( constraint.getPath() );
        restriction.setFieldPath( constraint.getFieldPath() );
        restriction.setOperator( Operator.determineOperator( descr.getEvaluator(),
                                                             descr.isNegated() ) );
        restriction.setClassMethodName( descr.getClassMethodName() );
        restriction.setContent( descr.getContent() );
        restriction.setDeclarations( descr.getDeclarations() );
        restriction.setOrderNumber( orderNumber );
        restriction.setParentPath( pattern.getPath() );
        restriction.setParentType( pattern.getVerifierComponentType() );

        data.add( restriction );
        solvers.addPatternComponent( restriction );

    }

}
TOP

Related Classes of org.drools.verifier.visitor.FieldConstraintDescrVisitor

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.