001/****************************************************************
002 * Licensed to the Apache Software Foundation (ASF) under one   *
003 * or more contributor license agreements.  See the NOTICE file *
004 * distributed with this work for additional information        *
005 * regarding copyright ownership.  The ASF licenses this file   *
006 * to you under the Apache License, Version 2.0 (the            *
007 * "License"); you may not use this file except in compliance   *
008 * with the License.  You may obtain a copy of the License at   *
009 *                                                              *
010 *   http://www.apache.org/licenses/LICENSE-2.0                 *
011 *                                                              *
012 * Unless required by applicable law or agreed to in writing,   *
013 * software distributed under the License is distributed on an  *
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
015 * KIND, either express or implied.  See the License for the    *
016 * specific language governing permissions and limitations      *
017 * under the License.                                           *
018 ****************************************************************/
019
020package org.apache.james.mime4j.message;
021
022import java.util.Collection;
023import java.util.Date;
024import java.util.Map;
025import java.util.TimeZone;
026
027import org.apache.james.mime4j.codec.DecodeMonitor;
028import org.apache.james.mime4j.dom.Header;
029import org.apache.james.mime4j.dom.Message;
030import org.apache.james.mime4j.dom.address.Address;
031import org.apache.james.mime4j.dom.address.Mailbox;
032import org.apache.james.mime4j.dom.field.AddressListField;
033import org.apache.james.mime4j.dom.field.ContentDispositionField;
034import org.apache.james.mime4j.dom.field.ContentTransferEncodingField;
035import org.apache.james.mime4j.dom.field.ContentTypeField;
036import org.apache.james.mime4j.dom.field.DateTimeField;
037import org.apache.james.mime4j.dom.field.FieldName;
038import org.apache.james.mime4j.dom.field.MailboxField;
039import org.apache.james.mime4j.dom.field.MailboxListField;
040import org.apache.james.mime4j.dom.field.UnstructuredField;
041import org.apache.james.mime4j.field.ContentTransferEncodingFieldImpl;
042import org.apache.james.mime4j.field.ContentTypeFieldImpl;
043import org.apache.james.mime4j.field.Fields;
044import org.apache.james.mime4j.field.MimeVersionFieldLenientImpl;
045import org.apache.james.mime4j.stream.RawField;
046import org.apache.james.mime4j.util.MimeUtil;
047
048/**
049 * Default implementation of {@link Message}.
050 */
051public class MessageImpl extends AbstractMessage {
052
053    /**
054     * Creates a new empty <code>Message</code>.
055     */
056    public MessageImpl() {
057        super();
058        Header header = obtainHeader();
059        RawField rawField = new RawField(FieldName.MIME_VERSION, "1.0");
060        header.addField(MimeVersionFieldLenientImpl.PARSER.parse(rawField, DecodeMonitor.SILENT));
061    }
062
063    @Override
064    protected String newUniqueBoundary() {
065        return MimeUtil.createUniqueBoundary();
066    }
067
068    @Override
069    protected UnstructuredField newMessageId(String hostname) {
070        return Fields.messageId(hostname);
071    }
072
073    @Override
074    protected DateTimeField newDate(Date date, TimeZone zone) {
075        return Fields.date(FieldName.DATE, date, zone);
076    }
077
078    @Override
079    protected MailboxField newMailbox(String fieldName, Mailbox mailbox) {
080        return Fields.mailbox(fieldName, mailbox);
081    }
082
083    @Override
084    protected MailboxListField newMailboxList(String fieldName,
085            Collection<Mailbox> mailboxes) {
086        return Fields.mailboxList(fieldName, mailboxes);
087    }
088
089    @Override
090    protected AddressListField newAddressList(String fieldName,
091            Collection<? extends Address> addresses) {
092        return Fields.addressList(fieldName, addresses);
093    }
094
095    @Override
096    protected UnstructuredField newSubject(String subject) {
097        return Fields.subject(subject);
098    }
099
100    @Override
101    protected ContentDispositionField newContentDisposition(
102            String dispositionType, String filename, long size,
103            Date creationDate, Date modificationDate, Date readDate) {
104        return Fields.contentDisposition(dispositionType, filename, size,
105                creationDate, modificationDate, readDate);
106    }
107
108    @Override
109    protected ContentDispositionField newContentDisposition(
110            String dispositionType, Map<String, String> parameters) {
111        return Fields.contentDisposition(dispositionType, parameters);
112    }
113
114    @Override
115    protected ContentTypeField newContentType(String mimeType,
116            Map<String, String> parameters) {
117        return Fields.contentType(mimeType, parameters);
118    }
119
120    @Override
121    protected ContentTransferEncodingField newContentTransferEncoding(
122            String contentTransferEncoding) {
123        return Fields.contentTransferEncoding(contentTransferEncoding);
124    }
125
126    @Override
127    protected String calcTransferEncoding(ContentTransferEncodingField f) {
128        return ContentTransferEncodingFieldImpl.getEncoding(f);
129    }
130
131    @Override
132    protected String calcMimeType(ContentTypeField child, ContentTypeField parent) {
133        return ContentTypeFieldImpl.getMimeType(child, parent);
134    }
135
136    @Override
137    protected String calcCharset(ContentTypeField contentType) {
138        return ContentTypeFieldImpl.getCharset(contentType);
139    }
140
141}