minor fix when checking roles. Support for copying files in catalogue area almost finished

git-svn-id: http://svn.d4science-ii.research-infrastructures.eu/gcube/trunk/portlets/widgets/ckan-metadata-publisher-widget@131766 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
Costantino Perciante 2016-09-23 16:50:16 +00:00
parent 58750aa80c
commit 52d3efce0c
10 changed files with 216 additions and 66 deletions

View File

@ -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));
}
}

View File

@ -58,4 +58,12 @@ public interface CKanPublisherService extends RemoteService {
* @return <b>true</b> 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);
}

View File

@ -60,4 +60,12 @@ public interface CKanPublisherServiceAsync {
*/
void getProfiles(String orgName, AsyncCallback<List<MetaDataProfileBean>> 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<Boolean> callback);
}

View File

@ -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;
}
/**

View File

@ -62,7 +62,15 @@
</b:ControlLabel>
<b:Controls>
<b:TextBox alternateSize="LARGE" placeholder="Product title"
width="95%" b:id="title" title="Product title" ui:field="titleTextBox" />
width="90%" b:id="title" title="Product title" ui:field="titleTextBox" />
<span style="float:right; width:5%; color: #aaaaaa;">
<b:Popover ui:field="popoverTitle" html="true"
animation="true" placement="LEFT">
<g:FocusPanel ui:field="focusPanelTitle">
<b:Icon type="INFO_SIGN" size="TWO_TIMES" ui:field="infoIconTitle" />
</g:FocusPanel>
</b:Popover>
</span>
</b:Controls>
</b:ControlGroup>

View File

@ -317,9 +317,7 @@ public class MetaDataFieldSkeleton extends Composite{
List<String> 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;

View File

@ -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.";
}

View File

@ -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<ResourceBean> copyResourcesToUserCatalogueArea(
List<ResourceBeanWrapper> 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<ResourceBean> resources = new ArrayList<ResourceBean>();
@ -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;
}
}

View File

@ -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<CkanOrganization> 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);

View File

@ -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<? extends WorkspaceItem> 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<WorkspaceItem> 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<? extends WorkspaceItem> 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.-_]", " "));
}
}