r1719 - in trunk/src: it/update-header-file it/update-header-file/src/license main/java/org/nuiton/license/plugin main/java/org/nuiton/license/plugin/header main/java/org/nuiton/license/plugin/header/transformer main/java/org/nuiton/license/plugin/model main/mdo test/java/org/nuiton/license/plugin test/java/org/nuiton/license/plugin/header test/java/org/nuiton/license/plugin/header/transformer
Author: tchemit Date: 2010-04-08 19:55:28 +0200 (Thu, 08 Apr 2010) New Revision: 1719 Log: continue update-file-header mojo (just need to rebox (comment) updated header) Added: trunk/src/main/java/org/nuiton/license/plugin/header/FileHeader.java trunk/src/main/java/org/nuiton/license/plugin/header/FileHeaderFilter.java trunk/src/main/java/org/nuiton/license/plugin/header/FileHeaderProcessor.java trunk/src/main/java/org/nuiton/license/plugin/header/transformer/ trunk/src/main/java/org/nuiton/license/plugin/header/transformer/AbstractFileHeaderTransformer.java trunk/src/main/java/org/nuiton/license/plugin/header/transformer/AptFileHeaderTransformer.java trunk/src/main/java/org/nuiton/license/plugin/header/transformer/FileHeaderTransformer.java trunk/src/main/java/org/nuiton/license/plugin/header/transformer/JavaFileHeaderTransformer.java trunk/src/main/java/org/nuiton/license/plugin/header/transformer/PropertiesFileHeaderTransformer.java trunk/src/main/java/org/nuiton/license/plugin/header/transformer/XmlFileHeaderTransformer.java trunk/src/test/java/org/nuiton/license/plugin/header/ trunk/src/test/java/org/nuiton/license/plugin/header/transformer/ trunk/src/test/java/org/nuiton/license/plugin/header/transformer/AbstractFileHeaderTransformerTest.java Modified: trunk/src/it/update-header-file/pom.xml trunk/src/it/update-header-file/src/license/project.xml trunk/src/main/java/org/nuiton/license/plugin/AddLicenseFileMojo.java trunk/src/main/java/org/nuiton/license/plugin/AddThirdPartyFileMojo.java trunk/src/main/java/org/nuiton/license/plugin/UpdateHeaderFileMojo.java trunk/src/main/java/org/nuiton/license/plugin/UpdateHeaderMojo.java trunk/src/main/java/org/nuiton/license/plugin/model/LicenseRepository.java trunk/src/main/mdo/descriptor.mdo Modified: trunk/src/it/update-header-file/pom.xml =================================================================== --- trunk/src/it/update-header-file/pom.xml 2010-04-07 10:21:25 UTC (rev 1718) +++ trunk/src/it/update-header-file/pom.xml 2010-04-08 17:55:28 UTC (rev 1719) @@ -3,59 +3,64 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> - <modelVersion>4.0.0</modelVersion> + <modelVersion>4.0.0</modelVersion> - <!-- ************************************************************* --> - <!-- *** POM Relationships *************************************** --> - <!-- ************************************************************* --> + <!-- ************************************************************* --> + <!-- *** POM Relationships *************************************** --> + <!-- ************************************************************* --> - <groupId>org.nuiton.license.test</groupId> - <artifactId>test-update-header-file</artifactId> - <version>@pom.version@</version> + <groupId>org.nuiton.license.test</groupId> + <artifactId>test-update-header-file</artifactId> + <version>@pom.version@</version> - <!-- ************************************************************* --> - <!-- *** Project Information ************************************* --> - <!-- ************************************************************* --> + <!-- ************************************************************* --> + <!-- *** Project Information ************************************* --> + <!-- ************************************************************* --> - <name>License Test :: update-header-file</name> + <name>License Test :: update-header-file</name> - <!-- ************************************************************* --> - <!-- *** Build Settings ****************************************** --> - <!-- ************************************************************* --> + <!-- ************************************************************* --> + <!-- *** Build Settings ****************************************** --> + <!-- ************************************************************* --> - <packaging>jar</packaging> + <packaging>jar</packaging> - <build> + <inceptionYear>2010</inceptionYear> + + <properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + </properties> + <build> - <plugins> + <plugins> - <plugin> - <groupId>org.nuiton</groupId> - <artifactId>maven-license-plugin</artifactId> - <version>@pom.version@</version> - <configuration> - <verbose>true</verbose> - </configuration> - <executions> - <execution> - <id>first</id> - <goals> - <goal>update-header-file</goal> - </goals> - <phase>process-sources</phase> - </execution> - <execution> - <!-- this execution is to test with no files --> - <id>second</id> - <goals> - <goal>update-header-file</goal> - </goals> - <phase>compile</phase> - </execution> - </executions> - </plugin> - </plugins> - </build> + <plugin> + <groupId>org.nuiton</groupId> + <artifactId>maven-license-plugin</artifactId> + <version>@pom.version@</version> + <configuration> + <verbose>true</verbose> + </configuration> + <executions> + <execution> + <id>first</id> + <goals> + <goal>update-header-file</goal> + </goals> + <phase>process-sources</phase> + </execution> + <execution> + <!-- this execution is to test with no files --> + <id>second</id> + <goals> + <goal>update-header-file</goal> + </goals> + <phase>compile</phase> + </execution> + </executions> + </plugin> + </plugins> + </build> </project> Modified: trunk/src/it/update-header-file/src/license/project.xml =================================================================== --- trunk/src/it/update-header-file/src/license/project.xml 2010-04-07 10:21:25 UTC (rev 1718) +++ trunk/src/it/update-header-file/src/license/project.xml 2010-04-08 17:55:28 UTC (rev 1719) @@ -8,7 +8,7 @@ <licenseName>gpl_v3</licenseName> <fileSets> <fileSet> - <headerType>license-java</headerType> + <headerType>java</headerType> <basedir>src/main/java</basedir> <includes> <include>**/*.java</include> Modified: trunk/src/main/java/org/nuiton/license/plugin/AddLicenseFileMojo.java =================================================================== --- trunk/src/main/java/org/nuiton/license/plugin/AddLicenseFileMojo.java 2010-04-07 10:21:25 UTC (rev 1718) +++ trunk/src/main/java/org/nuiton/license/plugin/AddLicenseFileMojo.java 2010-04-08 17:55:28 UTC (rev 1719) @@ -179,7 +179,7 @@ File destFile = PluginHelper.getFile( outputDirectory, "META-INF", getProject().getArtifactId() + "-" + - licenseFile.getName() + licenseFile.getName() ); copyFile(licenseFile, destFile); } Modified: trunk/src/main/java/org/nuiton/license/plugin/AddThirdPartyFileMojo.java =================================================================== --- trunk/src/main/java/org/nuiton/license/plugin/AddThirdPartyFileMojo.java 2010-04-07 10:21:25 UTC (rev 1718) +++ trunk/src/main/java/org/nuiton/license/plugin/AddThirdPartyFileMojo.java 2010-04-08 17:55:28 UTC (rev 1719) @@ -229,7 +229,7 @@ copyFile(thirdPartyFile, new File( outputDirectory, "META-INF" + File.separator + getProject().getArtifactId() + - "-" + thirdPartyFile.getName()) + "-" + thirdPartyFile.getName()) ); } addResourceDir(outputDirectory, "**/*.txt"); @@ -259,7 +259,7 @@ // this dependency is not included, so do not treate it if (isVerbose()) { getLog().info("do not include this dependency " + - node.toNodeString()); + node.toNodeString()); } return; } @@ -285,7 +285,7 @@ for (Object o : licenses) { if (o == null) { getLog().warn("could not acquire the license for " - + artifactName); + + artifactName); continue; } License license = (License) o; @@ -310,7 +310,7 @@ protected String buildGroupedLicenses(LicenseMap licenseMap) { StringBuilder sb = new StringBuilder(); sb.append("List of third-party dependencies grouped by " + - "their license type."); + "their license type."); for (String licenseName : licenseMap.keySet()) { sb.append("\n\n").append(licenseName).append(" : "); Modified: trunk/src/main/java/org/nuiton/license/plugin/UpdateHeaderFileMojo.java =================================================================== --- trunk/src/main/java/org/nuiton/license/plugin/UpdateHeaderFileMojo.java 2010-04-07 10:21:25 UTC (rev 1718) +++ trunk/src/main/java/org/nuiton/license/plugin/UpdateHeaderFileMojo.java 2010-04-08 17:55:28 UTC (rev 1719) @@ -1,19 +1,23 @@ package org.nuiton.license.plugin; +import org.apache.commons.lang.StringUtils; import org.apache.maven.plugin.MojoFailureException; -import org.codehaus.plexus.velocity.VelocityComponent; -import org.nuiton.license.plugin.header.generator.HeaderGenerator; +import org.nuiton.license.plugin.header.FileHeader; +import org.nuiton.license.plugin.header.FileHeaderFilter; +import org.nuiton.license.plugin.header.FileHeaderProcessor; +import org.nuiton.license.plugin.header.transformer.FileHeaderTransformer; +import org.nuiton.license.plugin.model.License; import org.nuiton.license.plugin.model.LicenseStore; import org.nuiton.license.plugin.model.project.FileSet; import org.nuiton.license.plugin.model.project.LicenseProject; import org.nuiton.license.plugin.model.project.LicenseSet; import org.nuiton.license.plugin.model.project.io.xpp3.LicenseProjectXpp3Reader; +import org.nuiton.plugin.PluginHelper; import java.io.File; import java.io.FileReader; -import java.util.Arrays; -import java.util.List; -import java.util.Map; +import java.io.IOException; +import java.util.*; /** * The goal to update (or add) the licence header on some files. @@ -68,15 +72,6 @@ */ protected String projectName; -// /** -// * Le type de license a appliquer. -// * -// * @parameter expression="${license.licenseName}" -// * @required -// * @since 2.1 -// */ -// protected String licenseName; - /** * To specify an external licenses repository resolver (says the base url * of the repository). @@ -86,12 +81,11 @@ */ protected String licenseResolver; - /** * A flag to keep a backup of every modified file. * * @parameter expression="${license.keepBackup}" default-value="false" - * @since 1.0.0 + * @since 2.1 */ protected boolean keepBackup; @@ -99,7 +93,7 @@ * A flag to skip the goal. * * @parameter expression="${skipUpdateHeader}" default-value="false" - * @since 1.0.3 + * @since 2.1 */ protected boolean skipUpdateHeader; @@ -107,25 +101,18 @@ * A flag to test plugin but modify no file. * * @parameter expression="${dryRun}" default-value="false" - * @since 1.0.3 + * @since 2.1 */ protected boolean dryRun; /** - * Velocity Component. + * All available header transformers. * - * @component roleHint="maven-license-plugin" - * @since 2.0.0 + * @component role="org.nuiton.license.plugin.header.transformer.FileHeaderTransformer" + * @since 2.1 */ - protected VelocityComponent velocity; + protected Map<String, FileHeaderTransformer> transformers; - /** - * All available generators. - * - * @component role="org.nuiton.license.plugin.header.generator.HeaderGenerator" - */ - protected Map<String, HeaderGenerator> _generators; - /** timestamp used for generation */ protected long timestamp; @@ -136,8 +123,22 @@ protected LicenseProject licenseProject; @Override + protected boolean checkSkip() { + if (skipUpdateHeader) { + getLog().info("skip flag is on, will skip goal."); + return false; + } + return super.checkSkip(); + } + + @Override protected void init() throws Exception { + if (skipUpdateHeader) { + return; + } + timestamp = System.nanoTime(); + // init licenses store licenseStore = createLicenseStore(licenseResolver); @@ -149,41 +150,185 @@ reader.close(); } - List<String> licenseNames = Arrays.asList(licenseStore.getLicenseNames()); + // check that license project is sane (known licenses + header types) + // + populate default license name in LicenseSet (with main License) + validateProjectfile(licenseProject, licenseStore, transformers); - // check licenses is known - String mainLicense = licenseProject.getMainLicense(); - if (licenseStore.getLicense(mainLicense) == null) { - throw new MojoFailureException( - "main license '" + mainLicense + - "' is unknown, use one of " + licenseNames); - } - for (LicenseSet licenseSet : licenseProject.getLicenseSets()) { - // check license name - String licenseName = licenseSet.getLicenseName(); - if (licenseStore.getLicense(licenseName) == null) { - throw new MojoFailureException( - "license '" + licenseName + - "' is unknown, use one of " + licenseNames); + } + + @Override + protected void doAction() throws Exception { + + // create a file header processor which updates license content only + FileHeaderProcessor processor = new FileHeaderProcessor() { + + @Override + public FileHeaderFilter newFilter(FileHeader header, FileHeaderTransformer transformer) { + return new FileHeaderFilter(header, transformer) { + @Override + protected String treateHeader(String ch) { + + // unbox comment + String unbox = transformer.unboxComent(ch); + + // obtain current license of file + + FileHeader fileHeader = transformer.toFileHeader(unbox); + + // updates license + fileHeader.setLicense(header.getLicense()); + + // build new brut header (with no boxing) + + String newHeader = transformer.toString(fileHeader); + + //TODO-TC-20100408 must box header with comment prefix + + // box with process tag + newHeader = transformer.boxProcessTag(newHeader); + + if (getLog().isDebugEnabled()) { + getLog().debug("new Header =\n" + newHeader); + } + return newHeader; + } + }; } + }; - // check header types (for each file set) + for (LicenseSet licenseSet : licenseProject.getLicenseSets()) { + String licenseName = licenseSet.getLicenseName(); + License license = licenseStore.getLicense(licenseName); + + // file header to use if no header is found on a file + FileHeader defaultFileHeader = buildDefaultFileHeader( + license, + getProjectName(), + getInceptionYear(), + getOrganizationName(), + getEncoding() + ); + + processor.setHeader(defaultFileHeader); + for (FileSet fileSet : licenseSet.getFileSets()) { - String headerType = fileSet.getHeaderType(); - if (!_generators.containsKey(headerType)) { - throw new MojoFailureException( - "headerType '" + headerType + - "' is unknown, use one of " + _generators.keySet()); + File basedir = new File(getProject().getBasedir(), fileSet.getBasedir()); + List<String> includes = fileSet.getIncludes(); + if (includes.isEmpty()) { + + // it means include all + includes.add("**/*"); } + List<String> excludes = fileSet.getExcludes(); + + Map<File, String[]> filestoTreate = new TreeMap<File, String[]>(); + getFilesToTreateForRoots( + includes.toArray(new String[includes.size()]), + excludes.isEmpty() ? null : + excludes.toArray(new String[excludes.size()]), + Arrays.asList(basedir.getAbsolutePath()), + filestoTreate, + null + ); + FileHeaderTransformer transformer = + transformers.get(fileSet.getHeaderType()); + processor.setTransformer(transformer); + + updateHeader(processor, filestoTreate); } } } - @Override - protected void doAction() throws Exception { + public void updateHeader(FileHeaderProcessor processor, + Map<File, String[]> filestoTreate) throws IOException { + + FileHeaderTransformer transformer = processor.getTransformer(); + FileHeader header = processor.getHeader(); + + String defaultHeaderContent = transformer.toString(header); + getLog().debug("default header :\n" + defaultHeaderContent); + + String defaultFullHeaderContent = transformer.boxProcessTag(defaultHeaderContent); + getLog().info("default header (process tag boxed) :\n" + defaultFullHeaderContent); + + defaultFullHeaderContent = transformer.boxComment(defaultFullHeaderContent); + getLog().info("default header to use :\n" + defaultFullHeaderContent); + + for (Map.Entry<File, String[]> entry : filestoTreate.entrySet()) { + File basedir = entry.getKey(); + getLog().info("start entry \n" + basedir); + String[] paths = entry.getValue(); + getLog().info(paths.length + " file(s) to treate."); + for (String path : paths) { + File file = new File(basedir, path); + updateFile(processor, file, defaultFullHeaderContent); + } + } } + public void updateFile(FileHeaderProcessor processor, + File file, + String defaultFullHeaderContent) throws IOException { + getLog().info("scan file " + file); + + if (isVerbose()) { + getLog().info("process file " + file); + } + + // file where to writeFile result + File processFile = new File(file.getAbsolutePath() + "_" + + timestamp); + + try { + processor.process(file, processFile); + boolean foundLicenseHeader = processor.isTouched(); + + if (!foundLicenseHeader) { + if (processor.isDetectHeader()) { + getLog().warn( + "skip file " + file + + " (no license footer tag found : '##%*' !)"); + } else { + + // no license header found in file, add it + getLog().info("adding license header on file " + file); + String content = PluginHelper.readAsString( + file, + getEncoding() + ); + content = defaultFullHeaderContent + content; + if (!dryRun) { + writeFile(processFile, content, getEncoding()); + } + } + } + + if (keepBackup && !dryRun) { + File backupFile = new File(file.getAbsolutePath() + "~"); + if (isVerbose()) { + getLog().debug("backup original file " + file); + } + renameFile(file, backupFile); + } + if (dryRun) { + deleteFile(processFile); + } else { + renameFile(processFile, file); + + } + + } catch (Exception e) { + getLog().warn( + "skip file " + file + " (could not process " + + "for reason : " + e.getMessage() + ")"); + deleteFile(processFile); + } finally { + // toujours cleaner les états du filtre du processeur + processor.reset(); + } + } + public long getTimestamp() { return timestamp; } @@ -192,10 +337,6 @@ return projectName; } -// public String getLicenseName() { -// return licenseName; -// } - public String getInceptionYear() { return inceptionYear; } @@ -240,12 +381,72 @@ this.inceptionYear = inceptionYear; } -// public void setLicenseName(String licenseName) { -// this.licenseName = licenseName; -// } - public void setOrganizationName(String organizationName) { this.organizationName = organizationName; } + protected void validateProjectfile( + LicenseProject licenseProject, + LicenseStore licenseStore, + Map<String, FileHeaderTransformer> transformers) + throws MojoFailureException { + + List<String> licenseNames = Arrays.asList(licenseStore.getLicenseNames()); + + // check licenses is known + String mainLicense = licenseProject.getMainLicense(); + if (licenseStore.getLicense(mainLicense) == null) { + throw new MojoFailureException( + "main license '" + mainLicense + + "' is unknown, use one of " + licenseNames); + } + for (LicenseSet licenseSet : licenseProject.getLicenseSets()) { + + String licenseName = licenseSet.getLicenseName(); + if (StringUtils.isEmpty(licenseName)) { + + // use the main license + licenseSet.setLicenseName(mainLicense); + } else { + + // check license name + if (licenseStore.getLicense(licenseName) == null) { + throw new MojoFailureException( + "license '" + licenseName + + "' is unknown, use one of " + licenseNames); + } + } + + // check header types (for each file set) + for (FileSet fileSet : licenseSet.getFileSets()) { + String headerType = fileSet.getHeaderType(); + if (!transformers.containsKey(headerType)) { + throw new MojoFailureException( + "headerType '" + headerType + + "' is unknown, use one of " + transformers.keySet()); + } + } + } + } + + protected FileHeader buildDefaultFileHeader(License license, + String projectName, + String inceptionYear, + String copyrightHolder, + String encoding) throws IOException { + FileHeader result = new FileHeader(); + result.setDescription(projectName); + result.setLicense(license.getHeaderContent(encoding)); + Integer firstYear = Integer.valueOf(inceptionYear); + result.setCopyrightFirstYear(firstYear); + Calendar cal = Calendar.getInstance(); + cal.setTime(new Date()); + Integer lastYear = cal.get(Calendar.YEAR); + if (firstYear.equals(lastYear)) { + result.setCopyrightLastYear(lastYear); + } + result.setCopyrightHolder(copyrightHolder); + return result; + } + } Modified: trunk/src/main/java/org/nuiton/license/plugin/UpdateHeaderMojo.java =================================================================== --- trunk/src/main/java/org/nuiton/license/plugin/UpdateHeaderMojo.java 2010-04-07 10:21:25 UTC (rev 1718) +++ trunk/src/main/java/org/nuiton/license/plugin/UpdateHeaderMojo.java 2010-04-08 17:55:28 UTC (rev 1719) @@ -353,16 +353,8 @@ // recuperation de la license a utiliser licenseStore = createLicenseStore(licenseResolver); - + License license = licenseStore.getLicense(licenseName); -// -// LicenseRepository factory = -// LicenseRepositoryFactory.newLicenseRepository( -// true, -// true, -// licenseResolver -// ); -// License license = factory.getLicense(licenseName); if (isVerbose()) { getLog().info("config - use license " + license.getName()); Added: trunk/src/main/java/org/nuiton/license/plugin/header/FileHeader.java =================================================================== --- trunk/src/main/java/org/nuiton/license/plugin/header/FileHeader.java (rev 0) +++ trunk/src/main/java/org/nuiton/license/plugin/header/FileHeader.java 2010-04-08 17:55:28 UTC (rev 1719) @@ -0,0 +1,133 @@ +package org.nuiton.license.plugin.header; + +/** + * Contract of a file header. + * <p/> + * A header has thre sections like in this example : + * <p/> + * <pre> + * Description + * %-- + * Copyright (C) firstYear[ - lastYear] holder + * %-- + * License + * </pre> + * + * @author tchemit <chemit@codelutin.com> + * @since 2.1 + */ +public class FileHeader { + + /** Copyright to string format */ + protected static final String COPYRIGHT_TO_STRING_FORMAT = "Copyright (C) %1$s %2$s"; + + /** Description of the project or module to add in header */ + protected String description; + + /** Copyright holder */ + protected String copyrightHolder; + + /** Copyright first year of application */ + protected Integer copyrightFirstYear; + + /** + * Copyright last year of application (can be nullif copyright is + * only on one year). + */ + protected Integer copyrightLastYear; + + /** License used in the header. */ + protected String license; + + /** + * @return the project name, or nay other common informations for all + * files of a project (or module) + */ + public String getDescription() { + return description; + } + + /** @return the copyright holder */ + public String getCopyrightHolder() { + return copyrightHolder; + } + + /** @return the first year of the copyright */ + public Integer getCopyrightFirstYear() { + return copyrightFirstYear; + } + + /** + * @return the last year of the copyright (if copyright affects only one + * year, can be equals to the {@link #getCopyrightFirstYear()}). + */ + public Integer getCopyrightLastYear() { + return copyrightLastYear; + } + + /** + * Produces a string representation of the copyright. + * <p/> + * If copyright acts on one year : + * <pre> + * Copyright (C) 2010 Holder + * </pre> + * <p/> + * If copyright acts on more than one year : + * <pre> + * Copyright (C) 2010 - 2012 Holder + * </pre> + * + * @return the String representation of the copyright + */ + public String getCopyright() { + String copyright; + if (getCopyrightLastYear() == null) { + + // copyright on one year + copyright = String.format( + COPYRIGHT_TO_STRING_FORMAT, + getCopyrightFirstYear(), + getCopyrightHolder() + ); + } else { + + // copyright on more than one year + copyright = String.format( + COPYRIGHT_TO_STRING_FORMAT, + getCopyrightFirstYear() + " - " + + getCopyrightLastYear(), + getCopyrightHolder() + ); + } + return copyright; + } + + /** + * @return the license content (this is not the fully license content, + * but just a per file license resume) + */ + public String getLicense() { + return license; + } + + public void setDescription(String description) { + this.description = description; + } + + public void setCopyrightHolder(String copyrightHolder) { + this.copyrightHolder = copyrightHolder; + } + + public void setCopyrightFirstYear(Integer copyrightFirstYear) { + this.copyrightFirstYear = copyrightFirstYear; + } + + public void setCopyrightLastYear(Integer copyrightLastYear) { + this.copyrightLastYear = copyrightLastYear; + } + + public void setLicense(String license) { + this.license = license; + } +} Property changes on: trunk/src/main/java/org/nuiton/license/plugin/header/FileHeader.java ___________________________________________________________________ Added: svn:keywords + "Author Date Id Revision HeadURL Added: trunk/src/main/java/org/nuiton/license/plugin/header/FileHeaderFilter.java =================================================================== --- trunk/src/main/java/org/nuiton/license/plugin/header/FileHeaderFilter.java (rev 0) +++ trunk/src/main/java/org/nuiton/license/plugin/header/FileHeaderFilter.java 2010-04-08 17:55:28 UTC (rev 1719) @@ -0,0 +1,100 @@ +package org.nuiton.license.plugin.header; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.license.plugin.header.transformer.FileHeaderTransformer; +import org.nuiton.processor.filters.DefaultFilter; + +/** + * TODO + * + * @author tchemit <chemit@codelutin.com> + * @since 2.1 + */ +public abstract class FileHeaderFilter extends DefaultFilter { + + /** to use log facility, just put in your code: log.info(\"...\"); */ + static private final Log log = LogFactory.getLog(FileHeaderFilter.class); + + /** flag pour indiquer si la licence a ete trouvee entre le header et le footer */ + protected boolean touched; + + /** flag pour indiquer si on a rencontree le header du filtre */ + protected boolean detectHeader; + + protected FileHeader header; + + protected FileHeaderTransformer transformer; + + protected abstract String treateHeader(String ch); + + public FileHeaderFilter(FileHeader header, FileHeaderTransformer transformer) { + this.header = header; + this.transformer = transformer; + } + + @Override + protected String performInFilter(String ch) { + if (log.isDebugEnabled()) { + log.debug(ch); + } + if (touched) { + // on autorise pas deux process de la licence dans un fichier java + throw new IllegalStateException("Can only have one file header start tag : " + getHeader()); + } + if (getMatchIndexFor(ch, getHeader()) == NOT_FOUND) { + + // the header was detected, mark file to be touched + touched = true; + + // update header + String newHeader = treateHeader(ch); + return newHeader; + } + // ce cas arrive lorsque l'on a parcouru tout le fichier avec detection + // de la balise header mais sans balise footer + // et on arrive dans cette methode dans le flush du filter + return ch; + } + + @Override + protected String performOutFilter(String ch) { + if (log.isDebugEnabled()) { + log.debug(ch); + } + return ch; + } + + @Override + protected String getHeader() { + return transformer.getProcessStartTag(); + } + + @Override + protected String getFooter() { + return transformer.getProcessEndTag(); + } + + @Override + protected void changeState(State newState) { + super.changeState(newState); + if (newState == State.SEARCH_FOOTER) { + // on a decouvert un header + detectHeader = true; + } + } + + public boolean isTouched() { + return touched; + } + + public boolean isDetectHeader() { + return detectHeader; + } + + public void reset() { + touched = false; + detectHeader = false; + state = State.SEARCH_HEADER; + } +} \ No newline at end of file Property changes on: trunk/src/main/java/org/nuiton/license/plugin/header/FileHeaderFilter.java ___________________________________________________________________ Added: svn:keywords + "Author Date Id Revision HeadURL Added: trunk/src/main/java/org/nuiton/license/plugin/header/FileHeaderProcessor.java =================================================================== --- trunk/src/main/java/org/nuiton/license/plugin/header/FileHeaderProcessor.java (rev 0) +++ trunk/src/main/java/org/nuiton/license/plugin/header/FileHeaderProcessor.java 2010-04-08 17:55:28 UTC (rev 1719) @@ -0,0 +1,105 @@ +package org.nuiton.license.plugin.header; + +import org.nuiton.license.plugin.header.transformer.FileHeaderTransformer; +import org.nuiton.processor.Processor; + +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; + +/** + * TODO + * + * @author tchemit <chemit@codelutin.com> + * @since 2.1 + */ +public abstract class FileHeaderProcessor extends Processor { + + /** file header */ + protected FileHeader header; + + protected FileHeaderTransformer transformer; + + /** internal filter */ + protected FileHeaderFilter filter; + + public abstract FileHeaderFilter newFilter(FileHeader header, FileHeaderTransformer transformer); + + public FileHeaderProcessor() { + } + + /** + * @return {@code true} if processed file was modified (says the header was + * fully found and updating), {@code false} otherwise + * @see FileHeaderFilter#isTouched() + */ + public boolean isTouched() { + return filter != null && filter.isTouched(); + } + + /** + * @return {@code true} if header of header was detected + * @see FileHeaderFilter#isDetectHeader() + */ + public boolean isDetectHeader() { + return filter != null && filter.isDetectHeader(); + } + + public void process(File filein, File fileout) throws IOException { + if (header == null) { + throw new IllegalStateException("no file header sets."); + } + if (transformer == null) { + throw new IllegalStateException("no file header transformer sets."); + } + if (filter == null) { + setFilter(newFilter(header, transformer)); + } + FileReader input = new FileReader(filein); + try { + FileWriter output = new FileWriter(fileout); + try { + process(input, output); + } finally { + output.close(); + } + } finally { + input.close(); + } + } + + public FileHeader getHeader() { + return header; + } + + public void setHeader(FileHeader header) { + this.header = header; + filter = null; + } + + public FileHeaderTransformer getTransformer() { + return transformer; + } + + public void setTransformer(FileHeaderTransformer transformer) { + this.transformer = transformer; + filter = null; + } +// +// protected FileHeaderFilter getFilter() { +// return filter; +// } + + public void setFilter(FileHeaderFilter filter) { + this.filter = filter; + setInputFilter(filter); + } + + + public void reset() { + if (filter != null) { + filter.reset(); + } + } +} Property changes on: trunk/src/main/java/org/nuiton/license/plugin/header/FileHeaderProcessor.java ___________________________________________________________________ Added: svn:keywords + "Author Date Id Revision HeadURL Added: trunk/src/main/java/org/nuiton/license/plugin/header/transformer/AbstractFileHeaderTransformer.java =================================================================== --- trunk/src/main/java/org/nuiton/license/plugin/header/transformer/AbstractFileHeaderTransformer.java (rev 0) +++ trunk/src/main/java/org/nuiton/license/plugin/header/transformer/AbstractFileHeaderTransformer.java 2010-04-08 17:55:28 UTC (rev 1719) @@ -0,0 +1,282 @@ +package org.nuiton.license.plugin.header.transformer; + +import org.nuiton.license.plugin.header.FileHeader; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Abstract implementation of {@link FileHeaderTransformer} which does NOT deal + * with the boxing-unboxing part, but just with transformation methods, since + * they are common to any transformer. + * <p/> + * Concrete implementation should just has to deal with to boxing stuff. + * + * @author tchemit <chemit@codelutin.com> + * @since 2.1 + */ +public abstract class AbstractFileHeaderTransformer implements FileHeaderTransformer { + + /** + * pattern of the copyright string representation : + * <ul> + * <li>group(1) is Copyright prefix</li> + * <li>group(2) is Copyright first year</li> + * <li>group(3) is Copyright last year with prefix (can be null)</li> + * <li>group(4) is Copyright last year (can be null)</li> + * <li>group(5) is Copyright holder</li> + * </ul> + */ + protected static final Pattern COPYRIGHT_PATTERN = + Pattern.compile( + "(.[^\\d]+)?\\s(\\d{4})?(\\s+-\\s+(\\d{4})?){0,1}\\s+(.+)?" + ); + + public static final char LINE_SEPARATOR = '\n'; + + /** name of transformer */ + protected String name; + + /** description of transfomer */ + protected String description; + + /** section delimiter */ + protected String sectionDelimiter = DEFAULT_SECTION_DELIMITER; + + /** start process tag */ + protected String processStartTag = DEFAULT_PROCESS_START_TAG; + + /** end process tag */ + protected String processEndTag = DEFAULT_PROCESS_END_TAG; + + /** comment start tag */ + protected String commentStartTag; + + /** comment end tag */ + protected String commentEndTag; + + /** comment line prefix (to add for header content) */ + protected String commentLinePrefix; + + protected AbstractFileHeaderTransformer() { + + } + + protected AbstractFileHeaderTransformer(String name, + String description, + String commentStartTag, + String commentEndTag, + String commentLinePrefix) { + this.name = name; + this.description = description; + this.commentStartTag = commentStartTag; + this.commentEndTag = commentEndTag; + this.commentLinePrefix = commentLinePrefix; + } + + protected AbstractFileHeaderTransformer(String commentStartTag, + String commentEndTag, + String commentLinePrefix) { + this.commentStartTag = commentStartTag; + this.commentEndTag = commentEndTag; + this.commentLinePrefix = commentLinePrefix; + } + + @Override + public String getName() { + return name; + } + + @Override + public void setName(String name) { + this.name = name; + } + + @Override + public String getDescription() { + return description; + } + + @Override + public void setDescription(String description) { + this.description = description; + } + + @Override + public String getSectionDelimiter() { + return sectionDelimiter; + } + + @Override + public void setSectionDelimiter(String sectionDelimiter) { + this.sectionDelimiter = sectionDelimiter; + } + + @Override + public String getProcessStartTag() { + return processStartTag; + } + + @Override + public void setProcessStartTag(String processStartTag) { + this.processStartTag = processStartTag; + } + + @Override + public String getProcessEndTag() { + return processEndTag; + } + + @Override + public void setProcessEndTag(String processEndTag) { + this.processEndTag = processEndTag; + } + + @Override + public String getCommentStartTag() { + return commentStartTag; + } + + @Override + public void setCommentStartTag(String commentStartTag) { + this.commentStartTag = commentStartTag; + } + + @Override + public String getCommentEndTag() { + return commentEndTag; + } + + @Override + public void setCommentEndTag(String commentEndTag) { + this.commentEndTag = commentEndTag; + } + + @Override + public String getCommentLinePrefix() { + return commentLinePrefix; + } + + @Override + public void setCommentLinePrefix(String commentLinePrefix) { + this.commentLinePrefix = commentLinePrefix; + } + + @Override + public FileHeader toFileHeader(String header) { + FileHeader model = new FileHeader(); + + String[] sections = header.split(getSectionDelimiter()); + if (sections.length != 3) { + throw new IllegalStateException( + "could not find 3 sections in\n" + header); + } + + // first section is the description + String description = sections[0].trim(); + model.setDescription(description); + + // second section is the copyright + String copyright = sections[1].trim(); + Matcher matcher = COPYRIGHT_PATTERN.matcher(copyright); + if (!matcher.matches()) { + throw new IllegalStateException( + "copyright [" + copyright + "] is not valid"); + } + String firstYear = matcher.group(2); + String lastYear = matcher.group(4); + String holder = matcher.group(5); + model.setCopyrightFirstYear(Integer.valueOf(firstYear.trim())); + if (lastYear != null) { + model.setCopyrightLastYear(Integer.valueOf(lastYear.trim())); + } + model.setCopyrightHolder(holder.trim()); + + // third section is the license + String license = sections[2].trim(); + model.setLicense(license); + return model; + } + + @Override + public String toString(FileHeader model) { + StringBuilder buffer = new StringBuilder(); + + String sectionDelimiter = LINE_SEPARATOR + getSectionDelimiter() + + LINE_SEPARATOR; + + // add description section + buffer.append(model.getDescription().trim()); + buffer.append(sectionDelimiter); + + // add copyright section + buffer.append(model.getCopyright().trim()); + buffer.append(sectionDelimiter); + + // add license section + buffer.append(model.getLicense().trim()).append(LINE_SEPARATOR); + return buffer.toString(); + } + + @Override + public String boxComment(String header) { + StringBuilder buffer = new StringBuilder(); + buffer.append(getCommentStartTag()).append(LINE_SEPARATOR); + for (String line : header.split(LINE_SEPARATOR + "")) { + buffer.append(getCommentLinePrefix()); + buffer.append(line); + buffer.append(LINE_SEPARATOR); + } + buffer.append(getCommentEndTag()).append(LINE_SEPARATOR); + return buffer.toString(); + } + + @Override + public String unboxComent(String header) { + StringBuilder buffer = new StringBuilder(); + int prefixLength = getCommentLinePrefix().length(); + for (String line : header.split(LINE_SEPARATOR + "")) { + if (line.isEmpty() || + line.contains(getCommentStartTag()) || + line.contains(getCommentEndTag())) { + + // not be unboxed, but just skipped + continue; + } + int index = line.indexOf(getCommentLinePrefix()); + if (index > -1) { + + // remove comment prefix + line = line.substring(index + prefixLength); + } + buffer.append(line).append(LINE_SEPARATOR); + } + return buffer.toString(); + } + + + @Override + public String boxProcessTag(String header) { + StringBuilder buffer = new StringBuilder(); + buffer.append(getProcessStartTag()).append(LINE_SEPARATOR); + buffer.append(header.trim()).append(LINE_SEPARATOR); + buffer.append(getProcessEndTag()).append(LINE_SEPARATOR); + return buffer.toString(); + } + + @Override + public String unboxProcessTag(String boxedHeader) { + StringBuilder buffer = new StringBuilder(); + for (String line : boxedHeader.split(LINE_SEPARATOR + "")) { + if (line.isEmpty() || + line.contains(getProcessStartTag()) || + line.contains(getProcessEndTag())) { + + // not be unboxed, but just skipped + continue; + } + buffer.append(line).append(LINE_SEPARATOR); + } + return buffer.toString(); + } +} Property changes on: trunk/src/main/java/org/nuiton/license/plugin/header/transformer/AbstractFileHeaderTransformer.java ___________________________________________________________________ Added: svn:keywords + "Author Date Id Revision HeadURL Added: trunk/src/main/java/org/nuiton/license/plugin/header/transformer/AptFileHeaderTransformer.java =================================================================== --- trunk/src/main/java/org/nuiton/license/plugin/header/transformer/AptFileHeaderTransformer.java (rev 0) +++ trunk/src/main/java/org/nuiton/license/plugin/header/transformer/AptFileHeaderTransformer.java 2010-04-08 17:55:28 UTC (rev 1719) @@ -0,0 +1,30 @@ +package org.nuiton.license.plugin.header.transformer; + +/** + * Implementation of {@link FileHeaderTransformer} for apt format. + * + * @author tchemit <chemit@codelutin.com> + * @plexus.component role-hint="apt" + * @since 2.1 + */ +public class AptFileHeaderTransformer extends AbstractFileHeaderTransformer { + + public static final String NAME = "apt"; + + public static final String DESCRIPTION = "header transformer with apt comment style"; + + public static final String COMMENT_LINE_PREFIX = "~~~ "; + + public static final String COMMENT_START_TAG = "\n"; + + public static final String COMMENT_END_TAG = "\n"; + + public AptFileHeaderTransformer() { + super(NAME, + DESCRIPTION, + COMMENT_START_TAG, + COMMENT_END_TAG, + COMMENT_LINE_PREFIX + ); + } +} Property changes on: trunk/src/main/java/org/nuiton/license/plugin/header/transformer/AptFileHeaderTransformer.java ___________________________________________________________________ Added: svn:keywords + "Author Date Id Revision HeadURL Added: trunk/src/main/java/org/nuiton/license/plugin/header/transformer/FileHeaderTransformer.java =================================================================== --- trunk/src/main/java/org/nuiton/license/plugin/header/transformer/FileHeaderTransformer.java (rev 0) +++ trunk/src/main/java/org/nuiton/license/plugin/header/transformer/FileHeaderTransformer.java 2010-04-08 17:55:28 UTC (rev 1719) @@ -0,0 +1,169 @@ +package org.nuiton.license.plugin.header.transformer; + +import org.nuiton.license.plugin.header.FileHeader; + +/** + * Contract to transform a file header to {@link org.nuiton.license.plugin.header.FileHeader} in both way : + * <p/> + * <ul> + * <li>Obtain a object representation of a file header from a existing file + * (String to FileHeader).</li> + * <li>Obtain the file header to inject in a file from a FileHeader (to update + * or create a file header from the file header model). + * </ul> + * <p/> + * Moreover the contract offers tow method to box and unbox a String + * representation of a header content : + * <ul> + * <li>{@link #boxComment(String)}</li> + * <li>{@link #unboxComent(String)}</li> + * </ul> + * + * @author tchemit <chemit@codelutin.com> + * @since 2.1 + */ +public interface FileHeaderTransformer { + + /** Plexus component role */ + String ROLE_NAME = FileHeaderTransformer.class.getName(); + + /** default section delimiter */ + String DEFAULT_SECTION_DELIMITER = "%--"; + + /** default process start tag */ + String DEFAULT_PROCESS_START_TAG = "#%L"; + + /** default process end tag */ + String DEFAULT_PROCESS_END_TAG = "#L%"; + + /** @return the name of the transformer */ + String getName(); + + /** @return the description of the transformer */ + String getDescription(); + + /** + * Obtains the process tag which indicates the begin of the header content. + * <p/> + * By default, (says if you do not explicitly invoke the + * {@link #setProcessStartTag(String)} method), will use the + * {@link #DEFAULT_PROCESS_START_TAG} + * + * @return the starting header tag + */ + String getProcessStartTag(); + + /** + * Obtain the process tag which indiciates the end of the header content. + * <p/> + * By default, (says if you do not explicitly invoke the + * {@link #setProcessEndTag(String)} method), will use the + * {@link #DEFAULT_PROCESS_END_TAG}. + * + * @return the ending header tag + */ + String getProcessEndTag(); + + /** + * The pattern used to separate sections of the header. + * <p/> + * By default, (says if you do not explicitly invoke the + * {@link #setSectionDelimiter(String)} method), will use the + * {@link #DEFAULT_SECTION_DELIMITER}. + * + * @return the delimiter used to separate sections in the header. + */ + String getSectionDelimiter(); + + String getCommentStartTag(); + + String getCommentEndTag(); + + String getCommentLinePrefix(); + + void setName(String name); + + void setDescription(String description); + + /** + * Sets the header section delimiter. + * <p/> + * By default, will use the {@link #DEFAULT_SECTION_DELIMITER}. + * + * @param headerSectionDelimiter the new delimiter + */ + void setSectionDelimiter(String headerSectionDelimiter); + + /** + * Changes the process start tag. + * + * @param tag the new start tag + */ + void setProcessStartTag(String tag); + + /** + * Changes the process end tag. + * + * @param tag the new endtag + */ + void setProcessEndTag(String tag); + + void setCommentStartTag(String commentStartTag); + + void setCommentEndTag(String commentEndTag); + + void setCommentLinePrefix(String commentLinePrefix); + + /** + * Box the given {@code header} in a comment. + * + * @param header the header content WITHOUT any comment boxing + * @return the header content WITH comment boxing + */ + String boxComment(String header); + + /** + * Unbox the given boxed {@code boxedHeader} to obtain the header content. + * + * @param boxedHeader the boxed header + * @return the unboxed header. + */ + String unboxComent(String boxedHeader); + + /** + * Box the given {@code header} between process tags. + * + * @param header the header content WITHOUT any comment boxing + * @return the header content boxed between process tags + * @see #getProcessStartTag() + * @see #getProcessEndTag() + */ + String boxProcessTag(String header); + + /** + * Unbox the process tag on the given boxed {@code boxedHeader} to obtain + * the brute header content. + * + * @param boxedHeader the boxed header + * @return the brute header content. + * @see #getProcessStartTag() + * @see #getProcessEndTag() + */ + String unboxProcessTag(String boxedHeader); + + /** + * Build a {@link org.nuiton.license.plugin.header.FileHeader} from an UNBOXED header content. + * + * @param header unboxed header content + * @return The model of the header content + */ + FileHeader toFileHeader(String header); + + /** + * Build a UNBOXED header content from the given {@code model}. + * + * @param model the model of the file header + * @return the UNBOXED header content + */ + String toString(FileHeader model); +} Property changes on: trunk/src/main/java/org/nuiton/license/plugin/header/transformer/FileHeaderTransformer.java ___________________________________________________________________ Added: svn:keywords + "Author Date Id Revision HeadURL Added: trunk/src/main/java/org/nuiton/license/plugin/header/transformer/JavaFileHeaderTransformer.java =================================================================== --- trunk/src/main/java/org/nuiton/license/plugin/header/transformer/JavaFileHeaderTransformer.java (rev 0) +++ trunk/src/main/java/org/nuiton/license/plugin/header/transformer/JavaFileHeaderTransformer.java 2010-04-08 17:55:28 UTC (rev 1719) @@ -0,0 +1,30 @@ +package org.nuiton.license.plugin.header.transformer; + +/** + * Implementation of {@link FileHeaderTransformer} for java format. + * + * @author tchemit <chemit@codelutin.com> + * @plexus.component role-hint="java" + * @since 2.1 + */ +public class JavaFileHeaderTransformer extends AbstractFileHeaderTransformer { + + public static final String NAME = "java"; + + public static final String DESCRIPTION = "header transformer with java comment style"; + + public static final String COMMENT_LINE_PREFIX = " * "; + + public static final String COMMENT_START_TAG = "/*"; + + public static final String COMMENT_END_TAG = " */"; + + public JavaFileHeaderTransformer() { + super(NAME, + DESCRIPTION, + COMMENT_START_TAG, + COMMENT_END_TAG, + COMMENT_LINE_PREFIX + ); + } +} \ No newline at end of file Property changes on: trunk/src/main/java/org/nuiton/license/plugin/header/transformer/JavaFileHeaderTransformer.java ___________________________________________________________________ Added: svn:keywords + "Author Date Id Revision HeadURL Added: trunk/src/main/java/org/nuiton/license/plugin/header/transformer/PropertiesFileHeaderTransformer.java =================================================================== --- trunk/src/main/java/org/nuiton/license/plugin/header/transformer/PropertiesFileHeaderTransformer.java (rev 0) +++ trunk/src/main/java/org/nuiton/license/plugin/header/transformer/PropertiesFileHeaderTransformer.java 2010-04-08 17:55:28 UTC (rev 1719) @@ -0,0 +1,30 @@ +package org.nuiton.license.plugin.header.transformer; + +/** + * Implementation of {@link FileHeaderTransformer} for properties format. + * + * @author tchemit <chemit@codelutin.com> + * @plexus.component role-hint="properties" + * @since 2.1 + */ +public class PropertiesFileHeaderTransformer extends AbstractFileHeaderTransformer { + + public static final String NAME = "properties"; + + public static final String DESCRIPTION = "header transformer with properties file comment style"; + + public static final String COMMENT_LINE_PREFIX = "# "; + + public static final String COMMENT_START_TAG = "###############################################################################"; + + public static final String COMMENT_END_TAG = "###############################################################################"; + + public PropertiesFileHeaderTransformer() { + super(NAME, + DESCRIPTION, + COMMENT_START_TAG, + COMMENT_END_TAG, + COMMENT_LINE_PREFIX + ); + } +} \ No newline at end of file Property changes on: trunk/src/main/java/org/nuiton/license/plugin/header/transformer/PropertiesFileHeaderTransformer.java ___________________________________________________________________ Added: svn:keywords + "Author Date Id Revision HeadURL Added: trunk/src/main/java/org/nuiton/license/plugin/header/transformer/XmlFileHeaderTransformer.java =================================================================== --- trunk/src/main/java/org/nuiton/license/plugin/header/transformer/XmlFileHeaderTransformer.java (rev 0) +++ trunk/src/main/java/org/nuiton/license/plugin/header/transformer/XmlFileHeaderTransformer.java 2010-04-08 17:55:28 UTC (rev 1719) @@ -0,0 +1,30 @@ +package org.nuiton.license.plugin.header.transformer; + +/** + * Implementation of {@link FileHeaderTransformer} for xml format. + * + * @author tchemit <chemit@codelutin.com> + * @plexus.component role-hint="xml" + * @since 2.1 + */ +public class XmlFileHeaderTransformer extends AbstractFileHeaderTransformer { + + public static final String NAME = "xml"; + + public static final String DESCRIPTION = "header transformer with xml comment style"; + + public static final String COMMENT_LINE_PREFIX = " "; + + public static final String COMMENT_START_TAG = "<!--"; + + public static final String COMMENT_END_TAG = "-->"; + + public XmlFileHeaderTransformer() { + super(NAME, + DESCRIPTION, + COMMENT_START_TAG, + COMMENT_END_TAG, + COMMENT_LINE_PREFIX + ); + } +} \ No newline at end of file Property changes on: trunk/src/main/java/org/nuiton/license/plugin/header/transformer/XmlFileHeaderTransformer.java ___________________________________________________________________ Added: svn:keywords + "Author Date Id Revision HeadURL Modified: trunk/src/main/java/org/nuiton/license/plugin/model/LicenseRepository.java =================================================================== --- trunk/src/main/java/org/nuiton/license/plugin/model/LicenseRepository.java 2010-04-07 10:21:25 UTC (rev 1718) +++ trunk/src/main/java/org/nuiton/license/plugin/model/LicenseRepository.java 2010-04-08 17:55:28 UTC (rev 1719) @@ -124,7 +124,7 @@ } return result.toArray(new String[result.size()]); } - + public License[] getLicenses() { checkInit("getLicenses"); return licenses.toArray(new License[licenses.size()]); Modified: trunk/src/main/mdo/descriptor.mdo =================================================================== --- trunk/src/main/mdo/descriptor.mdo 2010-04-07 10:21:25 UTC (rev 1718) +++ trunk/src/main/mdo/descriptor.mdo 2010-04-08 17:55:28 UTC (rev 1719) @@ -10,11 +10,11 @@ <p> Maven License Plugin relies on the provided project descriptors to dictate its execution. Although there are already prefabricated descriptors available - for use, they can only suffice some of the common assembly requirements. + for use, they can only suffice some of the common license requirements. </p> <p> - So in order for you to customize the way the License Plugin creates your - assemblies, you need to know how to use the License project Descriptor. + So in order for you to customize the way the License Plugin updates your + licenses, you need to know how to use the License project Descriptor. </p> <p> This descriptor specifies the type of licenses to apply for some defined @@ -45,8 +45,10 @@ <required>true</required> <type>String</type> <description> - The main license of the project (or module). The LICENSE.txt will + <![CDATA[ + The main license of the project (or module). The LICENSE.txt will contains the content of this license. + ]]> </description> </field> <field> @@ -66,7 +68,7 @@ </fields> </class> - <class> + <class> <name>LicenseSet</name> <description> <![CDATA[ @@ -79,8 +81,13 @@ <name>licenseName</name> <version>1.0.0+</version> <type>String</type> - <required>true</required> - <description>The license to apply in this set.</description> + <!--<required>true</required>--> + <description> + <![CDATA[ + The license to apply in this set. If not fill, will use + the main license. + ]]> + </description> </field> <field> <name>fileSets</name> @@ -91,8 +98,8 @@ </association> <description> <![CDATA[ - Specifies file sets to include in the license set. A fileSet is specified - by providing one or more of <licenseSet> subelements. + Specifies file sets to include in the license set. A fileSet is + specified by providing one or more of <licenseSet> subelements. ]]> </description> </field> @@ -103,10 +110,10 @@ <name>FileSet</name> <version>1.0.0+</version> <description> - <![CDATA[ + <![CDATA[ A fileSet allows the inclusion of groups of files into the license set and defines also the type of header to generate. - ]]> + ]]> </description> <fields> <field> @@ -114,7 +121,8 @@ <version>1.0.0+</version> <type>String</type> <required>true</required> - <description>The type of header to generate (or updates).</description> + <description>The type of header to generate (or updates). + </description> </field> <field> <name>useDefaultExcludes</name> @@ -122,8 +130,10 @@ <type>boolean</type> <defaultValue>true</defaultValue> <description> - Whether standard exclusion patterns, such as those matching CVS and Subversion - metadata files, should be used when calculating the files affected by this set. + Whether standard exclusion patterns, such as those matching CVS and + Subversion + metadata files, should be used when calculating the files affected + by this set. For backward compatibility, the default value is true. (Since 2.2) </description> </field> Added: trunk/src/test/java/org/nuiton/license/plugin/header/transformer/AbstractFileHeaderTransformerTest.java =================================================================== --- trunk/src/test/java/org/nuiton/license/plugin/header/transformer/AbstractFileHeaderTransformerTest.java (rev 0) +++ trunk/src/test/java/org/nuiton/license/plugin/header/transformer/AbstractFileHeaderTransformerTest.java 2010-04-08 17:55:28 UTC (rev 1719) @@ -0,0 +1,251 @@ +package org.nuiton.license.plugin.header.transformer; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.nuiton.license.plugin.header.FileHeader; + +import java.util.regex.Matcher; + +import static org.nuiton.license.plugin.header.transformer.AbstractFileHeaderTransformer.COPYRIGHT_PATTERN; +import static org.nuiton.license.plugin.header.transformer.AbstractFileHeaderTransformer.DEFAULT_PROCESS_END_TAG; +import static org.nuiton.license.plugin.header.transformer.AbstractFileHeaderTransformer.DEFAULT_PROCESS_START_TAG; +import static org.nuiton.license.plugin.header.transformer.AbstractFileHeaderTransformer.DEFAULT_SECTION_DELIMITER; +import static org.nuiton.license.plugin.header.transformer.AbstractFileHeaderTransformer.LINE_SEPARATOR; +import static org.nuiton.license.plugin.header.transformer.JavaFileHeaderTransformer.*; + +/** + * Tests the {@link AbstractFileHeaderTransformer}. + * + * @author tchemit <chemit@codelutin.com> + * @since 2.1 + */ +public class AbstractFileHeaderTransformerTest { + + FileHeaderTransformer transformer; + + FileHeader model1, model2; + + @Before + public void setUp() throws Exception { + transformer = new JavaFileHeaderTransformer(); + + model1 = new FileHeader(); + model1.setDescription("Description"); + model1.setCopyrightFirstYear(2010); + model1.setCopyrightLastYear(null); + model1.setCopyrightHolder("Tony"); + model1.setLicense("License"); + + model2 = new FileHeader(); + model2.setDescription("Description2"); + model2.setCopyrightFirstYear(2010); + model2.setCopyrightLastYear(2012); + model2.setCopyrightHolder("Tony2"); + model2.setLicense("License2"); + } + + @After + public void tearDown() throws Exception { + transformer = null; + model1 = null; + model2 = null; + } + + @Test + public void testCopyrightPattern() throws Exception { + String actual; + Matcher matcher; + String prefix; + String firstYear; + String lastYear; + String holder; + + actual = "Copyright (C) 2010 Tony"; + matcher = COPYRIGHT_PATTERN.matcher(actual); + Assert.assertTrue(matcher.matches()); + Assert.assertEquals(5, matcher.groupCount()); + prefix = matcher.group(1); + Assert.assertEquals("Copyright (C)", prefix); + firstYear = matcher.group(2); + Assert.assertEquals("2010", firstYear); + lastYear = matcher.group(4); + Assert.assertEquals(null, lastYear); + holder = matcher.group(5); + Assert.assertEquals("Tony", holder); + + actual = "Copyright (C) 2010 - 2012 Tony"; + matcher = COPYRIGHT_PATTERN.matcher(actual); + Assert.assertTrue(matcher.matches()); + Assert.assertEquals(5, matcher.groupCount()); + prefix = matcher.group(1); + Assert.assertEquals("Copyright (C)", prefix); + firstYear = matcher.group(2); + Assert.assertEquals("2010", firstYear); + lastYear = matcher.group(4); + Assert.assertEquals("2012", lastYear); + holder = matcher.group(5); + Assert.assertEquals("Tony", holder); + } + + @Test + public void testToFileHeader() throws Exception { + String header; + FileHeader model; + + header = "Description" + LINE_SEPARATOR + + DEFAULT_SECTION_DELIMITER + LINE_SEPARATOR + + "Copyright (C) 2010 Tony" + LINE_SEPARATOR + + DEFAULT_SECTION_DELIMITER + LINE_SEPARATOR + + "License"; + model = transformer.toFileHeader(header); + Assert.assertNotNull(model); + assertEquals(model1, model); + + header = "Description2" + LINE_SEPARATOR + + DEFAULT_SECTION_DELIMITER + LINE_SEPARATOR + + "Copyright (C) 2010 - 2012 Tony2" + LINE_SEPARATOR + + DEFAULT_SECTION_DELIMITER + LINE_SEPARATOR + + "License2"; + model = transformer.toFileHeader(header); + Assert.assertNotNull(model); + assertEquals(model2, model); + } + + @Test + public void testToString() throws Exception { + String header; + + header = transformer.toString(model1); + Assert.assertEquals("Description" + LINE_SEPARATOR + + DEFAULT_SECTION_DELIMITER + LINE_SEPARATOR + + "Copyright (C) 2010 Tony" + LINE_SEPARATOR + + DEFAULT_SECTION_DELIMITER + LINE_SEPARATOR + + "License" + LINE_SEPARATOR, + header + ); + + header = transformer.toString(model2); + Assert.assertEquals("Description2" + LINE_SEPARATOR + + DEFAULT_SECTION_DELIMITER + LINE_SEPARATOR + + "Copyright (C) 2010 - 2012 Tony2" + LINE_SEPARATOR + + DEFAULT_SECTION_DELIMITER + LINE_SEPARATOR + + "License2" + LINE_SEPARATOR, + header + ); + } + + @Test + public void testBoxProcessTag() throws Exception { + String header; + String boxedHeader; + + header = transformer.toString(model1); + boxedHeader = transformer.boxProcessTag(header); + Assert.assertEquals(DEFAULT_PROCESS_START_TAG + LINE_SEPARATOR + + "Description" + LINE_SEPARATOR + + DEFAULT_SECTION_DELIMITER + LINE_SEPARATOR + + "Copyright (C) 2010 Tony" + LINE_SEPARATOR + + DEFAULT_SECTION_DELIMITER + LINE_SEPARATOR + + "License" + LINE_SEPARATOR + + DEFAULT_PROCESS_END_TAG + LINE_SEPARATOR, + boxedHeader + ); + + header = transformer.toString(model2); + boxedHeader = transformer.boxProcessTag(header); + Assert.assertEquals(DEFAULT_PROCESS_START_TAG + LINE_SEPARATOR + + "Description2" + LINE_SEPARATOR + + DEFAULT_SECTION_DELIMITER + LINE_SEPARATOR + + "Copyright (C) 2010 - 2012 Tony2" + LINE_SEPARATOR + + DEFAULT_SECTION_DELIMITER + LINE_SEPARATOR + + "License2" + LINE_SEPARATOR + + DEFAULT_PROCESS_END_TAG + LINE_SEPARATOR, + boxedHeader + ); + } + + + @Test + public void testUnboxProcessTag() throws Exception { + String header; + String boxedHeader; + String unboxedHeader; + + header = transformer.toString(model1); + boxedHeader = transformer.boxProcessTag(header); + unboxedHeader = transformer.unboxProcessTag(boxedHeader); + + Assert.assertEquals(header, unboxedHeader); + + header = transformer.toString(model2); + boxedHeader = transformer.boxProcessTag(header); + unboxedHeader = transformer.unboxProcessTag(boxedHeader); + + Assert.assertEquals(header, unboxedHeader); + } + + @Test + public void testBoxComment() throws Exception { + String header; + String boxedHeader; + + header = transformer.toString(model1); + boxedHeader = transformer.boxComment(header); + + Assert.assertEquals( + COMMENT_START_TAG + LINE_SEPARATOR + + COMMENT_LINE_PREFIX + "Description" + LINE_SEPARATOR + + COMMENT_LINE_PREFIX + DEFAULT_SECTION_DELIMITER + LINE_SEPARATOR + + COMMENT_LINE_PREFIX + "Copyright (C) 2010 Tony" + LINE_SEPARATOR + + COMMENT_LINE_PREFIX + DEFAULT_SECTION_DELIMITER + LINE_SEPARATOR + + COMMENT_LINE_PREFIX + "License" + LINE_SEPARATOR + + COMMENT_END_TAG + LINE_SEPARATOR, + boxedHeader + ); + + header = transformer.toString(model2); + boxedHeader = transformer.boxComment(header); + Assert.assertEquals( + COMMENT_START_TAG + LINE_SEPARATOR + + COMMENT_LINE_PREFIX + "Description2" + LINE_SEPARATOR + + COMMENT_LINE_PREFIX + DEFAULT_SECTION_DELIMITER + LINE_SEPARATOR + + COMMENT_LINE_PREFIX + "Copyright (C) 2010 - 2012 Tony2" + LINE_SEPARATOR + + COMMENT_LINE_PREFIX + DEFAULT_SECTION_DELIMITER + LINE_SEPARATOR + + COMMENT_LINE_PREFIX + "License2" + LINE_SEPARATOR + + COMMENT_END_TAG + LINE_SEPARATOR, + boxedHeader + ); + } + + @Test + public void testUnboxComment() throws Exception { + String header; + String boxedHeader; + String unboxedHeader; + + header = transformer.toString(model1); + boxedHeader = transformer.boxComment(header); + unboxedHeader = transformer.unboxComent(boxedHeader); + + Assert.assertEquals(header, unboxedHeader); + + header = transformer.toString(model2); + boxedHeader = transformer.boxComment(header); + unboxedHeader = transformer.unboxComent(boxedHeader); + + Assert.assertEquals(header, unboxedHeader); + } + + public static void assertEquals(FileHeader model, FileHeader model2) { + Assert.assertEquals(model.getDescription(), model2.getDescription()); + Assert.assertEquals(model.getCopyrightFirstYear(), + model2.getCopyrightFirstYear()); + Assert.assertEquals(model.getCopyrightLastYear(), + model2.getCopyrightLastYear()); + Assert.assertEquals(model.getCopyrightHolder(), + model2.getCopyrightHolder()); + Assert.assertEquals(model.getLicense(), model2.getLicense()); + } +} Property changes on: trunk/src/test/java/org/nuiton/license/plugin/header/transformer/AbstractFileHeaderTransformerTest.java ___________________________________________________________________ Added: svn:keywords + "Author Date Id Revision HeadURL
participants (1)
-
tchemit@users.nuiton.org