/* * Copyright 2017 Red Hat, Inc. and/or its affiliates. * * 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.wizard.table.pages; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import javax.enterprise.context.Dependent; import javax.enterprise.event.Event; import javax.enterprise.event.Observes; import javax.inject.Inject; import org.drools.workbench.models.datamodel.oracle.DataType; import org.drools.workbench.models.datamodel.oracle.ModelField; import org.drools.workbench.models.datamodel.rule.BaseSingleFieldConstraint; 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.Pattern52; import org.drools.workbench.screens.guided.dtable.client.resources.i18n.GuidedDecisionTableConstants; import org.drools.workbench.screens.guided.dtable.client.widget.DTCellValueWidgetFactory; import org.drools.workbench.screens.guided.dtable.client.wizard.table.pages.events.ConditionsDefinedEvent; import org.drools.workbench.screens.guided.dtable.client.wizard.table.pages.events.DuplicatePatternsEvent; import org.kie.workbench.common.widgets.client.widget.HumanReadableDataTypes; import org.uberfire.client.callbacks.Callback; import org.uberfire.ext.widgets.core.client.wizards.WizardPageStatusChangeEvent; /** * A page for the guided Decision Table Wizard to define Fact Pattern * Constraints */ @Dependent public class FactPatternConstraintsPage extends AbstractGuidedDecisionTableWizardPage implements FactPatternConstraintsPageView.Presenter { @Inject private FactPatternConstraintsPageView view; @Inject private Event<ConditionsDefinedEvent> conditionsDefinedEvent; @Inject private Event<WizardPageStatusChangeEvent> wizardPageStatusChangeEvent; @Override public String getTitle() { return GuidedDecisionTableConstants.INSTANCE.DecisionTableWizardFactPatternConstraints(); } @Override public void initialise() { view.init( this ); view.setValidator( getValidator() ); view.setDTCellValueUtilities( cellUtilities ); view.setChosenConditions( new ArrayList<ConditionCol52>() ); //Set-up a factory for value editors view.setDTCellValueWidgetFactory( DTCellValueWidgetFactory.getInstance( model, oracle, false, allowEmptyValues() ) ); content.setWidget( view ); } @Override public void prepareView() { //Setup the available patterns, that could have changed each time this page is visited view.setAvailablePatterns( this.model.getPatterns() ); } @Override public void isComplete( final Callback<Boolean> callback ) { //Have all patterns conditions been defined? boolean areConditionsDefined = true; for ( Pattern52 p : model.getPatterns() ) { for ( ConditionCol52 c : p.getChildColumns() ) { if ( !getValidator().isConditionValid( c ) ) { areConditionsDefined = false; break; } } } //Signal Condition definitions to other pages final ConditionsDefinedEvent event = new ConditionsDefinedEvent( areConditionsDefined ); conditionsDefinedEvent.fire( event ); callback.callback( areConditionsDefined ); } public void onDuplicatePatterns( final @Observes DuplicatePatternsEvent event ) { view.setArePatternBindingsUnique( event.getArePatternBindingsUnique() ); } public void onConditionsDefined( final @Observes ConditionsDefinedEvent event ) { view.setAreConditionsDefined( event.getAreConditionsDefined() ); } @Override public void selectPattern( final Pattern52 pattern ) { //Pattern is null when programmatically deselecting an item if ( pattern == null ) { return; } //Add Fact fields final String type = pattern.getFactType(); oracle.getFieldCompletions( type, new Callback<ModelField[]>() { @Override public void callback( final ModelField[] fields ) { final List<AvailableField> availableFields = new ArrayList<AvailableField>(); for ( ModelField modelField : fields ) { final String fieldName = modelField.getName(); final String fieldType = oracle.getFieldType( type, fieldName ); final String fieldDisplayType = HumanReadableDataTypes.getUserFriendlyTypeName( fieldType ); final AvailableField field = new AvailableField( fieldName, fieldType, fieldDisplayType, BaseSingleFieldConstraint.TYPE_LITERAL ); availableFields.add( field ); } //Add predicates if ( model.getTableFormat() == GuidedDecisionTable52.TableFormat.EXTENDED_ENTRY ) { final AvailableField field = new AvailableField( GuidedDecisionTableConstants.INSTANCE.DecisionTableWizardPredicate(), BaseSingleFieldConstraint.TYPE_PREDICATE ); availableFields.add( field ); } view.setAvailableFields( availableFields ); view.setChosenConditions( pattern.getChildColumns() ); } } ); } @Override public void setChosenConditions( final Pattern52 pattern, final List<ConditionCol52> conditions ) { pattern.getChildColumns().clear(); pattern.getChildColumns().addAll( conditions ); } @Override public void getOperatorCompletions( final Pattern52 selectedPattern, final ConditionCol52 selectedCondition, final Callback<String[]> callback ) { final String factType = selectedPattern.getFactType(); final String factField = selectedCondition.getFactField(); this.oracle.getOperatorCompletions( factType, factField, new Callback<String[]>() { @Override public void callback( final String[] ops ) { //Operators "in" and "not in" are only allowed if the Calculation Type is a Literal final List<String> filteredOps = new ArrayList<String>(); for ( String op : ops ) { filteredOps.add( op ); } if ( BaseSingleFieldConstraint.TYPE_LITERAL != selectedCondition.getConstraintValueType() ) { filteredOps.remove( "in" ); filteredOps.remove( "not in" ); } final String[] displayOps = new String[ filteredOps.size() ]; filteredOps.toArray( displayOps ); callback.callback( displayOps ); } } ); } @Override public GuidedDecisionTable52.TableFormat getTableFormat() { return model.getTableFormat(); } @Override public boolean hasEnum( final Pattern52 selectedPattern, final ConditionCol52 selectedCondition ) { final String factType = selectedPattern.getFactType(); final String factField = selectedCondition.getFactField(); return oracle.hasEnums( factType, factField ); } @Override public boolean requiresValueList( final Pattern52 selectedPattern, final ConditionCol52 selectedCondition ) { //Don't show a Value List if either the Fact\Field is empty final String factType = selectedPattern.getFactType(); final String factField = selectedCondition.getFactField(); boolean enableValueList = !( ( factType == null || "".equals( factType ) ) || ( factField == null || "".equals( factField ) ) ); //Don't show Value List if operator does not accept one if ( enableValueList ) { enableValueList = validator.doesOperatorAcceptValueList( selectedCondition ); } //Don't show a Value List if the Fact\Field has an enumeration if ( enableValueList ) { enableValueList = !oracle.hasEnums( factType, factField ); } return enableValueList; } @Override public void assertDefaultValue( final Pattern52 selectedPattern, final ConditionCol52 selectedCondition ) { final List<String> valueList = Arrays.asList( columnUtilities.getValueList( selectedCondition ) ); if ( valueList.size() > 0 ) { final String defaultValue = cellUtilities.asString( selectedCondition.getDefaultValue() ); if ( !valueList.contains( defaultValue ) ) { selectedCondition.getDefaultValue().clearValues(); } } else { //Ensure the Default Value has been updated to represent the column's data-type. final DTCellValue52 defaultValue = selectedCondition.getDefaultValue(); final DataType.DataTypes dataType = columnUtilities.getDataType( selectedPattern, selectedCondition ); cellUtilities.convertDTCellValueType( dataType, defaultValue ); } } @Override public void stateChanged() { final WizardPageStatusChangeEvent event = new WizardPageStatusChangeEvent( this ); wizardPageStatusChangeEvent.fire( event ); } }