/*
* Copyright 2015 Google Inc. All Rights Reserved.
*
* Licensed 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 com.google.errorprone;
import static com.google.common.io.Files.readLines;
import static com.google.errorprone.scanner.BuiltInCheckerSuppliers.ENABLED_ERRORS;
import static com.google.errorprone.scanner.BuiltInCheckerSuppliers.ENABLED_WARNINGS;
import static java.nio.charset.StandardCharsets.UTF_8;
import com.beust.jcommander.IStringConverter;
import com.beust.jcommander.JCommander;
import com.beust.jcommander.Parameter;
import com.beust.jcommander.Parameters;
import com.google.common.collect.Iterables;
import java.io.IOException;
import java.io.Writer;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
/**
* Utility main which consumes the same tab-delimited text file and generates GitHub pages for
* the BugPatterns.
*/
public class DocGenTool {
@Parameters(separators = "=")
static class Options {
@Parameter(names = "-bug_patterns", description = "Path to bugPatterns.txt", required = true)
private String bugPatterns;
@Parameter(
names = "-explanations",
description = "Path to side-car explanations",
required = true
)
private String explanations;
@Parameter(names = "-docs_repository", description = "Path to docs repository", required = true)
private String docsRepository;
@Parameter(names = "-examplesDir", description = "Path to examples directory", required = true)
private String examplesDir;
@Parameter(
names = "-target",
description = "Whether to target the internal or external site",
converter = TargetEnumConverter.class,
required = true
)
private Target target;
@Parameter(
names = "-use_pygments_highlighting",
description = "Use pygments for highlighting",
arity = 1
)
private boolean usePygments = true;
@Parameter(
names = "-base_url",
description = "The base url for links to bugpatterns",
arity = 1
)
private String baseUrl = null;
}
enum Target {
INTERNAL,
EXTERNAL
}
public static class TargetEnumConverter implements IStringConverter<Target> {
@Override
public Target convert(String arg) {
return Target.valueOf(arg.toUpperCase());
}
}
public static void main(String[] args) throws IOException {
Options options = new Options();
new JCommander(options, args);
Path bugPatterns = Paths.get(options.bugPatterns);
if (!Files.exists(bugPatterns)) {
usage("Cannot find bugPatterns file: " + options.bugPatterns);
}
Path explanationDir = Paths.get(options.explanations);
if (!Files.exists(explanationDir)) {
usage("Cannot find explanations dir: " + options.explanations);
}
Path wikiDir = Paths.get(options.docsRepository);
Files.createDirectories(wikiDir);
Path exampleDirBase = Paths.get(options.examplesDir);
if (!Files.exists(exampleDirBase)) {
usage("Cannot find example directory: " + options.examplesDir);
}
Path bugpatternDir = wikiDir.resolve("bugpattern");
if (!Files.exists(bugpatternDir)) {
Files.createDirectories(bugpatternDir);
}
Files.createDirectories(wikiDir.resolve("_data"));
BugPatternFileGenerator generator =
new BugPatternFileGenerator(
bugpatternDir,
exampleDirBase,
explanationDir,
options.target == Target.EXTERNAL,
options.usePygments,
options.baseUrl);
try (Writer w =
Files.newBufferedWriter(wikiDir.resolve("bugpatterns.md"), StandardCharsets.UTF_8)) {
List<BugPatternInstance> patterns = readLines(bugPatterns.toFile(), UTF_8, generator);
new BugPatternIndexWriter().dump(patterns, w, options.target, enabledChecks());
}
}
private static Set<String> enabledChecks() {
return StreamSupport.stream(
Iterables.concat(
ENABLED_ERRORS,
ENABLED_WARNINGS)
.spliterator(),
false)
.map(BugCheckerInfo::canonicalName)
.collect(Collectors.toCollection(HashSet::new));
}
private static void usage(String err) {
System.err.println(err);
System.exit(1);
}
}