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 2fccaf9..e697b2e 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 @@ -126,7 +126,7 @@ public class CKanMetadataPublisher implements EntryPoint { String idFolderWorkspace = "d3a37eb9-1589-4c95-a9d0-c473a02d4f0f"; String owner = "costantino.perciante"; - RootPanel.get("ckan-metadata-publisher-div").add(new CreateDatasetForm(idFolderWorkspace ,owner, eventBus)); + RootPanel.get("ckan-metadata-publisher-div").add(new CreateDatasetForm(idFolderWorkspace, 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 1dfc401..ccf277a 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 @@ -58,4 +58,12 @@ public interface CKanPublisherService extends RemoteService { * @return true on success, false otherwise */ boolean deleteResourceFromDataset(ResourceBeanWrapper resource); + + /** + * Given the title the user wants to give to the new product to create, a check is performed + * to understand if a dataset with the proposed title (and so the id generateda at server side) already exists + * @param title + * @return true if it exists, false otherwise + */ + boolean datasetIdAlreadyExists(String title); } 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 1308a7f..942a08d 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 @@ -60,4 +60,12 @@ public interface CKanPublisherServiceAsync { */ void getProfiles(String orgName, AsyncCallback> callback); + /** + * Given the title the user wants to give to the new product to create, a check is performed + * to understand if a dataset with the proposed title (and so the id generateda at server side) already exists + * @param title + * @return true if it exists, false otherwise + */ + void datasetIdAlreadyExists(String title, AsyncCallback callback); + } 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 9af0288..201d87b 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 @@ -156,6 +156,9 @@ public class CreateDatasetForm extends Composite{ @UiField Icon infoIconResources; @UiField FocusPanel focusPanelResources; @UiField Popover popoverResources; + @UiField Icon infoIconTitle; + @UiField FocusPanel focusPanelTitle; + @UiField Popover popoverTitle; @UiField ControlGroup metadataProfilesControlGroup; @UiField ControlGroup productTitleGroup; @UiField ControlGroup maintainerControlGroup; @@ -208,9 +211,9 @@ public class CreateDatasetForm extends Composite{ * Invoked in the most general case * @param owner */ - public CreateDatasetForm(String owner, HandlerManager eventBus) { + public CreateDatasetForm(HandlerManager eventBus) { - createDatasetFormBody(false, null, owner, eventBus); + createDatasetFormBody(false, null, eventBus); } @@ -219,9 +222,9 @@ public class CreateDatasetForm extends Composite{ * @param idFolderWorkspace * @param owner */ - public CreateDatasetForm(String idFolderWorkspace, String owner, HandlerManager eventBus) { + public CreateDatasetForm(String idFolderWorkspace, HandlerManager eventBus) { - createDatasetFormBody(true, idFolderWorkspace, owner, eventBus); + createDatasetFormBody(true, idFolderWorkspace, eventBus); } @@ -263,12 +266,10 @@ public class CreateDatasetForm extends Composite{ * @param owner * @param eventBus */ - private void createDatasetFormBody(final boolean isWorkspaceRequest, String idFolderWorkspace, String owner, final HandlerManager eventBus){ + private void createDatasetFormBody(final boolean isWorkspaceRequest, String idFolderWorkspace, final HandlerManager eventBus){ initWidget(uiBinder.createAndBindUi(this)); - this.owner = owner; - // save event bus this.eventBus = eventBus; @@ -634,7 +635,6 @@ public class CreateDatasetForm extends Composite{ }else{ alertOnContinue("Please check inserted data [" + errorMsg + "]", AlertType.ERROR); } - } @@ -958,6 +958,15 @@ public class CreateDatasetForm extends Composite{ focusPanelResources ); + // title + preparePopupPanelAndPopover( + InfoIconsLabels.TITLE_INFO_ID_POPUP, + InfoIconsLabels.TITLE_INFO_TEXT, + InfoIconsLabels.TITLE_INFO_CAPTION, + infoIconTitle, + popoverTitle, + focusPanelTitle + ); } /** @@ -1040,8 +1049,6 @@ public class CreateDatasetForm extends Composite{ */ private String validateDataOnContinue() { - String errorMessage = null; - // remove errors productTitleGroup.setType(ControlGroupType.NONE); maintainerControlGroup.setType(ControlGroupType.NONE); @@ -1050,52 +1057,51 @@ public class CreateDatasetForm extends Composite{ organizationsGroup.setType(ControlGroupType.NONE); if(titleTextBox.getText().isEmpty()){ - errorMessage = "Missing title"; productTitleGroup.setType(ControlGroupType.ERROR); - return errorMessage; + return "Missing title"; } - // better check for the title - String regexTitleSubWord = "^[a-zA-Z0-9_]+$"; - String[] splittedTitle = titleTextBox.getText().split(" "); + // better check for the title + String regexTitleSubWord = "[^a-zA-Z0-9_.-]"; + String[] splittedTitle = titleTextBox.getText().split(" "); for (String word : splittedTitle) { - - if(!word.matches(regexTitleSubWord)){ + String replaced = word.replaceAll(regexTitleSubWord, ""); + if(!replaced.equals(word)){ productTitleGroup.setType(ControlGroupType.ERROR); - return "Please note that only alphanumeric characters are allowed for the title"; + return "Please note that only alphanumeric characters are allowed for the title"; } - } // email reg expression String regexMail = "\\b[\\w.%-]+@[-.\\w]+\\.[A-Za-z]{2,4}\\b"; if(!validateByRegExpression(maintainerEmailTextbox.getText(), regexMail)){ - errorMessage = "Not valid maintainer email"; maintainerControlGroup.setType(ControlGroupType.ERROR); - return errorMessage; + return "Not valid maintainer email"; } // check if version is a number try{ - Integer.valueOf(versionTextbox.getText()); + int number = Integer.valueOf(versionTextbox.getText()); + if(number <= 0) + throw new Exception(); }catch(Exception e){ versionControlGroup.setType(ControlGroupType.ERROR); - return errorMessage = "Version must be a natural number"; + return "Version must be a natural number greater than zero"; } // 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"; metadataProfilesControlGroup.setType(ControlGroupType.ERROR); + return "You must select a metadata profile different frome none"; } if(organizationsListbox.getSelectedItemText() == null){ organizationsGroup.setType(ControlGroupType.ERROR); - errorMessage = "You must select an organization in which you want to publish"; + return "You must select an organization in which you want to publish"; } - return errorMessage; + return null; } /** 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 aa694c8..b447625 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 @@ -62,7 +62,15 @@ + width="90%" b:id="title" title="Product title" ui:field="titleTextBox" /> + + + + + + + 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 5ef0f46..3617714 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 @@ -317,9 +317,7 @@ public class MetaDataFieldSkeleton extends Composite{ List vocabulary = field.getVocabulary(); for (String term : vocabulary) { - ((ListBox)holder).addItem(term); - } // set default value @@ -574,7 +572,7 @@ public class MetaDataFieldSkeleton extends Composite{ if(field.getValidator() == null || field.getValidator().isEmpty()) return null; // no further check else return checkValidator(textBoxValue, field.getValidator()) ? null : MALFORMED_ATTRIBUTE; - else return " a mandatory attribute cannot be empty"; + else return MANDATORY_ATTRIBUTE_MISSING; }else{ if(textBoxValue.trim().isEmpty()) @@ -582,7 +580,25 @@ public class MetaDataFieldSkeleton extends Composite{ else return checkValidator(textBoxValue, field.getValidator()) ? null : MALFORMED_ATTRIBUTE; } } - else return null; + else{ + + String listBoxCurrentValue = getFieldCurrentValue(); + + // listbox case + if(!field.getMandatory()){ + + if(field.getValidator() == null || field.getValidator().isEmpty()) + return null; + else + return checkValidator(listBoxCurrentValue, field.getValidator()) ? null : MALFORMED_ATTRIBUTE; + + }else{ + + return listBoxCurrentValue == null || listBoxCurrentValue.isEmpty() ? MANDATORY_ATTRIBUTE_MISSING : null; + + } + + } default: return null; diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/utils/InfoIconsLabels.java b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/utils/InfoIconsLabels.java index a3abd8b..8d61144 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/utils/InfoIconsLabels.java +++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/utils/InfoIconsLabels.java @@ -58,5 +58,10 @@ public class InfoIconsLabels { public static final String CUSTOM_FIELDS_INFO_ID_POPUP = "custom-fields-popup-panel-info"; public static final String CUSTOM_FIELDS_INFO_CAPTION = "Product Custom Fields"; public static final String CUSTOM_FIELDS_INFO_TEXT = "Custom fields are customable metadata that will be added to the product. You have to choose a unique key for the field and a value for this. You can remove them at any time until you create theproduct."; + + // TITLE + public static final String TITLE_INFO_ID_POPUP = "title-popup-panel-info"; + public static final String TITLE_INFO_TEXT = "Product Title"; + public static final String TITLE_INFO_CAPTION = "Product Title must contain only alphanumer characters and [. - _]. No others symbols are allowed."; } 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 54c6fa0..8972507 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 @@ -11,6 +11,7 @@ import org.gcube.application.framework.core.session.ASLSession; 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.WorkspaceFolder; 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; @@ -50,7 +51,7 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C public static final String TEST_SCOPE = "/gcube/devsec/devVRE"; public static final String TEST_USER = "test.user"; private final static String TEST_SEC_TOKEN = "a1e19695-467f-42b8-966d-bf83dd2382ef"; - + /** * Retrieve an instance of the library for the scope * @param scope if it is null it is evaluated from the session @@ -346,7 +347,7 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C 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 + String onlyAlphanumeric = originalFolder.getName().replaceAll("[^A-Za-z0-9.-_]", " "); // that is, remove characters different than the ones inside bean.setTitle(onlyAlphanumeric); bean.setDescription(originalFolder.getDescription()); @@ -359,9 +360,7 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C for (WorkspaceItem file : originalFolder.getChildren()) { if(!file.isFolder()){ - childrenIds.add(file.getId()); - } } @@ -381,19 +380,29 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C private List copyResourcesToUserCatalogueArea( List resourcesToAdd, String folderId, String userName, DatasetMetadataBean bean) throws Exception{ + logger.debug("Request to copy onto catalogue area. Parameters are resources to add" + resourcesToAdd); + logger.debug("Request to copy onto catalogue area. Folder id is " + folderId); + logger.debug("Request to copy onto catalogue area. Username is " + userName); + logger.debug("Request to copy onto catalogue area. DatasetMetadataBean is " + bean); + // in to the .catalogue area of the user's workspace Workspace ws = HomeLibrary .getHomeManagerFactory() .getHomeManager() - .getHome(userName).getWorkspace(); - - WorkspaceItem originalFolder = ws.getItem(folderId); + .getHome(userName) + .getWorkspace(); // 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 + WorkspaceItem copiedFolder = userCatalogue.addWorkspaceItem(folderId, userCatalogue.getId()); // add to .catalogue root area + + // change description for the folder + copiedFolder.setDescription(bean.getDescription()); + + // change name of the copied folder to match the title + ((WorkspaceFolder)copiedFolder).rename(org.gcube.datacatalogue.ckanutillibrary.utils.UtilMethods.nameFromTitle(bean.getTitle())); List resources = new ArrayList(); @@ -404,14 +413,21 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C // ok it is a file, so copy it into the copiedFolder WorkspaceItem copiedFile = userCatalogue.addWorkspaceItem(resourceBeanWrapper.getId(), copiedFolder.getId()); + + // name and description could have been edited + copiedFile.setDescription(resourceBeanWrapper.getDescription()); + resources.add(new ResourceBean( copiedFile.getPublicLink(true), - copiedFile.getName(), + resourceBeanWrapper.getName(), copiedFile.getDescription(), copiedFile.getId(), userName, null, // to be set ((FolderItem)copiedFile).getMimeType())); + + // postpone rename operation + copiedFile.rename(resourceBeanWrapper.getName()); } } @@ -459,7 +475,7 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C } - logger.debug("The user wants to publish in organization with name " + organizationNameOrId + " and current scope name is " + aslSession.getScopeName()); + logger.debug("The user wants to publish in organization with name " + organizationNameOrId); String scope = Utils.retrieveScopeFromOrganizationName(organizationNameOrId); CKanUtils utils = getCkanUtilsObj(scope); @@ -594,4 +610,22 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C return toReturn; } + + @Override + public boolean datasetIdAlreadyExists(String title) { + + if(title == null || title.isEmpty()) + return true; // it's an error somehow + + try{ + + String scope = (String)getThreadLocalRequest().getSession().getAttribute(SessionCatalogueAttributes.SCOPE_CLIENT_PORTLET_URL); + return getCkanUtilsObj(scope).existProductWithNameOrId(title); + + }catch(Exception e){ + logger.error("Unable to check if such a dataset id already exists", e); + } + + return false; + } } \ No newline at end of file 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 1f03e95..069fd68 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 @@ -113,7 +113,6 @@ public class Utils { } } catch (InternalErrorException e) { logger.error("Error in server getItemProperties: ", e); - return null; } } return null; @@ -163,10 +162,6 @@ public class Utils { // get highest role according liferay RolesIntoOrganization correspondentRoleToCheck = getLiferayHighestRoleInOrg(roles); - // if the role is member, continue - if(correspondentRoleToCheck.equals(RolesIntoOrganization.MEMBER)) - continue; - checkIfRoleIsSetInCkanInstance(username, gCubeGroupName, gCubeGroup.getGroupId(), correspondentRoleToCheck, toReturn, groupManager, ckanPublisherServicesImpl); } @@ -184,10 +179,6 @@ public class Utils { // get highest role according liferay RolesIntoOrganization correspondentRoleToCheck = getLiferayHighestRoleInOrg(roles); - // if the role is member, continue - if(correspondentRoleToCheck.equals(RolesIntoOrganization.MEMBER)) - continue; - checkIfRoleIsSetInCkanInstance(username, gCubeGroupName, gCubeGroup.getGroupId(), correspondentRoleToCheck, toReturn, groupManager, ckanPublisherServicesImpl); } @@ -199,10 +190,7 @@ public class Utils { // get highest role according liferay RolesIntoOrganization correspondentRoleToCheck = getLiferayHighestRoleInOrg(roles); - if(correspondentRoleToCheck.equals(RolesIntoOrganization.ADMIN)){ - - checkIfRoleIsSetInCkanInstance(username, groupName, currentGroupId, correspondentRoleToCheck, toReturn, groupManager, ckanPublisherServicesImpl); - } + checkIfRoleIsSetInCkanInstance(username, groupName, currentGroupId, correspondentRoleToCheck, toReturn, groupManager, ckanPublisherServicesImpl); } }catch(Exception e){ logger.error("Unable to retrieve the role information for this user. Returning member role", e); @@ -235,12 +223,11 @@ public class Utils { // if there is an instance of ckan in this scope.. if(ckanUtils != null){ boolean res = ckanUtils.checkRole(username, gCubeGroupName, correspondentRoleToCheck); - if(res){ - - // get the orgs of the user + if(res && !correspondentRoleToCheck.equals(RolesIntoOrganization.MEMBER)){ + // get the orgs of the user and retrieve its title and name List ckanOrgs = ckanUtils.getOrganizationsByUser(username); for (CkanOrganization ckanOrganization : ckanOrgs) { - if(ckanOrganization.getName().equals(gCubeGroupName.toLowerCase())){//|| ckanOrganization.getName().equals(CKanUtilsImpl.PRODUCTION_CKAN_ORGNAME_ROOT)){ + if(ckanOrganization.getName().equals(gCubeGroupName.toLowerCase())){ orgs.add(new OrganizationBean(ckanOrganization.getTitle(), ckanOrganization.getName())); break; } @@ -262,6 +249,9 @@ public class Utils { if(gCubeRole.getRoleName().equalsIgnoreCase(GatewayRolesNames.CATALOGUE_ADMIN.getRoleName())){ return RolesIntoOrganization.ADMIN; } + if(gCubeRole.getRoleName().equalsIgnoreCase(GatewayRolesNames.CATALOGUE_EDITOR.getRoleName())){ + return RolesIntoOrganization.EDITOR; + } } return RolesIntoOrganization.MEMBER; } @@ -296,10 +286,6 @@ public class Utils { if(scope != null){ - - // if(scope.equals(CKanUtilsImpl.PRODUCTION_SCOPE_ROOT)) - // return CKanUtilsImpl.PRODUCTION_CKAN_ORGNAME_ROOT; - GroupManager gm = new LiferayGroupManager(); return gm.getGroup(gm.getGroupIdFromInfrastructureScope(scope)).getGroupName().toLowerCase(); } @@ -319,7 +305,7 @@ public class Utils { // check the scope we need to discover String scopeInWhichDiscover = (scope != null && !scope.isEmpty()) ? scope : aslSession.getScope(); - + logger.debug("Discovering into scope " + scopeInWhichDiscover); // scope in which we need to discover @@ -361,7 +347,7 @@ public class Utils { wrapperObj.setValidator(validator.getRegularExpression()); MetadataVocabulary vocabulary = metadataField.getVocabulary(); - + if(vocabulary != null){ wrapperObj.setVocabulary(vocabulary.getVocabularyFields()); wrapperObj.setMultiSelection(vocabulary.isMultiSelection()); @@ -388,7 +374,7 @@ public class Utils { } catch (Exception e) { logger.error("Error while retrieving metadata beans ", e); }finally{ - + // set the scope back if(oldScope != scopeInWhichDiscover) ScopeProvider.instance.set(oldScope); diff --git a/src/test/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/TestClass.java b/src/test/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/TestClass.java index c13232c..eccf995 100644 --- a/src/test/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/TestClass.java +++ b/src/test/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/TestClass.java @@ -1,7 +1,21 @@ package org.gcube.portlets.widgets.ckandatapublisherwidget.client; +import java.util.List; + +import org.gcube.common.homelibrary.home.HomeLibrary; +import org.gcube.common.homelibrary.home.exceptions.HomeNotFoundException; +import org.gcube.common.homelibrary.home.exceptions.InternalErrorException; +import org.gcube.common.homelibrary.home.exceptions.UserNotFoundException; +import org.gcube.common.homelibrary.home.workspace.Workspace; +import org.gcube.common.homelibrary.home.workspace.WorkspaceFolder; +import org.gcube.common.homelibrary.home.workspace.WorkspaceItem; +import org.gcube.common.homelibrary.home.workspace.catalogue.WorkspaceCatalogue; +import org.gcube.common.homelibrary.home.workspace.exceptions.ItemNotFoundException; +import org.gcube.common.homelibrary.home.workspace.exceptions.WorkspaceFolderNotFoundException; +import org.gcube.common.scope.api.ScopeProvider; import org.gcube.portlets.widgets.ckandatapublisherwidget.server.CKANPublisherServicesImpl; + public class TestClass { //@Test @@ -11,4 +25,69 @@ public class TestClass { } + //@Test + public void testCopyResources() throws WorkspaceFolderNotFoundException, InternalErrorException, HomeNotFoundException, UserNotFoundException, ItemNotFoundException{ + + ScopeProvider.instance.set("/gcube/devNext/NextNext"); + + Workspace ws = HomeLibrary + .getHomeManagerFactory() + .getHomeManager() + .getHome("costantino.perciante").getWorkspace(); + + WorkspaceItem originalFolder = ws.getItem("d3a37eb9-1589-4c95-a9d0-c473a02d4f0f"); + + List children = originalFolder.getChildren(); + // System.out.println("Folder is " + originalFolder.getName()); + // for (WorkspaceItem workspaceItem : children) { + // System.out.println("Child is " + workspaceItem.getName()); + // } + + // copy to catalogue + WorkspaceCatalogue userCatalogue = ws.getCatalogue(); + + WorkspaceItem copiedFolder = userCatalogue.addWorkspaceItem(originalFolder.getId(), userCatalogue.getId()); + System.out.println(copiedFolder.isHidden()); + // for (WorkspaceItem workspaceItem : children) { + // WorkspaceItem copiedChildren = userCatalogue.addWorkspaceItem(workspaceItem.getId(), copiedFolder.getId()); + // System.out.println("****************************** Copied file has path " + copiedChildren.getPath()); + // } + + // look at catalogue structure + List catalogueChildrens = ((WorkspaceFolder)userCatalogue).getChildren(true); + if(catalogueChildrens.isEmpty()) + System.out.println("****************************** Catalogue Child list is empty"); + else for (WorkspaceItem catalogueItem : catalogueChildrens) { + System.out.println("****************************** Catalogue Child is " + catalogueItem.getName()); + if(catalogueItem.isFolder()){ + WorkspaceFolder catalogueFolder = (WorkspaceFolder) catalogueItem; + System.out.println("**************************" + catalogueFolder.getName() + " it is a folder, printing children"); + List copiedFolderChildren = catalogueFolder.getChildren(true); + for (WorkspaceItem copiedFolderChildrenItem : copiedFolderChildren) { + System.out.println("****************************** Child is " + copiedFolderChildrenItem.getName()); + copiedFolderChildrenItem.getPublicLink(true); + } + } + } + } + + //@Test + public void testTitle(){ + + // String regexTitleSubWord = "[^a-zA-Z0-9_.-]"; + // String title = "this is a test title ."; + // String[] splittedTitle = title.split(" "); + // + // for (String word : splittedTitle) { + // System.out.println("Word is " + word); + // String replaced = word.replaceAll(regexTitleSubWord, ""); + // System.out.println("Replaced Word is " + replaced); + // if(!replaced.equals(word)){ + // System.out.println("Please note that only alphanumeric characters are allowed for the title"); + // } + // } + + System.out.println("Notification_portlet".replaceAll("[^A-Za-z0-9.-_]", " ")); + } + }