/*
* 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.models.guided.dtable.shared.hitpolicy;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
/**
* Resolves priorities for Resolved Hit Policy.
* Helper classes Salience, RowNumber and Over are used since
* map.get(int) is different from map.get(object).
*/
public class RowPriorityResolver {
private List<RowNumber> rowOrder = new ArrayList<>();
private Map<RowNumber, Over> overs = new TreeMap<>();
public void set(final int rowNumber,
final int priorityOver) {
final RowNumber rowNumberObject = new RowNumber(rowNumber);
rowOrder.add(rowNumberObject);
if (rowNumber < priorityOver) {
throw new IllegalArgumentException("Priority over lower priority rows is not supported.");
}
if (priorityOver != 0) {
overs.put(rowNumberObject,
new Over(priorityOver));
}
}
public RowPriorities getPriorityRelations() {
sortRowsByNumber();
moveRowsBasedOnPriority();
RowPriorities rowPriorities = new RowPriorities();
// Set salience from top to bottom
Collections.reverse(rowOrder);
int salience = 0;
for (RowNumber rowNumber : rowOrder) {
rowPriorities.put(rowNumber,
new Salience(salience++));
}
return rowPriorities;
}
/**
* Move rows on top of the row it has priority over.
*/
private void moveRowsBasedOnPriority() {
for (RowNumber myNumber : overs.keySet()) {
Over over = overs.get(myNumber);
int newIndex = rowOrder.indexOf(new RowNumber(over.getOver()));
rowOrder.remove(myNumber);
rowOrder.add(newIndex,
myNumber);
}
}
private void sortRowsByNumber() {
final Comparator<RowNumber> comparator = (me, other) -> me.getRowNumber().compareTo(other.getRowNumber());
Collections.sort(rowOrder,
comparator);
}
}