235 lines
7.0 KiB
Java
235 lines
7.0 KiB
Java
package org.gcube.portlets.widgets.ckandatapublisherwidget.server;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.HashMap;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
|
|
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.exceptions.InternalErrorException;
|
|
import org.gcube.common.homelibrary.home.workspace.Workspace;
|
|
import org.gcube.common.homelibrary.home.workspace.WorkspaceItem;
|
|
import org.gcube.common.homelibrary.home.workspace.folder.items.GCubeItem;
|
|
import org.gcube.common.scope.api.ScopeProvider;
|
|
import org.gcube.portal.custom.scopemanager.scopehelper.ScopeHelper;
|
|
import org.gcube.portlets.widgets.ckandatapublisherwidget.client.CKanPublisherService;
|
|
import org.gcube.portlets.widgets.ckandatapublisherwidget.shared.DatasetMetadataBean;
|
|
import org.gcube.portlets.widgets.ckandatapublisherwidget.shared.LicensesBean;
|
|
import org.gcube.vomanagement.usermanagement.UserManager;
|
|
import org.gcube.vomanagement.usermanagement.impl.LiferayUserManager;
|
|
import org.gcube.vomanagement.usermanagement.model.GCubeUser;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
|
|
import com.liferay.portal.service.UserLocalServiceUtil;
|
|
|
|
import eu.trentorise.opendata.jackan.CheckedCkanClient;
|
|
import eu.trentorise.opendata.jackan.model.CkanLicense;
|
|
|
|
/**
|
|
* 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
|
|
private static final Logger logger = LoggerFactory.getLogger(CKANPublisherServicesImpl.class);
|
|
|
|
//dev user
|
|
public static final String defaultUserId = "test.user";
|
|
|
|
//dev vre
|
|
private static final String vreID = "/gcube/devsec/devVRE";
|
|
|
|
/**
|
|
* when packaging test will fail if the user is not set to test.user
|
|
* @return .
|
|
*/
|
|
public String getDevelopmentUser() {
|
|
String user = defaultUserId;
|
|
// user = "costantino.perciante";
|
|
return user;
|
|
}
|
|
|
|
/**
|
|
* Retrieve the ckan portal url by querying the IS
|
|
* @return
|
|
*/
|
|
private String getCKANUrlFromIS(){
|
|
|
|
// TODO
|
|
return "https://ckan-d-d4s.d4science.org/";
|
|
|
|
}
|
|
|
|
/**
|
|
* Retrieve the API_KEY of the current user
|
|
* @return
|
|
*/
|
|
private String getCKANApikeyFromUser(String username){
|
|
|
|
// TODO
|
|
return "803ada7f-2080-493f-8a99-3e593e880d94";
|
|
|
|
}
|
|
|
|
/**
|
|
* the current ASLSession
|
|
* @return the session
|
|
*/
|
|
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 " + defaultUserId + " and Running OUTSIDE PORTAL");
|
|
user = getDevelopmentUser();
|
|
SessionManager.getInstance().getASLSession(sessionID, user).setScope(vreID);
|
|
|
|
}
|
|
|
|
return SessionManager.getInstance().getASLSession(sessionID, user);
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public LicensesBean getLicenses() {
|
|
|
|
logger.debug("Request for CKAN licenses");
|
|
|
|
// get the url and the api key of the user
|
|
String ckanPortalUrl = getCKANUrlFromIS();
|
|
String apiKey = getCKANApikeyFromUser(""); // TODO
|
|
|
|
List<String> result = new ArrayList<String>();
|
|
|
|
CheckedCkanClient checkedClient = new CheckedCkanClient(ckanPortalUrl, apiKey);
|
|
|
|
//retrieve the list of available licenses
|
|
List<CkanLicense> licenses = checkedClient.getLicenseList();
|
|
|
|
for (CkanLicense ckanLicense : licenses) {
|
|
result.add(ckanLicense.getTitle());
|
|
logger.debug("License is " + ckanLicense.getTitle());
|
|
}
|
|
|
|
return new LicensesBean(result);
|
|
}
|
|
|
|
@Override
|
|
public DatasetMetadataBean getDatasetBean(String folderId, String owner){
|
|
|
|
DatasetMetadataBean bean = null;
|
|
ScopeProvider.instance.set("/gcube/devsec/devVRE");
|
|
|
|
if(isWithinPortal()){
|
|
try{
|
|
|
|
logger.debug("Request dataset metadata bean for folder with id " + folderId
|
|
+ " whose owner is " + owner);
|
|
|
|
Workspace ws = HomeLibrary
|
|
.getHomeManagerFactory()
|
|
.getHomeManager()
|
|
.getHome(owner).getWorkspace();
|
|
|
|
WorkspaceItem retrievedItem = ws.getItem(folderId);
|
|
|
|
// get usermanager (liferay)
|
|
UserManager liferUserManager = new LiferayUserManager();
|
|
GCubeUser userOwner = liferUserManager.getUserByUsername(owner);
|
|
|
|
// build bean
|
|
logger.debug("Building bean");
|
|
bean = new DatasetMetadataBean();
|
|
|
|
bean.setId(folderId);
|
|
bean.setDescription(retrievedItem.getDescription());
|
|
bean.setVersion(1);
|
|
bean.setTitle(retrievedItem.getName());
|
|
bean.setAuthor(userOwner.getFullname());
|
|
bean.setAuthorEmail(userOwner.getEmail());
|
|
bean.setMaintainer(userOwner.getFullname());
|
|
bean.setMaintainerEmail(userOwner.getEmail());
|
|
bean.setSource(retrievedItem.getPublicLink(true));
|
|
|
|
// retrieve gcube items of the folder
|
|
Map<String, String> folderItems = getGcubeItemProperties(retrievedItem);
|
|
bean.setCustomFields(folderItems);
|
|
|
|
}catch(Exception e){
|
|
logger.error("Error while retrieving folder information", e);
|
|
}
|
|
}else{
|
|
|
|
bean = new DatasetMetadataBean();
|
|
bean.setId(folderId);
|
|
bean.setDescription("This is a fantastic description");
|
|
bean.setVersion(1);
|
|
bean.setTitle("Dataset name");
|
|
bean.setAuthor("Costantino Perciante");
|
|
bean.setAuthorEmail("costantino.perciante@isti.cnr.it");
|
|
bean.setMaintainer("Costantino Perciante");
|
|
bean.setMaintainerEmail("costantino.perciante@isti.cnr.it");
|
|
bean.setSource("https://dev.d4science.org/group/data-e-infrastructure-gateway/workspace");
|
|
|
|
// retrieve gcube items of the folder
|
|
Map<String, String> folderItems = new HashMap<String, String>();
|
|
folderItems.put("tag1", "asds");
|
|
folderItems.put("tag2", "asdsdaxcxcs");
|
|
folderItems.put("tag3", "asasdads");
|
|
bean.setCustomFields(folderItems);
|
|
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
}
|