From f5dfd39e20836e6cb6263d76ad7a41bac6a29034 Mon Sep 17 00:00:00 2001 From: Costantino Perciante Date: Fri, 10 Jun 2016 10:10:18 +0000 Subject: [PATCH] Dataset creation is divided into three steps now (in the case in which the request doesn't come from the workspace) git-svn-id: http://svn.d4science-ii.research-infrastructures.eu/gcube/trunk/portlets/widgets/ckan-metadata-publisher-widget@129049 82a268e6-3cf1-43bd-a215-b396298e98cf --- .../client/CKanMetadataPublisher.java | 6 +- .../client/CKanPublisherService.java | 4 +- .../client/CKanPublisherServiceAsync.java | 4 +- .../client/ui/AddResourceContainer.java | 50 +++++++++++ .../client/ui/AddResourceContainer.ui.xml | 10 +++ .../client/ui/AddedResourcesSummary.ui.xml | 2 +- .../client/ui/CreateDatasetForm.java | 87 +++++++++++++------ .../client/ui/CreateDatasetForm.ui.xml | 16 ++-- .../client/ui/MetaDataFieldSkeleton.java | 12 ++- .../server/CKANPublisherServicesImpl.java | 12 ++- .../ckandatapublisherwidget/client/Tests.java | 4 +- 11 files changed, 151 insertions(+), 56 deletions(-) create mode 100644 src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/AddResourceContainer.java create mode 100644 src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/AddResourceContainer.ui.xml diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/CKanMetadataPublisher.java b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/CKanMetadataPublisher.java index d0d9a56..264cd98 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/CKanMetadataPublisher.java +++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/CKanMetadataPublisher.java @@ -22,9 +22,9 @@ public class CKanMetadataPublisher implements EntryPoint { private void startExample() { - String idFolderWorkspace = "8b67fc1f-940d-4512-b783-105fba11c270"; - String owner = "costantino.perciante"; - RootPanel.get("ckan-metadata-publisher-div").add(new CreateDatasetForm(owner)); + String idFolderWorkspace = "d3a37eb9-1589-4c95-a9d0-c473a02d4f0f"; + String owner = "costantino_perciante"; + RootPanel.get("ckan-metadata-publisher-div").add(new CreateDatasetForm(idFolderWorkspace, owner)); } } diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/CKanPublisherService.java b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/CKanPublisherService.java index 493a315..9f8f597 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/CKanPublisherService.java +++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/CKanPublisherService.java @@ -33,9 +33,9 @@ public interface CKanPublisherService extends RemoteService { * Try to create such dataset starting from the information contained into the toCreate bean. * @param toCreate * @param isWorkspaceRequest if the call comes from the workspace - * @return the identifier of the created dataset or null on error + * @return the sent bean full filled with the needed information */ - String createCKanDataset(DatasetMetadataBean toCreate, boolean isWorkspaceRequest); + DatasetMetadataBean createCKanDataset(DatasetMetadataBean toCreate, boolean isWorkspaceRequest); /** * Add this resource to the dataset whose id is datasetId diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/CKanPublisherServiceAsync.java b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/CKanPublisherServiceAsync.java index d07202b..a13ee27 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/CKanPublisherServiceAsync.java +++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/CKanPublisherServiceAsync.java @@ -32,10 +32,10 @@ public interface CKanPublisherServiceAsync { * Try to create such dataset starting from the information contained into the toCreate bean. * @param toCreate * @param isWorkspaceRequest if the call comes from the workspace - * @return true on success, false otherwise + * @return the sent bean full filled with the needed information */ void createCKanDataset(DatasetMetadataBean toCreate, boolean isWorkspaceRequest, - AsyncCallback callback); + AsyncCallback callback); /** * Add this resource to the dataset whose id is datasetId diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/AddResourceContainer.java b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/AddResourceContainer.java new file mode 100644 index 0000000..c93d091 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/AddResourceContainer.java @@ -0,0 +1,50 @@ +package org.gcube.portlets.widgets.ckandatapublisherwidget.client.ui; + +import com.github.gwtbootstrap.client.ui.Button; +import com.github.gwtbootstrap.client.ui.TabPanel; +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.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.VerticalPanel; +import com.google.gwt.user.client.ui.Widget; + +/** + * Container for the third phase (add resource to dataset) + * @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it) + */ +public class AddResourceContainer extends Composite{ + + private static AddResourceContainerUiBinder uiBinder = GWT + .create(AddResourceContainerUiBinder.class); + + interface AddResourceContainerUiBinder extends + UiBinder { + } + + @UiField VerticalPanel resourcesPanel; + @UiField Button goToDatasetButton; + + public AddResourceContainer(final String datasetUrl) { + initWidget(uiBinder.createAndBindUi(this)); + goToDatasetButton.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + Window.Location.assign(datasetUrl); + } + }); + } + + /** + * Add the form to this panel + * @param w + */ + public void add(TabPanel w){ + resourcesPanel.add(w); + } + +} diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/AddResourceContainer.ui.xml b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/AddResourceContainer.ui.xml new file mode 100644 index 0000000..f142035 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/AddResourceContainer.ui.xml @@ -0,0 +1,10 @@ + + + + Go to Dataset + + + + \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/AddedResourcesSummary.ui.xml b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/AddedResourcesSummary.ui.xml index 3311d54..fcce11a 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/AddedResourcesSummary.ui.xml +++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/AddedResourcesSummary.ui.xml @@ -3,6 +3,6 @@ xmlns:g="urn:import:com.google.gwt.user.client.ui">

Added Resources

- +
\ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/CreateDatasetForm.java b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/CreateDatasetForm.java index 3741eac..fdcdce1 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/CreateDatasetForm.java +++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/CreateDatasetForm.java @@ -30,6 +30,7 @@ import com.github.gwtbootstrap.client.ui.TextArea; import com.github.gwtbootstrap.client.ui.TextBox; import com.github.gwtbootstrap.client.ui.base.ListItem; import com.github.gwtbootstrap.client.ui.constants.AlertType; +import com.github.gwtbootstrap.client.ui.constants.ButtonType; import com.github.gwtbootstrap.client.ui.resources.Bootstrap.Tabs; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ChangeEvent; @@ -39,14 +40,15 @@ import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.KeyCodes; import com.google.gwt.event.dom.client.KeyDownEvent; import com.google.gwt.event.shared.HandlerManager; -import com.google.gwt.regexp.shared.RegExp; 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.FlowPanel; +import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; @@ -68,6 +70,7 @@ public class CreateDatasetForm extends Composite{ UiBinder { } + @UiField HTMLPanel createDatasetMainPanel; @UiField TextBox titleTextBox; @UiField TextArea descriptionTextarea; @UiField TextBox tagsEnterTextBox; @@ -85,12 +88,10 @@ public class CreateDatasetForm extends Composite{ @UiField CheckBox addResourcesCheckBox; @UiField ControlGroup resourcesControlGroup; @UiField Button createButton; - @UiField Button addResourcesButton; @UiField Button resetButton; @UiField AlertBlock infoBlock; @UiField AlertBlock onContinueAlertBlock; @UiField AlertBlock onCreateAlertBlock; - @UiField VerticalPanel resourcesPanel; @UiField VerticalPanel metadataFieldsPanel; @UiField ListBox metadataProfilesFormatListbox; @UiField Form formFirstStep; @@ -98,6 +99,8 @@ public class CreateDatasetForm extends Composite{ @UiField Button continueButton; @UiField Button goBackButton; @UiField Paragraph selectedProfile; + @UiField Button goToDatasetButton; + @UiField Button addResourcesButton; // tab panel private TabPanel tabPanel; @@ -251,6 +254,9 @@ public class CreateDatasetForm extends Composite{ continueButton.setEnabled(false); resetButton.setEnabled(false); + // set to visible the checkbox to add resources of the workspace + resourcesControlGroup.setVisible(true); + // get back the licenses and the metadata information from the workspace ckanServices.getDatasetBean(idFolderWorkspace, owner, new AsyncCallback() { @@ -525,40 +531,63 @@ public class CreateDatasetForm extends Composite{ alertOnCreate("Trying to create dataset, please wait", AlertType.INFO); - ckanServices.createCKanDataset(receivedBean, isWorkspaceRequest, new AsyncCallback() { + ckanServices.createCKanDataset(receivedBean, isWorkspaceRequest, new AsyncCallback() { @Override - public void onSuccess(final String datasetId) { + public void onSuccess(final DatasetMetadataBean createdDatasetBean) { - if(datasetId != null){ + if(createdDatasetBean != null){ alertOnCreate("Dataset correctly created!", AlertType.SUCCESS); // disable dataset fields disableDatasetFields(); - // if we are in the "general case" we need to show a form for adding resources - if(!resourcesControlGroup.isVisible()){ + // show the go to dataset button + final String datasetUrl = createdDatasetBean.getSource(); + goToDatasetButton.setVisible(true); + goToDatasetButton.addClickHandler(new ClickHandler() { - createButton.setVisible(false); - goBackButton.setVisible(false); + @Override + public void onClick(ClickEvent event) { + + Window.Location.assign(datasetUrl); + } + }); + + // if we are in the "general case" we need to show a form for adding resources + if(isWorkspaceRequest) + { + + // leave to back button, but remove create and add go to dataset + createButton.removeFromParent(); + resetButton.setEnabled(false); + + // set go to dataset as primary + goToDatasetButton.setType(ButtonType.PRIMARY); + + }else{ + + // remove create button + createButton.removeFromParent(); // show the add resources button addResourcesButton.setVisible(true); + addResourcesButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { - // hide the button - addResourcesButton.setVisible(false); + // remove content of the main panel + createDatasetMainPanel.clear(); // TabPanel tabPanel = new TabPanel(Tabs.ABOVE); tabPanel.setWidth("100%"); // add the form - resourceForm = new AddResourceToDataset(eventBus, datasetId, owner); + resourceForm = new AddResourceToDataset(eventBus, createdDatasetBean.getId(), owner); // tab for the form Tab formContainer = new Tab(); @@ -574,16 +603,21 @@ public class CreateDatasetForm extends Composite{ // add tabs to resources panel tabPanel.selectTab(0); - resourcesPanel.add(tabPanel); - resourcesPanel.setVisible(true); + + // form container + AddResourceContainer container = new AddResourceContainer(datasetUrl); + container.add(tabPanel); + + // add the new content of the main panel + createDatasetMainPanel.add(container); } }); } }else{ - alertOnCreate("Unable to create this dataset, please retry later", AlertType.ERROR); + alertOnCreate("Unable to create this dataset, maybe it exists?", AlertType.ERROR); } } @@ -591,13 +625,13 @@ public class CreateDatasetForm extends Composite{ @Override public void onFailure(Throwable caught) { - alertOnCreate("Unable to create this dataset, please retry later", AlertType.ERROR); + alertOnCreate("Unable to create this dataset, maybe it exists?", AlertType.ERROR); } }); }else{ - alertOnCreate("Please check the inserted values", AlertType.ERROR); + alertOnCreate("Please check the inserted values and the mandatory fields", AlertType.ERROR); } } @@ -683,6 +717,13 @@ public class CreateDatasetForm extends Composite{ errorMessage = "Missing title"; return errorMessage; } + + // name reg expression + String regexName = "^[a-zA-Z\\s]+"; + if(!validateByRegExpression(maintainerTextbox.getText(), regexName)){ + errorMessage = "Not valid maintainer name"; // TODO + return errorMessage; + } // email reg expression String regexMail = "\\b[\\w.%-]+@[-.\\w]+\\.[A-Za-z]{2,4}\\b"; @@ -691,13 +732,6 @@ public class CreateDatasetForm extends Composite{ return errorMessage; } - // name reg expression - String regexName = "^[a-zA-Z\\s]+"; - if(!validateByRegExpression(maintainerTextbox.getText(), regexName)){ - errorMessage = "Not valid maintainer name"; // TODO - return errorMessage; - } - // check if metadata profile is different from none and its mandatory fields have been fulfilled if(checkSelectedMetaDataProfile()){ errorMessage = "You must select a metadata profile different frome none"; @@ -721,8 +755,7 @@ public class CreateDatasetForm extends Composite{ * @return */ private boolean validateByRegExpression(String textToValidate, String regex){ - RegExp pattern = RegExp.compile(regex); - return pattern.test(textToValidate); + return textToValidate.matches(regex); } @UiHandler("resetButton") diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/CreateDatasetForm.ui.xml b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/CreateDatasetForm.ui.xml index 4ccbcc2..8f8dad7 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/CreateDatasetForm.ui.xml +++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/CreateDatasetForm.ui.xml @@ -38,7 +38,7 @@ font-weight: bold; } - + @@ -249,7 +249,8 @@ - + - Automatically add folder' files as resources of the dataset + Automatically add folder content as resources of the dataset @@ -269,17 +270,16 @@ Add Resources - - - + block="true" type="PRIMARY" visible="false" ui:field="addResourcesButton">Add Resources Create Go Back + Go to Dataset + diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/MetaDataFieldSkeleton.java b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/MetaDataFieldSkeleton.java index 9e0b9d8..40dc1f1 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/MetaDataFieldSkeleton.java +++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/MetaDataFieldSkeleton.java @@ -11,7 +11,6 @@ import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.SpanElement; import com.google.gwt.dom.client.Style.Display; -import com.google.gwt.regexp.shared.RegExp; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.ui.Composite; @@ -118,11 +117,11 @@ public class MetaDataFieldSkeleton extends Composite{ * @return */ public boolean isFieldValueValid() { - + String validator = field.getValidator(); // if validator is not present and it is not a textbox - if((validator == null || validator.isEmpty()) && !holder.getClass().equals(TextBox.class)) + if((validator == null || validator.isEmpty()) && !(holder.getClass().equals(TextBox.class) && field.getMandatory())) return true; // current value @@ -134,7 +133,7 @@ public class MetaDataFieldSkeleton extends Composite{ else if(holder.getClass().equals(TextBox.class)){ value = ((TextBox)holder).getText(); - // if thereis not a validator... + // if there is not a validator... if(validator == null){ if(value.isEmpty() && field.getMandatory()) return false; @@ -145,10 +144,9 @@ public class MetaDataFieldSkeleton extends Composite{ } } else - return true; // it's a checkbox + return true; // it's a checkbox (the value doesn't matter) - RegExp pattern = RegExp.compile(validator); - return pattern.test(value); + return value.matches(validator); } diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/server/CKANPublisherServicesImpl.java b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/server/CKANPublisherServicesImpl.java index d53c2f1..39bd794 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/server/CKANPublisherServicesImpl.java +++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/server/CKANPublisherServicesImpl.java @@ -386,7 +386,7 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C } @Override - public String createCKanDataset(DatasetMetadataBean toCreate, boolean isWorkspaceRequest) { + public DatasetMetadataBean createCKanDataset(DatasetMetadataBean toCreate, boolean isWorkspaceRequest) { // retrieve ckan's catalog url String ckanPortalUrl = getCatalogueUrl(); @@ -509,6 +509,10 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C try{ res = client.createDataset(dataset); + + // add source and id to the incoming bean + toCreate.setId(res.getId()); + toCreate.setSource(getCatalogueUrl() + "/dataset/" + res.getName()); }catch(Exception e){ @@ -524,7 +528,7 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C return null; } - return res.getId(); + return toCreate; } /** @@ -533,9 +537,9 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C * @return */ private String nameFromTitle(String title) { - String convertedName = title.replaceAll(" ", "-"); + String convertedName = title.replaceAll(" ", "_").replaceAll(".", "_"); convertedName = convertedName.toLowerCase(); - if(convertedName.endsWith("-")) + if(convertedName.endsWith("_")) convertedName = convertedName.substring(0, convertedName.length() - 2); return convertedName; diff --git a/src/test/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/Tests.java b/src/test/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/Tests.java index 1fc8242..1f4541a 100644 --- a/src/test/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/Tests.java +++ b/src/test/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/Tests.java @@ -15,7 +15,7 @@ import org.junit.Test; public class Tests { - //@Test + @Test public void test() throws WorkspaceFolderNotFoundException, InternalErrorException, HomeNotFoundException, UserNotFoundException, ItemNotFoundException{ ScopeProvider.instance.set("/gcube"); @@ -28,7 +28,7 @@ public class Tests { List childrens = ws.getRoot().getChildren(); for (WorkspaceItem workspaceItem : childrens) { - if(workspaceItem.getName().equals("CkanTest1137")){ + if(workspaceItem.getName().equals("test-ckan-folder")){ System.out.println("Dir has id " + workspaceItem.getId());