001/**
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements.  See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership.  The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License.  You may obtain a copy of the License at
009 *
010 *     http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018
019package org.apache.hadoop.record;
020
021import java.io.InputStreamReader;
022import java.io.InputStream;
023import java.io.IOException;
024import java.io.PushbackReader;
025import java.io.UnsupportedEncodingException;
026
027import org.apache.hadoop.classification.InterfaceAudience;
028import org.apache.hadoop.classification.InterfaceStability;
029
030/**
031 * @deprecated Replaced by <a href="https://hadoop.apache.org/avro/">Avro</a>.
032 */
033@Deprecated
034@InterfaceAudience.Public
035@InterfaceStability.Stable
036public class CsvRecordInput implements RecordInput {
037    
038  private PushbackReader stream;
039    
040  private class CsvIndex implements Index {
041    public boolean done() {
042      char c = '\0';
043      try {
044        c = (char) stream.read();
045        stream.unread(c);
046      } catch (IOException ex) {
047      }
048      return (c == '}') ? true : false;
049    }
050    public void incr() {}
051  }
052    
053  private void throwExceptionOnError(String tag) throws IOException {
054    throw new IOException("Error deserializing "+tag);
055  }
056    
057  private String readField(String tag) throws IOException {
058    try {
059      StringBuilder buf = new StringBuilder();
060      while (true) {
061        char c = (char) stream.read();
062        switch (c) {
063        case ',':
064          return buf.toString();
065        case '}':
066        case '\n':
067        case '\r':
068          stream.unread(c);
069          return buf.toString();
070        default:
071          buf.append(c);
072        }
073      }
074    } catch (IOException ex) {
075      throw new IOException("Error reading "+tag);
076    }
077  }
078    
079  /** Creates a new instance of CsvRecordInput */
080  public CsvRecordInput(InputStream in) {
081    try {
082      stream = new PushbackReader(new InputStreamReader(in, "UTF-8"));
083    } catch (UnsupportedEncodingException ex) {
084      throw new RuntimeException(ex);
085    }
086  }
087    
088  public byte readByte(String tag) throws IOException {
089    return (byte) readLong(tag);
090  }
091    
092  public boolean readBool(String tag) throws IOException {
093    String sval = readField(tag);
094    return "T".equals(sval) ? true : false;
095  }
096    
097  public int readInt(String tag) throws IOException {
098    return (int) readLong(tag);
099  }
100    
101  public long readLong(String tag) throws IOException {
102    String sval = readField(tag);
103    try {
104      long lval = Long.parseLong(sval);
105      return lval;
106    } catch (NumberFormatException ex) {
107      throw new IOException("Error deserializing "+tag);
108    }
109  }
110    
111  public float readFloat(String tag) throws IOException {
112    return (float) readDouble(tag);
113  }
114    
115  public double readDouble(String tag) throws IOException {
116    String sval = readField(tag);
117    try {
118      double dval = Double.parseDouble(sval);
119      return dval;
120    } catch (NumberFormatException ex) {
121      throw new IOException("Error deserializing "+tag);
122    }
123  }
124    
125  public String readString(String tag) throws IOException {
126    String sval = readField(tag);
127    return Utils.fromCSVString(sval);
128  }
129    
130  public Buffer readBuffer(String tag) throws IOException {
131    String sval = readField(tag);
132    return Utils.fromCSVBuffer(sval);
133  }
134    
135  public void startRecord(String tag) throws IOException {
136    if (tag != null && !"".equals(tag)) {
137      char c1 = (char) stream.read();
138      char c2 = (char) stream.read();
139      if (c1 != 's' || c2 != '{') {
140        throw new IOException("Error deserializing "+tag);
141      }
142    }
143  }
144    
145  public void endRecord(String tag) throws IOException {
146    char c = (char) stream.read();
147    if (tag == null || "".equals(tag)) {
148      if (c != '\n' && c != '\r') {
149        throw new IOException("Error deserializing record.");
150      } else {
151        return;
152      }
153    }
154        
155    if (c != '}') {
156      throw new IOException("Error deserializing "+tag);
157    }
158    c = (char) stream.read();
159    if (c != ',') {
160      stream.unread(c);
161    }
162        
163    return;
164  }
165    
166  public Index startVector(String tag) throws IOException {
167    char c1 = (char) stream.read();
168    char c2 = (char) stream.read();
169    if (c1 != 'v' || c2 != '{') {
170      throw new IOException("Error deserializing "+tag);
171    }
172    return new CsvIndex();
173  }
174    
175  public void endVector(String tag) throws IOException {
176    char c = (char) stream.read();
177    if (c != '}') {
178      throw new IOException("Error deserializing "+tag);
179    }
180    c = (char) stream.read();
181    if (c != ',') {
182      stream.unread(c);
183    }
184    return;
185  }
186    
187  public Index startMap(String tag) throws IOException {
188    char c1 = (char) stream.read();
189    char c2 = (char) stream.read();
190    if (c1 != 'm' || c2 != '{') {
191      throw new IOException("Error deserializing "+tag);
192    }
193    return new CsvIndex();
194  }
195    
196  public void endMap(String tag) throws IOException {
197    char c = (char) stream.read();
198    if (c != '}') {
199      throw new IOException("Error deserializing "+tag);
200    }
201    c = (char) stream.read();
202    if (c != ',') {
203      stream.unread(c);
204    }
205    return;
206  }
207}