KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > hsqldb > rowio > RowInputTextQuoted


1 /* Copyright (c) 2001-2005, The HSQL Development Group
2  * All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *
7  * Redistributions of source code must retain the above copyright notice, this
8  * list of conditions and the following disclaimer.
9  *
10  * Redistributions in binary form must reproduce the above copyright notice,
11  * this list of conditions and the following disclaimer in the documentation
12  * and/or other materials provided with the distribution.
13  *
14  * Neither the name of the HSQL Development Group nor the names of its
15  * contributors may be used to endorse or promote products derived from this
16  * software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21  * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG,
22  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
26  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  */

30
31
32 package org.hsqldb.rowio;
33
34 import java.io.IOException JavaDoc;
35
36 import org.hsqldb.Trace;
37
38 /**
39  * Fields in the source file need not be quoted. Methods in this class unquote
40  * the fields if they are quoted and handle quote character doubling in this
41  * case.
42  *
43  * @author sqlbob@users (RMP)
44  * @version 1.7.2
45  * @since 1.7.0
46  */

47 public class RowInputTextQuoted extends RowInputText {
48
49     private static final int NORMAL_FIELD = 0;
50     private static final int NEED_END_QUOTE = 1;
51     private static final int FOUND_QUOTE = 2;
52     private char[] qtext;
53
54     public RowInputTextQuoted(String JavaDoc fieldSep, String JavaDoc varSep,
55                               String JavaDoc longvarSep, boolean allQuoted) {
56         super(fieldSep, varSep, longvarSep, allQuoted);
57     }
58
59     public void setSource(String JavaDoc text, int pos, int byteSize) {
60
61         super.setSource(text, pos, byteSize);
62
63         qtext = text.toCharArray();
64     }
65
66     protected String JavaDoc getField(String JavaDoc sep, int sepLen,
67                               boolean isEnd) throws IOException JavaDoc {
68
69         //fredt - now the only supported behaviour is emptyIsNull
70
String JavaDoc s = null;
71
72         if (next >= qtext.length || qtext[next] != '\"') {
73             return (super.getField(sep, sepLen, isEnd));
74         }
75
76         try {
77             field++;
78
79             StringBuffer JavaDoc ret = new StringBuffer JavaDoc();
80             boolean done = false;
81             int state = NORMAL_FIELD;
82             int end = -1;
83
84             if (!isEnd) {
85                 end = text.indexOf(sep, next);
86             }
87
88             for (; next < qtext.length; next++) {
89                 switch (state) {
90
91                     case NORMAL_FIELD :
92                     default :
93                         if (next == end) {
94                             next += sepLen;
95                             done = true;
96                         } else if (qtext[next] == '\"') {
97
98                             //-- Beginning of field
99
state = NEED_END_QUOTE;
100                         } else {
101                             ret.append(qtext[next]);
102                         }
103                         break;
104
105                     case NEED_END_QUOTE :
106                         if (qtext[next] == '\"') {
107                             state = FOUND_QUOTE;
108                         } else {
109                             ret.append(qtext[next]);
110                         }
111                         break;
112
113                     case FOUND_QUOTE :
114                         if (qtext[next] == '\"') {
115
116                             //-- Escaped quote
117
ret.append(qtext[next]);
118
119                             state = NEED_END_QUOTE;
120                         } else {
121                             next += sepLen - 1;
122                             state = NORMAL_FIELD;
123
124                             if (!isEnd) {
125                                 next++;
126
127                                 done = true;
128                             }
129                         }
130                         break;
131                 }
132
133                 if (done) {
134                     break;
135                 }
136             }
137
138             s = ret.toString();
139         } catch (Exception JavaDoc e) {
140             throw new IOException JavaDoc(
141                 Trace.getMessage(
142                     Trace.QuotedTextDatabaseRowInput_getField2, true,
143                     new Object JavaDoc[] {
144                 new Integer JavaDoc(field), e.toString()
145             }));
146         }
147
148         return s;
149     }
150 }
151
Popular Tags