IMAP refactoring

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@14288 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Logneon
2009-05-12 18:33:46 +00:00
parent 0825764cc9
commit 449a7e7556
2 changed files with 90 additions and 168 deletions

View File

@@ -24,7 +24,6 @@
*/
package org.alfresco.repo.imap;
import java.io.Serializable;
import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedList;
@@ -37,7 +36,6 @@ import org.alfresco.model.ImapModel;
import org.alfresco.repo.imap.config.ImapConfigElement.ImapConfig;
import org.alfresco.repo.imap.exception.AlfrescoImapFolderException;
import org.alfresco.repo.model.filefolder.FileFolderServiceImpl;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.model.FileExistsException;
import org.alfresco.service.cmr.model.FileFolderService;
@@ -47,7 +45,6 @@ import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.security.AccessStatus;
import org.alfresco.service.cmr.security.PermissionService;
import org.alfresco.service.namespace.QName;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -94,6 +91,7 @@ public class AlfrescoImapHostManager implements ImapHostManager
public Collection<MailFolder> listMailboxes(GreenMailUser user, String mailboxPattern) throws FolderException
{
mailboxPattern = GreenMailUtil.convertFromUtf7(mailboxPattern);
if (logger.isDebugEnabled())
{
logger.debug("Listing mailboxes: mailboxPattern=" + mailboxPattern);
@@ -103,146 +101,7 @@ public class AlfrescoImapHostManager implements ImapHostManager
{
logger.debug("Listing mailboxes: mailboxPattern in alfresco=" + mailboxPattern);
}
Collection<MailFolder> result = new LinkedList<MailFolder>();
Map<String, NodeRef> mountPoints = imapHelper.getMountPoints();
Map<String, ImapConfig> imapConfigs = imapHelper.getImapConfigs();
NodeRef mountPoint;
for (String mountPointName : mountPoints.keySet())
{
mountPoint = mountPoints.get(mountPointName);
FileInfo mountPointFileInfo = imapHelper.getFileFolderService().getFileInfo(mountPoint);
NodeRef mountParent = imapHelper.getNodeService().getParentAssocs(mountPoint).get(0).getParentRef();
String mode = imapConfigs.get(mountPointName).getMode();
if (!mailboxPattern.equals("*"))
{
mountPoint = mountParent;
}
boolean isVirtualView = imapConfigs.get(mountPointName).getMode().equals(AlfrescoImapConst.MODE_VIRTUAL);
Collection<FileInfo> folders = listFolder(mountPoint, user, mailboxPattern, isVirtualView);
if (folders != null)
{
for (FileInfo folder : folders)
{
result.add(new AlfrescoImapMailFolder(user.getQualifiedMailboxName(), folder, folder.getName(), mode, mountParent, mountPointName, imapHelper));
}
}
if (mailboxPattern.equals("*"))
{
result.add(new AlfrescoImapMailFolder(user.getQualifiedMailboxName(), mountPointFileInfo, mountPointName, mode, mountParent, mountPointName, imapHelper));
}
}
mountPoint = imapHelper.getUserImapHomeRef(user.getLogin());
Collection<FileInfo> imapFolders = listFolder(mountPoint, user, mailboxPattern, false);
if (imapFolders != null)
{
for (FileInfo imapFolder : imapFolders)
{
result.add(new AlfrescoImapMailFolder(user.getQualifiedMailboxName(), imapFolder, imapFolder.getName(), AlfrescoImapConst.MODE_ARCHIVE, mountPoint, null,
imapHelper));
}
}
return result;
}
private Collection<FileInfo> listFolder(NodeRef root, GreenMailUser user, String mailboxPattern, boolean isVirtualView) throws FolderException
{
if (logger.isDebugEnabled())
{
logger.debug("Listing mailboxes: mailboxPattern=" + mailboxPattern);
}
Collection<FileInfo> result = new LinkedList<FileInfo>();
int index = mailboxPattern.indexOf(AlfrescoImapConst.HIERARCHY_DELIMITER);
String name = null;
String remainName = null;
if (index < 0)
{
name = mailboxPattern;
}
else
{
name = mailboxPattern.substring(0, index);
remainName = mailboxPattern.substring(index + 1);
}
if (logger.isDebugEnabled())
{
logger.debug("Listing mailboxes: name=" + name);
}
if (index < 0)
{
if ("*".equals(name))
{
List<FileInfo> list = imapHelper.searchFolders(root, name, true, isVirtualView);
if (list.size() > 0)
{
return list;
}
return null;
}
else if (name.endsWith("*"))
{
List<FileInfo> list = imapHelper.searchFolders(root, name.replace('%', '*'), false, isVirtualView);
if (list.size() > 0)
{
result.addAll(list);
for (FileInfo fileInfo : list)
{
List<FileInfo> childList = imapHelper.searchFolders(fileInfo.getNodeRef(), "*", true, isVirtualView);
result.addAll(childList);
}
return result;
}
return null;
}
else if (name.contains("%") || name.contains("*"))
{
List<FileInfo> list = imapHelper.searchFolders(root, name.replace('%', '*'), false, isVirtualView);
if (list.size() > 0)
{
return list;
}
return null;
}
else
{
List<FileInfo> list = imapHelper.searchFolders(root, name, false, isVirtualView);
if (list.size() > 0)
{
return list;
}
return null;
}
}
List<FileInfo> list = imapHelper.searchFolders(root, name.replace('%', '*'), false, isVirtualView);
for (FileInfo folder : list)
{
Collection<FileInfo> childFolders = listFolder(folder.getNodeRef(), user, remainName, isVirtualView);
if (childFolders != null)
{
result.addAll(childFolders);
}
}
if (result.isEmpty())
{
return null;
}
return result;
return listMailboxes(user, mailboxPattern, false);
}
/**
@@ -257,6 +116,8 @@ public class AlfrescoImapHostManager implements ImapHostManager
*/
public Collection<MailFolder> listSubscribedMailboxes(GreenMailUser user, String mailboxPattern) throws FolderException
{
mailboxPattern = GreenMailUtil.convertFromUtf7(mailboxPattern);
if (logger.isDebugEnabled())
{
logger.debug("Listing subscribed mailboxes: mailboxPattern=" + mailboxPattern);
@@ -267,6 +128,14 @@ public class AlfrescoImapHostManager implements ImapHostManager
logger.debug("Listing subscribed mailboxes: mailboxPattern in alfresco=" + mailboxPattern);
}
return listMailboxes(user, mailboxPattern, true);
}
/**
* Depend on listSubscribed param, list Mailboxes or list subscribed Mailboxes
*/
private Collection<MailFolder> listMailboxes(GreenMailUser user, String mailboxPattern, boolean listSubscribed) throws FolderException
{
Collection<MailFolder> result = new LinkedList<MailFolder>();
Map<String, NodeRef> mountPoints = imapHelper.getMountPoints();
@@ -274,6 +143,7 @@ public class AlfrescoImapHostManager implements ImapHostManager
NodeRef mountPoint;
// List mailboxes that are in mount points
for (String mountPointName : mountPoints.keySet())
{
@@ -288,7 +158,7 @@ public class AlfrescoImapHostManager implements ImapHostManager
}
boolean isVirtualView = imapConfigs.get(mountPointName).getMode().equals(AlfrescoImapConst.MODE_VIRTUAL);
Collection<MailFolder> folders = listSubscribedFolder(mountPoint, mountPoint, user, mailboxPattern, isVirtualView);
Collection<MailFolder> folders = listFolder(mountPoint, mountPoint, user, mailboxPattern, listSubscribed, isVirtualView);
if (folders != null)
{
for (MailFolder mailFolder : folders)
@@ -301,14 +171,15 @@ public class AlfrescoImapHostManager implements ImapHostManager
result.addAll(folders);
}
// Add mount point to the result list
if (mailboxPattern.equals("*"))
{
if (isSubscribed(mountPointFileInfo, user.getLogin()))
if ((listSubscribed && isSubscribed(mountPointFileInfo, user.getLogin())) || (!listSubscribed))
{
result.add(new AlfrescoImapMailFolder(user.getQualifiedMailboxName(), mountPointFileInfo, mountPointName, viewMode, mountParent, mountPointName, imapHelper));
}
// \NoSelect
else if (hasSubscribedChild(mountPointFileInfo, user.getLogin(), isVirtualView))
else if (listSubscribed && hasSubscribedChild(mountPointFileInfo, user.getLogin(), isVirtualView))
{
result.add(new AlfrescoImapMailFolder(user.getQualifiedMailboxName(), mountPointFileInfo, mountPointName, viewMode, mountParent, mountPointName, imapHelper,
false));
@@ -317,20 +188,27 @@ public class AlfrescoImapHostManager implements ImapHostManager
}
NodeRef root = imapHelper.getSpacesStoreNodeRef();
root = imapHelper.getUserImapHomeRef(user.getLogin());
Collection<MailFolder> imapFolders = listSubscribedFolder(root, root, user, mailboxPattern, false);
// List mailboxes that are in user IMAP Home
NodeRef root = imapHelper.getUserImapHomeRef(user.getLogin());
Collection<MailFolder> imapFolders = listFolder(root, root, user, mailboxPattern, listSubscribed, false);
if (imapFolders != null)
{
for (MailFolder mailFolder : imapFolders)
{
AlfrescoImapMailFolder folder = (AlfrescoImapMailFolder) mailFolder;
folder.setViewMode(AlfrescoImapConst.MODE_ARCHIVE);
folder.setMountParent(root);
}
result.addAll(imapFolders);
}
return result;
}
private Collection<MailFolder> listSubscribedFolder(NodeRef mailboxRoot, NodeRef root, GreenMailUser user, String mailboxPattern, boolean isVirtualView) throws FolderException
private Collection<MailFolder> listFolder(NodeRef mailboxRoot, NodeRef root, GreenMailUser user, String mailboxPattern, boolean listSubscribed, boolean isVirtualView)
throws FolderException
{
if (logger.isDebugEnabled())
{
@@ -361,12 +239,15 @@ public class AlfrescoImapHostManager implements ImapHostManager
{
if ("*".equals(name))
{
List<FileInfo> list = imapHelper.searchFolders(root, name, true, isVirtualView);
Collection<FileInfo> subscribedList = getSubscribed(list, user.getLogin());
if (subscribedList.size() > 0)
Collection<FileInfo> list = imapHelper.searchFolders(root, name, true, isVirtualView);
if (listSubscribed)
{
return createMailFolderList(user, subscribedList, mailboxRoot);
list = getSubscribed(list, user.getLogin());
}
if (list.size() > 0)
{
return createMailFolderList(user, list, mailboxRoot);
}
return null;
}
@@ -374,7 +255,11 @@ public class AlfrescoImapHostManager implements ImapHostManager
{
List<FileInfo> fullList = new LinkedList<FileInfo>();
List<FileInfo> list = imapHelper.searchFolders(root, name.replace('%', '*'), false, isVirtualView);
Collection<FileInfo> subscribedList = getSubscribed(list, user.getLogin());
Collection<FileInfo> subscribedList = list;
if (listSubscribed)
{
subscribedList = getSubscribed(list, user.getLogin());
}
if (list.size() > 0)
{
@@ -382,7 +267,14 @@ public class AlfrescoImapHostManager implements ImapHostManager
for (FileInfo fileInfo : list)
{
List<FileInfo> childList = imapHelper.searchFolders(fileInfo.getNodeRef(), "*", true, isVirtualView);
if (listSubscribed)
{
fullList.addAll(getSubscribed(childList, user.getLogin()));
}
else
{
fullList.addAll(childList);
}
}
return createMailFolderList(user, fullList, mailboxRoot);
}
@@ -393,27 +285,38 @@ public class AlfrescoImapHostManager implements ImapHostManager
List<FileInfo> list = imapHelper.searchFolders(root, "*", false, isVirtualView);
LinkedList<MailFolder> subscribedList = new LinkedList<MailFolder>();
if (listSubscribed)
{
for (FileInfo fileInfo : list)
{
if (isSubscribed(fileInfo, user.getLogin()))
{
// folderName, viewMode, mountPointName will be setted in listSubscribedMailboxes() method
// folderName, viewMode, mountPointName will be setted in listMailboxes() method
subscribedList.add(new AlfrescoImapMailFolder(user.getQualifiedMailboxName(), fileInfo, null, null, mailboxRoot, null, imapHelper));
}
// \NoSelect
else if (hasSubscribedChild(fileInfo, user.getLogin(), isVirtualView))
{
// folderName, viewMode, mountPointName will be setted in listSubscribedMailboxes() method
// folderName, viewMode, mountPointName will be setted in listMailboxes() method
subscribedList.add(new AlfrescoImapMailFolder(user.getQualifiedMailboxName(), fileInfo, null, null, mailboxRoot, null, imapHelper, false));
}
}
}
else
{
return createMailFolderList(user, list, mailboxRoot);
}
return subscribedList;
}
else if (name.contains("%") || name.contains("*"))
{
List<FileInfo> list = imapHelper.searchFolders(root, name.replace('%', '*'), false, isVirtualView);
Collection<FileInfo> subscribedList = getSubscribed(list, user.getLogin());
Collection<FileInfo> subscribedList = list;
if (listSubscribed)
{
subscribedList = getSubscribed(list, user.getLogin());
}
if (subscribedList.size() > 0)
{
@@ -424,7 +327,11 @@ public class AlfrescoImapHostManager implements ImapHostManager
else
{
List<FileInfo> list = imapHelper.searchFolders(root, name, false, isVirtualView);
Collection<FileInfo> subscribedList = getSubscribed(list, user.getLogin());
Collection<FileInfo> subscribedList = list;
if (listSubscribed)
{
subscribedList = getSubscribed(list, user.getLogin());
}
if (subscribedList.size() > 0)
{
@@ -440,7 +347,7 @@ public class AlfrescoImapHostManager implements ImapHostManager
List<FileInfo> list = imapHelper.searchFolders(root, name.replace('%', '*'), false, isVirtualView);
for (FileInfo folder : list)
{
Collection<MailFolder> childFolders = listSubscribedFolder(mailboxRoot, folder.getNodeRef(), user, remainName, isVirtualView);
Collection<MailFolder> childFolders = listFolder(mailboxRoot, folder.getNodeRef(), user, remainName, listSubscribed, isVirtualView);
if (childFolders != null)
{
@@ -611,7 +518,6 @@ public class AlfrescoImapHostManager implements ImapHostManager
}
FileInfo mailFolder = FileFolderServiceImpl.makeFolders(fileFolderService, parentNodeRef, Arrays.asList(folderName), ContentModel.TYPE_FOLDER);
return new AlfrescoImapMailFolder(user.getQualifiedMailboxName(), mailFolder, folderName, imapHelper.getViewMode(mailboxName), root, mountPointName, imapHelper);
}
@@ -884,7 +790,7 @@ public class AlfrescoImapHostManager implements ImapHostManager
}
private Collection<FileInfo> getSubscribed(List<FileInfo> list, String userName)
private Collection<FileInfo> getSubscribed(Collection<FileInfo> list, String userName)
{
Collection<FileInfo> result = new LinkedList<FileInfo>();

View File

@@ -77,7 +77,7 @@ import org.springframework.context.ApplicationEvent;
*
* @author Dmitry Vaserin
*/
public class ImapHelper extends AbstractLifecycleBean
/*package*/class ImapHelper extends AbstractLifecycleBean
{
private static Log logger = LogFactory.getLog(ImapHelper.class);
@@ -385,11 +385,27 @@ public class ImapHelper extends AbstractLifecycleBean
/**
* @param userName user name
* @return user IMAP home reference
* @return user IMAP home reference and create it if it doesn't exist.
*/
public NodeRef getUserImapHomeRef(String userName)
public NodeRef getUserImapHomeRef(final String userName)
{
return fileFolderService.searchSimple(imapRootNodeRef, userName);
NodeRef userHome = fileFolderService.searchSimple(imapRootNodeRef, userName);
if (userHome == null)
{
// create user home
userHome = AuthenticationUtil.runAs(new AuthenticationUtil.RunAsWork<NodeRef>()
{
public NodeRef doWork() throws Exception
{
NodeRef result = fileFolderService.create(imapRootNodeRef, userName, ContentModel.TYPE_FOLDER).getNodeRef();
nodeService.setProperty(result, ContentModel.PROP_DESCRIPTION, userName);
// create inbox
fileFolderService.create(result, AlfrescoImapConst.INBOX_NAME, ContentModel.TYPE_FOLDER);
return result;
}
}, AuthenticationUtil.getSystemUserName());
}
return userHome;
}
public String getCurrentUser()