james-server-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Stefano Bagnara <apa...@bago.org>
Subject Re: BasicMailboxSession (aka MessageRepository)
Date Sat, 28 Oct 2006 20:01:12 GMT
Joachim Draeger wrote:
> Hi all!
> 
> I guess it is wished that the API for just accessing user inboxes should
> stay as easy as possible. 
> That's why I'm proposing a separate Interface that only contains core
> functionalities.
> 
> Just like addUser has been moved from James class to UsersRepository,
> getUserInbox could be moved to MailboxManagerProvider (alias
> MailboxService):
> 
> package org.apache.james.mailboxservice;
> 
> interface MailboxService {
>   BasicMailboxSession getBasicInboxSession(User user);
> 
>   /** @param user the authorized User for checking credentials 
>       @param mailboxName a logical/hierarchical mailbox name **/ 
> 
>   BasicMailboxSession getBasicMailboxSession(
>        User user, String mailboxName);
> 
> }

What about isolating the "User => Inbox Repository" association to a 
separate service?

We currently have this in the MailServer interface: "MailRepository 
getUserInbox(String userName);" and this service is currently needed by 
LocalDelivery and by POP3Server.

I think that if we want to "move" this service to some other existing 
service it would be better to put this in the UsersRepository interface 
than in a repository related service. Maybe the best thing would be to 
add it to the UsersRepository but to make it return the URL of the inbox 
repository and not the repository itself.

> interface BasicMailbox {
> 
>     /** @return the key */
>     String store(MimeMessage message) throws MessagingException;
> 
>     /** @return keys */
>     Collection list() throws MessagingException;
> 
>     MimeMessage retrieve(String key);
> 
>     /**
>      * key changes by updating
>      * @param key the current key
>      * @return the new key
>      */
>     String update(String key, MimeMessage message)
>             throws MessagingException;
> 
>     void remove(String key)
>             throws MessagingException;
> }
> 
> interface BasicMailboxSession extends BasicMailbox, MailboxSession {}
> 
> public interface MailboxSession {
>     public void close();
>     public boolean isWriteable();
> }

Cosmetic: "BasicMailboxSession" is awful for an interface name (Basic 
make me think of a basic *implementation* of the MailboxSession interface).

Can you elaborate on the need of the 3 interfaces: BasicMailbox, 
MailboxSession, BasicMailboxSession? Can't we start with a single 
interface (BasicMailboxSession but renamed to something with no "Basic" 
prefix, is my preference)

> The main differences to current MailRepository are:
> 
> * keys are generated by mailbox

+1

> * separate store/update

+1

> * sessions have to be explicitly closed. (and not weak referenced and
> _maybe_ gc'ed away)

+1 (you obtain a session and you release it calling its close, make 
sense) Not sure wether the best way is to release the object to the 
factory that produced it, or to simply "close" the object, but this is a 
minor detail.

> * logical mailbox names that are mapped to physical backends

We already have something similar: we have urls that are mapped to 
physical backends. What's the difference?
(I will elaborate on this in another leaf of this thread, currently 
evolving)

> Okay there is one point that is a bit more difficult: 
> ToRepository Mailet, which accepts a url. 
> It is used for mail that is not delivered to a user like spam or mail
> that can't be delivered.
> I guess the ability to put this repositories where ever one wants is
> quite popular.
> Maybe we could use a logical #system name space here like #system.spam
> or #system.address-error.
> For example this could be mapped like: #system.* -> file:/var/mail/*

Well, this starts fitting in a different idea we had in past: virtual 
repository tree and mount points.

> BasicMailboxSession mailboxSession= mailboxService.
>        getBasicMailboxSession(User.SMTP, "#system.spam");
> mailboxSession.store(aSpamMimeMessage);
> mailboxSession.close();      

I was just thinking that we need to do some operation that is not user 
related so I thought we needed a "getMailboxSession(String url)" without 
User. Maybe the User.SMTP thing (virtual user) could also be used.

> Roadmap:
> 
> 1. discussion
> 2. vote
> 3. deprecate MailRepository and James.getUserInbox() (not to break
> backward compatibility)
> 4. provide BasicMailbox wrappers around MailRepository 
> 5. refactor current components to use MailboxService.
> 
> What do you think?

OK, but I think that 1 should include a few test in sandbox, because 
problems with refactorings most time arise when you try to apply them.

Stefano

> Joachim

PS: thank you for taking care of this proposal. I often thought to the 
MessageRepository issue, but I never started it because it needs time to 
collect everyone opinion and try to achieve a result in similar threads.


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


Mime
View raw message