diff --git a/config/alfresco/cache-context.xml b/config/alfresco/cache-context.xml
index 6f914a2fbc..c1bcea9a32 100644
--- a/config/alfresco/cache-context.xml
+++ b/config/alfresco/cache-context.xml
@@ -205,7 +205,7 @@
org.alfresco.cache.node.nodesTransactionalCache
-
+
@@ -238,7 +238,7 @@
org.alfresco.cache.node.aspectsTransactionalCache
-
+
@@ -271,7 +271,7 @@
org.alfresco.cache.node.propertiesTransactionalCache
-
+
@@ -304,7 +304,7 @@
org.alfresco.cache.node.parentAssocsTransactionalCache
-
+
@@ -586,7 +586,7 @@
org.alfresco.nodeOwnerTransactionalCache
-
+
@@ -859,7 +859,7 @@
org.alfresco.aclTransactionalCache
-
+
@@ -1243,5 +1243,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ org.alfresco.cache.imapMessageCache
+
+
+
+
+
+
+
+
+
+
+
+
+ org.alfresco.cache.imapMessageTransactionalCache
+
+
+
+
+
diff --git a/config/alfresco/ehcache-default.xml b/config/alfresco/ehcache-default.xml
index 429564cbf4..9890c62d23 100644
--- a/config/alfresco/ehcache-default.xml
+++ b/config/alfresco/ehcache-default.xml
@@ -51,33 +51,29 @@
/>
@@ -206,7 +202,7 @@
-
+
@@ -144,10 +144,10 @@
@@ -163,10 +163,10 @@
@@ -182,10 +182,8 @@
@@ -474,7 +472,7 @@
-
+
d:boolean
-
-
+
+
+
UIDVALIDITY
d:long
-
+
+
+ MAXUID
+ d:long
+
+
+ CHANGETOKEN
+ d:text
+
-
+
diff --git a/config/alfresco/subsystems/imap/default/imap-server-context.xml b/config/alfresco/subsystems/imap/default/imap-server-context.xml
index e1e16ad96a..f6ff15241f 100644
--- a/config/alfresco/subsystems/imap/default/imap-server-context.xml
+++ b/config/alfresco/subsystems/imap/default/imap-server-context.xml
@@ -19,8 +19,8 @@
${imap.server.enabled}
-
-
+
+
@@ -84,49 +84,11 @@
- ${server.transaction.mode.readOnly}
- ${server.transaction.mode.default}
- ${server.transaction.mode.default}
- ${server.transaction.mode.readOnly}
${server.transaction.mode.default}
-
-
-
-
-
-
-
-
- org.alfresco.cache.imapFoldersCache
-
-
-
-
-
-
-
-
-
-
-
-
-
- org.alfresco.repo.cache.SimpleCache
-
-
-
-
-
-
-
-
-
-
-
@@ -134,8 +96,8 @@
-
-
+
+
@@ -148,9 +110,8 @@
-
-
-
+
+
@@ -174,6 +135,9 @@
+
+ ${imap.server.folder.cache.size}
+
${imap.server.enabled}
@@ -197,16 +161,6 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/config/alfresco/subsystems/imap/default/imap-server.properties b/config/alfresco/subsystems/imap/default/imap-server.properties
index 36d5aa6a2a..73f046d6a5 100644
--- a/config/alfresco/subsystems/imap/default/imap-server.properties
+++ b/config/alfresco/subsystems/imap/default/imap-server.properties
@@ -1,6 +1,7 @@
imap.server.enabled=false
imap.server.port=143
imap.server.host=0.0.0.0
+imap.server.folder.cache.size=10000
imap.mail.from.default=alfresco@demo.alfresco.org
imap.mail.to.default=alfresco@demo.alfresco.org
diff --git a/source/java/org/alfresco/model/ImapModel.java b/source/java/org/alfresco/model/ImapModel.java
index dcf0144a42..63da60ed04 100644
--- a/source/java/org/alfresco/model/ImapModel.java
+++ b/source/java/org/alfresco/model/ImapModel.java
@@ -57,5 +57,7 @@ public interface ImapModel
static final QName PROP_ATTACH_ID = QName.createQName(IMAP_MODEL_1_0_URI, "attachID");
static final QName PROP_UIDVALIDITY = QName.createQName(IMAP_MODEL_1_0_URI, "uidValidity");
+ static final QName PROP_MAXUID = QName.createQName(IMAP_MODEL_1_0_URI, "maxUid");
+ static final QName PROP_CHANGE_TOKEN = QName.createQName(IMAP_MODEL_1_0_URI, "changeToken");
}
diff --git a/source/java/org/alfresco/repo/cache/CacheTest.java b/source/java/org/alfresco/repo/cache/CacheTest.java
index b41ff5a2bf..621dd0e64e 100644
--- a/source/java/org/alfresco/repo/cache/CacheTest.java
+++ b/source/java/org/alfresco/repo/cache/CacheTest.java
@@ -240,11 +240,11 @@ public class CacheTest extends TestCase
// check that backing cache was updated with the in-transaction changes
assertFalse("Item was not removed from backing cache", backingCache.contains(NEW_GLOBAL_ONE));
assertNull("Item could still be fetched from backing cache", backingCache.get(NEW_GLOBAL_ONE));
- assertEquals("Item not updated in backing cache", null, backingCache.get(UPDATE_TXN_THREE));
+ assertEquals("Item not updated in backing cache", "XXX", backingCache.get(UPDATE_TXN_THREE));
// Check that the transactional cache serves get requests
- assertEquals("Transactional cache must serve post-commit get requests",
- null, transactionalCache.get(UPDATE_TXN_THREE));
+ assertEquals("Transactional cache must serve post-commit get requests", "XXX",
+ transactionalCache.get(UPDATE_TXN_THREE));
}
catch (Throwable e)
{
diff --git a/source/java/org/alfresco/repo/cache/TransactionalCache.java b/source/java/org/alfresco/repo/cache/TransactionalCache.java
index 2486df6dfb..50834f1c03 100644
--- a/source/java/org/alfresco/repo/cache/TransactionalCache.java
+++ b/source/java/org/alfresco/repo/cache/TransactionalCache.java
@@ -856,7 +856,11 @@ public class TransactionalCache
else
{
// Mutable, read-write
- if (sharedObj != null)
+ if (sharedObj == null)
+ {
+ sharedCache.put(key, value);
+ }
+ else
{
// Remove new value in the cache
sharedCache.remove(key);
diff --git a/source/java/org/alfresco/repo/content/metadata/RFC822MetadataExtracter.java b/source/java/org/alfresco/repo/content/metadata/RFC822MetadataExtracter.java
index 22ea98ea24..d9a482cdb8 100644
--- a/source/java/org/alfresco/repo/content/metadata/RFC822MetadataExtracter.java
+++ b/source/java/org/alfresco/repo/content/metadata/RFC822MetadataExtracter.java
@@ -134,7 +134,7 @@ public class RFC822MetadataExtracter extends AbstractMappingMetadataExtracter
{
String lastReceived = rx[0];
lastReceived = MimeUtility.unfold(lastReceived);
- int x = lastReceived.indexOf(';');
+ int x = lastReceived.lastIndexOf(';');
if(x > 0)
{
String dateStr = lastReceived.substring(x + 1).trim();
diff --git a/source/java/org/alfresco/repo/imap/AbstractImapFolder.java b/source/java/org/alfresco/repo/imap/AbstractImapFolder.java
index 558489374b..a823e10d0c 100644
--- a/source/java/org/alfresco/repo/imap/AbstractImapFolder.java
+++ b/source/java/org/alfresco/repo/imap/AbstractImapFolder.java
@@ -161,37 +161,6 @@ public abstract class AbstractImapFolder implements MailFolder
}
- /**
- * Returns the number of the first unseen message.
- *
- * @return Number of the first unseen message.
- */
- public int getFirstUnseen()
- {
- return getFirstUnseenInternal();
- }
-
-
- /**
- * Returns full name of the folder with namespace and full path delimited with the hierarchy delimiter
- * (see {@link AlfrescoImapConst#HIERARCHY_DELIMITER})
- * E.g.:
- * #mail.admin."Repository_archive.Data Dictionary.Space Templates.Software Engineering Project"
- * This is required by GreenMail implementation.
- */
- public String getFullName()
- {
- CommandCallback command = new CommandCallback()
- {
- public String command() throws Throwable
- {
- return getFullNameInternal();
- }
- };
- return command.run();
- }
-
-
/**
* Returns message by its UID.
*
@@ -210,23 +179,6 @@ public abstract class AbstractImapFolder implements MailFolder
return command.run();
}
- /**
- * Returns count of the messages in the folder.
- *
- * @return Count of the messages.
- */
- public int getMessageCount()
- {
- CommandCallback command = new CommandCallback()
- {
- public Integer command() throws Throwable
- {
- return getMessageCountInternal();
- }
- };
- return command.run();
- }
-
/**
* Returns list of all messages in the folder.
*
@@ -262,59 +214,6 @@ public abstract class AbstractImapFolder implements MailFolder
return command.run();
}
- /**
- * Returns message sequence number in the folder by its UID.
- *
- * @param uid - message UID.
- * @return message sequence number.
- * @throws FolderException if no message with given UID.
- */
- public int getMsn(final long uid) throws FolderException
- {
- CommandCallback command = new CommandCallback()
- {
- public Integer command() throws Throwable
- {
- return getMsnInternal(uid);
- }
- };
- return command.runFeedback(true);
- }
-
- /**
- * Returns folder name.
- *
- * @return folder name.
- */
- public String getName()
- {
- CommandCallback command = new CommandCallback()
- {
- public String command() throws Throwable
- {
- return getNameInternal();
- }
- };
- return command.run();
- }
-
- /**
- * Returns UIDs of all messages in the folder.
- *
- * @return UIDS of the messages.
- */
- public long[] getMessageUids()
- {
- CommandCallback