/*
* Carrot2 project.
*
* Copyright (C) 2002-2016, Dawid Weiss, Stanisław Osiński.
* All rights reserved.
*
* Refer to the full license file "carrot2.LICENSE"
* in the root folder of the repository checkout or at:
* http://www.carrot2.org/carrot2.LICENSE
*/
package org.carrot2.antlib.tasks;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
/**
* Replaces licensing information according to the given set of replace-rules.
*/
public class LicenseReplaceTask extends AbstractLicenseTask
{
/**
* A replaceable block contains a key which detects the header to be replaced ({@link #setContains(String)})
* and a replacement ({@link #setReplacement(String)}) which replaces it.
*/
public abstract class ReplaceableBlock
{
private String containsKey;
private String replacement;
private boolean empty;
private String canonicalContainsKey;
public void setContains(String key)
{
this.containsKey = getProject().replaceProperties(key);
}
public void setReplacement(String replacement)
{
this.replacement = getProject().replaceProperties(replacement);
}
public void setIsempty(boolean emptyHeader)
{
this.empty = emptyHeader;
}
protected void checkAttributes() throws BuildException
{
if (empty && containsKey != null)
{
throw new BuildException(
"Attributes empty and contains are mutually exclusive.");
}
this.canonicalContainsKey = SourceFile.canonicalize(containsKey);
}
public abstract SourceFile process(SourceFile original);
protected boolean checkReplace(String text)
{
if (empty)
{
if (text.length() == 0)
{
return true;
}
else
{
return false;
}
}
else
{
return text.indexOf(canonicalContainsKey) >= 0;
}
}
}
public class HeaderBlock extends ReplaceableBlock
{
public SourceFile process(SourceFile original)
{
checkAttributes();
if (checkReplace(original.getCanonicalizedHeader()))
{
return new SourceFile(super.replacement, original.getContent(), original
.getFooter());
}
else
{
return null;
}
}
}
public class FooterBlock extends ReplaceableBlock
{
public SourceFile process(SourceFile original)
{
checkAttributes();
if (checkReplace(original.getCanonicalizedFooter()))
{
return new SourceFile(original.getHeader(), original.getContent(),
super.replacement);
}
else
{
return null;
}
}
}
/** Verbose info. */
private boolean verbose;
/**
* Number of processed files using each of the {@link ReplaceableBlock}s in
* {@link #blocks} variable.
*/
private int [] processed;
/**
* An extension added to saved files. Leave empty to overwrite.
*/
private String saveExtension;
/**
* Replaceable blocks for processing.
*/
private ArrayList<ReplaceableBlock> blocks = new ArrayList<ReplaceableBlock>();
public ReplaceableBlock createHeader()
{
HeaderBlock block = new HeaderBlock();
blocks.add(block);
return block;
}
public ReplaceableBlock createFooter()
{
FooterBlock block = new FooterBlock();
blocks.add(block);
return block;
}
/**
* If set to <code>true</code> a more verbose info is dumped.
*/
public void setVerbose(boolean verbose)
{
this.verbose = verbose;
}
/**
* An extension added to saved files. Leave empty to overwrite.
*/
public void setSaveExtension(String extension)
{
this.saveExtension = extension;
}
public void execute() throws BuildException
{
this.processed = new int [blocks.size()];
super.execute();
final StringBuffer buf = new StringBuffer();
int total = 0;
for (int i = 0; i < processed.length; i++)
{
final ReplaceableBlock block = (ReplaceableBlock) blocks.get(i);
if (processed[i] > 0)
{
buf.append("License (key: " + block.containsKey + "): " + processed[i]
+ "\n");
}
total += processed[i];
}
super.log("Saved: " + total + " files.", Project.MSG_INFO);
if (buf.toString().trim().length() > 0)
{
super.log(buf.toString(), Project.MSG_INFO);
}
}
/**
* Process a single file.
*/
protected void checkLicense(File file) throws IOException
{
final String content = readFile(file);
final SourceFile split = new SourceFile(content, file);
for (int i = 0; i < blocks.size(); i++)
{
final ReplaceableBlock block = (ReplaceableBlock) blocks.get(i);
final SourceFile newSplit = block.process(split);
if (newSplit != null)
{
if (newSplit.isIdentical(split))
{
return;
}
processed[i]++;
super.log("Saving replaced file: " + file.getName(),
verbose ? Project.MSG_INFO : Project.MSG_VERBOSE);
writeFile(newSplit.recreateFile(), new File(file.getAbsolutePath()
+ saveExtension));
}
}
}
}