diff --git a/config/alfresco/public-services-security-context.xml b/config/alfresco/public-services-security-context.xml index c92f1f9727..dfa3052245 100644 --- a/config/alfresco/public-services-security-context.xml +++ b/config/alfresco/public-services-security-context.xml @@ -440,6 +440,7 @@ org.alfresco.service.cmr.model.FileFolderService.getNameOnlyPath=ACL_NODE.1.sys:base.ReadProperties org.alfresco.service.cmr.model.FileFolderService.resolveNamePath=ACL_ALLOW,AFTER_ACL_NODE.sys:base.ReadProperties org.alfresco.service.cmr.model.FileFolderService.getFileInfo=ACL_NODE.0.sys:base.ReadProperties + org.alfresco.service.cmr.model.FileFolderService.toFileInfoList=ACL_ALLOW org.alfresco.service.cmr.model.FileFolderService.getReader=ACL_NODE.0.sys:base.ReadContent org.alfresco.service.cmr.model.FileFolderService.getWriter=ACL_NODE.0.sys:base.WriteContent org.alfresco.service.cmr.model.FileFolderService.exists=ACL_ALLOW diff --git a/source/java/org/alfresco/repo/imap/ImapServiceImpl.java b/source/java/org/alfresco/repo/imap/ImapServiceImpl.java index 41ed28891c..20ba3808f4 100644 --- a/source/java/org/alfresco/repo/imap/ImapServiceImpl.java +++ b/source/java/org/alfresco/repo/imap/ImapServiceImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2013 Alfresco Software Limited. + * Copyright (C) 2005-2014 Alfresco Software Limited. * * This file is part of Alfresco * @@ -22,7 +22,6 @@ import static org.alfresco.repo.imap.AlfrescoImapConst.DICTIONARY_TEMPLATE_PREFI import java.io.IOException; import java.io.Serializable; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; @@ -65,7 +64,6 @@ import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork; import org.alfresco.repo.security.permissions.AccessDeniedException; import org.alfresco.repo.site.SiteModel; -import org.alfresco.repo.site.SiteServiceException; import org.alfresco.repo.transaction.AlfrescoTransactionSupport; import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback; import org.alfresco.repo.transaction.TransactionListenerAdapter; @@ -81,7 +79,6 @@ import org.alfresco.service.cmr.preference.PreferenceService; import org.alfresco.service.cmr.repository.AssociationRef; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.ContentData; -import org.alfresco.service.cmr.repository.InvalidNodeRefException; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.StoreRef; @@ -1127,7 +1124,17 @@ public class ImapServiceImpl implements ImapService, OnRestoreNodePolicy, OnCrea FileFilterMode.setClient(Client.imap); try { - list = fileFolderService.listFolders(root); + // Check if the mount point is site root + // then shortcut to user's favorite sites + // MNT-12055 + if (serviceRegistry.getSiteService().getSiteRoot().equals(root)) + { + list = fileFolderService.toFileInfoList(filter.favs); + } + else + { + list = fileFolderService.listFolders(root); + } } finally { @@ -1320,57 +1327,25 @@ public class ImapServiceImpl implements ImapService, OnRestoreNodePolicy, OnCrea Map prefs = preferenceService.getPreferences( userName, AlfrescoImapConst.PREF_IMAP_FAVOURITE_SITES); - /** - * List the user's sites - */ - List sites = serviceRegistry.getTransactionService() - .getRetryingTransactionHelper().doInTransaction( - new RetryingTransactionCallback>() - { - public List execute() throws Exception - { - List res = new ArrayList(); - try - { - - res = serviceRegistry.getSiteService() - .listSites(userName); - } - catch (SiteServiceException e) - { - // Do nothing. Root sites folder was not - // created. - if (logger.isDebugEnabled()) - { - logger.warn("[getFavouriteSites] Root sites folder was not created."); - } - } - catch (InvalidNodeRefException e) - { - // Do nothing. Root sites folder was - // deleted. - if (logger.isDebugEnabled()) - { - logger.warn("[getFavouriteSites] Root sites folder was deleted."); - } - } - - return res; - } - }, false, true); - - for (SiteInfo siteInfo : sites) + for (String key : prefs.keySet()) { - String key = AlfrescoImapConst.PREF_IMAP_FAVOURITE_SITES + "." - + siteInfo.getShortName(); Boolean isImapFavourite = (Boolean) prefs.get(key); if (isImapFavourite != null && isImapFavourite) { - if(logger.isDebugEnabled()) + String siteName = key.substring(AlfrescoImapConst.PREF_IMAP_FAVOURITE_SITES.length() + 1); // count the dot + boolean isMember = serviceRegistry.getSiteService().isMember(siteName, userName); + if (isMember) { - logger.debug("[getFavouriteSites] User: " + userName + " Favourite site: " + siteInfo.getShortName()); + SiteInfo siteInfo = serviceRegistry.getSiteService().getSite(siteName); + if (siteInfo != null) + { + if(logger.isDebugEnabled()) + { + logger.debug("[getFavouriteSites] User: " + userName + " Favourite site: " + siteInfo.getShortName()); + } + favSites.add(siteInfo.getNodeRef()); + } } - favSites.add(siteInfo.getNodeRef()); } } if (logger.isDebugEnabled()) diff --git a/source/java/org/alfresco/repo/model/filefolder/FileFolderServiceImpl.java b/source/java/org/alfresco/repo/model/filefolder/FileFolderServiceImpl.java index 4d36c2ccfb..ebc138726c 100644 --- a/source/java/org/alfresco/repo/model/filefolder/FileFolderServiceImpl.java +++ b/source/java/org/alfresco/repo/model/filefolder/FileFolderServiceImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2013 Alfresco Software Limited. + * Copyright (C) 2005-2014 Alfresco Software Limited. * * This file is part of Alfresco * @@ -25,6 +25,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; +import java.util.LinkedList; import java.util.List; import java.util.Locale; import java.util.Map; @@ -285,6 +286,21 @@ public class FileFolderServiceImpl extends AbstractBaseCopyService implements Fi return fileInfo; } + public List toFileInfoList(List nodeRefs) + { + List fileInfos = new LinkedList(); + for (NodeRef nodeRef : nodeRefs) + { + // Use service proxy + FileInfo fileInfo = this.getFileInfo(nodeRef); + if (fileInfo != null) + { + fileInfos.add(fileInfo); + } + } + return fileInfos; + } + /** * Exception when the type is not a valid File or Folder type * diff --git a/source/java/org/alfresco/service/cmr/model/FileFolderService.java b/source/java/org/alfresco/service/cmr/model/FileFolderService.java index dbabaf0144..675dbd3fdf 100644 --- a/source/java/org/alfresco/service/cmr/model/FileFolderService.java +++ b/source/java/org/alfresco/service/cmr/model/FileFolderService.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2011 Alfresco Software Limited. + * Copyright (C) 2005-2014 Alfresco Software Limited. * * This file is part of Alfresco * @@ -443,4 +443,13 @@ public interface FileFolderService @Auditable(parameters = {"rootNodeRef"}) public PagingResults list(NodeRef rootNodeRef, Set searchTypeQNames, Set ignoreAspectQNames, List> sortProps, PagingRequest pagingRequest); + + /** + * Helper method to transform a list of {@link NodeRef} to a list of {@link FileInfo} + * + * @param nodeRefs + * @return list of {@link FileInfo} + */ + @Auditable(parameters = {"nodeRefs"}) + public List toFileInfoList(List nodeRefs); }