/* * Copyright 2011 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.widget; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; import com.google.gwt.event.shared.EventBus; import org.drools.workbench.models.datamodel.oracle.DataType; import org.drools.workbench.models.datamodel.rule.IPattern; import org.drools.workbench.models.datamodel.rule.InterpolationVariable; import org.drools.workbench.models.datamodel.rule.RuleModel; import org.drools.workbench.models.guided.dtable.shared.model.BRLColumn; import org.drools.workbench.models.guided.dtable.shared.model.BRLConditionColumn; import org.drools.workbench.models.guided.dtable.shared.model.BRLConditionVariableColumn; import org.drools.workbench.models.guided.dtable.shared.model.BRLRuleModel; import org.drools.workbench.models.guided.dtable.shared.model.CompositeColumn; import org.drools.workbench.models.guided.dtable.shared.model.GuidedDecisionTable52; import org.drools.workbench.screens.guided.dtable.client.resources.i18n.GuidedDecisionTableConstants; import org.drools.workbench.screens.guided.dtable.client.widget.table.GuidedDecisionTableView; import org.drools.workbench.screens.guided.rule.client.editor.RuleModellerConfiguration; import org.kie.workbench.common.widgets.client.datamodel.AsyncPackageDataModelOracle; /** * An editor for a BRL Condition Columns */ public class BRLConditionColumnViewImpl extends AbstractBRLColumnViewImpl<IPattern, BRLConditionVariableColumn> implements BRLConditionColumnView { public BRLConditionColumnViewImpl( final GuidedDecisionTable52 model, final AsyncPackageDataModelOracle oracle, final GuidedDecisionTableView.Presenter presenter, final EventBus eventBus, final BRLConditionColumn column, final boolean isNew, final boolean isReadOnly ) { super( model, oracle, presenter, eventBus, column, isNew, isReadOnly ); } @Override public String getTitle() { return GuidedDecisionTableConstants.INSTANCE.ConditionBRLFragmentConfiguration(); } protected boolean isHeaderUnique( String header ) { for ( CompositeColumn<?> cc : model.getConditions() ) { for ( int iChild = 0; iChild < cc.getChildColumns().size(); iChild++ ) { if ( cc.getChildColumns().get( iChild ).getHeader().equals( header ) ) { return false; } } } return true; } public BRLRuleModel getRuleModel( BRLColumn<IPattern, BRLConditionVariableColumn> column ) { BRLRuleModel ruleModel = new BRLRuleModel( model ); List<IPattern> definition = column.getDefinition(); ruleModel.lhs = definition.toArray( new IPattern[ definition.size() ] ); return ruleModel; } public RuleModellerConfiguration getRuleModellerConfiguration() { return new RuleModellerConfiguration( false, true, true, true ); } @Override protected void doInsertColumn() { this.editingCol.setDefinition( Arrays.asList( this.ruleModel.lhs ) ); presenter.appendColumn( (BRLConditionColumn) this.editingCol ); } @Override protected void doUpdateColumn() { this.editingCol.setDefinition( Arrays.asList( this.ruleModel.lhs ) ); presenter.updateColumn( (BRLConditionColumn) this.originalCol, (BRLConditionColumn) this.editingCol ); } @Override protected List<BRLConditionVariableColumn> convertInterpolationVariables( Map<InterpolationVariable, Integer> ivs ) { //If there are no variables add a boolean column to specify whether the fragment should apply if ( ivs.isEmpty() ) { BRLConditionVariableColumn variable = new BRLConditionVariableColumn( "", DataType.TYPE_BOOLEAN ); variable.setHeader( editingCol.getHeader() ); variable.setHideColumn( editingCol.isHideColumn() ); List<BRLConditionVariableColumn> variables = new ArrayList<BRLConditionVariableColumn>(); variables.add( variable ); return variables; } //Convert to columns for use in the Decision Table BRLConditionVariableColumn[] variables = new BRLConditionVariableColumn[ ivs.size() ]; for ( Map.Entry<InterpolationVariable, Integer> me : ivs.entrySet() ) { InterpolationVariable iv = me.getKey(); int index = me.getValue(); BRLConditionVariableColumn variable = new BRLConditionVariableColumn( iv.getVarName(), iv.getDataType(), iv.getFactType(), iv.getFactField() ); variable.setHeader( editingCol.getHeader() ); variable.setHideColumn( editingCol.isHideColumn() ); variables[ index ] = variable; } //Convert the array into a mutable list (Arrays.toList provides an immutable list) List<BRLConditionVariableColumn> variableList = new ArrayList<BRLConditionVariableColumn>(); for ( BRLConditionVariableColumn variable : variables ) { variableList.add( variable ); } return variableList; } @Override protected BRLColumn<IPattern, BRLConditionVariableColumn> cloneBRLColumn( BRLColumn<IPattern, BRLConditionVariableColumn> col ) { BRLConditionColumn clone = new BRLConditionColumn(); clone.setHeader( col.getHeader() ); clone.setHideColumn( col.isHideColumn() ); clone.setDefinition( cloneDefinition( col.getDefinition() ) ); clone.setChildColumns( cloneVariables( col.getChildColumns() ) ); return clone; } private List<BRLConditionVariableColumn> cloneVariables( List<BRLConditionVariableColumn> variables ) { List<BRLConditionVariableColumn> clone = new ArrayList<BRLConditionVariableColumn>(); for ( BRLConditionVariableColumn variable : variables ) { clone.add( cloneVariable( variable ) ); } return clone; } private BRLConditionVariableColumn cloneVariable( BRLConditionVariableColumn variable ) { BRLConditionVariableColumn clone = new BRLConditionVariableColumn( variable.getVarName(), variable.getFieldType(), variable.getFactType(), variable.getFactField() ); clone.setHeader( variable.getHeader() ); clone.setHideColumn( variable.isHideColumn() ); clone.setWidth( variable.getWidth() ); return clone; } private List<IPattern> cloneDefinition( List<IPattern> definition ) { RuleModelCloneVisitor visitor = new RuleModelCloneVisitor(); RuleModel rm = new RuleModel(); for ( IPattern pattern : definition ) { rm.addLhsItem( pattern ); } RuleModel rmClone = visitor.visitRuleModel( rm ); List<IPattern> clone = new ArrayList<IPattern>(); for ( IPattern pattern : rmClone.lhs ) { clone.add( pattern ); } return clone; } }