/**
* 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.ingest.process;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import org.roda.core.data.common.RodaConstants;
import org.roda.core.data.v2.common.Pair;
import org.roda.core.data.v2.ip.IndexedAIP;
import org.roda.core.data.v2.jobs.PluginInfo;
import org.roda.core.data.v2.jobs.PluginParameter;
import org.roda.core.data.v2.jobs.PluginParameter.PluginParameterType;
import org.roda.core.data.v2.jobs.PluginType;
import org.roda.core.data.v2.risks.IndexedRisk;
import org.roda.core.data.v2.risks.Risk.SEVERITY_LEVEL;
import org.roda.wui.client.browse.BrowserService;
import org.roda.wui.client.common.IncrementalAssociativeList;
import org.roda.wui.client.common.dialogs.SelectAipDialog;
import org.roda.wui.client.common.utils.PluginUtils;
import org.roda.wui.common.client.ClientLogger;
import org.roda.wui.common.client.tools.DescriptionLevelUtils;
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.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.safehtml.shared.SafeHtmlUtils;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.IntegerBox;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.RadioButton;
import com.google.gwt.user.client.ui.TextBox;
import config.i18n.client.ClientMessages;
public class PluginParameterPanel extends Composite {
private static final ClientMessages messages = GWT.create(ClientMessages.class);
private ClientLogger logger = new ClientLogger(getClass().getName());
private final PluginParameter parameter;
private final FlowPanel layout;
private String value;
public PluginParameterPanel(PluginParameter parameter) {
super();
this.parameter = parameter;
layout = new FlowPanel();
initWidget(layout);
updateLayout();
layout.addStyleName("plugin-options-parameter");
}
private void updateLayout() {
if (PluginParameterType.BOOLEAN.equals(parameter.getType())) {
createBooleanLayout();
} else if (PluginParameterType.STRING.equals(parameter.getType())) {
createStringLayout();
} else if (PluginParameterType.PLUGIN_SIP_TO_AIP.equals(parameter.getType())) {
createPluginSipToAipLayout();
} else if (PluginParameterType.AIP_ID.equals(parameter.getType())) {
createSelectAipLayout();
} else if (PluginParameterType.RISK_ID.equals(parameter.getType())) {
createSelectRiskLayout();
} else if (PluginParameterType.SEVERITY.equals(parameter.getType())) {
createSelectSeverityLayout();
} else if (PluginParameterType.RODA_OBJECT.equals(parameter.getType())) {
createSelectRodaObjectLayout();
} else if (PluginParameterType.INTEGER.equals(parameter.getType())) {
createIntegerLayout();
} else {
logger
.warn("Unsupported plugin parameter type: " + parameter.getType() + ". Reverting to default parameter editor.");
createStringLayout();
}
}
private void createSelectSeverityLayout() {
Label parameterName = new Label(parameter.getName());
final ListBox severityBox = new ListBox();
severityBox.addStyleName("form-selectbox");
severityBox.addStyleName("form-textbox-small");
for (SEVERITY_LEVEL severity : SEVERITY_LEVEL.values()) {
severityBox.addItem(messages.severityLevel(severity), severity.toString());
}
value = severityBox.getSelectedValue();
severityBox.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
value = severityBox.getSelectedValue();
}
});
severityBox.setTitle("severity box");
layout.add(parameterName);
layout.add(severityBox);
addHelp();
}
private void createSelectRiskLayout() {
Label parameterName = new Label(parameter.getName());
IncrementalAssociativeList list = new IncrementalAssociativeList(IndexedRisk.class, RodaConstants.RISK_ID,
RodaConstants.RISK_SEARCH, messages.getRisksDialogName());
list.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
IncrementalAssociativeList sourceList = (IncrementalAssociativeList) event.getSource();
List<String> values = sourceList.getTextBoxesValue();
if (!values.isEmpty()) {
value = getValuesString(values);
}
}
private String getValuesString(List<String> values) {
StringBuilder builder = new StringBuilder();
for (String stringValue : values) {
builder.append(stringValue).append(",");
}
return builder.substring(0, builder.length() - 1);
}
});
layout.add(parameterName);
layout.add(list);
addHelp();
}
private void createSelectAipLayout() {
Label parameterName = new Label(parameter.getName());
final HorizontalPanel editPanel = new HorizontalPanel();
final FlowPanel aipPanel = new FlowPanel();
final Button button = new Button(messages.pluginAipIdButton());
final FlowPanel buttonsPanel = new FlowPanel();
final Anchor editButton = new Anchor(SafeHtmlUtils.fromSafeConstant("<i class=\"fa fa-edit\"></i>"));
final Anchor removeButton = new Anchor(SafeHtmlUtils.fromSafeConstant("<i class=\"fa fa-remove\"></i>"));
buttonsPanel.add(editButton);
buttonsPanel.add(removeButton);
ClickHandler editClickHandler = new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
SelectAipDialog selectAipDialog = new SelectAipDialog(parameter.getName(), false);
selectAipDialog.setSingleSelectionMode();
selectAipDialog.showAndCenter();
selectAipDialog.addValueChangeHandler(new ValueChangeHandler<IndexedAIP>() {
@Override
public void onValueChange(ValueChangeEvent<IndexedAIP> event) {
IndexedAIP aip = event.getValue();
Label itemTitle = new Label();
HTMLPanel itemIconHtmlPanel = DescriptionLevelUtils.getElementLevelIconHTMLPanel(aip.getLevel());
itemIconHtmlPanel.addStyleName("itemIcon");
itemTitle.setText(aip.getTitle() != null ? aip.getTitle() : aip.getId());
itemTitle.addStyleName("itemText");
aipPanel.clear();
aipPanel.add(itemIconHtmlPanel);
aipPanel.add(itemTitle);
editPanel.add(aipPanel);
editPanel.add(buttonsPanel);
editPanel.setCellWidth(aipPanel, "100%");
editPanel.setVisible(true);
button.setVisible(false);
value = aip.getId();
}
});
}
};
ClickHandler removeClickHandler = new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
editPanel.setVisible(false);
button.setVisible(true);
value = null;
}
};
button.addClickHandler(editClickHandler);
editButton.addClickHandler(editClickHandler);
removeButton.addClickHandler(removeClickHandler);
layout.add(parameterName);
layout.add(button);
layout.add(editPanel);
parameterName.addStyleName("form-label");
aipPanel.addStyleName("itemPanel");
button.addStyleName("form-button btn btn-play");
buttonsPanel.addStyleName("itemButtonsPanel");
editButton.addStyleName("toolbarLink toolbarLinkSmall");
removeButton.addStyleName("toolbarLink toolbarLinkSmall");
}
private void createSelectRodaObjectLayout() {
Label parameterName = new Label(parameter.getName());
final ListBox objectBox = new ListBox();
objectBox.addStyleName("form-selectbox");
objectBox.addStyleName("form-textbox-small");
BrowserService.Util.getInstance()
.retrieveReindexPluginObjectClasses(new AsyncCallback<Set<Pair<String, String>>>() {
@Override
public void onFailure(Throwable caught) {
// do nothing
}
@Override
public void onSuccess(Set<Pair<String, String>> result) {
for (Pair<String, String> classNames : result) {
objectBox.addItem(classNames.getFirst(), classNames.getSecond());
}
objectBox.addItem(RodaConstants.PLUGIN_SELECT_ALL_RODA_OBJECTS, RodaConstants.PLUGIN_SELECT_ALL_RODA_OBJECTS);
objectBox.setSelectedIndex(objectBox.getItemCount() - 1);
value = objectBox.getSelectedValue();
}
});
objectBox.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
value = objectBox.getSelectedValue();
}
});
objectBox.setTitle("object box");
layout.add(parameterName);
layout.add(objectBox);
addHelp();
}
private void createPluginSipToAipLayout() {
List<PluginType> plugins = Arrays.asList(PluginType.SIP_TO_AIP);
BrowserService.Util.getInstance().retrievePluginsInfo(plugins, new AsyncCallback<List<PluginInfo>>() {
@Override
public void onFailure(Throwable caught) {
// do nothing
}
@Override
public void onSuccess(List<PluginInfo> pluginsInfo) {
Label parameterName = new Label(parameter.getName());
layout.add(parameterName);
addHelp();
FlowPanel radioGroup = new FlowPanel();
PluginUtils.sortByName(pluginsInfo);
for (final PluginInfo pluginInfo : pluginsInfo) {
if (pluginInfo != null) {
RadioButton pRadio = new RadioButton(parameter.getName(),
messages.pluginLabelWithVersion(pluginInfo.getName(), pluginInfo.getVersion()));
if (pluginInfo.getId().equals(parameter.getDefaultValue())) {
pRadio.setValue(true);
value = pluginInfo.getId();
}
Label pHelp = new Label(pluginInfo.getDescription());
pRadio.setTitle("radio button");
radioGroup.add(pRadio);
radioGroup.add(pHelp);
pRadio.addStyleName("form-radiobutton");
pHelp.addStyleName("form-help");
pRadio.addValueChangeHandler(new ValueChangeHandler<Boolean>() {
@Override
public void onValueChange(ValueChangeEvent<Boolean> event) {
if (event.getValue()) {
value = pluginInfo.getId();
}
}
});
}
}
layout.add(radioGroup);
radioGroup.addStyleName("form-radiogroup");
parameterName.addStyleName("form-label");
}
});
}
private void createIntegerLayout() {
Label parameterName = new Label(parameter.getName());
IntegerBox parameterBox = new IntegerBox();
if (parameter.getDefaultValue() != null) {
parameterBox.setText(parameter.getDefaultValue());
value = parameter.getDefaultValue();
}
parameterBox.setTitle("parameter box");
layout.add(parameterName);
layout.add(parameterBox);
addHelp();
parameterName.addStyleName("form-label");
parameterBox.addStyleName("form-textbox");
// binding change
parameterBox.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
value = ((IntegerBox) event.getSource()).getValue().toString();
}
});
}
private void createStringLayout() {
Label parameterName = new Label(parameter.getName());
TextBox parameterBox = new TextBox();
if (parameter.getDefaultValue() != null) {
parameterBox.setText(parameter.getDefaultValue());
value = parameter.getDefaultValue();
}
parameterBox.setTitle("parameter box");
layout.add(parameterName);
layout.add(parameterBox);
addHelp();
parameterName.addStyleName("form-label");
parameterBox.addStyleName("form-textbox");
// binding change
parameterBox.addValueChangeHandler(new ValueChangeHandler<String>() {
@Override
public void onValueChange(ValueChangeEvent<String> event) {
value = event.getValue();
}
});
}
private void createBooleanLayout() {
CheckBox checkBox = new CheckBox(parameter.getName());
checkBox.setValue("true".equals(parameter.getDefaultValue()));
value = "true".equals(parameter.getDefaultValue()) ? "true" : "false";
checkBox.setEnabled(!parameter.isReadonly());
checkBox.getElement().setTitle("checkbox");
layout.add(checkBox);
addHelp();
checkBox.addStyleName("form-checkbox");
checkBox.addValueChangeHandler(new ValueChangeHandler<Boolean>() {
@Override
public void onValueChange(ValueChangeEvent<Boolean> event) {
value = event.getValue() ? "true" : "false";
}
});
}
private void addHelp() {
String pDescription = parameter.getDescription();
if (pDescription != null && pDescription.length() > 0) {
Label pHelp = new Label(pDescription);
layout.add(pHelp);
pHelp.addStyleName("form-help");
}
}
public String getValue() {
return value;
}
public PluginParameter getParameter() {
return parameter;
}
}