Group creation and management are now supported. Moved resources classes onto another package.

git-svn-id: http://svn.d4science-ii.research-infrastructures.eu/gcube/trunk/portlets/widgets/ckan-metadata-publisher-widget@131994 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
Costantino Perciante 2016-09-28 14:41:55 +00:00
parent baddb2e8cb
commit c8df6dea6a
15 changed files with 223 additions and 63 deletions

View File

@ -152,7 +152,7 @@
<dependency> <dependency>
<groupId>org.gcube.data-catalogue</groupId> <groupId>org.gcube.data-catalogue</groupId>
<artifactId>ckan-util-library</artifactId> <artifactId>ckan-util-library</artifactId>
<version>[1.0.0-SNAPSHOT, 2.0.0-SNAPSHOT)</version> <version>[2.0.0-SNAPSHOT, 3.0.0-SNAPSHOT)</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>

View File

@ -15,6 +15,10 @@ import org.gcube.portlets.widgets.ckandatapublisherwidget.client.events.CloseCre
import org.gcube.portlets.widgets.ckandatapublisherwidget.client.events.CloseCreationFormEventHandler; import org.gcube.portlets.widgets.ckandatapublisherwidget.client.events.CloseCreationFormEventHandler;
import org.gcube.portlets.widgets.ckandatapublisherwidget.client.events.DeleteCustomFieldEvent; import org.gcube.portlets.widgets.ckandatapublisherwidget.client.events.DeleteCustomFieldEvent;
import org.gcube.portlets.widgets.ckandatapublisherwidget.client.events.DeleteCustomFieldEventHandler; import org.gcube.portlets.widgets.ckandatapublisherwidget.client.events.DeleteCustomFieldEventHandler;
import org.gcube.portlets.widgets.ckandatapublisherwidget.client.ui.dataset.resources.AddResourceContainer;
import org.gcube.portlets.widgets.ckandatapublisherwidget.client.ui.dataset.resources.AddResourceToDataset;
import org.gcube.portlets.widgets.ckandatapublisherwidget.client.ui.dataset.resources.AddedResourcesSummary;
import org.gcube.portlets.widgets.ckandatapublisherwidget.client.ui.dataset.resources.ResourcesTable;
import org.gcube.portlets.widgets.ckandatapublisherwidget.client.ui.utils.GcubeDialogExtended; import org.gcube.portlets.widgets.ckandatapublisherwidget.client.ui.utils.GcubeDialogExtended;
import org.gcube.portlets.widgets.ckandatapublisherwidget.client.ui.utils.InfoIconsLabels; import org.gcube.portlets.widgets.ckandatapublisherwidget.client.ui.utils.InfoIconsLabels;
import org.gcube.portlets.widgets.ckandatapublisherwidget.shared.DataType; import org.gcube.portlets.widgets.ckandatapublisherwidget.shared.DataType;
@ -71,7 +75,7 @@ import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget; import com.google.gwt.user.client.ui.Widget;
/** /**
* Create metadata form for ckan dataset. * Create metadata form for ckan product.
* @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it) * @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it)
*/ */
public class CreateDatasetForm extends Composite{ public class CreateDatasetForm extends Composite{
@ -212,7 +216,7 @@ public class CreateDatasetForm extends Composite{
/** /**
* Invoked in the most general case * Invoked in the most general case
* @param owner * @param eventBus the event bus
*/ */
public CreateDatasetForm(HandlerManager eventBus) { public CreateDatasetForm(HandlerManager eventBus) {
@ -223,7 +227,7 @@ public class CreateDatasetForm extends Composite{
/** /**
* Invoked when the workspace is used * Invoked when the workspace is used
* @param idFolderWorkspace * @param idFolderWorkspace
* @param owner * @param eventBus the event bus
*/ */
public CreateDatasetForm(String idFolderWorkspace, HandlerManager eventBus) { public CreateDatasetForm(String idFolderWorkspace, HandlerManager eventBus) {
@ -507,7 +511,7 @@ public class CreateDatasetForm extends Composite{
metadataProfilesFormatListbox.setEnabled(true); metadataProfilesFormatListbox.setEnabled(true);
// everything went ok // everything went ok
setAlertBlock("", AlertType.ERROR, false); setAlertBlock("", AlertType.DEFAULT, false);
}else }else
setAlertBlock("Error while retrieving profiles, sorry", AlertType.ERROR, true); setAlertBlock("Error while retrieving profiles, sorry", AlertType.ERROR, true);
@ -528,7 +532,7 @@ public class CreateDatasetForm extends Composite{
* Add the items to the listbox and put data into the metadataPanel * Add the items to the listbox and put data into the metadataPanel
* @param receivedBean * @param receivedBean
*/ */
private void prepareMetadataList(DatasetMetadataBean receivedBean) { private void prepareMetadataList(final DatasetMetadataBean receivedBean) {
List<MetaDataProfileBean> beans = receivedBean.getMetadataList(); List<MetaDataProfileBean> beans = receivedBean.getMetadataList();
@ -549,8 +553,9 @@ public class CreateDatasetForm extends Composite{
// hide the panel // hide the panel
metadataFieldsPanel.clear(); metadataFieldsPanel.clear();
metadataFieldsPanel.setVisible(false); metadataFieldsPanel.setVisible(false);
receivedBean.setChosenProfile(null);
}else{ }else{
receivedBean.setChosenProfile(selectedItem);
metadataFieldsPanel.clear(); metadataFieldsPanel.clear();
addFields(selectedItem); addFields(selectedItem);
} }
@ -563,9 +568,14 @@ public class CreateDatasetForm extends Composite{
metadataProfilesControlGroup.setVisible(false); metadataProfilesControlGroup.setVisible(false);
metadataFieldsPanel.clear(); metadataFieldsPanel.clear();
listOfMetadataFields.clear(); listOfMetadataFields.clear();
receivedBean.setChosenProfile(null);
} }
} }
/**
* Add fields of the selected metadata profile to the widget
* @param selectedItem
*/
protected void addFields(String selectedItem) { protected void addFields(String selectedItem) {
for(MetaDataProfileBean bean: receivedBean.getMetadataList()){ for(MetaDataProfileBean bean: receivedBean.getMetadataList()){
@ -661,7 +671,7 @@ public class CreateDatasetForm extends Composite{
@Override @Override
public void onFailure(Throwable caught) { public void onFailure(Throwable caught) {
alertOnContinue("Sorry but there was a proble while checking if the inserted data are correct", AlertType.ERROR); alertOnContinue("Sorry but there was a problem while checking if the inserted data are correct", AlertType.ERROR);
} }
}); });
@ -1103,7 +1113,7 @@ public class CreateDatasetForm extends Composite{
} }
// email reg expression // email reg expression
if(!validateByRegExpression(maintainerEmailTextbox.getText(), REGEX_MAIL)){ if(!maintainerEmailTextbox.getText().matches(REGEX_MAIL)){
maintainerControlGroup.setType(ControlGroupType.ERROR); maintainerControlGroup.setType(ControlGroupType.ERROR);
return "Not valid maintainer email"; return "Not valid maintainer email";
} }
@ -1140,16 +1150,6 @@ public class CreateDatasetForm extends Composite{
return metadataProfilesFormatListbox.getSelectedItemText().equals("none") && (metadataProfilesFormatListbox.getItemCount() != 1); return metadataProfilesFormatListbox.getSelectedItemText().equals("none") && (metadataProfilesFormatListbox.getItemCount() != 1);
} }
/**
* Validate a text against a regular expression.
* @param textToValidate
* @param regex
* @return
*/
private boolean validateByRegExpression(String textToValidate, String regex){
return textToValidate.matches(regex);
}
@UiHandler("resetButton") @UiHandler("resetButton")
void resetFormEvent(ClickEvent e){ void resetFormEvent(ClickEvent e){

View File

@ -1,4 +1,4 @@
package org.gcube.portlets.widgets.ckandatapublisherwidget.client.ui; package org.gcube.portlets.widgets.ckandatapublisherwidget.client.ui.dataset.resources;
import com.github.gwtbootstrap.client.ui.TabPanel; import com.github.gwtbootstrap.client.ui.TabPanel;
import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.GWT;

View File

@ -1,4 +1,4 @@
package org.gcube.portlets.widgets.ckandatapublisherwidget.client.ui; package org.gcube.portlets.widgets.ckandatapublisherwidget.client.ui.dataset.resources;
import org.gcube.portlets.widgets.ckandatapublisherwidget.client.CKanPublisherService; import org.gcube.portlets.widgets.ckandatapublisherwidget.client.CKanPublisherService;
import org.gcube.portlets.widgets.ckandatapublisherwidget.client.CKanPublisherServiceAsync; import org.gcube.portlets.widgets.ckandatapublisherwidget.client.CKanPublisherServiceAsync;

View File

@ -1,4 +1,4 @@
package org.gcube.portlets.widgets.ckandatapublisherwidget.client.ui; package org.gcube.portlets.widgets.ckandatapublisherwidget.client.ui.dataset.resources;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;

View File

@ -1,4 +1,4 @@
package org.gcube.portlets.widgets.ckandatapublisherwidget.client.ui; package org.gcube.portlets.widgets.ckandatapublisherwidget.client.ui.dataset.resources;
import java.util.Comparator; import java.util.Comparator;
import java.util.List; import java.util.List;
@ -200,7 +200,7 @@ public class ResourcesTable extends Composite{
return object.getUrl(); return object.getUrl();
} }
}; };
table.addColumn(urlColumn, "Url"); table.addColumn(urlColumn, "Url (Temporary)");
// Add a date column to show the description (and make it sortable) // Add a date column to show the description (and make it sortable)
Column<ResourceBeanWrapper, String> descColumn = new Column<ResourceBeanWrapper, String>(new EditTextCell()) { Column<ResourceBeanWrapper, String> descColumn = new Column<ResourceBeanWrapper, String>(new EditTextCell()) {

View File

@ -61,7 +61,7 @@ public class InfoIconsLabels {
// TITLE // TITLE
public static final String TITLE_INFO_ID_POPUP = "title-popup-panel-info"; 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_TEXT = "Product Title must contain only alphanumer characters, dots, underscore or hyphen minus. No others symbols are allowed.";
public static final String TITLE_INFO_CAPTION = "Product Title must contain only alphanumer characters and [. - _]. No others symbols are allowed."; public static final String TITLE_INFO_CAPTION = "Product Title";
} }

View File

@ -0,0 +1,67 @@
package org.gcube.portlets.widgets.ckandatapublisherwidget.server;
import org.gcube.datacatalogue.ckanutillibrary.DataCatalogue;
import org.gcube.datacatalogue.ckanutillibrary.models.RolesCkanGroupOrOrg;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import eu.trentorise.opendata.jackan.model.CkanGroup;
/**
* Associate the dataset to a group.
* @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it)
*/
public class AssociationToGroupThread extends Thread {
private static final Logger logger = LoggerFactory.getLogger(AssociationToGroupThread.class);
private String groupTitle;
private String datasetId;
private String username;
private DataCatalogue catalogue;
/**
* @param groupTitle
* @param datasetId
* @param username
* @param catalogue
*/
public AssociationToGroupThread(String groupTitle, String datasetId,
String username, DataCatalogue catalogue) {
this.groupTitle = groupTitle;
this.datasetId = datasetId;
this.username = username;
this.catalogue = catalogue;
}
@Override
public void run() {
logger.info("Association thread started to put the dataset with id="+ datasetId + " into group with title " + groupTitle + " for user " + username);
// create the group
CkanGroup group = catalogue.createGroup(groupTitle, groupTitle, "");
if(group == null){
logger.warn("The group doesn't exist!!! Unable to perform such association");
}else{
logger.debug("Group exists, going to add the user " + username + " as its admin...");
boolean assigned = catalogue.checkRoleIntoGroup(username, groupTitle, RolesCkanGroupOrOrg.ADMIN);
if(assigned){
logger.debug("Admin role was assigned for this group, going to associate the product to the group");
boolean putIntoGroup = catalogue.assignDatasetToGroup(groupTitle, datasetId, catalogue.getApiKeyFromUsername(username));
logger.debug("Was product put into group? " + putIntoGroup);
}
}
}
}

View File

@ -15,8 +15,8 @@ import org.gcube.common.homelibrary.home.workspace.WorkspaceFolder;
import org.gcube.common.homelibrary.home.workspace.WorkspaceItem; import org.gcube.common.homelibrary.home.workspace.WorkspaceItem;
import org.gcube.common.homelibrary.home.workspace.catalogue.WorkspaceCatalogue; import org.gcube.common.homelibrary.home.workspace.catalogue.WorkspaceCatalogue;
import org.gcube.common.homelibrary.home.workspace.folder.FolderItem; import org.gcube.common.homelibrary.home.workspace.folder.FolderItem;
import org.gcube.datacatalogue.ckanutillibrary.CKanUtils; import org.gcube.datacatalogue.ckanutillibrary.DataCatalogue;
import org.gcube.datacatalogue.ckanutillibrary.CkanUtilsFactory; import org.gcube.datacatalogue.ckanutillibrary.DataCatalogueFactory;
import org.gcube.datacatalogue.ckanutillibrary.models.ResourceBean; import org.gcube.datacatalogue.ckanutillibrary.models.ResourceBean;
import org.gcube.datacatalogue.ckanutillibrary.utils.SessionCatalogueAttributes; import org.gcube.datacatalogue.ckanutillibrary.utils.SessionCatalogueAttributes;
import org.gcube.datacatalogue.ckanutillibrary.utils.UtilMethods; import org.gcube.datacatalogue.ckanutillibrary.utils.UtilMethods;
@ -57,13 +57,13 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C
* @param scope if it is null it is evaluated from the session * @param scope if it is null it is evaluated from the session
* @return * @return
*/ */
public CKanUtils getCkanUtilsObj(String scope){ public DataCatalogue getCatalogue(String scope){
CKanUtils instance = null; DataCatalogue instance = null;
try{ try{
String scopeInWhichDiscover = (scope != null && !scope.isEmpty()) ? scope : getASLSession().getScope(); String scopeInWhichDiscover = (scope != null && !scope.isEmpty()) ? scope : getASLSession().getScope();
logger.debug("Discovering ckan instance into scope " + scopeInWhichDiscover); logger.debug("Discovering ckan instance into scope " + scopeInWhichDiscover);
instance = CkanUtilsFactory.getFactory().getUtilsPerScope(scopeInWhichDiscover); instance = DataCatalogueFactory.getFactory().getUtilsPerScope(scopeInWhichDiscover);
}catch(Exception e){ }catch(Exception e){
logger.error("Unable to retrieve ckan utils", e); logger.error("Unable to retrieve ckan utils", e);
} }
@ -136,7 +136,7 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C
logger.debug("Found ckan token into session"); logger.debug("Found ckan token into session");
} }
else{ else{
token = getCkanUtilsObj(scopeInWhichDiscover).getApiKeyFromUsername(username); token = getCatalogue(scopeInWhichDiscover).getApiKeyFromUsername(username);
httpSession.setAttribute(keyPerScope, token); httpSession.setAttribute(keyPerScope, token);
logger.debug("Ckan token has been set for user " + username); logger.debug("Ckan token has been set for user " + username);
} }
@ -171,7 +171,7 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C
logger.info("List of organizations was into session " + orgsName); logger.info("List of organizations was into session " + orgsName);
} }
else{ else{
orgsName = Utils.getUserOrganizationsListAdmin(scope, username, getASLSession().getGroupName(), this); orgsName = Utils.getUserOrganizationsListAdminEditor(scope, username, getASLSession().getGroupName(), this);
httpSession.setAttribute(keyPerScope, orgsName); httpSession.setAttribute(keyPerScope, orgsName);
logger.info("Organizations name for user " + username + " has been saved into session " + orgsName); logger.info("Organizations name for user " + username + " has been saved into session " + orgsName);
} }
@ -200,8 +200,10 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C
* @return * @return
*/ */
private String findLicenseIdByLicense(String chosenLicense) { private String findLicenseIdByLicense(String chosenLicense) {
String scope = (String)getThreadLocalRequest().getSession().getAttribute(SessionCatalogueAttributes.SCOPE_CLIENT_PORTLET_URL); String scope = (String)getThreadLocalRequest().getSession().getAttribute(SessionCatalogueAttributes.SCOPE_CLIENT_PORTLET_URL);
return getCkanUtilsObj(scope).findLicenseIdByLicenseTitle(chosenLicense); return getCatalogue(scope).findLicenseIdByLicenseTitle(chosenLicense);
} }
@Override @Override
@ -225,7 +227,7 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C
logger.debug("List of licenses was into session"); logger.debug("List of licenses was into session");
} }
else{ else{
List<CkanLicense> titlesLicenses = getCkanUtilsObj(scope).getLicenses(); List<CkanLicense> titlesLicenses = getCatalogue(scope).getLicenses();
List<String> titles = new ArrayList<String>(); List<String> titles = new ArrayList<String>();
List<String> urls = new ArrayList<String>(); List<String> urls = new ArrayList<String>();
for (CkanLicense license : titlesLicenses) { for (CkanLicense license : titlesLicenses) {
@ -402,7 +404,7 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C
copiedFolder.setDescription(bean.getDescription()); copiedFolder.setDescription(bean.getDescription());
// change name of the copied folder to match the title // change name of the copied folder to match the title
((WorkspaceFolder)copiedFolder).rename(org.gcube.datacatalogue.ckanutillibrary.utils.UtilMethods.nameFromTitle(bean.getTitle())); ((WorkspaceFolder)copiedFolder).rename(org.gcube.datacatalogue.ckanutillibrary.utils.UtilMethods.fromProductTitleToName(bean.getTitle()));
List<ResourceBean> resources = new ArrayList<ResourceBean>(); List<ResourceBean> resources = new ArrayList<ResourceBean>();
@ -477,7 +479,7 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C
logger.debug("The user wants to publish in organization with name " + organizationNameOrId); logger.debug("The user wants to publish in organization with name " + organizationNameOrId);
String scope = Utils.retrieveScopeFromOrganizationName(organizationNameOrId); String scope = Utils.retrieveScopeFromOrganizationName(organizationNameOrId);
CKanUtils utils = getCkanUtilsObj(scope); DataCatalogue utils = getCatalogue(scope);
String datasetId = utils.createCKanDataset(getUserCKanTokenFromSession(scope), title, organizationNameOrId, author, String datasetId = utils.createCKanDataset(getUserCKanTokenFromSession(scope), title, organizationNameOrId, author,
authorMail, maintainer, maintainerMail, version, description, licenseId, authorMail, maintainer, maintainerMail, version, description, licenseId,
@ -491,6 +493,15 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C
// retrieve the url // retrieve the url
String datasetUrl = utils.getPortletUrl() + "?path=" + utils.getUrlFromDatasetIdOrName(getUserCKanTokenFromSession(scope), datasetId, true); String datasetUrl = utils.getPortletUrl() + "?path=" + utils.getUrlFromDatasetIdOrName(getUserCKanTokenFromSession(scope), datasetId, true);
toCreate.setSource(datasetUrl); toCreate.setSource(datasetUrl);
// start a thread that will associate this dataset with the group
if(toCreate.getChosenProfile() != null){
AssociationToGroupThread thread = new AssociationToGroupThread(toCreate.getChosenProfile(), datasetId, userName, utils);
thread.start();
}
return toCreate; return toCreate;
}else{ }else{
@ -542,7 +553,7 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C
// get the scope in which we should discover the ckan instance given the organization name in which the dataset was created // get the scope in which we should discover the ckan instance given the organization name in which the dataset was created
String scope = Utils.retrieveScopeFromOrganizationName(resource.getOrganizationNameDatasetParent()); String scope = Utils.retrieveScopeFromOrganizationName(resource.getOrganizationNameDatasetParent());
String resourceId = getCkanUtilsObj(scope).addResourceToDataset(resourceBean, getUserCKanTokenFromSession(scope)); String resourceId = getCatalogue(scope).addResourceToDataset(resourceBean, getUserCKanTokenFromSession(scope));
if(resourceId != null){ if(resourceId != null){
logger.debug("Resource " + resource.getName() + " is now available"); logger.debug("Resource " + resource.getName() + " is now available");
@ -580,7 +591,7 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C
try{ try{
// get the scope in which we should discover the ckan instance given the organization name in which the dataset was created // get the scope in which we should discover the ckan instance given the organization name in which the dataset was created
String scope = Utils.retrieveScopeFromOrganizationName(resource.getOrganizationNameDatasetParent()); String scope = Utils.retrieveScopeFromOrganizationName(resource.getOrganizationNameDatasetParent());
deleted = getCkanUtilsObj(scope). deleted = getCatalogue(scope).
deleteResourceFromDataset(resource.getId(), getUserCKanTokenFromSession(scope)); deleteResourceFromDataset(resource.getId(), getUserCKanTokenFromSession(scope));
if(deleted){ if(deleted){
logger.debug("Resource described by " + resource + " deleted"); logger.debug("Resource described by " + resource + " deleted");
@ -620,8 +631,8 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C
try{ try{
String scope = (String)getThreadLocalRequest().getSession().getAttribute(SessionCatalogueAttributes.SCOPE_CLIENT_PORTLET_URL); String scope = (String)getThreadLocalRequest().getSession().getAttribute(SessionCatalogueAttributes.SCOPE_CLIENT_PORTLET_URL);
String idFromTitle = org.gcube.datacatalogue.ckanutillibrary.utils.UtilMethods.nameFromTitle(title); String idFromTitle = org.gcube.datacatalogue.ckanutillibrary.utils.UtilMethods.fromProductTitleToName(title);
return getCkanUtilsObj(scope).existProductWithNameOrId(idFromTitle, getUserCKanTokenFromSession(scope)); return getCatalogue(scope).existProductWithNameOrId(idFromTitle);
}catch(Exception e){ }catch(Exception e){
logger.error("Unable to check if such a dataset id already exists", e); logger.error("Unable to check if such a dataset id already exists", e);

View File

@ -14,8 +14,8 @@ import org.gcube.common.homelibrary.home.workspace.WorkspaceItem;
import org.gcube.common.homelibrary.home.workspace.folder.FolderItem; import org.gcube.common.homelibrary.home.workspace.folder.FolderItem;
import org.gcube.common.homelibrary.home.workspace.folder.items.GCubeItem; import org.gcube.common.homelibrary.home.workspace.folder.items.GCubeItem;
import org.gcube.common.scope.api.ScopeProvider; import org.gcube.common.scope.api.ScopeProvider;
import org.gcube.datacatalogue.ckanutillibrary.CKanUtils; import org.gcube.datacatalogue.ckanutillibrary.DataCatalogue;
import org.gcube.datacatalogue.ckanutillibrary.models.RolesIntoOrganization; import org.gcube.datacatalogue.ckanutillibrary.models.RolesCkanGroupOrOrg;
import org.gcube.datacatalogue.ckanutillibrary.utils.SessionCatalogueAttributes; import org.gcube.datacatalogue.ckanutillibrary.utils.SessionCatalogueAttributes;
import org.gcube.datacatalogue.ckanutillibrary.utils.UtilMethods; import org.gcube.datacatalogue.ckanutillibrary.utils.UtilMethods;
import org.gcube.datacatalogue.metadatadiscovery.DataCalogueMetadataFormatReader; import org.gcube.datacatalogue.metadatadiscovery.DataCalogueMetadataFormatReader;
@ -119,13 +119,13 @@ public class Utils {
} }
/** /**
* Retrieve the list of organizations in which the user has the ckan-admin role * Retrieve the list of organizations in which the user has the admin/editor role
* @param currentScope the current scope * @param currentScope the current scope
* @param username the current username * @param username the current username
* @param groupName the current groupName * @param groupName the current groupName
* @param ckanPublisherServicesImpl * @param ckanPublisherServicesImpl
*/ */
public static List<OrganizationBean> getUserOrganizationsListAdmin(String currentScope, String username, String groupName, CKANPublisherServicesImpl ckanPublisherServicesImpl){ public static List<OrganizationBean> getUserOrganizationsListAdminEditor(String currentScope, String username, String groupName, CKANPublisherServicesImpl ckanPublisherServicesImpl){
List<OrganizationBean> toReturn = new ArrayList<OrganizationBean>(); List<OrganizationBean> toReturn = new ArrayList<OrganizationBean>();
@ -160,7 +160,7 @@ public class Utils {
List<GCubeRole> roles = roleManager.listRolesByUserAndGroup(userid, groupManager.getGroupId(gCubeGroupName)); List<GCubeRole> roles = roleManager.listRolesByUserAndGroup(userid, groupManager.getGroupId(gCubeGroupName));
// get highest role according liferay // get highest role according liferay
RolesIntoOrganization correspondentRoleToCheck = getLiferayHighestRoleInOrg(roles); RolesCkanGroupOrOrg correspondentRoleToCheck = getLiferayHighestRoleInOrg(roles);
checkIfRoleIsSetInCkanInstance(username, gCubeGroupName, gCubeGroup.getGroupId(), correspondentRoleToCheck, toReturn, groupManager, ckanPublisherServicesImpl); checkIfRoleIsSetInCkanInstance(username, gCubeGroupName, gCubeGroup.getGroupId(), correspondentRoleToCheck, toReturn, groupManager, ckanPublisherServicesImpl);
} }
@ -177,7 +177,7 @@ public class Utils {
List<GCubeRole> roles = roleManager.listRolesByUserAndGroup(userid, groupManager.getGroupId(gCubeGroupName)); List<GCubeRole> roles = roleManager.listRolesByUserAndGroup(userid, groupManager.getGroupId(gCubeGroupName));
// get highest role according liferay // get highest role according liferay
RolesIntoOrganization correspondentRoleToCheck = getLiferayHighestRoleInOrg(roles); RolesCkanGroupOrOrg correspondentRoleToCheck = getLiferayHighestRoleInOrg(roles);
checkIfRoleIsSetInCkanInstance(username, gCubeGroupName, gCubeGroup.getGroupId(), correspondentRoleToCheck, toReturn, groupManager, ckanPublisherServicesImpl); checkIfRoleIsSetInCkanInstance(username, gCubeGroupName, gCubeGroup.getGroupId(), correspondentRoleToCheck, toReturn, groupManager, ckanPublisherServicesImpl);
} }
@ -188,7 +188,7 @@ public class Utils {
logger.debug("The list of roles for " + username + " into " + groupName + " is " + roles); logger.debug("The list of roles for " + username + " into " + groupName + " is " + roles);
// get highest role according liferay // get highest role according liferay
RolesIntoOrganization correspondentRoleToCheck = getLiferayHighestRoleInOrg(roles); RolesCkanGroupOrOrg correspondentRoleToCheck = getLiferayHighestRoleInOrg(roles);
checkIfRoleIsSetInCkanInstance(username, groupName, currentGroupId, correspondentRoleToCheck, toReturn, groupManager, ckanPublisherServicesImpl); checkIfRoleIsSetInCkanInstance(username, groupName, currentGroupId, correspondentRoleToCheck, toReturn, groupManager, ckanPublisherServicesImpl);
} }
@ -214,18 +214,18 @@ public class Utils {
*/ */
private static void checkIfRoleIsSetInCkanInstance(String username, private static void checkIfRoleIsSetInCkanInstance(String username,
String gCubeGroupName, long groupId, String gCubeGroupName, long groupId,
RolesIntoOrganization correspondentRoleToCheck, RolesCkanGroupOrOrg correspondentRoleToCheck,
List<OrganizationBean> orgs, GroupManager groupManager, CKANPublisherServicesImpl ckanPublisherServicesImpl) throws UserManagementSystemException, GroupRetrievalFault { List<OrganizationBean> orgs, GroupManager groupManager, CKANPublisherServicesImpl ckanPublisherServicesImpl) throws UserManagementSystemException, GroupRetrievalFault {
// with this invocation, we check if the role is present in ckan and if it is not it will be added // with this invocation, we check if the role is present in ckan and if it is not it will be added
CKanUtils ckanUtils = ckanPublisherServicesImpl.getCkanUtilsObj(groupManager.getInfrastructureScope(groupId)); DataCatalogue catalogue = ckanPublisherServicesImpl.getCatalogue(groupManager.getInfrastructureScope(groupId));
// if there is an instance of ckan in this scope.. // if there is an instance of ckan in this scope..
if(ckanUtils != null){ if(catalogue != null){
boolean res = ckanUtils.checkRole(username, gCubeGroupName, correspondentRoleToCheck); boolean res = catalogue.checkRoleIntoOrganization(username, gCubeGroupName, correspondentRoleToCheck);
if(res && !correspondentRoleToCheck.equals(RolesIntoOrganization.MEMBER)){ if(res && !correspondentRoleToCheck.equals(RolesCkanGroupOrOrg.MEMBER)){
// get the orgs of the user and retrieve its title and name // get the orgs of the user and retrieve its title and name
List<CkanOrganization> ckanOrgs = ckanUtils.getOrganizationsByUser(username); List<CkanOrganization> ckanOrgs = catalogue.getOrganizationsByUser(username);
for (CkanOrganization ckanOrganization : ckanOrgs) { for (CkanOrganization ckanOrganization : ckanOrgs) {
if(ckanOrganization.getName().equals(gCubeGroupName.toLowerCase())){ if(ckanOrganization.getName().equals(gCubeGroupName.toLowerCase())){
orgs.add(new OrganizationBean(ckanOrganization.getTitle(), ckanOrganization.getName())); orgs.add(new OrganizationBean(ckanOrganization.getTitle(), ckanOrganization.getName()));
@ -242,18 +242,18 @@ public class Utils {
* @param roles * @param roles
* @return * @return
*/ */
private static RolesIntoOrganization getLiferayHighestRoleInOrg( private static RolesCkanGroupOrOrg getLiferayHighestRoleInOrg(
List<GCubeRole> roles) { List<GCubeRole> roles) {
// NOTE: it is supposed that there is just one role for this person correspondent to the one in the catalog // NOTE: it is supposed that there is just one role for this person correspondent to the one in the catalog
for (GCubeRole gCubeRole : roles) { for (GCubeRole gCubeRole : roles) {
if(gCubeRole.getRoleName().equalsIgnoreCase(GatewayRolesNames.CATALOGUE_ADMIN.getRoleName())){ if(gCubeRole.getRoleName().equalsIgnoreCase(GatewayRolesNames.CATALOGUE_ADMIN.getRoleName())){
return RolesIntoOrganization.ADMIN; return RolesCkanGroupOrOrg.ADMIN;
} }
if(gCubeRole.getRoleName().equalsIgnoreCase(GatewayRolesNames.CATALOGUE_EDITOR.getRoleName())){ if(gCubeRole.getRoleName().equalsIgnoreCase(GatewayRolesNames.CATALOGUE_EDITOR.getRoleName())){
return RolesIntoOrganization.EDITOR; return RolesCkanGroupOrOrg.EDITOR;
} }
} }
return RolesIntoOrganization.MEMBER; return RolesCkanGroupOrOrg.MEMBER;
} }
/** /**

View File

@ -8,7 +8,7 @@ import java.util.Map;
* This bean will contain during ckan metadata creation the following information * This bean will contain during ckan metadata creation the following information
* (related to the workspace folder that represents a dataset) * (related to the workspace folder that represents a dataset)
* <ul> * <ul>
* <li> id -> the id of the workspace folder * <li> id -> the id that will be assigned by ckan
* <li> Title -> folder's name * <li> Title -> folder's name
* <li> Description -> folders' description * <li> Description -> folders' description
* <li> tags -> folder's custom fields keys' names * <li> tags -> folder's custom fields keys' names
@ -20,9 +20,9 @@ import java.util.Map;
* <li> organizationsList -> list of organizations to which the user belong (and in which * <li> organizationsList -> list of organizations to which the user belong (and in which
* he wants to publish) * he wants to publish)
* <li> list of metadata, that is custom fields per vre * <li> list of metadata, that is custom fields per vre
* <li> the name of the chosen profile used
* </ul> * </ul>
* @author Costantino Perciante at ISTI-CNR * @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it)
* (costantino.perciante@isti.cnr.it)
*/ */
@SuppressWarnings("serial") @SuppressWarnings("serial")
public class DatasetMetadataBean implements Serializable { public class DatasetMetadataBean implements Serializable {
@ -47,6 +47,7 @@ public class DatasetMetadataBean implements Serializable {
private String selectedOrganization; private String selectedOrganization;
private List<ResourceBeanWrapper> resources; // in case of workspace, this is the list of children private List<ResourceBeanWrapper> resources; // in case of workspace, this is the list of children
private List<MetaDataProfileBean> metadataList; private List<MetaDataProfileBean> metadataList;
private String chosenProfile; // the name of the MetaDataProfile chosen
public DatasetMetadataBean(){ public DatasetMetadataBean(){
super(); super();
@ -262,7 +263,14 @@ public class DatasetMetadataBean implements Serializable {
public void setAuthorFullName(String authorFullName) { public void setAuthorFullName(String authorFullName) {
this.authorFullName = authorFullName; this.authorFullName = authorFullName;
} }
public String getChosenProfile() {
return chosenProfile;
}
public void setChosenProfile(String chosenProfile) {
this.chosenProfile = chosenProfile;
}
@Override @Override
public String toString() { public String toString() {
return "DatasetMetadataBean [id=" + id + ", title=" + title return "DatasetMetadataBean [id=" + id + ", title=" + title
@ -277,6 +285,7 @@ public class DatasetMetadataBean implements Serializable {
+ ", organizationList=" + organizationList + ", organizationList=" + organizationList
+ ", selectedOrganization=" + selectedOrganization + ", selectedOrganization=" + selectedOrganization
+ ", resources=" + resources + ", metadataList=" + metadataList + ", resources=" + resources + ", metadataList=" + metadataList
+ "]"; + ", chosenProfile=" + chosenProfile + "]";
} }
} }

View File

@ -1,5 +1,6 @@
package org.gcube.portlets.widgets.ckandatapublisherwidget.client; package org.gcube.portlets.widgets.ckandatapublisherwidget.client;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.gcube.common.homelibrary.home.HomeLibrary; import org.gcube.common.homelibrary.home.HomeLibrary;
@ -13,12 +14,22 @@ 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.ItemNotFoundException;
import org.gcube.common.homelibrary.home.workspace.exceptions.WorkspaceFolderNotFoundException; import org.gcube.common.homelibrary.home.workspace.exceptions.WorkspaceFolderNotFoundException;
import org.gcube.common.scope.api.ScopeProvider; import org.gcube.common.scope.api.ScopeProvider;
import org.gcube.datacatalogue.metadatadiscovery.DataCalogueMetadataFormatReader;
import org.gcube.datacatalogue.metadatadiscovery.bean.MetadataType;
import org.gcube.datacatalogue.metadatadiscovery.bean.jaxb.MetadataField;
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.server.CKANPublisherServicesImpl;
import org.gcube.portlets.widgets.ckandatapublisherwidget.shared.DataType;
import org.gcube.portlets.widgets.ckandatapublisherwidget.shared.MetaDataTypeWrapper;
import org.gcube.portlets.widgets.ckandatapublisherwidget.shared.MetadataFieldWrapper;
import org.junit.Test;
public class TestClass { public class TestClass {
//@Test @Test
public void testUser() { public void testUser() {
assert(new CKANPublisherServicesImpl().getDevelopmentUser().equals(CKANPublisherServicesImpl.TEST_USER)); assert(new CKANPublisherServicesImpl().getDevelopmentUser().equals(CKANPublisherServicesImpl.TEST_USER));
@ -26,6 +37,7 @@ public class TestClass {
} }
//@Test //@Test
@SuppressWarnings("deprecation")
public void testCopyResources() throws WorkspaceFolderNotFoundException, InternalErrorException, HomeNotFoundException, UserNotFoundException, ItemNotFoundException{ public void testCopyResources() throws WorkspaceFolderNotFoundException, InternalErrorException, HomeNotFoundException, UserNotFoundException, ItemNotFoundException{
ScopeProvider.instance.set("/gcube/devNext/NextNext"); ScopeProvider.instance.set("/gcube/devNext/NextNext");
@ -90,4 +102,65 @@ public class TestClass {
System.out.println("Notification_portlet".replaceAll("[^A-Za-z0-9.-_]", " ")); System.out.println("Notification_portlet".replaceAll("[^A-Za-z0-9.-_]", " "));
} }
//@Test
public void retrieveMetadata(){
try {
ScopeProvider.instance.set("/gcube/devNext/NextNext");
DataCalogueMetadataFormatReader reader = new DataCalogueMetadataFormatReader();
for (MetadataType mt : reader.getListOfMetadataTypes()) {
System.out.println("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + mt.getName());
MetadataFormat metadata = reader.getMetadataFormatForMetadataType(mt);
// we need to wrap the list of metadata
List<MetadataFieldWrapper> wrapperList = new ArrayList<MetadataFieldWrapper>();
List<MetadataField> toWrap = metadata.getMetadataFields();
for(MetadataField metadataField: toWrap){
MetadataFieldWrapper wrapperObj = new MetadataFieldWrapper();
wrapperObj.setDefaultValue(metadataField.getDefaultValue());
wrapperObj.setFieldName(metadataField.getFieldName());
wrapperObj.setType(DataType.valueOf(metadataField.getDataType().toString()));
wrapperObj.setMandatory(metadataField.getMandatory());
wrapperObj.setNote(metadataField.getNote());
MetadataValidator validator = metadataField.getValidator();
if(validator != null)
wrapperObj.setValidator(validator.getRegularExpression());
MetadataVocabulary vocabulary = metadataField.getVocabulary();
if(vocabulary != null){
wrapperObj.setVocabulary(vocabulary.getVocabularyFields());
wrapperObj.setMultiSelection(vocabulary.isMultiSelection());
}
// add to the list
wrapperList.add(wrapperObj);
}
// wrap the mt as well
MetaDataTypeWrapper typeWrapper = new MetaDataTypeWrapper();
typeWrapper.setDescription(mt.getDescription());
typeWrapper.setId(mt.getId());
typeWrapper.setName(mt.getName());
}
System.out.println("List of profiles has been saved into session");
} catch (Exception e) {
System.out.println("Error while retrieving metadata beans " + e);
}
}
} }