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 result = new ArrayList(); CheckedCkanClient checkedClient = new CheckedCkanClient(ckanPortalUrl, apiKey); //retrieve the list of available licenses List 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 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 folderItems = new HashMap(); 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 getGcubeItemProperties(WorkspaceItem item) { if(item instanceof GCubeItem){ GCubeItem gItem = (GCubeItem) item; try { if(gItem.getProperties()!=null){ Map map = gItem.getProperties().getProperties(); HashMap properties = new HashMap(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; } }