Package org.drools.workbench.screens.guided.dtable.client.widget.analysis

Source Code of org.drools.workbench.screens.guided.dtable.client.widget.analysis.DecisionTableAnalyzer

/*
* Copyright 2011 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.workbench.screens.guided.dtable.client.widget.analysis;

import org.drools.workbench.models.commons.shared.oracle.PackageDataModelOracle;
import org.drools.workbench.models.commons.shared.oracle.model.DataType;
import org.drools.workbench.screens.guided.dtable.client.widget.analysis.action.ActionDetector;
import org.drools.workbench.screens.guided.dtable.client.widget.analysis.action.ActionDetectorKey;
import org.drools.workbench.screens.guided.dtable.client.widget.analysis.action.InsertFactActionDetectorKey;
import org.drools.workbench.screens.guided.dtable.client.widget.analysis.action.SetFieldColActionDetectorKey;
import org.drools.workbench.screens.guided.dtable.client.widget.analysis.action.UnrecognizedActionDetectorKey;
import org.drools.workbench.screens.guided.dtable.client.widget.analysis.condition.BooleanConditionDetector;
import org.drools.workbench.screens.guided.dtable.client.widget.analysis.condition.ConditionDetector;
import org.drools.workbench.screens.guided.dtable.client.widget.analysis.condition.DateConditionDetector;
import org.drools.workbench.screens.guided.dtable.client.widget.analysis.condition.EnumConditionDetector;
import org.drools.workbench.screens.guided.dtable.client.widget.analysis.condition.NumericBigDecimalConditionDetector;
import org.drools.workbench.screens.guided.dtable.client.widget.analysis.condition.NumericBigIntegerConditionDetector;
import org.drools.workbench.screens.guided.dtable.client.widget.analysis.condition.NumericByteConditionDetector;
import org.drools.workbench.screens.guided.dtable.client.widget.analysis.condition.NumericConditionDetector;
import org.drools.workbench.screens.guided.dtable.client.widget.analysis.condition.NumericDoubleConditionDetector;
import org.drools.workbench.screens.guided.dtable.client.widget.analysis.condition.NumericFloatConditionDetector;
import org.drools.workbench.screens.guided.dtable.client.widget.analysis.condition.NumericIntegerConditionDetector;
import org.drools.workbench.screens.guided.dtable.client.widget.analysis.condition.NumericLongConditionDetector;
import org.drools.workbench.screens.guided.dtable.client.widget.analysis.condition.NumericShortConditionDetector;
import org.drools.workbench.screens.guided.dtable.client.widget.analysis.condition.StringConditionDetector;
import org.drools.workbench.screens.guided.dtable.client.widget.analysis.condition.UnrecognizedConditionDetector;
import org.drools.workbench.models.guided.dtable.shared.model.ActionCol52;
import org.drools.workbench.models.guided.dtable.shared.model.ActionInsertFactCol52;
import org.drools.workbench.models.guided.dtable.shared.model.ActionSetFieldCol52;
import org.drools.workbench.models.guided.dtable.shared.model.Analysis;
import org.drools.workbench.models.guided.dtable.shared.model.BRLActionColumn;
import org.drools.workbench.models.guided.dtable.shared.model.ConditionCol52;
import org.drools.workbench.models.guided.dtable.shared.model.DTCellValue52;
import org.drools.workbench.models.guided.dtable.shared.model.GuidedDecisionTable52;
import org.drools.workbench.models.guided.dtable.shared.model.LimitedEntryCol;
import org.drools.workbench.models.guided.dtable.shared.model.Pattern52;
import org.drools.workbench.screens.guided.dtable.model.GuidedDecisionTableUtils;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class DecisionTableAnalyzer {

    private final PackageDataModelOracle oracle;

    public DecisionTableAnalyzer( final PackageDataModelOracle oracle ) {
        this.oracle = oracle;
    }

    @SuppressWarnings("rawtypes")
    public List<Analysis> analyze( final GuidedDecisionTable52 model ) {
        final GuidedDecisionTableUtils utils = new GuidedDecisionTableUtils( oracle,
                                                                             model );
        final List<List<DTCellValue52>> data = model.getData();
        final List<Analysis> analysisData = new ArrayList<Analysis>( data.size() );
        final List<RowDetector> rowDetectorList = new ArrayList<RowDetector>( data.size() );

        for ( List<DTCellValue52> row : data ) {
            final Integer rowNumber = ( (Integer) row.get( 0 ).getNumericValue() ) - 1;
            RowDetector rowDetector = new RowDetector( rowNumber );
            for ( Pattern52 pattern : model.getPatterns() ) {
                for ( ConditionCol52 conditionCol : pattern.getChildColumns() ) {
                    int columnIndex = model.getExpandedColumns().indexOf( conditionCol );
                    DTCellValue52 visibleCellValue = row.get( columnIndex );
                    DTCellValue52 realCellValue;
                    boolean cellIsNotBlank;
                    if ( conditionCol instanceof LimitedEntryCol ) {
                        realCellValue = ( (LimitedEntryCol) conditionCol ).getValue();
                        cellIsNotBlank = visibleCellValue.getBooleanValue();
                    } else {
                        realCellValue = visibleCellValue;
                        cellIsNotBlank = visibleCellValue.hasValue();
                    }
                    // Blank cells are ignored
                    if ( cellIsNotBlank ) {
                        ConditionDetector conditionDetector = buildConditionDetector( utils,
                                                                                      pattern,
                                                                                      conditionCol,
                                                                                      realCellValue );
                        rowDetector.putOrMergeConditionDetector( conditionDetector );
                    }
                }
            }
            for ( ActionCol52 actionCol : model.getActionCols() ) {
                //BRLActionColumns cannot be analysed
                if ( actionCol instanceof BRLActionColumn ) {
                    continue;
                }
                int columnIndex = model.getExpandedColumns().indexOf( actionCol );
                DTCellValue52 visibleCellValue = row.get( columnIndex );
                DTCellValue52 realCellValue;
                boolean cellIsNotBlank;
                if ( actionCol instanceof LimitedEntryCol ) {
                    realCellValue = ( (LimitedEntryCol) actionCol ).getValue();
                    cellIsNotBlank = visibleCellValue.getBooleanValue();
                } else {
                    realCellValue = visibleCellValue;
                    cellIsNotBlank = visibleCellValue.hasValue();
                }
                // Blank cells are ignored
                if ( cellIsNotBlank ) {
                    ActionDetector actionDetector = buildActionDetector( model,
                                                                         actionCol,
                                                                         realCellValue );
                    rowDetector.putOrMergeActionDetector( actionDetector );
                }
            }
            rowDetectorList.add( rowDetector );
        }
        for ( RowDetector rowDetector : rowDetectorList ) {
            analysisData.add( rowDetector.buildAnalysis( rowDetectorList ) );
        }
        return analysisData;
    }

    @SuppressWarnings("rawtypes")
    private ConditionDetector buildConditionDetector( GuidedDecisionTableUtils utils,
                                                      Pattern52 pattern,
                                                      ConditionCol52 conditionCol,
                                                      DTCellValue52 realCellValue ) {
        String factField = conditionCol.getFactField();
        String operator = conditionCol.getOperator();
        String type = utils.getType( conditionCol );
        // Retrieve "Guvnor" enums
        String[] allValueList = utils.getValueList( conditionCol );
        ConditionDetector newDetector;
        if ( allValueList.length != 0 ) {
            // Guvnor enum
            newDetector = new EnumConditionDetector( pattern,
                                                     factField,
                                                     Arrays.asList( allValueList ),
                                                     realCellValue.getStringValue(),
                                                     operator );
        } else if ( type == null ) {
            // type null means the field is free-format
            newDetector = new UnrecognizedConditionDetector( pattern,
                                                             factField,
                                                             operator );
        } else if ( type.equals( DataType.TYPE_STRING ) ) {
            newDetector = new StringConditionDetector( pattern,
                                                       factField,
                                                       realCellValue.getStringValue(),
                                                       operator );
        } else if ( type.equals( DataType.TYPE_NUMERIC ) ) {
            newDetector = new NumericConditionDetector( pattern,
                                                        factField,
                                                        (BigDecimal) realCellValue.getNumericValue(),
                                                        operator );
        } else if ( type.equals( DataType.TYPE_NUMERIC_BIGDECIMAL ) ) {
            newDetector = new NumericBigDecimalConditionDetector( pattern,
                                                                  factField,
                                                                  (BigDecimal) realCellValue.getNumericValue(),
                                                                  operator );
        } else if ( type.equals( DataType.TYPE_NUMERIC_BIGINTEGER ) ) {
            newDetector = new NumericBigIntegerConditionDetector( pattern,
                                                                  factField,
                                                                  (BigInteger) realCellValue.getNumericValue(),
                                                                  operator );
        } else if ( type.equals( DataType.TYPE_NUMERIC_BYTE ) ) {
            newDetector = new NumericByteConditionDetector( pattern,
                                                            factField,
                                                            (Byte) realCellValue.getNumericValue(),
                                                            operator );
        } else if ( type.equals( DataType.TYPE_NUMERIC_DOUBLE ) ) {
            newDetector = new NumericDoubleConditionDetector( pattern,
                                                              factField,
                                                              (Double) realCellValue.getNumericValue(),
                                                              operator );
        } else if ( type.equals( DataType.TYPE_NUMERIC_FLOAT ) ) {
            newDetector = new NumericFloatConditionDetector( pattern,
                                                             factField,
                                                             (Float) realCellValue.getNumericValue(),
                                                             operator );
        } else if ( type.equals( DataType.TYPE_NUMERIC_INTEGER ) ) {
            newDetector = new NumericIntegerConditionDetector( pattern,
                                                               factField,
                                                               (Integer) realCellValue.getNumericValue(),
                                                               operator );
        } else if ( type.equals( DataType.TYPE_NUMERIC_LONG ) ) {
            newDetector = new NumericLongConditionDetector( pattern,
                                                            factField,
                                                            (Long) realCellValue.getNumericValue(),
                                                            operator );
        } else if ( type.equals( DataType.TYPE_NUMERIC_SHORT ) ) {
            newDetector = new NumericShortConditionDetector( pattern,
                                                             factField,
                                                             (Short) realCellValue.getNumericValue(),
                                                             operator );
        } else if ( type.equals( DataType.TYPE_BOOLEAN ) ) {
            newDetector = new BooleanConditionDetector( pattern,
                                                        factField,
                                                        realCellValue.getBooleanValue(),
                                                        operator );
        } else if ( type.equals( DataType.TYPE_DATE ) ) {
            newDetector = new DateConditionDetector( pattern,
                                                     factField,
                                                     realCellValue.getDateValue(),
                                                     operator );
        } else {
            newDetector = new UnrecognizedConditionDetector( pattern,
                                                             factField,
                                                             operator );
        }
        return newDetector;
    }

    private ActionDetector buildActionDetector( GuidedDecisionTable52 model,
                                                ActionCol52 actionCol,
                                                DTCellValue52 realCellValue ) {
        ActionDetectorKey key;
        if ( actionCol instanceof ActionSetFieldCol52 ) {
            key = new SetFieldColActionDetectorKey( (ActionSetFieldCol52) actionCol );
        } else if ( actionCol instanceof ActionInsertFactCol52 ) {
            key = new InsertFactActionDetectorKey( (ActionInsertFactCol52) actionCol );
        } else {
            key = new UnrecognizedActionDetectorKey( actionCol );
        }
        return new ActionDetector( key,
                                   realCellValue );
    }

}
TOP

Related Classes of org.drools.workbench.screens.guided.dtable.client.widget.analysis.DecisionTableAnalyzer

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.