1 /*
2 * $Id: FoldingWriter.java [Apr 6, 2004]
3 *
4 * Copyright (c) 2004, Ben Fortuna
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 *
11 * o Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 *
14 * o Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 *
18 * o Neither the name of Ben Fortuna nor the names of any other contributors
19 * may be used to endorse or promote products derived from this software
20 * without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
25 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
26 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
27 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
28 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
29 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
30 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
31 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 */
34 package net.fortuna.ical4j.data;
35
36 import java.io.FilterWriter;
37 import java.io.IOException;
38 import java.io.Writer;
39
40 import org.apache.commons.logging.Log;
41 import org.apache.commons.logging.LogFactory;
42
43 /***
44 * A writer that performs iCalendar folding as it writes.
45 *
46 * @author benf
47 */
48 public class FoldingWriter extends FilterWriter {
49
50 // Lines of text SHOULD NOT be longer than 75 octets, excluding the line break.
51 // reduced to 73 to be consistent with iCal..
52 private static final int FOLD_LENGTH = 73;
53
54 private static final char[] FOLD_PATTERN = {'\r', '\n', ' '};
55
56 private static Log log = LogFactory.getLog(FoldingWriter.class);
57
58 private int lineLength;
59
60 /***
61 * @param arg0 a writer to write output to
62 */
63 public FoldingWriter(final Writer arg0) {
64 super(arg0);
65
66 lineLength = 0;
67 }
68
69 /*
70 * (non-Javadoc)
71 *
72 * @see java.io.FilterWriter#write(int)
73 *
74 */
75 public final void write(final int c) throws IOException {
76
77 /*
78 super.write(c);
79
80 if (c == '\n') {
81 lineLength = 0;
82 }
83 else {
84 lineLength += 1;
85 }
86
87 if (lineLength >= FOLD_LENGTH) {
88 super.write(FOLD_PATTERN);
89 }
90 */
91 write(new char[] {(char) c}, 0, 1);
92 }
93
94
95 /* (non-Javadoc)
96 * @see java.io.FilterWriter#write(char[], int, int)
97 */
98 public void write(char[] buffer, int offset, int length) throws IOException {
99 for (int i = offset; i < length; i++) {
100
101 // debugging..
102 log.debug("char [" + buffer[i] + "], line length [" + lineLength + "]");
103
104 // check for fold first so we don't unnecessarily fold after
105 // no more data..
106 if (lineLength > FOLD_LENGTH) {
107 super.write(FOLD_PATTERN, 0, FOLD_PATTERN.length);
108
109 // re-initialise to 1 to account for the space in fold pattern..
110 lineLength = 1;
111 }
112
113 super.write(new char[] {buffer[i]}, 0, 1);
114
115 if (buffer[i] == '\n') {
116 lineLength = 0;
117 }
118 else {
119 lineLength += 1;
120 }
121 }
122 }
123
124
125 /* (non-Javadoc)
126 * @see java.io.FilterWriter#write(java.lang.String, int, int)
127 */
128 public void write(String str, int off, int len) throws IOException {
129 write(str.toCharArray(), off, len);
130 }
131
132 /*
133 * (non-Javadoc)
134 *
135 * @see java.io.FilterWriter#write(java.lang.String, int, int)
136 *
137 * public void write(String arg0, int arg1, int arg2) throws IOException {
138 *
139 * super.write(arg0, arg1, arg2);
140 *
141 * if (arg0.indexOf('\n') >= 0) {
142 *
143 * lineLength = 0; } else {
144 *
145 * lineLength += 1; }
146 *
147 * fold(); }
148 */
149
150 /*
151 * (non-Javadoc)
152 *
153 * @see java.io.Writer#write(java.lang.String)
154 *
155 * public void write(String arg0) throws IOException {
156 * /* if (lineLength + arg0.length() >= FOLD_LENGTH) {
157 *
158 * super.write(arg0.substring(0,FOLD_LENGTH-lineLength-1));
159 *
160 * super.write(FOLD_PATTERN);
161 *
162 * super.write(arg0.substring(FOLD_LENGTH-lineLength)); } else {
163 *
164 * super.write(arg0); }
165 *
166 * if (arg0.indexOf('\n') >= 0) {
167 *
168 * lineLength = 0; } else {
169 *
170 * lineLength += 1; }
171 *
172 * fold();
173 *
174 *
175 * char[] chars = arg0.toCharArray();
176 *
177 * for (int i=0; i <chars.length; i++) {
178 *
179 * write(chars[i]); } }
180 */
181 }