blob: 8983160a1af2da7ac93fc4ee4d8514464caed7f9 [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.hyracks.maven.license;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.Writer;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;
public class LicenseUtil {
private static int wrapLength = 80;
private static int wrapThreshold = 100;
private LicenseUtil() {
}
public static void setWrapLength(int wrapLength) {
LicenseUtil.wrapLength = wrapLength;
}
public static void setWrapThreshold(int wrapThreshold) {
LicenseUtil.wrapThreshold = wrapThreshold;
}
public static String trim(String input) throws IOException {
try (BufferedReader reader = new BufferedReader(new StringReader(input))) {
reader.mark(input.length() + 1);
StringWriter sw = new StringWriter();
trim(sw, reader);
return sw.toString();
}
}
public static String process(String input, boolean unpad, boolean wrap) throws IOException {
try (BufferedReader reader = new BufferedReader(new StringReader(input))) {
reader.mark(input.length() + 1);
StringWriter sw = new StringWriter();
trim(sw, reader, unpad, wrap);
sw.append('\n');
return sw.toString();
}
}
public static void readAndTrim(Writer out, File file) throws IOException {
try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
reader.mark((int) file.length() * 2);
trim(out, reader);
}
}
private static void trim(Writer out, BufferedReader reader) throws IOException {
trim(out, reader, true, true);
}
private static void trim(Writer out, BufferedReader reader, boolean unpad, boolean wrap) throws IOException {
Pair<Integer, Integer> result = null;
if (unpad || wrap) {
result = analyze(reader);
reader.reset();
}
doTrim(out, reader, unpad ? result.getLeft() : 0,
wrap && (result.getRight() > wrapThreshold) ? wrapLength : Integer.MAX_VALUE);
}
private static void doTrim(Writer out, BufferedReader reader, int extraPadding, int wrapLength) throws IOException {
boolean head = true;
int empty = 0;
for (String line = reader.readLine(); line != null; line = reader.readLine() ) {
if ("".equals(line.trim())) {
if (!head) {
empty++;
}
} else {
head = false;
for (; empty > 0; empty--) {
out.append('\n');
}
String trimmed = line.substring(extraPadding);
int leadingWS = trimmed.length() - trimmed.trim().length();
while (trimmed.length() > wrapLength) {
int cut = trimmed.lastIndexOf(' ', wrapLength);
cut = Math.max(cut, trimmed.lastIndexOf('\t', wrapLength));
if (cut != -1) {
out.append(trimmed.substring(0, cut));
out.append('\n');
trimmed = trimmed.substring(cut + 1);
} else {
out.append(trimmed.substring(0, wrapLength));
out.append('\n');
trimmed = trimmed.substring(wrapLength);
}
for (int i = 0; i < leadingWS; i++) {
trimmed = ' ' + trimmed;
}
}
out.append(trimmed);
empty++;
}
}
}
private static Pair<Integer, Integer> analyze(BufferedReader reader) throws IOException {
int freeSpaces = Integer.MAX_VALUE;
int maxLineLength = 0;
for (String line = reader.readLine(); line != null; line = reader.readLine()) {
// trim trailing WS
String rightTrimmed = line.replaceFirst("\\s*$", "");
if ("".equals(rightTrimmed)) {
// ignore empty lines
continue;
}
String fullyTrimmed = line.trim();
freeSpaces = Math.min(freeSpaces, rightTrimmed.length() - fullyTrimmed.length());
maxLineLength = Math.max(maxLineLength, fullyTrimmed.length());
}
return new ImmutablePair<>(freeSpaces, maxLineLength);
}
}