1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/*
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Copyright 2001-2004 The Apache Software Foundation.
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Licensed under the Apache License, Version 2.0 (the "License");
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * you may not use this file except in compliance with the License.
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * You may obtain a copy of the License at
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *      http://www.apache.org/licenses/LICENSE-2.0
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Unless required by applicable law or agreed to in writing, software
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * distributed under the License is distributed on an "AS IS" BASIS,
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * See the License for the specific language governing permissions and
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * limitations under the License.
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpackage org.apache.commons.codec.net;
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport java.io.UnsupportedEncodingException;
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.apache.commons.codec.DecoderException;
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.apache.commons.codec.EncoderException;
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.apache.commons.codec.StringDecoder;
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.apache.commons.codec.StringEncoder;
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.apache.commons.codec.binary.Base64;
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/**
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * <p>
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Identical to the Base64 encoding defined by <a href="http://www.ietf.org/rfc/rfc1521.txt">RFC
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1521</a> and allows a character set to be specified.
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </p>
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * <p>
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * <a href="http://www.ietf.org/rfc/rfc1522.txt">RFC 1522</a> describes techniques to allow the encoding of non-ASCII
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * text in various portions of a RFC 822 [2] message header, in a manner which is unlikely to confuse existing message
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * handling software.
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </p>
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @see <a href="http://www.ietf.org/rfc/rfc1522.txt">MIME (Multipurpose Internet Mail Extensions) Part Two: Message
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *          Header Extensions for Non-ASCII Text</a>
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @author Apache Software Foundation
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @since 1.3
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @version $Id: BCodec.java,v 1.5 2004/04/13 22:46:37 ggregory Exp $
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @deprecated Please use {@link java.net.URL#openConnection} instead.
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *     Please visit <a href="http://android-developers.blogspot.com/2011/09/androids-http-clients.html">this webpage</a>
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *     for further details.
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@Deprecated
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic class BCodec extends RFC1522Codec implements StringEncoder, StringDecoder {
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /**
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * The default charset used for string decoding and encoding.
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    private String charset = StringEncodings.UTF8;
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /**
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * Default constructor.
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    public BCodec() {
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        super();
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /**
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * Constructor which allows for the selection of a default charset
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * @param charset
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *                  the default string charset to use.
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * @see <a href="http://java.sun.com/j2se/1.3/docs/api/java/lang/package-summary.html#charenc">JRE character
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *          encoding names</a>
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    public BCodec(final String charset) {
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        super();
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        this.charset = charset;
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    protected String getEncoding() {
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return "B";
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    protected byte[] doEncoding(byte[] bytes) throws EncoderException {
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if (bytes == null) {
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return null;
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return Base64.encodeBase64(bytes);
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    protected byte[] doDecoding(byte[] bytes) throws DecoderException {
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if (bytes == null) {
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return null;
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return Base64.decodeBase64(bytes);
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /**
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * Encodes a string into its Base64 form using the specified charset. Unsafe characters are escaped.
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * @param value
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *                  string to convert to Base64 form
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * @param charset
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *                  the charset for pString
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * @return Base64 string
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * @throws EncoderException
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *                  thrown if a failure condition is encountered during the encoding process.
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    public String encode(final String value, final String charset) throws EncoderException {
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if (value == null) {
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return null;
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        try {
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return encodeText(value, charset);
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        } catch (UnsupportedEncodingException e) {
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            throw new EncoderException(e.getMessage());
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /**
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * Encodes a string into its Base64 form using the default charset. Unsafe characters are escaped.
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * @param value
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *                  string to convert to Base64 form
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * @return Base64 string
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * @throws EncoderException
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *                  thrown if a failure condition is encountered during the encoding process.
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    public String encode(String value) throws EncoderException {
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if (value == null) {
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return null;
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return encode(value, getDefaultCharset());
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /**
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * Decodes a Base64 string into its original form. Escaped characters are converted back to their original
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * representation.
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * @param value
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *                  Base64 string to convert into its original form
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * @return original string
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * @throws DecoderException
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *                  A decoder exception is thrown if a failure condition is encountered during the decode process.
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    public String decode(String value) throws DecoderException {
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if (value == null) {
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return null;
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        try {
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return decodeText(value);
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        } catch (UnsupportedEncodingException e) {
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            throw new DecoderException(e.getMessage());
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /**
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * Encodes an object into its Base64 form using the default charset. Unsafe characters are escaped.
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * @param value
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *                  object to convert to Base64 form
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * @return Base64 object
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * @throws EncoderException
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *                  thrown if a failure condition is encountered during the encoding process.
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    public Object encode(Object value) throws EncoderException {
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if (value == null) {
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return null;
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        } else if (value instanceof String) {
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return encode((String) value);
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        } else {
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            throw new EncoderException("Objects of type "
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                + value.getClass().getName()
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                + " cannot be encoded using BCodec");
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /**
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * Decodes a Base64 object into its original form. Escaped characters are converted back to their original
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * representation.
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * @param value
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *                  Base64 object to convert into its original form
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * @return original object
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * @throws DecoderException
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *                  A decoder exception is thrown if a failure condition is encountered during the decode process.
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    public Object decode(Object value) throws DecoderException {
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if (value == null) {
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return null;
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        } else if (value instanceof String) {
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return decode((String) value);
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        } else {
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            throw new DecoderException("Objects of type "
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                + value.getClass().getName()
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                + " cannot be decoded using BCodec");
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /**
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * The default charset used for string decoding and encoding.
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * @return the default string charset.
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    public String getDefaultCharset() {
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return this.charset;
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver