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    
020    package org.apache.james.mime4j.field.address;
021    
022    import java.io.StringReader;
023    
024    import org.apache.james.mime4j.codec.DecodeMonitor;
025    import org.apache.james.mime4j.dom.address.Address;
026    import org.apache.james.mime4j.dom.address.AddressList;
027    import org.apache.james.mime4j.dom.address.Group;
028    import org.apache.james.mime4j.dom.address.Mailbox;
029    
030    /**
031     * Default (strict) builder for {@link Address} and its subclasses.
032     */
033    public class AddressBuilder {
034    
035        public static final AddressBuilder DEFAULT = new AddressBuilder();
036    
037        protected AddressBuilder() {
038            super();
039        }
040    
041        /**
042         * Parses the specified raw string into an address.
043         *
044         * @param rawAddressString
045         *            string to parse.
046         * @param monitor the DecodeMonitor to be used while parsing/decoding
047         * @return an <code>Address</code> object for the specified string.
048         * @throws ParseException if the raw string does not represent a single address.
049         */
050        public Address parseAddress(String rawAddressString, DecodeMonitor monitor) throws ParseException {
051            AddressListParser parser = new AddressListParser(new StringReader(
052                    rawAddressString));
053            return Builder.getInstance().buildAddress(parser.parseAddress(), monitor);
054        }
055    
056        public Address parseAddress(String rawAddressString) throws ParseException {
057            return parseAddress(rawAddressString, DecodeMonitor.STRICT);
058        }
059    
060        /**
061         * Parse the address list string, such as the value of a From, To, Cc, Bcc,
062         * Sender, or Reply-To header.
063         *
064         * The string MUST be unfolded already.
065         * @param monitor the DecodeMonitor to be used while parsing/decoding
066         */
067        public AddressList parseAddressList(String rawAddressList, DecodeMonitor monitor)
068                throws ParseException {
069            AddressListParser parser = new AddressListParser(new StringReader(
070                    rawAddressList));
071            return Builder.getInstance().buildAddressList(parser.parseAddressList(), monitor);
072        }
073    
074        public AddressList parseAddressList(String rawAddressList) throws ParseException {
075            return parseAddressList(rawAddressList, DecodeMonitor.STRICT);
076        }
077    
078        /**
079         * Parses the specified raw string into a mailbox address.
080         *
081         * @param rawMailboxString
082         *            string to parse.
083         * @param monitor the DecodeMonitor to be used while parsing/decoding.
084         * @return a <code>Mailbox</code> object for the specified string.
085         * @throws ParseException
086         *             if the raw string does not represent a single mailbox
087         *             address.
088         */
089        public Mailbox parseMailbox(String rawMailboxString, DecodeMonitor monitor) throws ParseException {
090            AddressListParser parser = new AddressListParser(new StringReader(
091                    rawMailboxString));
092            return Builder.getInstance().buildMailbox(parser.parseMailbox(), monitor);
093        }
094    
095        public Mailbox parseMailbox(String rawMailboxString) throws ParseException {
096            return parseMailbox(rawMailboxString, DecodeMonitor.STRICT);
097        }
098    
099        /**
100         * Parses the specified raw string into a group address.
101         *
102         * @param rawGroupString
103         *            string to parse.
104         * @return a <code>Group</code> object for the specified string.
105         * @throws ParseException
106         *             if the raw string does not represent a single group address.
107         */
108        public Group parseGroup(String rawGroupString, DecodeMonitor monitor) throws ParseException {
109            Address address = parseAddress(rawGroupString, monitor);
110            if (!(address instanceof Group))
111                throw new ParseException("Not a group address");
112    
113            return (Group) address;
114        }
115    
116        public Group parseGroup(String rawGroupString) throws ParseException {
117            return parseGroup(rawGroupString, DecodeMonitor.STRICT);
118        }
119    
120    }