/** * 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.process; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.roda.core.data.common.RodaConstants; import org.roda.core.data.v2.index.IsIndexed; import org.roda.core.data.v2.index.select.SelectedItems; import org.roda.core.data.v2.index.select.SelectedItemsList; import org.roda.core.data.v2.index.select.SelectedItemsNone; import org.roda.core.data.v2.ip.TransferredResource; import org.roda.core.data.v2.jobs.PluginInfo; import org.roda.core.data.v2.jobs.PluginType; import org.roda.wui.client.browse.BrowserService; import org.roda.wui.client.common.LastSelectedItemsSingleton; import org.roda.wui.client.common.UserLogin; import org.roda.wui.client.common.utils.JavascriptUtils; import org.roda.wui.client.common.utils.PluginUtils; import org.roda.wui.client.ingest.process.PluginOptionsPanel; import org.roda.wui.common.client.HistoryResolver; import org.roda.wui.common.client.tools.HistoryUtils; import org.roda.wui.common.client.tools.ListUtils; import com.google.gwt.core.client.GWT; 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.SafeHtml; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.user.client.rpc.AsyncCallback; 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.HTML; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.Widget; import config.i18n.client.ClientMessages; /** * @author Luis Faria * */ public abstract class CreateSelectedJob<T extends IsIndexed> extends Composite { public static final HistoryResolver RESOLVER = new HistoryResolver() { @Override public void resolve(List<String> historyTokens, final AsyncCallback<Widget> callback) { if (historyTokens.size() == 1) { if (RodaConstants.JOB_PROCESS_INGEST.equals(historyTokens.get(0))) { CreateIngestJob createIngestJob = new CreateIngestJob(); callback.onSuccess(createIngestJob); } else if (RodaConstants.JOB_PROCESS_ACTION.equals(historyTokens.get(0))) { CreateActionJob createActionJob = new CreateActionJob(); callback.onSuccess(createActionJob); } else { HistoryUtils.newHistory(CreateSelectedJob.RESOLVER); callback.onSuccess(null); } } else { HistoryUtils.newHistory(CreateSelectedJob.RESOLVER); callback.onSuccess(null); } } @Override public void isCurrentUserPermitted(AsyncCallback<Boolean> callback) { UserLogin.getInstance().checkRoles(new HistoryResolver[] {Process.RESOLVER}, false, callback); } @Override public List<String> getHistoryPath() { return ListUtils.concat(Process.RESOLVER.getHistoryPath(), getHistoryToken()); } @Override public String getHistoryToken() { return "create"; } }; @SuppressWarnings("rawtypes") public interface MyUiBinder extends UiBinder<Widget, CreateSelectedJob> { } private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class); private static final ClientMessages messages = GWT.create(ClientMessages.class); private SelectedItems<?> selected = new SelectedItemsNone<>(); private List<PluginInfo> plugins = null; private PluginInfo selectedPlugin = null; private String listSelectedClass = TransferredResource.class.getName(); @UiField TextBox name; @UiField FlowPanel targetPanel; @UiField Label selectedObject; @UiField Label workflowCategoryLabel; @UiField FlowPanel workflowCategoryList; @UiField FlowPanel workflowList; @UiField FlowPanel workflowListDescription; @UiField Label workflowListTitle; @UiField HTML workflowListDescriptionCategories; @UiField FlowPanel workflowPanel; @UiField PluginOptionsPanel workflowOptions; @UiField Button buttonCreate; @UiField Button buttonObtainCommand; @UiField Button buttonCancel; public CreateSelectedJob(final List<PluginType> pluginType) { this.selected = LastSelectedItemsSingleton.getInstance().getSelectedItems(); initWidget(uiBinder.createAndBindUi(this)); boolean isEmpty = updateObjectList(); if (isEmpty) { List<String> lastHistory = LastSelectedItemsSingleton.getInstance().getLastHistory(); HistoryUtils.newHistory(lastHistory); } BrowserService.Util.getInstance().retrievePluginsInfo(pluginType, new AsyncCallback<List<PluginInfo>>() { @Override public void onFailure(Throwable caught) { // do nothing } @Override public void onSuccess(List<PluginInfo> pluginsInfo) { init(pluginsInfo); } }); } @Override protected void onLoad() { super.onLoad(); JavascriptUtils.stickSidebar(); } public void init(List<PluginInfo> plugins) { this.plugins = plugins; name.setText(messages.processNewDefaultName(new Date())); workflowOptions.setPlugins(plugins); configurePlugins(selected.getSelectedClass()); workflowCategoryList.addStyleName("form-listbox-job"); } public abstract boolean updateObjectList(); public void configurePlugins(final String selectedClass) { List<String> categoriesOnListBox = new ArrayList<>(); if (plugins != null) { PluginUtils.sortByName(plugins); int pluginAdded = 0; for (PluginInfo pluginInfo : plugins) { if (pluginInfo != null) { List<String> pluginCategories = pluginInfo.getCategories(); if (pluginCategories != null) { for (String category : pluginCategories) { if (!categoriesOnListBox.contains(category) && !category.equals(RodaConstants.PLUGIN_CATEGORY_NOT_LISTABLE) && ((!isSelectedEmpty() && pluginInfo.hasObjectClass(selectedClass)) || (isSelectedEmpty() && pluginInfo.hasObjectClass(listSelectedClass)))) { CheckBox box = new CheckBox(); box.setText(messages.showPluginCategories(category)); box.setName(category); box.addStyleName("form-checkbox-job"); box.addValueChangeHandler(new ValueChangeHandler<Boolean>() { @Override public void onValueChange(ValueChangeEvent<Boolean> event) { workflowList.clear(); boolean noChecks = true; if (plugins != null) { PluginUtils.sortByName(plugins); List<String> pluginsAdded = new ArrayList<>(); for (PluginInfo pluginInfo : plugins) { if (pluginInfo != null) { List<String> categories = pluginInfo.getCategories(); if (categories != null) { for (int i = 0; i < workflowCategoryList.getWidgetCount(); i++) { CheckBox checkbox = (CheckBox) workflowCategoryList.getWidget(i); if (checkbox.getValue()) { noChecks = false; if (categories.contains(checkbox.getName()) && !categories.contains(RodaConstants.PLUGIN_CATEGORY_NOT_LISTABLE) && ((!isSelectedEmpty() && pluginInfo.hasObjectClass(selectedClass)) || (isSelectedEmpty() && pluginInfo.hasObjectClass(listSelectedClass))) && !pluginsAdded.contains(pluginInfo.getId())) { Widget pluginItem = addPluginItemWidgetToWorkflowList(pluginInfo); if (pluginsAdded.isEmpty()) { CreateSelectedJob.this.selectedPlugin = lookupPlugin(pluginInfo.getId()); pluginItem.addStyleName("plugin-list-item-selected"); } pluginsAdded.add(pluginInfo.getId()); } } } if (noChecks) { if (!pluginInfo.getCategories().contains(RodaConstants.PLUGIN_CATEGORY_NOT_LISTABLE) && ((!isSelectedEmpty() && pluginInfo.hasObjectClass(selectedClass)) || (isSelectedEmpty() && pluginInfo.hasObjectClass(listSelectedClass)))) { Widget pluginItem = addPluginItemWidgetToWorkflowList(pluginInfo); if (pluginsAdded.isEmpty()) { CreateSelectedJob.this.selectedPlugin = lookupPlugin(pluginInfo.getId()); pluginItem.addStyleName("plugin-list-item-selected"); } pluginsAdded.add(pluginInfo.getId()); } } } } } } updateWorkflowOptions(); } }); workflowCategoryList.add(box); categoriesOnListBox.add(category); } } if (!pluginCategories.contains(RodaConstants.PLUGIN_CATEGORY_NOT_LISTABLE) && ((!isSelectedEmpty() && pluginInfo.hasObjectClass(selectedClass)) || (isSelectedEmpty() && pluginInfo.hasObjectClass(listSelectedClass)))) { Widget pluginItem = addPluginItemWidgetToWorkflowList(pluginInfo); if (pluginAdded == 0) { CreateSelectedJob.this.selectedPlugin = lookupPlugin(pluginInfo.getId()); pluginItem.addStyleName("plugin-list-item-selected"); pluginAdded++; } } } } } updateWorkflowOptions(); } } private Widget addPluginItemWidgetToWorkflowList(PluginInfo pluginInfo) { FlowPanel panel = new FlowPanel(); panel.addStyleName("plugin-list-item"); panel.getElement().setAttribute("data-id", pluginInfo.getId()); panel.addDomHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { FlowPanel panel = (FlowPanel) event.getSource(); String selectedPluginId = panel.getElement().getAttribute("data-id"); for (int i = 0; i < workflowList.getWidgetCount(); i++) { Widget panelWidget = workflowList.getWidget(i); panelWidget.removeStyleName("plugin-list-item-selected"); } if (selectedPluginId != null) { CreateSelectedJob.this.selectedPlugin = lookupPlugin(selectedPluginId); panel.addStyleName("plugin-list-item-selected"); } updateWorkflowOptions(); } }, ClickEvent.getType()); FlowPanel itemImage = new FlowPanel(); itemImage.addStyleName("fa"); itemImage.addStyleName("plugin-list-item-icon"); if (pluginInfo.getCategories().isEmpty()) { itemImage.addStyleName("plugin-list-item-icon-default"); } else { itemImage.addStyleName("plugin-list-item-icon-" + pluginInfo.getCategories().get(0)); itemImage.setTitle(pluginInfo.getCategories().get(0)); } Label label = new Label(); String labelContent = messages.pluginLabelWithVersion(pluginInfo.getName(), pluginInfo.getVersion()); label.setText(labelContent); label.setTitle(labelContent); label.addStyleName("plugin-list-item-label"); panel.add(itemImage); panel.add(label); workflowList.add(panel); return panel; } protected void updateWorkflowOptions() { if (selectedPlugin == null) { workflowListDescription.clear(); workflowListDescriptionCategories.setText(""); workflowListDescription.setVisible(false); workflowListDescriptionCategories.setVisible(false); workflowOptions.setPluginInfo(null); } else { String pluginName = messages.pluginLabelWithVersion(selectedPlugin.getName(), selectedPlugin.getVersion()); name.setText(pluginName); workflowListTitle.setText(pluginName); String description = selectedPlugin.getDescription(); if (description != null && description.length() > 0) { String[] split = description.split("\\r?\\n"); workflowListDescription.clear(); for (String s : split) { Label descriptionLine = new Label(s); descriptionLine.addStyleName("p"); descriptionLine.addStyleName("plugin-description"); workflowListDescription.add(descriptionLine); } List<String> categoryTranslations = new ArrayList<>(); for (String category : selectedPlugin.getCategories()) { categoryTranslations.add(messages.showPluginCategories(category)); } SafeHtml categories = messages.createJobCategoryWorkflow(categoryTranslations); workflowListDescriptionCategories.setHTML(categories); workflowListDescription.setVisible(true); workflowListDescriptionCategories.setVisible(true); } else { workflowListDescription.setVisible(false); workflowListDescriptionCategories.setVisible(false); } if (selectedPlugin.getParameters().isEmpty()) { workflowPanel.setVisible(false); workflowOptions.setPluginInfo(null); } else { workflowPanel.setVisible(true); workflowOptions.setPluginInfo(selectedPlugin); } } } private PluginInfo lookupPlugin(String selectedPluginId) { PluginInfo p = null; if (plugins != null && selectedPluginId != null) { for (PluginInfo pluginInfo : plugins) { if (pluginInfo != null && pluginInfo.getId().equals(selectedPluginId)) { p = pluginInfo; break; } } } return p; } @UiHandler("buttonCreate") public abstract void buttonCreateHandler(ClickEvent e); @UiHandler("buttonObtainCommand") public abstract void buttonObtainCommandHandler(ClickEvent e); @UiHandler("buttonCancel") void buttonCancelHandler(ClickEvent e) { cancel(); } public abstract void cancel(); public SelectedItems<?> getSelected() { return selected; } public void setSelected(SelectedItems<?> selected) { this.selected = selected; } public PluginInfo getSelectedPlugin() { return selectedPlugin; } public void setSelectedPlugin(PluginInfo selectedPlugin) { this.selectedPlugin = selectedPlugin; } public FlowPanel getTargetPanel() { return this.targetPanel; } public Button getButtonCreate() { return this.buttonCreate; } public TextBox getName() { return this.name; } public FlowPanel getWorkflowList() { return workflowList; } public PluginOptionsPanel getWorkflowOptions() { return this.workflowOptions; } public void setJobSelectedDescription(String text) { selectedObject.setText(text); } public void setCategoryListBoxVisible(boolean visible) { workflowCategoryLabel.setVisible(visible); workflowCategoryList.setVisible(visible); } public String getSelectedClass() { return listSelectedClass; } public void setSelectedClass(String selectedClass) { this.listSelectedClass = selectedClass; } public FlowPanel getCategoryList() { return workflowCategoryList; } public boolean isSelectedEmpty() { if (selected instanceof SelectedItemsList) { return ((SelectedItemsList<?>) selected).getIds().isEmpty(); } return false; } }