/* See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * Esri Inc. licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.esri.gpt.control.webharvest.engine; import com.esri.gpt.framework.util.Val; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.logging.Level; import java.util.logging.Logger; /** * Record reader. */ class RecordReader extends Reader { /** logger */ private static final Logger LOGGER = Logger.getLogger(RecordReader.class.getCanonicalName()); /** buffered reader */ private BufferedReader reader; /** * Creates instance of the reader. * @param input input stream */ public RecordReader(InputStream input) { try { this.reader = new BufferedReader(new InputStreamReader(input, "UTF-8")); } catch (UnsupportedEncodingException ex) { LOGGER.log(Level.SEVERE, "Error creating record reader", ex); } } /** * Reads single record. * @return record or <code>null</code> if no more records * @throws IOException if reading record fails */ public ReportRecord readRecord() throws IOException { // read line, it supposed to be an obligatory part of record String line = reader.readLine(); // no mo records if no line if (line==null) return null; // check if more records expected boolean more = true; if (line.endsWith(ReportBuilder.RECORD_SEPARATOR)) { more = false; line = line.substring(0, line.length()-1); } // extract basic information String [] params = extractBasicInformation(line); // create record instance ReportRecord record = new ReportRecord(); record.setSourceUri(params[0]); record.setValidated(Val.chkBool(params[1], false)); record.setPublished(Val.chkBool(params[2], false)); // read and update errors ArrayList<String> errors = new ArrayList<String>(); while (more) { line = reader.readLine(); if (line==null) break; if (line.endsWith(ReportBuilder.RECORD_SEPARATOR)) { more = false; line = line.substring(0, line.length()-1); } errors.add(line); } if (errors.size()>0) { record.setErrors(errors); } return record; } @Override public int read(char[] cbuf, int off, int len) throws IOException { return reader.read(cbuf, off, len); } @Override public void close() throws IOException { reader.close(); } /** * Extracts basic record information. * @param line line of the record entry * @return record information (sourceUri,validated,published) * @throws IOException if extracting information fails */ private String [] extractBasicInformation(String line) throws IOException { String [] params = line.split(ReportBuilder.UNIT_SEPARATOR); if (params.length!=3) throw new IOException("Invalid record entry."); return params; } }