blob: c3914f0a9defd90417fd4a4ff33c819131da55cc [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 Parasoft.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Janusz Studzizba - initial API and implementation
* Dariusz Oszczedlowski - initial API and implementation
* Magdalena Gniewek - initial API and implementation
* Michal Wlodarczyk - initial API and implementation
*******************************************************************************/
package org.eclipse.opencert.webapp.reports.view;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.eclipse.opencert.webapp.reports.exttools.ExternalToolConnectorsRegistry;
import org.eclipse.opencert.webapp.reports.exttools.connectors.NotDefinedConnector;
import org.eclipse.opencert.webapp.reports.exttools.connectors.NotNeededConnector;
import org.eclipse.opencert.webapp.reports.util.OpencertLogger;
import org.eclipse.opencert.webapp.reports.util.SpringContextHelper;
import org.eclipse.opencert.externaltools.api.ExternalToolQuery;
import org.eclipse.opencert.externaltools.api.ExternalToolQuerySetting;
import org.eclipse.opencert.externaltools.api.IExternalToolConnector;
import org.eclipse.opencert.externaltools.api.dao.ExternalToolQueryDAO;
import org.eclipse.opencert.externaltools.api.dao.ExternalToolQueryDAOImpl;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.shared.ui.label.ContentMode;
import com.vaadin.ui.Button;
import com.vaadin.ui.CheckBox;
import com.vaadin.ui.Component;
import com.vaadin.ui.GridLayout;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.Layout;
import com.vaadin.ui.NativeSelect;
import com.vaadin.ui.Notification;
import com.vaadin.ui.Notification.Type;
import com.vaadin.ui.Panel;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;
public class ExternalToolConnectorWindow
extends Window
{
private static final String RESULT_MSG_LABEL = " Msg: ";
private static final long serialVersionUID = 392685431243145173L;
private IExternalToolConnector selectedConnector;
private ExternalToolQuery externalToolQuery;
private Panel instanceSettingsPanel = new Panel("Instance Settings");
private Button saveButton;
private Component connectorInstancePanel;
private TextField g2;
private TextField gMsg;
private CheckBox enableYellowRange;
private TextField y1;
private TextField y2;
private TextField yMsg;
private TextField r2;
private TextField rMsg;
private TextField instanceLabelField;
public ExternalToolConnectorWindow(long currentBaseElementCdoId)
{
super("Add/Edit External Tool Connector");
setModal(true);
ExternalToolQueryDAO externalToolQueryDAO = (ExternalToolQueryDAO) SpringContextHelper.getBeanFromWebappContext(ExternalToolQueryDAOImpl.SPRING_NAME);
externalToolQuery = externalToolQueryDAO.findRecentByBaseElementId(currentBaseElementCdoId);
setStyleName("externalToolConnectorWindow");
VerticalLayout mainContent = new VerticalLayout();
mainContent.addComponent(createConnectorTypePanel());
connectorInstancePanel = createConnectorInstancePanel();
if (externalToolQuery.getExternalToolConnectorId().equals(NotNeededConnector.class.getName())
|| externalToolQuery.getExternalToolConnectorId().equals(NotDefinedConnector.class.getName())) {
connectorInstancePanel.setVisible(false);
} else {
connectorInstancePanel.setVisible(true);
}
mainContent.addComponent(connectorInstancePanel);
mainContent.addComponent(createSaveAndCancelButtons());
setContent(mainContent);
this.addCloseListener(new CloseListener() {
private static final long serialVersionUID = 6673378500979019062L;
@Override
public void windowClose(CloseEvent e)
{
}
});
}
private Component createConnectorTypePanel()
{
Panel connectorTypePanel = new Panel("Connector Type");
connectorTypePanel.setStyleName("externalToolConnectorTypePanelStyle windowSection");
ExternalToolConnectorsRegistry externalToolConnectorsRegistry = new ExternalToolConnectorsRegistry();
List<IExternalToolConnector> connectors = externalToolConnectorsRegistry.getExternalToolConnectors();
BeanItemContainer<IExternalToolConnector> connectorsContainer = new BeanItemContainer<IExternalToolConnector>(IExternalToolConnector.class, connectors);
final NativeSelect connectorClassSelect = new NativeSelect(null, connectorsContainer);
connectorClassSelect.setStyleName("connectorType");
connectorClassSelect.setImmediate(true);
List<IExternalToolConnector> connectorsList = new ArrayList<IExternalToolConnector>();
connectorsList.addAll(connectors);
initSelectedConnector(connectorsList);
connectorClassSelect.setValue(selectedConnector);
connectorClassSelect.setItemCaptionPropertyId("name");
final Label connectorDescLabel = new Label();
connectorDescLabel.setStyleName("connectorTypeDescription");
connectorDescLabel.setValue("" + ((IExternalToolConnector) connectorClassSelect.getValue()).getDescription());
connectorClassSelect.setNullSelectionAllowed(false);
connectorClassSelect.addValueChangeListener(new ValueChangeListener() {
private static final long serialVersionUID = -6331557979793223438L;
@Override
public void valueChange(ValueChangeEvent event)
{
selectedConnector = (IExternalToolConnector) event.getProperty().getValue();
if (selectedConnector.getExternalToolConnectorId().equals(NotNeededConnector.class.getName())
|| selectedConnector.getExternalToolConnectorId().equals(NotDefinedConnector.class.getName())) {
connectorInstancePanel.setVisible(false);
} else {
connectorInstancePanel.setVisible(true);
}
externalToolQuery = selectedConnector.bootstrapExternalToolQueryInstance();
connectorDescLabel.setValue("" + selectedConnector.getDescription());
VerticalLayout keyFieldsLayout = new VerticalLayout();
instanceLabelField.setValue(externalToolQuery.getInstanceLabel() != null ? externalToolQuery.getInstanceLabel() : "");
generateInstanceSettings(keyFieldsLayout);
setInstanceResultProcessingSettingsValuesInGUI(g2, gMsg, enableYellowRange, y1, y2, yMsg, r2, rMsg);
instanceSettingsPanel.setContent(keyFieldsLayout);
}
});
HorizontalLayout connectorTypeLayout = new HorizontalLayout();
connectorTypeLayout.addComponent(connectorClassSelect);
connectorTypeLayout.addComponent(connectorDescLabel);
connectorTypePanel.setContent(connectorTypeLayout);
return connectorTypePanel;
}
private Component createConnectorInstancePanel()
{
Panel connectorInstancePanel = new Panel("Connector Instance");
connectorInstancePanel.setImmediate(true);
connectorInstancePanel.setStyleName("externalToolConnectorInstancePanelStyle windowSection");
instanceLabelField = new TextField("Instance Label: ");
instanceLabelField.setValue(externalToolQuery.getInstanceLabel() != null ? externalToolQuery.getInstanceLabel() : "");
instanceLabelField.addValueChangeListener((event) ->
{
externalToolQuery.setInstanceLabel((String) event.getProperty().getValue());
}
);
instanceLabelField.setStyleName("externalToolTextFieldStyle");
VerticalLayout instanceAndResultProcessingLayout = new VerticalLayout();
instanceAndResultProcessingLayout.addComponent(instanceLabelField);
HorizontalLayout settingsAndResultPanel = new HorizontalLayout();
settingsAndResultPanel.addComponent(createInstanceSettingsPanel());
settingsAndResultPanel.addComponent(createInstanceResultProcessingPanel());
instanceAndResultProcessingLayout.addComponent(settingsAndResultPanel);
connectorInstancePanel.setContent(instanceAndResultProcessingLayout);
return connectorInstancePanel;
}
private Component createInstanceSettingsPanel()
{
instanceSettingsPanel.setStyleName("externalInstanceSettingsPanelStyle windowSection");
VerticalLayout keyFieldsLayout = new VerticalLayout();
generateInstanceSettings(keyFieldsLayout);
instanceSettingsPanel.setContent(keyFieldsLayout);
return instanceSettingsPanel;
}
private Component createInstanceResultProcessingPanel()
{
Panel instanceResultProcessingPanel = new Panel("Instance Execution Result Processing");
instanceResultProcessingPanel.setStyleName("externalToolinstanceResultProcessingPanelStyle windowSection");
Label resultProcessingDescriptionLabel = new Label(
"A result of connector execution is a number.<br/>"
+ "For the specific result number ranges, please define:"
+ "<ul>"
+ "<li>color of the indicator (Green, Yellow, Red)</li>"
+ "<li>message - the text to be displayed on the indicator.<br/>"
+ "If you enter {result}, the actual result number "
+ "will be presented</li>"
+ "</ul>", ContentMode.HTML);
resultProcessingDescriptionLabel.setStyleName("resultProcessingDescriptionLabelStyle");
GridLayout resultColorsLayout = new GridLayout(7, 3);
resultColorsLayout.setSizeFull();
resultColorsLayout.setWidth("380px");
resultColorsLayout.setHeight("80px");
resultColorsLayout.setSpacing(true);
Label gLabel = new Label("Green:");
gLabel.setWidth(null);
Label g2Label = new Label("Result <");
g2Label.setWidth(null);
g2 = createResultField(null, "externalToolRPTextFieldStyle");
g2.addValueChangeListener(new ValueChangeListener() {
private static final long serialVersionUID = 4715881879930854701L;
@Override
public void valueChange(ValueChangeEvent event)
{
try {
externalToolQuery.setGreenStatusMaxValue(Integer.valueOf(((String) event.getProperty().getValue())).intValue());
} catch (NumberFormatException e) {
Notification.show("Only Integers allowed!", Type.WARNING_MESSAGE);
g2.setValue("0");
externalToolQuery.setGreenStatusMaxValue(0);
}
}
});
Label g0Msg = new Label(RESULT_MSG_LABEL);
g0Msg.setWidth(null);
gMsg = createResultField(null, "externalToolMsgStyle");
gMsg.setImmediate(true);
gMsg.addValueChangeListener(new ValueChangeListener() {
private static final long serialVersionUID = 1957990628396228333L;
@Override
public void valueChange(ValueChangeEvent event)
{
externalToolQuery.setGreenStatusMsg((String) event.getProperty().getValue());
}
});
resultColorsLayout.addComponent(gLabel, 1, 0);
resultColorsLayout.addComponent(g2Label, 3, 0);
resultColorsLayout.addComponent(g2, 4, 0);
resultColorsLayout.addComponent(g0Msg, 5, 0);
resultColorsLayout.addComponent(gMsg, 6, 0);
final Label yLabel = new Label("Yellow: ");
y1 = createResultField(null, "externalToolRPTextFieldStyle");
y1.addValueChangeListener(new ValueChangeListener() {
private static final long serialVersionUID = 888631899447244865L;
@Override
public void valueChange(ValueChangeEvent event)
{
try {
externalToolQuery.setYellowStatusMinValue(Integer.valueOf(((String) event.getProperty().getValue())).intValue());
} catch (NumberFormatException e) {
Notification.show("Only Integers allowed!", Type.WARNING_MESSAGE);
y1.setValue("0");
externalToolQuery.setYellowStatusMinValue(0);
}
}
});
final Label yLabel2 = new Label(" < Result < ");
yLabel2.setWidth(null);
y2 = createResultField(null, "externalToolRPTextFieldStyle");
y2.addValueChangeListener(new ValueChangeListener() {
private static final long serialVersionUID = 5676009029521095443L;
@Override
public void valueChange(ValueChangeEvent event)
{
try {
externalToolQuery.setYellowStatusMaxValue(Integer.valueOf(((String) event.getProperty().getValue())).intValue());
} catch (NumberFormatException e) {
Notification.show("Only Integers allowed!", Type.WARNING_MESSAGE);
y2.setValue("0");
externalToolQuery.setYellowStatusMaxValue(0);
}
}
});
final Label yLabelMsg = new Label(RESULT_MSG_LABEL);
yMsg = createResultField(null, "externalToolMsgStyle");
yMsg.addValueChangeListener(new ValueChangeListener() {
private static final long serialVersionUID = -1217564601332567537L;
@Override
public void valueChange(ValueChangeEvent event)
{
externalToolQuery.setYellowStatusMsg((String) event.getProperty().getValue());
}
});
enableYellowRange = new CheckBox("");
enableYellowRange.addValueChangeListener((e) ->
{
final boolean isChecked = enableYellowRange.getValue();
externalToolQuery.setYellowEnabled(isChecked);
enableYellowComponents(isChecked, yLabel, yLabel2, yLabelMsg);
});
final boolean isC = externalToolQuery.isYellowEnabled();
enableYellowRange.setValue(isC);
enableYellowComponents(isC, yLabel, yLabel2, yLabelMsg);
resultColorsLayout.addComponent(enableYellowRange, 0, 1);
resultColorsLayout.addComponent(yLabel, 1, 1);
resultColorsLayout.addComponent(y1, 2, 1);
resultColorsLayout.addComponent(yLabel2, 3, 1);
resultColorsLayout.addComponent(y2, 4, 1);
resultColorsLayout.addComponent(yLabelMsg, 5, 1);
resultColorsLayout.addComponent(yMsg, 6, 1);
Label rLabel = new Label("Red:");
Label r2Label = new Label("Result >");
r2 = createResultField(null, "externalToolRPTextFieldStyle");
r2.addValueChangeListener(new ValueChangeListener() {
private static final long serialVersionUID = -7676473529489946340L;
@Override
public void valueChange(ValueChangeEvent event)
{
try {
externalToolQuery.setRedStatusMinValue(Integer.valueOf(((String) event.getProperty().getValue())).intValue());
} catch (NumberFormatException e) {
Notification.show("Only Integers allowed!", Type.WARNING_MESSAGE);
r2.setValue("0");
externalToolQuery.setRedStatusMinValue(0);
}
}
});
Label r0Msg = new Label(RESULT_MSG_LABEL);
rMsg = createResultField(null, "externalToolMsgStyle");
rMsg.addValueChangeListener(new ValueChangeListener() {
private static final long serialVersionUID = -2329987742752882823L;
@Override
public void valueChange(ValueChangeEvent event)
{
externalToolQuery.setRedStatusMsg((String) event.getProperty().getValue());
}
});
resultColorsLayout.addComponent(rLabel, 1, 2);
resultColorsLayout.addComponent(r2Label, 3, 2);
resultColorsLayout.addComponent(r2, 4, 2);
resultColorsLayout.addComponent(r0Msg, 5, 2);
resultColorsLayout.addComponent(rMsg, 6, 2);
VerticalLayout instanceResultProcessingLayout = new VerticalLayout();
instanceResultProcessingLayout.addComponent(resultProcessingDescriptionLabel);
instanceResultProcessingLayout.addComponent(resultColorsLayout);
instanceResultProcessingPanel.setContent(instanceResultProcessingLayout);
setInstanceResultProcessingSettingsValuesInGUI(g2, gMsg, enableYellowRange, y1, y2, yMsg, r2, rMsg);
return instanceResultProcessingPanel;
}
private void enableYellowComponents(final boolean isChecked, Label... labels)
{
y1.setEnabled(isChecked);
y2.setEnabled(isChecked);
yMsg.setEnabled(isChecked);
if (labels == null) {
return;
}
for (Label label : labels) {
label.setEnabled(isChecked);
}
}
private TextField createResultField(String name, String cssStyle)
{
final TextField result = new TextField(name);
result.setStyleName(cssStyle);
return result;
}
private void setInstanceResultProcessingSettingsValuesInGUI(TextField g2, TextField gMsg, CheckBox enableYellow, TextField y1, TextField y2, TextField yMsg,
TextField r2, TextField rMsg)
{
g2.setValue(String.valueOf(externalToolQuery.getGreenStatusMaxValue()));
gMsg.setValue(String.valueOf(externalToolQuery.getGreenStatusMsg()));
enableYellow.setValue(externalToolQuery.isYellowEnabled());
y1.setValue(String.valueOf(externalToolQuery.getYellowStatusMinValue()));
y2.setValue(String.valueOf(externalToolQuery.getYellowStatusMaxValue()));
yMsg.setValue(String.valueOf(externalToolQuery.getYellowStatusMsg()));
r2.setValue(String.valueOf(externalToolQuery.getRedStatusMinValue()));
rMsg.setValue(String.valueOf(externalToolQuery.getRedStatusMsg()));
}
private HorizontalLayout createSaveAndCancelButtons()
{
saveButton = new Button("Save");
Button cancelButton = new Button("Cancel");
cancelButton.addClickListener((e) -> close());
HorizontalLayout saveAndCancelButtonsLayout = new HorizontalLayout();
saveAndCancelButtonsLayout.addComponent(saveButton);
saveAndCancelButtonsLayout.addComponent(cancelButton);
saveAndCancelButtonsLayout.addStyleName("saveAndCancelButtonsStyle commonButton");
return saveAndCancelButtonsLayout;
}
private void generateInstanceSettings(Layout keyFieldsLayout)
{
final Map<String, String> settingsMap = externalToolQuery.getSettingsAsMap();
if (selectedConnector == null) {
throw new IllegalStateException("Null selectedConnector");
}
final List<String> settingKeys = selectedConnector.getSettingKeys();
for (String settingKey : settingKeys)
{
final TextField textField = new TextField(ExternalToolSettingGUIUtil.generateLabelFromKey(settingKey));
textField.setImmediate(true);
textField.setStyleName("externalToolTextFieldStyle");
final String value = settingsMap.get(settingKey);
if (value == null) {
OpencertLogger.error("Illegal State! Null value for settings " + settingKey + " for connector: " + selectedConnector + " settingsMap: " + settingsMap);
}
textField.setValue(value);
textField.addValueChangeListener(new ValueChangeListener() {
private static final long serialVersionUID = -1680454855393996670L;
@Override
public void valueChange(ValueChangeEvent event)
{
final String key = ExternalToolSettingGUIUtil.generateKeyFromLabel(textField.getCaption());
String value = (String) event.getProperty().getValue();
final List<ExternalToolQuerySetting> externalToolQuerySettings = new ArrayList<ExternalToolQuerySetting>(
externalToolQuery.getExternalToolQuerySettings());
for (ExternalToolQuerySetting eTQuerySetting : externalToolQuerySettings)
{
if (eTQuerySetting.getName().equals(key)) {
eTQuerySetting.setValue(value);
break;
}
}
}
});
keyFieldsLayout.addComponent(textField);
}
}
private static class ExternalToolSettingGUIUtil
{
public static final String COLON = ":";
public static String generateLabelFromKey(String eTQSettingKey)
{
return eTQSettingKey + COLON;
}
public static String generateKeyFromLabel(String label)
{
if (!label.endsWith(COLON)) {
throw new IllegalArgumentException();
}
return label.substring(0, label.length()-1);
}
}
private void initSelectedConnector(List<IExternalToolConnector> connectorsList)
{
if (externalToolQuery == null) {
selectedConnector = connectorsList.get(0);
externalToolQuery = selectedConnector.bootstrapExternalToolQueryInstance();
} else {
for (IExternalToolConnector connector : connectorsList) {
if (connector.getExternalToolConnectorId().equals(externalToolQuery.getExternalToolConnectorId())) {
selectedConnector = connector;
break;
}
}
}
}
public IExternalToolConnector getSelectedConnector()
{
return selectedConnector;
}
public Button getSaveButton()
{
return saveButton;
}
public ExternalToolQuery getExternalToolQuery()
{
return externalToolQuery;
}
}