| /* |
| * 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); |
| } |
| } |