/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE file at the root of the source
* tree and available online at
*
* https://github.com/keeps/roda
*/
package org.roda.wui.client.planning;
import java.util.Date;
import java.util.List;
import org.roda.core.data.v2.index.select.SelectedItems;
import org.roda.core.data.v2.risks.IndexedRisk;
import org.roda.core.data.v2.risks.Risk;
import org.roda.core.data.v2.risks.RiskIncidence;
import org.roda.wui.client.browse.BrowserService;
import org.roda.wui.client.common.lists.RiskIncidenceList;
import org.roda.wui.client.common.search.SearchSuggestBox;
import org.roda.wui.client.common.utils.HtmlSnippetUtils;
import org.roda.wui.common.client.ClientLogger;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.event.logical.shared.HasValueChangeHandlers;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.user.datepicker.client.DateBox;
import com.google.gwt.user.datepicker.client.DateBox.DefaultFormat;
import config.i18n.client.ClientMessages;
/**
* @author Luis Faria
*
*/
public class RiskDataPanel extends Composite implements HasValueChangeHandlers<Risk> {
interface MyUiBinder extends UiBinder<Widget, RiskDataPanel> {
}
private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class);
private static ClientMessages messages = GWT.create(ClientMessages.class);
@UiField
Label id;
@UiField
TextBox idBox;
@UiField
TextBox name;
@UiField
TextArea description;
@UiField
DateBox identifiedOn;
@UiField(provided = true)
SearchSuggestBox<IndexedRisk> identifiedBy;
@UiField(provided = true)
SearchSuggestBox<IndexedRisk> category;
@UiField
TextArea notes;
@UiField
ListBox preMitigationProbability;
@UiField
ListBox preMitigationImpact;
@UiField
Label preMitigationSeverityKey;
@UiField
HTML preMitigationSeverityValue;
@UiField
TextArea preMitigationNotes;
@UiField
ListBox posMitigationProbability;
@UiField
ListBox posMitigationImpact;
@UiField
Label posMitigationSeverityKey;
@UiField
HTML posMitigationSeverityValue;
@UiField
TextArea posMitigationNotes;
@UiField
TextArea mitigationStrategy;
@UiField
Label mitigationOwnerTypeKey;
@UiField
TextBox mitigationOwnerType;
@UiField(provided = true)
SearchSuggestBox<IndexedRisk> mitigationOwner;
@UiField
TextBox mitigationRelatedEventIdentifierType;
@UiField
TextBox mitigationRelatedEventIdentifierValue;
@SuppressWarnings("unused")
private ClientLogger logger = new ClientLogger(getClass().getName());
private boolean editmode;
private boolean changed = false;
private boolean checked = false;
private int severityLowLimit;
private int severityHighLimit;
private int probabilitiesSize;
private int impactsSize;
private RiskIncidenceList incidenceList;
private Date createdOn;
private String createdBy;
/**
* Create a new user data panel
*
* @param editmode
* if user name should be editable
* @param risk
* the risk to use
*
*/
public RiskDataPanel(final boolean editmode, final IndexedRisk risk, final String categoryField,
final String identifiedByField, final String ownerField) {
category = new SearchSuggestBox<>(IndexedRisk.class, categoryField, false);
identifiedBy = new SearchSuggestBox<>(IndexedRisk.class, identifiedByField, false);
mitigationOwner = new SearchSuggestBox<>(IndexedRisk.class, ownerField, false);
initWidget(uiBinder.createAndBindUi(this));
BrowserService.Util.getInstance().retrieveAllMitigationProperties(new AsyncCallback<MitigationPropertiesBundle>() {
@Override
public void onFailure(Throwable caught) {
// do nothing
}
@Override
public void onSuccess(MitigationPropertiesBundle terms) {
init(editmode, terms, risk);
}
});
}
public void init(boolean editmode, MitigationPropertiesBundle mitigationProperties, IndexedRisk risk) {
severityLowLimit = mitigationProperties.getSeverityLowLimit();
severityHighLimit = mitigationProperties.getSeverityHighLimit();
List<String> probabilities = mitigationProperties.getProbabilities();
probabilitiesSize = probabilities.size();
for (int i = probabilitiesSize - 1; i >= 0; i--) {
posMitigationProbability.addItem(messages.riskMitigationProbability(probabilities.get(i)));
preMitigationProbability.addItem(messages.riskMitigationProbability(probabilities.get(i)));
}
List<String> impacts = mitigationProperties.getImpacts();
impactsSize = impacts.size();
for (int i = impactsSize - 1; i >= 0; i--) {
posMitigationImpact.addItem(messages.riskMitigationImpact(impacts.get(i)));
preMitigationImpact.addItem(messages.riskMitigationImpact(impacts.get(i)));
}
preMitigationProbability.setSelectedIndex(probabilitiesSize - 1);
preMitigationImpact.setSelectedIndex(impactsSize - 1);
posMitigationProbability.setSelectedIndex(probabilitiesSize - 1);
posMitigationImpact.setSelectedIndex(impactsSize - 1);
this.editmode = editmode;
super.setVisible(true);
DefaultFormat dateFormat = new DateBox.DefaultFormat(DateTimeFormat.getFormat("yyyy-MM-dd"));
identifiedOn.setFormat(dateFormat);
identifiedOn.getDatePicker().setYearArrowsVisible(true);
identifiedOn.setFireNullValues(true);
identifiedOn.setValue(new Date());
ChangeHandler changeHandler = new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
RiskDataPanel.this.onChange();
}
};
KeyUpHandler keyUpHandler = new KeyUpHandler() {
@Override
public void onKeyUp(KeyUpEvent event) {
onChange();
}
};
ChangeHandler changePreMitigationHandler = new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
int probability = getIndex(preMitigationProbability.getSelectedIndex(), probabilitiesSize);
int impact = getIndex(preMitigationImpact.getSelectedIndex(), impactsSize);
preMitigationSeverityKey.setVisible(true);
preMitigationSeverityValue.setVisible(true);
int severity = probability * impact;
preMitigationSeverityValue
.setHTML(HtmlSnippetUtils.getSeverityDefinition(severity, severityLowLimit, severityHighLimit));
RiskDataPanel.this.onChange();
}
};
ChangeHandler changePosMitigationHandler = new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
int probability = getIndex(posMitigationProbability.getSelectedIndex(), probabilitiesSize);
int impact = getIndex(posMitigationImpact.getSelectedIndex(), impactsSize);
posMitigationSeverityKey.setVisible(true);
posMitigationSeverityValue.setVisible(true);
int severity = probability * impact;
posMitigationSeverityValue
.setHTML(HtmlSnippetUtils.getSeverityDefinition(severity, severityLowLimit, severityHighLimit));
RiskDataPanel.this.onChange();
}
};
name.addChangeHandler(changeHandler);
name.addKeyUpHandler(keyUpHandler);
description.addChangeHandler(changeHandler);
description.addKeyUpHandler(keyUpHandler);
description.setVisibleLines(6);
identifiedOn.addValueChangeHandler(new ValueChangeHandler<Date>() {
@Override
public void onValueChange(ValueChangeEvent<Date> event) {
onChange();
}
});
ValueChangeHandler<String> valueChangeHandler = new ValueChangeHandler<String>() {
@Override
public void onValueChange(ValueChangeEvent<String> event) {
RiskDataPanel.this.onChange();
}
};
category.addValueChangeHandler(valueChangeHandler);
identifiedBy.addValueChangeHandler(valueChangeHandler);
notes.addChangeHandler(changeHandler);
notes.setVisibleLines(6);
preMitigationProbability.addChangeHandler(changePreMitigationHandler);
preMitigationProbability.addKeyUpHandler(keyUpHandler);
preMitigationImpact.addChangeHandler(changePreMitigationHandler);
preMitigationImpact.addKeyUpHandler(keyUpHandler);
preMitigationNotes.addChangeHandler(changeHandler);
preMitigationNotes.setVisibleLines(6);
posMitigationProbability.addChangeHandler(changePosMitigationHandler);
posMitigationProbability.addKeyUpHandler(keyUpHandler);
posMitigationImpact.addChangeHandler(changePosMitigationHandler);
posMitigationImpact.addKeyUpHandler(keyUpHandler);
posMitigationNotes.addChangeHandler(changeHandler);
posMitigationNotes.setVisibleLines(6);
mitigationStrategy.addChangeHandler(changeHandler);
mitigationStrategy.setVisibleLines(6);
mitigationOwnerType.addChangeHandler(changeHandler);
mitigationOwner.addValueChangeHandler(valueChangeHandler);
mitigationRelatedEventIdentifierType.addChangeHandler(changeHandler);
mitigationRelatedEventIdentifierValue.addChangeHandler(changeHandler);
if (!editmode) {
posMitigationSeverityKey.setVisible(false);
posMitigationSeverityValue.setVisible(false);
preMitigationSeverityValue
.setHTML(HtmlSnippetUtils.getSeverityDefinition(0, severityLowLimit, severityHighLimit));
this.id.setVisible(false);
} else {
this.idBox.setVisible(false);
setRisk(risk);
}
// FIXME it must be visible later
mitigationOwnerTypeKey.setVisible(false);
mitigationOwnerType.setVisible(false);
mitigationRelatedEventIdentifierType.setVisible(false);
mitigationRelatedEventIdentifierValue.setVisible(false);
}
public boolean isValid() {
boolean valid = true;
if (name.getText().length() == 0) {
valid = false;
name.addStyleName("isWrong");
} else {
name.removeStyleName("isWrong");
}
if (identifiedOn.getValue() == null || identifiedOn.getValue().after(new Date())) {
valid = false;
identifiedOn.addStyleName("isWrong");
} else {
identifiedOn.removeStyleName("isWrong");
}
if (identifiedBy.getValue().length() == 0) {
valid = false;
identifiedBy.addStyleName("isWrong");
} else {
identifiedBy.removeStyleName("isWrong");
}
if (category.getValue().length() == 0) {
valid = false;
category.addStyleName("isWrong");
} else {
category.removeStyleName("isWrong");
}
checked = true;
return valid;
}
public void setRisk(IndexedRisk risk) {
this.id.setText(risk.getId());
this.name.setText(risk.getName());
this.description.setText(risk.getDescription());
this.identifiedOn.setValue(risk.getIdentifiedOn());
this.identifiedBy.setValue(risk.getIdentifiedBy());
this.category.setValue(risk.getCategory());
this.notes.setText(risk.getNotes());
int preProbability = getIndex(risk.getPreMitigationProbability(), probabilitiesSize);
int preImpact = getIndex(risk.getPreMitigationImpact(), impactsSize);
this.preMitigationProbability.setSelectedIndex(preProbability);
this.preMitigationImpact.setSelectedIndex(preImpact);
this.preMitigationNotes.setText(risk.getPreMitigationNotes());
this.preMitigationSeverityKey.setVisible(true);
this.preMitigationSeverityValue.setVisible(true);
int preSeverity = risk.getPreMitigationSeverity();
this.preMitigationSeverityValue
.setHTML(HtmlSnippetUtils.getSeverityDefinition(preSeverity, severityLowLimit, severityHighLimit));
int probability = getIndex(risk.getPostMitigationProbability(), probabilitiesSize);
int impact = getIndex(risk.getPostMitigationImpact(), impactsSize);
this.posMitigationProbability.setSelectedIndex(probability);
this.posMitigationImpact.setSelectedIndex(impact);
this.posMitigationNotes.setText(risk.getPostMitigationNotes());
if (probability != 0 || impact != 0) {
this.posMitigationSeverityKey.setVisible(true);
this.posMitigationSeverityValue.setVisible(true);
int posSeverity = risk.getPostMitigationSeverity();
this.posMitigationSeverityValue
.setHTML(HtmlSnippetUtils.getSeverityDefinition(posSeverity, severityLowLimit, severityHighLimit));
} else {
this.posMitigationSeverityKey.setVisible(false);
this.posMitigationSeverityValue.setVisible(false);
}
this.mitigationStrategy.setText(risk.getMitigationStrategy());
this.mitigationOwnerType.setText(risk.getMitigationOwnerType());
this.mitigationOwner.setValue(risk.getMitigationOwner());
this.mitigationRelatedEventIdentifierType.setText(risk.getMitigationRelatedEventIdentifierType());
this.mitigationRelatedEventIdentifierValue.setText(risk.getMitigationRelatedEventIdentifierValue());
this.createdOn = risk.getCreatedOn();
this.createdBy = risk.getCreatedBy();
}
public Risk getRisk() {
Risk risk = new Risk();
if (idBox.isVisible() && idBox.getText() != null && !"".equals(idBox.getText())) {
risk.setId(idBox.getText());
}
risk.setName(name.getText());
risk.setDescription(description.getText());
risk.setIdentifiedOn(identifiedOn.getValue());
risk.setIdentifiedBy(identifiedBy.getValue());
risk.setCategory(category.getValue());
risk.setNotes(notes.getText());
int preProbability = getIndex(preMitigationProbability.getSelectedIndex(), probabilitiesSize);
int preImpact = getIndex(preMitigationImpact.getSelectedIndex(), impactsSize);
int preSeverity = preProbability * preImpact;
risk.setPreMitigationProbability(preProbability);
risk.setPreMitigationImpact(preImpact);
risk.setPreMitigationSeverity(preSeverity);
risk.setPreMitigationSeverityLevel(
HtmlSnippetUtils.getSeverityLevel(preSeverity, severityLowLimit, severityHighLimit));
risk.setPreMitigationNotes(preMitigationNotes.getText());
int posProbability = getIndex(posMitigationProbability.getSelectedIndex(), probabilitiesSize);
int posImpact = getIndex(posMitigationImpact.getSelectedIndex(), impactsSize);
risk.setPostMitigationProbability(posProbability);
risk.setPostMitigationImpact(posImpact);
if (posProbability == 0 && posImpact == 0) {
risk.setPostMitigationSeverity(preSeverity);
risk.setPostMitigationSeverityLevel(
HtmlSnippetUtils.getSeverityLevel(preSeverity, severityLowLimit, severityHighLimit));
} else {
int posSeverity = posProbability * posImpact;
risk.setPostMitigationSeverity(posSeverity);
risk.setPostMitigationSeverityLevel(
HtmlSnippetUtils.getSeverityLevel(posSeverity, severityLowLimit, severityHighLimit));
}
risk.setPostMitigationNotes(posMitigationNotes.getText());
risk.setMitigationStrategy(mitigationStrategy.getText());
risk.setMitigationOwnerType(mitigationOwnerType.getText());
risk.setMitigationOwner(mitigationOwner.getValue());
risk.setMitigationRelatedEventIdentifierType(mitigationRelatedEventIdentifierType.getText());
risk.setMitigationRelatedEventIdentifierValue(mitigationRelatedEventIdentifierValue.getText());
if (editmode) {
risk.setCreatedOn(createdOn);
risk.setCreatedBy(createdBy);
}
return risk;
}
public void clear() {
name.setText("");
description.setText("");
identifiedBy.setValue("");
category.setValue("");
notes.setText("");
preMitigationProbability.setSelectedIndex(probabilitiesSize - 1);
preMitigationImpact.setSelectedIndex(impactsSize - 1);
preMitigationNotes.setText("");
posMitigationProbability.setSelectedIndex(probabilitiesSize - 1);
posMitigationImpact.setSelectedIndex(impactsSize - 1);
posMitigationNotes.setText("");
mitigationStrategy.setText("");
mitigationOwnerType.setText("");
mitigationOwner.setValue("");
mitigationRelatedEventIdentifierType.setText("");
mitigationRelatedEventIdentifierValue.setText("");
}
private int getIndex(int mitigationField, int fieldsSize) {
return fieldsSize - mitigationField - 1;
}
/**
* Is user data panel editable, i.e. on create user mode
*
* @return true if editable
*/
public boolean isEditmode() {
return editmode;
}
/**
* Is user data panel has been changed
*
* @return changed
*/
public boolean isChanged() {
return changed;
}
@Override
public HandlerRegistration addValueChangeHandler(ValueChangeHandler<Risk> handler) {
return addHandler(handler, ValueChangeEvent.getType());
}
protected void onChange() {
changed = true;
if (checked) {
isValid();
}
ValueChangeEvent.fire(this, getValue());
}
public Risk getValue() {
return getRisk();
}
public SelectedItems<RiskIncidence> getSelectedIncidences() {
return incidenceList.getSelected();
}
}