blob: ff5e5b118affeb5f3fb935ca8445dfcd65c1df9b [file] [log] [blame]
/*
* Copyright (C) 2012 The Android Open Source Project
*
* 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 com.motorolamobility.preflighting.ui.tabs;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
import org.eclipse.jface.viewers.ComboBoxCellEditor;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Layout;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import com.motorolamobility.preflighting.core.checker.CheckerDescription;
import com.motorolamobility.preflighting.core.checker.condition.Condition;
import com.motorolamobility.preflighting.core.validation.ValidationManager;
import com.motorolamobility.preflighting.ui.PreflightingUIPlugin;
import com.motorolamobility.preflighting.ui.i18n.PreflightingUiNLS;
/**
* This class represents the Checkers Tab on the App Validador preference page.
*/
public class CheckersTabComposite extends AbstractAppValidatorTabComposite
{
private final class CheckersColumnSelectionAdapter extends SelectionAdapter
{
private int columnIndex;
public CheckersColumnSelectionAdapter(int columnIndex)
{
this.columnIndex = columnIndex;
}
@Override
public void widgetSelected(SelectionEvent e)
{
checkersTableComparator.setColumn(columnIndex);
checkersTableViewer.getTable().setSortColumn((TableColumn) e.getSource());
checkersTableViewer.getTable().setSortDirection(
checkersTableComparator.getSwtDirection());
checkersTableViewer.refresh();
super.widgetSelected(e);
}
}
private final class ConditionsColumnSelectionAdapter extends SelectionAdapter
{
private int columnIndex;
public ConditionsColumnSelectionAdapter(int columnIndex)
{
this.columnIndex = columnIndex;
}
@Override
public void widgetSelected(SelectionEvent e)
{
conditionsTableComparator.setColumn(columnIndex);
conditionsTableViewer.getTable().setSortColumn((TableColumn) e.getSource());
conditionsTableViewer.getTable().setSortDirection(
conditionsTableComparator.getSwtDirection());
conditionsTableViewer.refresh();
super.widgetSelected(e);
}
}
private static final String NO_CHECKERS_SELECTED = "none"; //$NON-NLS-1$
/**
* Checkers table label provider, provides Cell Text and Tooltip
*/
public class CheckersLabelProvider extends CellLabelProvider
{
/*
* Display time in seconds
*/
private static final int TOOLTIP_DISPLAYTIME = 10;
/*
* (non-Javadoc)
* @see org.eclipse.jface.viewers.CellLabelProvider#update(org.eclipse.jface.viewers.ViewerCell)
*/
@Override
public void update(ViewerCell cell)
{
String text = "";
int columnIndex = cell.getColumnIndex();
CheckerDescription checkerDescription = (CheckerDescription) cell.getElement();
switch (columnIndex)
{
case NAME_COLUMN_INDEX:
text = checkerDescription.getName();
break;
case ID_COLUMN_INDEX:
text = checkerDescription.getId();
break;
case CHECKER_PARAMS_COLUMN_INDEX:
String checkerId = checkerDescription.getId();
text = checkerParams.containsKey(checkerId) ? checkerParams.get(checkerId) : "";
break;
case CHECKER_CHANGE_WARNING_LEVEL_COLUMN_INDEX:
text =
getWarningLevelText(customCheckersWarningLevels.get(checkerDescription
.getId()));
break;
default:
break;
}
cell.setText(text);
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.viewers.CellLabelProvider#getToolTipDisplayDelayTime(java.lang.Object)
*/
@Override
public int getToolTipDisplayDelayTime(Object object)
{
return 200;
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.viewers.CellLabelProvider#getToolTipTimeDisplayed(java.lang.Object)
*/
@Override
public int getToolTipTimeDisplayed(Object object)
{
return TOOLTIP_DISPLAYTIME * 1000;
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.viewers.CellLabelProvider#getToolTipText(java.lang.Object)
*/
@Override
public String getToolTipText(Object element)
{
CheckerDescription checkerDescription = (CheckerDescription) element;
return checkerDescription.getDescription();
}
}
/**
* Conditions table label provider, provides Cell Text and Tooltip
*/
public class ConditionsLabelProvider extends CellLabelProvider
{
/*
* Display time in seconds
*/
private static final int TOOLTIP_DISPLAYTIME = 10;
@Override
public void update(ViewerCell cell)
{
String text = "";
int columnIndex = cell.getColumnIndex();
Condition condition = (Condition) cell.getElement();
switch (columnIndex)
{
case NAME_COLUMN_INDEX:
text = condition.getName();
break;
case ID_COLUMN_INDEX:
text = condition.getId();
break;
case CONDITION_WARNING_LEVEL_COLUMN_INDEX:
text = condition.getSeverityLevel().toString();
break;
case CONDITION_CHANGE_WARNING_LEVEL_COLUMN_INDEX:
text =
getWarningLevelText(customConditionsWarningLevels
.get(condition.getId()));
break;
default:
break;
}
cell.setText(text);
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.viewers.CellLabelProvider#getToolTipDisplayDelayTime(java.lang.Object)
*/
@Override
public int getToolTipDisplayDelayTime(Object object)
{
return 200;
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.viewers.CellLabelProvider#getToolTipTimeDisplayed(java.lang.Object)
*/
@Override
public int getToolTipTimeDisplayed(Object object)
{
return TOOLTIP_DISPLAYTIME * 1000;
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.viewers.CellLabelProvider#getToolTipText(java.lang.Object)
*/
@Override
public String getToolTipText(Object element)
{
Condition condition = (Condition) element;
return condition.getDescription();
}
}
/**
* Checkers Table content provider
*/
public class CheckersContentProvider implements IStructuredContentProvider
{
@SuppressWarnings("unchecked")
public Object[] getElements(Object inputElement)
{
List<CheckerDescription> checkersDescription = (List<CheckerDescription>) inputElement;
return checkersDescription.toArray();
}
public void dispose()
{
//do nothing
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
{
//do nothing
}
}
/**
* Conditions Table content provider
*/
public class ConditionsContentProvider implements IStructuredContentProvider
{
@SuppressWarnings("unchecked")
public Object[] getElements(Object inputElement)
{
List<Condition> conditions = (List<Condition>) inputElement;
return conditions.toArray();
}
public void dispose()
{
//do nothing
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
{
//do nothing
}
}
/**
* Table comparator
* Add sort functionality for checkers
*/
private class CheckersTableComparator extends ViewerComparator
{
private final int ORDER_ASC = 1;
private final int ORDER_DESC = -1;
/**
* Column that must be used to sort elements
*/
private int column = -1;
private int direction = ORDER_ASC;
public void setColumn(int column)
{
if (this.column == column)
{
direction = direction == ORDER_ASC ? ORDER_DESC : ORDER_ASC;
}
else
{
this.column = column;
direction = ORDER_ASC;
}
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.viewers.ViewerComparator#compare(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
*/
@Override
public int compare(Viewer viewer, Object e1, Object e2)
{
CheckerDescription checkerLeft = (CheckerDescription) e1;
CheckerDescription checkerRight = (CheckerDescription) e2;
String left = ""; //$NON-NLS-1$
String right = ""; //$NON-NLS-1$
switch (column)
{
case NAME_COLUMN_INDEX:
left = checkerLeft.getName();
right = checkerRight.getName();
break;
case ID_COLUMN_INDEX:
left = checkerLeft.getId();
right = checkerRight.getId();
break;
case CHECKER_PARAMS_COLUMN_INDEX:
String leftParams = checkerParams.get(checkerLeft.getId());
String rightParams = checkerParams.get(checkerRight.getId());
left = ((leftParams != null) ? leftParams : "");
right = ((rightParams != null) ? rightParams : "");
break;
case CHECKER_CHANGE_WARNING_LEVEL_COLUMN_INDEX:
Boolean leftWarningLevel = customCheckersWarningLevels.get(checkerLeft.getId());
Boolean rightWarningLevel =
customCheckersWarningLevels.get(checkerRight.getId());
left = ((leftWarningLevel != null) ? leftWarningLevel.toString() : "");
right = ((rightWarningLevel != null) ? rightWarningLevel.toString() : "");
break;
default:
break;
}
return left.compareTo(right) * direction;
}
/**
* Returns the SWT constant which represents the direction
* @return
*/
public int getSwtDirection()
{
return direction == ORDER_ASC ? SWT.UP : SWT.DOWN;
}
}
/**
* Conditions comparator
* Add sort functionality for checkers
*/
private class ConditionsTableComparator extends ViewerComparator
{
private final int ORDER_ASC = 1;
private final int ORDER_DESC = -1;
/**
* Column that must be used to sort elements
*/
private int column = -1;
private int direction = ORDER_ASC;
public void setColumn(int column)
{
if (this.column == column)
{
direction = direction == ORDER_ASC ? ORDER_DESC : ORDER_ASC;
}
else
{
this.column = column;
direction = ORDER_ASC;
}
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.viewers.ViewerComparator#compare(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
*/
@Override
public int compare(Viewer viewer, Object e1, Object e2)
{
Condition conditionLeft = (Condition) e1;
Condition conditionRight = (Condition) e2;
String left = ""; //$NON-NLS-1$
String right = ""; //$NON-NLS-1$
switch (column)
{
case NAME_COLUMN_INDEX:
left = conditionLeft.getName();
right = conditionRight.getName();
break;
case ID_COLUMN_INDEX:
left = conditionLeft.getId();
right = conditionRight.getId();
break;
case CHECKER_PARAMS_COLUMN_INDEX:
left = conditionLeft.getSeverityLevel().toString();
right = conditionRight.getSeverityLevel().toString();
break;
case CHECKER_CHANGE_WARNING_LEVEL_COLUMN_INDEX:
Boolean leftWarningLevel =
customConditionsWarningLevels.get(conditionLeft.getId());
Boolean rightWarningLevel =
customConditionsWarningLevels.get(conditionRight.getId());
left = ((leftWarningLevel != null) ? leftWarningLevel.toString() : "");
right = ((rightWarningLevel != null) ? rightWarningLevel.toString() : "");
break;
default:
break;
}
return left.compareTo(right) * direction;
}
/**
* Returns the SWT constant which represents the direction
* @return
*/
public int getSwtDirection()
{
return direction == ORDER_ASC ? SWT.UP : SWT.DOWN;
}
}
/*
* Table columns
*/
private static final int NAME_COLUMN_INDEX = 0;
private static final int ID_COLUMN_INDEX = 1;
private static final int CONDITION_WARNING_LEVEL_COLUMN_INDEX = 2;
private static final int CONDITION_CHANGE_WARNING_LEVEL_COLUMN_INDEX = 3;
private static final int CHECKER_PARAMS_COLUMN_INDEX = 2;
private static final int CHECKER_CHANGE_WARNING_LEVEL_COLUMN_INDEX = 3;
/**
* The Checkers TableViewer
*/
private CheckboxTableViewer checkersTableViewer;
/**
* The Conditions TableViewer
*/
private CheckboxTableViewer conditionsTableViewer;
/**
* The Select All checkbox for checkers
*/
private Button selectAllCheckersCheck;
/**
* The Select All checkbox for conditions
*/
private Button selectAllConditionsCheck;
/**
* A list with all CheckerDescription
*/
private List<CheckerDescription> checkersDescriptions;
/**
* The model which keeps checker params, Key is checkerId and value is the Parameters String
*/
private Map<String, String> checkerParams;
/**
* The model which keeps the custom warning levels, Key is checkerId and value is a Boolean that indicates:
* true -> increases warning level
* false -> decreases warning level
* null and/or inexistent -> no change
*/
private Map<String, Boolean> customCheckersWarningLevels = new HashMap<String, Boolean>();
private Map<String, Boolean> customConditionsWarningLevels = new HashMap<String, Boolean>();
/**
* The model which keeps all conditions, Key is checkerId and value is a list of its conditions
*/
private Map<String, List<Condition>> allConditionsMap = new HashMap<String, List<Condition>>();
/**
* The model which keeps only the selected conditions, Key is checkerId and value is a list of its selected conditions
*/
private Map<String, List<Condition>> selectedConditionsMap =
new HashMap<String, List<Condition>>();
/**
* Warning Level Operations (increase, keep, decrease)
* Currently, it's not possible to set the warning level, you can only increase or decrease it
*/
private String[] WarningLevelOperations =
{
PreflightingUiNLS.CheckersTabComposite_WarningLevel_Operation_Increase,
PreflightingUiNLS.CheckersTabComposite_WarningLevel_Operation_Kepp,
PreflightingUiNLS.CheckersTabComposite_WarningLevel_Operation_Decrease
};
/**
* Checkers table comparator, used for sort functionality
*/
private CheckersTableComparator checkersTableComparator;
/**
* Conditions table comparator, used for sort functionality
*/
private ConditionsTableComparator conditionsTableComparator;
/**
* Return the text that represents the warning level change, which is
* saved as a boolean
*
* true -> increases warning level
* false -> decreases warning level
* null -> no change
*
* @param action the value stored
* @return the corresponding warning level operation
*/
public String getWarningLevelText(Boolean action)
{
String result = PreflightingUiNLS.CheckersTabComposite_WarningLevel_Operation_Kepp;
if (action != null)
{
if (action)
{
result = PreflightingUiNLS.CheckersTabComposite_WarningLevel_Operation_Increase;
}
else
{
result = PreflightingUiNLS.CheckersTabComposite_WarningLevel_Operation_Decrease;
}
}
return result;
}
/**
* Initialize all UI items
*
* @param parent the parent composite
* @param style the SWT styles
* @param preferenceStore the preference store
*/
public CheckersTabComposite(Composite parent, int style, IPreferenceStore preferenceStore)
{
super(parent, style);
Layout layout = new GridLayout(1, false);
this.setLayout(layout);
createCheckersComposite();
init(preferenceStore);
}
/**
* Creates the composite which will have the checkers and also
* the conditions selection
*/
private void createCheckersComposite()
{
Layout layout;
Composite composite = new Composite(this, SWT.NONE);
layout = new GridLayout(1, true);
composite.setLayout(layout);
GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
composite.setLayoutData(gd);
/*
* Create checkers group
*/
createCheckersGroup(composite);
/*
* Include the conditions area in the checker group.
* This are is updated according to the checker selection
*/
createConditionsGroup(composite);
}
/**
* Create and return the Checkers group.
* It contains the table with all checkers listed. When a checker is
* selected, the corresponding conditions are updated in the conditions
* table.
*
* @param topComposite the parent composite
*/
private void createCheckersGroup(Composite topComposite)
{
Group checkersGroup = new Group(topComposite, SWT.NONE);
checkersGroup.setLayout(new GridLayout(1, false));
checkersGroup.setText(PreflightingUiNLS.CheckersTabComposite_Checkers_Group);
GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
checkersGroup.setLayoutData(gd);
checkersTableViewer =
CheckboxTableViewer.newCheckList(checkersGroup, SWT.BORDER | SWT.SINGLE
| SWT.FULL_SELECTION);
Control checkersTableControl = checkersTableViewer.getTable();
gd = new GridData(SWT.FILL, SWT.FILL, true, true);
checkersTableControl.setLayoutData(gd);
checkersTableComparator = new CheckersTableComparator();
checkersTableViewer.setComparator(checkersTableComparator);
/*
* Create Columns
*/
TableViewerColumn column = new TableViewerColumn(checkersTableViewer, SWT.NONE); // Name
column.getColumn().setText(PreflightingUiNLS.CheckersTabComposite_Name_Column);
column.getColumn().setResizable(true);
column.getColumn().setWidth(230);
column.setLabelProvider(new CheckersLabelProvider());
column.getColumn().addSelectionListener(
new CheckersColumnSelectionAdapter(NAME_COLUMN_INDEX));
column = new TableViewerColumn(checkersTableViewer, SWT.NONE); // ID
column.getColumn().setText(PreflightingUiNLS.CheckersTabComposite_Id_Column);
column.getColumn().setResizable(true);
column.getColumn().setWidth(100);
column.setLabelProvider(new CheckersLabelProvider());
column.getColumn()
.addSelectionListener(new CheckersColumnSelectionAdapter(ID_COLUMN_INDEX));
column = new TableViewerColumn(checkersTableViewer, SWT.NONE); // Parameters
column.getColumn().setText(PreflightingUiNLS.CheckersTabComposite_Checker_Params_Column);
column.getColumn().setResizable(true);
column.getColumn().setWidth(100);
column.setLabelProvider(new CheckersLabelProvider());
column.getColumn().addSelectionListener(
new CheckersColumnSelectionAdapter(CHECKER_PARAMS_COLUMN_INDEX));
// set a custom editor for this column
column.setEditingSupport(new ParameterEditingSupport(checkersTableViewer));
column = new TableViewerColumn(checkersTableViewer, SWT.NONE); // Change Warning Level
column.getColumn()
.setText(PreflightingUiNLS.CheckersTabComposite_ChangeWarningLevel_Column);
column.getColumn().setResizable(true);
column.getColumn().setWidth(100);
column.setLabelProvider(new CheckersLabelProvider());
column.getColumn().addSelectionListener(
new CheckersColumnSelectionAdapter(CHECKER_CHANGE_WARNING_LEVEL_COLUMN_INDEX));
// set a custom editor for this column
column.setEditingSupport(new WarningLevelEditingSupport(checkersTableViewer));
checkersTableViewer.getTable().setHeaderVisible(true);
checkersTableViewer.setContentProvider(new CheckersContentProvider());
ColumnViewerToolTipSupport.enableFor(checkersTableViewer);
// Selection Change Listener handles needed UI updates on the paramsText according to checkers selected
// It also updates the conditions table
checkersTableViewer.getTable().addSelectionListener(new SelectionAdapter()
{
@Override
public void widgetSelected(SelectionEvent e)
{
CheckerDescription checkerDescription = (CheckerDescription) e.item.getData();
TableItem tableItem = (TableItem) e.item;
updateConditionTableBasedOnChecker(tableItem.getChecked());
populateConditionsTable(checkerDescription.getId());
}
});
// CheckStateListener handles the selectAll check box behavior and also selects the clicked item on the table.
checkersTableViewer.addCheckStateListener(new ICheckStateListener()
{
public void checkStateChanged(CheckStateChangedEvent event)
{
boolean isAllSelected = areAllItemsChecked(checkersTableViewer);
selectAllCheckersCheck.setSelection(isAllSelected);
checkersTableViewer.setSelection(new StructuredSelection(event.getElement()), true);
updateConditionTableBasedOnChecker(event.getChecked());
notifyListener();
}
});
ValidationManager validationManager = new ValidationManager();
checkersDescriptions = validationManager.getCheckersDescription();
checkerParams = new HashMap<String, String>(checkersDescriptions.size());
checkersTableViewer.setInput(checkersDescriptions);
selectAllCheckersCheck = new Button(checkersGroup, SWT.CHECK);
selectAllCheckersCheck
.setText(PreflightingUiNLS.CheckersTabComposite_Checkers_SelectAll_Check);
gd = new GridData(SWT.LEFT, SWT.BOTTOM, false, false);
selectAllCheckersCheck.setLayoutData(gd);
selectAllCheckersCheck.setSelection(true);
selectAllCheckersCheck.addSelectionListener(new SelectionAdapter()
{
@Override
public void widgetSelected(SelectionEvent e)
{
checkersTableViewer.setAllChecked(selectAllCheckersCheck.getSelection());
updateConditionTableBasedOnChecker(selectAllCheckersCheck.getSelection());
super.widgetSelected(e);
notifyListener();
}
});
checkersTableComparator.setColumn(0);
}
/**
* @param event
*/
public void updateConditionTableBasedOnChecker(boolean checkerEnabled)
{
if (!checkerEnabled)
{
//disabling checker => disable all conditions as well (and disable the table)
conditionsTableViewer.getTable().setEnabled(false);
selectAllConditionsCheck.setEnabled(false);
}
else
{
//enabling checker => enables all conditions as well (and enable the table)
conditionsTableViewer.getTable().setEnabled(true);
selectAllConditionsCheck.setEnabled(true);
}
}
/**
* Create the conditions are, which contains a table with all
* conditions of the selected checker. Its content is updated
* dynamically based on the checker selection
*
* @param topComposite the parent composite
*/
/**
* @param topComposite
*/
private void createConditionsGroup(Composite topComposite)
{
Group conditionsGroup = new Group(topComposite, SWT.NONE);
conditionsGroup.setLayout(new GridLayout(1, false));
conditionsGroup.setText(PreflightingUiNLS.CheckersTabComposite_Conditions_Group);
GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
gd.heightHint = 200;
conditionsGroup.setLayoutData(gd);
conditionsTableViewer =
CheckboxTableViewer.newCheckList(conditionsGroup, SWT.BORDER | SWT.MULTI
| SWT.FULL_SELECTION);
Control conditionsTableControl = conditionsTableViewer.getTable();
gd.heightHint = 200;
conditionsTableControl.setLayoutData(gd);
conditionsTableViewer.setContentProvider(new ConditionsContentProvider());
ColumnViewerToolTipSupport.enableFor(conditionsTableViewer);
conditionsTableComparator = new ConditionsTableComparator();
conditionsTableViewer.setComparator(conditionsTableComparator);
// Create Columns
TableViewerColumn column = new TableViewerColumn(conditionsTableViewer, SWT.NONE); // Name
column.getColumn().setText(PreflightingUiNLS.CheckersTabComposite_Name_Column);
column.getColumn().setResizable(true);
column.getColumn().setWidth(230);
column.setLabelProvider(new ConditionsLabelProvider());
column.getColumn().addSelectionListener(
new ConditionsColumnSelectionAdapter(NAME_COLUMN_INDEX));
column = new TableViewerColumn(conditionsTableViewer, SWT.NONE); // ID
column.getColumn().setText(PreflightingUiNLS.CheckersTabComposite_Id_Column);
column.getColumn().setResizable(true);
column.getColumn().setWidth(100);
column.setLabelProvider(new ConditionsLabelProvider());
column.getColumn().addSelectionListener(
new ConditionsColumnSelectionAdapter(ID_COLUMN_INDEX));
column = new TableViewerColumn(conditionsTableViewer, SWT.NONE); // Warning Level
column.getColumn().setText(PreflightingUiNLS.CheckersTabComposite_WarningLevel_Column);
column.getColumn().setResizable(true);
column.getColumn().setWidth(100);
column.setLabelProvider(new ConditionsLabelProvider());
column.getColumn().addSelectionListener(
new ConditionsColumnSelectionAdapter(CONDITION_WARNING_LEVEL_COLUMN_INDEX));
column = new TableViewerColumn(conditionsTableViewer, SWT.NONE); // Change Warning Level
column.getColumn()
.setText(PreflightingUiNLS.CheckersTabComposite_ChangeWarningLevel_Column);
column.getColumn().setResizable(true);
column.getColumn().setWidth(100);
column.setLabelProvider(new ConditionsLabelProvider());
column.getColumn().addSelectionListener(
new ConditionsColumnSelectionAdapter(CONDITION_CHANGE_WARNING_LEVEL_COLUMN_INDEX));
// set a custom editor for this column
column.setEditingSupport(new WarningLevelEditingSupport(conditionsTableViewer));
conditionsTableViewer.getTable().setHeaderVisible(true);
conditionsTableViewer.addCheckStateListener(new ICheckStateListener()
{
public void checkStateChanged(CheckStateChangedEvent event)
{
// update "select all" control
boolean isAllSelected = areAllItemsChecked(conditionsTableViewer);
selectAllConditionsCheck.setSelection(isAllSelected);
// move the selection to the checked item
conditionsTableViewer.setSelection(new StructuredSelection(event.getElement()),
true);
// get the condition and the checker that are selected
Condition condition = (Condition) event.getElement();
CheckerDescription selectedChecker =
(CheckerDescription) ((StructuredSelection) checkersTableViewer
.getSelection()).getFirstElement();
// update the selected conditions maps accordingly, adding the specified condition
// if the checkbox is checked or removing it otherwise
List<Condition> conditions = selectedConditionsMap.get(selectedChecker.getId());
if (event.getChecked())
{
conditions.add(condition);
}
else
{
conditions.remove(condition);
}
notifyListener();
}
});
selectAllConditionsCheck = new Button(conditionsGroup, SWT.CHECK);
selectAllConditionsCheck
.setText(PreflightingUiNLS.CheckersTabComposite_Checkers_SelectAll_Check);
gd = new GridData(SWT.LEFT, SWT.BOTTOM, false, false);
selectAllConditionsCheck.setLayoutData(gd);
selectAllConditionsCheck.setSelection(true);
selectAllConditionsCheck.addSelectionListener(new SelectionAdapter()
{
@Override
public void widgetSelected(SelectionEvent e)
{
// update UI
conditionsTableViewer.setAllChecked(selectAllConditionsCheck.getSelection());
// update model
CheckerDescription selectedChecker =
(CheckerDescription) ((StructuredSelection) checkersTableViewer
.getSelection()).getFirstElement();
// get all conditions of the selected checker and add them to the selected conditions list
if (selectAllConditionsCheck.getSelection())
{
selectAllConditions(selectedChecker.getId());
}
// clear the selected conditions list
else
{
selectedConditionsMap.put(selectedChecker.getId(), new ArrayList<Condition>());
}
super.widgetSelected(e);
notifyListener();
}
});
selectAllConditionsCheck.setEnabled(conditionsTableViewer.getTable().isEnabled());
conditionsTableComparator.setColumn(0);
}
/**
* Select all conditions in the model, by copying the list with all conditions
*
* @param checkerId the checker id to have all its conditions selected
*/
private void selectAllConditions(String checkerId)
{
List<Condition> selectedConditions = new ArrayList<Condition>();
for (Condition condition : allConditionsMap.get(checkerId))
{
selectedConditions.add(condition);
}
selectedConditionsMap.put(checkerId, selectedConditions);
}
/**
* Create a custom cell editor which will contain a text editor so that
* users can modify the parameters for a particular checker
*/
public class ParameterEditingSupport extends EditingSupport
{
public ParameterEditingSupport(ColumnViewer viewer)
{
super(viewer);
}
@Override
protected void setValue(Object element, Object value)
{
checkerParams.put(((CheckerDescription) element).getId(), (String) value);
getViewer().update(element, null);
notifyListener();
}
@Override
protected Object getValue(Object element)
{
CheckerDescription checkerDescription = (CheckerDescription) element;
String params = ""; //$NON-NLS-1$
if (checkerParams.containsKey(checkerDescription.getId()))
{
params = checkerParams.get(checkerDescription.getId());
}
return params;
}
@Override
protected CellEditor getCellEditor(Object element)
{
return new TextCellEditor(((TableViewer) getViewer()).getTable(), SWT.NONE);
}
@Override
protected boolean canEdit(Object element)
{
return true;
}
}
/**
* Create a custom cell editor which will contain a combobox so that
* users can modify (increase / decrease) the warning level for a particular
* condition or checker
*/
public class WarningLevelEditingSupport extends EditingSupport
{
public WarningLevelEditingSupport(TableViewer viewer)
{
super(viewer);
}
@Override
protected CellEditor getCellEditor(Object element)
{
CellEditor comboEditor =
new ComboBoxCellEditor(((TableViewer) getViewer()).getTable(),
WarningLevelOperations, SWT.READ_ONLY | SWT.FULL_SELECTION
| SWT.DROP_DOWN);
return comboEditor;
}
@Override
protected boolean canEdit(Object element)
{
return true;
}
@Override
protected Object getValue(Object element)
{
// Get value from model
Boolean customWarningLevel = null;
if (element instanceof Condition)
{
customWarningLevel =
customConditionsWarningLevels.get(((Condition) element).getId());
}
else
{
customWarningLevel =
customCheckersWarningLevels.get(((CheckerDescription) element).getId());
}
// select the appropriate item in the combobox
int value = 1; // keep
if (customWarningLevel != null)
{
value = ((customWarningLevel) ? 0 : 2); // increase, decrease
}
return new Integer(value);
}
@Override
protected void setValue(Object element, Object value)
{
int intValue = ((Integer) value).intValue();
Boolean booleanValue = null; // 1 = default (keep warning level)
if (intValue != 1)
{
booleanValue = ((intValue == 0) ? new Boolean(true) : new Boolean(false));
}
// Set value in the model
if (element instanceof Condition)
{
customConditionsWarningLevels.put(((Condition) element).getId(), booleanValue);
}
else
{
customCheckersWarningLevels.put(((CheckerDescription) element).getId(),
booleanValue);
}
// Update the UI. This generate a call to the label provider
getViewer().update(element, null);
getViewer().refresh();
}
}
/**
* Update the conditions table based on the checker that is selected
*
* @param checkerId the checker selected in the UI
*/
private void populateConditionsTable(String checkerId)
{
// display appropriate elements
if (checkerId != null)
{
conditionsTableViewer.setInput(allConditionsMap.get(checkerId));
}
else
{
conditionsTableViewer.setInput(new ArrayList<Condition>());
}
// update selection in the table and also the "select all" button state
conditionsTableViewer.setCheckedElements(selectedConditionsMap.get(checkerId).toArray());
selectAllConditionsCheck.setEnabled(conditionsTableViewer.getTable().isEnabled());
selectAllConditionsCheck.setSelection(areAllItemsChecked(conditionsTableViewer));
}
/*
* Verifies if all items on a given CheckboxTableViewer are selected
*/
private boolean areAllItemsChecked(CheckboxTableViewer tableViewer)
{
Table table = tableViewer.getTable();
TableItem[] items = table.getItems();
boolean allChecked = true;
int i = 0;
while ((i < items.length) && allChecked)
{
TableItem tableItem = items[i];
if (!tableItem.getChecked())
{
allChecked = false;
}
i++;
}
return allChecked;
}
/*
* Load data from the preference store and configure the UI accordingly.
*/
private void init(IPreferenceStore preferenceStore)
{
/*
* Populate condition maps
*/
ValidationManager validationManager = new ValidationManager();
for (CheckerDescription checkerDescription : checkersDescriptions)
{
allConditionsMap.put(checkerDescription.getId(),
validationManager.getCheckerConditions(checkerDescription.getId()));
}
String checkersPreference =
preferenceStore.getString(PreflightingUIPlugin.CHECKERS_PREFERENCE_KEY);
// Preference is empty means first time. Perform defaults
if (checkersPreference.length() == 0)
{
performDefaults();
}
else
{
/*
* Checkers information
*/
if (!checkersPreference.equals(NO_CHECKERS_SELECTED)) //There's checkers to load and check on the table
{
StringTokenizer tokenizer = new StringTokenizer(checkersPreference, ","); //$NON-NLS-1$
List<CheckerDescription> selectedCheckerDescriptions =
new ArrayList<CheckerDescription>(tokenizer.countTokens());
while (tokenizer.hasMoreTokens())
{
String checkerId = tokenizer.nextToken();
CheckerDescription checkerDescription = getCheckerDescription(checkerId);
if (checkerDescription != null)
{
selectedCheckerDescriptions.add(checkerDescription);
}
}
checkersTableViewer.setCheckedElements(selectedCheckerDescriptions.toArray());
}
selectAllCheckersCheck.setSelection(areAllItemsChecked(checkersTableViewer));
String checkersConditionsPreference =
preferenceStore
.getString(PreflightingUIPlugin.CHECKERS_CONDITIONS_PREFERENCE_KEY);
if (checkersConditionsPreference.length() > 0)
{
StringTokenizer tokenizer = new StringTokenizer(checkersConditionsPreference, ";");
while (tokenizer.hasMoreElements())
{
String checkerConditionStr = tokenizer.nextToken();
String[] split = checkerConditionStr.split(":");
if (split.length == 2)
{
String checkerId = split[0];
String[] selectedConditionsIds = split[1].split(",");
// define which are the selected conditions
Set<String> selectedConditionsIdsSet = new HashSet<String>();
for (String selectedConditionId : selectedConditionsIds)
{
selectedConditionsIdsSet.add(selectedConditionId);
}
// get the Condition objects and add them to the selected conditions map
List<Condition> allConditionsList = allConditionsMap.get(checkerId);
List<Condition> selectedConditionsList = new ArrayList<Condition>();
if (allConditionsList != null)
{
for (Condition condition : allConditionsList)
{
if (selectedConditionsIdsSet.contains(condition.getId()))
{
selectedConditionsList.add(condition);
}
}
}
selectedConditionsMap.put(checkerId, selectedConditionsList);
}
}
}
// create an empty list for the checkers that had no preferences set (new checkers, for example)
for (CheckerDescription checkerDescription : checkersDescriptions)
{
if (selectedConditionsMap.get(checkerDescription.getId()) == null)
{
selectedConditionsMap.put(checkerDescription.getId(),
new ArrayList<Condition>());
}
}
/*
* Get Extended Properties
*/
// Checker parameters
loadExtendedProperty(checkerParams, preferenceStore,
PreflightingUIPlugin.CHECKERS_PARAMS_PREFERENCE_KEY, String.class);
// Custom checker warning levels
loadExtendedProperty(customCheckersWarningLevels, preferenceStore,
PreflightingUIPlugin.CHECKERS_WARNING_LEVELS_PREFERENCE_KEY, Boolean.class);
// Custom conditions warning levels
loadExtendedProperty(customConditionsWarningLevels, preferenceStore,
PreflightingUIPlugin.CHECKERS_CONDITIONS_WARNING_LEVELS_PREFERENCE_KEY,
Boolean.class);
checkersTableViewer.refresh();
}
}
/**
* Load saved extend property. The extended properties are related to
* a checker or condition, and are saved in the form:
* <id>,<extended_property>;<id>,<extended_property>...
*
* These properties are loaded in a map <id> -> <extended_property>
*
* @param map the map where the information will be loaded
* @param preferenceStore the preference store
* @param preferenceName the preference key used to store
*/
@SuppressWarnings(
{
"rawtypes", "unchecked"
})
private void loadExtendedProperty(Map map, IPreferenceStore preferenceStore,
String preferenceName, Class valueType)
{
String preference = preferenceStore.getString(preferenceName);
if (preference.length() > 0)
{
StringTokenizer tokenizer = new StringTokenizer(preference, ";");
while (tokenizer.hasMoreElements())
{
String extendedProperty = tokenizer.nextToken();
String[] split = extendedProperty.split(",");
if (split.length == 2)
{
String id = split[0];
String params = split[1];
// string (checker param)
if (valueType.getName().equals("java.lang.String"))
{
map.put(id, params);
}
// boolean (warning levels)
else
{
map.put(id, new Boolean(params));
}
}
}
}
}
/**
* Saved extended properties. The extended properties are related to
* a checker or condition, and are saved in the form:
* <id>,<extended_property>;<id>,<extended_property>...
*
* The properties come from a map <id> -> <extended_property>
*
* @param map a map with the extended properties
* @param preferenceStore the preference store
* @param preferenceName the preference key used to store
*/
private void saveExtendedProperty(Map<String, ?> map, IPreferenceStore preferenceStore,
String preferenceName)
{
StringBuilder stringBuilder = new StringBuilder();
if (!map.isEmpty())
{
for (String id : map.keySet())
{
String params = ((map.get(id) != null) ? map.get(id).toString() : null);
if ((params != null) && (params.length() > 0))
{
stringBuilder.append(id);
stringBuilder.append(","); //$NON-NLS-1$
stringBuilder.append(params);
stringBuilder.append(";"); //$NON-NLS-1$
}
}
deleteLastChar(stringBuilder);
}
preferenceStore.setValue(preferenceName, stringBuilder.toString());
}
/**
* Get the CheckerDescription object for a fiven checkerId passed as parameter
*
* @param checkerId the checker id of the object to be retrieved
* @return the CheckerDescription object that represents the checker with the id passed as parameter
*/
private CheckerDescription getCheckerDescription(String checkerId)
{
CheckerDescription checkerDescriptionFound = null;
Iterator<CheckerDescription> it = checkersDescriptions.iterator();
while ((checkerDescriptionFound == null) && it.hasNext())
{
CheckerDescription checkerDescription = it.next();
if (checkerDescription.getId().equals(checkerId))
{
checkerDescriptionFound = checkerDescription;
}
}
return checkerDescriptionFound;
}
/* (non-Javadoc)
* @see com.motorolamobility.preflighting.ui.tabs.AbstractAppValidatorTabComposite#isValid()
*/
@Override
public IStatus isValid()
{
IStatus status = Status.OK_STATUS;
boolean isValid = true;
boolean hasWarning = false;
String msg = "";
// check if no checker is selected
if (checkersTableViewer.getCheckedElements().length == 0)
{
isValid = false;
msg = PreflightingUiNLS.CheckersTabComposite_Validation_Error_No_Checker;
}
// check if there are parameters for checkers that have custom conditions selection
Object[] checkerDescriptions = checkersTableViewer.getCheckedElements();
if (checkerDescriptions.length > 0)
{
for (Object checkerDescObj : checkerDescriptions)
{
String checkerId = ((CheckerDescription) checkerDescObj).getId();
if (((checkerParams.get(checkerId) != null) && !checkerParams.get(checkerId)
.equals("")))
{
if (hasCustomConditionsSelection(checkerId))
{
hasWarning = true;
msg =
PreflightingUiNLS.CheckersTabComposite_Validation_Warning_Param_Problem;
}
}
}
}
if (!isValid)
{
status = new Status(IStatus.ERROR, PreflightingUIPlugin.PREFLIGHTING_UI_PLUGIN_ID, msg);
}
else if (hasWarning)
{
status =
new Status(IStatus.WARNING, PreflightingUIPlugin.PREFLIGHTING_UI_PLUGIN_ID, msg);
}
return status;
}
/**
* Check if there are unselected conditions for the checker passed as parameter
*
* @param checkerId the checker to have the conditions selection analysed
* @return true if there is custom selection for the conditions (i.e. unselected conditions), false otherwise
*/
private boolean hasCustomConditionsSelection(String checkerId)
{
boolean result = false;
List<Condition> selectedConditions = selectedConditionsMap.get(checkerId);
if ((selectedConditions != null)
&& (selectedConditionsMap.get(checkerId).size() != allConditionsMap.get(checkerId)
.size()))
{
result = true;
}
return result;
}
/* (non-Javadoc)
* @see com.motorolamobility.preflighting.ui.tabs.AbstractAppValidatorTabComposite#performDefaults()
*/
@Override
public void performDefaults()
{
/*
* Checkers - select all
*/
// model / UI
checkersTableViewer.setAllChecked(true);
selectAllCheckersCheck.setSelection(true);
// model
for (CheckerDescription checkerDescription : checkersDescriptions)
{
selectAllConditions(checkerDescription.getId());
}
// UI
conditionsTableViewer.setAllChecked(true);
selectAllConditionsCheck.setSelection(true);
/*
* Extended Properties
*/
// model
checkerParams.clear();
customCheckersWarningLevels.clear();
customConditionsWarningLevels.clear();
/*
* Update UIs
*/
checkersTableViewer.refresh();
conditionsTableViewer.refresh();
}
/* (non-Javadoc)
* @see com.motorolamobility.preflighting.ui.tabs.AbstractAppValidatorTabComposite#performOk(org.eclipse.jface.preference.IPreferenceStore)
*/
@Override
public void performOk(IPreferenceStore preferenceStore)
{
StringBuilder stringBuilder;
/*
* Checkers information
*/
Object[] checkerDescriptions = checkersTableViewer.getCheckedElements();
stringBuilder = new StringBuilder();
if (checkerDescriptions.length > 0)
{
for (Object checkerDescObj : checkerDescriptions)
{
CheckerDescription checkerDescription = (CheckerDescription) checkerDescObj;
stringBuilder.append(checkerDescription.getId());
stringBuilder.append(","); //$NON-NLS-1$
}
deleteLastChar(stringBuilder);
preferenceStore.putValue(PreflightingUIPlugin.CHECKERS_PREFERENCE_KEY,
stringBuilder.toString());
}
else
{
preferenceStore.putValue(PreflightingUIPlugin.CHECKERS_PREFERENCE_KEY,
NO_CHECKERS_SELECTED);
}
stringBuilder = new StringBuilder();
if (!selectedConditionsMap.isEmpty())
{
for (String checkerId : selectedConditionsMap.keySet())
{
stringBuilder.append(checkerId);
stringBuilder.append(":");
for (Condition condition : selectedConditionsMap.get(checkerId))
{
stringBuilder.append(condition.getId());
stringBuilder.append(","); //$NON-NLS-1$
}
deleteLastChar(stringBuilder);
stringBuilder.append(";");
}
deleteLastChar(stringBuilder);
}
preferenceStore.setValue(PreflightingUIPlugin.CHECKERS_CONDITIONS_PREFERENCE_KEY,
stringBuilder.toString());
/*
* Extended Properties
*/
// Checker parameters
saveExtendedProperty(checkerParams, preferenceStore,
PreflightingUIPlugin.CHECKERS_PARAMS_PREFERENCE_KEY);
// Custom checker warning levels
saveExtendedProperty(customCheckersWarningLevels, preferenceStore,
PreflightingUIPlugin.CHECKERS_WARNING_LEVELS_PREFERENCE_KEY);
// Custom conditions warning levels
saveExtendedProperty(customConditionsWarningLevels, preferenceStore,
PreflightingUIPlugin.CHECKERS_CONDITIONS_WARNING_LEVELS_PREFERENCE_KEY);
}
/**
* Delete the last char of a string builder
*
* @param stringBuilder the string builder to have the last char deleted
*/
private void deleteLastChar(StringBuilder stringBuilder)
{
if (stringBuilder.length() > 0)
{
stringBuilder.deleteCharAt(stringBuilder.length() - 1);
}
}
/* (non-Javadoc)
* @see com.motorolamobility.preflighting.ui.tabs.AbstractAppValidatorTabComposite#commandLineBuilder()
*/
@Override
public String commandLineBuilder()
{
String commandline = "";
boolean hasCustomCheckers = !areAllItemsChecked(checkersTableViewer);
boolean hasCustomParameters = hasParameters();
boolean hasCustomConditions = hasCustomConditions();
boolean hasCustomWarningLevels = hasCustomWarningLevels();
// check if there are custom configurations
if (hasCustomCheckers || hasCustomParameters || hasCustomConditions
|| hasCustomWarningLevels)
{
Object[] checkedElements = checkersTableViewer.getCheckedElements();
StringBuilder stringBuilder = new StringBuilder();
Boolean customWarningLevel = null;
List<String> elementsToIncreaseWarningLevel = new ArrayList<String>();
List<String> elementsToDecreaseWarningLevel = new ArrayList<String>();
/*
* Iterate in the selected checkers
*/
for (Object checkedObj : checkedElements)
{
CheckerDescription checkerDescription = (CheckerDescription) checkedObj;
String checkerId = checkerDescription.getId();
List<Condition> selectedConditions =
((selectedConditionsMap.get(checkerId) != null) ? selectedConditionsMap
.get(checkerId) : new ArrayList<Condition>());
// Have custom parameters or there are checkers disabled
// just create the command line block to
// select the checker and to pass the appropriate parameters, if any
if (hasCustomParameters
|| (checkedElements.length < checkersTableViewer.getTable().getItems().length))
{
stringBuilder.append("-c ");
stringBuilder.append(checkerId);
stringBuilder.append(" ");
// params only apply if there are no unselected/custom conditions
String parameters = checkerParams.get(checkerId);
if ((parameters != null) && (parameters.length() > 0))
{
stringBuilder.append(parameters);
stringBuilder.append(" ");
}
}
// Given that there are conditions disabled, create the command line block
// to enable only the selected ones. Additionally, define the custom warning level
// for that condition, if any
List<Condition> allConditions = allConditionsMap.get(checkerId);
if (allConditions != null)
{
for (Condition condition : allConditions)
{
if ((selectedConditions != null) && !selectedConditions.contains(condition))
{
//Condition is NOT selected => add it to -dc (disable condition) command
stringBuilder.append("-dc ");
stringBuilder.append(checkerId);
stringBuilder.append(".");
stringBuilder.append(condition.getId());
stringBuilder.append(" ");
}
}
}
/*
* Build the list of items that must have their warning levels changed
*/
// checker
customWarningLevel = customCheckersWarningLevels.get(checkerId);
if (customWarningLevel != null)
{
if (customWarningLevel)
{
elementsToIncreaseWarningLevel.add(checkerId);
}
else
{
elementsToDecreaseWarningLevel.add(checkerId);
}
}
// conditions
for (Condition condition : ((selectedConditions != null) ? selectedConditions
: allConditionsMap.get(checkerId)))
{
customWarningLevel = customConditionsWarningLevels.get(condition.getId());
if (customWarningLevel != null)
{
if (customWarningLevel)
{
elementsToIncreaseWarningLevel.add(checkerId + "." + condition.getId());
}
else
{
elementsToDecreaseWarningLevel.add(checkerId + "." + condition.getId());
}
}
}
}
/*
* Custom warning levels
*/
stringBuilder.append(createCustomWarningLevelCommandLine(true,
elementsToIncreaseWarningLevel));
stringBuilder.append(createCustomWarningLevelCommandLine(false,
elementsToDecreaseWarningLevel));
commandline = stringBuilder.toString().trim();
}
return commandline;
}
/**
* Create the command line piece which increases or decreases the warning level
* for certain element (checker or condition)
*
* @param increase true if the warning level must be increased, false if it must be decreased, null if the warning level must not change
* @param element the element to have its warning level changed
* @return the command line piece
*/
public String createCustomWarningLevelCommandLine(Boolean increase, List<String> elements)
{
StringBuilder result = new StringBuilder();
if ((increase != null) && (elements.size() > 0))
{
if (increase)
{
result.append("-wx"); // increase
}
else
{
result.append("-xw"); // decrease
}
result.append(" ");
for (String element : elements)
{
result.append(element);
result.append(" ");
}
}
return result.toString();
}
/**
* Check if there are parameters set for any checker
*
* @return true if there are parameters set, false otherwise
*/
private boolean hasParameters()
{
boolean paramsFound = false;
Iterator<String> it = checkerParams.values().iterator();
while (it.hasNext() && !paramsFound)
{
String checkerParam = it.next();
if (checkerParam.length() > 0)
{
paramsFound = true;
}
}
return paramsFound;
}
/**
* Check if there are unselected/custom conditions.
* This is used to decide if the App Validator command line must be created or not
*
* @return true if there are custom unselected/custom conditions, false otherwise
*/
private boolean hasCustomConditions()
{
boolean result = false;
for (String checkerId : allConditionsMap.keySet())
{
List<Condition> selectedConditions =
((selectedConditionsMap.get(checkerId) != null) ? selectedConditionsMap
.get(checkerId) : new ArrayList<Condition>());
if (allConditionsMap.get(checkerId).size() != selectedConditions.size())
{
result = true;
break;
}
}
return result;
}
/**
* Check if there are custom warning levels
* This is used to decide if the App Validator command line must be created or not
*
* @return true if there are custom warning levels, false otherwise
*/
private boolean hasCustomWarningLevels()
{
boolean result = false;
List<Map<String, Boolean>> maps = new ArrayList<Map<String, Boolean>>();
maps.add(customCheckersWarningLevels);
maps.add(customConditionsWarningLevels);
for (Map<String, Boolean> map : maps)
{
for (Boolean customWarningLevel : map.values())
{
if (customWarningLevel != null)
{
result = true;
break;
}
}
}
return result;
}
}