/* * 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.analysis; import java.util.ArrayList; import java.util.List; import org.drools.workbench.models.guided.dtable.shared.model.BRLActionColumn; import org.drools.workbench.models.guided.dtable.shared.model.BRLActionVariableColumn; 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.BRLVariableColumn; import org.drools.workbench.models.guided.dtable.shared.model.BaseColumn; import org.drools.workbench.models.guided.dtable.shared.model.GuidedDecisionTable52; import org.drools.workbench.services.verifier.api.client.index.BRLAction; import org.drools.workbench.services.verifier.plugin.client.DTableUpdateManager; import org.kie.workbench.common.widgets.decoratedgrid.client.widget.data.Coordinate; import org.uberfire.commons.validation.PortablePreconditions; public class DecisionTableAnalyzer { private final DTableUpdateManager updateManager; private final VerifierWebWorkerConnection analyzer; private final GuidedDecisionTable52 model; private final EventManager eventManager = new EventManager(); public DecisionTableAnalyzer( final GuidedDecisionTable52 model, final DTableUpdateManager updateManager, final VerifierWebWorkerConnection connection ) { this.model = PortablePreconditions.checkNotNull( "model", model ); this.updateManager = PortablePreconditions.checkNotNull( "updateManager", updateManager ); this.analyzer = PortablePreconditions.checkNotNull( "connection", connection ); } public void analyze( final List<Coordinate> updates ) { updateManager.update( model, convert( updates ) ); } private List<org.drools.workbench.services.verifier.plugin.client.Coordinate> convert( final List<Coordinate> updates ) { final ArrayList<org.drools.workbench.services.verifier.plugin.client.Coordinate> result = new ArrayList<>(); for ( final Coordinate coordinate : updates ) { result.add( new org.drools.workbench.services.verifier.plugin.client.Coordinate( coordinate.getRow(), coordinate.getCol() ) ); } return result; } public void deleteColumns( final int firstColumnIndex, final int numberOfColumns ) { updateManager.deleteColumns( firstColumnIndex, numberOfColumns ); } public void insertColumn( final BaseColumn baseColumn ) { updateManager.newColumn( model, getColumnIndex( baseColumn ) ); } private int getColumnIndex( final BaseColumn baseColumn ) { List<BaseColumn> cols = model.getExpandedColumns(); final int indexOf = cols .indexOf( baseColumn ); if ( indexOf < 0 ) { if ( baseColumn instanceof BRLConditionColumn ) { for ( final BaseColumn column : model.getExpandedColumns() ) { if ( column instanceof BRLConditionVariableColumn ) { if ( ( (BRLConditionColumn) baseColumn ).getChildColumns() .contains( column ) ) { return model.getExpandedColumns() .indexOf( column ); } } } throw new IllegalArgumentException( "Could not find BRLConditionColumn: " + baseColumn.toString() ); } if ( baseColumn instanceof BRLActionColumn) { for ( final BaseColumn column : model.getExpandedColumns() ) { if ( column instanceof BRLActionVariableColumn) { if ( ( (BRLActionColumn) baseColumn ).getChildColumns() .contains( column ) ) { return model.getExpandedColumns() .indexOf( column ); } } } throw new IllegalArgumentException( "Could not find BRLActionColumn: " + baseColumn.toString() ); } else if ( baseColumn instanceof BRLVariableColumn ) { return model.getExpandedColumns() .indexOf( model.getBRLColumn( (BRLVariableColumn) baseColumn ) ); } else { throw new IllegalArgumentException( "Could not find baseColumn: " + baseColumn.toString() ); } } else { return indexOf; } } public void updateColumns( final int amountOfRows ) { if ( eventManager.rowDeleted != null ) { updateManager.removeRule(eventManager.rowDeleted ); } else { updateManager.makeRule( model, eventManager.getNewIndex() ); } eventManager.clear(); } public void deleteRow( final int index ) { eventManager.rowDeleted = index; } public void appendRow() { eventManager.rowAppended = true; } public void insertRow( final int index ) { eventManager.rowInserted = index; } public void activate() { analyzer.activate(); } public void terminate() { analyzer.terminate(); } class EventManager { boolean rowAppended = false; Integer rowInserted = null; Integer rowDeleted = null; public void clear() { rowAppended = false; rowInserted = null; rowDeleted = null; } int getNewIndex() { if ( eventManager.rowAppended ) { return model.getData() .size() - 1; } else if ( eventManager.rowInserted != null ) { return eventManager.rowInserted; } throw new IllegalStateException( "There are no active updates" ); } } }