Entity and AbstractEntity consistency and correcteness checks
-------------------------------------------------------------
Key: MIME4J-195
URL: https://issues.apache.org/jira/browse/MIME4J-195
Project: JAMES Mime4j
Issue Type: Task
Components: dom
Affects Versions: 0.7
Reporter: Stefano Bagnara
Fix For: 0.8
Entity exposes
- setBody: sets the body of the entity
- setHeader: sets the header
Inconsistency: setBody throws an exception if the body already exists,
setHeader does not show this behaviour
Correctness: setBody does not provide consistency at the dom level: e.g: if you
previously added a Content-Type field saying it is a multipart it happily
accept a plain text body and will fail when the body is written out.
AbstractEntity adds:
- setMessage(Message message)
- setMultipart(Multipart multipart)
- setMultipart(Multipart multipart, Map<String, String> parameters)
- setText(TextBody textBody)
- setText(TextBody textBody, String subtype)
- setBody(Body body, String mimeType)
They all prepare parameters and call the internal method
- setBody(Body body, String mimeType, Map<String, String> parameters)
All of these methods document they behaviour saying "A Header is created if
this entity does not already have one but they don't say that the Content-Type
field is replaced by a new content-type created using the parameters. These
methods are only used by example code and not by the parser. The parser will
only use the Entity.setBody method when parsing.
Inconsistency: Multipart interface expose "subtype" but not "boundary". I think
that technically the boundary is a part of a multipart body instead subtype is
only something used when the full entity is used (it is only in the header). So
it seems inconsistent that a Multipart knows its subtype, its raw epilogue but
doesn't know the boundary: should we add it?
Inconsistency: Multipart knows its own subtype, instead TextBody doesn't know
it.
Weirdness: If you call the public method "setBody()" and you pass a Multipart
object Entity doesn't do anything to ensure the dom object is valid. Instead if
you call setMultipart() and you pass the very same Multipart it will take care
of adding the content-type using the subtype from the Multipart object and a
new generated Boundary. If you call the third method
"setMultipart(multipart,parameters)" then you also ensure a new contenttype is
generated starting using the subtype and parameters as input. the setMultipart
methods always rewrite the original contenttype added previously to the header.
It doesn't sound good that the public interface exposes the only method
(setBody) that doesn't provide "content-type-header vs body content
consistency".
I'm not sure what is the best way to make the whole thing consistent, so I hope
we can discuss the logic here. At the very least I hope we can define if
"subtype" is something belonging to the body or not (and maybe other properties
like boundary, charset, ....).
Should mime4j dom api care about consistency between
content-type/content-transfer-encoding and the entity body? What object should
care? How should it react when we change one or the other to become
incompatible? e.g: if I add a Multipart then I change the Content-Type header
to say text/plain what should it do? (change Multipart body with a TextBody on
the fly? Keep the inconsistency and simply dump the text/plain header and the
multipart stream?).
I think answers to this issue will also help understand how we should expose
message building public API. Currently we only expose
MessageBuilder.newMessage. The Message exposes a setBody but we don't publish a
way to create new bodies. Now an API user have to go in the internals and
create e.g: a new MultipartImpl then call the setBody and then make sure to add
a content-type header (how does it do?) matching the multipart just added.
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira