integrated with StorageHubWrapper
This commit is contained in:
parent
0e2b8fe420
commit
fec44f2b96
|
@ -10,6 +10,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
|
|||
**Enhancements**
|
||||
|
||||
[#19764] Porting ckan-metadata-publisher-widget to catalogue-util-library
|
||||
[#20680] Ported to SHUB
|
||||
|
||||
|
||||
## [v1.6.2] - 2021-02-08
|
||||
|
|
53
pom.xml
53
pom.xml
|
@ -121,24 +121,33 @@
|
|||
<version>[2.0.0, 3.0.0-SNAPSHOT)</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.gcube.common</groupId>
|
||||
<artifactId>home-library</artifactId>
|
||||
<version>[2.5.0,)</version>
|
||||
<scope>provided</scope>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<artifactId>asm-all</artifactId>
|
||||
<groupId>asm</groupId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.gcube.common</groupId>
|
||||
<artifactId>home-library-jcr</artifactId>
|
||||
<version>[2.5.0,)</version>
|
||||
<scope>provided</scope>
|
||||
<artifactId>storagehub-client-wrapper</artifactId>
|
||||
<version>[1.0.0, 2.0.0-SNAPSHOT)</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
<!-- <dependency> -->
|
||||
<!-- <groupId>org.gcube.common</groupId> -->
|
||||
<!-- <artifactId>home-library</artifactId> -->
|
||||
<!-- <version>[2.5.0,)</version> -->
|
||||
<!-- <scope>provided</scope> -->
|
||||
<!-- <exclusions> -->
|
||||
<!-- <exclusion> -->
|
||||
<!-- <artifactId>asm-all</artifactId> -->
|
||||
<!-- <groupId>asm</groupId> -->
|
||||
<!-- </exclusion> -->
|
||||
<!-- </exclusions> -->
|
||||
<!-- </dependency> -->
|
||||
<!-- <dependency> -->
|
||||
<!-- <groupId>org.gcube.common</groupId> -->
|
||||
<!-- <artifactId>home-library-jcr</artifactId> -->
|
||||
<!-- <version>[2.5.0,)</version> -->
|
||||
<!-- <scope>provided</scope> -->
|
||||
<!-- </dependency> -->
|
||||
|
||||
<dependency>
|
||||
<groupId>org.gcube.dvos</groupId>
|
||||
<artifactId>usermanagement-core</artifactId>
|
||||
|
@ -146,20 +155,6 @@
|
|||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<!-- <dependency> -->
|
||||
<!-- <groupId>org.gcube.data-catalogue</groupId> -->
|
||||
<!-- <artifactId>ckan-util-library</artifactId> -->
|
||||
<!-- <version>[2.0.0, 3.0.0-SNAPSHOT)</version> -->
|
||||
<!-- <scope>compile</scope> -->
|
||||
<!-- <exclusions> -->
|
||||
<!-- <exclusion> -->
|
||||
<!-- <groupId>org.gcube.data-catalogue</groupId> -->
|
||||
<!-- <artifactId>gcubedatacatalogue-metadata-discovery</artifactId> -->
|
||||
<!-- </exclusion> -->
|
||||
<!-- </exclusions> -->
|
||||
<!-- </dependency> -->
|
||||
|
||||
|
||||
<dependency>
|
||||
<groupId>org.gcube.datacatalogue</groupId>
|
||||
<artifactId>catalogue-util-library</artifactId>
|
||||
|
|
|
@ -13,6 +13,9 @@ import java.util.concurrent.ConcurrentHashMap;
|
|||
|
||||
import javax.servlet.http.HttpSession;
|
||||
|
||||
import org.gcube.common.portal.PortalContext;
|
||||
import org.gcube.common.storagehubwrapper.server.StorageHubWrapper;
|
||||
import org.gcube.common.storagehubwrapper.server.tohl.Workspace;
|
||||
import org.gcube.datacatalogue.utillibrary.server.DataCatalogue;
|
||||
import org.gcube.datacatalogue.utillibrary.server.DataCatalogueFactory;
|
||||
import org.gcube.datacatalogue.utillibrary.server.utils.CatalogueUtilMethods;
|
||||
|
@ -68,10 +71,24 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C
|
|||
// map <orgName, scope>
|
||||
private ConcurrentHashMap<String, String> mapOrganizationScope = new ConcurrentHashMap<String, String>();
|
||||
|
||||
|
||||
/**
|
||||
* Retrieve an instance of the library for the scope
|
||||
* Dev mode set contexts.
|
||||
*/
|
||||
private void devModeSetContexts() {
|
||||
if (!isWithinPortal()) {
|
||||
logger.info("DETECTED DEV MODE");
|
||||
GenericUtils.getCurrentContext(getThreadLocalRequest(), true);
|
||||
GenericUtils.getCurrentToken(getThreadLocalRequest(), true);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve an instance of the library for the scope.
|
||||
*
|
||||
* @param scope if it is null it is evaluated from the session
|
||||
* @return
|
||||
* @return the catalogue
|
||||
*/
|
||||
public DataCatalogue getCatalogue(String scope){
|
||||
|
||||
|
@ -88,11 +105,13 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C
|
|||
}
|
||||
|
||||
/**
|
||||
* Retrieve the list of organizations in which the user can publish (roles ADMIN/EDITOR)
|
||||
* @param username
|
||||
* Retrieve the list of organizations in which the user can publish (roles ADMIN/EDITOR).
|
||||
*
|
||||
* @param username the username
|
||||
* @param scope the scope
|
||||
* @return the list of organizations
|
||||
* @throws GroupRetrievalFault
|
||||
* @throws UserManagementSystemException
|
||||
* @throws UserManagementSystemException the user management system exception
|
||||
* @throws GroupRetrievalFault the group retrieval fault
|
||||
*/
|
||||
private List<OrganizationBean> getUserOrganizationsListAdmin(String username, String scope) throws UserManagementSystemException, GroupRetrievalFault {
|
||||
|
||||
|
@ -118,7 +137,8 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C
|
|||
}
|
||||
|
||||
/**
|
||||
* Online or in development mode?
|
||||
* Online or in development mode?.
|
||||
*
|
||||
* @return true if you're running into the portal, false if in development
|
||||
*/
|
||||
private boolean isWithinPortal() {
|
||||
|
@ -132,10 +152,24 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the workspace from storage hub.
|
||||
*
|
||||
* @return the workspace from storage hub
|
||||
* @throws Exception
|
||||
* the exception
|
||||
*/
|
||||
protected Workspace getWorkspaceFromStorageHub() throws Exception {
|
||||
GCubeUser user = PortalContext.getConfiguration().getCurrentUser(this.getThreadLocalRequest());
|
||||
StorageHubWrapper storageHubWrapper = WorkspaceUtils.getStorageHubWrapper(this.getThreadLocalRequest(), null, user);
|
||||
return storageHubWrapper.getWorkspace();
|
||||
}
|
||||
|
||||
/**
|
||||
* Find a license id given the license text.
|
||||
* @param chosenLicense
|
||||
* @return
|
||||
*
|
||||
* @param chosenLicense the chosen license
|
||||
* @return the string
|
||||
*/
|
||||
private String findLicenseIdByLicense(String chosenLicense) {
|
||||
|
||||
|
@ -145,6 +179,11 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C
|
|||
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the licenses.
|
||||
*
|
||||
* @return the licenses
|
||||
*/
|
||||
@Override
|
||||
public List<LicenseBean> getLicenses() {
|
||||
|
||||
|
@ -179,6 +218,14 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C
|
|||
return licensesBean;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets the dataset bean.
|
||||
*
|
||||
* @param folderId the folder id
|
||||
* @return the dataset bean
|
||||
* @throws Exception the exception
|
||||
*/
|
||||
@Override
|
||||
public DatasetBean getDatasetBean(String folderId) throws Exception{
|
||||
|
||||
|
@ -193,7 +240,6 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C
|
|||
String scope = GenericUtils.getScopeFromClientUrl(getThreadLocalRequest());
|
||||
|
||||
logger.debug("Scope recovered from session is " + scope);
|
||||
|
||||
logger.debug("Request dataset metadata bean for folder with id " + folderId
|
||||
+ " whose owner is " + userName);
|
||||
|
||||
|
@ -217,7 +263,8 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C
|
|||
|
||||
// if the request comes from the workspace
|
||||
if(folderId != null && !folderId.isEmpty()){
|
||||
WorkspaceUtils.handleWorkspaceResources(folderId, userName, bean);
|
||||
Workspace workspace = getWorkspaceFromStorageHub();
|
||||
WorkspaceUtils.handleWorkspaceResources(folderId, userName, bean, workspace);
|
||||
}
|
||||
|
||||
}catch(Exception e){
|
||||
|
@ -251,7 +298,8 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C
|
|||
bean.setOwnerIdentifier(userName);
|
||||
|
||||
if(folderId != null && !folderId.isEmpty()){
|
||||
WorkspaceUtils.handleWorkspaceResources(folderId, userName, bean);
|
||||
Workspace workspace = getWorkspaceFromStorageHub();
|
||||
WorkspaceUtils.handleWorkspaceResources(folderId, userName, bean, workspace);
|
||||
}
|
||||
}catch(Exception e){
|
||||
logger.error("Error while building bean into dev mode", e);
|
||||
|
@ -264,9 +312,10 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C
|
|||
}
|
||||
|
||||
/**
|
||||
* Discover from the IS the vocabulary of tags for this scope, if present
|
||||
* Discover from the IS the vocabulary of tags for this scope, if present.
|
||||
*
|
||||
* @param context the context
|
||||
* @return a list of tags vocabulary
|
||||
* @throws Exception
|
||||
*/
|
||||
private List<String> discoverTagsVocabulary(String context){
|
||||
|
||||
|
@ -285,24 +334,30 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C
|
|||
return vocabulary;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the tags for organization.
|
||||
*
|
||||
* @param orgName the org name
|
||||
* @return the tags for organization
|
||||
* @throws Exception the exception
|
||||
*/
|
||||
@Override
|
||||
public List<String> getTagsForOrganization(String orgName) throws Exception{
|
||||
return discoverTagsVocabulary(getScopeFromOrgName(orgName));
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the C kan dataset.
|
||||
*
|
||||
* @param toCreate the to create
|
||||
* @return the dataset bean
|
||||
* @throws Exception the exception
|
||||
*/
|
||||
@Override
|
||||
public DatasetBean createCKanDataset(DatasetBean toCreate) throws Exception{
|
||||
|
||||
try{
|
||||
|
||||
|
||||
if (!isWithinPortal()) {
|
||||
logger.info("DETECTED DEV MODE");
|
||||
GenericUtils.getCurrentContext(getThreadLocalRequest(), true);
|
||||
GenericUtils.getCurrentToken(getThreadLocalRequest(), true);
|
||||
}
|
||||
|
||||
|
||||
devModeSetContexts();
|
||||
logger.info("Request for creating a dataset with these information " + toCreate);
|
||||
String userName = GenericUtils.getCurrentUser(getThreadLocalRequest()).getUsername();
|
||||
String title = toCreate.getTitle();
|
||||
|
@ -329,8 +384,14 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C
|
|||
ResourceElementBean resourcesToAdd = toCreate.getResourceRoot();
|
||||
|
||||
// we need to copy such resource in the .catalogue area of the user's ws
|
||||
// if(resourcesToAdd != null){
|
||||
// resources = WorkspaceUtils.copyResourcesToUserCatalogueArea(toCreate.getId(), userName, toCreate);
|
||||
// }
|
||||
|
||||
//converting to resources to be added
|
||||
if(resourcesToAdd != null){
|
||||
resources = WorkspaceUtils.copyResourcesToUserCatalogueArea(toCreate.getId(), userName, toCreate);
|
||||
Workspace workspace = getWorkspaceFromStorageHub();
|
||||
resources = WorkspaceUtils.toResources(toCreate, workspace, userName);
|
||||
}
|
||||
|
||||
logger.debug("The user wants to publish in organization with name " + organizationNameOrId);
|
||||
|
@ -435,20 +496,22 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C
|
|||
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the resource to dataset.
|
||||
*
|
||||
* @param resource the resource
|
||||
* @param datasetId the dataset id
|
||||
* @return the resource element bean
|
||||
* @throws Exception the exception
|
||||
*/
|
||||
@Override
|
||||
public ResourceElementBean addResourceToDataset(ResourceElementBean resource, String datasetId) throws Exception{
|
||||
logger.info("called addResourceToDataset");
|
||||
devModeSetContexts();
|
||||
String username = GenericUtils.getCurrentUser(getThreadLocalRequest()).getUsername();
|
||||
|
||||
logger.debug("Incoming request for creating new resource for dataset with id " + datasetId + " and organization name of the dataset is " + resource.getOrganizationNameDatasetParent());
|
||||
logger.debug("Owner is " + username + " and resource is " + resource);
|
||||
|
||||
if(!isWithinPortal()){
|
||||
|
||||
logger.warn("Running outside the portal");
|
||||
return resource;
|
||||
|
||||
}else{
|
||||
|
||||
ResourceBean resourceBean = new ResourceBean(
|
||||
resource.getUrl(),
|
||||
resource.getName(),
|
||||
|
@ -464,7 +527,7 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C
|
|||
String resourceId = catalogue.addResourceToDataset(resourceBean);
|
||||
|
||||
if(resourceId != null){
|
||||
logger.debug("Resource " + resource.getName() + " is now available");
|
||||
logger.info("Resource " + resource.getName() + " is now available");
|
||||
// set its id and turn it to the client
|
||||
resource.setOriginalIdInWorkspace(resourceId);
|
||||
return resource;
|
||||
|
@ -473,19 +536,19 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C
|
|||
logger.debug("No resource created");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete resource from dataset.
|
||||
*
|
||||
* @param resource the resource
|
||||
* @return true, if successful
|
||||
* @throws Exception the exception
|
||||
*/
|
||||
@Override
|
||||
public boolean deleteResourceFromDataset(ResourceElementBean resource) throws Exception{
|
||||
|
||||
logger.debug("Request for deleting resource " + resource);
|
||||
boolean deleted = false;
|
||||
|
||||
if(!isWithinPortal()){
|
||||
logger.warn("Running outside the portal");
|
||||
return deleted;
|
||||
}else{
|
||||
|
||||
devModeSetContexts();
|
||||
try{
|
||||
// get the scope in which we should discover the ckan instance given the organization name in which the dataset was created
|
||||
String scope = getScopeFromOrgName(resource.getOrganizationNameDatasetParent());
|
||||
|
@ -500,9 +563,16 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C
|
|||
throw new Exception("Error while trying to delete resource." + e.getMessage());
|
||||
}
|
||||
return deleted;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the profiles.
|
||||
*
|
||||
* @param orgName the org name
|
||||
* @return the profiles
|
||||
* @throws Exception the exception
|
||||
*/
|
||||
@Override
|
||||
public List<MetaDataProfileBean> getProfiles(String orgName) throws Exception{
|
||||
|
||||
|
@ -520,6 +590,14 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C
|
|||
return toReturn;
|
||||
}
|
||||
|
||||
/**
|
||||
* Dataset id already exists.
|
||||
*
|
||||
* @param title the title
|
||||
* @param orgName the org name
|
||||
* @return true, if successful
|
||||
* @throws Exception the exception
|
||||
*/
|
||||
@Override
|
||||
public boolean datasetIdAlreadyExists(String title, String orgName) throws Exception{
|
||||
if(title == null || title.isEmpty())
|
||||
|
@ -537,7 +615,10 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C
|
|||
|
||||
/**
|
||||
* The method tries to retrieve the scope related to the organization using the map first,
|
||||
* if no match is found, it retrieves such information by using liferay
|
||||
* if no match is found, it retrieves such information by using liferay.
|
||||
*
|
||||
* @param orgName the org name
|
||||
* @return the scope from org name
|
||||
*/
|
||||
private String getScopeFromOrgName(String orgName){
|
||||
|
||||
|
@ -568,6 +649,12 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C
|
|||
return toReturn;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the user groups.
|
||||
*
|
||||
* @param orgName the org name
|
||||
* @return the user groups
|
||||
*/
|
||||
@Override
|
||||
public List<OrganizationBean> getUserGroups(String orgName) {
|
||||
|
||||
|
@ -621,6 +708,13 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* Checks if is publisher user.
|
||||
*
|
||||
* @param isWorkspaceRequest the is workspace request
|
||||
* @return true, if is publisher user
|
||||
* @throws Exception the exception
|
||||
*/
|
||||
@Override
|
||||
public boolean isPublisherUser(boolean isWorkspaceRequest) throws Exception{
|
||||
|
||||
|
@ -689,6 +783,13 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if is geo JSON valid.
|
||||
*
|
||||
* @param geoJson the geo json
|
||||
* @return true, if is geo JSON valid
|
||||
* @throws Exception the exception
|
||||
*/
|
||||
@Override
|
||||
public boolean isGeoJSONValid(String geoJson) throws Exception {
|
||||
try{
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package org.gcube.portlets.widgets.ckandatapublisherwidget.server.utils;
|
||||
|
||||
import java.net.URL;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
|
@ -8,24 +9,33 @@ import java.util.List;
|
|||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import org.gcube.common.homelibary.model.items.type.FolderItemType;
|
||||
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.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;
|
||||
import org.gcube.common.homelibrary.home.workspace.folder.items.ExternalUrl;
|
||||
import org.gcube.common.homelibrary.home.workspace.folder.items.GCubeItem;
|
||||
import org.gcube.datacatalogue.utillibrary.server.utils.CatalogueUtilMethods;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
import org.gcube.common.portal.PortalContext;
|
||||
import org.gcube.common.storagehubwrapper.server.StorageHubWrapper;
|
||||
import org.gcube.common.storagehubwrapper.server.tohl.Workspace;
|
||||
import org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem;
|
||||
import org.gcube.common.storagehubwrapper.shared.tohl.impl.URLFile;
|
||||
import org.gcube.common.storagehubwrapper.shared.tohl.items.FileItem;
|
||||
import org.gcube.common.storagehubwrapper.shared.tohl.items.GCubeItem;
|
||||
import org.gcube.common.storagehubwrapper.shared.tohl.items.PropertyMap;
|
||||
import org.gcube.datacatalogue.utillibrary.shared.ResourceBean;
|
||||
import org.gcube.portlets.widgets.ckandatapublisherwidget.shared.DatasetBean;
|
||||
import org.gcube.portlets.widgets.ckandatapublisherwidget.shared.ResourceElementBean;
|
||||
import org.gcube.vomanagement.usermanagement.model.GCubeUser;
|
||||
|
||||
import com.liferay.portal.kernel.log.Log;
|
||||
import com.liferay.portal.kernel.log.LogFactoryUtil;
|
||||
import com.liferay.portal.service.UserLocalServiceUtil;
|
||||
|
||||
|
||||
/**
|
||||
* The Class WorkspaceUtils.
|
||||
*
|
||||
* @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it)
|
||||
*
|
||||
* Feb 18, 2021
|
||||
*/
|
||||
public class WorkspaceUtils {
|
||||
|
||||
//private static final org.slf4j.Logger logger = LoggerFactory.getLogger(WorkspaceUtils.class);
|
||||
|
@ -33,24 +43,75 @@ public class WorkspaceUtils {
|
|||
private static final String RESOURCES_NAME_SEPARATOR = "_";
|
||||
private static final String STRIP_NOT_ALPHANUMERIC = "[^A-Za-z0-9.-_]";
|
||||
|
||||
|
||||
/**
|
||||
* This method receives a folder id within the user's workspace and set the list of resources in the dataset bean to be returned
|
||||
* @param folderId
|
||||
* @param owner
|
||||
* @param bean
|
||||
* @param userName
|
||||
* Checks if is within portal.
|
||||
*
|
||||
* @return true if you're running into the portal, false if in development
|
||||
*/
|
||||
public static boolean isWithinPortal() {
|
||||
try {
|
||||
UserLocalServiceUtil.getService();
|
||||
return true;
|
||||
} catch (Exception ex) {
|
||||
logger.trace("Development Mode ON");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the storage hub wrapper.
|
||||
*
|
||||
* @param request
|
||||
* the request
|
||||
* @param scopeGroupId
|
||||
* the scope group id. If scopeGroupId is null the scope is read
|
||||
* by using the request else by using the scopeGroupId
|
||||
* @param user
|
||||
* the user
|
||||
* @return the storage hub wrapper
|
||||
* @throws Exception
|
||||
* the exception
|
||||
*/
|
||||
public static StorageHubWrapper getStorageHubWrapper(final HttpServletRequest request, String scopeGroupId,
|
||||
GCubeUser user) throws Exception {
|
||||
|
||||
if (user == null || user.getUsername().isEmpty())
|
||||
throw new Exception("Session expired");
|
||||
|
||||
try {
|
||||
String scope;
|
||||
PortalContext pContext = PortalContext.getConfiguration();
|
||||
if (isWithinPortal() && scopeGroupId != null) {
|
||||
scope = pContext.getCurrentScope(scopeGroupId);
|
||||
logger.debug(scope + " has retrieved by using the scopeGroupId=" + scopeGroupId);
|
||||
} else
|
||||
scope = pContext.getCurrentScope(request);
|
||||
|
||||
logger.debug("Getting " + StorageHubWrapper.class.getSimpleName() + " for user: " + user.getUsername()
|
||||
+ " by using the scope: " + scope);
|
||||
String token = pContext.getCurrentUserToken(scope, user.getUsername());
|
||||
return new StorageHubWrapper(scope, token, false, false, true);
|
||||
} catch (Exception e) {
|
||||
logger.error("Error during getting storageHub wrapper", e);
|
||||
throw new Exception("Error on gettig the StorageHub wrapper for userId: " + user);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This method receives a folder id within the user's workspace and set the list of resources in the dataset bean to be returned.
|
||||
*
|
||||
* @param folderId the folder id
|
||||
* @param userName the user name
|
||||
* @param bean the bean
|
||||
* @param workspace the workspace
|
||||
* @throws Exception the exception
|
||||
*/
|
||||
public static void handleWorkspaceResources(String folderId, String userName,
|
||||
DatasetBean bean) throws Exception {
|
||||
DatasetBean bean, Workspace workspace) throws Exception {
|
||||
|
||||
// get workspace
|
||||
Workspace ws = HomeLibrary
|
||||
.getHomeManagerFactory()
|
||||
.getHomeManager()
|
||||
.getHome().getWorkspace();
|
||||
|
||||
WorkspaceItem originalFolderOrFile = ws.getItem(folderId);
|
||||
WorkspaceItem originalFolderOrFile = workspace.getItem(folderId);
|
||||
|
||||
logger.debug("Item retrieved is " + originalFolderOrFile);
|
||||
|
||||
|
@ -89,7 +150,7 @@ public class WorkspaceUtils {
|
|||
}
|
||||
|
||||
// set them into the bean
|
||||
bean.setResourceRoot(WorkspaceUtils.getTreeFromFolder(folderId, ws));
|
||||
bean.setResourceRoot(WorkspaceUtils.getTreeFromFolder(folderId, workspace));
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -104,15 +165,18 @@ public class WorkspaceUtils {
|
|||
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
|
||||
Map<String, String> properties = null;
|
||||
if(gItem.getPropertyMap()!=null){
|
||||
Map<String, String> map = toSimpleMap(gItem.getPropertyMap());
|
||||
if(map!=null) {
|
||||
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) {
|
||||
} catch (Exception e) {
|
||||
logger.error("Error in server getItemProperties: ", e);
|
||||
}
|
||||
}
|
||||
|
@ -120,19 +184,58 @@ public class WorkspaceUtils {
|
|||
}
|
||||
|
||||
/**
|
||||
* Returns a tree object
|
||||
* @param workspaceFolderId
|
||||
* @param ws
|
||||
* @return ResourceElementBean a tree object
|
||||
* @throws Exception
|
||||
* To simple map.
|
||||
*
|
||||
* @param propertyMap the property map
|
||||
* @return the map
|
||||
*/
|
||||
public static ResourceElementBean getTreeFromFolder(String workspaceFolderId, Workspace ws) throws Exception{
|
||||
public static Map<String, String> toSimpleMap(PropertyMap propertyMap) {
|
||||
|
||||
if (propertyMap == null)
|
||||
return null;
|
||||
|
||||
try {
|
||||
Map<String, String> properties = null;
|
||||
Map<String, Object> map = propertyMap.getValues();
|
||||
|
||||
if (map != null) {
|
||||
properties = new HashMap<String, String>(map.size());
|
||||
for (String key : map.keySet()) {
|
||||
Object theValue = map.get(key);
|
||||
properties.put(key, (String) theValue);
|
||||
}
|
||||
}
|
||||
|
||||
if(properties!=null)
|
||||
logger.error("Converted: "+properties.size()+" property/properties");
|
||||
|
||||
return properties;
|
||||
} catch (Exception e) {
|
||||
logger.error("Error on converting a PropertyMap to simple Map<String,String>: ", e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns a tree object.
|
||||
*
|
||||
* @param workspaceFolderId the workspace folder id
|
||||
* @param workspace the workspace
|
||||
* @return ResourceElementBean a tree object
|
||||
* @throws Exception the exception
|
||||
*/
|
||||
public static ResourceElementBean getTreeFromFolder(String workspaceFolderId, Workspace workspace) throws Exception{
|
||||
|
||||
ResourceElementBean rootElem = new ResourceElementBean();
|
||||
String pathSeparator = ws.getPathSeparator();
|
||||
WorkspaceItem initialItem = ws.getItem(workspaceFolderId);
|
||||
String pathSeparator = "/";
|
||||
|
||||
//String pathSeparator = ws.getPathSeparator();
|
||||
|
||||
|
||||
WorkspaceItem initialItem = workspace.getItem(workspaceFolderId);
|
||||
String fullPathBase = initialItem.getPath();
|
||||
fullPathBase = fullPathBase.endsWith(ws.getPathSeparator()) ? fullPathBase : fullPathBase + ws.getPathSeparator();
|
||||
fullPathBase = fullPathBase.endsWith(pathSeparator) ? fullPathBase : fullPathBase + pathSeparator;
|
||||
rootElem.setFolder(initialItem.isFolder());
|
||||
rootElem.setFullPath(initialItem.getPath().replace(fullPathBase, ""));
|
||||
rootElem.setName(initialItem.getName());
|
||||
|
@ -142,20 +245,27 @@ public class WorkspaceUtils {
|
|||
|
||||
// recursive visiting
|
||||
if(initialItem.isFolder())
|
||||
visit(rootElem, initialItem, fullPathBase, pathSeparator);
|
||||
visit(rootElem, initialItem, workspace, fullPathBase, pathSeparator);
|
||||
|
||||
logger.debug("Tree that is going to be returned is " + rootElem);
|
||||
return rootElem;
|
||||
}
|
||||
|
||||
/**
|
||||
* Recursive visit of a workspace item
|
||||
* @param rootElem
|
||||
* @param initialItemWS
|
||||
* @throws InternalErrorException
|
||||
* Recursive visit of a workspace item.
|
||||
*
|
||||
* @param parent the parent
|
||||
* @param initialItemWS the initial item WS
|
||||
* @param workspace the ws
|
||||
* @param fullPathBase the full path base
|
||||
* @param pathSeparator the path separator
|
||||
* @throws Exception the exception
|
||||
*/
|
||||
private static void visit(ResourceElementBean parent, WorkspaceItem initialItemWS, String fullPathBase, String pathSeparator) throws InternalErrorException {
|
||||
List<? extends WorkspaceItem> children = initialItemWS.getChildren();
|
||||
private static void visit(ResourceElementBean parent, WorkspaceItem initialItemWS, Workspace workspace, String fullPathBase, String pathSeparator) throws Exception {
|
||||
//List<? extends WorkspaceItem> children = initialItemWS.getChildren();
|
||||
|
||||
List<? extends WorkspaceItem> children = workspace.getChildren(initialItemWS.getId());
|
||||
|
||||
ArrayList<ResourceElementBean> childrenInTree = new ArrayList<ResourceElementBean>(children.size());
|
||||
for (WorkspaceItem item : children) {
|
||||
// logger.debug("Path BEFORE REPLACE is " + item.getPath());
|
||||
|
@ -173,16 +283,17 @@ public class WorkspaceUtils {
|
|||
childrenInTree.add(elem);
|
||||
logger.trace("Elem is " + elem);
|
||||
if(item.isFolder())
|
||||
visit(elem, item, fullPathBase, pathSeparator);
|
||||
visit(elem, item, workspace, fullPathBase, pathSeparator);
|
||||
}
|
||||
// add these list as child of the rootElem
|
||||
parent.setChildren(childrenInTree);
|
||||
}
|
||||
|
||||
/**
|
||||
* Replaces the "/" char with a custom one and return an editable name for the user
|
||||
* @param rootElem
|
||||
* @param pathSeparatorInWs
|
||||
* Replaces the "/" char with a custom one and return an editable name for the user.
|
||||
*
|
||||
* @param rootElem the root elem
|
||||
* @param pathSeparatorInWs the path separator in ws
|
||||
*/
|
||||
private static void extractEditableNameFromPath(ResourceElementBean rootElem, String pathSeparatorInWs) {
|
||||
|
||||
|
@ -199,46 +310,23 @@ public class WorkspaceUtils {
|
|||
rootElem.setEditableName(fullPath);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Copy into the .catalogue area folder the checked resources.
|
||||
* There is no difference among a single-file-publish and a folder-publish.
|
||||
* @param folderId
|
||||
* @param userName
|
||||
* @param bean
|
||||
* @return
|
||||
*
|
||||
* @param bean the bean
|
||||
* @param workspace the workspace
|
||||
* @param username the username
|
||||
* @return the list
|
||||
* @throws Exception the exception
|
||||
*/
|
||||
public static List<ResourceBean> copyResourcesToUserCatalogueArea(String folderOrFileId, String userName, DatasetBean bean) throws Exception{
|
||||
public static List<ResourceBean> toResources(DatasetBean bean, Workspace workspace, String username) throws Exception{
|
||||
|
||||
logger.debug("Request to copy onto catalogue area....");
|
||||
List<ResourceBean> resources = new ArrayList<ResourceBean>();
|
||||
WorkspaceItem copiedFolder = null;
|
||||
WorkspaceCatalogue userCatalogue = null;
|
||||
ResourceElementBean rootResource = bean.getResourceRoot();
|
||||
|
||||
// into the .catalogue area of the user's workspace
|
||||
Workspace ws = HomeLibrary
|
||||
.getHomeManagerFactory()
|
||||
.getHomeManager()
|
||||
.getHome()
|
||||
.getWorkspace();
|
||||
|
||||
// Retrieve the catalogue of the user
|
||||
userCatalogue = ws.getCatalogue();
|
||||
|
||||
// get workspace item (it could be a file or a folder)
|
||||
WorkspaceItem originalItem = ws.getItem(folderOrFileId);
|
||||
|
||||
// copy the folder in the catalogue if it is a folder, or create a new folder
|
||||
long referenceTime = System.currentTimeMillis();
|
||||
if(originalItem.isFolder()){
|
||||
copiedFolder = userCatalogue.addWorkspaceItem(folderOrFileId, userCatalogue.getId()); // add to .catalogue root area
|
||||
copiedFolder.setDescription(bean.getDescription());
|
||||
((WorkspaceFolder)copiedFolder).rename(CatalogueUtilMethods.fromProductTitleToName(bean.getTitle()) + "_" + referenceTime);
|
||||
}
|
||||
else{
|
||||
copiedFolder = userCatalogue.createFolder(CatalogueUtilMethods.fromProductTitleToName(bean.getTitle()) + "_" + referenceTime, bean.getDescription());
|
||||
}
|
||||
|
||||
// retrieve the children
|
||||
List<ResourceElementBean> resourcesToAdd = rootResource.getChildren();
|
||||
|
||||
|
@ -250,35 +338,130 @@ public class WorkspaceUtils {
|
|||
logger.debug("Resource to add is " + resource);
|
||||
|
||||
// ok it is a file, so copy it into the copiedFolder
|
||||
WorkspaceItem copiedFile = userCatalogue.addWorkspaceItem(resource.getOriginalIdInWorkspace(), copiedFolder.getId());
|
||||
WorkspaceItem wsItem = workspace.getItem(resource.getOriginalIdInWorkspace());
|
||||
|
||||
// name and description could have been edited
|
||||
copiedFile.setDescription(resource.getDescription());
|
||||
String mimeType = null;
|
||||
if(wsItem instanceof FileItem) {
|
||||
mimeType = ((FileItem)wsItem).getMimeType();
|
||||
}
|
||||
|
||||
// check if it is an external url
|
||||
// check if it is an URLFile
|
||||
String externalUrl = null;
|
||||
try{
|
||||
boolean isExternalUrl = ((FolderItem)copiedFile).getFolderItemType().equals(FolderItemType.EXTERNAL_URL);
|
||||
externalUrl = isExternalUrl ? ((ExternalUrl)copiedFile).getUrl() : null;
|
||||
if(wsItem instanceof URLFile) {
|
||||
URLFile urlFile = (URLFile) wsItem;
|
||||
externalUrl = urlFile.getValue()!=null?urlFile.getValue().toString():null;
|
||||
}
|
||||
|
||||
}catch(Exception e){
|
||||
logger.warn("Unable to check if it is an external url file ", e);
|
||||
}
|
||||
|
||||
resources.add(new ResourceBean(
|
||||
externalUrl != null ? externalUrl : copiedFile.getPublicLink(true),
|
||||
resource.getEditableName(),
|
||||
copiedFile.getDescription(),
|
||||
copiedFile.getId(),
|
||||
userName,
|
||||
null, // dataset id, to be set
|
||||
((FolderItem)copiedFile).getMimeType()));
|
||||
String resourceURL = externalUrl;
|
||||
|
||||
// postpone rename operation
|
||||
copiedFile.rename(resource.getEditableName());
|
||||
//it is not a URLFile
|
||||
if(resourceURL==null) {
|
||||
//getting public link of file
|
||||
URL publicLink = workspace.getPublicLinkForFile(resource.getOriginalIdInWorkspace());
|
||||
if(publicLink!=null)
|
||||
resourceURL = publicLink.toString();
|
||||
}
|
||||
|
||||
resources.add(new ResourceBean(resourceURL,
|
||||
resource.getEditableName(),
|
||||
resource.getDescription(),
|
||||
wsItem.getId(),
|
||||
username,
|
||||
null, // dataset id, to be set
|
||||
mimeType));
|
||||
}
|
||||
|
||||
}
|
||||
return resources;
|
||||
}
|
||||
|
||||
// //MOVED TO GCAT
|
||||
// /**
|
||||
// * Copy into the .catalogue area folder the checked resources.
|
||||
// * There is no difference among a single-file-publish and a folder-publish.
|
||||
// * @param folderId
|
||||
// * @param userName
|
||||
// * @param bean
|
||||
// * @return
|
||||
// */
|
||||
// public static List<ResourceBean> copyResourcesToUserCatalogueArea(String folderOrFileId, String userName, DatasetBean bean) throws Exception{
|
||||
//
|
||||
// logger.debug("Request to copy onto catalogue area....");
|
||||
// List<ResourceBean> resources = new ArrayList<ResourceBean>();
|
||||
// WorkspaceItem copiedFolder = null;
|
||||
// WorkspaceCatalogue userCatalogue = null;
|
||||
// ResourceElementBean rootResource = bean.getResourceRoot();
|
||||
//
|
||||
// // into the .catalogue area of the user's workspace
|
||||
// Workspace ws = HomeLibrary
|
||||
// .getHomeManagerFactory()
|
||||
// .getHomeManager()
|
||||
// .getHome()
|
||||
// .getWorkspace();
|
||||
//
|
||||
// // Retrieve the catalogue of the user
|
||||
// userCatalogue = ws.getCatalogue();
|
||||
//
|
||||
// // get workspace item (it could be a file or a folder)
|
||||
// WorkspaceItem originalItem = ws.getItem(folderOrFileId);
|
||||
//
|
||||
// // copy the folder in the catalogue if it is a folder, or create a new folder
|
||||
// long referenceTime = System.currentTimeMillis();
|
||||
// if(originalItem.isFolder()){
|
||||
// copiedFolder = userCatalogue.addWorkspaceItem(folderOrFileId, userCatalogue.getId()); // add to .catalogue root area
|
||||
// copiedFolder.setDescription(bean.getDescription());
|
||||
// ((WorkspaceFolder)copiedFolder).rename(CatalogueUtilMethods.fromProductTitleToName(bean.getTitle()) + "_" + referenceTime);
|
||||
// }
|
||||
// else{
|
||||
// copiedFolder = userCatalogue.createFolder(CatalogueUtilMethods.fromProductTitleToName(bean.getTitle()) + "_" + referenceTime, bean.getDescription());
|
||||
// }
|
||||
//
|
||||
// // retrieve the children
|
||||
// List<ResourceElementBean> resourcesToAdd = rootResource.getChildren();
|
||||
//
|
||||
// // copy only the selected ones
|
||||
// for(ResourceElementBean resource : resourcesToAdd){
|
||||
//
|
||||
// if (resource.isToBeAdded()) {
|
||||
//
|
||||
// logger.debug("Resource to add is " + resource);
|
||||
//
|
||||
// // ok it is a file, so copy it into the copiedFolder
|
||||
// WorkspaceItem copiedFile = userCatalogue.addWorkspaceItem(resource.getOriginalIdInWorkspace(), copiedFolder.getId());
|
||||
//
|
||||
// // name and description could have been edited
|
||||
// copiedFile.setDescription(resource.getDescription());
|
||||
//
|
||||
// // check if it is an external url
|
||||
// String externalUrl = null;
|
||||
// try{
|
||||
// boolean isExternalUrl = ((FolderItem)copiedFile).getFolderItemType().equals(FolderItemType.EXTERNAL_URL);
|
||||
// externalUrl = isExternalUrl ? ((ExternalUrl)copiedFile).getUrl() : null;
|
||||
// }catch(Exception e){
|
||||
// logger.warn("Unable to check if it is an external url file ", e);
|
||||
// }
|
||||
//
|
||||
// resources.add(new ResourceBean(
|
||||
// externalUrl != null ? externalUrl : copiedFile.getPublicLink(true),
|
||||
// resource.getEditableName(),
|
||||
// copiedFile.getDescription(),
|
||||
// copiedFile.getId(),
|
||||
// userName,
|
||||
// null, // dataset id, to be set
|
||||
// ((FolderItem)copiedFile).getMimeType()));
|
||||
//
|
||||
// // postpone rename operation
|
||||
// copiedFile.rename(resource.getEditableName());
|
||||
// }
|
||||
//
|
||||
// }
|
||||
// return resources;
|
||||
// }
|
||||
|
||||
|
||||
}
|
Loading…
Reference in New Issue