1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 *
19 */
20 package org.apache.mina.filter.codec.textline;
21
22 import java.nio.charset.Charset;
23
24 import org.apache.mina.core.buffer.BufferDataException;
25 import org.apache.mina.core.session.IoSession;
26 import org.apache.mina.filter.codec.ProtocolCodecFactory;
27 import org.apache.mina.filter.codec.ProtocolDecoder;
28 import org.apache.mina.filter.codec.ProtocolEncoder;
29
30 /**
31 * A {@link ProtocolCodecFactory} that performs encoding and decoding between
32 * a text line data and a Java string object. This codec is useful especially
33 * when you work with a text-based protocols such as SMTP and IMAP.
34 *
35 * @author <a href="http://mina.apache.org">Apache MINA Project</a>
36 */
37 public class TextLineCodecFactory implements ProtocolCodecFactory {
38
39 private final TextLineEncoder encoder;
40
41 private final TextLineDecoder decoder;
42
43 /**
44 * Creates a new instance with the current default {@link Charset}.
45 */
46 public TextLineCodecFactory() {
47 this(Charset.defaultCharset());
48 }
49
50 /**
51 * Creates a new instance with the specified {@link Charset}. The
52 * encoder uses a UNIX {@link LineDelimiter} and the decoder uses
53 * the AUTO {@link LineDelimiter}.
54 *
55 * @param charset
56 * The charset to use in the encoding and decoding
57 */
58 public TextLineCodecFactory(Charset charset) {
59 encoder = new TextLineEncoder(charset, LineDelimiter.UNIX);
60 decoder = new TextLineDecoder(charset, LineDelimiter.AUTO);
61 }
62
63 /**
64 * Creates a new instance of TextLineCodecFactory. This constructor
65 * provides more flexibility for the developer.
66 *
67 * @param charset
68 * The charset to use in the encoding and decoding
69 * @param encodingDelimiter
70 * The line delimeter for the encoder
71 * @param decodingDelimiter
72 * The line delimeter for the decoder
73 */
74 public TextLineCodecFactory(Charset charset, String encodingDelimiter, String decodingDelimiter) {
75 encoder = new TextLineEncoder(charset, encodingDelimiter);
76 decoder = new TextLineDecoder(charset, decodingDelimiter);
77 }
78
79 /**
80 * Creates a new instance of TextLineCodecFactory. This constructor
81 * provides more flexibility for the developer.
82 *
83 * @param charset
84 * The charset to use in the encoding and decoding
85 * @param encodingDelimiter
86 * The line delimeter for the encoder
87 * @param decodingDelimiter
88 * The line delimeter for the decoder
89 */
90 public TextLineCodecFactory(Charset charset, LineDelimiter encodingDelimiter, LineDelimiter decodingDelimiter) {
91 encoder = new TextLineEncoder(charset, encodingDelimiter);
92 decoder = new TextLineDecoder(charset, decodingDelimiter);
93 }
94
95 public ProtocolEncoder getEncoder(IoSession session) {
96 return encoder;
97 }
98
99 public ProtocolDecoder getDecoder(IoSession session) {
100 return decoder;
101 }
102
103 /**
104 * Returns the allowed maximum size of the encoded line.
105 * If the size of the encoded line exceeds this value, the encoder
106 * will throw a {@link IllegalArgumentException}. The default value
107 * is {@link Integer#MAX_VALUE}.
108 * <p>
109 * This method does the same job with {@link TextLineEncoder#getMaxLineLength()}.
110 */
111 public int getEncoderMaxLineLength() {
112 return encoder.getMaxLineLength();
113 }
114
115 /**
116 * Sets the allowed maximum size of the encoded line.
117 * If the size of the encoded line exceeds this value, the encoder
118 * will throw a {@link IllegalArgumentException}. The default value
119 * is {@link Integer#MAX_VALUE}.
120 * <p>
121 * This method does the same job with {@link TextLineEncoder#setMaxLineLength(int)}.
122 */
123 public void setEncoderMaxLineLength(int maxLineLength) {
124 encoder.setMaxLineLength(maxLineLength);
125 }
126
127 /**
128 * Returns the allowed maximum size of the line to be decoded.
129 * If the size of the line to be decoded exceeds this value, the
130 * decoder will throw a {@link BufferDataException}. The default
131 * value is <tt>1024</tt> (1KB).
132 * <p>
133 * This method does the same job with {@link TextLineDecoder#getMaxLineLength()}.
134 */
135 public int getDecoderMaxLineLength() {
136 return decoder.getMaxLineLength();
137 }
138
139 /**
140 * Sets the allowed maximum size of the line to be decoded.
141 * If the size of the line to be decoded exceeds this value, the
142 * decoder will throw a {@link BufferDataException}. The default
143 * value is <tt>1024</tt> (1KB).
144 * <p>
145 * This method does the same job with {@link TextLineDecoder#setMaxLineLength(int)}.
146 */
147 public void setDecoderMaxLineLength(int maxLineLength) {
148 decoder.setMaxLineLength(maxLineLength);
149 }
150 }