Author: norman
Date: Wed Jan 13 16:51:46 2010
New Revision: 898835
URL: http://svn.apache.org/viewvc?rev=898835&view=rev
Log:
Some refactoring for better handling of transactions. Now its easier to just
run stuff in transactions without the need of begin and commit the Transactions
Added:
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/JPATransactionalMapper.java
- copied, changed from r898752,
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/Mapper.java
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/AbstractTransactionalMapper.java
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/TransactionalMapper.java
Removed:
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/Mapper.java
Modified:
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailboxManager.java
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/JPAMailboxMapper.java
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/JPAMessageMapper.java
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryMailboxManager.java
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryStoreMailbox.java
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailbox.java
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailboxManager.java
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/MailboxMapper.java
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/MessageMapper.java
Modified:
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailboxManager.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailboxManager.java?rev=898835&r1=898834&r2=898835&view=diff
==============================================================================
---
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailboxManager.java
(original)
+++
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailboxManager.java
Wed Jan 13 16:51:46 2010
@@ -25,6 +25,7 @@
import org.apache.james.imap.store.StoreMailboxManager;
import org.apache.james.imap.store.Subscriber;
import org.apache.james.imap.store.mail.MailboxMapper;
+import org.apache.james.imap.store.mail.TransactionalMapper;
import org.apache.james.imap.store.mail.model.Mailbox;
public abstract class JPAMailboxManager extends StoreMailboxManager {
@@ -40,11 +41,15 @@
@Override
protected void doCreate(String namespaceName) throws MailboxException {
- Mailbox mailbox = new
org.apache.james.imap.jpa.mail.model.JPAMailbox(namespaceName,
randomUidValidity());
+ final Mailbox mailbox = new
org.apache.james.imap.jpa.mail.model.JPAMailbox(namespaceName,
randomUidValidity());
final MailboxMapper mapper = createMailboxMapper();
- mapper.begin();
- mapper.save(mailbox);
- mapper.commit();
+ mapper.execute(new TransactionalMapper.Transaction(){
+
+ public void run() throws MailboxException {
+ mapper.save(mailbox);
+ }
+
+ });
}
}
Modified:
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/JPAMailboxMapper.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/JPAMailboxMapper.java?rev=898835&r1=898834&r2=898835&view=diff
==============================================================================
---
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/JPAMailboxMapper.java
(original)
+++
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/JPAMailboxMapper.java
Wed Jan 13 16:51:46 2010
@@ -35,7 +35,7 @@
/**
* Data access management for mailbox.
*/
-public abstract class JPAMailboxMapper extends Mapper implements MailboxMapper
{
+public abstract class JPAMailboxMapper extends JPATransactionalMapper
implements MailboxMapper {
private static final char SQL_WILDCARD_CHAR = '%';
Modified:
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/JPAMessageMapper.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/JPAMessageMapper.java?rev=898835&r1=898834&r2=898835&view=diff
==============================================================================
---
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/JPAMessageMapper.java
(original)
+++
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/JPAMessageMapper.java
Wed Jan 13 16:51:46 2010
@@ -33,7 +33,7 @@
import org.apache.james.imap.store.mail.MessageMapper;
import org.apache.james.imap.store.mail.model.MailboxMembership;
-public class JPAMessageMapper extends Mapper implements MessageMapper {
+public class JPAMessageMapper extends JPATransactionalMapper implements
MessageMapper {
private final long mailboxId;
Copied:
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/JPATransactionalMapper.java
(from r898752,
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/Mapper.java)
URL:
http://svn.apache.org/viewvc/james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/JPATransactionalMapper.java?p2=james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/JPATransactionalMapper.java&p1=james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/Mapper.java&r1=898752&r2=898835&rev=898835&view=diff
==============================================================================
---
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/Mapper.java
(original)
+++
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/JPATransactionalMapper.java
Wed Jan 13 16:51:46 2010
@@ -23,17 +23,25 @@
import org.apache.james.imap.api.display.HumanReadableText;
import org.apache.james.imap.mailbox.StorageException;
+import org.apache.james.imap.store.mail.AbstractTransactionalMapper;
-abstract class Mapper {
+/**
+ * JPA implementation of TransactionMapper
+ *
+ */
+public class JPATransactionalMapper extends AbstractTransactionalMapper {
protected final EntityManager entityManager;
- public Mapper(final EntityManager entityManager) {
- super();
+ public JPATransactionalMapper(final EntityManager entityManager) {
this.entityManager = entityManager;
}
-
- public void begin() throws StorageException {
+
+ /*
+ * (non-Javadoc)
+ * @see
org.apache.james.imap.store.mail.AbstractTransactionalMapper#begin()
+ */
+ protected void begin() throws StorageException {
try {
entityManager.getTransaction().begin();
} catch (PersistenceException e) {
@@ -41,13 +49,23 @@
}
}
- public void commit() throws StorageException {
+ /*
+ * (non-Javadoc)
+ * @see
org.apache.james.imap.store.mail.AbstractTransactionalMapper#commit()
+ */
+ protected void commit() throws StorageException {
try {
entityManager.getTransaction().commit();
} catch (PersistenceException e) {
- // rollback on exception
- entityManager.getTransaction().rollback();
throw new
StorageException(HumanReadableText.COMMIT_TRANSACTION_FAILED, e);
}
}
+
+ /*
+ * (non-Javadoc)
+ * @see
org.apache.james.imap.store.mail.AbstractTransactionalMapper#rollback()
+ */
+ protected void rollback() throws StorageException {
+ entityManager.getTransaction().rollback();
+ }
}
Modified:
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryMailboxManager.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryMailboxManager.java?rev=898835&r1=898834&r2=898835&view=diff
==============================================================================
---
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryMailboxManager.java
(original)
+++
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryMailboxManager.java
Wed Jan 13 16:51:46 2010
@@ -24,6 +24,7 @@
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import org.apache.james.imap.mailbox.MailboxException;
import org.apache.james.imap.mailbox.MailboxNotFoundException;
import org.apache.james.imap.mailbox.StorageException;
import org.apache.james.imap.store.Authenticator;
@@ -60,9 +61,6 @@
save(mailbox);
}
- public void begin() throws StorageException {}
-
- public void commit() throws StorageException {}
public long countMailboxesWithName(String name) throws StorageException {
int total = 0;
@@ -123,4 +121,8 @@
mailboxesById.put(mailbox.getMailboxId(), (InMemoryMailbox) mailbox);
}
+ public void execute(Transaction transaction) throws MailboxException {
+ transaction.run();
+ }
+
}
Modified:
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryStoreMailbox.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryStoreMailbox.java?rev=898835&r1=898834&r2=898835&view=diff
==============================================================================
---
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryStoreMailbox.java
(original)
+++
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryStoreMailbox.java
Wed Jan 13 16:51:46 2010
@@ -85,12 +85,6 @@
return mailbox;
}
- public void begin() throws StorageException {
- }
-
- public void commit() throws StorageException {
- }
-
public long countMessagesInMailbox() throws StorageException {
return membershipByUid.size();
}
@@ -187,4 +181,12 @@
public List<MailboxMembership> searchMailbox(SearchQuery query) throws
StorageException {
return new ArrayList<MailboxMembership>(membershipByUid.values());
}
+
+
+ /**
+ * There is no really Transaction handling here.. Just run it
+ */
+ public void execute(Transaction transaction) throws MailboxException {
+ transaction.run();
+ }
}
Modified:
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailbox.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailbox.java?rev=898835&r1=898834&r2=898835&view=diff
==============================================================================
---
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailbox.java
(original)
+++
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailbox.java
Wed Jan 13 16:51:46 2010
@@ -37,6 +37,7 @@
import javax.mail.Flags;
import javax.mail.MessagingException;
+import org.apache.commons.lang.ArrayUtils;
import org.apache.james.imap.api.display.HumanReadableText;
import org.apache.james.imap.mailbox.MailboxException;
import org.apache.james.imap.mailbox.MailboxListener;
@@ -49,6 +50,7 @@
import org.apache.james.imap.mailbox.util.UidChangeTracker;
import org.apache.james.imap.mailbox.util.UidRange;
import org.apache.james.imap.store.mail.MessageMapper;
+import org.apache.james.imap.store.mail.TransactionalMapper;
import org.apache.james.imap.store.mail.model.Header;
import org.apache.james.imap.store.mail.model.Mailbox;
import org.apache.james.imap.store.mail.model.MailboxMembership;
@@ -198,10 +200,13 @@
final MailboxMembership message = createMessage(internalDate,
uid, size, bodyStartOctet, messageBytes, flags, headers, propertyBuilder);
final MessageMapper mapper = createMessageMapper();
- mapper.begin();
- mapper.save(message);
- mapper.commit();
+ mapper.execute(new TransactionalMapper.Transaction() {
+ public void run() throws MailboxException {
+ mapper.save(message);
+ }
+
+ });
tracker.found(uid, message.createFlags());
return uid;
} catch (IOException e) {
@@ -285,22 +290,26 @@
return permanentFlags;
}
- public long[] recent(boolean reset, MailboxSession mailboxSession) throws
MailboxException {
+ public long[] recent(final boolean reset, MailboxSession mailboxSession)
throws MailboxException {
final MessageMapper mapper = createMessageMapper();
- mapper.begin();
- final List<MailboxMembership> members =
mapper.findRecentMessagesInMailbox();
- final long[] results = new long[members.size()];
+ final List<Long> results = new ArrayList<Long>();
- int count = 0;
- for (MailboxMembership member:members) {
- results[count++] = member.getUid();
- if (reset) {
- member.unsetRecent();
- }
- }
+ mapper.execute(new TransactionalMapper.Transaction() {
- mapper.commit();
- return results;
+ public void run() throws MailboxException {
+ final List<MailboxMembership> members =
mapper.findRecentMessagesInMailbox();
+
+ for (MailboxMembership member:members) {
+ results.add(member.getUid());
+ if (reset) {
+ member.unsetRecent();
+ }
+ }
+ }
+
+ });;
+
+ return ArrayUtils.toPrimitive(results.toArray(new
Long[results.size()]));
}
public Long getFirstUnseen(MailboxSession mailboxSession) throws
MailboxException {
@@ -335,14 +344,20 @@
private Iterator<Long> doExpunge(final MessageRange set)
throws MailboxException {
final MessageMapper mapper = createMessageMapper();
- mapper.begin();
- final List<MailboxMembership> members =
mapper.findMarkedForDeletionInMailbox(set);
final Collection<Long> uids = new TreeSet<Long>();
- for (MailboxMembership message:members) {
- uids.add(message.getUid());
- mapper.delete(message);
- }
- mapper.commit();
+
+ mapper.execute(new TransactionalMapper.Transaction() {
+
+ public void run() throws MailboxException {
+ final List<MailboxMembership> members =
mapper.findMarkedForDeletionInMailbox(set);
+ for (MailboxMembership message:members) {
+ uids.add(message.getUid());
+ mapper.delete(message);
+ }
+ }
+
+ });
+
tracker.expunged(uids);
return uids.iterator();
}
@@ -352,30 +367,35 @@
return doSetFlags(flags, value, replace, set, mailboxSession);
}
- private Map<Long, Flags> doSetFlags(Flags flags, boolean value, boolean
replace,
- final MessageRange set, MailboxSession mailboxSession) throws
MailboxException {
+ private Map<Long, Flags> doSetFlags(final Flags flags, final boolean
value, final boolean replace,
+ final MessageRange set, final MailboxSession mailboxSession)
throws MailboxException {
final MessageMapper mapper = createMessageMapper();
final SortedMap<Long, Flags> newFlagsByUid = new TreeMap<Long,
Flags>();
final Map<Long, Flags> originalFlagsByUid = new HashMap<Long,
Flags>(INITIAL_SIZE_FLAGS);
- mapper.begin();
- final List<MailboxMembership> members = mapper.findInMailbox(set);
- for (final MailboxMembership member:members) {
- originalFlagsByUid.put(member.getUid(), member.createFlags());
- if (replace) {
- member.setFlags(flags);
- } else {
- Flags current = member.createFlags();
- if (value) {
- current.add(flags);
- } else {
- current.remove(flags);
+ mapper.execute(new TransactionalMapper.Transaction(){
+
+ public void run() throws MailboxException {
+ final List<MailboxMembership> members =
mapper.findInMailbox(set);
+ for (final MailboxMembership member:members) {
+ originalFlagsByUid.put(member.getUid(),
member.createFlags());
+ if (replace) {
+ member.setFlags(flags);
+ } else {
+ Flags current = member.createFlags();
+ if (value) {
+ current.add(flags);
+ } else {
+ current.remove(flags);
+ }
+ member.setFlags(current);
+ }
+ newFlagsByUid.put(member.getUid(), member.createFlags());
+ mapper.save(member);
}
- member.setFlags(current);
}
- newFlagsByUid.put(member.getUid(), member.createFlags());
- mapper.save(member);
- }
- mapper.commit();
+
+ });
+
tracker.flagsUpdated(newFlagsByUid, originalFlagsByUid,
mailboxSession.getSessionId());
return newFlagsByUid;
}
@@ -428,24 +448,27 @@
}
- public void copy(List<MailboxMembership> originalRows, MailboxSession
session) throws MailboxException {
+ public void copy(final List<MailboxMembership> originalRows,
MailboxSession session) throws MailboxException {
try {
+ final List<MailboxMembership> copiedRows = new
ArrayList<MailboxMembership>();
final MessageMapper mapper = createMessageMapper();
- mapper.begin();
+ mapper.execute(new TransactionalMapper.Transaction() {
- final List<MailboxMembership> copiedRows = new
ArrayList<MailboxMembership>();
- for (MailboxMembership originalMessage:originalRows) {
+ public void run() throws MailboxException {
+ for (MailboxMembership originalMessage:originalRows) {
- final Mailbox mailbox = reserveNextUid();
- if (mailbox != null) {
- long uid = mailbox.getLastUid();
- final MailboxMembership newRow =
copyMessage(originalMessage, uid);
- mapper.save(newRow);
- copiedRows.add(newRow);
+ final Mailbox mailbox = reserveNextUid();
+ if (mailbox != null) {
+ long uid = mailbox.getLastUid();
+ final MailboxMembership newRow =
copyMessage(originalMessage, uid);
+ mapper.save(newRow);
+ copiedRows.add(newRow);
+ }
+ }
}
- }
-
- mapper.commit();
+
+ });
+
// Wait until commit before issuing events
for (MailboxMembership newMember:copiedRows) {
Modified:
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailboxManager.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailboxManager.java?rev=898835&r1=898834&r2=898835&view=diff
==============================================================================
---
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailboxManager.java
(original)
+++
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailboxManager.java
Wed Jan 13 16:51:46 2010
@@ -46,6 +46,7 @@
import org.apache.james.imap.mailbox.MailboxMetaData.Selectability;
import org.apache.james.imap.mailbox.util.SimpleMailboxMetaData;
import org.apache.james.imap.store.mail.MailboxMapper;
+import org.apache.james.imap.store.mail.TransactionalMapper;
import org.apache.james.imap.store.mail.model.Mailbox;
public abstract class StoreMailboxManager extends AbstractLogEnabled
implements MailboxManager {
@@ -145,19 +146,24 @@
}
}
- public void deleteMailbox(String mailboxName, MailboxSession session)
+ public void deleteMailbox(final String mailboxName, final MailboxSession
session)
throws MailboxException {
session.getLog().info("deleteMailbox " + mailboxName);
synchronized (mailboxes) {
// TODO put this into a serilizable transaction
final MailboxMapper mapper = createMailboxMapper();
- mapper.begin();
- Mailbox mailbox = mapper.findMailboxByName(mailboxName);
- if (mailbox == null) {
- throw new MailboxNotFoundException("Mailbox not found");
- }
- mapper.delete(mailbox);
- mapper.commit();
+ mapper.execute(new TransactionalMapper.Transaction() {
+
+ public void run() throws MailboxException {
+ Mailbox mailbox = mapper.findMailboxByName(mailboxName);
+ if (mailbox == null) {
+ throw new MailboxNotFoundException("Mailbox not
found");
+ }
+ mapper.delete(mailbox);
+ }
+
+ });
+
final StoreMailbox storeMailbox = mailboxes.remove(mailboxName);
if (storeMailbox != null) {
storeMailbox.deleted(session);
@@ -165,7 +171,7 @@
}
}
- public void renameMailbox(String from, String to, MailboxSession session)
+ public void renameMailbox(final String from, final String to, final
MailboxSession session)
throws MailboxException {
final Log log = getLog();
if (log.isDebugEnabled()) log.debug("renameMailbox " + from + " to " +
to);
@@ -175,32 +181,37 @@
}
final MailboxMapper mapper = createMailboxMapper();
- mapper.begin();
- // TODO put this into a serilizable transaction
- final Mailbox mailbox = mapper.findMailboxByName(from);
+ mapper.execute(new TransactionalMapper.Transaction() {
- if (mailbox == null) {
- throw new MailboxNotFoundException(from);
- }
- mailbox.setName(to);
- mapper.save(mailbox);
+ public void run() throws MailboxException {
+ // TODO put this into a serilizable transaction
+ final Mailbox mailbox = mapper.findMailboxByName(from);
+
+ if (mailbox == null) {
+ throw new MailboxNotFoundException(from);
+ }
+ mailbox.setName(to);
+ mapper.save(mailbox);
- changeMailboxName(from, to);
+ changeMailboxName(from, to);
- // rename submailbox
- final List<Mailbox> subMailboxes =
mapper.findMailboxWithNameLike(from + delimiter + "%");
- for (Mailbox sub:subMailboxes) {
- final String subOriginalName = sub.getName();
- final String subNewName = to +
subOriginalName.substring(from.length());
- sub.setName(subNewName);
- mapper.save(sub);
+ // rename submailbox
+ final List<Mailbox> subMailboxes =
mapper.findMailboxWithNameLike(from + delimiter + "%");
+ for (Mailbox sub:subMailboxes) {
+ final String subOriginalName = sub.getName();
+ final String subNewName = to +
subOriginalName.substring(from.length());
+ sub.setName(subNewName);
+ mapper.save(sub);
- changeMailboxName(subOriginalName, subNewName);
+ changeMailboxName(subOriginalName, subNewName);
+
+ if (log.isDebugEnabled()) log.debug("Rename mailbox
sub-mailbox " + subOriginalName + " to "
+ + subNewName);
+ }
+ }
+
+ });
- if (log.isDebugEnabled()) log.debug("Rename mailbox
sub-mailbox " + subOriginalName + " to "
- + subNewName);
- }
- mapper.commit();
}
}
@@ -298,10 +309,14 @@
public void deleteEverything() throws MailboxException {
final MailboxMapper mapper = createMailboxMapper();
- mapper.begin();
- mapper.deleteAll();
- mapper.commit();
- mailboxes.clear();
+ mapper.execute(new TransactionalMapper.Transaction() {
+
+ public void run() throws MailboxException {
+ mapper.deleteAll();
+ mailboxes.clear();
+ }
+
+ });
}
public MailboxSession createSystemSession(String userName, Log log) {
Added:
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/AbstractTransactionalMapper.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/AbstractTransactionalMapper.java?rev=898835&view=auto
==============================================================================
---
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/AbstractTransactionalMapper.java
(added)
+++
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/AbstractTransactionalMapper.java
Wed Jan 13 16:51:46 2010
@@ -0,0 +1,71 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you under the Apache License, Version 2.0 (the *
+ * "License"); you may not use this file except in compliance *
+ * with the License. You may obtain a copy of the License at *
+ * *
+ * http://www.apache.org/licenses/LICENSE-2.0 *
+ * *
+ * Unless required by applicable law or agreed to in writing, *
+ * software distributed under the License is distributed on an *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
+ * KIND, either express or implied. See the License for the *
+ * specific language governing permissions and limitations *
+ * under the License. *
+ ****************************************************************/
+
+package org.apache.james.imap.store.mail;
+
+import org.apache.james.imap.mailbox.MailboxException;
+import org.apache.james.imap.mailbox.StorageException;
+
+/**
+ *
+ * Run Transaction and handle begin, commit and rollback in the right order
+ *
+ */
+public abstract class AbstractTransactionalMapper implements
TransactionalMapper{
+
+ /*
+ * (non-Javadoc)
+ * @see
org.apache.james.imap.store.mail.TransactionalMapper#execute(org.apache.james.imap.store.mail.TransactionalMapper.Transaction)
+ */
+ public final void execute(Transaction transaction) throws MailboxException
{
+ begin();
+ try {
+ transaction.run();
+ commit();
+ } catch (MailboxException e) {
+ rollback();
+ throw e;
+ }
+
+ }
+
+ /**
+ * Begin transaction
+ *
+ * @throws StorageException
+ */
+ protected abstract void begin() throws StorageException;
+
+ /**
+ * Commit transaction
+ *
+ * @throws StorageException
+ */
+ protected abstract void commit() throws StorageException;
+
+
+ /**
+ * Rollback transaction
+ *
+ * @throws StorageException
+ */
+ protected abstract void rollback() throws StorageException;
+
+
+}
Modified:
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/MailboxMapper.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/MailboxMapper.java?rev=898835&r1=898834&r2=898835&view=diff
==============================================================================
---
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/MailboxMapper.java
(original)
+++
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/MailboxMapper.java
Wed Jan 13 16:51:46 2010
@@ -24,10 +24,7 @@
import org.apache.james.imap.mailbox.StorageException;
import org.apache.james.imap.store.mail.model.Mailbox;
-public interface MailboxMapper {
- public abstract void begin() throws StorageException;
-
- public abstract void commit() throws StorageException;
+public interface MailboxMapper extends TransactionalMapper{
public abstract void save(Mailbox mailbox) throws StorageException;
Modified:
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/MessageMapper.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/MessageMapper.java?rev=898835&r1=898834&r2=898835&view=diff
==============================================================================
---
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/MessageMapper.java
(original)
+++
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/MessageMapper.java
Wed Jan 13 16:51:46 2010
@@ -28,12 +28,8 @@
/**
* Maps messages in a mailbox.
*/
-public interface MessageMapper {
+public interface MessageMapper extends TransactionalMapper {
- public abstract void begin() throws StorageException;
-
- public abstract void commit() throws StorageException;
-
public abstract List<MailboxMembership> findInMailbox(MessageRange set)
throws StorageException;
Added:
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/TransactionalMapper.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/TransactionalMapper.java?rev=898835&view=auto
==============================================================================
---
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/TransactionalMapper.java
(added)
+++
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/TransactionalMapper.java
Wed Jan 13 16:51:46 2010
@@ -0,0 +1,48 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you under the Apache License, Version 2.0 (the *
+ * "License"); you may not use this file except in compliance *
+ * with the License. You may obtain a copy of the License at *
+ * *
+ * http://www.apache.org/licenses/LICENSE-2.0 *
+ * *
+ * Unless required by applicable law or agreed to in writing, *
+ * software distributed under the License is distributed on an *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
+ * KIND, either express or implied. See the License for the *
+ * specific language governing permissions and limitations *
+ * under the License. *
+ ****************************************************************/
+
+package org.apache.james.imap.store.mail;
+
+import org.apache.james.imap.mailbox.MailboxException;
+
+public interface TransactionalMapper {
+
+ /**
+ * Execute the given Transaction
+ *
+ * @param transaction
+ * @throws MailboxException
+ */
+ public void execute(Transaction transaction) throws MailboxException;
+
+ /**
+ * Transaction
+ *
+ */
+ public interface Transaction {
+
+ /**
+ * Run code in a Transaction
+ *
+ * @throws MailboxException
+ */
+ public void run() throws MailboxException;
+ }
+
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]