blob: 10f2c626b0d870d699ce9ceb0ac6ad62a622a926 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF 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 org.apache.livy
/**
* Helper class to deal with end-of-line markers in text files.
*/
object EOLUtils {
/** Unix-style end-of-line marker (LF) */
private val EOL_UNIX: String = "\n"
/** Windows-style end-of-line marker (CRLF) */
private val EOL_WINDOWS: String = "\r\n"
/** "Old Mac"-style end-of-line marker (CR) */
private val EOL_OLD_MAC: String = "\r"
/** Default end-of-line marker on current syste */
private val EOL_SYSTEM_DEFAULT: String = System.getProperty("line.separator")
object Mode extends Enumeration {
type Mode = Value
val LF, CRLF, CR = Value
lazy val SYSTEM_DEFAULT: Mode = {
val tmp = if (EOL_SYSTEM_DEFAULT == EOL_UNIX) {
LF
} else if (EOL_SYSTEM_DEFAULT == EOL_WINDOWS) {
CRLF
} else if (EOL_SYSTEM_DEFAULT == EOL_OLD_MAC) {
CR
} else {
null
}
if (tmp == null) {
throw new IllegalStateException("Could not determine system default end-of-line marker")
}
tmp
}
private def determineEOL(s: String): Mode = {
val charArray = s.toCharArray
var prev: Char = null.asInstanceOf[Char]
for (ch <- charArray) {
if (ch == '\n') {
if (prev == '\r') {
return CRLF
} else {
return LF
}
} else if (prev == '\r') {
return CR
}
prev = ch
}
null
}
def hasWindowsEOL(s: String): Boolean = determineEOL(s) == CRLF
def hasUnixEOL(s: String): Boolean = determineEOL(s) == LF
def hasOldMacEOL(s: String): Boolean = determineEOL(s) == CR
def hasSystemDefaultEOL(s: String): Boolean = determineEOL(s) == SYSTEM_DEFAULT
}
def convertToSystemEOL(s: String): String = convertLineEndings(s, EOL_SYSTEM_DEFAULT)
private def convertLineEndings(s: String, eol: String): String = {
if (Mode.hasWindowsEOL(s)) {
s.replaceAll(EOL_WINDOWS, eol)
} else if (Mode.hasUnixEOL(s)) {
s.replaceAll(EOL_UNIX, eol)
} else if (Mode.hasOldMacEOL(s)) {
s.replaceAll(EOL_OLD_MAC, eol)
} else {
s
}
}
}