mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

Gaetan Boismal
23.25.2016 9e50f0fb2f8bea2bed2ae1535091bfecfa1e944a
OPENDJ-2689 Improve copyright-maven-plugin

Use enum to describe what a comment should looks like for supported
extensions.
Also renames test files in consequences.
Add support for the following extensions: java.stub, mc, security,
xml.vm
2 files modified
220 ■■■■■ changed files
opendj-sdk/opendj-copyright-maven-plugin/src/main/java/org/forgerock/maven/CopyrightAbstractMojo.java 183 ●●●●● patch | view | raw | blame | history
opendj-sdk/opendj-copyright-maven-plugin/src/main/java/org/forgerock/maven/UpdateCopyrightMojo.java 37 ●●●●● patch | view | raw | blame | history
opendj-sdk/opendj-copyright-maven-plugin/src/main/java/org/forgerock/maven/CopyrightAbstractMojo.java
@@ -92,14 +92,10 @@
    /** The file extensions to test. */
    public static final List<String> CHECKED_EXTENSIONS = Arrays.asList(
            "bat", "c", "h", "html", "java", "ldif", "Makefile", "mc", "properties", "sh", "txt", "xml", "xsd", "xsl");
    private static final List<String> EXCLUDED_END_COMMENT_BLOCK_TOKEN = Arrays.asList("*/", "-->");
    private static final List<String> SUPPORTED_COMMENT_MIDDLE_BLOCK_TOKEN = Arrays.asList("*", "#", "rem", "!");
    private static final List<String> SUPPORTED_START_BLOCK_COMMENT_TOKEN = Arrays.asList("/*", "<!--");
            "bat", "c", "fml", "h", "html", "java", "java.stub", "ldif", "mc",
            "md", "properties", "security", "sh", "txt", "xjb", "xml", "xml.vm", "xsd", "xsl");
    private final class CustomGitExeScmProvider extends GitExeScmProvider {
        @Override
        protected GitCommand getDiffCommand() {
            return new CustomGitDiffCommand();
@@ -107,7 +103,6 @@
    }
    private class CustomGitDiffCommand extends GitDiffCommand implements GitCommand {
        @Override
        protected DiffScmResult executeDiffCommand(ScmProviderRepository repo, ScmFileSet fileSet,
                ScmVersion unused, ScmVersion unused2) throws ScmException {
@@ -125,6 +120,118 @@
    }
    private static String resolveExtension(final String filePath) {
        int firstPeriodPos = filePath.indexOf('.');
        if (firstPeriodPos > 0) {
            return filePath.substring(firstPeriodPos + 1);
        }
        return "";
    }
    enum CommentParser {
        BAT("rem"),
        DEFAULT("#", "*", "!", "//"),
        JAVA("/*", "*/", Arrays.asList("*", "//", "")),
        MC(";"),
        SH("#"),
        XML("<!--", "-->", Arrays.asList("!", "~", ""));
        static CommentParser createParserForFile(final String filePath) {
            switch (resolveExtension(filePath)) {
            case "java":
            case "c":
            case "h":
                return JAVA;
            case "fml":
            case "html":
            case "md":
            case "xjb":
            case "xml":
            case "xml.vm":
            case "xsd":
            case "xsl":
                return XML;
            case "bat":
                return BAT;
            case "security":
            case "sh":
            case "ldif":
            case "properties":
                return SH;
            case "mc":
                return MC;
            default:
                return DEFAULT;
            }
        }
        private final String startBlock;
        private final String endBlock;
        private final List<String> middleBlockTokens;
        private String currentLine = "";
        private boolean supportCommentBlocks;
        private boolean commentBlockOpened;
        CommentParser(final String... middleBlockTokens) {
            this(null, null, Arrays.asList(middleBlockTokens));
        }
        CommentParser(final String startBlock, final String endBlock, final List<String> middleBlockTokens) {
            this.startBlock = startBlock;
            this.endBlock = endBlock;
            this.middleBlockTokens = middleBlockTokens;
            this.supportCommentBlocks = startBlock != null && endBlock != null;
        }
        void consumeLine(final String line) {
            if (line != null) {
                if (supportCommentBlocks && currentLine.endsWith(endBlock)) {
                    commentBlockOpened = false;
                }
                currentLine = line.trim();
                if (supportCommentBlocks && currentLine.startsWith(startBlock)) {
                    commentBlockOpened = true;
                }
            }
        }
        boolean isCommentLine() {
            return commentBlockOpened
                    || startsWithCommentLineToken();
        }
        private boolean startsWithCommentLineToken() {
            return getCommentTokenInLine(currentLine) != null;
        }
        private String getCommentTokenInLine(final String line) {
            for (final String token : middleBlockTokens) {
                if (line.startsWith(token)) {
                    return token;
                }
            }
            return null;
        }
        String getNewCommentedLine(final String line) throws Exception {
            final String commentToken = getCommentTokenInLine(line.trim());
            if (commentToken == null) {
                throw new Exception("Incompatibles comments lines in the file.");
            }
            String resultLine = "";
            if (commentToken.isEmpty()) {
                resultLine = " ";
            }
            return resultLine + line.substring(0, line.indexOf(commentToken) + commentToken.length());
        }
        boolean isNonEmptyCommentedLine() {
            final String commentToken = getCommentTokenInLine(currentLine);
            return commentToken == null || !commentToken.equals(currentLine);
        }
    }
    /** The string representation of the current year. */
    Integer currentYear = Calendar.getInstance().get(Calendar.YEAR);
@@ -262,20 +369,12 @@
    /** Examines the provided files list to determine whether each changed file copyright is acceptable. */
    void checkCopyrights() throws MojoExecutionException, MojoFailureException {
        for (final File changedFile : getChangedFiles()) {
            if (!changedFile.exists() || !changedFile.isFile()) {
                continue;
            }
            final String changedFileName = changedFile.getPath();
            int lastPeriodPos = changedFileName.lastIndexOf('.');
            if (lastPeriodPos > 0) {
                String extension = changedFileName.substring(lastPeriodPos + 1);
                if (!CHECKED_EXTENSIONS.contains(extension.toLowerCase())) {
                    continue;
                }
            } else if (fileNameEquals("bin", changedFile.getParentFile())
                    && fileNameEquals("resource", changedFile.getParentFile().getParentFile())) {
                // ignore resource/bin directory.
            if (!changedFile.exists()
                    || !changedFile.isFile()
                    || !CHECKED_EXTENSIONS.contains(resolveExtension(changedFile.getPath()).toLowerCase())
                    || (fileNameEquals("bin", changedFile.getParentFile())
                           && fileNameEquals("resource", changedFile.getParentFile().getParentFile()))) {
                // Verify that the file must be checked (ignore bin/resource directory)
                continue;
            }
@@ -295,11 +394,12 @@
     */
    private boolean checkCopyrightForFile(File changedFile) throws MojoExecutionException {
        try (BufferedReader reader = new BufferedReader(new FileReader(changedFile))) {
            final CommentParser commentParser = CommentParser.createParserForFile(changedFile.getPath());
            String line;
            while ((line = reader.readLine()) != null) {
                String lowerLine = line.toLowerCase().trim();
                if (isCommentLine(lowerLine)
                        && lowerLine.contains("copyright")
                commentParser.consumeLine(line);
                if (commentParser.isCommentLine()
                        && line.toLowerCase().trim().contains("copyright")
                        && line.contains(currentYear.toString())
                        && line.contains(copyrightOwnerToken)) {
                    return true;
@@ -312,39 +412,4 @@
                    + " to check copyright date. No further copyright date checking will be performed.");
        }
    }
    private String getCommentToken(String line, boolean includesStartBlock) {
        final List<String> supportedTokens = new ArrayList<>(SUPPORTED_COMMENT_MIDDLE_BLOCK_TOKEN);
        if (includesStartBlock) {
            supportedTokens.addAll(SUPPORTED_START_BLOCK_COMMENT_TOKEN);
        }
        if (trimmedLineStartsWith(line, EXCLUDED_END_COMMENT_BLOCK_TOKEN) != null) {
            return null;
        }
        return trimmedLineStartsWith(line, supportedTokens);
    }
    private String trimmedLineStartsWith(String line, List<String> supportedTokens) {
        for (String token : supportedTokens) {
            if (line.trim().startsWith(token)) {
                return token;
            }
        }
        return null;
    }
    boolean isNonEmptyCommentedLine(String line) {
        String commentToken = getCommentTokenInBlock(line);
        return commentToken == null || !commentToken.equals(line.trim());
    }
    String getCommentTokenInBlock(String line) {
        return getCommentToken(line, false);
    }
    boolean isCommentLine(String line) {
        return getCommentToken(line, true) != null;
    }
}
opendj-sdk/opendj-copyright-maven-plugin/src/main/java/org/forgerock/maven/UpdateCopyrightMojo.java
@@ -106,8 +106,8 @@
        private boolean commentBlockEnded;
        private boolean portionsCopyrightNeeded;
        private boolean copyrightSectionPresent;
        private CommentParser commentParser;
        private String curLine;
        private String curLowerLine;
        private Integer startYear;
        private Integer endYear;
        private final BufferedReader reader;
@@ -116,6 +116,7 @@
        private UpdateCopyrightFile(String filePath) throws IOException {
            this.filePath = filePath;
            reader = new BufferedReader(new FileReader(filePath));
            commentParser = CommentParser.createParserForFile(filePath);
            final File tmpFile = new File(filePath + ".tmp");
            if (!tmpFile.exists()) {
                tmpFile.createNewFile();
@@ -174,12 +175,17 @@
                previousLine = bufferedLines.get(indexAdd);
            }
            indexAdd++;
            final String newCommentedLine = commentParser.getNewCommentedLine(previousLine);
            if (!portionsCopyrightNeeded) {
                for (int i = 0; i < nbLinesToSkip; i++) {
                    bufferedLines.add(indexAdd++, getNewCommentedLine());
                    if (!bufferedLines.get(indexAdd).equals(newCommentedLine)) {
                        // We have a blank line already so do not add a new one.
                        bufferedLines.add(indexAdd, newCommentedLine);
                    }
                    indexAdd++;
                }
            }
            final String newCopyrightLine = getNewCommentedLine()
            final String newCopyrightLine = newCommentedLine
                    + indent() + (portionsCopyrightNeeded ? newPortionsCopyrightLabel : newCopyrightLabel)
                    + " " + currentYear + " " + forgeRockCopyrightLabel;
            bufferedLines.add(indexAdd, newCopyrightLine);
@@ -219,7 +225,7 @@
            nextLine();
            while (curLine != null) {
                if (curLineMatches(lineBeforeCopyrightCompiledRegExp)) {
                    if (!isCommentLine(curLowerLine)) {
                    if (!commentParser.isCommentLine()) {
                        throw new Exception("The line before copyright token must be a commented line");
                    }
                    lineBeforeCopyrightReaded = true;
@@ -236,7 +242,7 @@
            while (curLine != null) {
                if (isOldCopyrightOwnerLine()) {
                    return true;
                } else if (isNonEmptyCommentedLine(curLine)
                } else if (commentParser.isNonEmptyCommentedLine()
                            || isCopyrightLine()
                            || commentBlockEnded) {
                    return false;
@@ -250,7 +256,7 @@
            while (curLine != null) {
                if (isCopyrightLine()) {
                    return true;
                } else if ((isNonEmptyCommentedLine(curLine) && !isOldCopyrightOwnerLine())
                } else if ((commentParser.isNonEmptyCommentedLine() && !isOldCopyrightOwnerLine())
                            || commentBlockEnded) {
                    return false;
                }
@@ -277,6 +283,7 @@
        private void nextLine() throws Exception {
            curLine = reader.readLine();
            commentParser.consumeLine(curLine);
            if (curLine == null && !copyrightUpdated) {
                throw new Exception("unexpected end of file while trying to read copyright");
            } else  if (curLine != null) {
@@ -284,27 +291,11 @@
            }
            if (!copyrightUpdated) {
                curLowerLine = curLine.trim().toLowerCase();
                if (lineBeforeCopyrightReaded && !isCommentLine(curLowerLine)) {
                if (lineBeforeCopyrightReaded && !commentParser.isCommentLine()) {
                    commentBlockEnded = true;
                }
            }
        }
        private String getNewCommentedLine() throws Exception {
            int indexCommentToken = 1;
            String commentToken = null;
            String linePattern = null;
            while (bufferedLines.size() > indexCommentToken && commentToken == null) {
                linePattern = bufferedLines.get(indexCommentToken++);
                commentToken = getCommentTokenInBlock(linePattern);
            }
            if (commentToken == null) {
                throw new Exception("Incompatibles comments lines in the file.");
            }
            return linePattern.substring(0, linePattern.indexOf(commentToken) + 1);
        }
    }
    private static final Pattern OLD_COPYRIGHT_REGEXP = Pattern.compile(".*copyright.*", CASE_INSENSITIVE);