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

Gaetan Boismal
17.33.2015 ac4a54801838c7529387fe1e73c2e5c4a8872d1a
OPENDJ-1769 Add a copyright check-update maven plugin
24 files added
1 files modified
1555 ■■■■■ changed files
opendj-copyright-maven-plugin/pom.xml 103 ●●●●● patch | view | raw | blame | history
opendj-copyright-maven-plugin/src/main/java/org/forgerock/maven/CheckCopyrightMojo.java 85 ●●●●● patch | view | raw | blame | history
opendj-copyright-maven-plugin/src/main/java/org/forgerock/maven/CopyrightAbstractMojo.java 283 ●●●●● patch | view | raw | blame | history
opendj-copyright-maven-plugin/src/main/java/org/forgerock/maven/UpdateCopyrightMojo.java 424 ●●●●● patch | view | raw | blame | history
opendj-copyright-maven-plugin/src/main/java/org/forgerock/maven/package-info.java 29 ●●●●● patch | view | raw | blame | history
opendj-copyright-maven-plugin/src/test/java/org/forgerock/maven/UpdateCopyrightTestCase.java 182 ●●●●● patch | view | raw | blame | history
opendj-copyright-maven-plugin/src/test/resources/files/openam-copyrights/openam-bad-copyright-1.txt 18 ●●●●● patch | view | raw | blame | history
opendj-copyright-maven-plugin/src/test/resources/files/openam-copyrights/openam-bad-copyright-2.txt 19 ●●●●● patch | view | raw | blame | history
opendj-copyright-maven-plugin/src/test/resources/files/openam-copyrights/openam-bad-copyright-3.txt 16 ●●●●● patch | view | raw | blame | history
opendj-copyright-maven-plugin/src/test/resources/files/openam-copyrights/openam-bad-copyright-4.txt 17 ●●●●● patch | view | raw | blame | history
opendj-copyright-maven-plugin/src/test/resources/files/openam-copyrights/openam-bad-copyright-5.txt 18 ●●●●● patch | view | raw | blame | history
opendj-copyright-maven-plugin/src/test/resources/files/openam-copyrights/openam-bad-copyright-6.txt 20 ●●●●● patch | view | raw | blame | history
opendj-copyright-maven-plugin/src/test/resources/files/opendj-copyrights/opendj-bad-copyright-1.txt 28 ●●●●● patch | view | raw | blame | history
opendj-copyright-maven-plugin/src/test/resources/files/opendj-copyrights/opendj-bad-copyright-2.txt 27 ●●●●● patch | view | raw | blame | history
opendj-copyright-maven-plugin/src/test/resources/files/opendj-copyrights/opendj-bad-copyright-3.txt 25 ●●●●● patch | view | raw | blame | history
opendj-copyright-maven-plugin/src/test/resources/files/opendj-copyrights/opendj-bad-copyright-4.txt 27 ●●●●● patch | view | raw | blame | history
opendj-copyright-maven-plugin/src/test/resources/files/opendj-copyrights/opendj-bad-copyright-5.txt 27 ●●●●● patch | view | raw | blame | history
opendj-copyright-maven-plugin/src/test/resources/files/opendj-copyrights/opendj-bad-copyright-6.txt 29 ●●●●● patch | view | raw | blame | history
opendj-copyright-maven-plugin/src/test/resources/files/openidm-copyrights/openidm-bad-copyright-1.txt 26 ●●●●● patch | view | raw | blame | history
opendj-copyright-maven-plugin/src/test/resources/files/openidm-copyrights/openidm-bad-copyright-2.txt 26 ●●●●● patch | view | raw | blame | history
opendj-copyright-maven-plugin/src/test/resources/files/openidm-copyrights/openidm-bad-copyright-3.txt 24 ●●●●● patch | view | raw | blame | history
opendj-copyright-maven-plugin/src/test/resources/files/openidm-copyrights/openidm-bad-copyright-4.txt 25 ●●●●● patch | view | raw | blame | history
opendj-copyright-maven-plugin/src/test/resources/files/openidm-copyrights/openidm-bad-copyright-5.txt 26 ●●●●● patch | view | raw | blame | history
opendj-copyright-maven-plugin/src/test/resources/files/openidm-copyrights/openidm-bad-copyright-6.txt 28 ●●●●● patch | view | raw | blame | history
pom.xml 23 ●●●●● patch | view | raw | blame | history
opendj-copyright-maven-plugin/pom.xml
New file
@@ -0,0 +1,103 @@
<?xml version="1.0"?>
<project
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
    xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <artifactId>opendj-project</artifactId>
        <groupId>org.forgerock.opendj</groupId>
        <version>3.0.0-SNAPSHOT</version>
    </parent>
    <artifactId>opendj-copyright-maven-plugin</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <name>OpenDJ Copyright Check Maven Plugin</name>
    <description>
    Checks ForgeRock source file copyrights.
  </description>
    <packaging>maven-plugin</packaging>
    <properties>
        <forgerockBuildToolsVersion>1.0.2</forgerockBuildToolsVersion>
        <mavenVersion>3.2.3</mavenVersion>
        <plexusUtilsVersion>3.0.17</plexusUtilsVersion>
        <mavenPluginPluginVersion>3.2</mavenPluginPluginVersion>
    </properties>
    <dependencies>
        <!-- Maven -->
        <dependency>
            <groupId>org.apache.maven</groupId>
            <artifactId>maven-core</artifactId>
            <version>${mavenVersion}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.maven</groupId>
            <artifactId>maven-model</artifactId>
            <version>${mavenVersion}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.maven</groupId>
            <artifactId>maven-plugin-api</artifactId>
            <version>${mavenVersion}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.maven.plugin-tools</groupId>
            <artifactId>maven-plugin-annotations</artifactId>
            <version>${mavenPluginPluginVersion}</version>
            <scope>provided</scope>
        </dependency>
        <!-- Testing -->
        <dependency>
            <groupId>org.forgerock</groupId>
            <artifactId>forgerock-build-tools</artifactId>
            <version>${forgerockBuildToolsVersion}</version>
            <scope>test</scope>
        </dependency>
        <!-- Other -->
        <dependency>
            <groupId>org.twdata.maven</groupId>
            <artifactId>mojo-executor</artifactId>
            <version>2.2.0</version>
        </dependency>
        <!-- Runtime -->
        <dependency>
          <groupId>org.forgerock.commons</groupId>
          <artifactId>forgerock-util</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.maven.scm</groupId>
            <artifactId>maven-scm-api</artifactId>
            <version>1.9.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.maven.scm</groupId>
            <artifactId>maven-scm-provider-svn-commons</artifactId>
            <version>1.9.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.maven.scm</groupId>
            <artifactId>maven-scm-provider-svnexe</artifactId>
            <version>1.9.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.maven.scm</groupId>
            <artifactId>maven-scm-provider-gitexe</artifactId>
            <version>1.9.2</version>
        </dependency>
    </dependencies>
</project>
opendj-copyright-maven-plugin/src/main/java/org/forgerock/maven/CheckCopyrightMojo.java
New file
@@ -0,0 +1,85 @@
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
 * or http://forgerock.org/license/CDDLv1.0.html.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at legal-notices/CDDLv1_0.txt.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information:
 *      Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 *
 *
 *      Copyright 2015 ForgeRock AS.
 */
package org.forgerock.maven;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
/**
 * This be used to check that if a modified file contains a line that appears to
 * be a comment and includes the word "copyright", then it should contain the
 * current year.
 */
@Mojo(name = "check-copyright", defaultPhase = LifecyclePhase.VALIDATE)
public class CheckCopyrightMojo extends CopyrightAbstractMojo {
    /**
     * The property that may be used to prevent copyright date problems from
     * failing the build.
     */
    @Parameter(required = true, property = "ignoreCopyrightErrors", defaultValue = "false")
    private boolean ignoreCopyrightErrors;
    @Parameter(required = true, property = "skipCoyprightCheck", defaultValue = "false")
    private boolean checkDisabled;
    /**
     * Uses maven-scm API to identify all modified files in the current
     * workspace. For all source files, check if the copyright is up to date.
     *
     * @throws MojoFailureException
     *             if any
     * @throws MojoExecutionException
     *             if any
     */
    public void execute() throws MojoFailureException, MojoExecutionException {
        if (checkDisabled) {
            getLog().info("Copyright check is disabled");
            return;
        }
        checkCopyrights();
        if (!getIncorrectCopyrightFilePaths().isEmpty()) {
            getLog().warn("Potential copyright year updates needed for the following files:");
            for (String filename : getIncorrectCopyrightFilePaths()) {
                getLog().warn("     " + filename);
            }
            if (!ignoreCopyrightErrors) {
                getLog().warn("Fix copyright date problems before proceeding, "
                                + "or use '-DignoreCopyrightErrors=true' to ignore copyright errors.");
                getLog().warn("You can use 'mvn org.forgerock.opendj:opendj-copyright-maven-plugin:update-copyright' "
                        + "command to automatically update copyrights.");
                throw new MojoExecutionException("Found files with potential copyright year updates needed");
            }
        } else {
            getLog().info("Copyrights are up to date");
        }
    }
}
opendj-copyright-maven-plugin/src/main/java/org/forgerock/maven/CopyrightAbstractMojo.java
New file
@@ -0,0 +1,283 @@
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
 * or http://forgerock.org/license/CDDLv1.0.html.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at legal-notices/CDDLv1_0.txt.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information:
 *      Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 *
 *
 *      Copyright 2015 ForgeRock AS.
 */
package org.forgerock.maven;
import static org.forgerock.util.Utils.*;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Arrays;
import java.util.Calendar;
import java.util.LinkedList;
import java.util.List;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.project.MavenProject;
import org.apache.maven.scm.ScmException;
import org.apache.maven.scm.ScmFile;
import org.apache.maven.scm.ScmFileSet;
import org.apache.maven.scm.command.status.StatusScmResult;
import org.apache.maven.scm.manager.BasicScmManager;
import org.apache.maven.scm.manager.NoSuchScmProviderException;
import org.apache.maven.scm.manager.ScmManager;
import org.apache.maven.scm.provider.ScmProvider;
import org.apache.maven.scm.provider.git.gitexe.GitExeScmProvider;
import org.apache.maven.scm.provider.svn.svnexe.SvnExeScmProvider;
import org.apache.maven.scm.repository.ScmRepository;
import org.apache.maven.scm.repository.ScmRepositoryException;
/**
 * Abstract class which is used for both copyright checks and updates.
 */
public abstract class CopyrightAbstractMojo extends AbstractMojo {
    /** The Maven Project. */
    @Parameter(required = true, property = "project", readonly = true)
    private MavenProject project;
    /**
     * Copyright owner.
     * This string token must be present on the same line with 'copyright' keyword and the current year.
     */
    @Parameter(required = true, defaultValue = "ForgeRock AS")
    private String copyrightOwnerToken;
    /** The path to the root of the Subversion workspace to check. */
    @Parameter(required = true, defaultValue = "${basedir}")
    private String scmWorkspaceRoot;
    @Parameter(required = true, defaultValue = "${project.scm.connection}")
    private String scmRepositoryUrl;
    /** The file extensions to test. */
    public static final List<String> CHECKED_EXTENSIONS = new LinkedList<String>(Arrays.asList(
            "bat", "c", "h", "html", "java", "ldif", "Makefile", "mc", "sh", "txt", "xml", "xsd", "xsl"));
    private static final List<String> EXCLUDED_END_COMMENT_BLOCK_TOKEN = new LinkedList<String>(Arrays.asList(
                    "*/", "-->"));
    private static final List<String> SUPPORTED_COMMENT_MIDDLE_BLOCK_TOKEN = new LinkedList<String>(Arrays.asList(
                    "*", "#", "rem", "!"));
    private static final List<String> SUPPORTED_START_BLOCK_COMMENT_TOKEN = new LinkedList<String>(Arrays.asList(
                    "/*", "<!--"));
    /** The string representation of the current year. */
    Integer currentYear = Calendar.getInstance().get(Calendar.YEAR);
    private final List<String> incorrectCopyrightFilePaths = new LinkedList<String>();
    /** The overall SCM Client Manager. */
    private ScmManager scmManager;
    private ScmRepository scmRepository;
    List<String> getIncorrectCopyrightFilePaths() {
        return incorrectCopyrightFilePaths;
    }
    private ScmManager getScmManager() throws MojoExecutionException {
        if (scmManager == null) {
            scmManager = new BasicScmManager();
            String scmProviderID = getScmProviderID();
            ScmProvider scmProvider;
            if ("svn".equals(scmProviderID)) {
                scmProvider = new SvnExeScmProvider();
            } else if ("git".equals(scmProviderID)) {
                scmProvider = new GitExeScmProvider();
            } else {
                throw new MojoExecutionException("Unsupported scm provider: " + scmProviderID + " or "
                        + getIncorrectScmRepositoryUrlMsg());
            }
            scmManager.setScmProvider(scmProviderID, scmProvider);
        }
        return scmManager;
    }
    private String getScmProviderID() throws MojoExecutionException {
        try {
            return scmRepositoryUrl.split(":")[1];
        } catch (Exception e) {
            throw new MojoExecutionException(getIncorrectScmRepositoryUrlMsg(), e);
        }
    }
    String getIncorrectScmRepositoryUrlMsg() {
        return "the scmRepositoryUrl property with value '" + scmRepositoryUrl + "' is incorrect. "
                + "The URL has to respect the format: scm:[provider]:[provider_specific_url]";
    }
    ScmRepository getScmRepository() throws MojoExecutionException {
        if (scmRepository == null) {
            try {
                scmRepository = getScmManager().makeScmRepository(scmRepositoryUrl);
            } catch (NoSuchScmProviderException e) {
                throw new MojoExecutionException("Could not find a provider.", e);
            } catch (ScmRepositoryException e) {
                throw new MojoExecutionException("Error while connecting to the repository", e);
            }
        }
        return scmRepository;
    }
    String getScmWorkspaceRoot() {
        return scmWorkspaceRoot;
    }
    /** Performs a diff with current working directory state against remote HEAD revision. */
    List<String> getChangedFiles() throws MojoExecutionException, MojoFailureException  {
        try {
            ScmFileSet workspaceFileSet = new ScmFileSet(new File(getScmWorkspaceRoot()));
            StatusScmResult statusResult = getScmManager().status(getScmRepository(), workspaceFileSet);
            if (!statusResult.isSuccess()) {
                getLog().error("Impossible to perform scm status command because " + statusResult.getCommandOutput());
                throw new MojoFailureException("SCM error");
            }
            List<ScmFile> scmFiles = statusResult.getChangedFiles();
            List<String> changedFilePaths = new LinkedList<String>();
            for (ScmFile scmFile : scmFiles) {
                changedFilePaths.add(scmFile.getPath());
            }
            return changedFilePaths;
        } catch (ScmException e) {
            throw new MojoExecutionException("Encountered an error while examining modified files,  SCM status:  "
                    + e.getMessage() + "No further checks will be performed.", e);
        }
    }
    /** Examines the provided files list to determine whether each changed file copyright is acceptable. */
    void checkCopyrights() throws MojoExecutionException, MojoFailureException {
        for (String changedFileName : getChangedFiles()) {
            File changedFile = new File(getScmWorkspaceRoot(), changedFileName);
            if (!changedFile.exists() || !changedFile.isFile()) {
                continue;
            }
            int lastPeriodPos = changedFileName.lastIndexOf('.');
            if (lastPeriodPos > 0) {
                String extension = changedFileName.substring(lastPeriodPos + 1);
                if (!CHECKED_EXTENSIONS.contains(extension.toLowerCase())) {
                    continue;
                }
            } else {
                // We'll still want to check it if it's in a resource/bin directory.
                if (fileNameEquals("bin", changedFile.getParentFile())
                        && fileNameEquals("resource", changedFile.getParentFile().getParentFile())) {
                    continue;
                }
            }
            if (!checkCopyrightForFile(changedFile)) {
                incorrectCopyrightFilePaths.add(changedFile.getAbsolutePath());
            }
        }
    }
    private boolean fileNameEquals(String folderName, File file) {
        return file != null && folderName.equals(file.getName());
    }
    /**
     * Check to see whether the provided file has a comment line containing a
     * copyright without the current year.
     */
    @SuppressWarnings("resource")
    private boolean checkCopyrightForFile(File changedFile) throws MojoExecutionException {
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new FileReader(changedFile));
            String line = reader.readLine();
            while (line != null) {
                String lowerLine = line.toLowerCase().trim();
                if (isCommentLine(lowerLine)) {
                    int copyrightPos = lowerLine.indexOf("copyright");
                    if (copyrightPos > 0) {
                        if (line.contains(currentYear.toString()) && line.contains(copyrightOwnerToken)) {
                            reader.close();
                            return true;
                        }
                    }
                }
                line = reader.readLine();
            }
            return false;
        } catch (IOException ioe) {
            StringBuilder errorMsg = new StringBuilder().append(" Could not read file ")
                    .append(changedFile.getPath())
                    .append(" to check copyright date. No further copyright date checking will be performed.");
            throw new MojoExecutionException(errorMsg.toString());
        } finally {
            closeSilently(reader);
        }
    }
    private String getCommentToken(String line, boolean includesStartBlock) {
        List<String> supportedTokens = 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-copyright-maven-plugin/src/main/java/org/forgerock/maven/UpdateCopyrightMojo.java
New file
@@ -0,0 +1,424 @@
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
 * or http://forgerock.org/license/CDDLv1.0.html.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at legal-notices/CDDLv1_0.txt.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information:
 *      Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 *
 *      Copyright 2015 ForgeRock AS
 */
package org.forgerock.maven;
import static org.apache.maven.plugins.annotations.LifecyclePhase.*;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.forgerock.util.Utils;
/**
 * This goals can be used to automatically updates copyrights of modified files.
 *
 * <p>
 *    Copyright sections must respect the following format:
 * <pre>
 *    (.)* //This line references 0..N lines.
 *    [COMMMENT_CHAR][lineBeforeCopyrightToken]
 *    [COMMMENT_CHAR]* //This line references 0..N commented emptylines.
 *    ([COMMMENT_CHAR][oldCopyrightToken])*
 *    ([COMMMENT_CHAR][indent][copyrightStartToken | portionsCopyrightStartToken] [YEAR] [copyrightEndToken])?
 * </pre>
 * <p>
 *  Formatter details:
 *  <ul>
 *  <li>COMMENT_CHAR: Auto-detected by plugin.
 *               Comment character used in comment blocks ('*' for Java, '!' for xml...)</li>
 *  <li>lineBeforeCopyrightToken: Parameter
 *               Used by the plugin to start it's inspection for the copyright line.
 *               Next non blank commented lines after this lines must be
 *               old copyright owner lines or/and old copyright lines.</li>
 *
 *  <li>oldCopyrightToken: Detected by plugin ('copyright' keyword non case-sensitive and non copyrightEndToken)
 *               If one line contains this token, the plugin will use
 *               the portionsCopyrightStartToken instead of copyrightStartToken</li>
 *
 *  <li>nbLinesToSkip: Parameter (int)
 *               Used only if a new copyright line is needed (not if a new portion copyright section is needed).
 *               It gives the number of lines to add after the line which contains  the lineBeforeCopyrightToken.</li>
 *
 *  <li>indent: Parameter 'numberSpaceIdentation' (int)
 *               Used only if a new copyright or portion copyright line is needed.
 *               It gives the number of space to add after the COMMENT_CHAR.
 *               If there is already a copyright line, the existing indentation will be used.</li>
 *
 *  <li>copyrightStartToken: Parameter
 *               Used to recognize the copyright line. If the copyright section is
 *               missing, the plugin will add the line.</li>
 *
 *  <li>portionsCopyrightStartToken: Parameter
 *               Same as copyrightStartToken, but if the oldCopyrightToken is present.</li>
 *
 *  <li>copyrightEndToken: Parameter
 *               Same as copyrightStartToken, but for the end of the line.</li>
 *
 *  <li>YEAR: Computed by plugin
 *               Current year if there is no existing copyright line.
 *               If the copyright section already exists, the year will be updated as follow:
 *               <ul>
 *                  <li>OLD_YEAR => OLD_YEAR-CURRENT_YEAR</li>
 *                  <li>VERY_OLD_YEAR-OLD_YEAR => VERY_OLD_YEAR-CURRENT_YEAR</li>
 *              </ul></li>
 * </ul>
 */
@Mojo(name = "update-copyright", defaultPhase = VALIDATE)
public class UpdateCopyrightMojo extends CopyrightAbstractMojo {
    private final class UpdateCopyrightFile {
        private String filePath;
        private final List<String> bufferedLines = new LinkedList<String>();
        private boolean copyrightUpdated;
        private boolean lineBeforeCopyrightReaded;
        private boolean commentBlockEnded;
        private boolean portionsCopyrightNeeded;
        private boolean copyrightSectionPresent;
        private String curLine;
        private String curLowerLine;
        private Integer startYear;
        private Integer endYear;
        private BufferedReader reader;
        private BufferedWriter writer;
        private UpdateCopyrightFile(String filePath) throws IOException {
            this.filePath = filePath;
            reader = new BufferedReader(new FileReader(filePath));
            File tmpFile = new File(filePath + ".tmp");
            if (!tmpFile.exists()) {
                tmpFile.createNewFile();
            }
            writer = new BufferedWriter(new FileWriter(tmpFile));
        }
        private void updateCopyrightForFile() throws MojoExecutionException {
            try {
                readLineBeforeCopyrightToken();
                portionsCopyrightNeeded = readOldCopyrightLine();
                copyrightSectionPresent = readCopyrightLine();
                writeCopyrightLine();
                writeChanges();
            } catch (Exception e) {
                throw new MojoExecutionException(e.getMessage(), e);
            } finally {
                Utils.closeSilently(reader, writer);
            }
        }
        private void writeChanges() throws Exception {
            while (curLine != null) {
                nextLine();
            }
            reader.close();
            for (String line : bufferedLines) {
                writer.write(line);
                writer.newLine();
            }
            writer.close();
            if (!dryRun) {
                File updatedFile = new File(filePath);
                if (!updatedFile.delete()) {
                    throw new Exception("impossible to perform rename on the file.");
                }
                new File(filePath + ".tmp").renameTo(updatedFile);
            }
        }
        private void writeCopyrightLine() throws Exception {
            if (copyrightSectionPresent) {
                updateExistingCopyrightLine();
                copyrightUpdated = true;
                return;
            }
            int indexAdd = bufferedLines.size() - 1;
            String stopToken = portionsCopyrightNeeded ? OLD_COPYRIGHT_TOKEN : lineBeforeCopyrightToken;
            String previousLine = curLine;
            while (!previousLine.toLowerCase().contains(stopToken.toLowerCase())) {
                indexAdd--;
                previousLine = bufferedLines.get(indexAdd);
            }
            indexAdd++;
            StringBuffer newCopyrightLine = new StringBuffer(getNewCommentedLine());
            newCopyrightLine.append(indent())
                            .append(portionsCopyrightNeeded ? portionsCopyrightStartToken : copyrightStartToken)
                            .append(" ").append(currentYear).append(" ").append(copyrightEndToken);
            if (!portionsCopyrightNeeded) {
                for (int i = 0; i < nbLinesToSkip; i++) {
                    bufferedLines.add(indexAdd++, getNewCommentedLine());
                }
            }
            bufferedLines.add(indexAdd, newCopyrightLine.toString());
            copyrightUpdated = true;
        }
        private void updateExistingCopyrightLine() throws Exception {
            if (portionsCopyrightNeeded && copyrightSectionPresent) {
                // Check if the line is a new copyright line
                if (curLine.contains(copyrightStartToken) && !curLine.contains(portionsCopyrightStartToken)) {
                    getLog().warn("File " + filePath + " contains old copyright line and coyright line. "
                            + "The copyright line will be replaced by a portion copyright line.");
                    curLine.replace(copyrightStartToken, portionsCopyrightStartToken);
                }
            }
            readYearSection();
            final String newCopyrightLine;
            if (endYear == null) {
                //OLD_YEAR => OLD_YEAR-CURRENT_YEAR
                newCopyrightLine = curLine.replace(startYear.toString(), intervalToString(startYear, currentYear));
            } else {
                //VERY_OLD_YEAR-OLD_YEAR => VERY_OLD_YEAR-CURRENT_YEAR
                newCopyrightLine = curLine.replace(intervalToString(startYear, endYear),
                                                   intervalToString(startYear, currentYear));
            }
            bufferedLines.remove(bufferedLines.size() - 1);
            bufferedLines.add(newCopyrightLine);
        }
        private void readYearSection() throws Exception {
            try {
                String startToken = portionsCopyrightNeeded ? portionsCopyrightStartToken : copyrightStartToken;
                String yearSection = curLine.substring(curLine.indexOf(startToken) + startToken.length(),
                                                        curLine.indexOf(copyrightEndToken)).trim();
                if (yearSection.contains("-")) {
                    startYear = Integer.parseInt(yearSection.split("-")[0].trim());
                    endYear = Integer.parseInt(yearSection.split("-")[1].trim());
                } else {
                    startYear = Integer.parseInt(yearSection);
                }
            } catch (NumberFormatException nfe) {
                throw new Exception("Malformed year section in copyright line " + curLine);
            } catch (Exception e) {
                throw new Exception("Malformed copyright line " + curLine);
            }
        }
        private void readLineBeforeCopyrightToken() throws Exception {
            nextLine();
            while (curLine != null) {
                if (curLine.contains(lineBeforeCopyrightToken)) {
                    if (!isCommentLine(curLowerLine)) {
                        throw new Exception("The line before copyright token must be a commented line");
                    }
                    lineBeforeCopyrightReaded = true;
                    return;
                } else if (commentBlockEnded) {
                    throw new Exception("unexpected non commented line found before copyright section");
                }
                nextLine();
            }
        }
        private boolean readOldCopyrightLine() throws Exception {
            nextLine();
            while (curLine != null) {
                if (isOldCopyrightOwnerLine()) {
                    return true;
                } else if (isNonEmptyCommentedLine(curLine)
                            || isCopyrightLine()
                            || commentBlockEnded) {
                    return false;
                }
                nextLine();
            }
            throw new Exception("unexpected end of file while trying to read copyright");
        }
        private boolean readCopyrightLine() throws Exception {
            while (curLine != null) {
                if (isCopyrightLine()) {
                    return true;
                } else if ((isNonEmptyCommentedLine(curLine) && !isOldCopyrightOwnerLine())
                            || commentBlockEnded) {
                    return false;
                }
                nextLine();
            }
            throw new Exception("unexpected end of file while trying to read copyright");
        }
        private boolean isOldCopyrightOwnerLine() {
            return curLowerLine.contains(OLD_COPYRIGHT_TOKEN) && !curLine.contains(copyrightEndToken);
        }
        private boolean isCopyrightLine() {
            return (curLine.contains(copyrightStartToken) || curLine.contains(portionsCopyrightStartToken))
                    && curLine.contains(copyrightEndToken);
        }
        private void nextLine() throws Exception {
            curLine = reader.readLine();
            if (curLine == null && !copyrightUpdated) {
                throw new Exception("unexpected end of file while trying to read copyright");
            } else  if (curLine != null) {
                bufferedLines.add(curLine);
            }
            if (!copyrightUpdated) {
                curLowerLine = curLine.trim().toLowerCase();
                if (lineBeforeCopyrightReaded && !isCommentLine(curLowerLine)) {
                    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) {
                return linePattern.substring(0, linePattern.indexOf(commentToken) + 1);
            } else {
                throw new Exception("Uncompatibles comments lines in the file.");
            }
        }
    }
    private static final String OLD_COPYRIGHT_TOKEN = "copyright";
    /** The last non empty commented line before the copyright section. */
    @Parameter(required = true, defaultValue = "CDDL HEADER END")
    private String lineBeforeCopyrightToken;
    /**
     * Number of lines to add after the line which contains the lineBeforeCopyrightToken.
     * Used only if a new copyright line is needed.
     */
    @Parameter(required = true, defaultValue = "2")
    private Integer nbLinesToSkip;
    /**
     * Number of spaces to add after the comment line token before adding new
     * copyright section. Used only if a new copyright or portion copyright is
     * needed.
     */
    @Parameter(required = true, defaultValue = "6")
    private Integer numberSpaceIdentation;
    /** Copyright start line token. */
    @Parameter(required = true, defaultValue = "Copyright")
    private String copyrightStartToken;
    @Parameter(required = true, defaultValue = "Portions Copyright")
    /** Portions copyright start line token. */
    private String portionsCopyrightStartToken;
    /** Copyright end line token. */
    @Parameter(required = true, defaultValue = "ForgeRock AS")
    private String copyrightEndToken;
    /** A dry run will not change source code. It creates new files with '.tmp' extension */
    @Parameter(required = true, defaultValue = "false")
    private boolean dryRun;
    private boolean buildOK = true;
    /**
     * Updates copyright of modified files.
     *
     * @throws MojoFailureException
     *             if any
     * @throws MojoExecutionException
     *             if any
     */
    public void execute() throws MojoExecutionException, MojoFailureException {
        checkCopyrights();
        for (String filePath : getIncorrectCopyrightFilePaths()) {
            try {
                new UpdateCopyrightFile(filePath).updateCopyrightForFile();
                getLog().info("Copyright of file " + filePath + " has been successfully updated.");
            } catch (Exception e) {
                getLog().error("Impossible to update copyright of file " + filePath);
                getLog().error("  Details: " + e.getMessage());
                getLog().error("  No modification has been performed on this file");
                buildOK = false;
            }
        }
        if (!buildOK) {
            throw new MojoFailureException("Error(s) occured while trying to update some copyrights.");
        }
    }
    private String intervalToString(Integer startYear, Integer endYear) {
        return startYear.toString() + "-" + endYear;
    }
    private String indent() {
        String indentation = "";
        for (int i = 0; i < numberSpaceIdentation; i++) {
            indentation += " ";
        }
        return indentation;
    }
    // Setters to allow tests
    void setLineBeforeCopyrightToken(String lineBeforeCopyrightToken) {
        this.lineBeforeCopyrightToken = lineBeforeCopyrightToken;
    }
    void setNbLinesToSkip(Integer nbLinesToSkip) {
        this.nbLinesToSkip = nbLinesToSkip;
    }
    void setNumberSpaceIdentation(Integer numberSpaceIdentation) {
        this.numberSpaceIdentation = numberSpaceIdentation;
    }
    void setPortionsCopyrightStartToken(String portionsCopyrightStartToken) {
        this.portionsCopyrightStartToken = portionsCopyrightStartToken;
    }
    void setCopyrightStartToken(String copyrightStartToken) {
        this.copyrightStartToken = copyrightStartToken;
    }
    void setCopyrightEndToken(String copyrightEndToken) {
        this.copyrightEndToken = copyrightEndToken;
    }
    void setDryRun(final boolean dryRun) {
        this.dryRun = true;
    }
}
opendj-copyright-maven-plugin/src/main/java/org/forgerock/maven/package-info.java
New file
@@ -0,0 +1,29 @@
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
 * or http://forgerock.org/license/CDDLv1.0.html.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at legal-notices/CDDLv1_0.txt.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information:
 *      Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 *
 *
 *      Copyright 2015 ForgeRock AS.
 */
/** Classes implementing the maven plugin to check and update source file copyrights. */
package org.forgerock.maven;
opendj-copyright-maven-plugin/src/test/java/org/forgerock/maven/UpdateCopyrightTestCase.java
New file
@@ -0,0 +1,182 @@
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
 * or http://forgerock.org/license/CDDLv1.0.html.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at legal-notices/CDDLv1_0.txt.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information:
 *      Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 *
 *
 *      Copyright 2015 ForgeRock AS.
 */
package org.forgerock.maven;
import static org.mockito.Mockito.*;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.Calendar;
import java.util.LinkedList;
import java.util.List;
import org.forgerock.testng.ForgeRockTestCase;
import org.testng.annotations.AfterTest;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
@Test
public class UpdateCopyrightTestCase extends ForgeRockTestCase {
    private static final String CURRENT_YEAR = Integer.toString(Calendar.getInstance().get(Calendar.YEAR));
    private static final String RESOURCE_DIR = "src/test/resources/files/";
    private static final String[] TEST_FOLDERS = new String[] {"openam-copyrights",
        "opendj-copyrights", "openidm-copyrights"};
    /** Customs tags in tests files */
    private static final String MUST_BE_REMOVE_TAG = "MUST BE REMOVED:";
    private static final String EXPECTED_OUTPUT_TAG = "EXPECTED OUTPUT:";
    private static final String YEAR_TAG = "YEAR";
    @AfterTest
    public void deleteTempFiles() {
        for (String testFolder : TEST_FOLDERS) {
            for (File file : new File(RESOURCE_DIR, testFolder).listFiles()) {
                if (file.getPath().endsWith(".tmp")) {
                    file.delete();
                }
            }
        }
    }
    @DataProvider
    public Object[][] testCases() {
        return new Object[][] {
            // Test case folder, Line before copyright token, NB lines to skip, NB spaces indentation,
            // Portion copyright token, Copyright start token, Copyright end token
            { TEST_FOLDERS[0], "Portions copyright [year] [name of copyright owner]", 1, 1,
                "Portions copyright", "Copyright", "ForgeRock AS." },
            { TEST_FOLDERS[1], "CDDL HEADER END", 1, 6, "Portions Copyright", "Copyright", "ForgeRock AS." },
            { TEST_FOLDERS[2], "DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.", 1, 1,
                "Portions Copyrighted", "Copyright (c)", "ForgeRock AS. All rights reserved." }
        };
    }
    @Test(dataProvider = "testCases")
    public void testUpdateCopyright(String testCaseFolderPath, String lineBeforeCopyrightToken,
            Integer nbLinesToSkip, Integer numberSpacesIndentation, String portionCopyrightToken,
            String copyrightStartToken, String copyrightEndToken) throws Exception {
        List<String> testFilePaths = new LinkedList<String>();
        List<String> updatedTestFilePaths = new LinkedList<String>();
        File[] changedFiles = new File(RESOURCE_DIR, testCaseFolderPath).listFiles();
        for (File file : changedFiles) {
            if (file.getPath().endsWith(".tmp")) {
                continue;
            }
            testFilePaths.add(file.getAbsolutePath());
            updatedTestFilePaths.add(file.getPath() + ".tmp");
        }
        UpdateCopyrightMojo spyMojo = spy(new UpdateCopyrightMojo());
        spyMojo.setDryRun(true);
        spyMojo.setLineBeforeCopyrightToken(lineBeforeCopyrightToken);
        spyMojo.setNbLinesToSkip(nbLinesToSkip);
        spyMojo.setNumberSpaceIdentation(numberSpacesIndentation);
        spyMojo.setPortionsCopyrightStartToken(portionCopyrightToken);
        spyMojo.setCopyrightStartToken(copyrightStartToken);
        spyMojo.setCopyrightEndToken(copyrightEndToken);
        doNothing().when(spyMojo).checkCopyrights();
        when(spyMojo.getIncorrectCopyrightFilePaths()).thenReturn(testFilePaths);
        spyMojo.execute();
        // Check copyrights of updated files
        CheckCopyrightMojo spyMojoCheck = spy(new CheckCopyrightMojo());
        doReturn(updatedTestFilePaths).when(spyMojoCheck).getChangedFiles();
        spyMojoCheck.execute();
        // Check updated files content
        for (String filePath : testFilePaths) {
            checkMofidiedFile(filePath);
        }
    }
    private void checkMofidiedFile(String filePath) throws Exception {
        final BufferedReader reader = new BufferedReader(new FileReader(filePath));
        String mustBeRemoved = null;
        String expectedOutput = null;
        String currentLine = reader.readLine();
        while (currentLine != null) {
            if (currentLine.contains(MUST_BE_REMOVE_TAG)) {
                mustBeRemoved = currentLine.split(MUST_BE_REMOVE_TAG)[1].trim();
            } else if (currentLine.contains(EXPECTED_OUTPUT_TAG)) {
                expectedOutput = currentLine.split(EXPECTED_OUTPUT_TAG)[1].trim()
                                            .replace(YEAR_TAG, CURRENT_YEAR);
            }
            currentLine = reader.readLine();
        }
        reader.close();
        checkIfNewFileIsValid(mustBeRemoved, expectedOutput, filePath + ".tmp");
    }
    private void checkIfNewFileIsValid(String mustBeRemoved, String expectedOutput, String filePath) throws Exception {
        if (mustBeRemoved == null && expectedOutput == null) {
            return;
        }
        final BufferedReader reader = new BufferedReader(new FileReader(filePath));
        String currentLine = reader.readLine();
        boolean expectedOutputFound = false;
        while (currentLine != null) {
            if (lineContainsTagContent(currentLine, mustBeRemoved)) {
                reader.close();
                throw new Exception("Generated file " + filePath + " must not contains " + mustBeRemoved);
            }
            if (!expectedOutputFound && lineContainsTagContent(currentLine, expectedOutput)) {
                expectedOutputFound = true;
                if (mustBeRemoved == null) {
                    reader.close();
                    return;
                }
            }
            currentLine = reader.readLine();
        }
        reader.close();
        if (!expectedOutputFound) {
            throw new Exception("Generated file " + filePath + " should contains " + expectedOutput);
        }
    }
    private boolean lineContainsTagContent(String line, String content) {
        String trimedLine = line.trim();
        return content != null
                && !trimedLine.startsWith(MUST_BE_REMOVE_TAG)
                && !trimedLine.startsWith(MUST_BE_REMOVE_TAG)
                && trimedLine.contains(content);
    }
}
opendj-copyright-maven-plugin/src/test/resources/files/openam-copyrights/openam-bad-copyright-1.txt
New file
@@ -0,0 +1,18 @@
/*
 * The contents of this file are subject to the terms of the Common Development and
 * Distribution License (the License). You may not use this file except in compliance with the
 * License.
 *
 * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
 * specific language governing permission and limitations under the License.
 *
 * When distributing Covered Software, include this CDDL Header Notice in each file and include
 * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
 * Header, with the fields enclosed by brackets [] replaced by your own identifying
 * information: "Portions copyright [year] [name of copyright owner]".
 *
 * Copyright 2012-2014 ForgeRock AS.
 */
 MUST BE REMOVED: Copyright 2012-2014 ForgeRock AS.
 EXPECTED OUTPUT: Copyright 2012-YEAR ForgeRock AS.
opendj-copyright-maven-plugin/src/test/resources/files/openam-copyrights/openam-bad-copyright-2.txt
New file
@@ -0,0 +1,19 @@
/*
 * The contents of this file are subject to the terms of the Common Development and
 * Distribution License (the License). You may not use this file except in compliance with the
 * License.
 *
 * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
 * specific language governing permission and limitations under the License.
 *
 * When distributing Covered Software, include this CDDL Header Notice in each file and include
 * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
 * Header, with the fields enclosed by brackets [] replaced by your own identifying
 * information: "Portions copyright [year] [name of copyright owner]".
 *
 * Copyright 2010 ForgeRock AS.
 */
MUST BE REMOVED: Copyright 2010 ForgeRock AS.
EXPECTED OUTPUT: Copyright 2010-YEAR ForgeRock AS.
opendj-copyright-maven-plugin/src/test/resources/files/openam-copyrights/openam-bad-copyright-3.txt
New file
@@ -0,0 +1,16 @@
/*
 * The contents of this file are subject to the terms of the Common Development and
 * Distribution License (the License). You may not use this file except in compliance with the
 * License.
 *
 * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
 * specific language governing permission and limitations under the License.
 *
 * When distributing Covered Software, include this CDDL Header Notice in each file and include
 * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
 * Header, with the fields enclosed by brackets [] replaced by your own identifying
 * information: "Portions copyright [year] [name of copyright owner]".
 *
 */
 EXPECTED OUTPUT: Copyright YEAR ForgeRock AS.
opendj-copyright-maven-plugin/src/test/resources/files/openam-copyrights/openam-bad-copyright-4.txt
New file
@@ -0,0 +1,17 @@
/*
 * The contents of this file are subject to the terms of the Common Development and
 * Distribution License (the License). You may not use this file except in compliance with the
 * License.
 *
 * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
 * specific language governing permission and limitations under the License.
 *
 * When distributing Covered Software, include this CDDL Header Notice in each file and include
 * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
 * Header, with the fields enclosed by brackets [] replaced by your own identifying
 * information: "Portions copyright [year] [name of copyright owner]".
 *
 * Copyright 2010 Old Copyright Owner Inc.
 */
 EXPECTED OUTPUT: Portions copyright YEAR ForgeRock AS.
opendj-copyright-maven-plugin/src/test/resources/files/openam-copyrights/openam-bad-copyright-5.txt
New file
@@ -0,0 +1,18 @@
/*
 * The contents of this file are subject to the terms of the Common Development and
 * Distribution License (the License). You may not use this file except in compliance with the
 * License.
 *
 * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
 * specific language governing permission and limitations under the License.
 *
 * When distributing Covered Software, include this CDDL Header Notice in each file and include
 * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
 * Header, with the fields enclosed by brackets [] replaced by your own identifying
 * information: "Portions copyright [year] [name of copyright owner]".
 *
 * Copyright 2010-2012 Very Old copyright owner Inc.
 * Copyright 2013-2014 Old copyright owner Inc.
 */
 EXPECTED OUTPUT: Portions copyright YEAR ForgeRock AS.
opendj-copyright-maven-plugin/src/test/resources/files/openam-copyrights/openam-bad-copyright-6.txt
New file
@@ -0,0 +1,20 @@
/*
 * The contents of this file are subject to the terms of the Common Development and
 * Distribution License (the License). You may not use this file except in compliance with the
 * License.
 *
 * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
 * specific language governing permission and limitations under the License.
 *
 * When distributing Covered Software, include this CDDL Header Notice in each file and include
 * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
 * Header, with the fields enclosed by brackets [] replaced by your own identifying
 * information: "Portions copyright [year] [name of copyright owner]".
 *
 * Copyright 2008-2010 Very Old copyright owner Inc.
 * Portions copyright 2011-2012 Old copyright owner Inc.
 * Portions copyright 2013-2014 ForgeRock AS.
 */
MUST BE REMOVED: Portions copyright 2013-2014 ForgeRock AS.
EXPECTED OUTPUT: Portions copyright 2013-YEAR ForgeRock AS.
opendj-copyright-maven-plugin/src/test/resources/files/opendj-copyrights/opendj-bad-copyright-1.txt
New file
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
 ! CDDL HEADER START
 !
 ! The contents of this file are subject to the terms of the
 ! Common Development and Distribution License, Version 1.0 only
 ! (the "License").  You may not use this file except in compliance
 ! with the License.
 !
 ! You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
 ! or http://forgerock.org/license/CDDLv1.0.html.
 ! See the License for the specific language governing permissions
 ! and limitations under the License.
 !
 ! When distributing Covered Code, include this CDDL HEADER in each
 ! file and include the License file at legal-notices/CDDLv1_0.txt.
 ! If applicable, add the following below this CDDL HEADER, with the
 ! fields enclosed by brackets "[]" replaced with your own identifying
 ! information:
 !      Portions Copyright [yyyy] [name of copyright owner]
 !
 ! CDDL HEADER END
 !
 !      Copyright 2012-2014 ForgeRock AS.
-->
MUST BE REMOVED: Copyright 2012-2014 ForgeRock AS.
EXPECTED OUTPUT: Copyright 2012-YEAR ForgeRock AS.
opendj-copyright-maven-plugin/src/test/resources/files/opendj-copyrights/opendj-bad-copyright-2.txt
New file
@@ -0,0 +1,27 @@
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
 * or http://forgerock.org/license/CDDLv1.0.html.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at legal-notices/CDDLv1_0.txt.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information:
 *      Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 *
 *      Copyright 2013 ForgeRock AS.
 */
MUST BE REMOVED: Copyright 2013 ForgeRock AS.
EXPECTED OUTPUT: Copyright 2013-YEAR ForgeRock AS.
opendj-copyright-maven-plugin/src/test/resources/files/opendj-copyrights/opendj-bad-copyright-3.txt
New file
@@ -0,0 +1,25 @@
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
 * or http://forgerock.org/license/CDDLv1.0.html.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at legal-notices/CDDLv1_0.txt.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information:
 *      Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 *
 */
EXPECTED OUTPUT: Copyright YEAR ForgeRock AS.
opendj-copyright-maven-plugin/src/test/resources/files/opendj-copyrights/opendj-bad-copyright-4.txt
New file
@@ -0,0 +1,27 @@
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
 * or http://forgerock.org/license/CDDLv1.0.html.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at legal-notices/CDDLv1_0.txt.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information:
 *      Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 *
 *      Copyright 2010-2013 Old Copyright Owner Inc.
 *
 */
EXPECTED OUTPUT: Portions Copyright YEAR ForgeRock AS.
opendj-copyright-maven-plugin/src/test/resources/files/opendj-copyrights/opendj-bad-copyright-5.txt
New file
@@ -0,0 +1,27 @@
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
 * or http://forgerock.org/license/CDDLv1.0.html.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at legal-notices/CDDLv1_0.txt.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information:
 *      Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 *
 *      Copyright 2010-2012 Very Old copyright owner Inc.
 *      Copyright 2013-2014 Old copyright owner Inc.
 */
EXPECTED OUTPUT: Portions Copyright YEAR ForgeRock AS.
opendj-copyright-maven-plugin/src/test/resources/files/opendj-copyrights/opendj-bad-copyright-6.txt
New file
@@ -0,0 +1,29 @@
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
 * or http://forgerock.org/license/CDDLv1.0.html.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at legal-notices/CDDLv1_0.txt.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information:
 *      Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 *
 *      Copyright 2008-2010 Very Old copyright owner Inc.
 *      Portions Copyright 2011-2012 Old copyright owner Inc.
 *      Portions Copyright 2013-2014 ForgeRock AS.
 */
MUST BE REMOVED: Portions Copyright 2013-2014 ForgeRock AS.
EXPECTED OUTPUT: Portions Copyright 2013-YEAR ForgeRock AS.
opendj-copyright-maven-plugin/src/test/resources/files/openidm-copyrights/openidm-bad-copyright-1.txt
New file
@@ -0,0 +1,26 @@
/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright (c) 2011-2014 ForgeRock AS. All rights reserved.
 *
 * The contents of this file are subject to the terms
 * of the Common Development and Distribution License
 * (the License). You may not use this file except in
 * compliance with the License.
 *
 * You can obtain a copy of the License at
 * http://forgerock.org/license/CDDLv1.0.html
 * See the License for the specific language governing
 * permission and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL
 * Header Notice in each file and include the License file
 * at http://forgerock.org/license/CDDLv1.0.html
 * If applicable, add the following below the CDDL Header,
 * with the fields enclosed by brackets [] replaced by
 * your own identifying information:
 * "Portions Copyrighted [year] [name of copyright owner]"
 */
MUST BE REMOVED: Copyright (c) 2011-2014 ForgeRock AS. All rights reserved.
EXPECTED OUTPUT: Copyright (c) 2011-YEAR ForgeRock AS. All rights reserved.
opendj-copyright-maven-plugin/src/test/resources/files/openidm-copyrights/openidm-bad-copyright-2.txt
New file
@@ -0,0 +1,26 @@
/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright (c) 2012 ForgeRock AS. All rights reserved.
 *
 * The contents of this file are subject to the terms
 * of the Common Development and Distribution License
 * (the License). You may not use this file except in
 * compliance with the License.
 *
 * You can obtain a copy of the License at
 * http://forgerock.org/license/CDDLv1.0.html
 * See the License for the specific language governing
 * permission and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL
 * Header Notice in each file and include the License file
 * at http://forgerock.org/license/CDDLv1.0.html
 * If applicable, add the following below the CDDL Header,
 * with the fields enclosed by brackets [] replaced by
 * your own identifying information:
 * "Portions Copyrighted [year] [name of copyright owner]"
 */
MUST BE REMOVED: Copyright (c) 2012 ForgeRock AS. All rights reserved.
EXPECTED OUTPUT: Copyright (c) 2012-YEAR ForgeRock AS. All rights reserved.
opendj-copyright-maven-plugin/src/test/resources/files/openidm-copyrights/openidm-bad-copyright-3.txt
New file
@@ -0,0 +1,24 @@
/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 *
 * The contents of this file are subject to the terms
 * of the Common Development and Distribution License
 * (the License). You may not use this file except in
 * compliance with the License.
 *
 * You can obtain a copy of the License at
 * http://forgerock.org/license/CDDLv1.0.html
 * See the License for the specific language governing
 * permission and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL
 * Header Notice in each file and include the License file
 * at http://forgerock.org/license/CDDLv1.0.html
 * If applicable, add the following below the CDDL Header,
 * with the fields enclosed by brackets [] replaced by
 * your own identifying information:
 * "Portions Copyrighted [year] [name of copyright owner]"
 */
EXPECTED OUTPUT: Copyright (c) YEAR ForgeRock AS. All rights reserved.
opendj-copyright-maven-plugin/src/test/resources/files/openidm-copyrights/openidm-bad-copyright-4.txt
New file
@@ -0,0 +1,25 @@
/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright (c) 2010-2011 Old Copyright Owner.
 *
 * The contents of this file are subject to the terms
 * of the Common Development and Distribution License
 * (the License). You may not use this file except in
 * compliance with the License.
 *
 * You can obtain a copy of the License at
 * http://forgerock.org/license/CDDLv1.0.html
 * See the License for the specific language governing
 * permission and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL
 * Header Notice in each file and include the License file
 * at http://forgerock.org/license/CDDLv1.0.html
 * If applicable, add the following below the CDDL Header,
 * with the fields enclosed by brackets [] replaced by
 * your own identifying information:
 * "Portions Copyrighted [year] [name of copyright owner]"
 */
 EXPECTED OUTPUT: Portions Copyrighted YEAR ForgeRock AS. All rights reserved.
opendj-copyright-maven-plugin/src/test/resources/files/openidm-copyrights/openidm-bad-copyright-5.txt
New file
@@ -0,0 +1,26 @@
/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright (c) 2010-2011 Very Old Copyright Owner.
 * Copyright (c) 2012-2013 Old Copyright Owner.
 *
 * The contents of this file are subject to the terms
 * of the Common Development and Distribution License
 * (the License). You may not use this file except in
 * compliance with the License.
 *
 * You can obtain a copy of the License at
 * http://forgerock.org/license/CDDLv1.0.html
 * See the License for the specific language governing
 * permission and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL
 * Header Notice in each file and include the License file
 * at http://forgerock.org/license/CDDLv1.0.html
 * If applicable, add the following below the CDDL Header,
 * with the fields enclosed by brackets [] replaced by
 * your own identifying information:
 * "Portions Copyrighted [year] [name of copyright owner]"
 */
  EXPECTED OUTPUT: Portions Copyrighted YEAR ForgeRock AS. All rights reserved.
opendj-copyright-maven-plugin/src/test/resources/files/openidm-copyrights/openidm-bad-copyright-6.txt
New file
@@ -0,0 +1,28 @@
/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright (c) 2010-2011 Very Old Copyright Owner.
 * Portions Copyrighted 2012-2013 Old Copyright Owner.
 * Portions Copyrighted 2013-2014 ForgeRock AS. All rights reserved.
 *
 * The contents of this file are subject to the terms
 * of the Common Development and Distribution License
 * (the License). You may not use this file except in
 * compliance with the License.
 *
 * You can obtain a copy of the License at
 * http://forgerock.org/license/CDDLv1.0.html
 * See the License for the specific language governing
 * permission and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL
 * Header Notice in each file and include the License file
 * at http://forgerock.org/license/CDDLv1.0.html
 * If applicable, add the following below the CDDL Header,
 * with the fields enclosed by brackets [] replaced by
 * your own identifying information:
 * "Portions Copyrighted [year] [name of copyright owner]"
 */
MUST BE REMOVED: Portions Copyrighted 2013-2014 ForgeRock AS. All rights reserved.
EXPECTED OUTPUT: Portions Copyrighted 2013-YEAR ForgeRock AS. All rights reserved.
pom.xml
@@ -91,6 +91,7 @@
  </distributionManagement>
  <modules>
    <module>opendj-maven-plugin</module>
    <module>opendj-copyright-maven-plugin</module>
    <module>opendj-svn-property-check-maven-plugin</module>
    <module>opendj-core</module>
    <module>opendj-grizzly</module>
@@ -490,4 +491,26 @@
    <distribution>repo</distribution>
   </license>
  </licenses>
<!--   <profiles> -->
<!--     <profile> -->
<!--       <id>precommit</id> -->
<!--       <build> -->
<!--         <plugins> -->
<!--           <plugin> -->
<!--             <groupId>org.forgerock.opendj</groupId> -->
<!--             <artifactId>opendj-copyright-maven-plugin</artifactId> -->
<!--             <version>1.0.0-SNAPSHOT</version> -->
<!--             <executions> -->
<!--                 <execution> -->
<!--                     <id>check-copyrights</id> -->
<!--                     <goals> -->
<!--                         <goal>check-copyright</goal> -->
<!--                     </goals> -->
<!--                 </execution> -->
<!--             </executions> -->
<!--           </plugin> -->
<!--         </plugins> -->
<!--         </build> -->
<!--     </profile> -->
<!--   </profiles> -->
</project>