|
@@ -0,0 +1,101 @@
|
|
|
+/*
|
|
|
+ * 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
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|