package org.gcube.portlets.widgets.ckandatapublisherwidget.client.ui.resources; import org.gcube.portlets.widgets.ckandatapublisherwidget.client.CKanPublisherService; import org.gcube.portlets.widgets.ckandatapublisherwidget.client.CKanPublisherServiceAsync; import org.gcube.portlets.widgets.ckandatapublisherwidget.client.events.AddResourceEvent; import org.gcube.portlets.widgets.ckandatapublisherwidget.shared.ResourceElementBean; import com.github.gwtbootstrap.client.ui.AlertBlock; import com.github.gwtbootstrap.client.ui.Button; import com.github.gwtbootstrap.client.ui.ControlGroup; import com.github.gwtbootstrap.client.ui.TextArea; import com.github.gwtbootstrap.client.ui.TextBox; import com.github.gwtbootstrap.client.ui.constants.AlertType; import com.github.gwtbootstrap.client.ui.constants.ControlGroupType; 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.shared.HandlerManager; 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.Timer; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.Widget; /** * Form used to add resource(s) to a dataset * @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it) */ public class AddResourceToDataset extends Composite{ private static AddResourceToDatasetUiBinder uiBinder = GWT .create(AddResourceToDatasetUiBinder.class); interface AddResourceToDatasetUiBinder extends UiBinder { } // bus to alert the dataset form about this new resource private HandlerManager eventBus; // the dataset id private String datasetId; // the dataset organization private String datasetOrg; private final CKanPublisherServiceAsync ckanServices = GWT.create(CKanPublisherService.class); @UiField TextBox resourceUrlTextBox; @UiField TextBox resourceNameTextBox; @UiField TextArea resourceDescriptionTextArea; @UiField Button addResourceButton; @UiField AlertBlock infoBlock; @UiField Button goToDatasetButton; @UiField ControlGroup urlControlGroup; @UiField ControlGroup nameControlGroup; public AddResourceToDataset(HandlerManager eventBus, String datasetId, String datasetTitle, String datasetOrg, String owner, final String datasetUrl) { initWidget(uiBinder.createAndBindUi(this)); // save bus this.eventBus = eventBus; // save dataset id (it is needed when we will add resources) this.datasetId = datasetId; this.datasetOrg = datasetOrg; String title = datasetTitle; String link = ""; link += title.length() > 90 ? title.substring(0, 90) + "..." : title; goToDatasetButton.setTitle("Go to the item: "+title); goToDatasetButton.setText(link); // goToDatasetButton.setHref(datasetUrl); goToDatasetButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { Window.open(datasetUrl, "_blank", ""); } }); } @UiHandler("addResourceButton") void onAddButtonClick(ClickEvent e){ infoBlock.setVisible(false); urlControlGroup.setType(ControlGroupType.NONE); nameControlGroup.setType(ControlGroupType.NONE); // validation if (resourceUrlTextBox.getText().isEmpty()) { showAlert("'URL' field cannot be empty", AlertType.ERROR); urlControlGroup.setType(ControlGroupType.ERROR); return; } // validation if (resourceNameTextBox.getText().isEmpty() || resourceNameTextBox.getText().isEmpty()) { showAlert("'Name' field cannot be empty", AlertType.ERROR); nameControlGroup.setType(ControlGroupType.ERROR); return; } //THE URL must be HTTPS, see #21068 if(!(resourceUrlTextBox.getText().toLowerCase().startsWith("https://"))){ showAlert("The URL must be HTTPS, so start with \"https://\" (e.g. https://your-resource.com)", AlertType.ERROR); urlControlGroup.setType(ControlGroupType.ERROR); return; } // collect data and build up the bean final ResourceElementBean resource = new ResourceElementBean( resourceNameTextBox.getText(), true, false, null, null, null, null, null, resourceUrlTextBox.getText(), resourceDescriptionTextArea.getText(), datasetOrg); // disable add button addResourceButton.setEnabled(false); // try to create ckanServices.addResourceToDataset(resource, datasetId, new AsyncCallback() { @Override public void onSuccess(ResourceElementBean result) { if(result != null){ showAlert("Resource created correctly", AlertType.SUCCESS); eventBus.fireEvent(new AddResourceEvent(result)); // remove data resourceUrlTextBox.setText(""); resourceNameTextBox.setText(""); resourceDescriptionTextArea.setText(""); } else showAlert("Unable to add this resource. Check that the url is correct", AlertType.ERROR); } @Override public void onFailure(Throwable caught) { showAlert("Unable to add this resource, sorry. Error is: " + caught.getMessage(), AlertType.ERROR); } }); } /** * Show error/success after resource creation attempt. * @param text * @param type */ protected void showAlert(String text, AlertType type) { infoBlock.setText(text); infoBlock.setType(type); infoBlock.setVisible(true); addResourceButton.setEnabled(true); // hide after some seconds Timer t = new Timer() { @Override public void run() { infoBlock.setVisible(false); } }; t.schedule(8000); } }