diff --git a/.classpath b/.classpath index 57c104b..3e9559a 100644 --- a/.classpath +++ b/.classpath @@ -20,6 +20,7 @@ + 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 2aa0953..19494cf 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 @@ -3,6 +3,7 @@ package org.gcube.portlets.widgets.ckandatapublisherwidget.client; import org.gcube.portlets.widgets.ckandatapublisherwidget.client.ui.CreateDatasetForm; import com.google.gwt.core.client.EntryPoint; +import com.google.gwt.core.client.GWT; import com.google.gwt.event.shared.HandlerManager; import com.google.gwt.user.client.ui.RootPanel; @@ -17,9 +18,11 @@ public class CKanMetadataPublisher implements EntryPoint { public void onModuleLoad() { // remove comment to the below line for testing the widget - //startExample(); + startExample(); } + + private final CKanPublisherServiceAsync ckanServices = GWT.create(CKanPublisherService.class); @SuppressWarnings("unused") private void startExample() { @@ -27,7 +30,7 @@ public class CKanMetadataPublisher implements EntryPoint { String idFolderWorkspace = "d3a37eb9-1589-4c95-a9d0-c473a02d4f0f"; String owner = "costantino.perciante"; HandlerManager eventBus = new HandlerManager(null); - RootPanel.get("ckan-metadata-publisher-div").add(new CreateDatasetForm(idFolderWorkspace ,owner, eventBus )); + RootPanel.get("ckan-metadata-publisher-div").add(new CreateDatasetForm(idFolderWorkspace ,owner, eventBus)); } } 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 7afe3e0..eb9e6ec 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,10 +33,9 @@ public interface CKanPublisherService extends RemoteService { /** * Retrieve a partially filled bean given a folder id and its owner. * @param folderId - * @param owner * @return @return a DatasetMetadataBean on success, null on error. */ - DatasetMetadataBean getDatasetBean(String folderId, String owner); + DatasetMetadataBean getDatasetBean(String folderId); /** * Try to create such dataset starting from the information contained into the toCreate bean. @@ -50,17 +49,15 @@ public interface CKanPublisherService extends RemoteService { * Add this resource to the dataset whose id is datasetId * @param resource * @param datasetId - * @param owner of the dataset */ - ResourceBeanWrapper addResourceToDataset(ResourceBeanWrapper resource, String datasetId, String owner); + ResourceBeanWrapper addResourceToDataset(ResourceBeanWrapper resource, String datasetId); /** * Delete this resource from the dataset with id datasetId * @param resource * @param datasetId - * @param owner of the dataset * @return true on success, false otherwise */ - boolean deleteResourceFromDataset(ResourceBeanWrapper resource, String owner); + boolean deleteResourceFromDataset(ResourceBeanWrapper resource); } 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 1ad1843..a7ab15a 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 @@ -25,10 +25,9 @@ public interface CKanPublisherServiceAsync { /** * Retrieve a partially filled bean given a folder id and its owner. * @param folderId - * @param owner * @return @return a DatasetMetadataBean on success, null on error. */ - void getDatasetBean(String folderId, String owner, + void getDatasetBean(String folderId, AsyncCallback callback); /** @@ -44,20 +43,17 @@ public interface CKanPublisherServiceAsync { * Add this resource to the dataset whose id is datasetId * @param resource * @param datasetId - * @param owner of the dataset * @param callback */ - void addResourceToDataset(ResourceBeanWrapper resource, String datasetId, String owner, + void addResourceToDataset(ResourceBeanWrapper resource, String datasetId, AsyncCallback callback); /** * Delete this resource from the dataset with id datasetId * @param resource - * @param owner of the dataset * @return true on success, false otherwise */ - void deleteResourceFromDataset(ResourceBeanWrapper resource, - String owner, AsyncCallback callback); + void deleteResourceFromDataset(ResourceBeanWrapper resource, AsyncCallback callback); /** * Retrieve the list of profiles for a given organization name . diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/AddResourceToDataset.java b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/AddResourceToDataset.java index f435f1d..9d8d316 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/AddResourceToDataset.java +++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/AddResourceToDataset.java @@ -45,10 +45,6 @@ public class AddResourceToDataset extends Composite{ // the dataset organization private String datasetOrg; - // the owner - private String owner; - - //Create a remote service proxy to talk to the server-side ckan service. private final CKanPublisherServiceAsync ckanServices = GWT.create(CKanPublisherService.class); @UiField TextBox resourceUrlTextBox; @@ -69,9 +65,6 @@ public class AddResourceToDataset extends Composite{ this.datasetOrg = datasetOrg; - // the owner of the dataset/files - this.owner = owner; - goToDatasetButton.addClickHandler(new ClickHandler() { @Override @@ -103,14 +96,13 @@ public class AddResourceToDataset extends Composite{ null, true, null, - owner, datasetOrg); // disable add button addResourceButton.setEnabled(false); // try to create - ckanServices.addResourceToDataset(resource, datasetId, owner, new AsyncCallback() { + ckanServices.addResourceToDataset(resource, datasetId, new AsyncCallback() { @Override public void onSuccess(ResourceBeanWrapper result) { diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/AddedResourcesSummary.java b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/AddedResourcesSummary.java index d8d3285..3a9d7c4 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/AddedResourcesSummary.java +++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/AddedResourcesSummary.java @@ -48,20 +48,14 @@ public class AddedResourcesSummary extends Composite{ // list of added resources (beans) List addedResources; - // the owner - private String owner; - @UiField VerticalPanel addResourcesPanel; - public AddedResourcesSummary(HandlerManager eventBus, String owner) { + public AddedResourcesSummary(HandlerManager eventBus) { initWidget(uiBinder.createAndBindUi(this)); // save bus this.eventBus = eventBus; - // save owner - this.owner = owner; - // bind on add resource event bind(); @@ -139,7 +133,7 @@ public class AddedResourcesSummary extends Composite{ final Widget widget = addResourcesPanel.getWidget(i); // remote call to remove it from the dataset - ckanServices.deleteResourceFromDataset(toDelete, owner, new AsyncCallback() { + ckanServices.deleteResourceFromDataset(toDelete, new AsyncCallback() { @Override public void onSuccess(Boolean result) { 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 fd5a25d..520cd63 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 @@ -115,12 +115,11 @@ public class CreateDatasetForm extends Composite{ @UiField Form formSecondStep; @UiField Form formThirdStep; @UiField Button continueButton; - @UiField Button goBackButtonFirstOrSecondStep; + @UiField Button goBackButtonSecondStep; @UiField Paragraph selectedProfile; @UiField Button goToDatasetButton; @UiField Button addResourcesButton; @UiField CheckBox addResourcesCheckBox; - @UiField ControlGroup resourcesControlGroup; @UiField SimplePanel workspaceResourcesContainer; @UiField Button continueThirdStep; @UiField Button goBackButtonFirstStep; @@ -213,7 +212,7 @@ public class CreateDatasetForm extends Composite{ } /** - * Invoked when the workspace is used. + * Invoked when the workspace is used * @param idFolderWorkspace * @param owner */ @@ -257,7 +256,7 @@ public class CreateDatasetForm extends Composite{ setAlertBlock("Retrieving information, please wait...", AlertType.INFO, true); // get back the licenses and the metadata information - ckanServices.getDatasetBean(idFolderWorkspace, owner, new AsyncCallback() { + ckanServices.getDatasetBean(idFolderWorkspace, new AsyncCallback() { @Override public void onFailure(Throwable caught) { @@ -313,16 +312,15 @@ public class CreateDatasetForm extends Composite{ if(isWorkspaceRequest){ // enable manage resources checkbox - resourcesControlGroup.setVisible(true); addResourcesCheckBox.getElement().getStyle().setDisplay(Display.INLINE_BLOCK); resourcesTable = new ResourcesTable(bean.getResources()); // if there are not resources, for now just checked it ( and hide so that the step will be skipped) TODO if(bean.getResources() == null || bean.getResources().isEmpty()){ - resourcesControlGroup.setVisible(false); alertNoResources.setType(AlertType.WARNING); alertNoResources.setVisible(true); + } } @@ -605,7 +603,6 @@ public class CreateDatasetForm extends Composite{ if(errorMsg == null){ // check what to do if(isWorkspaceRequest){ - if(!addResourcesCheckBox.getValue()){ // we need to show the page to handle resources one by one from the workspace formFirstStep.setVisible(false); @@ -616,12 +613,6 @@ public class CreateDatasetForm extends Composite{ if(workspaceResourcesContainer.getWidget() == null) workspaceResourcesContainer.add(resourcesTable); - }else{ - - // resources will be added automatically and we can show the page of the profiles - formFirstStep.setVisible(false); - formThirdStep.setVisible(true); - } }else{ // this is not a workspace request @@ -653,11 +644,11 @@ public class CreateDatasetForm extends Composite{ } - @UiHandler("goBackButtonFirstOrSecondStep") + @UiHandler("goBackButtonSecondStep") void onGoBackButton(ClickEvent e){ // swap forms - if(isWorkspaceRequest && !addResourcesCheckBox.getValue()){ + if(isWorkspaceRequest){ formFirstStep.setVisible(false); formSecondStep.setVisible(true); }else{ @@ -748,7 +739,7 @@ public class CreateDatasetForm extends Composite{ // invoke the create method createButton.setEnabled(false); - goBackButtonFirstOrSecondStep.setEnabled(false); + goBackButtonSecondStep.setEnabled(false); ckanServices.createCKanDataset(receivedBean, isWorkspaceRequest, new AsyncCallback() { @@ -817,7 +808,7 @@ public class CreateDatasetForm extends Composite{ // tab for the added resources Tab addedResources = new Tab(); - addedResources.add(new AddedResourcesSummary(eventBus, owner)); + addedResources.add(new AddedResourcesSummary(eventBus)); addedResources.setHeading("Added Resource"); tabPanel.add(addedResources); @@ -1011,7 +1002,7 @@ public class CreateDatasetForm extends Composite{ onCreateAlertBlock.setType(type); onCreateAlertBlock.setVisible(true); createButton.setEnabled(true); - goBackButtonFirstOrSecondStep.setEnabled(true); + goBackButtonSecondStep.setEnabled(true); // hide after some seconds Timer t = new Timer() { 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 ca426c5..c687fa7 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 @@ -271,30 +271,6 @@ - - - Product - Resources: - - - Add folder content as resources - - - - - - - - - - - Manage Resources + + + + Product + Resources: + + + Add folder content as resources + + + + + + + + + + + @@ -381,7 +381,7 @@ Create - Go Back 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 229f9bf..1f1aec9 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 @@ -13,7 +13,9 @@ import com.github.gwtbootstrap.client.ui.Controls; import com.github.gwtbootstrap.client.ui.Icon; import com.github.gwtbootstrap.client.ui.ListBox; import com.github.gwtbootstrap.client.ui.Popover; +import com.github.gwtbootstrap.client.ui.TextArea; import com.github.gwtbootstrap.client.ui.TextBox; +import com.github.gwtbootstrap.datetimepicker.client.ui.DateTimeBox; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.SpanElement; @@ -53,7 +55,7 @@ public class MetaDataFieldSkeleton extends Composite{ @UiField Icon infoIcon; @UiField FocusPanel focusPanelIconContainer; - // the element that holds the value (it could be a checkbox, textbox or listbox) + // the element that holds the value (it could be a checkbox, textbox or listbox, textarea, calendar) private Widget holder; // the field this object represents @@ -61,8 +63,8 @@ public class MetaDataFieldSkeleton extends Composite{ // the dialog box for this metadata private GcubeDialogExtended dialog; - - // save event bus referene + + // save event bus reference private HandlerManager eventBus; public MetaDataFieldSkeleton(MetadataFieldWrapper field, HandlerManager eventBus) { @@ -70,10 +72,10 @@ public class MetaDataFieldSkeleton extends Composite{ // prepare information this.field = field; - + // event bus this.eventBus = eventBus; - + // bind bind(); @@ -88,18 +90,47 @@ public class MetaDataFieldSkeleton extends Composite{ if(!field.getMandatory()) mandatorySymbol.getStyle().setDisplay(Display.NONE); - if(field.getIsBoolean()){ + switch(field.getType()){ + + case Boolean : // its a checkbox holder = new CheckBox(); if(field.getDefaulValue() != null) ((CheckBox)holder).setValue(Boolean.valueOf(field.getDefaulValue())); + break; - // add to the elementPanel - elementPanel.add(holder); + case Text: - }else{ + holder = new TextArea(); + + if(field.getDefaulValue() != null) + ((TextArea)holder).setText(field.getDefaulValue()); + + break; + + case Date: + + holder = new DateTimeBox(); + + if(field.getDefaulValue() != null) + ((DateTimeBox)holder).setFormat(field.getValidator()); + else // the default one + ((DateTimeBox)holder).setFormat("yyyy/mm/dd hh:ii"); + + break; + + case Number: + + holder = new TextBox(); + + if(field.getDefaulValue() != null) + ((TextBox)holder).setText(field.getDefaulValue()); + + break; + + case String: // it could be a listbox or a textbox according to the vocabulary fields if(field.getVocabulary() == null || field.getVocabulary().isEmpty()){ @@ -110,10 +141,6 @@ public class MetaDataFieldSkeleton extends Composite{ if(field.getDefaulValue() != null) ((TextBox)holder).setText(field.getDefaulValue()); - // add to the elementPanel - elementPanel.add(holder); - - }else{ // listbox @@ -138,16 +165,21 @@ public class MetaDataFieldSkeleton extends Composite{ // set default value if(field.getDefaulValue() != null) ((ListBox)holder).setSelectedValue(field.getDefaulValue()); - - // check if multiple selection is allowed TODO - boolean isMultipleSelection = false; //field.isMultipleSelection(); - ((ListBox)holder).setMultipleSelect(isMultipleSelection); - // add to the elementPanel - elementPanel.add(holder); + // check if multiple selection is allowed + ((ListBox)holder).setMultipleSelect(field.isMultiSelection()); + } + + break; + + default: return; + } + // add to the elementPanel + elementPanel.add(holder); + // set holder width if(holder.getClass().equals(ListBox.class)) holder.setWidth("96%"); @@ -183,19 +215,19 @@ public class MetaDataFieldSkeleton extends Composite{ * Bind on events */ private void bind() { - + // on close form eventBus.addHandler(CloseCreationFormEvent.TYPE, new CloseCreationFormEventHandler() { - + @Override public void onClose(CloseCreationFormEvent event) { - + if(dialog != null) dialog.hide(); - + } }); - + } @UiHandler("focusPanelIconContainer") @@ -268,16 +300,16 @@ public class MetaDataFieldSkeleton extends Composite{ // we validate only listbox and textbox if(holder.getClass().equals(ListBox.class)){ - + boolean first = true; - + for(int i = 0; i < ((ListBox)holder).getItemCount(); i++){ if(((ListBox)holder).isItemSelected(i)){ value += first ? ((ListBox)holder).getItemText(i) : ", " + ((ListBox)holder).getItemText(i); first = false; } } - + // if it was not mandatory but there was no choice, returning empty string if(!field.getMandatory()) if(value.equals("Select " + field.getFieldName())) diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/MetaDataFieldSkeleton.ui.xml b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/MetaDataFieldSkeleton.ui.xml index ab471ad..ace5151 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/MetaDataFieldSkeleton.ui.xml +++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/MetaDataFieldSkeleton.ui.xml @@ -1,6 +1,7 @@ + xmlns:g="urn:import:com.google.gwt.user.client.ui" xmlns:b="urn:import:com.github.gwtbootstrap.client.ui" + xmlns:b2="urn:import:com.github.gwtbootstrap.datetimepicker.client.ui"> .note-container { 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 3e8d436..e3465e7 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 @@ -12,10 +12,11 @@ import org.gcube.application.framework.core.session.SessionManager; import org.gcube.common.homelibrary.home.HomeLibrary; import org.gcube.common.homelibrary.home.workspace.Workspace; import org.gcube.common.homelibrary.home.workspace.WorkspaceItem; +import org.gcube.common.homelibrary.home.workspace.catalogue.WorkspaceCatalogue; +import org.gcube.common.homelibrary.home.workspace.folder.FolderItem; import org.gcube.datacatalogue.ckanutillibrary.CKanUtils; import org.gcube.datacatalogue.ckanutillibrary.CkanUtilsFactory; import org.gcube.datacatalogue.ckanutillibrary.models.ResourceBean; -import org.gcube.datacatalogue.ckanutillibrary.utils.ApplicationProfileScopePerUrlReader; import org.gcube.portal.custom.scopemanager.scopehelper.ScopeHelper; import org.gcube.portlets.widgets.ckandatapublisherwidget.client.CKanPublisherService; import org.gcube.portlets.widgets.ckandatapublisherwidget.server.utils.Utils; @@ -53,8 +54,7 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C private static final String CKAN_LICENSES_KEY = "ckanLicenses"; // licenses private static final String CKAN_ORGANIZATIONS_PUBLISH_KEY = "ckanOrganizationsPublish"; // here he can publish private static final String CKAN_PROFILES_KEY = "ckanProfiles"; // product profiles - private final static String CLIENT_PORTLET_URL = "currentClientUrlPortlet"; // set by the ckan portlet in session according - // the user's current url location + private final static String SCOPE_CLIENT_PORTLET_URL = "currentClientUrlPortletScope"; // set by the ckan portlet in session according the user's current url location /** * Retrieve an instance of the library for the scope @@ -96,7 +96,7 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C */ public String getDevelopmentUser() { String user = TEST_USER; - //user = "costantino.perciante"; + user = "costantino.perciante"; return user; } @@ -204,25 +204,22 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C * @return */ private String findLicenseIdByLicense(String chosenLicense) { - return getCkanUtilsObj(null).findLicenseIdByLicense(chosenLicense); + String scope = (String)getThreadLocalRequest().getSession().getAttribute(SCOPE_CLIENT_PORTLET_URL); + return getCkanUtilsObj(scope).findLicenseIdByLicenseTitle(chosenLicense); } @Override - // TODO this method will be changed because the list of license can vary according the scope public LicensesBean getLicenses() { - logger.info("Request for CKAN licenses for scope "); - ASLSession session = getASLSession(); String username = session.getUsername(); - logger.debug("User in session is " + username); // get http session HttpSession httpSession = getThreadLocalRequest().getSession(); - String currentUrl = (String)httpSession.getAttribute(CLIENT_PORTLET_URL); + String scope = (String)httpSession.getAttribute(SCOPE_CLIENT_PORTLET_URL); + + logger.info("Request for CKAN licenses for scope " + scope); - String scope = new ApplicationProfileScopePerUrlReader().getScopePerUrl(currentUrl); - // get key per scope String keyPerScope = Utils.concatenateSessionKeyScope(CKAN_LICENSES_KEY, scope); @@ -237,7 +234,6 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C List urls = new ArrayList(); for (CkanLicense license : titlesLicenses) { titles.add(license.getTitle()); - String url = (license.getUrl() != null && !license.getUrl().isEmpty()) ? license.getUrl() : ""; urls.add(url); } @@ -250,76 +246,54 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C } @Override - public DatasetMetadataBean getDatasetBean(String folderId, String owner){ + public DatasetMetadataBean getDatasetBean(String folderId){ DatasetMetadataBean bean = null; - logger.info("DatasetBean request for " + folderId + " and " + owner); - ASLSession aslSession = getASLSession(); - String user = aslSession.getUsername(); - + String userName = aslSession.getUsername(); + + logger.info("DatasetBean request for " + folderId + " and " + userName); + HttpSession httpSession = this.getThreadLocalRequest().getSession(); - String currentUrl = (String)httpSession.getAttribute(CLIENT_PORTLET_URL); - String scope = new ApplicationProfileScopePerUrlReader().getScopePerUrl(currentUrl); + String scope = (String)httpSession.getAttribute(SCOPE_CLIENT_PORTLET_URL); + + logger.debug("Scope recovered from session is " + scope); + if(isWithinPortal()){ try{ // check if session expired - if(user.equals(TEST_USER)){ + if(userName.equals(TEST_USER)){ logger.debug("SESSION EXPIRED"); return null; } logger.debug("Request dataset metadata bean for folder with id " + folderId - + " whose owner is " + owner); + + " whose owner is " + userName); // get usermanager (liferay) UserManager liferUserManager = new LiferayUserManager(); - GCubeUser userOwner = liferUserManager.getUserByUsername(owner); + GCubeUser userOwner = liferUserManager.getUserByUsername(userName); // build bean logger.debug("Building bean"); bean = new DatasetMetadataBean(); bean.setId(folderId); - bean.setOwnerIdentifier(owner); + bean.setOwnerIdentifier(userName); bean.setVersion(1); bean.setAuthorName(userOwner.getFirstName()); bean.setAuthorSurname(userOwner.getLastName()); bean.setAuthorEmail(userOwner.getEmail()); bean.setMaintainer(userOwner.getFullname()); bean.setMaintainerEmail(userOwner.getEmail()); - bean.setOrganizationList(getUserOrganizationsListAdmin(owner, scope)); + bean.setOrganizationList(getUserOrganizationsListAdmin(userName, scope)); // if the request comes from the workspace if(folderId != null && !folderId.isEmpty()){ - Workspace ws = HomeLibrary - .getHomeManagerFactory() - .getHomeManager() - .getHome(owner).getWorkspace(); + handleWorkspaceResources(folderId, userName, bean); - WorkspaceItem retrievedItem = ws.getItem(folderId); - - // set some info - String onlyAlphanumeric = retrievedItem.getName().replaceAll("[^A-Za-z0-9]", ""); - bean.setTitle(onlyAlphanumeric); - bean.setDescription(retrievedItem.getDescription()); - - // retrieve gcube items of the folder - Map folderItems = Utils.getGcubeItemProperties(retrievedItem); - bean.setCustomFields(folderItems); - - // check the resources within the folder (skip subdirectories) - List childrenIds = new ArrayList(); - - for (WorkspaceItem file : retrievedItem.getChildren()) { - if(!file.isFolder()) // ok, it's a file - childrenIds.add(file.getId()); - } - - List listOfResources = Utils.getWorkspaceResourcesInformation(childrenIds, ws, user); - bean.setResources(listOfResources); } }catch(Exception e){ @@ -340,31 +314,13 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C bean.setAuthorEmail("costantino.perciante@isti.cnr.it"); bean.setMaintainer("Costantino Perciante"); bean.setMaintainerEmail("costantino.perciante@isti.cnr.it"); - bean.setOrganizationList(getUserOrganizationsListAdmin(owner, TEST_SCOPE)); - bean.setOwnerIdentifier(owner); + bean.setOrganizationList(getUserOrganizationsListAdmin(userName, TEST_SCOPE)); + bean.setOwnerIdentifier(userName); if(folderId != null && !folderId.isEmpty()){ - Workspace ws = HomeLibrary - .getHomeManagerFactory() - .getHomeManager() - .getHome(owner).getWorkspace(); + handleWorkspaceResources(folderId, userName, bean); - WorkspaceItem retrievedItem = ws.getItem(folderId); - - // retrieve gcube items of the folder - Map folderItems = Utils.getGcubeItemProperties(retrievedItem); - bean.setCustomFields(folderItems); - - // check the resources within the folder (skip subdirectories) - List childrenIds = new ArrayList(); - - for (WorkspaceItem file : retrievedItem.getChildren()) { - if(!file.isFolder()) // ok, it's a file - childrenIds.add(file.getId()); - } - List listOfResources = Utils.getWorkspaceResourcesInformation(childrenIds, ws, user); - bean.setResources(listOfResources); } }catch(Exception e){ @@ -375,19 +331,110 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C return bean; } + /** + * This method receives a folder id within the user's workspace and set the list of resources in the dataset bean to be returned + * @param folderId + * @param owner + * @param bean + * @param userName + * @throws Exception + */ + private void handleWorkspaceResources(String folderId, String userName, + DatasetMetadataBean bean) throws Exception { + + // get workspace + Workspace ws = HomeLibrary + .getHomeManagerFactory() + .getHomeManager() + .getHome(userName).getWorkspace(); + + WorkspaceItem originalFolder = ws.getItem(folderId); + + // set some info + String onlyAlphanumeric = originalFolder.getName().replaceAll("[^A-Za-z0-9]", ""); // that is, remove characters different than A-Z,a-z,0-9 + bean.setTitle(onlyAlphanumeric); + bean.setDescription(originalFolder.getDescription()); + + // Create the folder in the catalogue + Map folderItems = Utils.getGcubeItemProperties(originalFolder); + bean.setCustomFields(folderItems); + + // check the resources within the folder (skip subdirectories for now TODO) + List childrenIds = new ArrayList(); + + for (WorkspaceItem file : originalFolder.getChildren()) { + if(!file.isFolder()){ + + childrenIds.add(file.getId()); + + } + } + + List listOfResources = Utils.getWorkspaceResourcesInformation(childrenIds, ws, userName); + bean.setResources(listOfResources); + + } + + /** + * Copy into the .catalogue area folder the checked resources + * @param resourcesToAdd + * @param folderId + * @param userName + * @param bean + * @return + */ + private List copyResourcesToUserCatalogueArea( + List resourcesToAdd, String folderId, String userName, DatasetMetadataBean bean) throws Exception{ + + // in to the .catalogue area of the user's workspace + Workspace ws = HomeLibrary + .getHomeManagerFactory() + .getHomeManager() + .getHome(userName).getWorkspace(); + + WorkspaceItem originalFolder = ws.getItem(folderId); + + // Retrieve the catalogue of the user + WorkspaceCatalogue userCatalogue = ws.getCatalogue(); + + // Create the folder in the catalogue + WorkspaceItem copiedFolder = userCatalogue.addWorkspaceItem(originalFolder.getPath(), null); // add to .catalogue root + + List resources = new ArrayList(); + + // copy only the selected ones + for(ResourceBeanWrapper resourceBeanWrapper : resourcesToAdd){ + + if (resourceBeanWrapper.isToBeAdded()) { + + // ok it is a file, so copy it into the copiedFolder + WorkspaceItem copiedFile = userCatalogue.addWorkspaceItem(resourceBeanWrapper.getId(), copiedFolder.getId()); + resources.add(new ResourceBean( + copiedFile.getPublicLink(true), + copiedFile.getName(), + copiedFile.getDescription(), + copiedFile.getId(), + userName, + null, // to be set + ((FolderItem)copiedFile).getMimeType())); + } + } + + return resources; + } + @Override public DatasetMetadataBean createCKanDataset(DatasetMetadataBean toCreate, boolean isWorkspaceRequest) { logger.debug("Request for creating a dataset with these information " + toCreate); ASLSession aslSession = getASLSession(); - String user = aslSession.getUsername(); - + String userName = aslSession.getUsername(); try{ // check if session expired - if(user.equals(TEST_USER)){ + if(userName.equals(TEST_USER)){ logger.debug("SESSION EXPIRED"); return null; } @@ -407,31 +454,16 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C boolean setPublic = toCreate.getVisibility(); // get the list of resources and convert to ResourceBean - List resources = new ArrayList(); + List resources = null; List resourcesToAdd = toCreate.getResources(); - if(resourcesToAdd != null && !resourcesToAdd.isEmpty()) - for (ResourceBeanWrapper resourceBeanWrapper : resourcesToAdd) { + // we need to copy such resource in the .catalogue area of the user's ws + if(resourcesToAdd != null && !resourcesToAdd.isEmpty()){ - if(resourceBeanWrapper.isToBeAdded()){ - resources.add(new ResourceBean( - resourceBeanWrapper.getUrl(), - resourceBeanWrapper.getName(), - resourceBeanWrapper.getDescription(), - resourceBeanWrapper.getId(), - resourceBeanWrapper.getOwner(), - null, - resourceBeanWrapper.getMimeType())); + resources = copyResourcesToUserCatalogueArea(resourcesToAdd, toCreate.getId(), userName, toCreate); - } + } - } - - - // TODO this code must be checked against Auth 2.0 - // The ckan instance in which we will publish is the expressed by the organization name (scope) - // This means that if we are in root (e.g. /gcube) and the user choose to publish into vreY - // the ckan in which we will publish is the one in scope vreY logger.debug("The user wants to publish in organization with name " + organizationNameOrId + " and current scope name is " + aslSession.getScopeName()); String scope = Utils.retrieveScopeFromOrganizationName(organizationNameOrId); CKanUtils utils = getCkanUtilsObj(scope); @@ -447,7 +479,6 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C // retrieve the url String datasetUrl = utils.getPortletUrl() + "?path=" + utils.getUrlFromDatasetIdOrName(getUserCKanTokenFromSession(scope), datasetId, true); - toCreate.setSource(datasetUrl); return toCreate; @@ -465,10 +496,14 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C } @Override - public ResourceBeanWrapper addResourceToDataset(ResourceBeanWrapper resource, String datasetId, String owner) { + public ResourceBeanWrapper addResourceToDataset(ResourceBeanWrapper resource, String datasetId) { + + + ASLSession session = getASLSession(); + String username = session.getUsername(); logger.debug("Incoming request for creating new resource for dataset with id " + datasetId + " and organization name of the dataset is " + resource.getOrganizationNameDatasetParent()); - logger.debug("Owner is " + owner + " and resource is " + resource); + logger.debug("Owner is " + username + " and resource is " + resource); if(!isWithinPortal()){ @@ -477,9 +512,6 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C }else{ - ASLSession session = getASLSession(); - String username = session.getUsername(); - if(username.equals(TEST_USER)){ logger.warn("SESSION EXPIRED! "); @@ -493,7 +525,7 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C resource.getName(), resource.getDescription(), null, - owner, + username, datasetId, null); @@ -517,8 +549,7 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C } @Override - public boolean deleteResourceFromDataset(ResourceBeanWrapper resource, - String owner) { + public boolean deleteResourceFromDataset(ResourceBeanWrapper resource) { logger.debug("Request for deleting resource " + resource); boolean deleted = false; @@ -554,7 +585,7 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C @Override public List getProfiles(String orgName) { - + logger.debug("Requested profiles for products into orgName " + orgName); List toReturn = new ArrayList(); diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/server/utils/Utils.java b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/server/utils/Utils.java index ce08cfc..a9ead37 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/server/utils/Utils.java +++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/server/utils/Utils.java @@ -24,6 +24,7 @@ import org.gcube.datacatalogue.metadatadiscovery.bean.jaxb.MetadataFormat; import org.gcube.datacatalogue.metadatadiscovery.bean.jaxb.MetadataValidator; import org.gcube.datacatalogue.metadatadiscovery.bean.jaxb.MetadataVocabulary; import org.gcube.portlets.widgets.ckandatapublisherwidget.server.CKANPublisherServicesImpl; +import org.gcube.portlets.widgets.ckandatapublisherwidget.shared.DataType; import org.gcube.portlets.widgets.ckandatapublisherwidget.shared.MetaDataProfileBean; import org.gcube.portlets.widgets.ckandatapublisherwidget.shared.MetaDataTypeWrapper; import org.gcube.portlets.widgets.ckandatapublisherwidget.shared.MetadataFieldWrapper; @@ -91,7 +92,6 @@ public class Utils { newResource.setName(item.getName()); newResource.setToBeAdded(true); // default is true newResource.setMimeType(((FolderItem)item).getMimeType()); - newResource.setOwner(username); toReturn.add(newResource); } @@ -359,7 +359,7 @@ public class Utils { MetadataFieldWrapper wrapperObj = new MetadataFieldWrapper(); wrapperObj.setDefaulValue(metadataField.getDefaulValue()); wrapperObj.setFieldName(metadataField.getFieldName()); - wrapperObj.setIsBoolean(metadataField.getIsBoolean()); + wrapperObj.setType(DataType.valueOf(metadataField.getDataType().toString())); wrapperObj.setMandatory(metadataField.getMandatory()); wrapperObj.setNote(metadataField.getNote()); @@ -370,6 +370,9 @@ public class Utils { MetadataVocabulary vocabulary = metadataField.getVocabulary(); if(vocabulary != null) wrapperObj.setVocabulary(vocabulary.getVocabularyFields()); + + // multi selection? + wrapperObj.setMultiSelection(metadataField.getVocabulary().isMultiSelection()); // add to the list wrapperList.add(wrapperObj); diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/shared/DataType.java b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/shared/DataType.java new file mode 100644 index 0000000..d1c69ff --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/shared/DataType.java @@ -0,0 +1,25 @@ +package org.gcube.portlets.widgets.ckandatapublisherwidget.shared; + +/** + * The Enum DataType. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Sep 12, 2016 + */ +public enum DataType { + + String, + Date, + Text, + Boolean, + Number; + + /** + * Value. + * + * @return the string + */ + public String value() { + return name(); + } +} diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/shared/MetadataFieldWrapper.java b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/shared/MetadataFieldWrapper.java index 41dde55..b6e58ec 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/shared/MetadataFieldWrapper.java +++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/shared/MetadataFieldWrapper.java @@ -13,10 +13,11 @@ public class MetadataFieldWrapper implements Serializable{ private static final long serialVersionUID = -8476731365884466698L; private String fieldName; private Boolean mandatory = false; - private Boolean isBoolean = false; + private DataType type; private String defaulValue; private String note; private List vocabulary; + private boolean multiSelection; private String validator; /** @@ -31,20 +32,20 @@ public class MetadataFieldWrapper implements Serializable{ * * @param fieldName the field name * @param mandatory the mandatory - * @param isBoolean the is boolean + * @param DataType the type * @param defaulValue the defaul value * @param note the note * @param vocabulary the vocabulary * @param validator the validator */ public MetadataFieldWrapper( - String fieldName, Boolean mandatory, Boolean isBoolean, - String defaulValue, String note, List vocabulary, - String validator) { + String fieldName, Boolean mandatory, DataType type, + String defaulValue, String note, List vocabulary, + String validator) { super(); this.fieldName = fieldName; this.mandatory = mandatory; - this.isBoolean = isBoolean; + this.type = type; this.defaulValue = defaulValue; this.note = note; this.vocabulary = vocabulary; @@ -71,16 +72,6 @@ public class MetadataFieldWrapper implements Serializable{ return mandatory; } - /** - * Gets the checks if is boolean. - * - * @return the isBoolean - */ - public Boolean getIsBoolean() { - - return isBoolean; - } - /** * Gets the defaul value. * @@ -141,16 +132,6 @@ public class MetadataFieldWrapper implements Serializable{ this.mandatory = mandatory; } - /** - * Sets the checks if is boolean. - * - * @param isBoolean the isBoolean to set - */ - public void setIsBoolean(Boolean isBoolean) { - - this.isBoolean = isBoolean; - } - /** * Sets the defaul value. * @@ -191,15 +172,29 @@ public class MetadataFieldWrapper implements Serializable{ this.validator = validator; } - /* (non-Javadoc) - * @see java.lang.Object#toString() - */ + public DataType getType() { + return type; + } + + public void setType(DataType type) { + this.type = type; + } + + public boolean isMultiSelection() { + return multiSelection; + } + + public void setMultiSelection(boolean multiSelection) { + this.multiSelection = multiSelection; + } + @Override public String toString() { return "MetadataFieldWrapper [fieldName=" + fieldName + ", mandatory=" - + mandatory + ", isBoolean=" + isBoolean + ", defaulValue=" - + defaulValue + ", note=" + note + ", vocabulary=" + vocabulary - + ", validator=" + validator + "]"; + + mandatory + ", type=" + type + ", defaulValue=" + defaulValue + + ", note=" + note + ", vocabulary=" + vocabulary + + ", multiSelection=" + multiSelection + ", validator=" + + validator + "]"; } } diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/shared/ResourceBeanWrapper.java b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/shared/ResourceBeanWrapper.java index c03b56b..bcadd2f 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/shared/ResourceBeanWrapper.java +++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/shared/ResourceBeanWrapper.java @@ -1,6 +1,7 @@ package org.gcube.portlets.widgets.ckandatapublisherwidget.shared; import java.io.Serializable; +import java.util.List; /** * A dataset's resource bean @@ -15,8 +16,8 @@ public class ResourceBeanWrapper implements Serializable{ private String id; private boolean toBeAdded; private String mimeType; - private String owner; private String organizationNameDatasetParent; // the organization name in which the parent dataset was created + private List subResources; // a list of sub resources TODO public ResourceBeanWrapper(){ super(); @@ -29,10 +30,9 @@ public class ResourceBeanWrapper implements Serializable{ * @param id * @param toBeAdded * @param mimeType - * @param owner */ public ResourceBeanWrapper(String url, String name, String description, - String id, boolean toBeAdded, String mimeType, String owner, String organizationNameDatasetParent) { + String id, boolean toBeAdded, String mimeType, String organizationNameDatasetParent) { super(); this.url = url; this.name = name; @@ -40,7 +40,6 @@ public class ResourceBeanWrapper implements Serializable{ this.id = id; this.toBeAdded = toBeAdded; this.mimeType = mimeType; - this.owner = owner; this.organizationNameDatasetParent = organizationNameDatasetParent; } @@ -127,21 +126,7 @@ public class ResourceBeanWrapper implements Serializable{ public void setMimeType(String mimeType) { this.mimeType = mimeType; } - - /** - * @return the owner - */ - public String getOwner() { - return owner; - } - - /** - * @param owner the owner to set - */ - public void setOwner(String owner) { - this.owner = owner; - } - + /** * @return the organizationNameDatasetParent */ @@ -156,16 +141,23 @@ public class ResourceBeanWrapper implements Serializable{ String organizationNameDatasetParent) { this.organizationNameDatasetParent = organizationNameDatasetParent; } + + + public List getSubResources() { + return subResources; + } + + public void setSubResources(List subResources) { + this.subResources = subResources; + } - /* (non-Javadoc) - * @see java.lang.Object#toString() - */ @Override public String toString() { return "ResourceBeanWrapper [url=" + url + ", name=" + name + ", description=" + description + ", id=" + id + ", toBeAdded=" + toBeAdded + ", mimeType=" + mimeType - + ", owner=" + owner + ", organizationNameDatasetParent=" - + organizationNameDatasetParent + "]"; + + ", organizationNameDatasetParent=" + + organizationNameDatasetParent + ", subResources=" + + subResources + "]"; } } diff --git a/src/main/resources/org/gcube/portlets/widgets/ckandatapublisherwidget/CKanMetadataPublisher.gwt.xml b/src/main/resources/org/gcube/portlets/widgets/ckandatapublisherwidget/CKanMetadataPublisher.gwt.xml index f36e359..566dd7f 100644 --- a/src/main/resources/org/gcube/portlets/widgets/ckandatapublisherwidget/CKanMetadataPublisher.gwt.xml +++ b/src/main/resources/org/gcube/portlets/widgets/ckandatapublisherwidget/CKanMetadataPublisher.gwt.xml @@ -8,9 +8,10 @@ + - +