/******************************************************************************* * Copyright (c) 2015 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.orion.server.core; import java.io.BufferedReader; import java.io.IOException; import java.io.Reader; public class EndingAwareLineReader extends BufferedReader { private LineDelimiter lineDelimiter = null; private String line = null; private StringBuilder lineBuilder = new StringBuilder(); public EndingAwareLineReader(Reader in) { super(in); } /** * Returns next line from reader and sets lineDelimiter to proper line ending * @return String containing the next line * @throws IOException */ @Override public String readLine() throws IOException { char first = '0'; while (true) { first = (char) read(); if (first == (char) -1) { if (lineBuilder.length() == 0) return null; line = lineBuilder.toString(); lineDelimiter = LineDelimiter.EMPTY; lineBuilder.setLength(0); return line; } else if (first == '\n') { line = lineBuilder.toString(); lineDelimiter = LineDelimiter.LF; lineBuilder.setLength(0); return line; } else if (first == '\r') { char second = (char) read(); if (second == (char) -1) { line = lineBuilder.toString(); lineDelimiter = LineDelimiter.CR; lineBuilder.setLength(0); return line; }; if (second == '\n') { line = lineBuilder.toString(); lineDelimiter = LineDelimiter.CRLF; lineBuilder.setLength(0); return line; } else { line = lineBuilder.toString(); lineDelimiter = LineDelimiter.CR; lineBuilder.setLength(0); lineBuilder.append(second); return line; } } else { lineBuilder.append(first); } } } /** * Returns line delimiter associated with current line * @return String containing line delimiter (\r, \r\n, \n) */ public LineDelimiter getLineDelimiter() { return lineDelimiter; } public static enum LineDelimiter { LF("\n"),CR("\r"),CRLF("\r\n"),EMPTY(""); private final String lineDelimiter; LineDelimiter(String ld) { this.lineDelimiter = ld; } @Override public String toString() { return lineDelimiter; } } }