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.codec.textline;
21
22 import java.io.ByteArrayOutputStream;
23 import java.io.PrintWriter;
24
25 /**
26 * A delimiter which is appended to the end of a text line, such as
27 * <tt>CR/LF</tt>. This class defines default delimiters for various
28 * OS :
29 * <ul>
30 * <li><b>Unix/Linux</b> : LineDelimiter.UNIX ("\n")</li>
31 * <li><b>Windows</b> : LineDelimiter.WINDOWS ("\r\n")</li>
32 * <li><b>MAC</b> : LineDelimiter.MAC ("\r")</li>
33 * </ul>
34 *
35 * @author <a href="http://mina.apache.org">Apache MINA Project</a>
36 */
37 public class LineDelimiter {
38 /** the line delimiter constant of the current O/S. */
39 public static final LineDelimiter DEFAULT;
40
41 /** Compute the default delimiter on he current OS */
42 static {
43 ByteArrayOutputStream bout = new ByteArrayOutputStream();
44 PrintWriter out = new PrintWriter(bout, true);
45 out.println();
46 DEFAULT = new LineDelimiter(new String(bout.toByteArray()));
47 }
48
49 /**
50 * A special line delimiter which is used for auto-detection of
51 * EOL in {@link TextLineDecoder}. If this delimiter is used,
52 * {@link TextLineDecoder} will consider both <tt>'\r'</tt> and
53 * <tt>'\n'</tt> as a delimiter.
54 */
55 public static final LineDelimiter AUTO = new LineDelimiter("");
56
57 /**
58 * The CRLF line delimiter constant (<tt>"\r\n"</tt>)
59 */
60 public static final LineDelimiter CRLF = new LineDelimiter("\r\n");
61
62 /**
63 * The line delimiter constant of UNIX (<tt>"\n"</tt>)
64 */
65 public static final LineDelimiter UNIX = new LineDelimiter("\n");
66
67 /**
68 * The line delimiter constant of MS Windows/DOS (<tt>"\r\n"</tt>)
69 */
70 public static final LineDelimiter WINDOWS = CRLF;
71
72 /**
73 * The line delimiter constant of Mac OS (<tt>"\r"</tt>)
74 */
75 public static final LineDelimiter MAC = new LineDelimiter("\r");
76
77 /**
78 * The line delimiter constant for NUL-terminated text protocols
79 * such as Flash XML socket (<tt>"\0"</tt>)
80 */
81 public static final LineDelimiter NUL = new LineDelimiter("\0");
82
83 /** Stores the selected Line delimiter */
84 private final String value;
85
86 /**
87 * Creates a new line delimiter with the specified <tt>value</tt>.
88 */
89 public LineDelimiter(String value) {
90 if (value == null) {
91 throw new IllegalArgumentException("delimiter");
92 }
93
94 this.value = value;
95 }
96
97 /**
98 * Return the delimiter string.
99 */
100 public String getValue() {
101 return value;
102 }
103
104 /**
105 * {@inheritDoc}
106 */
107 @Override
108 public int hashCode() {
109 return value.hashCode();
110 }
111
112 /**
113 * {@inheritDoc}
114 */
115 @Override
116 public boolean equals(Object o) {
117 if (this == o) {
118 return true;
119 }
120
121 if (!(o instanceof LineDelimiter)) {
122 return false;
123 }
124
125 LineDelimiter that = (LineDelimiter) o;
126
127 return this.value.equals(that.value);
128 }
129
130 /**
131 * {@inheritDoc}
132 */
133 @Override
134 public String toString() {
135 if (value.length() == 0) {
136 return "delimiter: auto";
137 } else {
138 StringBuilder buf = new StringBuilder();
139 buf.append("delimiter:");
140
141 for (int i = 0; i < value.length(); i++) {
142 buf.append(" 0x");
143 buf.append(Integer.toHexString(value.charAt(i)));
144 }
145
146 return buf.toString();
147 }
148 }
149 }