/* * 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.*; import java.util.LinkedList; import org.apache.tools.ant.*; import org.apache.tools.ant.taskdefs.MatchingTask; import org.apache.tools.ant.types.FileSet; import org.apache.tools.ant.util.FileUtils; /** * A common superclass for ANT task for adding, replacing or listing licensing info in * source code headers or footers. */ abstract class AbstractLicenseTask extends MatchingTask { /** * A list of <code>FileSet</code> indicating files with <code>*.java</code> * suffix. */ private LinkedList<FileSet> filesets = new LinkedList<FileSet>(); /** * Source file encoding (must be given in an explicit way). */ private String encoding; /** * If set to <code>true</code>, the task will accept files not ending with * <code>.java</code>. */ private boolean forceAllFiles; /** * Crates a new path with a set of dependency files to scan. */ public FileSet createFileset() { final FileSet fileset = new FileSet(); filesets.add(fileset); return fileset; } /** * Checks if all parameters are correct. * * @throws BuildException */ protected void checkParameters() throws BuildException { if (getProject() == null) { throw new BuildException("Project reference is required."); } if (getEncoding() == null) { throw new BuildException( "Source file encoding is required (an explicit attribute)"); } else { try { /* * We log the message and at the same time check if the encoding is all * right. */ super.log("Source files encoding is: " + new String(getEncoding().getBytes(getEncoding()), getEncoding()), Project.MSG_VERBOSE); } catch (UnsupportedEncodingException e) { throw new BuildException("Encoding not supported: " + getEncoding()); } } } /** * Executes the task. */ public void execute() throws BuildException { checkParameters(); final FileUtils fUtils = FileUtils.getFileUtils(); final Project project = getProject(); for (FileSet fileset : filesets) { final DirectoryScanner scanner = fileset.getDirectoryScanner(project); final File fromDir = fileset.getDir(project); final String [] srcFiles = scanner.getIncludedFiles(); for (int fIndex = 0; fIndex < srcFiles.length; fIndex++) { final File file = fUtils.resolveFile(fromDir, srcFiles[fIndex]); if (!file.isFile()) { continue; } if (false == forceAllFiles && false == file.getName().endsWith(".java")) { throw new BuildException( "File does not end with '.java'. Use 'force' attribute to override."); } try { checkLicense(file); } catch (IOException e) { throw new BuildException("Could not process file: " + file.getAbsolutePath(), e); } } } } /** * Invoked for each file where licensing should be checked. */ protected abstract void checkLicense(File file) throws IOException, BuildException; /** * Set source file encoding. */ public void setEncoding(String encoding) { this.encoding = encoding; } /** * Set to <code>true</code> to make the task accept files not ending with the * default Java source file suffix. */ public void setForce(boolean force) { this.forceAllFiles = force; } /** * Returns current source file encoding or <code>null</code> if none yet. */ protected String getEncoding() { return encoding; } /** * Reads a single file into memory. */ protected final String readFile(File file) throws IOException { final byte [] content = new byte [(int) file.length()]; final FileInputStream fis = new FileInputStream(file); try { if (fis.read(content) != content.length) { throw new IOException("Could not read all bytes from file: " + file.getAbsolutePath()); } return new String(content, getEncoding()); } finally { try { fis.close(); } catch (IOException e) { // Ignore exception. } } } /** * Write a string to file. The encoding is acquired from {@link #getEncoding()}. */ protected void writeFile(String string, File file) throws IOException { final byte [] content = string.getBytes(getEncoding()); final FileOutputStream fos = new FileOutputStream(file); try { fos.write(content); } finally { try { fos.close(); } catch (IOException e) { // Ignore exception. } } } }