2016-05-26 18:12:53 +02:00
|
|
|
package org.gcube.portlets.widgets.ckandatapublisherwidget.server;
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
2016-06-06 17:24:52 +02:00
|
|
|
import java.util.Calendar;
|
2016-05-27 19:08:03 +02:00
|
|
|
import java.util.HashMap;
|
2016-06-17 22:43:57 +02:00
|
|
|
import java.util.Iterator;
|
2016-05-26 18:12:53 +02:00
|
|
|
import java.util.List;
|
2016-05-27 19:08:03 +02:00
|
|
|
import java.util.Map;
|
2016-06-17 22:43:57 +02:00
|
|
|
import java.util.Map.Entry;
|
2016-06-08 18:31:54 +02:00
|
|
|
|
2016-06-16 18:09:54 +02:00
|
|
|
import org.gcube.application.framework.core.session.ASLSession;
|
|
|
|
import org.gcube.application.framework.core.session.SessionManager;
|
2016-05-27 19:08:03 +02:00
|
|
|
import org.gcube.common.homelibrary.home.HomeLibrary;
|
|
|
|
import org.gcube.common.homelibrary.home.exceptions.InternalErrorException;
|
|
|
|
import org.gcube.common.homelibrary.home.workspace.Workspace;
|
|
|
|
import org.gcube.common.homelibrary.home.workspace.WorkspaceItem;
|
2016-06-06 17:24:52 +02:00
|
|
|
import org.gcube.common.homelibrary.home.workspace.folder.FolderItem;
|
2016-05-27 19:08:03 +02:00
|
|
|
import org.gcube.common.homelibrary.home.workspace.folder.items.GCubeItem;
|
2016-06-14 12:35:10 +02:00
|
|
|
import org.gcube.datacatalogue.ckanutillibrary.CKanUtilsImpl;
|
|
|
|
import org.gcube.datacatalogue.ckanutillibrary.models.ResourceBean;
|
2016-06-17 22:43:57 +02:00
|
|
|
import org.gcube.datacatalogue.ckanutillibrary.models.RolesIntoOrganization;
|
2016-06-09 18:58:19 +02:00
|
|
|
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;
|
2016-06-16 18:09:54 +02:00
|
|
|
import org.gcube.portal.custom.scopemanager.scopehelper.ScopeHelper;
|
2016-05-26 18:12:53 +02:00
|
|
|
import org.gcube.portlets.widgets.ckandatapublisherwidget.client.CKanPublisherService;
|
2016-05-27 19:08:03 +02:00
|
|
|
import org.gcube.portlets.widgets.ckandatapublisherwidget.shared.DatasetMetadataBean;
|
2016-05-26 18:12:53 +02:00
|
|
|
import org.gcube.portlets.widgets.ckandatapublisherwidget.shared.LicensesBean;
|
2016-06-09 18:58:19 +02:00
|
|
|
import org.gcube.portlets.widgets.ckandatapublisherwidget.shared.MetaDataProfileBean;
|
|
|
|
import org.gcube.portlets.widgets.ckandatapublisherwidget.shared.MetaDataTypeWrapper;
|
|
|
|
import org.gcube.portlets.widgets.ckandatapublisherwidget.shared.MetadataFieldWrapper;
|
2016-06-14 12:35:10 +02:00
|
|
|
import org.gcube.portlets.widgets.ckandatapublisherwidget.shared.ResourceBeanWrapper;
|
2016-05-27 19:08:03 +02:00
|
|
|
import org.gcube.vomanagement.usermanagement.UserManager;
|
2016-06-21 14:36:49 +02:00
|
|
|
import org.gcube.vomanagement.usermanagement.impl.LiferayUserManager;
|
|
|
|
import org.gcube.vomanagement.usermanagement.model.GCubeUser;
|
2016-05-26 18:12:53 +02:00
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
|
|
|
|
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
|
|
|
|
import com.liferay.portal.service.UserLocalServiceUtil;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Server side of the data publisher.
|
|
|
|
* @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it)
|
|
|
|
*/
|
|
|
|
@SuppressWarnings("serial")
|
|
|
|
public class CKANPublisherServicesImpl extends RemoteServiceServlet implements CKanPublisherService{
|
|
|
|
|
|
|
|
// Logger
|
2016-06-06 17:24:52 +02:00
|
|
|
private static final org.slf4j.Logger logger = LoggerFactory.getLogger(CKANPublisherServicesImpl.class);
|
2016-06-18 10:13:37 +02:00
|
|
|
|
2016-06-16 18:09:54 +02:00
|
|
|
public static final String TEST_SCOPE = "/gcube/devsec/devVRE";
|
|
|
|
|
|
|
|
public static final String CKAN_TOKEN_KEY = "ckanToken";
|
2016-06-28 11:52:04 +02:00
|
|
|
public static final String CKAN_LICENSES_KEY = "ckanLicenses";
|
|
|
|
private static final String CKAN_ORGANIZATIONS_KEY = "ckanOrganizations";
|
|
|
|
private static final String CKAN_PROFILES_KEY = "ckanProfiles";
|
2016-06-18 10:13:37 +02:00
|
|
|
|
2016-06-27 11:55:06 +02:00
|
|
|
private Object LOCK = new Object();
|
|
|
|
|
2016-06-16 18:09:54 +02:00
|
|
|
// library util instance
|
|
|
|
private CKanUtilsImpl instance;
|
2016-06-27 11:55:06 +02:00
|
|
|
|
2016-06-27 11:12:15 +02:00
|
|
|
/**
|
|
|
|
* Since it needs the scope, we need to check if it is null or not
|
|
|
|
* @return
|
|
|
|
*/
|
|
|
|
private CKanUtilsImpl getCkanUtilsObj(){
|
2016-06-18 10:13:37 +02:00
|
|
|
|
2016-06-27 11:12:15 +02:00
|
|
|
if(instance == null){
|
2016-06-27 11:55:06 +02:00
|
|
|
synchronized(LOCK){
|
|
|
|
if(instance == null){
|
|
|
|
// retrieve ckan information
|
|
|
|
try{
|
2016-06-27 12:14:05 +02:00
|
|
|
String currentScope = getASLSession().getScope();
|
2016-06-27 12:36:45 +02:00
|
|
|
logger.debug("Scope from asl is " + currentScope);
|
2016-06-27 11:55:06 +02:00
|
|
|
instance = new CKanUtilsImpl(currentScope);
|
|
|
|
}catch(Exception e){
|
|
|
|
logger.error("Unable to retrieve ckan information", e);
|
|
|
|
}
|
|
|
|
}
|
2016-06-27 11:12:15 +02:00
|
|
|
}
|
2016-06-16 18:09:54 +02:00
|
|
|
}
|
2016-06-27 11:12:15 +02:00
|
|
|
|
|
|
|
return instance;
|
2016-06-16 18:09:54 +02:00
|
|
|
}
|
2016-05-26 18:12:53 +02:00
|
|
|
|
|
|
|
/**
|
2016-06-16 18:09:54 +02:00
|
|
|
* the current ASLSession
|
|
|
|
* @return the session
|
2016-05-26 18:12:53 +02:00
|
|
|
*/
|
2016-06-16 18:09:54 +02:00
|
|
|
private ASLSession getASLSession() {
|
|
|
|
String sessionID = this.getThreadLocalRequest().getSession().getId();
|
|
|
|
String user = (String) this.getThreadLocalRequest().getSession().getAttribute(ScopeHelper.USERNAME_ATTRIBUTE);
|
|
|
|
|
|
|
|
if (user == null) {
|
|
|
|
logger.warn("USER IS NULL setting testing user and Running OUTSIDE PORTAL");
|
|
|
|
user = getDevelopmentUser();
|
|
|
|
SessionManager.getInstance().getASLSession(sessionID, user).setScope(TEST_SCOPE);
|
|
|
|
}
|
|
|
|
return SessionManager.getInstance().getASLSession(sessionID, user);
|
|
|
|
}
|
2016-06-06 17:24:52 +02:00
|
|
|
|
2016-06-16 18:09:54 +02:00
|
|
|
/**
|
|
|
|
* when packaging test will fail if the user is not set to test.user
|
|
|
|
* @return .
|
|
|
|
*/
|
|
|
|
public String getDevelopmentUser() {
|
|
|
|
String user = "test.user";
|
|
|
|
// user = "costantino.perciante";
|
|
|
|
return user;
|
|
|
|
}
|
2016-06-06 17:24:52 +02:00
|
|
|
|
2016-06-16 18:09:54 +02:00
|
|
|
/**
|
|
|
|
* Get current user's token
|
|
|
|
* @return String the ckan user's token
|
|
|
|
*/
|
|
|
|
private String getUserCKanTokenFromSession(){
|
|
|
|
|
|
|
|
ASLSession session = getASLSession();
|
|
|
|
String username = session.getUsername();
|
|
|
|
logger.debug("User in session is " + username);
|
2016-06-18 10:13:37 +02:00
|
|
|
|
2016-06-16 18:09:54 +02:00
|
|
|
String token = null;
|
2016-06-17 22:43:57 +02:00
|
|
|
if(this.getThreadLocalRequest().getSession().getAttribute(CKAN_TOKEN_KEY) != null)
|
2016-06-16 18:09:54 +02:00
|
|
|
token = (String)this.getThreadLocalRequest().getSession().getAttribute(CKAN_TOKEN_KEY);
|
|
|
|
else{
|
2016-06-18 10:13:37 +02:00
|
|
|
|
2016-06-27 11:12:15 +02:00
|
|
|
token = getCkanUtilsObj().getApiKeyFromUsername(username);
|
2016-06-16 18:09:54 +02:00
|
|
|
this.getThreadLocalRequest().getSession().setAttribute(CKAN_TOKEN_KEY, token);
|
|
|
|
logger.debug("Ckan token has been set for user " + username);
|
2016-06-06 17:24:52 +02:00
|
|
|
}
|
2016-06-18 10:13:37 +02:00
|
|
|
|
2016-06-20 12:15:48 +02:00
|
|
|
logger.debug("Found ckan token " + token.substring(0, 3) + "****************" + " for user " + username);
|
2016-06-16 18:09:54 +02:00
|
|
|
return token;
|
2016-05-26 18:12:53 +02:00
|
|
|
|
2016-06-16 18:09:54 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2016-06-17 22:43:57 +02:00
|
|
|
* Retrieve the list of organizations in which the user can publish (roles ADMIN, EDITOR)
|
2016-06-18 10:13:37 +02:00
|
|
|
* If he is a SYSADMIN, he can publish everywhere
|
2016-06-16 18:09:54 +02:00
|
|
|
* @param username
|
|
|
|
* @return the list of organizations
|
|
|
|
*/
|
|
|
|
private List<String> getUserOrganizationsList(String username) {
|
2016-06-17 22:43:57 +02:00
|
|
|
|
2016-06-16 18:09:54 +02:00
|
|
|
logger.debug("Request for user " + username + " organizations list");
|
2016-06-17 22:43:57 +02:00
|
|
|
List<String> orgsName = new ArrayList<String>();
|
2016-06-28 11:52:04 +02:00
|
|
|
ASLSession session = getASLSession();
|
2016-06-18 10:13:37 +02:00
|
|
|
|
2016-06-28 11:52:04 +02:00
|
|
|
if(session.getAttribute(CKAN_ORGANIZATIONS_KEY) != null){
|
|
|
|
orgsName = (List<String>)session.getAttribute(CKAN_ORGANIZATIONS_KEY);
|
|
|
|
logger.debug("List of organizations was into session");
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
if(getCkanUtilsObj().isSysAdmin(username, getUserCKanTokenFromSession())){
|
2016-06-18 10:13:37 +02:00
|
|
|
|
2016-06-28 11:52:04 +02:00
|
|
|
logger.debug("The user " + username + " is a sysadmin. He can publish everywhere");
|
|
|
|
orgsName = getCkanUtilsObj().getOrganizationsNames(); // get all organizations' names
|
2016-06-18 10:13:37 +02:00
|
|
|
|
2016-06-28 11:52:04 +02:00
|
|
|
}else{
|
2016-06-18 10:13:37 +02:00
|
|
|
|
2016-06-28 11:52:04 +02:00
|
|
|
// We need to retrieve orgs in which the user has the roles ADMIN or EDITOR
|
|
|
|
List<RolesIntoOrganization> rolesToMatch = new ArrayList<RolesIntoOrganization>();
|
|
|
|
rolesToMatch.add(RolesIntoOrganization.EDITOR);
|
|
|
|
rolesToMatch.add(RolesIntoOrganization.ADMIN);
|
2016-06-18 10:13:37 +02:00
|
|
|
|
2016-06-28 11:52:04 +02:00
|
|
|
Map<String, List<RolesIntoOrganization>> orgsAndRoles = getCkanUtilsObj().getGroupsAndRolesByUser(username, rolesToMatch);
|
|
|
|
logger.debug("Result is " + orgsAndRoles);
|
|
|
|
Iterator<Entry<String, List<RolesIntoOrganization>>> iterator = orgsAndRoles.entrySet().iterator();
|
2016-06-18 10:13:37 +02:00
|
|
|
|
2016-06-28 11:52:04 +02:00
|
|
|
// get the names
|
|
|
|
while (iterator.hasNext()) {
|
|
|
|
Map.Entry<String, java.util.List<RolesIntoOrganization>> entry = (Map.Entry<String, java.util.List<RolesIntoOrganization>>) iterator
|
|
|
|
.next();
|
|
|
|
orgsName.add(entry.getKey());
|
|
|
|
logger.debug("The user has a role ADMIN/EDITOR into org " + entry.getKey());
|
|
|
|
}
|
2016-06-18 10:13:37 +02:00
|
|
|
}
|
2016-06-28 11:52:04 +02:00
|
|
|
session.setAttribute(CKAN_ORGANIZATIONS_KEY, orgsName);
|
|
|
|
logger.debug("Organizations name for user " + username + " has been saved into session");
|
2016-06-17 22:43:57 +02:00
|
|
|
}
|
2016-06-28 11:52:04 +02:00
|
|
|
|
2016-06-17 22:43:57 +02:00
|
|
|
return orgsName;
|
2016-05-26 18:12:53 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Online or in development mode?
|
|
|
|
* @return true if you're running into the portal, false if in development
|
|
|
|
*/
|
|
|
|
private boolean isWithinPortal() {
|
|
|
|
try {
|
|
|
|
UserLocalServiceUtil.getService();
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
catch (com.liferay.portal.kernel.bean.BeanLocatorException ex) {
|
|
|
|
logger.trace("Development Mode ON");
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-06-06 17:24:52 +02:00
|
|
|
/**
|
|
|
|
* Find a license id given the license text.
|
|
|
|
* @param chosenLicense
|
|
|
|
* @return
|
|
|
|
*/
|
2016-06-28 11:52:04 +02:00
|
|
|
private String findLicenseIdByLicense(String chosenLicense) {
|
2016-06-27 11:12:15 +02:00
|
|
|
return getCkanUtilsObj().findLicenseIdByLicense(chosenLicense);
|
2016-06-06 17:24:52 +02:00
|
|
|
}
|
2016-06-09 18:58:19 +02:00
|
|
|
|
2016-06-08 18:31:54 +02:00
|
|
|
/**
|
|
|
|
* Retrieve the list of metadata beans
|
|
|
|
* @return
|
|
|
|
*/
|
2016-06-10 18:06:31 +02:00
|
|
|
private List<MetaDataProfileBean> getMetadataProfilesList() {
|
2016-06-09 18:58:19 +02:00
|
|
|
|
|
|
|
List<MetaDataProfileBean> beans = new ArrayList<MetaDataProfileBean>();
|
|
|
|
|
2016-06-28 11:52:04 +02:00
|
|
|
ASLSession session = getASLSession();
|
|
|
|
String username = session.getUsername();
|
|
|
|
logger.debug("User in session is " + username);
|
2016-06-09 18:58:19 +02:00
|
|
|
|
2016-06-28 11:52:04 +02:00
|
|
|
if(session.getAttribute(CKAN_PROFILES_KEY) != null){
|
|
|
|
beans = (List<MetaDataProfileBean>)session.getAttribute(CKAN_PROFILES_KEY);
|
|
|
|
logger.debug("List of profiles was into session");
|
|
|
|
}
|
|
|
|
else{
|
2016-06-09 18:58:19 +02:00
|
|
|
|
2016-06-28 11:52:04 +02:00
|
|
|
try {
|
2016-06-09 18:58:19 +02:00
|
|
|
|
2016-06-28 11:52:04 +02:00
|
|
|
DataCalogueMetadataFormatReader reader = new DataCalogueMetadataFormatReader();
|
2016-06-09 18:58:19 +02:00
|
|
|
|
2016-06-28 11:52:04 +02:00
|
|
|
for (MetadataType mt : reader.getListOfMetadataTypes()) {
|
|
|
|
MetadataFormat metadata = reader.getMetadataFormatForMetadataType(mt);
|
2016-06-09 18:58:19 +02:00
|
|
|
|
2016-06-28 11:52:04 +02:00
|
|
|
// we need to wrap the list of metadata
|
|
|
|
List<MetadataFieldWrapper> wrapperList = new ArrayList<MetadataFieldWrapper>();
|
|
|
|
List<MetadataField> toWrap = metadata.getMetadataFields();
|
|
|
|
for(MetadataField metadataField: toWrap){
|
2016-06-09 18:58:19 +02:00
|
|
|
|
2016-06-28 11:52:04 +02:00
|
|
|
MetadataFieldWrapper wrapperObj = new MetadataFieldWrapper();
|
|
|
|
wrapperObj.setDefaulValue(metadataField.getDefaulValue());
|
|
|
|
wrapperObj.setFieldName(metadataField.getFieldName());
|
|
|
|
wrapperObj.setIsBoolean(metadataField.getIsBoolean());
|
|
|
|
wrapperObj.setMandatory(metadataField.getMandatory());
|
|
|
|
wrapperObj.setNote(metadataField.getNote());
|
2016-06-09 18:58:19 +02:00
|
|
|
|
2016-06-28 11:52:04 +02:00
|
|
|
MetadataValidator validator = metadataField.getValidator();
|
|
|
|
if(validator != null)
|
|
|
|
wrapperObj.setValidator(validator.getRegularExpression());
|
2016-06-09 18:58:19 +02:00
|
|
|
|
2016-06-28 11:52:04 +02:00
|
|
|
MetadataVocabulary vocabulary = metadataField.getVocabulary();
|
|
|
|
if(vocabulary != null)
|
|
|
|
wrapperObj.setVocabulary(vocabulary.getVocabularyFields());
|
2016-06-10 16:59:55 +02:00
|
|
|
|
2016-06-28 11:52:04 +02:00
|
|
|
// add to the list
|
|
|
|
wrapperList.add(wrapperObj);
|
2016-06-09 18:58:19 +02:00
|
|
|
|
2016-06-28 11:52:04 +02:00
|
|
|
}
|
2016-06-09 18:58:19 +02:00
|
|
|
|
2016-06-28 11:52:04 +02:00
|
|
|
// wrap the mt as well
|
|
|
|
MetaDataTypeWrapper typeWrapper = new MetaDataTypeWrapper();
|
|
|
|
typeWrapper.setDescription(mt.getDescription());
|
|
|
|
typeWrapper.setId(mt.getId());
|
|
|
|
typeWrapper.setName(mt.getName());
|
|
|
|
MetaDataProfileBean bean = new MetaDataProfileBean(typeWrapper, wrapperList);
|
|
|
|
beans.add(bean);
|
|
|
|
}
|
|
|
|
|
|
|
|
logger.debug("List of beans is " + beans);
|
|
|
|
session.setAttribute(CKAN_PROFILES_KEY, beans);
|
|
|
|
logger.debug("List of profiles has been saved into session");
|
|
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
logger.error("Error while retrieving metadata beans ", e);
|
|
|
|
}
|
2016-06-08 18:31:54 +02:00
|
|
|
}
|
2016-06-09 18:58:19 +02:00
|
|
|
|
2016-06-28 11:52:04 +02:00
|
|
|
return beans;
|
2016-06-08 18:31:54 +02:00
|
|
|
}
|
2016-06-06 17:24:52 +02:00
|
|
|
|
2016-05-26 18:12:53 +02:00
|
|
|
@Override
|
|
|
|
public LicensesBean getLicenses() {
|
|
|
|
|
2016-06-06 17:24:52 +02:00
|
|
|
logger.info("Request for CKAN licenses");
|
2016-06-28 11:52:04 +02:00
|
|
|
|
|
|
|
ASLSession session = getASLSession();
|
|
|
|
String username = session.getUsername();
|
|
|
|
logger.debug("User in session is " + username);
|
|
|
|
|
|
|
|
LicensesBean licensesBean = null;
|
|
|
|
if(session.getAttribute(CKAN_LICENSES_KEY) != null){
|
|
|
|
licensesBean = (LicensesBean)session.getAttribute(CKAN_LICENSES_KEY);
|
|
|
|
logger.debug("List of licenses was into session");
|
|
|
|
}
|
|
|
|
else{
|
2016-06-27 11:12:15 +02:00
|
|
|
List<String> titlesLicenses = getCkanUtilsObj().getLicenseTitles();
|
2016-06-28 11:52:04 +02:00
|
|
|
licensesBean = new LicensesBean(titlesLicenses);
|
|
|
|
session.setAttribute(CKAN_LICENSES_KEY, licensesBean);
|
|
|
|
logger.debug("List of licenses has been saved into session");
|
2016-05-26 18:12:53 +02:00
|
|
|
}
|
2016-06-28 11:52:04 +02:00
|
|
|
|
|
|
|
return licensesBean;
|
2016-05-26 18:12:53 +02:00
|
|
|
}
|
|
|
|
|
2016-05-27 19:08:03 +02:00
|
|
|
@Override
|
|
|
|
public DatasetMetadataBean getDatasetBean(String folderId, String owner){
|
|
|
|
|
|
|
|
DatasetMetadataBean bean = null;
|
2016-06-06 17:24:52 +02:00
|
|
|
|
2016-06-14 12:35:10 +02:00
|
|
|
logger.info("DatasetBean request for " + folderId + " and " + owner);
|
2016-05-27 19:08:03 +02:00
|
|
|
|
|
|
|
if(isWithinPortal()){
|
|
|
|
try{
|
|
|
|
|
|
|
|
logger.debug("Request dataset metadata bean for folder with id " + folderId
|
|
|
|
+ " whose owner is " + owner);
|
|
|
|
// get usermanager (liferay)
|
|
|
|
UserManager liferUserManager = new LiferayUserManager();
|
2016-06-21 14:36:49 +02:00
|
|
|
GCubeUser userOwner = liferUserManager.getUserByUsername(owner);
|
2016-06-27 11:55:06 +02:00
|
|
|
|
2016-05-27 19:08:03 +02:00
|
|
|
|
|
|
|
// build bean
|
|
|
|
logger.debug("Building bean");
|
|
|
|
bean = new DatasetMetadataBean();
|
|
|
|
|
|
|
|
bean.setId(folderId);
|
2016-06-08 18:31:54 +02:00
|
|
|
bean.setOwnerIdentifier(owner);
|
2016-05-27 19:08:03 +02:00
|
|
|
bean.setVersion(1);
|
|
|
|
bean.setAuthor(userOwner.getFullname());
|
|
|
|
bean.setAuthorEmail(userOwner.getEmail());
|
|
|
|
bean.setMaintainer(userOwner.getFullname());
|
|
|
|
bean.setMaintainerEmail(userOwner.getEmail());
|
2016-06-16 18:09:54 +02:00
|
|
|
bean.setOrganizationList(getUserOrganizationsList(owner));
|
2016-05-27 19:08:03 +02:00
|
|
|
|
2016-06-08 18:31:54 +02:00
|
|
|
// if the request comes from the workspace
|
2016-06-06 17:24:52 +02:00
|
|
|
if(folderId != null && !folderId.isEmpty()){
|
|
|
|
|
|
|
|
Workspace ws = HomeLibrary
|
|
|
|
.getHomeManagerFactory()
|
|
|
|
.getHomeManager()
|
|
|
|
.getHome(owner).getWorkspace();
|
|
|
|
|
|
|
|
WorkspaceItem retrievedItem = ws.getItem(folderId);
|
|
|
|
|
|
|
|
// set some info
|
|
|
|
bean.setTitle(retrievedItem.getName());
|
|
|
|
bean.setDescription(retrievedItem.getDescription());
|
|
|
|
|
|
|
|
// retrieve gcube items of the folder
|
|
|
|
Map<String, String> folderItems = getGcubeItemProperties(retrievedItem);
|
|
|
|
bean.setCustomFields(folderItems);
|
|
|
|
|
|
|
|
// check the resources within the folder (skip subdirectories)
|
|
|
|
List<String> childrenIds = new ArrayList<String>();
|
|
|
|
|
|
|
|
for (WorkspaceItem file : retrievedItem.getChildren()) {
|
|
|
|
if(!file.isFolder()) // ok, it's a file
|
|
|
|
childrenIds.add(file.getId());
|
|
|
|
}
|
|
|
|
|
|
|
|
bean.setResourcesIds(childrenIds);
|
2016-06-09 18:58:19 +02:00
|
|
|
|
2016-06-06 17:24:52 +02:00
|
|
|
}
|
2016-06-14 12:35:10 +02:00
|
|
|
|
2016-06-13 16:30:14 +02:00
|
|
|
// retrieve the metadata
|
|
|
|
List<MetaDataProfileBean> metadataBeans = getMetadataProfilesList();
|
|
|
|
bean.setMetadataList(metadataBeans);
|
2016-05-27 19:08:03 +02:00
|
|
|
|
|
|
|
}catch(Exception e){
|
|
|
|
logger.error("Error while retrieving folder information", e);
|
|
|
|
}
|
|
|
|
}else{
|
2016-06-06 17:24:52 +02:00
|
|
|
|
|
|
|
try{
|
|
|
|
|
|
|
|
bean = new DatasetMetadataBean();
|
|
|
|
bean.setId(folderId);
|
|
|
|
bean.setDescription("This is a fantastic description");
|
|
|
|
bean.setVersion(1);
|
|
|
|
bean.setTitle("dataset-" + Calendar.getInstance().getTimeInMillis());
|
|
|
|
bean.setAuthor("Costantino Perciante");
|
|
|
|
bean.setAuthorEmail("costantino.perciante@isti.cnr.it");
|
|
|
|
bean.setMaintainer("Costantino Perciante");
|
|
|
|
bean.setMaintainerEmail("costantino.perciante@isti.cnr.it");
|
2016-06-16 18:09:54 +02:00
|
|
|
bean.setOrganizationList(getUserOrganizationsList(owner));
|
2016-06-08 18:31:54 +02:00
|
|
|
bean.setOwnerIdentifier(owner);
|
2016-06-06 17:24:52 +02:00
|
|
|
|
|
|
|
if(folderId != null && !folderId.isEmpty()){
|
|
|
|
|
|
|
|
Workspace ws = HomeLibrary
|
|
|
|
.getHomeManagerFactory()
|
|
|
|
.getHomeManager()
|
|
|
|
.getHome(owner).getWorkspace();
|
|
|
|
|
|
|
|
WorkspaceItem retrievedItem = ws.getItem(folderId);
|
|
|
|
|
|
|
|
// retrieve gcube items of the folder
|
|
|
|
Map<String, String> folderItems = getGcubeItemProperties(retrievedItem);
|
|
|
|
bean.setCustomFields(folderItems);
|
|
|
|
|
|
|
|
// check the resources within the folder (skip subdirectories)
|
|
|
|
List<String> childrenIds = new ArrayList<String>();
|
|
|
|
|
|
|
|
for (WorkspaceItem file : retrievedItem.getChildren()) {
|
|
|
|
if(!file.isFolder()) // ok, it's a file
|
|
|
|
childrenIds.add(file.getId());
|
|
|
|
}
|
|
|
|
|
|
|
|
bean.setResourcesIds(childrenIds);
|
|
|
|
}
|
2016-06-09 18:58:19 +02:00
|
|
|
|
2016-06-08 18:31:54 +02:00
|
|
|
// retrieve the metadata
|
2016-06-09 18:58:19 +02:00
|
|
|
List<MetaDataProfileBean> metadataBeans = getMetadataProfilesList();
|
2016-06-08 18:31:54 +02:00
|
|
|
bean.setMetadataList(metadataBeans);
|
2016-06-09 18:58:19 +02:00
|
|
|
|
2016-06-06 17:24:52 +02:00
|
|
|
}catch(Exception e){
|
|
|
|
logger.error("Error while building bean into dev mode", e);
|
|
|
|
}
|
2016-05-27 19:08:03 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return bean;
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Gets the gcube item properties.
|
|
|
|
*
|
|
|
|
* @param item the item
|
|
|
|
* @return the gcube item properties
|
|
|
|
*/
|
|
|
|
private Map<String, String> getGcubeItemProperties(WorkspaceItem item) {
|
|
|
|
|
|
|
|
if(item instanceof GCubeItem){
|
|
|
|
GCubeItem gItem = (GCubeItem) item;
|
|
|
|
try {
|
|
|
|
if(gItem.getProperties()!=null){
|
|
|
|
Map<String, String> map = gItem.getProperties().getProperties();
|
|
|
|
HashMap<String, String> properties = new HashMap<String, String>(map.size()); //TO PREVENT GWT SERIALIZATION ERROR
|
|
|
|
for (String key : map.keySet())
|
|
|
|
properties.put(key, map.get(key));
|
|
|
|
|
|
|
|
return properties;
|
|
|
|
}
|
|
|
|
} catch (InternalErrorException e) {
|
|
|
|
logger.error("Error in server getItemProperties: ", e);
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2016-06-06 17:24:52 +02:00
|
|
|
@Override
|
2016-06-10 12:10:18 +02:00
|
|
|
public DatasetMetadataBean createCKanDataset(DatasetMetadataBean toCreate, boolean isWorkspaceRequest) {
|
2016-06-14 12:36:50 +02:00
|
|
|
|
2016-06-14 12:35:10 +02:00
|
|
|
logger.debug("Request for creating a dataset with these information " + toCreate);
|
2016-06-06 17:24:52 +02:00
|
|
|
|
2016-06-14 12:35:10 +02:00
|
|
|
try{
|
|
|
|
// get the owner
|
2016-06-16 18:09:54 +02:00
|
|
|
String username = toCreate.getOwnerIdentifier();
|
2016-06-14 12:35:10 +02:00
|
|
|
|
|
|
|
// set dataset info (same id as the folder, if the request comes from the workspace)
|
|
|
|
String withId = null;
|
|
|
|
if(isWorkspaceRequest)
|
|
|
|
withId = toCreate.getId();
|
|
|
|
|
|
|
|
String title = toCreate.getTitle();
|
|
|
|
String organizationNameOrId = toCreate.getSelectedOrganization();
|
|
|
|
String author = toCreate.getAuthor();
|
|
|
|
String authorMail = toCreate.getAuthorEmail();
|
|
|
|
String maintainer = toCreate.getMaintainer();
|
|
|
|
String maintainerMail = toCreate.getMaintainerEmail();
|
|
|
|
long version = toCreate.getVersion();
|
|
|
|
String description = toCreate.getDescription();
|
|
|
|
String chosenLicense = toCreate.getLicense();
|
|
|
|
String licenseId = findLicenseIdByLicense(chosenLicense);
|
|
|
|
List<String> listOfTags = toCreate.getTags();
|
|
|
|
Map<String, String> customFields = toCreate.getCustomFields();
|
|
|
|
boolean setPublic = toCreate.getVisibility();
|
|
|
|
List<ResourceBean> resources = new ArrayList<ResourceBean>();
|
|
|
|
|
|
|
|
// build the resource (if it is a workspaceRequest type)
|
|
|
|
if(toCreate.isAddResources() && isWorkspaceRequest){
|
|
|
|
|
|
|
|
logger.debug("We need to add resources to the dataset");
|
|
|
|
|
|
|
|
try{
|
2016-06-06 17:24:52 +02:00
|
|
|
|
2016-06-14 12:35:10 +02:00
|
|
|
Workspace ws = HomeLibrary
|
|
|
|
.getHomeManagerFactory()
|
|
|
|
.getHomeManager()
|
|
|
|
.getHome(toCreate.getOwnerIdentifier()).getWorkspace();
|
2016-06-06 17:24:52 +02:00
|
|
|
|
2016-06-14 12:35:10 +02:00
|
|
|
for(String resourceId: toCreate.getResourcesIds()){
|
2016-06-06 17:24:52 +02:00
|
|
|
|
2016-06-14 12:35:10 +02:00
|
|
|
FolderItem item = (FolderItem)ws.getItem(resourceId);
|
|
|
|
ResourceBean newResource = new ResourceBean();
|
|
|
|
newResource.setDescription(item.getDescription());
|
|
|
|
newResource.setId(item.getId());
|
|
|
|
newResource.setUrl(item.getPublicLink(false));
|
|
|
|
newResource.setName(item.getName());
|
|
|
|
newResource.setMimeType(item.getMimeType());
|
|
|
|
newResource.setOwner(username);
|
|
|
|
resources.add(newResource);
|
2016-06-06 17:24:52 +02:00
|
|
|
|
2016-06-14 12:35:10 +02:00
|
|
|
}
|
2016-06-06 17:24:52 +02:00
|
|
|
|
2016-06-14 12:35:10 +02:00
|
|
|
}catch(Exception e){
|
|
|
|
logger.error("Unable to add those resources to the dataset", e);
|
2016-06-06 17:24:52 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-06-14 12:36:50 +02:00
|
|
|
|
2016-06-27 11:12:15 +02:00
|
|
|
String datasetId = getCkanUtilsObj().createCKanDataset(getUserCKanTokenFromSession(), withId, title, organizationNameOrId, author,
|
2016-06-14 12:36:50 +02:00
|
|
|
authorMail, maintainer, maintainerMail, version, description, licenseId,
|
|
|
|
listOfTags, customFields, resources, setPublic);
|
2016-06-10 16:59:55 +02:00
|
|
|
|
2016-06-14 12:35:10 +02:00
|
|
|
if(datasetId != null){
|
2016-06-14 12:36:50 +02:00
|
|
|
|
2016-06-14 12:35:10 +02:00
|
|
|
logger.debug("Dataset created!");
|
|
|
|
toCreate.setId(datasetId);
|
2016-06-14 12:36:50 +02:00
|
|
|
|
2016-06-14 12:35:10 +02:00
|
|
|
// retrieve the url
|
2016-06-27 11:12:15 +02:00
|
|
|
String datasetUrl = getCkanUtilsObj().getUrlFromDatasetIdOrName(getUserCKanTokenFromSession(), datasetId);
|
2016-06-14 12:36:50 +02:00
|
|
|
|
2016-06-14 12:35:10 +02:00
|
|
|
toCreate.setSource(datasetUrl);
|
|
|
|
return toCreate;
|
2016-06-14 12:36:50 +02:00
|
|
|
|
2016-06-14 12:35:10 +02:00
|
|
|
}else{
|
2016-06-14 12:36:50 +02:00
|
|
|
|
2016-06-14 12:35:10 +02:00
|
|
|
logger.error("Failed to create the dataset");
|
2016-06-14 12:36:50 +02:00
|
|
|
|
2016-06-14 12:35:10 +02:00
|
|
|
}
|
2016-06-06 17:24:52 +02:00
|
|
|
|
|
|
|
}catch(Exception e){
|
2016-06-14 12:35:10 +02:00
|
|
|
logger.error("Unable to create the dataset", e);
|
2016-06-06 17:24:52 +02:00
|
|
|
}
|
2016-06-10 18:06:31 +02:00
|
|
|
|
2016-06-14 12:36:50 +02:00
|
|
|
return null;
|
2016-06-10 18:06:31 +02:00
|
|
|
}
|
|
|
|
|
2016-06-07 17:50:33 +02:00
|
|
|
@Override
|
2016-06-14 12:35:10 +02:00
|
|
|
public ResourceBeanWrapper addResourceToDataset(ResourceBeanWrapper resource, String datasetId, String owner) {
|
2016-06-08 18:31:54 +02:00
|
|
|
|
|
|
|
logger.debug("Incoming request for creating new resource for dataset with id " + datasetId);
|
2016-06-14 12:35:10 +02:00
|
|
|
logger.debug("Owner is " + owner + " and resource is " + resource);
|
2016-06-08 18:31:54 +02:00
|
|
|
|
2016-06-14 12:35:10 +02:00
|
|
|
try{
|
2016-06-08 18:31:54 +02:00
|
|
|
|
2016-06-14 12:35:10 +02:00
|
|
|
ResourceBean resourceBean = new ResourceBean(
|
|
|
|
resource.getUrl(),
|
|
|
|
resource.getName(),
|
|
|
|
resource.getDescription(),
|
|
|
|
null,
|
2016-06-16 18:09:54 +02:00
|
|
|
owner,
|
2016-06-14 12:35:10 +02:00
|
|
|
datasetId,
|
|
|
|
null);
|
2016-06-08 18:31:54 +02:00
|
|
|
|
2016-06-27 11:12:15 +02:00
|
|
|
String resourceId = getCkanUtilsObj().addResourceToDataset(resourceBean, getUserCKanTokenFromSession());
|
2016-06-08 18:31:54 +02:00
|
|
|
|
2016-06-14 12:35:10 +02:00
|
|
|
if(resourceId != null){
|
2016-06-09 18:58:19 +02:00
|
|
|
|
2016-06-14 12:35:10 +02:00
|
|
|
logger.debug("Resource " + resource.getName() + " is now available");
|
2016-06-08 18:31:54 +02:00
|
|
|
|
2016-06-14 12:35:10 +02:00
|
|
|
// set its id and turn it to the client
|
|
|
|
resource.setId(resourceId);
|
|
|
|
return resource;
|
2016-06-08 18:31:54 +02:00
|
|
|
|
|
|
|
}
|
2016-06-14 12:35:10 +02:00
|
|
|
|
|
|
|
}catch(Exception e){
|
|
|
|
logger.error("Unable to create new resource", e);
|
2016-06-08 18:31:54 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
logger.debug("No resource created");
|
|
|
|
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2016-06-14 12:35:10 +02:00
|
|
|
public boolean deleteResourceFromDataset(ResourceBeanWrapper resource,
|
2016-06-08 18:31:54 +02:00
|
|
|
String owner) {
|
|
|
|
logger.debug("Request for deleting resource " + resource);
|
|
|
|
|
2016-06-14 12:35:10 +02:00
|
|
|
boolean deleted = false;
|
2016-06-08 18:31:54 +02:00
|
|
|
|
2016-06-14 12:35:10 +02:00
|
|
|
try{
|
2016-06-08 18:31:54 +02:00
|
|
|
|
2016-06-27 11:12:15 +02:00
|
|
|
deleted = getCkanUtilsObj().
|
2016-06-16 18:09:54 +02:00
|
|
|
deleteResourceFromDataset(resource.getId(), getUserCKanTokenFromSession());
|
2016-06-08 18:31:54 +02:00
|
|
|
|
2016-06-14 12:35:10 +02:00
|
|
|
if(deleted){
|
|
|
|
logger.debug("Resource described by " + resource + " deleted");
|
|
|
|
}else
|
|
|
|
logger.error("Resource described by " + resource + " NOT deleted");
|
2016-06-09 18:58:19 +02:00
|
|
|
|
2016-06-08 18:31:54 +02:00
|
|
|
}catch(Exception e){
|
2016-06-14 12:35:10 +02:00
|
|
|
logger.error("Error while trying to delete resource described by " + resource, e);
|
2016-06-07 17:50:33 +02:00
|
|
|
}
|
2016-06-08 18:31:54 +02:00
|
|
|
|
2016-06-14 12:35:10 +02:00
|
|
|
return deleted;
|
2016-06-07 17:50:33 +02:00
|
|
|
}
|
2016-06-09 18:58:19 +02:00
|
|
|
|
2016-05-26 18:12:53 +02:00
|
|
|
}
|