You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pivot.apache.org by rw...@apache.org on 2018/04/27 17:16:50 UTC
svn commit: r1830370 - /pivot/trunk/StyleErrors.java
Author: rwhitcomb
Date: Fri Apr 27 17:16:50 2018
New Revision: 1830370
URL: http://svn.apache.org/viewvc?rev=1830370&view=rev
Log:
PIVOT-1032: Add a program to summarize the results of the "check style" task.
Note: not updating the "build.xml" yet because it would require the check-style
plugin to be available with the Ant files.
Added:
pivot/trunk/StyleErrors.java
Added: pivot/trunk/StyleErrors.java
URL: http://svn.apache.org/viewvc/pivot/trunk/StyleErrors.java?rev=1830370&view=auto
==============================================================================
--- pivot/trunk/StyleErrors.java (added)
+++ pivot/trunk/StyleErrors.java Fri Apr 27 17:16:50 2018
@@ -0,0 +1,151 @@
+/*
+ * 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.
+ */
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Read the file(s) given on the command line, which are presumed to be
+ * the output of the "check styles", and generate a summary of the results.
+ */
+public final class StyleErrors {
+ /** Private constructor because we only use static methods here. */
+ private StyleErrors() {
+ }
+
+ /**
+ * A summary object holding one type of error and the number of times
+ * it was encountered.
+ */
+ private static class Info {
+ /** The error class from the check styles configuration. */
+ private String errorClass;
+ /** The final count of how many times this error was encountered. */
+ private Integer count;
+
+ /** Construct one of these with the given information.
+ * @param errClass The checkstyle error.
+ * @param c The final count of these errors.
+ */
+ Info(final String errClass, final Integer c) {
+ this.errorClass = errClass;
+ this.count = c;
+ }
+ /** @return The saved checkstyle error name. */
+ String getErrorClass() {
+ return errorClass;
+ }
+ /** @return The final count of this error type. */
+ Integer getCount() {
+ return count;
+ }
+ }
+
+ /**
+ * A comparator that sorts first by count and then by the error class name.
+ */
+ private static Comparator<Info> comparator = new Comparator<Info>() {
+ @Override
+ public int compare(final Info o1, final Info o2) {
+ // Order first by count, then by class name
+ int c1 = o1.count.intValue();
+ int c2 = o2.count.intValue();
+ if (c1 == c2) {
+ return o1.errorClass.compareTo(o2.errorClass);
+ } else {
+ return Integer.signum(c1 - c2);
+ }
+ }
+ };
+
+ /** Pattern used to parse each input line. */
+ private static final Pattern LINE_PATTERN =
+ Pattern.compile("^\\[[A-Z]+\\]\\s+(.+)\\:(\\d+)\\:(\\d+\\:)?\\s+(.+)\\s+(\\[[a-zA-Z]+\\])$");
+ /** The group in the {@link #LINE_PATTERN} that contains the checkstyle error name. */
+ private static final int CLASS_NAME_GROUP = 5;
+ /** A format string used to output all the information in a uniform manner. */
+ private static final String FORMAT = "%1$-32s%2$5d%n";
+ /** Format string used to print the underlines. */
+ private static final String UNDER_FORMAT = "%1$-32s%2$5s%n";
+ /** For each type of checkstyle error, the name and running count for each. */
+ private static Map<String, Integer> counts = new TreeMap<>();
+ /** At the end of each file, the list used to sort by count and name. */
+ private static List<Info> sortedList = new ArrayList<>();
+
+ /**
+ * The main method, executed from the command line, which reads through each file
+ * and processes it.
+ * @param args The command line arguments.
+ */
+ public static void main(final String[] args) {
+ for (String arg : args) {
+ int lineNo = 0;
+ counts.clear();
+ sortedList.clear();
+ try (BufferedReader reader = new BufferedReader(new FileReader(new File(arg)))) {
+ String line;
+ while ((line = reader.readLine()) != null) {
+ lineNo++;
+ Matcher m = LINE_PATTERN.matcher(line);
+ if (m.matches()) {
+ String errorClass = m.group(CLASS_NAME_GROUP);
+ Integer count = counts.get(errorClass);
+ if (count == null) {
+ count = Integer.valueOf(1);
+ } else {
+ int i = count.intValue() + 1;
+ count = Integer.valueOf(i);
+ }
+ counts.put(errorClass, count);
+ } else if (line.equals("Starting audit...") || line.equals("Audit done.")) {
+ continue;
+ } else {
+ System.err.println("Line " + lineNo + ". Doesn't match the pattern.");
+ System.err.println("\t" + line);
+ }
+ }
+ } catch (IOException ioe) {
+ System.err.println("Error reading the \"" + arg + "\" file: " + ioe.getMessage());
+ }
+ int total = 0;
+ for (String key : counts.keySet()) {
+ Integer count = counts.get(key);
+ total += count.intValue();
+ Info info = new Info(key, count);
+ sortedList.add(info);
+ }
+ Collections.sort(sortedList, comparator);
+ for (Info info : sortedList) {
+ System.out.format(FORMAT, info.getErrorClass(), info.getCount());
+ }
+ System.out.format(UNDER_FORMAT, "----------------------------", "-----");
+ System.out.format(FORMAT, "Grand Total", total);
+ System.out.println();
+ }
+ }
+
+}
+