Thanks to those who have replied so far.

I am going to try to ask better questions. What I am trying to figure out is 
how James models the SMTP concepts in the code. I am very particular in that I 
think it is extremely important to make the code as “readable” as possible. I 
wanted to hear the thoughts behind the current model.


I will dive in and tell you what I see, and ask some more questions. :-)

Please remember that I represent those who are new to James and who want to use 
it and understand it. I also want to be able to document it better, which means 
that I need to understand it better.


I started my journey with investigating the SMTP protocol api and 
implementation in James. I am specifically looking at the protocols-smtp 
project. Here is the train of thoughts I had as I tried to navigate the code to 
figure out how James models smtp.


The first place I naturally look is the package 
org.apache.james.protocols.smtp. The package seems to be well-named: it is 
appropriate and easy to understand.

Within this package, there are sub-packages: core, dsn, and hook. Those are 
definitely not the first place I would look to understand the smtp api. Within 
the interfaces / classes in the “main” package (i.e. 
“org.apache.james.protocols.smtp”), I find:

    AllButStartTlsLineBasedChannelHandler.java
    AllButStartTlsLineChannelHandlerFactory.java
    CommandInjectionDetectedException.java
    MailAddress.java
    MailAddressException.java
    MailEnvelope.java
    MailEnvelopeImpl.java
    SMTPConfiguration.java
    SMTPConfigurationImpl.java
    SMTPProtocol.java
    SMTPProtocolHandlerChain.java
    SMTPResponse.java
    SMTPRetCode.java
    SMTPServerMBean.java
    SMTPSession.java
    SMTPSessionImpl.java
    SMTPStartTlsResponse.java

Within these, MailAddress and MailAddressException are deprecated, so I ignore 
them.

My first reactions are:

 * AllButStartTlsLineBasedChannelHandler* … wtf??? Ok, don’t want to get into 
that right now.
 * Why are there impl classes in the main api package????
 * Why is there an MBean class polluting the api???
 * SMTPProtocol looks like the most sensical place to start, so…

I look at SMTPProtocol. My thoughts are:

 * Holy crap, this is a class, not an interface. What’s going on here??
 * Ok, it implements org.apache.james.protocols.api.ProtocolImpl, which itself 
implements org.apache.james.protocols.api.Protocol
     - Already this is confusing and there is a lot of coupling going on here. 
Arg.

Ok, first let’s look at the Protocol API.

Ok, this is an interface, so I am indeed in api territory. I feel a bit better. 
But why is the protocols-smtp api coupled to the protocols-api project? That is 
not clear. Is there really a benefit to this inheritance? Coupling apis is 
generally quite yucky. Is the idea that ALL protocols are the same?

My thought is that even if there is overlap between the protocol apis, it is a 
bit dubious to create this kind of coupling just because it may save a few 
lines of code. It has a fairly high risk of creating a world of pain in terms 
of causing unnecessary coupling and more difficult dependency management later 
on.

 —> I understand that there are “protocols” and that they each “do something”, 
but can somebody explain the decision to use this kind of inheritance to try to 
define all of the protocols as a single “thing", instead of having independent 
apis per protocol? Is there some benefit to this coupling that I am not seeing?

Anyway, to continue…


A Protocol has a ProtocolHandlerChain, a ProtocolConfiguration, and a 
ProtocolSession. Alrighty, let’s look at those.

ProtocolHandlerChain - this is in the org.apache.james.protocols.api.handler 
package, which means that the “main” package depends on a sub-package. That 
seems backwards to me. Anyway, when I look at this interface, I kinda get a 
sense of what it does, but it is soooo abstract and there is so little 
documentation that really I can only guess as to what it is for.

ProtocolConfiguration - this is also in the “main” package, which is fine. This 
is very abstract, but since it represents a “Configuration” I think that’s ok. 
However, the provided documentation is pretty much useless. It only repeats the 
name of the interface methods without giving any additional information as to 
why these methods exist in the first place.

ProtocolSession - This opens up a whole new pandora’s box that I am not ready 
to investigate right now. I’ll have to try to bite this part of the elephant 
later.


Ok, so back to… ummmm, where was I? I’m already lost, so I’ll have to start 
again at SMTPProtocol and try to find my way again.


Well, maybe I’ve already said enough for now anyway. I’ll leave it here for 
now, await responses, and continue again later.



My incomplete (and maybe unjustified??) conclusions so far:

 * There is a lot of coupling that I don’t understand and that makes the api 
already more complex than I would like
 * There are many very abstract concepts that make comprehension very difficult 
for me
 * The api and implementation classes are all mixed together, which I find 
utterly confusing

Not sure if this is helpful or not, but I think that the ability to comprehend 
the codebase is very important, especially in a large and complex system in 
which many people collaborate.

Hopefully people can answer some of the questions I pose in my thoughts above.


Cheers,
=David


Attachment: signature.asc
Description: Message signed with OpenPGP

Reply via email to