List of usage examples for javax.mail UIDFolder getUIDValidity
public long getUIDValidity() throws MessagingException;
From source file:de.saly.elasticsearch.mailsource.ParallelPollingIMAPMailSource.java
@SuppressWarnings({ "rawtypes", "unchecked" })
protected void fetch(final Folder folder) throws MessagingException, IOException {
if ((folder.getType() & Folder.HOLDS_MESSAGES) == 0) {
logger.warn("Folder {} cannot hold messages", folder.getFullName());
return;//from w ww. j a v a2 s . c o m
}
final int messageCount = folder.getMessageCount();
final UIDFolder uidfolder = (UIDFolder) folder;
final long servervalidity = uidfolder.getUIDValidity();
final RiverState riverState = stateManager.getRiverState(folder);
final Long localvalidity = riverState.getUidValidity();
logger.info("Fetch mails from folder {} ({})", folder.getURLName().toString(), messageCount);
logger.debug("Server uid validity: {}, Local uid validity: {}", servervalidity, localvalidity);
if (localvalidity == null || localvalidity.longValue() != servervalidity) {
logger.debug("UIDValidity fail, full resync " + localvalidity + "!=" + servervalidity);
if (localvalidity != null) {
mailDestination.clearDataForFolder(folder.getFullName());
}
final ProcessResult result = process(messageCount, 1, folder.getFullName());
riverState.setLastCount(result.getProcessedCount());
if (result.getProcessedCount() > 0) {
riverState.setLastIndexed(new Date());
}
if (result.getProcessedCount() > 0) {
riverState.setLastTook(result.getTook());
}
riverState.setLastSchedule(new Date());
if (result.getProcessedCount() > 0 && result.getHighestUid() > 0) {
riverState.setLastUid(result.getHighestUid());
}
riverState.setUidValidity(servervalidity);
stateManager.setRiverState(riverState);
logger.info("Initiailly processed {} mails for folder {}", result.getProcessedCount(),
folder.getFullName());
logger.debug("Processed result {}", result.toString());
} else {
if (messageCount == 0) {
logger.debug("Folder {} is empty", folder.getFullName());
} else {
if (withFlagSync) {
// detect flag change
final Message[] flagMessages = folder.getMessages();
folder.fetch(flagMessages, IMAPUtils.FETCH_PROFILE_FLAGS_UID);
for (final Message message : flagMessages) {
try {
final long uid = ((UIDFolder) message.getFolder()).getUID(message);
final String id = uid + "::" + message.getFolder().getURLName();
final int storedHashcode = mailDestination.getFlaghashcode(id);
if (storedHashcode == -1) {
// New mail which is not indexed yet
continue;
}
final int flagHashcode = message.getFlags().hashCode();
if (flagHashcode != storedHashcode) {
// flags change for this message, must update
mailDestination.onMessage(message);
if (logger.isDebugEnabled()) {
logger.debug("Update " + id + " because of flag change");
}
}
} catch (final Exception e) {
logger.error("Error detecting flagchanges for message "
+ ((MimeMessage) message).getMessageID(), e);
stateManager.onError("Error detecting flagchanges", message, e);
}
}
}
final long highestUID = riverState.getLastUid(); // this uid is
// already
// processed
logger.debug("highestUID: {}", highestUID);
final Message[] msgsnew = uidfolder.getMessagesByUID(highestUID, UIDFolder.LASTUID);
// msgnew.size is always >= 1
if (highestUID > 0 && uidfolder.getUID(msgsnew[0]) <= highestUID) {
// msgsnew = (Message[]) ArrayUtils.remove(msgsnew, 0);
}
if (msgsnew.length > 0) {
logger.info("{} new messages in folder {}", msgsnew.length, folder.getFullName());
final int start = msgsnew[0].getMessageNumber();
final ProcessResult result = process(messageCount, start, folder.getFullName());
riverState.setLastCount(result.getProcessedCount());
if (result.getProcessedCount() > 0) {
riverState.setLastIndexed(new Date());
}
if (result.getProcessedCount() > 0) {
riverState.setLastTook(result.getTook());
}
riverState.setLastSchedule(new Date());
if (result.getProcessedCount() > 0 && result.getHighestUid() > 0) {
riverState.setLastUid(result.getHighestUid());
}
riverState.setUidValidity(servervalidity);
stateManager.setRiverState(riverState);
logger.info("Not initiailly processed {} mails for folder {}", result.getProcessedCount(),
folder.getFullName());
logger.debug("Processed result {}", result.toString());
} else {
logger.debug("no new messages");
}
}
// check for expunged/deleted messages
final Set<Long> serverMailSet = new HashSet<Long>();
final long oldmailUid = riverState.getLastUid();
logger.debug("oldmailuid {}", oldmailUid);
final Message[] msgsold = uidfolder.getMessagesByUID(1, oldmailUid);
folder.fetch(msgsold, IMAPUtils.FETCH_PROFILE_UID);
for (final Message m : msgsold) {
try {
final long uid = uidfolder.getUID(m);
serverMailSet.add(uid);
} catch (final Exception e) {
stateManager.onError("Unable to handle old message ", m, e);
logger.error("Unable to handle old message due to {}", e, e.toString());
IMAPUtils.open(folder);
}
}
final Set localMailSet = new HashSet(
mailDestination.getCurrentlyStoredMessageUids(folder.getFullName(), false));
logger.debug("Check now " + localMailSet.size() + " server mails for expunge");
localMailSet.removeAll(serverMailSet);
// localMailSet has now the ones that are not on server
logger.info(
localMailSet.size() + " messages were locally deleted, because they are expunged on server.");
mailDestination.onMessageDeletes(localMailSet, folder.getFullName(), false);
}
}
From source file:de.saly.elasticsearch.importer.imap.mailsource.ParallelPollingIMAPMailSource.java
@SuppressWarnings({ "rawtypes", "unchecked" })
protected void fetch(final Folder folder) throws MessagingException, IOException {
if ((folder.getType() & Folder.HOLDS_MESSAGES) == 0) {
logger.warn("Folder {} cannot hold messages", folder.getFullName());
return;// www .jav a2 s .c o m
}
final int messageCount = folder.getMessageCount();
final UIDFolder uidfolder = (UIDFolder) folder;
final long servervalidity = uidfolder.getUIDValidity();
final State riverState = stateManager.getRiverState(folder);
final Long localvalidity = riverState.getUidValidity();
logger.info("Fetch mails from folder {} ({})", folder.getURLName().toString(), messageCount);
logger.debug("Server uid validity: {}, Local uid validity: {}", servervalidity, localvalidity);
if (localvalidity == null || localvalidity.longValue() != servervalidity) {
logger.debug("UIDValidity fail, full resync " + localvalidity + "!=" + servervalidity);
if (localvalidity != null) {
mailDestination.clearDataForFolder(folder);
}
final ProcessResult result = process(messageCount, 1, folder.getFullName());
riverState.setLastCount(result.getProcessedCount());
if (result.getProcessedCount() > 0) {
riverState.setLastIndexed(new Date());
}
if (result.getProcessedCount() > 0) {
riverState.setLastTook(result.getTook());
}
riverState.setLastSchedule(new Date());
if (result.getProcessedCount() > 0 && result.getHighestUid() > 0) {
riverState.setLastUid(result.getHighestUid());
}
riverState.setUidValidity(servervalidity);
stateManager.setRiverState(riverState);
logger.info("Initiailly processed {} mails for folder {}", result.getProcessedCount(),
folder.getFullName());
logger.debug("Processed result {}", result.toString());
} else {
if (messageCount == 0) {
logger.debug("Folder {} is empty", folder.getFullName());
} else {
if (withFlagSync) {
// detect flag change
final Message[] flagMessages = folder.getMessages();
folder.fetch(flagMessages, IMAPUtils.FETCH_PROFILE_FLAGS_UID);
for (final Message message : flagMessages) {
try {
final long uid = ((UIDFolder) message.getFolder()).getUID(message);
final String id = uid + "::" + message.getFolder().getURLName();
final int storedHashcode = mailDestination.getFlaghashcode(id);
if (storedHashcode == -1) {
// New mail which is not indexed yet
continue;
}
final int flagHashcode = message.getFlags().hashCode();
if (flagHashcode != storedHashcode) {
// flags change for this message, must update
mailDestination.onMessage(message);
if (logger.isDebugEnabled()) {
logger.debug("Update " + id + " because of flag change");
}
}
} catch (final Exception e) {
logger.error("Error detecting flagchanges for message "
+ ((MimeMessage) message).getMessageID(), e);
stateManager.onError("Error detecting flagchanges", message, e);
}
}
}
long highestUID = riverState.getLastUid(); // this uid is
// already
// processed
logger.debug("highestUID: {}", highestUID);
if (highestUID < 1) {
logger.error("highestUID: {} not valid, set it to 1", highestUID);
highestUID = 1;
}
Message[] msgsnew = uidfolder.getMessagesByUID(highestUID, UIDFolder.LASTUID);
if (msgsnew.length > 0) {
System.out.println("lastuid: " + uidfolder.getUID(msgsnew[msgsnew.length - 1]));
// msgnew.size is always >= 1
if (highestUID > 1 && uidfolder.getUID(msgsnew[msgsnew.length - 1]) <= highestUID) {
msgsnew = (Message[]) ArrayUtils.remove(msgsnew, msgsnew.length - 1);
}
if (msgsnew.length > 0) {
logger.info("{} new messages in folder {}", msgsnew.length, folder.getFullName());
final int start = msgsnew[0].getMessageNumber();
final ProcessResult result = process(messageCount, start, folder.getFullName());
riverState.setLastCount(result.getProcessedCount());
if (result.getProcessedCount() > 0) {
riverState.setLastIndexed(new Date());
}
if (result.getProcessedCount() > 0) {
riverState.setLastTook(result.getTook());
}
riverState.setLastSchedule(new Date());
if (result.getProcessedCount() > 0 && result.getHighestUid() > 0) {
riverState.setLastUid(result.getHighestUid());
}
riverState.setUidValidity(servervalidity);
stateManager.setRiverState(riverState);
logger.info("Not initiailly processed {} mails for folder {}", result.getProcessedCount(),
folder.getFullName());
logger.debug("Processed result {}", result.toString());
} else {
logger.debug("no new messages");
}
} else {
logger.debug("no new messages");
}
}
// check for expunged/deleted messages
final Set<Long> serverMailSet = new HashSet<Long>();
final long oldmailUid = riverState.getLastUid();
logger.debug("oldmailuid {}", oldmailUid);
final Message[] msgsold = uidfolder.getMessagesByUID(1, oldmailUid);
folder.fetch(msgsold, IMAPUtils.FETCH_PROFILE_UID);
for (final Message m : msgsold) {
try {
final long uid = uidfolder.getUID(m);
serverMailSet.add(uid);
} catch (final Exception e) {
stateManager.onError("Unable to handle old message ", m, e);
logger.error("Unable to handle old message due to {}", e, e.toString());
IMAPUtils.open(folder);
}
}
if (deleteExpungedMessages) {
final Set localMailSet = new HashSet(mailDestination.getCurrentlyStoredMessageUids(folder));
logger.debug("Check now " + localMailSet.size() + " server mails for expunge");
localMailSet.removeAll(serverMailSet);
// localMailSet has now the ones that are not on server
logger.info(localMailSet.size()
+ " messages were locally deleted, because they are expunged on server.");
mailDestination.onMessageDeletes(localMailSet, folder);
}
}
}