You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@creadur.apache.org by jo...@apache.org on 2010/07/13 18:10:24 UTC

svn commit: r963778 - in /incubator/rat/main/trunk: apache-rat-core/src/main/java/org/apache/rat/ apache-rat-core/src/main/java/org/apache/rat/analysis/generation/ apache-rat-core/src/main/java/org/apache/rat/api/ apache-rat-core/src/main/java/org/apac...

Author: jochen
Date: Tue Jul 13 16:10:23 2010
New Revision: 963778

URL: http://svn.apache.org/viewvc?rev=963778&view=rev
Log:
PR: RAT-76
- Added support for adding license headers to the Maven plugin and the Ant tasks.
- Refactoring and code simplification.

Added:
    incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/ReportConfiguration.java   (with props)
    incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/report/AbstractReport.java   (with props)
    incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/report/claim/util/LicenseAddingReport.java   (with props)
    incubator/rat/main/trunk/apache-rat-plugin/src/test/it3/src.apt
    incubator/rat/main/trunk/apache-rat-tasks/src/test/resources/antunit/index.apt
Removed:
    incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/api/Reporter.java
    incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/report/xml/XmlReport.java
Modified:
    incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/Report.java
    incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/analysis/generation/GeneratedLicenseNotRequired.java
    incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/api/MetaData.java
    incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/report/claim/impl/AbstractClaimReporter.java
    incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/report/claim/impl/ClaimAggregator.java
    incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/report/claim/impl/xml/SimpleXmlClaimReporter.java
    incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/report/claim/util/ClaimReporterMultiplexer.java
    incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/report/xml/XmlReportFactory.java
    incubator/rat/main/trunk/apache-rat-core/src/test/java/org/apache/rat/ReportTest.java
    incubator/rat/main/trunk/apache-rat-core/src/test/java/org/apache/rat/report/claim/impl/xml/MockClaimReporter.java
    incubator/rat/main/trunk/apache-rat-core/src/test/java/org/apache/rat/report/xml/XmlReportFactoryTest.java
    incubator/rat/main/trunk/apache-rat-core/src/test/java/org/apache/rat/report/xml/XmlReportTest.java
    incubator/rat/main/trunk/apache-rat-plugin/src/main/java/org/apache/rat/mp/AbstractRatMojo.java
    incubator/rat/main/trunk/apache-rat-plugin/src/main/java/org/apache/rat/mp/RatCheckMojo.java
    incubator/rat/main/trunk/apache-rat-plugin/src/test/it3/pom.xml
    incubator/rat/main/trunk/apache-rat-plugin/src/test/java/org/apache/rat/mp/RatCheckMojoTest.java
    incubator/rat/main/trunk/apache-rat-tasks/src/main/java/org/apache/rat/anttasks/Report.java
    incubator/rat/main/trunk/apache-rat-tasks/src/test/java/org/apache/rat/anttasks/ReportTest.java
    incubator/rat/main/trunk/apache-rat-tasks/src/test/resources/antunit/report-junit.xml

Modified: incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/Report.java
URL: http://svn.apache.org/viewvc/incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/Report.java?rev=963778&r1=963777&r2=963778&view=diff
==============================================================================
--- incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/Report.java (original)
+++ incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/Report.java Tue Jul 13 16:10:23 2010
@@ -18,24 +18,18 @@
  */ 
 package org.apache.rat;
 
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.FilenameFilter;
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.OutputStream;
 import java.io.OutputStreamWriter;
 import java.io.PipedReader;
 import java.io.PipedWriter;
 import java.io.PrintStream;
-import java.io.UnsupportedEncodingException;
 import java.io.Writer;
 
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.transform.TransformerConfigurationException;
 
 import org.apache.commons.cli.CommandLine;
@@ -48,32 +42,24 @@ import org.apache.commons.cli.ParseExcep
 import org.apache.commons.cli.PosixParser;
 import org.apache.commons.io.filefilter.NotFileFilter;
 import org.apache.commons.io.filefilter.WildcardFileFilter;
-import org.apache.rat.analysis.IHeaderMatcher;
-import org.apache.rat.annotation.AbstractLicenceAppender;
-import org.apache.rat.annotation.ApacheV2LicenceAppender;
 import org.apache.rat.api.RatException;
-import org.apache.rat.license.ILicenseFamily;
 import org.apache.rat.report.IReportable;
 import org.apache.rat.report.RatReport;
 import org.apache.rat.report.claim.ClaimStatistic;
 import org.apache.rat.report.xml.XmlReportFactory;
 import org.apache.rat.report.xml.writer.IXmlWriter;
 import org.apache.rat.report.xml.writer.impl.base.XmlWriter;
-import org.apache.rat.walker.DirectoryWalker;
 import org.apache.rat.walker.ArchiveWalker;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.SAXException;
+import org.apache.rat.walker.DirectoryWalker;
 
 
 public class Report {
-
     private static final char EXCLUDE_CLI = 'e';
     private static final char STYLESHEET_CLI = 's';
 
     //@SuppressWarnings("unchecked")
     public static final void main(String args[]) throws Exception {
+        final ReportConfiguration configuration = new ReportConfiguration();
         Options opts = buildOptions();
 
         PosixParser parser = new PosixParser();
@@ -96,7 +82,9 @@ public class Report {
             Report report = new Report(args[0]);
 
             if (cl.hasOption('a')) {
-                configureForAddLicense(cl, report);
+                configuration.setAddingLicenses(true);
+                configuration.setAddingLicensesForced(cl.hasOption('f'));
+                configuration.setCopyrightMessage(cl.getOptionValue("c"));
             }
 
             if (cl.hasOption(EXCLUDE_CLI)) {
@@ -119,10 +107,11 @@ public class Report {
                         System.exit(1);
                     }
                     try {
-                        report.report(System.out,
-                                      report.getDirectory(System.out),
-                                      new FileInputStream(style[0]),
-                                      Defaults.createDefaultMatcher(), null);
+                        configuration.setHeaderMatcher(Defaults.createDefaultMatcher());
+                        report(System.out,
+                                report.getDirectory(System.out),
+                                new FileInputStream(style[0]),
+                                configuration);
                     } catch (FileNotFoundException fnfe) {
                         System.err.println("stylesheet " + style[0]
                                            + " doesn't exist");
@@ -198,45 +187,6 @@ public class Report {
         return opts;
     }
 
-    private static void configureForAddLicense(CommandLine cl, Report report) throws Exception, UnsupportedEncodingException, SAXException, IOException, ParserConfigurationException {
-        OutputStream reportOutput = new ByteArrayOutputStream();
-        PrintStream stream = new PrintStream(reportOutput, true);
-        report.report(stream);
-
-        AbstractLicenceAppender  appender;
-        String copyrightMsg = cl.getOptionValue("c");
-        if ( copyrightMsg != null) {
-            appender = new ApacheV2LicenceAppender(copyrightMsg);
-        } else {
-            appender = new ApacheV2LicenceAppender();
-        }
-        if (cl.hasOption("f")) {
-            appender.setForce(true);
-        }
-
-        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-        factory.setValidating(false);
-        ByteArrayInputStream xmlStream = new ByteArrayInputStream(reportOutput.toString().getBytes("UTF-8"));
-        Document doc = factory.newDocumentBuilder().parse(xmlStream);
-
-        NodeList resourceHeaders = doc.getElementsByTagName("header-type");
-        String value = null;
-        for (int i = 0; i < resourceHeaders.getLength(); i++) {
-            Node headerType = resourceHeaders.item(i).getAttributes().getNamedItem("name");
-            if(headerType != null) {
-                value = headerType.getNodeValue();
-            } else {
-                value = null;
-            }
-            if (value != null &&value.equals("?????")) {
-                Node resource = resourceHeaders.item(i).getParentNode();
-                String filename = resource.getAttributes().getNamedItem("name").getNodeValue();
-                File document = new File(filename);
-                appender.append(document);
-            }
-        }
-    }
-
     private static final void printUsage(Options opts) {
         HelpFormatter f = new HelpFormatter();
         String header = "Options";
@@ -283,7 +233,9 @@ public class Report {
     public ClaimStatistic report(PrintStream out) throws Exception {
         final IReportable base = getDirectory(out);
         if (base != null) {
-            return report(base, new OutputStreamWriter(out), Defaults.createDefaultMatcher(), null);
+            final ReportConfiguration configuration = new ReportConfiguration();
+            configuration.setHeaderMatcher(Defaults.createDefaultMatcher());
+            return report(base, new OutputStreamWriter(out), configuration);
         }
         return null;
     }
@@ -322,7 +274,9 @@ public class Report {
         final IReportable base = getDirectory(out);
         if (base != null) {
             InputStream style = Defaults.getDefaultStyleSheet();
-            report(out, base, style, Defaults.createDefaultMatcher(), null);
+            final ReportConfiguration configuration = new ReportConfiguration();
+            configuration.setHeaderMatcher(Defaults.createDefaultMatcher());
+            report(out, base, style, configuration);
         }
     }
 
@@ -339,11 +293,10 @@ public class Report {
      * @throws InterruptedException
      * @throws RatException
      */
-    public static void report(PrintStream out, IReportable base, final InputStream style, final IHeaderMatcher matcher,
-            final ILicenseFamily[] approvedLicenseNames) 
-    throws IOException, TransformerConfigurationException, 
-    InterruptedException, RatException {
-        report(new OutputStreamWriter(out), base, style, matcher, approvedLicenseNames);
+    public static void report(PrintStream out, IReportable base, final InputStream style,
+                              ReportConfiguration pConfiguration) 
+            throws IOException, TransformerConfigurationException,  InterruptedException, RatException {
+        report(new OutputStreamWriter(out), base, style, pConfiguration);
     }
 
     /**
@@ -362,14 +315,14 @@ public class Report {
      * @throws RatException
      */
     public static ClaimStatistic report(Writer out, IReportable base, final InputStream style, 
-            final IHeaderMatcher matcher, final ILicenseFamily[] approvedLicenseNames) 
+            ReportConfiguration pConfiguration) 
     throws IOException, TransformerConfigurationException, FileNotFoundException, InterruptedException, RatException {
         PipedReader reader = new PipedReader();
         PipedWriter writer = new PipedWriter(reader);
         ReportTransformer transformer = new ReportTransformer(out, style, reader);
         Thread transformerThread = new Thread(transformer);
         transformerThread.start();
-        final ClaimStatistic statistic = report(base, writer, matcher, approvedLicenseNames);
+        final ClaimStatistic statistic = report(base, writer, pConfiguration);
         writer.flush();
         writer.close();
         transformerThread.join();
@@ -385,11 +338,11 @@ public class Report {
      * @throws IOException
      * @throws RatException
      */
-    public static ClaimStatistic report(final IReportable container, final Writer out, final IHeaderMatcher matcher,
-            final ILicenseFamily[] approvedLicenseNames) throws IOException, RatException {
+    public static ClaimStatistic report(final IReportable container, final Writer out,
+            ReportConfiguration pConfiguration) throws IOException, RatException {
         IXmlWriter writer = new XmlWriter(out);
         final ClaimStatistic statistic = new ClaimStatistic();
-        RatReport report = XmlReportFactory.createStandardReport(writer, matcher, approvedLicenseNames, statistic);
+        RatReport report = XmlReportFactory.createStandardReport(writer, statistic, pConfiguration);
         report.startReport();
         container.run(report);
         report.endReport();

Added: incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/ReportConfiguration.java
URL: http://svn.apache.org/viewvc/incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/ReportConfiguration.java?rev=963778&view=auto
==============================================================================
--- incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/ReportConfiguration.java (added)
+++ incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/ReportConfiguration.java Tue Jul 13 16:10:23 2010
@@ -0,0 +1,106 @@
+package org.apache.rat;
+
+import org.apache.rat.analysis.IHeaderMatcher;
+import org.apache.rat.license.ILicenseFamily;
+
+
+/**
+ * A configuration object is used by the frontend to invoke the
+ * {@link Report}. Basically, the sole purpose of the frontends is
+ * to create the configuration and invoke the {@link Report}.
+ */
+public class ReportConfiguration {
+    private IHeaderMatcher headerMatcher;
+    private ILicenseFamily[] approvedLicenseNames;
+    private boolean addingLicenses;
+    private boolean addingLicensesForced;
+    private String copyrightMessage;
+
+    /**
+     * Returns the header matcher.
+     */
+    public IHeaderMatcher getHeaderMatcher() {
+        return headerMatcher;
+    }
+
+    /**
+     * Sets the header matcher.
+     */
+    public void setHeaderMatcher(IHeaderMatcher headerMatcher) {
+        this.headerMatcher = headerMatcher;
+    }
+
+    /**
+     * Returns the set of approved license names.
+     */
+    public ILicenseFamily[] getApprovedLicenseNames() {
+        return approvedLicenseNames;
+    }
+
+    /**
+     * Sets the set of approved license names.
+     */
+    public void setApprovedLicenseNames(ILicenseFamily[] approvedLicenseNames) {
+        this.approvedLicenseNames = approvedLicenseNames;
+    }
+
+    /**
+     * If RAT is adding license headers: Returns the optional
+     * copyright message. This value is ignored, if no
+     * license headers are added.
+     * @see #isAddingLicenses()
+     */
+    public String getCopyrightMessage() {
+        return copyrightMessage;
+    }
+
+    /**
+     * If RAT is adding license headers: Sets the optional
+     * copyright message. This value is ignored, if no
+     * license headers are added.
+     * @see #setAddingLicenses(boolean)
+     */
+    public void setCopyrightMessage(String copyrightMessage) {
+        this.copyrightMessage = copyrightMessage;
+    }
+
+    /**
+     * If RAT is adding license headers: Returns, whether adding
+     * license headers is enforced. This value is ignored, if no
+     * license headers are added.
+     * @see #isAddingLicenses()
+     */
+    public boolean isAddingLicensesForced() {
+        return addingLicensesForced;
+    }
+
+    /**
+     * If RAT is adding license headers: Sets, whether adding
+     * license headers is enforced. This value is ignored, if no
+     * license headers are added.
+     * @see #isAddingLicenses()
+     */
+    public void setAddingLicensesForced(boolean addingLicensesForced) {
+        this.addingLicensesForced = addingLicensesForced;
+    }
+
+    /**
+     * Returns, whether RAT should add missing license headers.
+     * @see #isAddingLicensesForced()
+     * @see #getCopyrightMessage()
+     */
+    public boolean isAddingLicenses() {
+        return addingLicenses;
+    }
+
+    /**
+     * Returns, whether RAT should add missing license headers.
+     * @see #setAddingLicensesForced(boolean)
+     * @see #setCopyrightMessage(String)
+     */
+    public void setAddingLicenses(boolean addingLicenses) {
+        this.addingLicenses = addingLicenses;
+    }
+
+    
+}

Propchange: incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/ReportConfiguration.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/analysis/generation/GeneratedLicenseNotRequired.java
URL: http://svn.apache.org/viewvc/incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/analysis/generation/GeneratedLicenseNotRequired.java?rev=963778&r1=963777&r2=963778&view=diff
==============================================================================
--- incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/analysis/generation/GeneratedLicenseNotRequired.java (original)
+++ incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/analysis/generation/GeneratedLicenseNotRequired.java Tue Jul 13 16:10:23 2010
@@ -23,7 +23,6 @@ import java.util.regex.Pattern;
 import org.apache.rat.analysis.IHeaderMatcher;
 import org.apache.rat.analysis.RatHeaderAnalysisException;
 import org.apache.rat.api.Document;
-import org.apache.rat.api.Reporter;
 import org.apache.rat.api.MetaData;
 
 public class GeneratedLicenseNotRequired implements IHeaderMatcher {

Modified: incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/api/MetaData.java
URL: http://svn.apache.org/viewvc/incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/api/MetaData.java?rev=963778&r1=963777&r2=963778&view=diff
==============================================================================
--- incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/api/MetaData.java (original)
+++ incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/api/MetaData.java Tue Jul 13 16:10:23 2010
@@ -277,3 +277,4 @@ public class MetaData {
         }
     }
 }
+ 
\ No newline at end of file

Added: incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/report/AbstractReport.java
URL: http://svn.apache.org/viewvc/incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/report/AbstractReport.java?rev=963778&view=auto
==============================================================================
--- incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/report/AbstractReport.java (added)
+++ incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/report/AbstractReport.java Tue Jul 13 16:10:23 2010
@@ -0,0 +1,22 @@
+package org.apache.rat.report;
+
+import org.apache.rat.api.Document;
+import org.apache.rat.api.RatException;
+
+
+/**
+ * Abstract base class for deriving implementations of {@link RatReport}.
+ */
+public abstract class AbstractReport implements RatReport {
+    public void startReport() throws RatException {
+        // Does nothing
+    }
+
+    public void report(Document document) throws RatException {
+        // Does nothing
+    }
+
+    public void endReport() throws RatException {
+        // Does nothing
+    }
+}

Propchange: incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/report/AbstractReport.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/report/claim/impl/AbstractClaimReporter.java
URL: http://svn.apache.org/viewvc/incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/report/claim/impl/AbstractClaimReporter.java?rev=963778&r1=963777&r2=963778&view=diff
==============================================================================
--- incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/report/claim/impl/AbstractClaimReporter.java (original)
+++ incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/report/claim/impl/AbstractClaimReporter.java Tue Jul 13 16:10:23 2010
@@ -20,9 +20,9 @@
 package org.apache.rat.report.claim.impl;
 
 import org.apache.rat.api.Document;
-import org.apache.rat.api.RatException;
-import org.apache.rat.api.Reporter;
 import org.apache.rat.api.MetaData;
+import org.apache.rat.api.RatException;
+import org.apache.rat.report.AbstractReport;
 
 
 /**
@@ -30,8 +30,7 @@ import org.apache.rat.api.MetaData;
  * It is strongly suggested, that implementations derive from
  * this class.
  */
-public abstract class AbstractClaimReporter implements Reporter {
-    
+public abstract class AbstractClaimReporter extends AbstractReport {
     protected void handleDocumentCategoryClaim(String documentCategoryName) {
         // Does nothing
     }

Modified: incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/report/claim/impl/ClaimAggregator.java
URL: http://svn.apache.org/viewvc/incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/report/claim/impl/ClaimAggregator.java?rev=963778&r1=963777&r2=963778&view=diff
==============================================================================
--- incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/report/claim/impl/ClaimAggregator.java (original)
+++ incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/report/claim/impl/ClaimAggregator.java Tue Jul 13 16:10:23 2010
@@ -24,7 +24,6 @@ import java.util.Map;
 
 import org.apache.rat.api.Document;
 import org.apache.rat.api.RatException;
-import org.apache.rat.api.Reporter;
 import org.apache.rat.api.MetaData;
 import org.apache.rat.report.claim.ClaimStatistic;
 
@@ -34,16 +33,16 @@ import org.apache.rat.report.claim.Claim
  * of claims.
  */
 public class ClaimAggregator extends AbstractClaimReporter {
-    private final Reporter reporter;
+    private final ClaimStatistic statistic;
     private final Map numsByLicenseFamilyName = new HashMap();
     private final Map numsByLicenseFamilyCode = new HashMap();
     private final Map numsByFileType = new HashMap();
     private int numApproved, numUnApproved, numGenerated, numUnknown;
 
-    public ClaimAggregator(Reporter pReporter) {
-        reporter = pReporter;
+    public ClaimAggregator(ClaimStatistic pStatistic) {
+        statistic = pStatistic;
     }
-
+    
     private void incMapValue(Map pMap, Object pKey) {
         final Integer num = (Integer) pMap.get(pKey);
         final int newNum;
@@ -92,11 +91,8 @@ public class ClaimAggregator extends Abs
         pStatistic.setNumUnknown(numUnknown);
     }
 
-
-    public void report(Document document) throws RatException {
-        super.report(document);
-        if (reporter != null) {
-            reporter.report(document);
-        }
+    public void endReport() throws RatException {
+        super.endReport();
+        fillClaimStatistic(statistic);
     }
 }

Modified: incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/report/claim/impl/xml/SimpleXmlClaimReporter.java
URL: http://svn.apache.org/viewvc/incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/report/claim/impl/xml/SimpleXmlClaimReporter.java?rev=963778&r1=963777&r2=963778&view=diff
==============================================================================
--- incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/report/claim/impl/xml/SimpleXmlClaimReporter.java (original)
+++ incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/report/claim/impl/xml/SimpleXmlClaimReporter.java Tue Jul 13 16:10:23 2010
@@ -21,12 +21,12 @@ package org.apache.rat.report.claim.impl
 import java.io.IOException;
 
 import org.apache.rat.api.Document;
-import org.apache.rat.api.RatException;
-import org.apache.rat.api.Reporter;
 import org.apache.rat.api.MetaData;
+import org.apache.rat.api.RatException;
+import org.apache.rat.report.AbstractReport;
 import org.apache.rat.report.xml.writer.IXmlWriter;
 
-public class SimpleXmlClaimReporter implements Reporter {
+public class SimpleXmlClaimReporter extends AbstractReport {
     public static final String LICENSE_APPROVAL_PREDICATE = "license-approval";
     public static final String LICENSE_FAMILY_PREDICATE = "license-family";
     public static final String HEADER_SAMPLE_PREDICATE = "header-sample";
@@ -129,4 +129,20 @@ public class SimpleXmlClaimReporter impl
             writeClaim(FILE_TYPE_PREDICATE, documentCategory, false);
         }
     }
+
+    public void startReport() throws RatException {
+        try {
+            writer.openElement("rat-report");
+        } catch (IOException e) {
+            throw new RatException("Cannot open start element", e);
+        }
+    }
+
+    public void endReport() throws RatException {
+        try {
+            writer.closeDocument();
+        } catch (IOException e) {
+            throw new RatException("Cannot close last element", e);
+        }
+    }
 }

Modified: incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/report/claim/util/ClaimReporterMultiplexer.java
URL: http://svn.apache.org/viewvc/incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/report/claim/util/ClaimReporterMultiplexer.java?rev=963778&r1=963777&r2=963778&view=diff
==============================================================================
--- incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/report/claim/util/ClaimReporterMultiplexer.java (original)
+++ incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/report/claim/util/ClaimReporterMultiplexer.java Tue Jul 13 16:10:23 2010
@@ -18,23 +18,52 @@
  */ 
 package org.apache.rat.report.claim.util;
 
+import java.util.List;
+
 import org.apache.rat.api.Document;
 import org.apache.rat.api.RatException;
-import org.apache.rat.api.Reporter;
+import org.apache.rat.document.IDocumentAnalyser;
+import org.apache.rat.document.RatDocumentAnalysisException;
+import org.apache.rat.report.RatReport;
+
 
-public class ClaimReporterMultiplexer implements Reporter {
+public class ClaimReporterMultiplexer implements RatReport {
+    private final IDocumentAnalyser analyser;
+    private final List reporters;
 
-    private final Reporter[] reporters;
-        
-    public ClaimReporterMultiplexer(final Reporter[] reporters) {
-        super();
+    public ClaimReporterMultiplexer(final IDocumentAnalyser pAnalyser, final List reporters) {
+        analyser = pAnalyser;
         this.reporters = reporters;
     }
 
     public void report(Document document) throws RatException {
-        final int length = reporters.length;
-        for (int i=0;i<length;i++) {
-            reporters[i].report(document);
+        if (analyser != null) {
+            try {
+                analyser.analyse(document);
+            } catch (RatDocumentAnalysisException e) {
+                throw new RatException(e.getMessage(), e);
+            }
+        }
+        final int length = reporters.size();
+        for (int i=0;  i<length;  i++) {
+            final RatReport report = (RatReport) reporters.get(i);
+            report.report(document);
+        } 
+    }
+
+    public void startReport() throws RatException {
+        final int length = reporters.size();
+        for (int i=0;  i<length;  i++) {
+            final RatReport report = (RatReport) reporters.get(i);
+            report.startReport();
+        } 
+    }
+
+    public void endReport() throws RatException {
+        final int length = reporters.size();
+        for (int i=0;  i<length;  i++) {
+            final RatReport report = (RatReport) reporters.get(i);
+            report.endReport();
         } 
     }
 }

Added: incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/report/claim/util/LicenseAddingReport.java
URL: http://svn.apache.org/viewvc/incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/report/claim/util/LicenseAddingReport.java?rev=963778&view=auto
==============================================================================
--- incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/report/claim/util/LicenseAddingReport.java (added)
+++ incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/report/claim/util/LicenseAddingReport.java Tue Jul 13 16:10:23 2010
@@ -0,0 +1,38 @@
+package org.apache.rat.report.claim.util;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.rat.annotation.AbstractLicenceAppender;
+import org.apache.rat.annotation.ApacheV2LicenceAppender;
+import org.apache.rat.api.MetaData;
+import org.apache.rat.api.MetaData.Datum;
+import org.apache.rat.api.RatException;
+import org.apache.rat.report.AbstractReport;
+
+
+public class LicenseAddingReport extends AbstractReport {
+    private final AbstractLicenceAppender appender;
+
+    public LicenseAddingReport(String pCopyrightMsg, boolean pForced) {
+        appender = pCopyrightMsg == null ? new ApacheV2LicenceAppender() : new ApacheV2LicenceAppender(pCopyrightMsg);
+        appender.setForce(pForced);
+    }
+
+    public void report(org.apache.rat.api.Document document) throws RatException {
+        final MetaData metaData = document.getMetaData();
+        final Datum licenseHeader = metaData.get(MetaData.RAT_URL_HEADER_CATEGORY);
+        if (licenseHeader == null
+                ||  MetaData.RAT_LICENSE_FAMILY_CATEGORY_DATUM_UNKNOWN.getValue().equals(licenseHeader.getValue())) {
+            final File file = new File(document.getName());
+            if (file.isFile()) {
+                try {
+                    appender.append(file);
+                } catch (IOException e) {
+                    throw new RatException(e.getMessage(), e);
+                }
+            }
+        }
+        metaData.getData();
+    }
+}

Propchange: incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/report/claim/util/LicenseAddingReport.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/report/xml/XmlReportFactory.java
URL: http://svn.apache.org/viewvc/incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/report/xml/XmlReportFactory.java?rev=963778&r1=963777&r2=963778&view=diff
==============================================================================
--- incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/report/xml/XmlReportFactory.java (original)
+++ incubator/rat/main/trunk/apache-rat-core/src/main/java/org/apache/rat/report/xml/XmlReportFactory.java Tue Jul 13 16:10:23 2010
@@ -18,19 +18,20 @@
  */ 
 package org.apache.rat.report.xml;
 
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.rat.ReportConfiguration;
 import org.apache.rat.analysis.DefaultAnalyserFactory;
-import org.apache.rat.analysis.IHeaderMatcher;
-import org.apache.rat.api.Document;
-import org.apache.rat.api.RatException;
-import org.apache.rat.api.Reporter;
 import org.apache.rat.document.IDocumentAnalyser;
 import org.apache.rat.document.impl.util.DocumentAnalyserMultiplexer;
-import org.apache.rat.license.ILicenseFamily;
 import org.apache.rat.policy.DefaultPolicy;
 import org.apache.rat.report.RatReport;
 import org.apache.rat.report.claim.ClaimStatistic;
 import org.apache.rat.report.claim.impl.ClaimAggregator;
 import org.apache.rat.report.claim.impl.xml.SimpleXmlClaimReporter;
+import org.apache.rat.report.claim.util.ClaimReporterMultiplexer;
+import org.apache.rat.report.claim.util.LicenseAddingReport;
 import org.apache.rat.report.xml.writer.IXmlWriter;
 
 /**
@@ -38,45 +39,21 @@ import org.apache.rat.report.xml.writer.
  *
  */
 public class XmlReportFactory {
-    public static final RatReport createStandardReport(final IXmlWriter writer, 
-            final IHeaderMatcher matcher, ClaimStatistic pStatistic) {
-        return createStandardReport(writer, matcher, null, pStatistic);
-    }
-    
-    public static final RatReport createStandardReport(final IXmlWriter writer, 
-            final IHeaderMatcher matcher, final ILicenseFamily[] approvedLicenses,
-            final ClaimStatistic pStatistic) {
-        // TODO: this isn't very elegant :-/
-        // TODO: should really pass in analysers but this means injecting reporter
-        final Reporter reporter;
-        if (pStatistic == null) {
-            reporter = new SimpleXmlClaimReporter(writer);
-        } else {
-            reporter = new ClaimAggregator(new SimpleXmlClaimReporter(writer));
+    public static final RatReport createStandardReport(IXmlWriter writer,
+            final ClaimStatistic pStatistic, ReportConfiguration pConfiguration) {
+        final List reporters = new ArrayList();
+        if (pStatistic != null) {
+            reporters.add(new ClaimAggregator(pStatistic));
         }
-        final DefaultPolicy policy = new DefaultPolicy(approvedLicenses);
-        
+        if (pConfiguration.isAddingLicenses()) {
+            reporters.add(new LicenseAddingReport(pConfiguration.getCopyrightMessage(), pConfiguration.isAddingLicensesForced()));
+        }
+        reporters.add(new SimpleXmlClaimReporter(writer));
         final IDocumentAnalyser analyser = 
-            DefaultAnalyserFactory.createDefaultAnalyser(matcher);
+            DefaultAnalyserFactory.createDefaultAnalyser(pConfiguration.getHeaderMatcher());
+        final DefaultPolicy policy = new DefaultPolicy(pConfiguration.getApprovedLicenseNames());
         final IDocumentAnalyser[] analysers = {analyser, policy};
         DocumentAnalyserMultiplexer analysisMultiplexer = new DocumentAnalyserMultiplexer(analysers);
-        
-        final RatReport result = new XmlReport(writer, analysisMultiplexer, reporter);
-        if (pStatistic == null) {
-            return result;
-        }
-        return new RatReport(){
-            public void endReport() throws RatException {
-                result.endReport();
-                ((ClaimAggregator) reporter).fillClaimStatistic(pStatistic);
-            }
-            public void report(Document pDocument)
-                    throws RatException {
-                result.report(pDocument);
-            }
-            public void startReport() throws RatException {
-                result.startReport();
-            }
-        };
+        return new ClaimReporterMultiplexer(analysisMultiplexer, reporters);
     }
 }

Modified: incubator/rat/main/trunk/apache-rat-core/src/test/java/org/apache/rat/ReportTest.java
URL: http://svn.apache.org/viewvc/incubator/rat/main/trunk/apache-rat-core/src/test/java/org/apache/rat/ReportTest.java?rev=963778&r1=963777&r2=963778&view=diff
==============================================================================
--- incubator/rat/main/trunk/apache-rat-core/src/test/java/org/apache/rat/ReportTest.java (original)
+++ incubator/rat/main/trunk/apache-rat-core/src/test/java/org/apache/rat/ReportTest.java Tue Jul 13 16:10:23 2010
@@ -109,8 +109,10 @@ public class ReportTest extends TestCase
         StringWriter out = new StringWriter();
         HeaderMatcherMultiplexer matcherMultiplexer = new HeaderMatcherMultiplexer(Defaults.DEFAULT_MATCHERS);
         final String elementsPath = Resources.getResourceDirectory("elements/Source.java");
+        final ReportConfiguration configuration = new ReportConfiguration();
+        configuration.setHeaderMatcher(matcherMultiplexer);
         Report.report(out, new DirectoryWalker(new File(elementsPath)),
-                Defaults.getPlainStyleSheet(), matcherMultiplexer, null);
+                Defaults.getPlainStyleSheet(), configuration);
         String result = out.getBuffer().toString();
         final String elementsReports = getElementsReports(elementsPath);
         assertEquals("Report created",

Modified: incubator/rat/main/trunk/apache-rat-core/src/test/java/org/apache/rat/report/claim/impl/xml/MockClaimReporter.java
URL: http://svn.apache.org/viewvc/incubator/rat/main/trunk/apache-rat-core/src/test/java/org/apache/rat/report/claim/impl/xml/MockClaimReporter.java?rev=963778&r1=963777&r2=963778&view=diff
==============================================================================
--- incubator/rat/main/trunk/apache-rat-core/src/test/java/org/apache/rat/report/claim/impl/xml/MockClaimReporter.java (original)
+++ incubator/rat/main/trunk/apache-rat-core/src/test/java/org/apache/rat/report/claim/impl/xml/MockClaimReporter.java Tue Jul 13 16:10:23 2010
@@ -18,12 +18,7 @@
  */ 
 package org.apache.rat.report.claim.impl.xml;
 
-import org.apache.rat.api.Document;
-import org.apache.rat.api.RatException;
-import org.apache.rat.api.Reporter;
+import org.apache.rat.report.AbstractReport;
 
-public class MockClaimReporter implements Reporter {
-
-    public void report(Document document) throws RatException {
-    }
+public class MockClaimReporter extends AbstractReport {
 }

Modified: incubator/rat/main/trunk/apache-rat-core/src/test/java/org/apache/rat/report/xml/XmlReportFactoryTest.java
URL: http://svn.apache.org/viewvc/incubator/rat/main/trunk/apache-rat-core/src/test/java/org/apache/rat/report/xml/XmlReportFactoryTest.java?rev=963778&r1=963777&r2=963778&view=diff
==============================================================================
--- incubator/rat/main/trunk/apache-rat-core/src/test/java/org/apache/rat/report/xml/XmlReportFactoryTest.java (original)
+++ incubator/rat/main/trunk/apache-rat-core/src/test/java/org/apache/rat/report/xml/XmlReportFactoryTest.java Tue Jul 13 16:10:23 2010
@@ -24,7 +24,7 @@ import java.util.regex.Pattern;
 
 import junit.framework.TestCase;
 
-import org.apache.rat.walker.DirectoryWalker;
+import org.apache.rat.ReportConfiguration;
 import org.apache.rat.analysis.MockLicenseMatcher;
 import org.apache.rat.api.MetaData;
 import org.apache.rat.report.RatReport;
@@ -32,6 +32,7 @@ import org.apache.rat.report.claim.Claim
 import org.apache.rat.report.xml.writer.IXmlWriter;
 import org.apache.rat.report.xml.writer.impl.base.XmlWriter;
 import org.apache.rat.test.utils.Resources;
+import org.apache.rat.walker.DirectoryWalker;
 
 public class XmlReportFactoryTest extends TestCase {
 
@@ -61,7 +62,9 @@ public class XmlReportFactoryTest extend
         final MockLicenseMatcher mockLicenseMatcher = new MockLicenseMatcher();
         DirectoryWalker directory = new DirectoryWalker(new File(elementsPath), IGNORE_EMPTY);
         final ClaimStatistic statistic = new ClaimStatistic();
-        RatReport report = XmlReportFactory.createStandardReport(writer, mockLicenseMatcher, statistic);
+        final ReportConfiguration configuration = new ReportConfiguration();
+        configuration.setHeaderMatcher(mockLicenseMatcher);
+        RatReport report = XmlReportFactory.createStandardReport(writer, statistic, configuration);
         report.startReport();
         report(directory, report);
         report.endReport();

Modified: incubator/rat/main/trunk/apache-rat-core/src/test/java/org/apache/rat/report/xml/XmlReportTest.java
URL: http://svn.apache.org/viewvc/incubator/rat/main/trunk/apache-rat-core/src/test/java/org/apache/rat/report/xml/XmlReportTest.java?rev=963778&r1=963777&r2=963778&view=diff
==============================================================================
--- incubator/rat/main/trunk/apache-rat-core/src/test/java/org/apache/rat/report/xml/XmlReportTest.java (original)
+++ incubator/rat/main/trunk/apache-rat-core/src/test/java/org/apache/rat/report/xml/XmlReportTest.java Tue Jul 13 16:10:23 2010
@@ -20,6 +20,8 @@ package org.apache.rat.report.xml;
 
 import java.io.File;
 import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.regex.Pattern;
 
 import junit.framework.TestCase;
@@ -30,7 +32,9 @@ import org.apache.rat.analysis.IHeaderMa
 import org.apache.rat.analysis.RatHeaderAnalysisException;
 import org.apache.rat.api.Document;
 import org.apache.rat.document.IDocumentAnalyser;
+import org.apache.rat.report.RatReport;
 import org.apache.rat.report.claim.impl.xml.SimpleXmlClaimReporter;
+import org.apache.rat.report.claim.util.ClaimReporterMultiplexer;
 import org.apache.rat.report.xml.writer.IXmlWriter;
 import org.apache.rat.report.xml.writer.impl.base.XmlWriter;
 import org.apache.rat.test.utils.Resources;
@@ -40,7 +44,7 @@ public class XmlReportTest extends TestC
     private static final Pattern IGNORE = Pattern.compile(".svn");
     StringWriter out;
     IXmlWriter writer;
-    XmlReport report;
+    RatReport report;
     
     protected void setUp() throws Exception {
         super.setUp();
@@ -58,7 +62,9 @@ public class XmlReportTest extends TestC
             }            
         };
         IDocumentAnalyser analyser = DefaultAnalyserFactory.createDefaultAnalyser(matcher);
-        report = new XmlReport(writer, analyser, reporter);
+        final List reporters = new ArrayList();
+        reporters.add(reporter);
+        report = new ClaimReporterMultiplexer(analyser, reporters); 
     }
 
     protected void tearDown() throws Exception {

Modified: incubator/rat/main/trunk/apache-rat-plugin/src/main/java/org/apache/rat/mp/AbstractRatMojo.java
URL: http://svn.apache.org/viewvc/incubator/rat/main/trunk/apache-rat-plugin/src/main/java/org/apache/rat/mp/AbstractRatMojo.java?rev=963778&r1=963777&r2=963778&view=diff
==============================================================================
--- incubator/rat/main/trunk/apache-rat-plugin/src/main/java/org/apache/rat/mp/AbstractRatMojo.java (original)
+++ incubator/rat/main/trunk/apache-rat-plugin/src/main/java/org/apache/rat/mp/AbstractRatMojo.java Tue Jul 13 16:10:23 2010
@@ -37,6 +37,7 @@ import org.apache.maven.plugin.MojoFailu
 import org.apache.maven.project.MavenProject;
 import org.apache.rat.Defaults;
 import org.apache.rat.Report;
+import org.apache.rat.ReportConfiguration;
 import org.apache.rat.analysis.IHeaderMatcher;
 import org.apache.rat.analysis.util.HeaderMatcherMultiplexer;
 import org.apache.rat.api.RatException;
@@ -146,7 +147,7 @@ public abstract class AbstractRatMojo ex
      * @parameter expression="${rat.excludeSubprojects}" default-value="true"
      */
     private boolean excludeSubProjects;
-
+    
     /**
      * @parameter default-value="${project}"
      * @required
@@ -336,13 +337,13 @@ public abstract class AbstractRatMojo ex
      */
     protected ClaimStatistic createReport( Writer out, InputStream style ) throws MojoExecutionException, MojoFailureException
     {
-        HeaderMatcherMultiplexer m = new HeaderMatcherMultiplexer( getLicenseMatchers() );
+        final ReportConfiguration configuration = getConfiguration();
         try
         {
             if (style != null) {
-                return Report.report( out, getResources(), style, m, getApprovedLicenseNames() );
+                return Report.report( out, getResources(), style, configuration );
             } else {
-                return Report.report( getResources(), out, m, getApprovedLicenseNames() );
+                return Report.report( getResources(), out, configuration );
             }
         }
         catch ( TransformerConfigurationException e )
@@ -363,6 +364,14 @@ public abstract class AbstractRatMojo ex
         }
     }
 
+    protected ReportConfiguration getConfiguration() throws MojoFailureException,
+            MojoExecutionException {
+        final ReportConfiguration configuration = new ReportConfiguration();
+        configuration.setHeaderMatcher( new HeaderMatcherMultiplexer( getLicenseMatchers() ) );
+        configuration.setApprovedLicenseNames(getApprovedLicenseNames());
+        return configuration;
+    }
+
     private ILicenseFamily[] getApprovedLicenseNames() throws MojoExecutionException, MojoFailureException
     {
         if ( licenseFamilyNames == null || licenseFamilyNames.length == 0 )

Modified: incubator/rat/main/trunk/apache-rat-plugin/src/main/java/org/apache/rat/mp/RatCheckMojo.java
URL: http://svn.apache.org/viewvc/incubator/rat/main/trunk/apache-rat-plugin/src/main/java/org/apache/rat/mp/RatCheckMojo.java?rev=963778&r1=963777&r2=963778&view=diff
==============================================================================
--- incubator/rat/main/trunk/apache-rat-plugin/src/main/java/org/apache/rat/mp/RatCheckMojo.java (original)
+++ incubator/rat/main/trunk/apache-rat-plugin/src/main/java/org/apache/rat/mp/RatCheckMojo.java Tue Jul 13 16:10:23 2010
@@ -29,6 +29,7 @@ import java.io.InputStream;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
 import org.apache.rat.Defaults;
+import org.apache.rat.ReportConfiguration;
 import org.apache.rat.report.claim.ClaimStatistic;
 
 /**
@@ -62,6 +63,23 @@ public class RatCheckMojo extends Abstra
      */
     private int numUnapprovedLicenses;
 
+    /**
+     * Whether to add license headers; possible values are
+     * {@code forced}, {@code true}, and {@code false} (default).
+     *
+     * @parameter expression="${rat.addLicenseHeaders}" default-value="false"
+     */
+    private String addLicenseHeaders;
+
+    /**
+     * Copyright message to add to license headers. This option is
+     * ignored, unless {@code addLicenseHeaders} is set to {@code true},
+     * or {@code forced}.
+     *
+     * @parameter expression="${rat.copyrightMessage}"
+     */
+    private String copyrightMessage;
+
     private ClaimStatistic getRawReport()
         throws MojoExecutionException, MojoFailureException
     {
@@ -149,4 +167,23 @@ public class RatCheckMojo extends Abstra
             throw new RatCheckException( "Too many unapproved licenses: " + statistics.getNumUnApproved() );
         }
     }
+
+    protected ReportConfiguration getConfiguration()
+            throws MojoFailureException, MojoExecutionException {
+        final ReportConfiguration configuration = super.getConfiguration();
+        if ("forced".equals(addLicenseHeaders)) {
+            configuration.setAddingLicenses(true);
+            configuration.setAddingLicensesForced(true);
+            configuration.setCopyrightMessage(copyrightMessage);
+        } else if ("true".equals(addLicenseHeaders)) {
+            configuration.setAddingLicenses(true);
+            configuration.setCopyrightMessage(copyrightMessage);
+        } else if ("false".equals(addLicenseHeaders)) {
+            // Nothing to do
+        } else {
+            throw new MojoFailureException("Invalid value for addLicenseHeaders: Expected forced|true|false, got "
+                    + addLicenseHeaders);
+        }
+        return configuration;
+    }
 }

Modified: incubator/rat/main/trunk/apache-rat-plugin/src/test/it3/pom.xml
URL: http://svn.apache.org/viewvc/incubator/rat/main/trunk/apache-rat-plugin/src/test/it3/pom.xml?rev=963778&r1=963777&r2=963778&view=diff
==============================================================================
--- incubator/rat/main/trunk/apache-rat-plugin/src/test/it3/pom.xml (original)
+++ incubator/rat/main/trunk/apache-rat-plugin/src/test/it3/pom.xml Tue Jul 13 16:10:23 2010
@@ -20,7 +20,7 @@
     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">
   <groupId>org.apache.rat.test</groupId>
-  <artifactId>it1</artifactId>
+  <artifactId>it3</artifactId>
   <version>1.0</version>
   <build>
     <plugins>
@@ -33,15 +33,4 @@
       </plugin>
     </plugins>
   </build>
-  <reporting>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.rat</groupId>
-        <artifactId>apche-rat-plugin</artifactId>
-        <version>0.7-SNAPSHOT</version>
-        <configuration>
-        </configuration>
-      </plugin>
-    </plugins>
-  </reporting>
 </project>

Added: incubator/rat/main/trunk/apache-rat-plugin/src/test/it3/src.apt
URL: http://svn.apache.org/viewvc/incubator/rat/main/trunk/apache-rat-plugin/src/test/it3/src.apt?rev=963778&view=auto
==============================================================================
--- incubator/rat/main/trunk/apache-rat-plugin/src/test/it3/src.apt (added)
+++ incubator/rat/main/trunk/apache-rat-plugin/src/test/it3/src.apt Tue Jul 13 16:10:23 2010
@@ -0,0 +1,8 @@
+    --------------
+    Some text file
+    --------------
+
+Some text file
+
+  This is a text file, which intentionally has no Apache License Header.
+  The RAT plugin should detect it.

Modified: incubator/rat/main/trunk/apache-rat-plugin/src/test/java/org/apache/rat/mp/RatCheckMojoTest.java
URL: http://svn.apache.org/viewvc/incubator/rat/main/trunk/apache-rat-plugin/src/test/java/org/apache/rat/mp/RatCheckMojoTest.java?rev=963778&r1=963777&r2=963778&view=diff
==============================================================================
--- incubator/rat/main/trunk/apache-rat-plugin/src/test/java/org/apache/rat/mp/RatCheckMojoTest.java (original)
+++ incubator/rat/main/trunk/apache-rat-plugin/src/test/java/org/apache/rat/mp/RatCheckMojoTest.java Tue Jul 13 16:10:23 2010
@@ -19,8 +19,11 @@ package org.apache.rat.mp;
 
 import java.io.BufferedReader;
 import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
 import java.io.FileReader;
 import java.io.IOException;
+import java.io.InputStreamReader;
 import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.Method;
 import java.lang.reflect.Proxy;
@@ -42,6 +45,7 @@ import org.apache.rat.mp.AbstractRatMojo
 import org.apache.rat.mp.RatCheckException;
 import org.apache.rat.mp.RatCheckMojo;
 import org.apache.rat.mp.RatReportMojo;
+import org.codehaus.plexus.util.DirectoryScanner;
 
 
 /**
@@ -138,7 +142,7 @@ public class RatCheckMojoTest extends Ab
     private RatCheckMojo newRatCheckMojo( String pDir )
             throws Exception
     {
-        return (RatCheckMojo) newRatMojo( pDir, "check" );
+        return (RatCheckMojo) newRatMojo( pDir, "check", false );
     }
 
     /**
@@ -148,11 +152,11 @@ public class RatCheckMojoTest extends Ab
      * @return The configured Mojo.
      * @throws Exception An error occurred while creating the Mojo.
      */
-    private AbstractRatMojo newRatMojo( String pDir, String pGoal )
+    private AbstractRatMojo newRatMojo( String pDir, String pGoal, boolean pCreateCopy )
             throws Exception
     {
         final File baseDir = new File( getBasedir() );
-        final File testBaseDir = new File( new File( baseDir, "src/test" ), pDir );
+        final File testBaseDir = getSourceDirectory(pDir, pCreateCopy, baseDir);
         File testPom = new File( testBaseDir, "pom.xml" );
         AbstractRatMojo mojo = (AbstractRatMojo) lookupMojo( pGoal, testPom );
         assertNotNull( mojo );
@@ -162,6 +166,7 @@ public class RatCheckMojoTest extends Ab
         setVariableValueToObject( mojo, "useDefaultExcludes", Boolean.TRUE );
         setVariableValueToObject( mojo, "useMavenDefaultExcludes", Boolean.TRUE );
         setVariableValueToObject( mojo, "useEclipseDefaultExcludes", Boolean.TRUE );
+        setVariableValueToObject( mojo, "addLicenseHeaders", "false" );
         final Build build = new Build();
         build.setDirectory( buildDirectory.getPath() );
         final MavenProjectStub project = new MavenProjectStub(){
@@ -186,6 +191,99 @@ public class RatCheckMojoTest extends Ab
         return mojo;
     }
 
+    private File getSourceDirectory(String pDir, boolean pCreateCopy,
+            final File baseDir) throws IOException {
+        return makeSourceDirectory( new File( new File( baseDir, "src/test" ), pDir ), pDir, pCreateCopy );
+    }
+
+    private void remove( File pDir ) throws IOException {
+        if ( pDir.isFile() )
+        {
+            if ( ! pDir.delete() )
+            {
+                throw new IOException( "Unable to delete file: " + pDir );
+            }
+        }
+        else if ( pDir.isDirectory() )
+        {
+            final File[] files = pDir.listFiles();
+            for ( int i = 0;  i < files.length;  i++ )
+            {
+                remove( files[i] );
+            }
+            if ( ! pDir.delete() )
+            {
+                throw new IOException( "Unable to delete directory: " + pDir );
+            }
+        }
+        else if ( pDir.exists() )
+        {
+            throw new IOException( "Unable to delete unknown object " + pDir );
+        }
+    }
+
+    private void copy( File pSource, File pTarget ) throws IOException
+    {
+        if ( pSource.isDirectory() )
+        {
+            if ( !pTarget.isDirectory()  &&  !pTarget.mkdirs() ) {
+                throw new IOException("Unable to create directory: " + pTarget);
+            }
+            final DirectoryScanner scanner = new DirectoryScanner();
+            scanner.setBasedir(pSource);
+            scanner.addDefaultExcludes();
+            scanner.setIncludes(new String[]{"*"});
+            scanner.scan();
+            final String[] dirs = scanner.getIncludedDirectories();
+            
+            for (int i = 0;  i < dirs.length;  i++) {
+                final String dir = dirs[i];
+                if (!"".equals(dir)) {
+                    copy( new File(pSource, dir), new File(pTarget, dir));
+                }
+            }
+            final String[] files = scanner.getIncludedFiles();
+            for (int i = 0;  i < files.length;  i++) {
+                copy( new File(pSource, files[i]), new File(pTarget, files[i]));
+            }
+        }
+        else if ( pSource.isFile() )
+        {
+            final FileInputStream fis = new FileInputStream( pSource );
+            final FileOutputStream fos = new FileOutputStream( pTarget );
+            final byte[] buffer = new byte[8192];
+            for ( ;; )
+            {
+                int res = fis.read(buffer);
+                if (res == -1) {
+                    break;
+                }
+                if (res > 0) {
+                    fos.write(buffer, 0, res);
+                }
+            }
+            fos.close();
+            fis.close();
+        }
+        else
+        {
+            throw new IOException( "Unable to copy unknown object " + pSource );
+        }
+    }
+    
+    private File makeSourceDirectory(File pFile, String pDir, boolean pCreateCopy) throws IOException {
+        if ( ! pCreateCopy )
+        {
+            return pFile;
+        }
+
+        final File baseDir = new File( getBasedir() );
+        final File targetDir = new File( new File( baseDir, "target/it-source" ), pDir );
+        remove( targetDir );
+        copy( pFile, targetDir );
+        return targetDir;
+    }
+
     /**
      * Reads the location of the rat text file from the Mojo.
      * @param pMojo The configured Mojo.
@@ -266,12 +364,33 @@ public class RatCheckMojoTest extends Ab
         checkResult( ratTxtFile, 1, 1 );
     }
 
-//    /**
-//     * Runs a report, which should detect no problems.
-//     * @throws Exception The test failed.
-//     */
-//    public void testIt3() throws Exception {
-//        final RatReportMojo mojo = newRatReportMojo( "it3" );
-//        mojo.execute();
-//    }
+    private String getFirstLine(File pFile) throws IOException {
+        final FileInputStream fis = new FileInputStream(pFile);
+        final InputStreamReader reader = new InputStreamReader(fis, "UTF8");
+        final BufferedReader breader = new BufferedReader(reader);
+        final String result = breader.readLine();
+        breader.close();
+        return result;
+    }
+    
+    /**
+     * Tests adding license headers.
+     */
+    public void testIt3() throws Exception {
+        final RatCheckMojo mojo = (RatCheckMojo) newRatMojo( "it3", "check", true );
+        setVariableValueToObject( mojo, "addLicenseHeaders", "true" );
+        setVariableValueToObject( mojo, "numUnapprovedLicenses", new Integer(1));
+        mojo.execute();
+        final File ratTxtFile = getRatTxtFile( mojo );
+        checkResult( ratTxtFile, 1, 1 );
+
+        final File baseDir = new File( getBasedir() );
+        final File sourcesDir = new File( new File( baseDir, "target/it-source" ), "it3" );
+        final String firstLineOrig = getFirstLine(new File(sourcesDir, "src.apt"));
+        assertTrue(firstLineOrig.indexOf("--") != -1);
+        assertTrue(firstLineOrig.indexOf("~~") == -1);
+        final String firstLineModified = getFirstLine(new File(sourcesDir, "src.apt.new"));
+        assertTrue(firstLineModified.indexOf("--") == -1);
+        assertTrue(firstLineModified.indexOf("~~") != -1);
+    }
 }

Modified: incubator/rat/main/trunk/apache-rat-tasks/src/main/java/org/apache/rat/anttasks/Report.java
URL: http://svn.apache.org/viewvc/incubator/rat/main/trunk/apache-rat-tasks/src/main/java/org/apache/rat/anttasks/Report.java?rev=963778&r1=963777&r2=963778&view=diff
==============================================================================
--- incubator/rat/main/trunk/apache-rat-tasks/src/main/java/org/apache/rat/anttasks/Report.java (original)
+++ incubator/rat/main/trunk/apache-rat-tasks/src/main/java/org/apache/rat/anttasks/Report.java Tue Jul 13 16:10:23 2010
@@ -39,6 +39,7 @@ import org.apache.tools.ant.types.resour
 import org.apache.tools.ant.util.FileUtils;
 
 import org.apache.rat.Defaults;
+import org.apache.rat.ReportConfiguration;
 import org.apache.rat.analysis.IHeaderMatcher;
 import org.apache.rat.analysis.util.HeaderMatcherMultiplexer;
 import org.apache.rat.api.RatException;
@@ -90,6 +91,14 @@ public class Report extends Task {
      * Which stylesheet to use.
      */
     private Resource stylesheet;
+    /**
+     * Whether to add license headers.
+     */
+    private AddLicenseHeaders addLicenseHeaders = new AddLicenseHeaders(AddLicenseHeaders.FALSE);
+    /**
+     * The copyright message.
+     */
+    private String copyrightMessage;
 
     /**
      * Adds resources that will be checked.
@@ -137,6 +146,23 @@ public class Report extends Task {
     }
 
     /**
+     * Wether to add license headers.
+     */
+    public void setAddLicenseHeaders(AddLicenseHeaders pAdd) {
+        if (pAdd == null) {
+            throw new IllegalArgumentException("addLicenseHeaders must not be null");
+        }
+        addLicenseHeaders = pAdd;
+    }
+
+    /**
+     * Sets the copyright message.
+     */
+    public void setCopyrightMessage(String pMessage) {
+        copyrightMessage = pMessage;
+    }
+    
+    /**
      * Which stylesheet to use (only meaningful with format='styled').
      */
     public void addConfiguredStylesheet(Union u) {
@@ -215,12 +241,24 @@ public class Report extends Task {
      * @throws RatException 
      */
     private void createReport(PrintWriter out) throws IOException, TransformerException, InterruptedException, RatException {
-        HeaderMatcherMultiplexer m = new HeaderMatcherMultiplexer(getLicenseMatchers());
-        ResourceCollectionContainer rcElement =
-            new ResourceCollectionContainer(nestedResources);
+        final ReportConfiguration configuration = new ReportConfiguration();
+        configuration.setHeaderMatcher(new HeaderMatcherMultiplexer(getLicenseMatchers()));
+        configuration.setApprovedLicenseNames(getApprovedLicenseNames());
+        if (AddLicenseHeaders.FALSE.equalsIgnoreCase(addLicenseHeaders.getValue())) {
+            // Nothing to do
+        } else if (AddLicenseHeaders.FORCED.equalsIgnoreCase(addLicenseHeaders.getValue())) {
+            configuration.setAddingLicenses(true);
+            configuration.setAddingLicensesForced(true);
+            configuration.setCopyrightMessage(copyrightMessage);
+        } else if (AddLicenseHeaders.TRUE.equalsIgnoreCase(addLicenseHeaders.getValue())) {
+            configuration.setAddingLicenses(true);
+            configuration.setCopyrightMessage(copyrightMessage);
+        } else {
+            throw new BuildException("Invalid value for addLicenseHeaders: " + addLicenseHeaders.getValue());
+        }
+        ResourceCollectionContainer rcElement = new ResourceCollectionContainer(nestedResources);
         if (format.getValue().equals(Format.XML_KEY)) {
-            org.apache.rat.Report.report(rcElement, out, m,
-                                         getApprovedLicenseNames());
+            org.apache.rat.Report.report(rcElement, out, configuration);
         } else {
             InputStream style = null;
             try {
@@ -233,7 +271,7 @@ public class Report extends Task {
                                              + format.getValue() + "'");
                 }
                 org.apache.rat.Report.report(out, rcElement, style,
-                                             m, getApprovedLicenseNames());
+                                             configuration);
             } finally {
                 FileUtils.close(style);
             }
@@ -296,4 +334,25 @@ public class Report extends Task {
             };
         }
     }
+
+    /**
+     * Type for the addLicenseHeaders attribute.
+     */
+    public static class AddLicenseHeaders extends EnumeratedAttribute {
+        static final String TRUE = "true";
+        static final String FALSE = "false";
+        static final String FORCED = "forced";
+
+        public AddLicenseHeaders() {}
+        public AddLicenseHeaders(String s) {
+            setValue(s);
+        }
+        
+        
+        public String[] getValues() {
+            return new String[] {
+                TRUE, FALSE, FORCED
+            };
+        }
+    }
 }

Modified: incubator/rat/main/trunk/apache-rat-tasks/src/test/java/org/apache/rat/anttasks/ReportTest.java
URL: http://svn.apache.org/viewvc/incubator/rat/main/trunk/apache-rat-tasks/src/test/java/org/apache/rat/anttasks/ReportTest.java?rev=963778&r1=963777&r2=963778&view=diff
==============================================================================
--- incubator/rat/main/trunk/apache-rat-tasks/src/test/java/org/apache/rat/anttasks/ReportTest.java (original)
+++ incubator/rat/main/trunk/apache-rat-tasks/src/test/java/org/apache/rat/anttasks/ReportTest.java Tue Jul 13 16:10:23 2010
@@ -16,8 +16,11 @@
  */
 package org.apache.rat.anttasks;
 
+import java.io.BufferedReader;
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.IOException;
+import java.io.InputStreamReader;
 
 import org.apache.tools.ant.BuildException;
 
@@ -85,4 +88,26 @@ public class ReportTest extends Abstract
     private String getAntFileName() {
         return getAntFile().getPath().replace('\\', '/');
     }
+
+    private String getFirstLine(File pFile) throws IOException {
+        final FileInputStream fis = new FileInputStream(pFile);
+        final InputStreamReader reader = new InputStreamReader(fis, "UTF8");
+        final BufferedReader breader = new BufferedReader(reader);
+        final String result = breader.readLine();
+        breader.close();
+        return result;
+    }
+
+    public void testAddLicenseHeaders() throws Exception {
+        executeTarget("testAddLicenseHeaders");
+
+        final File origFile = new File("target/anttasks/it-sources/index.apt");
+        final String origFirstLine = getFirstLine(origFile);
+        assertTrue(origFirstLine.indexOf("--") != -1);
+        assertTrue(origFirstLine.indexOf("~~") == -1);
+        final File modifiedFile = new File("target/anttasks/it-sources/index.apt.new");
+        final String modifiedFirstLine = getFirstLine(modifiedFile);
+        assertTrue(modifiedFirstLine.indexOf("--") == -1);
+        assertTrue(modifiedFirstLine.indexOf("~~") != -1);
+    }
 }

Added: incubator/rat/main/trunk/apache-rat-tasks/src/test/resources/antunit/index.apt
URL: http://svn.apache.org/viewvc/incubator/rat/main/trunk/apache-rat-tasks/src/test/resources/antunit/index.apt?rev=963778&view=auto
==============================================================================
--- incubator/rat/main/trunk/apache-rat-tasks/src/test/resources/antunit/index.apt (added)
+++ incubator/rat/main/trunk/apache-rat-tasks/src/test/resources/antunit/index.apt Tue Jul 13 16:10:23 2010
@@ -0,0 +1,8 @@
+    --------------
+    Some text file
+    --------------
+
+Some text file
+
+  This is a text file, which intentionally has no Apache License Header.
+  The RAT plugin should detect it.

Modified: incubator/rat/main/trunk/apache-rat-tasks/src/test/resources/antunit/report-junit.xml
URL: http://svn.apache.org/viewvc/incubator/rat/main/trunk/apache-rat-tasks/src/test/resources/antunit/report-junit.xml?rev=963778&r1=963777&r2=963778&view=diff
==============================================================================
--- incubator/rat/main/trunk/apache-rat-tasks/src/test/resources/antunit/report-junit.xml (original)
+++ incubator/rat/main/trunk/apache-rat-tasks/src/test/resources/antunit/report-junit.xml Tue Jul 13 16:10:23 2010
@@ -84,4 +84,13 @@
       <file file="${ant.file}"/>
 	</rat:report>
   </target>
+
+  <target name="testAddLicenseHeaders">
+  	<delete dir="${output.dir}/it-sources"/>
+    <mkdir dir="${output.dir}/it-sources"/>
+  	<copy file="src/test/resources/antunit/index.apt" tofile="${output.dir}/it-sources/index.apt"/>
+    <rat:report addLicenseHeaders="true">
+       <file file="${output.dir}/it-sources/index.apt"/>
+    </rat:report>
+  </target>
 </project>