diff --git a/license-maven-plugin/src/main/java/com/mycila/maven/plugin/license/AbstractLicenseMojo.java b/license-maven-plugin/src/main/java/com/mycila/maven/plugin/license/AbstractLicenseMojo.java index 1c02a94b6..21b67599c 100755 --- a/license-maven-plugin/src/main/java/com/mycila/maven/plugin/license/AbstractLicenseMojo.java +++ b/license-maven-plugin/src/main/java/com/mycila/maven/plugin/license/AbstractLicenseMojo.java @@ -43,6 +43,7 @@ import java.io.File; import java.io.IOException; +import java.net.URL; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -307,7 +308,7 @@ public void checkUnknown() throws MojoExecutionException { @SuppressWarnings({"unchecked"}) public final void execute(final Callback callback) throws MojoExecutionException, MojoFailureException { if (!skip) { - if (header == null) { + if (header == null && (this.inlineHeader == null || this.inlineHeader.isEmpty())) { warn("No header file specified to check for license"); return; } @@ -323,16 +324,18 @@ public final void execute(final Callback callback) throws MojoExecutionException throw new MojoExecutionException(e.getMessage(), e); } finder.setPluginClassPath(getClass().getClassLoader()); - - final Header h = new Header(finder.findResource(this.header), encoding, headerSections, inlineHeader); - debug("Header %s:\n%s", h.isInline() ? "inline" : h.getLocation(), h); - + + final HeaderSource headerSource = HeaderSource.of(this.inlineHeader, this.header, this.encoding, this.finder); + final Header h = new Header(headerSource, headerSections); + debug("Header: %s", h.getLocation()); + if (this.validHeaders == null) { this.validHeaders = new String[0]; } final List
validHeaders = new ArrayList
(this.validHeaders.length); for (String validHeader : this.validHeaders) { - validHeaders.add(new Header(finder.findResource(validHeader), encoding, headerSections, inlineHeader)); + final HeaderSource validHeaderSource = HeaderSource.of(null, validHeader, this.encoding, this.finder); + validHeaders.add(new Header(validHeaderSource, headerSections)); } final List propertiesProviders = new LinkedList(); diff --git a/license-maven-plugin/src/main/java/com/mycila/maven/plugin/license/HeaderSource.java b/license-maven-plugin/src/main/java/com/mycila/maven/plugin/license/HeaderSource.java new file mode 100644 index 000000000..97149ebbf --- /dev/null +++ b/license-maven-plugin/src/main/java/com/mycila/maven/plugin/license/HeaderSource.java @@ -0,0 +1,143 @@ +/** + * Copyright (C) 2008 Mycila (mathieu.carbou@gmail.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.mycila.maven.plugin.license; + +import java.io.IOException; +import java.net.URL; + +import com.mycila.maven.plugin.license.util.FileUtils; +import com.mycila.maven.plugin.license.util.resource.ResourceFinder; + +/** + * Provides an access to the license template text. + * + * @author Peter Palaga + */ +public abstract class HeaderSource { + + /** + * A {@link HeaderSource} built from a lincense header template literal. + */ + public static class InlineHeaderSource extends HeaderSource { + public InlineHeaderSource(String content) { + super(content, true); + } + + /** + * @return always {@code false} because this {@link InlineHeaderSource} was not loaded from an {@link URL} + */ + @Override + public boolean isFromLocation(URL location) { + return false; + } + + @Override + public String toString() { + return "inline: " + content; + } + + } + + /** + * A {@link HeaderSource} loaded from a {@link URL}. + */ + public static class PathHeaderSource extends HeaderSource { + private final URL headerUrl; + + public PathHeaderSource(URL headerUrl, String encoding) throws IOException { + super(FileUtils.read(headerUrl, encoding), false); + this.headerUrl = headerUrl; + } + + @Override + public boolean isFromLocation(URL location) { + return this.headerUrl.equals(location); + } + + @Override + public String toString() { + return headerUrl + ": " + content; + } + + } + + public static HeaderSource of(String headerPath, String encoding, ResourceFinder finder) { + return of(null, encoding, finder); + } + + /** + * Checking the params left to right, returns the first available {@link HeaderSource} that can be created. If + * {@code inlineHeader} is not {@code null} returns a new {@link InlineHeaderSource}. Otherwise attempts to create a + * new {@link PathHeaderSource} out of {@code headerPath} and {@code encoding}. + * + * @param inlineHeader the text of a lincense header template + * @param headerPath a path resolvable by the {@code finder} + * @param encoding the encoding to use when readinf {@code headerPath} + * @param finder the {@link ResourceFinder} to use to resolve {@code headerPath} + * @return a new {@link HeaderSource} + */ + public static HeaderSource of(String inlineHeader, String headerPath, String encoding, ResourceFinder finder) { + if (inlineHeader != null && !inlineHeader.isEmpty()) { + return new InlineHeaderSource(inlineHeader); + } else if (headerPath == null) { + throw new IllegalArgumentException("Either inlineHeader or header path need to be specified"); + } else { + try { + final URL headerUrl = finder.findResource(headerPath); + return new PathHeaderSource(headerUrl, encoding); + } catch (Exception e) { + throw new IllegalArgumentException( + "Cannot read header document " + headerPath + ". Cause: " + e.getMessage(), e); + } + } + } + + protected final String content; + private final boolean inline; + + public HeaderSource(String content, boolean inline) { + super(); + this.content = content; + this.inline = inline; + } + + /** + * @return the text of the license template + */ + public String getContent() { + return content; + } + + /** + * @return {@code true} if this {@link HeaderSource} was created from a string rather by loading the bits from an + * URL; {@code false} otherwise + */ + public boolean isInline() { + return inline; + } + + /** + * Retuns {@code true} if this {@link HeaderSource} was loaded from the URL given in the {@code location} parameter + * or {@code false} otherwise. + * + * @param location + * the URL to tell if this {@link HeaderSource} was loaded from it + * @return {@code true} if this {@link HeaderSource} was loaded from the URL given in the {@code location} parameter + * or {@code false} otherwise + */ + public abstract boolean isFromLocation(URL location); + +} diff --git a/license-maven-plugin/src/main/java/com/mycila/maven/plugin/license/document/Document.java b/license-maven-plugin/src/main/java/com/mycila/maven/plugin/license/document/Document.java index 9da0340e5..2a3ae5368 100755 --- a/license-maven-plugin/src/main/java/com/mycila/maven/plugin/license/document/Document.java +++ b/license-maven-plugin/src/main/java/com/mycila/maven/plugin/license/document/Document.java @@ -123,7 +123,7 @@ public void removeHeader() { public boolean is(Header header) { try { - return !header.isInline() && header.getLocation().sameFile(this.file.toURI().toURL()); + return header.getLocation().isFromLocation(this.file.toURI().toURL()); } catch (Exception e) { throw new IllegalStateException("Error comparing document " + this.file + " with file " + file + ". Cause: " + e.getMessage(), e); } diff --git a/license-maven-plugin/src/main/java/com/mycila/maven/plugin/license/header/Header.java b/license-maven-plugin/src/main/java/com/mycila/maven/plugin/license/header/Header.java index d6356ae4c..586e474ec 100755 --- a/license-maven-plugin/src/main/java/com/mycila/maven/plugin/license/header/Header.java +++ b/license-maven-plugin/src/main/java/com/mycila/maven/plugin/license/header/Header.java @@ -15,19 +15,18 @@ */ package com.mycila.maven.plugin.license.header; -import com.mycila.maven.plugin.license.HeaderSection; -import com.mycila.maven.plugin.license.document.Document; -import com.mycila.maven.plugin.license.util.StringUtils; - import java.io.IOException; -import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.SortedMap; import java.util.TreeMap; -import static com.mycila.maven.plugin.license.util.FileUtils.read; +import com.mycila.maven.plugin.license.HeaderSection; +import com.mycila.maven.plugin.license.HeaderSource; +import com.mycila.maven.plugin.license.document.Document; +import com.mycila.maven.plugin.license.util.StringUtils; + import static com.mycila.maven.plugin.license.util.FileUtils.readFirstLines; import static com.mycila.maven.plugin.license.util.FileUtils.remove; @@ -38,13 +37,12 @@ * @author Mathieu Carbou (mathieu.carbou@gmail.com) */ public final class Header { - private final URL location; + private final HeaderSource location; private final String headerContent; private final String headerContentOneLine; private String[] lines; private final HeaderSection[] sections; private final int maxLength; - private final boolean inline; /** * Constructs a Header object pointing to a license template file. In case of the template contains @@ -55,15 +53,11 @@ public final class Header { * @throws IllegalArgumentException If the header file location is null or if an error occurred while reading the * file content. */ - public Header(URL location, String encoding, HeaderSection[] sections, String headerText) { - if (location == null && headerText == null) { - throw new IllegalArgumentException("Cannot read license template header file with a null location"); - } + public Header(HeaderSource location, HeaderSection[] sections) { this.location = location; - this.inline = location == null; this.sections = sections; try { - this.headerContent = location == null ? headerText : read(location, encoding); + this.headerContent = location.getContent(); lines = headerContent.replace("\r", "").split("\n"); headerContentOneLine = remove(headerContent, " ", "\t", "\r", "\n"); } catch (Exception e) { @@ -101,15 +95,11 @@ public int getMaxLineLength() { * * @return The URL location. */ - public URL getLocation() { + public HeaderSource getLocation() { return location; } - public boolean isInline() { - return inline; - } - - public String eol(boolean unix) { + public String eol(boolean unix) { return unix ? "\n" : "\r\n"; } diff --git a/license-maven-plugin/src/test/java/com/mycila/maven/plugin/license/document/DocumentTest.java b/license-maven-plugin/src/test/java/com/mycila/maven/plugin/license/document/DocumentTest.java index 9796e187b..c580835ba 100755 --- a/license-maven-plugin/src/test/java/com/mycila/maven/plugin/license/document/DocumentTest.java +++ b/license-maven-plugin/src/test/java/com/mycila/maven/plugin/license/document/DocumentTest.java @@ -15,12 +15,14 @@ */ package com.mycila.maven.plugin.license.document; +import com.mycila.maven.plugin.license.HeaderSource.PathHeaderSource; import com.mycila.maven.plugin.license.header.Header; import com.mycila.maven.plugin.license.util.FileUtils; import org.junit.BeforeClass; import org.junit.Test; import java.io.File; +import java.io.IOException; import java.net.MalformedURLException; import java.util.Properties; @@ -42,9 +44,9 @@ public Properties load(Document d) { }; @BeforeClass - public static void setup() throws MalformedURLException { + public static void setup() throws IOException { - header = new Header(new File("src/test/resources/test-header1.txt").toURI().toURL(), "UTF-8", null, null); + header = new Header(new PathHeaderSource(new File("src/test/resources/test-header1.txt").toURI().toURL(), "UTF-8"), null); } @Test diff --git a/license-maven-plugin/src/test/java/com/mycila/maven/plugin/license/header/AdditionalHeaderDefinitionTest.java b/license-maven-plugin/src/test/java/com/mycila/maven/plugin/license/header/AdditionalHeaderDefinitionTest.java index 0cc57e80b..06ab27f12 100755 --- a/license-maven-plugin/src/test/java/com/mycila/maven/plugin/license/header/AdditionalHeaderDefinitionTest.java +++ b/license-maven-plugin/src/test/java/com/mycila/maven/plugin/license/header/AdditionalHeaderDefinitionTest.java @@ -15,6 +15,8 @@ */ package com.mycila.maven.plugin.license.header; +import com.mycila.maven.plugin.license.HeaderSource; +import com.mycila.maven.plugin.license.HeaderSource.PathHeaderSource; import com.mycila.maven.plugin.license.util.FileUtils; import com.mycila.xmltool.XMLDoc; import com.mycila.xmltool.XMLTag; @@ -49,7 +51,7 @@ public void test_load_definitions() throws Exception { assertEquals(loader.getDefinitions().get("xquery").getType(), "xquery"); assertNull(loader.getDefinitions().get("xquery").getSkipLinePattern()); - Header header = new Header(getClass().getResource("/test-header1.txt"), "UTF-8", null, null); + Header header = new Header(new PathHeaderSource(getClass().getResource("/test-header1.txt"), "UTF-8"), null); //FileUtils.write(new File("src/test/resources/test-header3.txt"), header.buildForDefinition(loader.getDefinitions().get("xquery"))); @@ -74,7 +76,7 @@ public void test_load_definitions2() throws Exception { AdditionalHeaderDefinition loader = new AdditionalHeaderDefinition(def); - Header header = new Header(getClass().getResource("/check/header.txt"), "UTF-8", null, null); + Header header = new Header(new PathHeaderSource(getClass().getResource("/check/header.txt"), "UTF-8"), null); System.out.println(header.buildForDefinition(loader.getDefinitions().get("text"), false)); } @@ -93,7 +95,7 @@ public void test_advanced_definitions() throws Exception { AdditionalHeaderDefinition loader = new AdditionalHeaderDefinition(def); - Header header = new Header(getClass().getResource("/test-header1.txt"), "UTF-8", null, null); + Header header = new Header(new PathHeaderSource(getClass().getResource("/test-header1.txt"), "UTF-8"), null); //FileUtils.write(new File("src/test/resources/test-header4.txt"), header.buildForDefinition(loader.getDefinitions().get("csregion"), false), System.getProperty("file.encoding")); diff --git a/license-maven-plugin/src/test/java/com/mycila/maven/plugin/license/header/DefaultHeaderDefinitionTest.java b/license-maven-plugin/src/test/java/com/mycila/maven/plugin/license/header/DefaultHeaderDefinitionTest.java index 24e3252c2..272e544cf 100755 --- a/license-maven-plugin/src/test/java/com/mycila/maven/plugin/license/header/DefaultHeaderDefinitionTest.java +++ b/license-maven-plugin/src/test/java/com/mycila/maven/plugin/license/header/DefaultHeaderDefinitionTest.java @@ -15,6 +15,7 @@ */ package com.mycila.maven.plugin.license.header; +import com.mycila.maven.plugin.license.HeaderSource.PathHeaderSource; import com.mycila.maven.plugin.license.util.FileUtils; import org.junit.Test; @@ -29,7 +30,7 @@ public final class DefaultHeaderDefinitionTest { @Test public void test_styles() throws Exception { - Header header = new Header(getClass().getResource("/test-header1.txt"), "UTF-8", null, null); + Header header = new Header(new PathHeaderSource(getClass().getResource("/test-header1.txt"), "UTF-8"), null); for (HeaderDefinition definition : HeaderType.defaultDefinitions().values()) { final String content = FileUtils.read(new File(format("src/test/resources/styles/%s.txt", definition.getType())), System.getProperty("file.encoding")); assertEquals("Bad header for type: " + definition.getType(), content, header.buildForDefinition(definition, !containsWindowsLineEnding(content))); diff --git a/license-maven-plugin/src/test/java/com/mycila/maven/plugin/license/header/HeaderTest.java b/license-maven-plugin/src/test/java/com/mycila/maven/plugin/license/header/HeaderTest.java index d2a80d151..c5e32007c 100755 --- a/license-maven-plugin/src/test/java/com/mycila/maven/plugin/license/header/HeaderTest.java +++ b/license-maven-plugin/src/test/java/com/mycila/maven/plugin/license/header/HeaderTest.java @@ -16,10 +16,12 @@ package com.mycila.maven.plugin.license.header; import com.mycila.maven.plugin.license.HeaderSection; +import com.mycila.maven.plugin.license.HeaderSource.PathHeaderSource; import com.mycila.maven.plugin.license.util.FileUtils; import org.junit.Test; import java.io.File; +import java.io.IOException; import static org.junit.Assert.*; @@ -29,10 +31,10 @@ public final class HeaderTest { @Test public void test() throws Exception { - Header header = new Header(getClass().getResource("/test-header1.txt"), "UTF-8", null, null); + Header header = new Header(new PathHeaderSource(getClass().getResource("/test-header1.txt"), "UTF-8"), null); assertEquals(header.getLineCount(), 13); assertTrue(header.asOneLineString().contains("${year}")); - assertEquals(header.getLocation(), getClass().getResource("/test-header1.txt")); + assertTrue(header.getLocation().isFromLocation(getClass().getResource("/test-header1.txt"))); //FileUtils.write(new File("src/test/resources/test-header2.txt"), header.buildForDefinition(HeaderType.ASP.getDefinition(), false)); @@ -42,7 +44,7 @@ public void test() throws Exception { } @Test - public void testHeaderSections() { + public void testHeaderSections() throws IOException { HeaderSection section = new HeaderSection(); section.setKey("COPYRIGHT_SECTION"); @@ -51,8 +53,8 @@ public void testHeaderSections() { HeaderSection[] sections = { section }; - Header header = new Header(getClass().getResource("/test-header5.txt"), "UTF-8", sections, null); - + Header header = new Header(new PathHeaderSource(getClass().getResource("/test-header5.txt"), "UTF-8"), sections); + HeaderDefinition headerDefinition = HeaderType.JAVADOC_STYLE.getDefinition(); StringBuilder h1 = new StringBuilder(); @@ -100,7 +102,7 @@ public void testHeaderSections() { } @Test - public void testHeaderSectionsWithAmbiguousSeparation() { + public void testHeaderSectionsWithAmbiguousSeparation() throws IOException { HeaderSection sectionA = new HeaderSection(); sectionA.setKey("COPYRIGHT_SECTION"); @@ -113,8 +115,8 @@ public void testHeaderSectionsWithAmbiguousSeparation() { HeaderSection[] sections = { sectionA, sectionB }; - Header header = new Header(getClass().getResource("/test-header6.txt"), "UTF-8", sections, null); - + Header header = new Header(new PathHeaderSource(getClass().getResource("/test-header6.txt"), "UTF-8"), sections); + HeaderDefinition headerDefinition = HeaderType.JAVADOC_STYLE.getDefinition(); /** @@ -158,7 +160,7 @@ public void testHeaderSectionsWithAmbiguousSeparation() { } @Test - public void testHeaderSectionsWithMultiLineMatch() { + public void testHeaderSectionsWithMultiLineMatch() throws IOException { HeaderSection section = new HeaderSection(); section.setKey("COPYRIGHT_SECTION"); @@ -168,8 +170,8 @@ public void testHeaderSectionsWithMultiLineMatch() { HeaderSection[] sections = { section }; - Header header = new Header(getClass().getResource("/test-header5.txt"), "UTF-8", sections, null); - + Header header = new Header(new PathHeaderSource(getClass().getResource("/test-header5.txt"), "UTF-8"), sections); + HeaderDefinition headerDefinition = HeaderType.JAVADOC_STYLE.getDefinition(); StringBuilder h1 = new StringBuilder();