// Copyright 2010 Google Inc. All Rights Reseved.
//
// 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.google.testing.testify.risk.frontend.client.view.impl;
import com.google.common.base.Function;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.testing.testify.risk.frontend.client.riskprovider.RiskProvider;
import com.google.testing.testify.risk.frontend.client.riskprovider.impl.BugRiskProvider;
import com.google.testing.testify.risk.frontend.client.riskprovider.impl.CodeChurnRiskProvider;
import com.google.testing.testify.risk.frontend.client.riskprovider.impl.StaticRiskProvider;
import com.google.testing.testify.risk.frontend.client.riskprovider.impl.TestCoverageRiskProvider;
import com.google.testing.testify.risk.frontend.client.view.widgets.LinkCapabilityWidget;
import com.google.testing.testify.risk.frontend.model.Capability;
import com.google.testing.testify.risk.frontend.model.CapabilityIntersectionData;
import com.google.testing.testify.risk.frontend.model.Pair;
import java.util.List;
/**
* View of mitigated risk for a project.
*
* @author chrsmith@google.com (Chris Smith)
* @author jimr@google.com (Jim Reardon)
*/
public class KnownRiskViewImpl extends RiskViewImpl {
/**
* Stores details on a risk provider along with a checkbox indicating its state.
*/
private class SourceItem {
private final RiskProvider provider;
private final CheckBox checkBox;
public SourceItem(RiskProvider provider, CheckBox checkBox) {
this.provider = provider;
this.checkBox = checkBox;
}
public RiskProvider getProvider() { return provider; }
public CheckBox getCheckBox() { return checkBox; }
}
/** Panel to hold all of the check boxes associated with Risk sources. */
private final HorizontalPanel sourcesPanel = new HorizontalPanel();
/** Panel to hold the risk page's content. */
private final HorizontalPanel contentPanel = new HorizontalPanel();
private final List<SourceItem> sources = Lists.newArrayList();
public KnownRiskViewImpl() {
String introText =
"This shows the Total Risk to your application, taking into account any Risk Sources "
+ "as well as Mitigation Sources that are checked below.";
setPageText("Known Risk", introText);
sourcesPanel.addStyleName("tty-RiskSourcesPanel");
contentPanel.add(sourcesPanel);
this.content.add(contentPanel);
addValueChangeHandler(
new ValueChangeHandler<Pair<Integer, Integer>>() {
@Override
public void onValueChange(ValueChangeEvent<Pair<Integer, Integer>> event) {
CapabilityIntersectionData cellData = getDataForCell(
event.getValue().first, event.getValue().second);
bottomContent.clear();
bottomContent.setWidget(createBottomWidget(cellData));
}
});
}
private Widget createBottomWidget(CapabilityIntersectionData data) {
VerticalPanel panel = new VerticalPanel();
panel.setStyleName("tty-ItemContainer");
String aName = data.getParentAttribute().getName();
String cName = data.getParentComponent().getName();
Label name = new Label(cName + " is " + aName);
name.setStyleName("tty-ItemName");
panel.add(name);
for (Capability capability : data.getCapabilities()) {
LinkCapabilityWidget widget = new LinkCapabilityWidget(capability);
panel.add(widget);
}
return panel;
}
/**
* Returns a CheckBox to control the RiskProvider (changing the check state regenerates the risk
* grid's colors.)
*/
private CheckBox getRiskProviderCheckBox(RiskProvider provider) {
CheckBox providerCheckBox = new CheckBox(provider.getName());
providerCheckBox.setValue(true);
providerCheckBox.addValueChangeHandler(
new ValueChangeHandler<Boolean>() {
@Override
public void onValueChange(ValueChangeEvent<Boolean> event) {
refreshRiskCalculation();
}
});
return providerCheckBox;
}
@Override
protected void onInitialized() {
List<RiskProvider> providers = Lists.newArrayList(
new StaticRiskProvider(),
new BugRiskProvider(),
new CodeChurnRiskProvider(),
new TestCoverageRiskProvider());
// Initialize risk sources.
sources.clear();
sourcesPanel.clear();
for (RiskProvider provider : providers) {
CheckBox providerCheckBox = getRiskProviderCheckBox(provider);
sourcesPanel.add(providerCheckBox);
SourceItem sourceItem = new SourceItem(provider, providerCheckBox);
sources.add(sourceItem);
}
refreshRiskCalculation();
}
/**
* Initialize every cell in the table. This includes calculating the risk of every risk source
* and mitigation and then viewing the delta.
*/
private void refreshRiskCalculation() {
Predicate<SourceItem> getChecked = new Predicate<SourceItem>() {
@Override
public boolean apply(SourceItem input) {
return input.getCheckBox().getValue();
}};
Function<SourceItem, RiskProvider> getProvider = new Function<SourceItem, RiskProvider>() {
@Override
public RiskProvider apply(SourceItem arg0) {
return arg0.getProvider();
}
};
List<RiskProvider> enabled =
Lists.newArrayList(
Iterables.transform(
Iterables.filter(sources, getChecked),
getProvider));
refreshRiskCalculation(enabled);
}
}