r1812 - in trunk/src/main/java/org/nuiton/license/plugin: . header header/transformer
Author: tchemit Date: 2010-09-09 10:38:55 +0200 (Thu, 09 Sep 2010) New Revision: 1812 Url: http://nuiton.org/repositories/revision/maven-license-plugin/1812 Log: Evolution #810: Can update project description part of header in update-file-header Evolution #811: Can update project license part of header in update-file-header Evolution #859: Can update project copyright part of header in update-file-header Modified: trunk/src/main/java/org/nuiton/license/plugin/UpdateFileHeaderMojo.java trunk/src/main/java/org/nuiton/license/plugin/header/FileHeaderFilter.java trunk/src/main/java/org/nuiton/license/plugin/header/UpdateFileHeaderFilter.java trunk/src/main/java/org/nuiton/license/plugin/header/transformer/AbstractFileHeaderTransformer.java trunk/src/main/java/org/nuiton/license/plugin/header/transformer/FileHeaderTransformer.java Modified: trunk/src/main/java/org/nuiton/license/plugin/UpdateFileHeaderMojo.java =================================================================== --- trunk/src/main/java/org/nuiton/license/plugin/UpdateFileHeaderMojo.java 2010-09-09 08:34:00 UTC (rev 1811) +++ trunk/src/main/java/org/nuiton/license/plugin/UpdateFileHeaderMojo.java 2010-09-09 08:38:55 UTC (rev 1812) @@ -26,7 +26,12 @@ package org.nuiton.license.plugin; import org.apache.commons.lang.StringUtils; -import org.nuiton.license.plugin.header.*; +import org.codehaus.plexus.util.FileUtils; +import org.nuiton.license.plugin.header.FileHeader; +import org.nuiton.license.plugin.header.FileHeaderProcessor; +import org.nuiton.license.plugin.header.FileHeaderProcessorConfiguration; +import org.nuiton.license.plugin.header.InvalideFileHeaderException; +import org.nuiton.license.plugin.header.UpdateFileHeaderFilter; import org.nuiton.license.plugin.header.transformer.FileHeaderTransformer; import org.nuiton.license.plugin.model.License; import org.nuiton.license.plugin.model.descriptor.FileSet; @@ -35,7 +40,13 @@ import java.io.File; import java.io.IOException; -import java.util.*; +import java.util.Arrays; +import java.util.EnumMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; /** * The goal to update (or add) the header on some files described in @@ -99,6 +110,39 @@ protected boolean addSvnKeyWords; /** + * A flag to authorize update of the description part of the header. + * <p/> + * <b>Note:</b> By default, do NOT authorize it since description can change + * on each file). + * + * @parameter expression="${license.canUpdateDescription}" default-value="false" + * @since 2.3.2 + */ + protected boolean canUpdateDescription; + + /** + * A flag to authorize update of the copyright part of the header. + * <p/> + * <b>Note:</b> By default, do NOT authorize it since copyright part should be + * handled by developpers (holder can change on each file for example). + * + * @parameter expression="${license.canUpdateCopyright}" default-value="false" + * @since 2.3.2 + */ + protected boolean canUpdateCopyright; + + /** + * A flag to authorize update of the license part of the header. + * <p/> + * <b>Note:</b> By default, authorize it since license part should always be + * generated by the plugin. + * + * @parameter expression="${license.canUpdateLicense}" default-value="true" + * @since 2.3.2 + */ + protected boolean canUpdateLicense; + + /** * A flag to update copyright application time (change copyright last year * if required) according to the last commit made on the processed file. * @@ -256,7 +300,11 @@ // set timestamp used for temporary files setTimestamp(System.nanoTime()); - getFilter().setUpdateCopyright(isUpdateCopyright()); + // add flags to authorize or not updates of header + getFilter().setUpdateCopyright(isCanUpdateCopyright()); + getFilter().setUpdateDescription(isCanUpdateDescription()); + getFilter().setUpdateLicense(isCanUpdateLicense()); + getFilter().setLog(getLog()); getProcessor().setConfiguration(this); getProcessor().setFilter(filter); @@ -560,8 +608,21 @@ deleteFile(processFile); } else { - // replace file with - renameFile(processFile, file); + try { + + // replace file with the updated one + renameFile(processFile, file); + } catch (IOException e) { + + // workaround windows problem to rename files + getLog().warn(e.getMessage()); + + // try to copy content (fail on windows xp...) + FileUtils.copyFile(processFile, file); + + // then delete process file + deleteFile(processFile); + } } } @@ -635,6 +696,18 @@ return updateCopyright; } + public boolean isCanUpdateDescription() { + return canUpdateDescription; + } + + public boolean isCanUpdateCopyright() { + return canUpdateCopyright; + } + + public boolean isCanUpdateLicense() { + return canUpdateLicense; + } + public String getIgnoreTag() { return ignoreTag; } @@ -742,4 +815,16 @@ public void setFilter(UpdateFileHeaderFilter filter) { this.filter = filter; } + + public void setCanUpdateDescription(boolean canUpdateDescription) { + this.canUpdateDescription = canUpdateDescription; + } + + public void setCanUpdateCopyright(boolean canUpdateCopyright) { + this.canUpdateCopyright = canUpdateCopyright; + } + + public void setCanUpdateLicense(boolean canUpdateLicense) { + this.canUpdateLicense = canUpdateLicense; + } } Modified: trunk/src/main/java/org/nuiton/license/plugin/header/FileHeaderFilter.java =================================================================== --- trunk/src/main/java/org/nuiton/license/plugin/header/FileHeaderFilter.java 2010-09-09 08:34:00 UTC (rev 1811) +++ trunk/src/main/java/org/nuiton/license/plugin/header/FileHeaderFilter.java 2010-09-09 08:38:55 UTC (rev 1812) @@ -68,13 +68,26 @@ protected Log log; /** + * Obtains the new header to use according to the old one. + * <p/> + * <b>Note:</b> If the new header should not be updated, then the result is {@code null}. + * + * @param oldHeader the old header found in file. + * @return {@code null} if header is still the same, otherwise the new header to apply + * @since 2.3.2 + */ + protected abstract FileHeader getNewHeader(FileHeader oldHeader); + + /** * The logic to implements when a header was touched. * * @param ch the actual header content * @return the new header content (beginning by a * {@link FileHeaderTransformer#getProcessStartTag()} and ending * with a {@link FileHeaderTransformer#getProcessEndTag()}). + * @deprecated since 2.3.2, use now the method {@link #getNewHeader(FileHeader)}. */ + @Deprecated protected abstract String treateHeader(String ch); public FileHeaderFilter() { @@ -103,24 +116,50 @@ // the header was detected, mark file to be touched touched = true; - // update header - String newHeader = treateHeader(ch); - if (log.isDebugEnabled()) { - log.debug("old header =\n" + ch); - log.debug("new header =\n" + newHeader); - } - if (!newHeader.contains(ch.trim())) { - // this is a weak test, but should be more enough - // if the new header contains the old one, it would be - // bad luck to not have equality ? - //TODO-TC-20100415 : use an exact test (must remove process tag on new header) -// if (!ch.equals(newHeader)) { + // obtain old header model + FileHeaderTransformer headerTransformer = getTransformer(); + String tmp = headerTransformer.unboxComent(ch); + FileHeader oldHeader = headerTransformer.toFileHeader(tmp); - // header content was modified, mark it + // obtain the new header (according to what to update) + FileHeader newFileHeader = getNewHeader(oldHeader); + + FileHeader header; + + if (newFileHeader == null) { + + // keep the old header + header = oldHeader; + + } else { + + // mark that the header was updated modified = true; + + header = newFileHeader; } - return newHeader; + String result = transformer.toHeaderContent(header); + return result; + +// // update header +// String newHeader = treateHeader(ch); +// if (log.isDebugEnabled()) { +// log.debug("old header =\n" + ch); +// log.debug("new header =\n" + newHeader); +// } +// if (!newHeader.contains(ch.trim())) { +// // this is a weak test, but should be more enough +// // if the new header contains the old one, it would be +// // bad luck to not have equality ? +// //TODO-TC-20100415 : use an exact test (must remove process tag on new header) +//// if (!ch.equals(newHeader)) { +// +// // header content was modified, mark it +// modified = true; +// } +// +// return newHeader; } // Means we detects the process start tag but not the end one. // coming then here from the flush filter method... So changes nothing Modified: trunk/src/main/java/org/nuiton/license/plugin/header/UpdateFileHeaderFilter.java =================================================================== --- trunk/src/main/java/org/nuiton/license/plugin/header/UpdateFileHeaderFilter.java 2010-09-09 08:34:00 UTC (rev 1811) +++ trunk/src/main/java/org/nuiton/license/plugin/header/UpdateFileHeaderFilter.java 2010-09-09 08:38:55 UTC (rev 1812) @@ -36,12 +36,109 @@ */ public class UpdateFileHeaderFilter extends FileHeaderFilter { + /** + * Flag sets to {@code true} if description can be updated. + * + * @since 2.3.2 + */ + protected boolean updateDescription; + + /** + * Flag set to {@code true} if license can be updated. + * + * @since 2.3.2 + */ + protected boolean updateLicense; + + /** + * Flag sets to {@code true} if copyright can be updated. + * + * @since 2.1 + */ protected boolean updateCopyright; public UpdateFileHeaderFilter() { } @Override + protected FileHeader getNewHeader(FileHeader oldHeader) { + + FileHeader result = new FileHeader(); + + FileHeader newHeader = getFileHeader(); + + FileHeaderTransformer transformer = getTransformer(); + + boolean modified = false; + + // by default, reuse the old header + result.setDescription(oldHeader.getDescription()); + result.setCopyrightFirstYear(oldHeader.getCopyrightFirstYear()); + result.setCopyrightLastYear(oldHeader.getCopyrightLastYear()); + result.setCopyrightHolder(oldHeader.getCopyrightHolder()); + result.setLicense(oldHeader.getLicense()); + + if (isUpdateDescription() && + !transformer.isDescriptionEquals(oldHeader, newHeader)) { + + // can update description and it has changed + + if (log.isDebugEnabled()) { + log.debug("description has changed from [" + oldHeader.getDescription() + "] to [" + newHeader.getDescription() + "]"); + } + + // description has changed, mark header to be updated + modified = true; + + // use the new description + result.setDescription(newHeader.getDescription()); + } + + if (isUpdateCopyright() && + !transformer.isCopyrightEquals(oldHeader, newHeader)) { + + // can update copyright and it has changed + + if (log.isDebugEnabled()) { + log.debug("copyright has changed from [" + oldHeader.getCopyright() + "] to [" + newHeader.getCopyright() + "]"); + } + + // description has changed, mark header to be updated + modified = true; + + // use the new copyright + result.setCopyrightFirstYear(result.getCopyrightFirstYear()); + result.setCopyrightLastYear(result.getCopyrightLastYear()); + result.setCopyrightHolder(result.getCopyrightHolder()); + } + + if (isUpdateLicense() && + !transformer.isLicenseEquals(oldHeader, newHeader)) { + + // can update license and it has changed + + if (log.isDebugEnabled()) { + log.debug("license has changed from [" + oldHeader.getLicense() + "] to [" + newHeader.getLicense() + "]"); + } + + // description has changed, mark header to be updated + modified = true; + + // use the new license + result.setLicense(newHeader.getLicense()); + } + + if (!modified) { + + // nothing has to be updated, so return a {@code null} result + result = null; + } + + return result; + } + + @Override + @Deprecated protected String treateHeader(String ch) { if (getLog().isDebugEnabled()) { @@ -103,4 +200,20 @@ public void setUpdateCopyright(boolean updateCopyright) { this.updateCopyright = updateCopyright; } + + public boolean isUpdateDescription() { + return updateDescription; + } + + public void setUpdateDescription(boolean updateDescription) { + this.updateDescription = updateDescription; + } + + public boolean isUpdateLicense() { + return updateLicense; + } + + public void setUpdateLicense(boolean updateLicense) { + this.updateLicense = updateLicense; + } } Modified: trunk/src/main/java/org/nuiton/license/plugin/header/transformer/AbstractFileHeaderTransformer.java =================================================================== --- trunk/src/main/java/org/nuiton/license/plugin/header/transformer/AbstractFileHeaderTransformer.java 2010-09-09 08:34:00 UTC (rev 1811) +++ trunk/src/main/java/org/nuiton/license/plugin/header/transformer/AbstractFileHeaderTransformer.java 2010-09-09 08:38:55 UTC (rev 1812) @@ -251,6 +251,32 @@ } @Override + public String toHeaderContent(FileHeader model) throws NullPointerException { + + String result; + + // model to text + result = toString(model); + + // box with process tag + result = boxProcessTag(result); + + // box header with comment prefix + result = boxComment(result, false); + + // remove all before process start tag + // remove all after process end tag + // this is a requirement for processor to respect involution. + int index = result.indexOf(getProcessStartTag()); + int lastIndex = + result.lastIndexOf(getProcessEndTag()) + + getProcessEndTag().length(); + + result = result.substring(index, lastIndex); + return result; + } + + @Override public String boxComment(String header, boolean withTags) { StringBuilder buffer = new StringBuilder(); if (withTags) { @@ -323,4 +349,35 @@ } return buffer.toString(); } + + @Override + public boolean isDescriptionEquals(FileHeader header1, FileHeader header2) { + return header1.getDescription().equals(header2.getDescription()); + } + + @Override + public boolean isCopyrightEquals(FileHeader header1, FileHeader header2) { + return header1.getCopyright().equals(header2.getCopyright()); + } + + @Override + public boolean isLicenseEquals(FileHeader header1, FileHeader header2) { + String license1 = removeSpaces(header1.getLicense()); + String license2 = removeSpaces(header2.getLicense()); + boolean result = license1.equals(license2); + return result; + } + + protected static final Pattern REMOVE_SPACE_PATTERN = Pattern.compile("(\\s+)"); + + protected String removeSpaces(String str) { + Matcher matcher = REMOVE_SPACE_PATTERN.matcher(str); + String result; + if (matcher.find()) { + result = matcher.replaceAll(""); + } else { + result = str; + } + return result; + } } Modified: trunk/src/main/java/org/nuiton/license/plugin/header/transformer/FileHeaderTransformer.java =================================================================== --- trunk/src/main/java/org/nuiton/license/plugin/header/transformer/FileHeaderTransformer.java 2010-09-09 08:34:00 UTC (rev 1811) +++ trunk/src/main/java/org/nuiton/license/plugin/header/transformer/FileHeaderTransformer.java 2010-09-09 08:38:55 UTC (rev 1812) @@ -113,8 +113,8 @@ /** * Adds the header. - * - * @param header header to add + * + * @param header header to add * @param content content of original file * @return the new full file content beginning with header */ @@ -176,6 +176,45 @@ String toString(FileHeader model) throws NullPointerException; /** + * Build a fully boxed header content from the given {@code model}. + * + * @param model the model of the file header + * @return the fully boxed header content + * @throws NullPointerException if model is null + */ + String toHeaderContent(FileHeader model) throws NullPointerException; + + /** + * Tests if the description of the two models are equals. + * + * @param header1 the first header + * @param header2 the second header + * @return {@code true} if headers description are stricly the same + * @since 2.3.2 + */ + boolean isDescriptionEquals(FileHeader header1, FileHeader header2); + + /** + * Tests if the copyright of the two models are equals. + * + * @param header1 the first header + * @param header2 the second header + * @return {@code true} if headers copyright are stricly the same + * @since 2.3.2 + */ + boolean isCopyrightEquals(FileHeader header1, FileHeader header2); + + /** + * Tests if the license of the two models are equals. + * + * @param header1 the first header + * @param header2 the second header + * @return {@code true} if headers license are stricly the same (WITHOUT ANY space) + * @since 2.3.2 + */ + boolean isLicenseEquals(FileHeader header1, FileHeader header2); + + /** * Changes the name of the transformer. * * @param name the new name of the transformer
participants (1)
-
tchemit@users.nuiton.org