RAT (Release Audit Tool) results

The following document contains the results of RAT (Release Audit Tool) .

*****************************************************
Summary
-------
Notes: 1
Binaries: 62
Archives: 0
Standards: 52

Apache Licensed: 0
Generated Documents: 0

JavaDocs are generated and so license header is optional
Generated files do not required license headers

52 Unknown Licenses

*******************************

Archives (+ indicates readable, $ unreadable): 

 
*****************************************************
  Files with AL headers will be marked L
  Binary files (which do not require AL headers) will be marked B
  Compressed archives will be marked A
  Notices, licenses etc will be marked N
 !????? src/main/java/net/sf/alchim/spoon/contrib/launcher/SpoonletXmlHandler.java
 !????? src/main/java/net/sf/alchim/spoon/contrib/launcher/artifact/DomHelper.java
 !????? src/main/java/net/sf/alchim/spoon/contrib/launcher/artifact/Repository.java
 !????? src/main/java/net/sf/alchim/spoon/contrib/launcher/artifact/UrlHelper.java
 !????? src/main/java/net/sf/alchim/spoon/contrib/launcher/artifact/MD5Helper.java
 !????? src/main/java/net/sf/alchim/spoon/contrib/launcher/artifact/Pom.java
 !????? src/main/java/net/sf/alchim/spoon/contrib/launcher/artifact/Artifact.java
 !????? src/main/java/net/sf/alchim/spoon/contrib/launcher/Launcher.java
 !????? src/main/java/net/sf/alchim/spoon/contrib/launcher/SpoonCfgXmlHandler.java
 !????? src/main/java/net/sf/alchim/spoon/contrib/launcher/SubLauncher.java
 !????? src/main/java/net/sf/alchim/spoon/contrib/maven/CleanCompileMojo.java
 !????? src/main/java/net/sf/alchim/spoon/contrib/maven/CleanTestCompileMojo.java
 !????? src/main/java/net/sf/alchim/spoon/contrib/maven/SpoonGenSrcMojo.java
 !????? src/main/java/net/sf/alchim/spoon/contrib/maven/AbstractSpoonMojo.java
 !????? src/main/java/net/sf/alchim/spoon/contrib/maven/AbstractCleanMojo.java
 !????? src/main/java/net/sf/alchim/spoon/contrib/maven/MavenEnvironment.java
 !????? src/main/java/net/sf/alchim/spoon/contrib/maven/SpoonCompileMojo.java
 !????? src/main/java/net/sf/alchim/spoon/contrib/maven/SpoonTestCompileMojo.java
 !????? src/main/java/net/sf/alchim/spoon/contrib/maven/SpoonTestGenSrcMojo.java
 !????? src/main/java/net/sf/alchim/spoon/contrib/maven/SpoonReportMojo.java
 !????? src/main/java/net/sf/alchim/spoon/contrib/maven/SpoonReportGenerator.java
 !????? src/main/java/net/sf/alchim/spoon/contrib/maven/SpoonReportData.java
 !????? src/main/java/net/sf/alchim/spoon/contrib/misc/ClasspathHelper.java
 !????? src/main/java/net/sf/alchim/spoon/contrib/misc/PathHelper.java
 !????? src/main/java/net/sf/alchim/spoon/contrib/misc/CtFile4ResourceStream.java
 !????? src/main/resources/spoon-report.properties
  B     src/main/resources/net/sf/alchim/spoon/contrib/maven/images/ERROR.png
  B     src/main/resources/net/sf/alchim/spoon/contrib/maven/images/MESSAGE.png
  B     src/main/resources/net/sf/alchim/spoon/contrib/maven/images/UNDEF.png
  B     src/main/resources/net/sf/alchim/spoon/contrib/maven/images/WARNING.png
 !????? src/site/resources/css/site.css
 !????? src/site/xdoc/usage.xml
 !????? src/site/site.xml
 !????? src/sandbox/java/MyJavaOutputProcessor.java
 !????? src/sandbox/java/CounterProcessor.java
 !????? src/sandbox/java/Spoonlet.java
 !????? src/sandbox/java/RunProcessorsMojo.java
 !????? src/sandbox/java/MyByteCodeOutputProcessor.java
 !????? src/sandbox/ok/Launcher.java
 !????? src/sandbox/ok/SpoonletXmlHandler.java
 !????? src/sandbox/ok/MavenEnvironment.java
 !????? src/sandbox/ok/RunProcessorsMojo.java
 !????? src/test/java/net/sf/alchim/spoon/contrib/launcher/artifact/DomHelperTest.java
 !????? src/test/java/net/sf/alchim/spoon/contrib/launcher/artifact/MD5HelperTest.java
 !????? src/test/resources/net/sf/alchim/spoon/contrib/launcher/artifact/sample1.xml
 !????? src/assembly/project.xml
  N     LICENSE.txt
 !????? pom.xml
 !????? notes.txt
 !????? .hgtags
 !????? .hgignore
  B     .hg/store/data/.hgignore.i
  B     .hg/store/data/_l_i_c_e_n_s_e.txt.i
  B     .hg/store/data/pom.xml.i
  B     .hg/store/data/src/changes/changes.xml.i
  B     .hg/store/data/src/main/java/net/sf/alchim/spoon/contrib/launcher/_launcher.java.i
  B     .hg/store/data/src/main/java/net/sf/alchim/spoon/contrib/launcher/_spoon_cfg_xml_handler.java.i
  B     .hg/store/data/src/main/java/net/sf/alchim/spoon/contrib/launcher/_spoonlet_xml_handler.java.i
  B     .hg/store/data/src/main/java/net/sf/alchim/spoon/contrib/launcher/_sub_launcher.java.i
  B     .hg/store/data/src/main/java/net/sf/alchim/spoon/contrib/launcher/artifact/_artifact.java.i
  B     .hg/store/data/src/main/java/net/sf/alchim/spoon/contrib/launcher/artifact/_dom_helper.java.i
  B     .hg/store/data/src/main/java/net/sf/alchim/spoon/contrib/launcher/artifact/_m_d5_helper.java.i
  B     .hg/store/data/src/main/java/net/sf/alchim/spoon/contrib/launcher/artifact/_pom.java.i
  B     .hg/store/data/src/main/java/net/sf/alchim/spoon/contrib/launcher/artifact/_repository.java.i
  B     .hg/store/data/src/main/java/net/sf/alchim/spoon/contrib/launcher/artifact/_url_helper.java.i
  B     .hg/store/data/src/main/java/net/sf/alchim/spoon/contrib/maven/_abstract_clean_mojo.java.i
  B     .hg/store/data/src/main/java/net/sf/alchim/spoon/contrib/maven/_abstract_spoon_mojo.java.i
  B     .hg/store/data/src/main/java/net/sf/alchim/spoon/contrib/maven/_clean_compile_mojo.java.i
  B     .hg/store/data/src/main/java/net/sf/alchim/spoon/contrib/maven/_clean_test_compile_mojo.java.i
  B     .hg/store/data/src/main/java/net/sf/alchim/spoon/contrib/maven/_maven_environment.java.i
  B     .hg/store/data/src/main/java/net/sf/alchim/spoon/contrib/maven/_my_byte_code_output_processor.java.i
  B     .hg/store/data/src/main/java/net/sf/alchim/spoon/contrib/maven/_spoon_compile_mojo.java.i
  B     .hg/store/data/src/main/java/net/sf/alchim/spoon/contrib/maven/_spoon_gen_src_mojo.java.i
  B     .hg/store/data/src/main/java/net/sf/alchim/spoon/contrib/maven/_spoon_test_compile_mojo.java.i
  B     .hg/store/data/src/main/java/net/sf/alchim/spoon/contrib/maven/_spoon_test_gen_src_mojo.java.i
  B     .hg/store/data/src/main/java/net/sf/alchim/spoon/contrib/maven/_spoon_report_data.java.i
  B     .hg/store/data/src/main/java/net/sf/alchim/spoon/contrib/maven/_spoon_report_generator.java.i
  B     .hg/store/data/src/main/java/net/sf/alchim/spoon/contrib/maven/_spoon_report_mojo.java.i
  B     .hg/store/data/src/main/java/net/sf/alchim/spoon/contrib/misc/_classpath_helper.java.i
  B     .hg/store/data/src/main/java/net/sf/alchim/spoon/contrib/misc/_ct_file4_resource_stream.java.i
  B     .hg/store/data/src/main/java/net/sf/alchim/spoon/contrib/misc/_path_helper.java.i
  B     .hg/store/data/src/main/resources/net/sf/alchim/spoon/contrib/maven/images/_e_r_r_o_r.png.i
  B     .hg/store/data/src/main/resources/net/sf/alchim/spoon/contrib/maven/images/_m_e_s_s_a_g_e.png.i
  B     .hg/store/data/src/main/resources/net/sf/alchim/spoon/contrib/maven/images/_u_n_d_e_f.png.i
  B     .hg/store/data/src/main/resources/net/sf/alchim/spoon/contrib/maven/images/_w_a_r_n_i_n_g.png.i
  B     .hg/store/data/src/main/resources/spoon-report.properties.i
  B     .hg/store/data/src/sandbox/java/_counter_processor.java.i
  B     .hg/store/data/src/sandbox/java/_my_java_output_processor.java.i
  B     .hg/store/data/src/sandbox/java/_run_processors_mojo.java.i
  B     .hg/store/data/src/sandbox/java/_spoonlet.java.i
  B     .hg/store/data/src/sandbox/java/_my_byte_code_output_processor.java.i
  B     .hg/store/data/src/sandbox/ok/_launcher.java.i
  B     .hg/store/data/src/sandbox/ok/_maven_environment.java.i
  B     .hg/store/data/src/sandbox/ok/_run_processors_mojo.java.i
  B     .hg/store/data/src/sandbox/ok/_spoonlet_xml_handler.java.i
  B     .hg/store/data/src/site/resources/css/site.css.i
  B     .hg/store/data/src/site/site.xml.i
  B     .hg/store/data/src/site/xdoc/overview.xml.i
  B     .hg/store/data/src/site/xdoc/usage.xml.i
  B     .hg/store/data/src/site/xdoc/index.xml.i
  B     .hg/store/data/src/test/java/net/sf/alchim/spoon/contrib/launcher/artifact/_dom_helper_test.java.i
  B     .hg/store/data/src/test/java/net/sf/alchim/spoon/contrib/launcher/artifact/_m_d5_helper_test.java.i
  B     .hg/store/data/src/test/resources/net/sf/alchim/spoon/contrib/launcher/artifact/sample1.xml.i
  B     .hg/store/data/src/assembly/project.xml.i
  B     .hg/store/data/.hgtags.i
  B     .hg/store/00manifest.i
  B     .hg/store/00changelog.i
 !????? .hg/store/undo
 !????? .hg/requires
 !????? .hg/00changelog.i
 !????? .hg/hgrc
  B     .hg/dirstate
 !????? .hg/branches.cache
  B     .hg/undo.dirstate
 !????? .hg/branch.cache
 
 *****************************************************
 Printing headers for files without AL header...
 
 
 =======================================================================
 ==src/main/java/net/sf/alchim/spoon/contrib/launcher/SpoonletXmlHandler.java
 =======================================================================
 /*
 * Spoon - http://net.sf.alchim.spoon.gforge.inria.fr/
 * Copyright (C) 2006 INRIA Futurs <renaud.pawlak@inria.fr>
 *
 * This software is governed by the CeCILL-C License under French law and
 * abiding by the rules of distribution of free software. You can use, modify
 * and/or redistribute the software under the terms of the CeCILL-C license as
 * circulated by CEA, CNRS and INRIA at http://www.cecill.info.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL-C License for more details.
 *
 * The fact that you are presently reading this means that you have had
 * knowledge of the CeCILL-C license and that you accept its terms.
 */

package net.sf.alchim.spoon.contrib.launcher;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import net.sf.alchim.spoon.contrib.misc.CtFile4ResourceStream;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;

import spoon.reflect.Factory;
import spoon.support.builder.CtFile;
import spoon.support.builder.CtResource;
import spoon.support.processing.XmlProcessorProperties;

/**
 * This class defines the SAX handler to parse a Spoonlet deployment descriptor
 * file.
 */
public class SpoonletXmlHandler extends DefaultHandler {

    public static void load(CtFile cfgFile, Factory factory, List<String> processors, Collection<CtResource> templates, List<CtFile> spoonletIndex) throws Exception {
        XMLReader xr = XMLReaderFactory.createXMLReader();
        SpoonletXmlHandler loader = new SpoonletXmlHandler(factory, processors, templates, spoonletIndex);
        xr.setContentHandler(loader);
        InputStream stream = cfgFile.getContent();
        xr.parse(new InputSource(stream));

 =======================================================================
 ==src/main/java/net/sf/alchim/spoon/contrib/launcher/artifact/DomHelper.java
 =======================================================================
 package net.sf.alchim.spoon.contrib.launcher.artifact;

import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

class DomHelper {

    protected static Node read(InputStream xml) throws Exception {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        return builder.parse(xml).getDocumentElement();
    }

    protected static Node read(File xml) throws Exception {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        return builder.parse(xml).getDocumentElement();
    }

    /**
     * Simple value finder
     *
     * @param fromnode node from when we start deep search
     * @param name the node name
     * @return the value of the first matching node or null
     */
    protected static String findFirstValue(Node fromnode, String name) {
        Node node = findFirst(fromnode, name);
        return (node == null)?null:node.getFirstChild().getNodeValue().trim();
    }

    /**
     * Simple value finder
     *
     * @param fromnode node from when we start deep search
     * @param name the node name
     * @return the value of the first matching node or null
     */
    protected static Element findFirst(Node fromnode, String name) {
        NodeList nodelist = fromnode.getChildNodes();
        for (int i = 0; i < nodelist.getLength(); i++) {

 =======================================================================
 ==src/main/java/net/sf/alchim/spoon/contrib/launcher/artifact/Repository.java
 =======================================================================
 package net.sf.alchim.spoon.contrib.launcher.artifact;

import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;

/**
 * A repository that use local file system to store/cache artifact's files (jar,
 * pom, md5). If remote repository url are added, then it will download the
 * artifact's files from remotes repositories (first found) into its local file
 * system.
 *
 * It's a very basic implementation, but enough for lot of case.
 *
 * <br>
 * The basic usage is :
 *
 * <pre>
 *    Repository repo = new Repository(); // use the m2 repository as default
 *    ...
 *    Artifact artifact = new Artifact(...);
 *    repo.load(artifact);
 *    ...
 *    artifact.getJarURL();
 * </pre>
 *
 * @author dwayne
 *
 */
public class Repository {
    private final File localRoot_;

    private final List<URL> remoteRoots_;

    public Repository() throws Exception {
        this(null);
    }

    public Repository(File localroot) throws Exception {
        if (localroot == null) {
            localroot = searchLocalM2Repository();
        }
        if (localroot.exists()) {
            if (!localroot.isDirectory()) {

 =======================================================================
 ==src/main/java/net/sf/alchim/spoon/contrib/launcher/artifact/UrlHelper.java
 =======================================================================
 package net.sf.alchim.spoon.contrib.launcher.artifact;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

import org.codehaus.plexus.util.IOUtil;

class UrlHelper {

    // TODO
    public static boolean exists(URL url) throws Exception {
        if ("http".equals(url.getProtocol())) {
            HttpURLConnection cnx = (HttpURLConnection)url.openConnection();
            return (HttpURLConnection.HTTP_OK == cnx.getResponseCode());
        } else if ("file".equals(url.getProtocol())) {
            File f = new File(url.getPath());
            return f.exists();
        }
        throw new UnsupportedOperationException("only 'http' and 'file' protocol supported :" + url.getProtocol());
    }

    public static void download(URL src, File dest) throws Exception {
        System.out.println("download :" + src);
        OutputStream out = null;
        InputStream in = null;
        try {
            out = new FileOutputStream(dest);
            URLConnection cnx = src.openConnection();
            in = cnx.getInputStream();
            IOUtil.copy(in, out);
        } finally {
            IOUtil.close(in);
            IOUtil.close(out);
        }
    }
}

 =======================================================================
 ==src/main/java/net/sf/alchim/spoon/contrib/launcher/artifact/MD5Helper.java
 =======================================================================
 package net.sf.alchim.spoon.contrib.launcher.artifact;

import java.io.File;
import java.io.FileInputStream;
import java.security.MessageDigest;

import org.apache.maven.doxia.util.FileUtil;
import org.codehaus.plexus.util.IOUtil;

class MD5Helper {

    public static byte[] createChecksum(File filename) throws Exception {
        FileInputStream fis = null;
        try {
            fis = new FileInputStream(filename);
            byte[] buffer = IOUtil.toByteArray(fis);
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            return md5.digest(buffer);
        } finally {
            IOUtil.close(fis);
        }
    }

    public static String getMD5Checksum(File file) throws Exception {
        byte[] b = createChecksum(file);
        String result = "";
        for (byte element : b) {
            result += Integer.toString((element & 0xff) + 0x100, 16).substring(1);
        }
        return result;
    }

    public static boolean checksum(File fileToCheck, File expectedMD5File) throws Exception {
        String actualMD5 = getMD5Checksum(fileToCheck);
        String expectedMD5 = FileUtil.loadString(expectedMD5File.getAbsolutePath());//, "UTF-8");
        return expectedMD5.equals(actualMD5);
    }
}

 =======================================================================
 ==src/main/java/net/sf/alchim/spoon/contrib/launcher/artifact/Pom.java
 =======================================================================
 package net.sf.alchim.spoon.contrib.launcher.artifact;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.w3c.dom.Element;
import org.w3c.dom.Node;

class Pom {
    private final File file_;

    private Node rootNode_; // lazy loading

    protected Pom(File pom) throws Exception {
        file_ = pom;
    }

    protected String findRelocation() throws Exception {
        Node relocation = DomHelper.findFirst(getRootNode(), "relocation");
        if (relocation != null) {
            String newGroupId = DomHelper.findFirstValue(relocation, "groupId");
            if (newGroupId != null) {
                return newGroupId;
            }
            throw new UnsupportedOperationException("only groupId relocation is supported");
        }
        return null;
    }

    private Node getRootNode() throws Exception {
        if (rootNode_ == null) {
            rootNode_ = DomHelper.read(file_);
        }
        return rootNode_;
    }

    private String findGroupId() throws Exception {
        return DomHelper.findFirstValue(getRootNode(), "groupId");
    }

    private String findVersion() throws Exception {
        return DomHelper.findFirstValue(getRootNode(), "version");
    }

    protected Artifact findParent() throws Exception {
        Element element = DomHelper.findFirst(getRootNode(), "parent");
        element.normalize();
        String groupId = DomHelper.findFirstValue(element, "groupId");
        String artifactId = DomHelper.findFirstValue(element, "artifactId");

 =======================================================================
 ==src/main/java/net/sf/alchim/spoon/contrib/launcher/artifact/Artifact.java
 =======================================================================
 /*
 * BSD License http://pomstrap.prefetch.com/bsd-license.html
 * Copyright (c) 2005, POMStrap Project http://pomstrap.prefetch.com
 * All rights reserved.
 *
 * This software consists of voluntary contributions made by many
 * individuals on behalf of the POMStrap project. For more
 * information on the POMStrap project, please see
 * http://pomstrap.prefetch.com
 */
package net.sf.alchim.spoon.contrib.launcher.artifact;

import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;


/**
 * A representation of a Maven2 dependency as described in the project file
 * (pom.xml). Hold method to scan the target dependency related pom.xml file,
 * and by the way, its dependency (if any). The dependency pom.xml file could be
 * in local repository or in a remote (if maven2.repository.url property is
 * provided). The xml is loaded and analysed using basic DOM method provided in
 * current JDK.
 * 
 * @author AlAg
 * @author dwayne
 * @based on pomstart
 */
public class Artifact {
    private String groupId_;

    private String artifactId_;

    private String version_;

    protected Pom pom;

    protected File jar;

    protected File md5;

    protected Repository repository;

    private List<Artifact> childs;

    /**
     * Simple constructor

 =======================================================================
 ==src/main/java/net/sf/alchim/spoon/contrib/launcher/Launcher.java
 =======================================================================
 package net.sf.alchim.spoon.contrib.launcher;

import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Pattern;

import org.codehaus.classworlds.ClassRealm;
import org.codehaus.classworlds.ClassWorld;

import spoon.processing.Environment;
import spoon.processing.Severity;

import net.sf.alchim.spoon.contrib.launcher.artifact.Artifact;
import net.sf.alchim.spoon.contrib.launcher.artifact.Repository;
import net.sf.alchim.spoon.contrib.misc.ClasspathHelper;
import net.sf.alchim.spoon.contrib.misc.PathHelper;


/**
 * Apply a set of spoonlet and Spoon's processor.
 */
public class Launcher {

    public final static String SPOON_CFG = "spoon.cfg";

    public static final String SRC_ROOTS = "spoon.src.roots";

    private List<String> sources_ = new ArrayList<String>();

    private Environment env_;

    /**
     * initialize and run a LauncherImpl.
     *
     * @param sources
     *            list of the source directories containing the sources to be
     *            processed.
     * @param processors
     *            List of processors' class to apply.
     * @param env
     *            the running environnment
     * @throws Exception
     */
    public void run(File cfg, List<String> sources, List<String> dependencies, Environment env) throws Throwable {
        if (cfg == null) {

 =======================================================================
 ==src/main/java/net/sf/alchim/spoon/contrib/launcher/SpoonCfgXmlHandler.java
 =======================================================================
 /*
 * Spoon - http://net.sf.alchim.spoon.gforge.inria.fr/
 * Copyright (C) 2006 INRIA Futurs <renaud.pawlak@inria.fr>
 *
 * This software is governed by the CeCILL-C License under French law and
 * abiding by the rules of distribution of free software. You can use, modify
 * and/or redistribute the software under the terms of the CeCILL-C license as
 * circulated by CEA, CNRS and INRIA at http://www.cecill.info.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL-C License for more details.
 *
 * The fact that you are presently reading this means that you have had
 * knowledge of the CeCILL-C license and that you accept its terms.
 */

package net.sf.alchim.spoon.contrib.launcher;

import java.io.File;
import java.net.URL;
import java.util.List;


import net.sf.alchim.spoon.contrib.launcher.artifact.Artifact;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;




/**
 * This class defines the SAX handler to parse a Spoonlet deployment descriptor
 * file.
 */
public class SpoonCfgXmlHandler extends DefaultHandler {

    public static void searchSpoonlets(File file, List<URL> remoteRoots, List<Artifact> artifacts) throws Exception {
        XMLReader xr = XMLReaderFactory.createXMLReader();
        SpoonCfgXmlHandler loader = new SpoonCfgXmlHandler(remoteRoots, artifacts);
        xr.setContentHandler(loader);
        xr.parse(file.getAbsolutePath());
    }

    private List<Artifact> artifacts_;


 =======================================================================
 ==src/main/java/net/sf/alchim/spoon/contrib/launcher/SubLauncher.java
 =======================================================================
 package net.sf.alchim.spoon.contrib.launcher;

import java.io.File;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;

import spoon.processing.Builder;
import spoon.processing.Environment;
import spoon.processing.ProcessingManager;
import spoon.processing.Processor;
import spoon.reflect.Factory;
import spoon.support.DefaultCoreFactory;
import spoon.support.QueueProcessingManager;
import spoon.support.builder.CtFile;
import spoon.support.builder.CtFolder;
import spoon.support.builder.CtResource;
import spoon.support.builder.SpoonBuildingManager;
import spoon.support.builder.support.CtFileFile;
import spoon.support.builder.support.CtFolderFile;
import spoon.support.builder.support.CtFolderZip;

/**
 * Apply a set of spoonlet and Spoon's processor.
 */
public class SubLauncher {

    private List<String> sources_ = new ArrayList<String>();

    private final List<String> processors_ = new ArrayList<String>();

    private Environment env_;

    private final HashSet<CtResource> ctTemplates_ = new HashSet<CtResource>();

    private Factory factory_;

    /**
     * initialize and run a LauncherImpl.
     *
     * @param sources list of the source directories containing the sources to
     *            be processed.
     * @param processors List of processors' class to apply.
     * @param env the running environnment
     * @throws Exception
     */
    public void run(List<String> sources, Environment env, File cfg, List<File> spoonlets) throws Throwable {
        sources_ = new ArrayList<String>();
        sources_.addAll(sources);
        env_ = env;

 =======================================================================
 ==src/main/java/net/sf/alchim/spoon/contrib/maven/CleanCompileMojo.java
 =======================================================================
 package net.sf.alchim.spoon.contrib.maven;

import java.util.List;

/**
 * Restore sourceDirectory to original.
 * @goal clean
 * @phase compile
 *
 * @author dwayne
 */
public class CleanCompileMojo extends AbstractCleanMojo {

    @SuppressWarnings({ "unchecked", "cast" })
    @Override
    protected List<String> getSourceRoots() throws Exception {
        return (List<String>)project.getCompileSourceRoots();
    }

}

 =======================================================================
 ==src/main/java/net/sf/alchim/spoon/contrib/maven/CleanTestCompileMojo.java
 =======================================================================
 package net.sf.alchim.spoon.contrib.maven;

import java.util.List;

/**
 * Restore sourceDirectory to original.
 *
 * @goal test-clean
 * @phase package
 *
 * @author dwayne
 */
public class CleanTestCompileMojo extends AbstractCleanMojo {

    @SuppressWarnings({ "unchecked", "cast" })
    @Override()
    protected List<String> getSourceRoots() throws Exception {
        return (List<String>)project.getTestCompileSourceRoots();
    }

}

 =======================================================================
 ==src/main/java/net/sf/alchim/spoon/contrib/maven/SpoonGenSrcMojo.java
 =======================================================================
 package net.sf.alchim.spoon.contrib.maven;

import java.io.File;
import java.util.List;

/**
 * Apply a set of spoonlet on main source and generate the java files.
 * @goal generate
 * @phase generate-sources
 * @requiresDependencyResolution compile
 */
public class SpoonGenSrcMojo extends AbstractSpoonMojo {
    /**
     * The directory for generated java files.
     *
     * @parameter expression="${maven.spoon.srcOutputDirectory}" default-value="${project.build.directory}/generated-sources/spoon"
     */
    protected File srcOutputDirectory;

    /**
     * Set to false, if you don't want to generate java sources file
     * (usefull, if only use spoonlet as Analyzer).
     *
     * @parameter expression="${maven.spoon.generateSources}" default-value="true"
     */
    protected boolean generateSources;

    @SuppressWarnings("unchecked")
    @Override
    protected List<String> getSourceRoots() throws Exception {
        return project.getCompileSourceRoots();
    }

    @Override
    protected File getSrcOutputDir() throws Exception {
        if (generateSources) {
            return srcOutputDirectory;
        }
        return null;
    }

    @Override
    protected File getClassesOutputDir() throws Exception {
        return null;
    }
}

 =======================================================================
 ==src/main/java/net/sf/alchim/spoon/contrib/maven/AbstractSpoonMojo.java
 =======================================================================
 package net.sf.alchim.spoon.contrib.maven;


import java.io.File;
import java.util.List;

import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.project.MavenProject;

import spoon.processing.FileGenerator;
import spoon.support.ByteCodeOutputProcessor;
import spoon.support.JavaOutputProcessor;

import net.sf.alchim.spoon.contrib.launcher.Launcher;

/**
 * Apply a set of spoonlet and Spoon's processor.
 */
public abstract class AbstractSpoonMojo extends AbstractMojo {
    protected boolean compileCode = false;

    /**
     * Set the jdk compliance level.
     *
     * @parameter expression="${maven.spoon.compliance}" default-value="5"
     */
    protected int compliance = 5;

    /**
     * Set to true to include debugging information in the compiled class files.
     *
     * @parameter expression="${maven.spoon.debug}" default-value="false"
     */
    protected boolean debug;

    /**
     * Set to true to show messages about what the compiler is doing.
     *
     * @parameter expression="${maven.spoon.verbose}" default-value="true"
     */
    protected boolean verbose;

    /**
     * Set to true to show messages about what the compiler is doing.
     *
     * @parameter expression="${maven.spoon.cfg}" default-value="${basedir}/spoon.cfg.xml"
     */
    protected File cfg;


 =======================================================================
 ==src/main/java/net/sf/alchim/spoon/contrib/maven/AbstractCleanMojo.java
 =======================================================================
     package net.sf.alchim.spoon.contrib.maven;


import java.util.List;

import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.project.MavenProject;

import net.sf.alchim.spoon.contrib.launcher.Launcher;
import net.sf.alchim.spoon.contrib.misc.PathHelper;

/**
 * Restore sourceDirectory to original.
 *
 * @author dwayne
 */
public abstract class AbstractCleanMojo extends AbstractMojo {
    /**
     * @parameter expression="${project}"
     * @required
     * @readonly
     */
    protected MavenProject project;

    abstract protected List<String> getSourceRoots() throws Exception;

    public void execute() throws MojoExecutionException {
        try {
            String pathList = System.getProperty(Launcher.SRC_ROOTS);
            if (pathList == null) {
                getLog().info("nothing to restore");
                return;
            }
            getLog().info("restore source directories to original");
            List<String> l = getSourceRoots();
            if ( l != null ) {
                l.clear();
                l.addAll(PathHelper.split(pathList));
            }
        } catch (Exception exc) {
            throw new MojoExecutionException("fail to execute", exc);
        }
    }

}

 =======================================================================
 ==src/main/java/net/sf/alchim/spoon/contrib/maven/MavenEnvironment.java
 =======================================================================
 package net.sf.alchim.spoon.contrib.maven;

import java.io.File;
import java.io.FileWriter;

import org.apache.maven.plugin.logging.Log;
import org.codehaus.plexus.util.FileUtils;
import org.codehaus.plexus.util.IOUtil;

import spoon.processing.ProblemFixer;
import spoon.processing.Processor;
import spoon.processing.Severity;
import spoon.reflect.declaration.CtElement;
import spoon.support.StandardEnvironment;

@SuppressWarnings("serial")
class MavenEnvironment extends StandardEnvironment {
    private final Log logger_;
    private int warningCount_;
    private int errorCount_;
    private FileWriter reportDataWriter_;

    public MavenEnvironment(Log log, File reportDataFile) throws Exception {
        logger_ = log;
        if (reportDataFile != null) {
            FileUtils.forceDelete(reportDataFile);
            reportDataFile.getParentFile().mkdirs();
            reportDataWriter_ = new FileWriter(reportDataFile);
        }
    }

    @Override()
    public void debugMessage(String msg) {
        logger_.debug(msg);
    }

    @Override
    public void setDebug(boolean v) {
        if (logger_.isDebugEnabled() != v) {
            logger_.warn("can't change logger level to debug = " + v);
        }
    }

    @Override
    public boolean isDebug() {
        return logger_.isDebugEnabled();
    }

    @Override
    public void setVerbose(boolean v) {

 =======================================================================
 ==src/main/java/net/sf/alchim/spoon/contrib/maven/SpoonCompileMojo.java
 =======================================================================
 package net.sf.alchim.spoon.contrib.maven;

import java.io.File;
import java.util.List;

/**
 * Apply a set of spoonlets after compilation of original java, and recompile the resulting java files.
 *
 * @goal recompile
 * @phase compile
 * @requiresDependencyResolution compile
 */
public class SpoonCompileMojo extends AbstractSpoonMojo {
    /**
     * The directory for generated java files.
     *
     * @parameter expression="${maven.spoon.srcOutputDirectory}" default-value="${project.build.directory}/generated-sources/spoon"
     */
    protected File srcOutputDirectory;

    /**
     * The directory for generated java files.
     *
     * @parameter expression="${maven.spoon.classesOutputDirectory}" default-value="${project.build.directory}/classes"
     */
    protected File classesOutputDirectory;

    @SuppressWarnings("unchecked")
    @Override
    protected List<String> getSourceRoots() throws Exception {
        return project.getCompileSourceRoots();
    }

    @Override
    protected File getSrcOutputDir() throws Exception {
        return srcOutputDirectory;
    }

    @Override
    protected void updateSourceRoots() throws Exception {
    }

    @Override
    protected File getClassesOutputDir() throws Exception {
        return classesOutputDirectory;
    }

}

 =======================================================================
 ==src/main/java/net/sf/alchim/spoon/contrib/maven/SpoonTestCompileMojo.java
 =======================================================================
 package net.sf.alchim.spoon.contrib.maven;

import java.io.File;
import java.util.List;

/**
 * Apply a set of spoonlet on test source.
 *
 * @goal test-recompile
 * @phase test-compile
 * @requiresDependencyResolution test
 */
public class SpoonTestCompileMojo extends AbstractSpoonMojo {
    /**
     * The directory for generated java files.
     *
     * @parameter expression=="${maven.spoon.test.srcOutputDirectory}" default-value="${project.build.directory}/generated-test-sources/spoon"
     */
    protected File srcOutputDirectory;

    /**
     * The directory for generated java files.
     *
     * @parameter expression="${maven.spoon.test.classesOutputDirectory}" default-value="${project.build.directory}/test-classes"
     */
    protected File classesOutputDirectory;


    @SuppressWarnings("unchecked")
    @Override()
    protected List<String> getSourceRoots() throws Exception {
        return project.getTestCompileSourceRoots();
    }

    @Override
    protected File getSrcOutputDir() throws Exception {
        return srcOutputDirectory;
    }

    @SuppressWarnings("unchecked")
    @Override
    protected List<String> getCompileDependencies() throws Exception {
        return project.getTestClasspathElements();
    }

    @Override
    protected File getClassesOutputDir() throws Exception {
        return classesOutputDirectory;
    }


 =======================================================================
 ==src/main/java/net/sf/alchim/spoon/contrib/maven/SpoonTestGenSrcMojo.java
 =======================================================================
 package net.sf.alchim.spoon.contrib.maven;

import java.io.File;
import java.util.List;

/**
 * Apply a set of spoonlet on test source.
 *
 * @goal test-generate
 * @phase generate-test-sources
 * @requiresDependencyResolution test
 */
public class SpoonTestGenSrcMojo extends AbstractSpoonMojo {
    /**
     * The directory for generated java files.
     *
     * @parameter expression=="${maven.spoon.test.srcOutputDirectory}" default-value="${project.build.directory}/generated-test-sources/spoon"
     */
    protected File srcOutputDirectory;

    @SuppressWarnings("unchecked")
    @Override()
    protected List<String> getSourceRoots() throws Exception {
        return project.getTestCompileSourceRoots();
    }

    @Override
    protected File getSrcOutputDir() throws Exception {
        return srcOutputDirectory;
    }

    @SuppressWarnings("unchecked")
    @Override
    protected List<String> getCompileDependencies() throws Exception {
        return project.getTestClasspathElements();
    }

    @Override
    protected File getClassesOutputDir() throws Exception {
        return null;
    }

}

 =======================================================================
 ==src/main/java/net/sf/alchim/spoon/contrib/maven/SpoonReportMojo.java
 =======================================================================
 package net.sf.alchim.spoon.contrib.maven;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.net.URL;
import java.util.Iterator;
import java.util.Locale;
import java.util.ResourceBundle;

import org.apache.maven.doxia.siterenderer.Renderer;
import org.apache.maven.model.ReportPlugin;
import org.apache.maven.project.MavenProject;
import org.apache.maven.reporting.AbstractMavenReport;
import org.apache.maven.reporting.MavenReportException;
import org.codehaus.plexus.util.FileUtils;
import org.codehaus.plexus.util.IOUtil;
import org.codehaus.plexus.util.PathTool;
import org.codehaus.plexus.util.StringUtils;

/**
 * @description Generates a Spoon Html Report.
 * @goal report-only
 * @execute phase="compile"
 * @requiresDependencyResolution
 * @requiresProject
 *
 * @author David Bernard (dwayne)
 * @created 2007
 */
public class SpoonReportMojo extends AbstractMavenReport {
    /**
     * Location where generated html will be created.
     *
     * @parameter default-value="${project.reporting.outputDirectory}"
     */
    protected String outputDirectory;

    /**
     * Doxia Site Renderer.
     *
     * @parameter expression="${component.org.apache.maven.doxia.siterenderer.Renderer}"
     */
    protected Renderer siteRenderer;

    /**
     * Maven Project
     *
     * @parameter expression="${project}"
     */

 =======================================================================
 ==src/main/java/net/sf/alchim/spoon/contrib/maven/SpoonReportGenerator.java
 =======================================================================
 package net.sf.alchim.spoon.contrib.maven;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.ResourceBundle;

import org.apache.maven.doxia.sink.Sink;

import net.sf.alchim.spoon.contrib.maven.SpoonReportData.GroupBy;
import net.sf.alchim.spoon.contrib.maven.SpoonReportData.LineInfo;
import net.sf.alchim.spoon.contrib.maven.SpoonReportData.Severity;

class SpoonReportGenerator {
    private Sink sink_;
    private ResourceBundle bundle_;
    private String xrefLocationBase_;

    SpoonReportGenerator(Sink sink, ResourceBundle bundle, String xrefLocationBase) {
        sink_ = sink;
        bundle_ = bundle;
        xrefLocationBase_ = xrefLocationBase;
    }

    public void doGenerateReport(SpoonReportData data) throws Exception {
        beginReport();
        printSummary(data);
        printGroupBy(data.groupByProcessorClassList, "processors", "classes");
        printGroupBy(data.groupByClassProcessorList, "classes", "processors");
        endReport();
    }

    private String getString(String key) {
        return bundle_.getString("report.spoon." + key);
    }

    private void beginReport() {
        sink_.head();
        sink_.title();
        sink_.text(getString("title"));
        sink_.title_();
        StringBuilder str = new StringBuilder();
        str.append("<script type='text/javascript'>\n");
        str.append("function toggleDisplay(elementId) {\n");
        str.append("  var elm = document.getElementById(elementId);\n");
        str.append("  if (elm && typeof elm.style != 'undefined') {\n");
        str.append("    if (elm.style.display == 'none') {\n");
        str.append("      elm.style.display = '';\n");
        str.append("      document.getElementById(elementId + '_on').style.display = 'none';\n");
        str.append("      document.getElementById(elementId + '_off').style.display = 'inline';\n");

 =======================================================================
 ==src/main/java/net/sf/alchim/spoon/contrib/maven/SpoonReportData.java
 =======================================================================
 package net.sf.alchim.spoon.contrib.maven;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

class SpoonReportData {

    enum Severity {ERROR, WARNING, MESSAGE };

    private Map<String, GroupBy> groupByProcessorClassMap_;
    private Map<String, GroupBy> groupByClassProcessorMap_;

    List<GroupBy> groupByProcessorClassList;
    List<GroupBy> groupByClassProcessorList;
    Counter total;

    public void begin() {
        groupByProcessorClassMap_ = new TreeMap<String, GroupBy>();
        groupByClassProcessorMap_ = new TreeMap<String, GroupBy>();
        total = new Counter();
    }

    public void add(String processorName, String className, String lineNumber, String severity, String msg) {
        LineInfo line = new LineInfo();
        line.line = Integer.parseInt(lineNumber);
        try {
            line.severity = Severity.valueOf(severity);
        } catch (IllegalArgumentException exc) {
            line.severity = null;
        }
        line.msg = msg;
        line.className = className;

        total.add(line.severity);
        add(groupByProcessorClassMap_, processorName, className, line);
        add(groupByClassProcessorMap_, className, processorName, line);
    }

    private void add(Map<String, GroupBy> groups, String l2, String l1, LineInfo line) {
        GroupBy group = groups.get(l2);
        if (group == null) {
            group = new GroupBy(l2);
            groups.put(l2, group);
        }
        group.add(l1, line);
    }

 =======================================================================
 ==src/main/java/net/sf/alchim/spoon/contrib/misc/ClasspathHelper.java
 =======================================================================
 package net.sf.alchim.spoon.contrib.misc;

import java.io.File;
import java.net.JarURLConnection;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.jar.JarEntry;

public class ClasspathHelper {

    public static void dump(ClassLoader cl, boolean scanJar) throws Exception {
        if (cl == null) {
            cl = Thread.currentThread().getContextClassLoader();
        }
        System.out.println("java.class.path " + System.getProperty("java.class.path"));
        System.out.println("dump list of resources available from " + cl + "(scanJar :" + scanJar +")");
        List<URL> l = scan(cl, scanJar);
        for(URL url : l) {
            System.out.println("\t" + url);
        }
    }

    public static void setClasspathProperty(ClassLoader cl) throws Exception {
        System.setProperty("java.class.path", toClasspathString(cl));
    }

    public static String toClasspathString(ClassLoader cl) throws Exception {
        if (cl == null) {
            cl = Thread.currentThread().getContextClassLoader();
        }
        StringBuilder back = new StringBuilder();
        while (cl != null) {
            if (cl instanceof URLClassLoader) {
                URLClassLoader ucl = (URLClassLoader) cl;
                URL[] urls = ucl.getURLs();
                for (URL url: urls) {
                    if (back.length() != 0) {
                        back.append(File.pathSeparatorChar);
                    }
                    back.append(url.getFile());
                }
            }
            cl = cl.getParent();
        }
        return back.toString();
    }


 =======================================================================
 ==src/main/java/net/sf/alchim/spoon/contrib/misc/PathHelper.java
 =======================================================================
 package net.sf.alchim.spoon.contrib.misc;

import java.io.File;
import java.util.Arrays;
import java.util.List;

public class PathHelper {
    
    public static String join(List<String> pathList) throws Exception {
        StringBuilder buff = new StringBuilder();
        for(String path: pathList) {
            buff.append(path).append(File.pathSeparatorChar); //work on Unix and windows
        }
        return buff.toString();
    }
    
    public static List<String> split(String pathList) throws Exception {
        String[] back = pathList.split(File.pathSeparator);
        return Arrays.asList(back);
    }
}

 =======================================================================
 ==src/main/java/net/sf/alchim/spoon/contrib/misc/CtFile4ResourceStream.java
 =======================================================================
 package net.sf.alchim.spoon.contrib.misc;

import java.io.InputStream;

import spoon.support.builder.CtFile;
import spoon.support.builder.CtFolder;

public class CtFile4ResourceStream implements CtFile {

    private final String name_;
    private final String rpath_;

    public CtFile4ResourceStream(Class<?> clazz) throws Exception {
        this(clazz.getName());
    }

    public CtFile4ResourceStream(String name) throws Exception {
        this(name, name.replace('.', '/')+".java");
    }

    public CtFile4ResourceStream(String name, String rpath) throws IllegalArgumentException {
        if (name == null) {
            name = rpath.substring(0, rpath.indexOf(".java")).replace('\\', '/').replace('/', '.');
        }
        if (Thread.currentThread().getContextClassLoader().getResource(rpath) == null) {
            if (Thread.currentThread().getContextClassLoader().getResource(rpath+".txt") == null) {
                throw new IllegalArgumentException("resource not found for :" + rpath);
            }
            rpath = rpath +".txt";
        }
        rpath_ = rpath;
        name_ = name;
    }

    public InputStream getContent() {
        InputStream back = Thread.currentThread().getContextClassLoader().getResourceAsStream(rpath_);
        if (back == null) {
            throw new IllegalStateException("content is null for " + rpath_);
        }
        return back;
    }

    public boolean isJava() {
        return true;
    }

    public String getName() {
        String qname = name_;
        qname = qname.replace('.', '/');
        qname = qname.replace('\\', '/');

 =======================================================================
 ==src/main/resources/spoon-report.properties
 =======================================================================
 report.spoon.column.processors=Processors/Analyzers
report.spoon.column.classes=Classes
report.spoon.column.infos=Infos
report.spoon.column.warnings=Warnings
report.spoon.column.errors=Errors
report.spoon.column.severity=Severity
report.spoon.column.msg=Message
report.spoon.column.line=Line

report.spoon.description=Generates a source code report with the Spoon Library.
#report.spoon.detailslink=http://spoon.sourceforge.net/bugDescriptions.html
report.spoon.title=Spoon Report
report.spoon.summary=Summary
report.spoon.javasources=Found java sources (Class files):
report.spoon.link=http://spoon.gforge.inria.fr/
report.spoon.linktitle=The following document contains the results of
report.spoon.name=Spoon(let)s
report.spoon.noline=Not available
report.spoon.sourceRoot=Using source root:
report.spoon.versiontitle=Spoon Version is

 =======================================================================
 ==src/site/resources/css/site.css
 =======================================================================
 body {
    background-color: #fff;
    font-family: Verdana, Helvetica, Arial, sans-serif;
    margin-left: auto;
    margin-right: auto;
    background-repeat: repeat-y;
    font-size: 13px;
    padding: 0px;
}

table,table td,table th {
    border-radius: 4px;
    -moz-border-radius: 4px !important;
}

#leftColumn {
    width: 170px;
    float: left;
}

#bodyColumn {
    margin-right: 1.5em;
    margin-left: 197px;
}

td,select,input,li {
    font-family: Verdana, Helvetica, Arial, sans-serif;
    font-size: 12px;
    color: #333333;
}

code {
    font-size: 12px;
}

a {
    text-decoration: none;
}

a:link {
    color: #47a;
}

a:visited {
    color: #666666;
}

a:active,a:hover {
    color: #990000;
}

 =======================================================================
 ==src/site/xdoc/usage.xml
 =======================================================================
 <document>
<properties>
  <author email="dwayneb@users.sourceforge.net">David Bernard</author>
  </properties>
  <meta name="keyword" content="java, spoon, spoonlet, maven"/>
 <body>
 <section name="Usage">
 The plugin need jdk 1.5+ to run (like Spoon).
 <subsection name="Add the plugin to pom">
 <source><![CDATA[
 <project>
...
  <build>
    <plugins>
...
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.5</source>
          <target>1.5</target>
        </configuration>
      </plugin>
      <plugin>
        <groupId>net.sf.alchim</groupId>
        <artifactId>spoon-maven-plugin</artifactId>
        <version>0.7</version>
        <executions>
          <execution>
            <goals>
              <goal>recompile</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
...
    </plugins>
  </build>
...
  <reporting>
    <plugins>
...
      <!-- generate an html report from spoonlet execution -->
      <plugin>
        <groupId>net.sf.alchim</groupId>
        <artifactId>spoon-maven-plugin</artifactId>
        <version>0.7</version>
      </plugin>
...      
    </plugins>

 =======================================================================
 ==src/site/site.xml
 =======================================================================
 <?xml version="1.0" encoding="UTF-8"?>
<project>
  <bannerLeft>
    <name>Spoon Maven Plugin</name>
    <href>http://alchim.sf.net/spoon-maven-plugin</href>
  </bannerLeft>
  <bannerRight>
    <name>Spoon</name>
    <src>http://spoon.gforge.inria.fr/pub/images/spoon.jpg</src>
    <href>http://spoon.gforge.inria.fr/</href>
  </bannerRight>
  <publishDate position="left" format="yyyy-MM-dd HH:mm" />
  <version position="left"/>

  <poweredBy>
    <logo name="Hosted on SourceForge.net" href="http://sourceforge.net" img="http://sflogo.sourceforge.net/sflogo.php?group_id=65041&amp;type=2" />
    <logo name="Build with Maven 2" href="http://maven.apache.org" img="images/logos/maven-feather.png" />
    <logo name="CC-GNU LGPL" href="http://creativecommons.org/licenses/LGPL/2.1/" img="http://creativecommons.org/images/public/cc-LGPL-a.png" />
  </poweredBy>

  <body>
    <links>
      <item name="download" href="../download/releases/" />
      <item name="changelog" href="../hg/spoon-maven-plugin/"/>
      <item name="sourceforge" href="http://sf.net/projects/alchim" />
    </links>

    <menu name="Overview">
      <item name="Introduction" href="index.html" />
      <item name="Goals" href="plugin-info.html" />
      <item name="Usage" href="usage.html" />
      <!-- item name="FAQ" href="faq.html" /-->
    </menu>
<!--
    <menu name="Examples">
      <item name="description1" href="examples/example-one.html" />
      <item name="description2" href="examples/example-two.html" />
    </menu>
 -->
    <menu ref="reports" />
  </body>
</project>

 =======================================================================
 ==src/sandbox/java/MyJavaOutputProcessor.java
 =======================================================================
 package spoon.contrib.maven;

import java.io.File;

import spoon.reflect.declaration.CtSimpleType;
import spoon.support.JavaOutputProcessor;

public class MyJavaOutputProcessor extends JavaOutputProcessor {
    int count;

    public MyJavaOutputProcessor(File arg0) {
        super(arg0);
    }

    public void process(CtSimpleType<?> type) {
        System.err.println("count :" + count++);
        if (type.isTopLevel()) {
            System.err.println("create :" + type.getQualifiedName());
            createJavaFile(type);
        }
    }

}

 =======================================================================
 ==src/sandbox/java/CounterProcessor.java
 =======================================================================
 package spoon.contrib.maven;

import spoon.processing.AbstractProcessor;
import spoon.reflect.declaration.CtElement;

public class CounterProcessor extends AbstractProcessor<CtElement> {
    public int count = 0;

    public void process(CtElement arg0) {
        if (count++ < 20) {
            System.err.println("counter :" + arg0.getClass());
        }
    }

}

 =======================================================================
 ==src/sandbox/java/Spoonlet.java
 =======================================================================
 package spoon.contrib.maven;

import java.io.File;

public class Spoonlet {
    public String groupId;
    public String artifactId;
    public String version;
    public File jar;
}

 =======================================================================
 ==src/sandbox/java/RunProcessorsMojo.java
 =======================================================================
 package spoon.contrib.maven;

import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.descriptor.PluginDescriptor;
import org.codehaus.classworlds.ClassRealm;

import spoon.processing.Environment;
import spoon.support.JavaOutputProcessor;

import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * Apply a set of spoonlet and Spoon's processor.
 *
 * @goal run
 * @requiresDependencyResolution compile
 */
public class RunProcessorsMojo extends AbstractMojo {

    /**
     * The source directories containing the sources to be compiled.
     *
     * @parameter expression="${project.compileSourceRoots}"
     * @required
     * @readonly
     */
    private List<String> compileSourceRoots;

    /**
     * Project classpath.
     *
     * @parameter expression="${project.compileClasspathElements}"
     * @required
     * @readonly
     */
    private List<String> classpathElements;

    /**
     * The directory for compiled classes.
     *
     * @parameter expression="${project.build.directory}/generated-sources"
     * @required
     * @readonly
     */
    private File outputDirectory;

 =======================================================================
 ==src/sandbox/java/MyByteCodeOutputProcessor.java
 =======================================================================
 package net.sf.alchim.spoon.contrib.maven;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.jdt.internal.compiler.ClassFile;
import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
import org.eclipse.jdt.internal.compiler.env.ICompilationUnit;

import spoon.processing.AbstractProcessor;
import spoon.processing.FileGenerator;
import spoon.reflect.Factory;
import spoon.reflect.declaration.CtSimpleType;
import spoon.support.JavaOutputProcessor;
import spoon.support.util.ClassFileUtil;
import spoon.support.util.JDTCompiler;

public class MyByteCodeOutputProcessor extends AbstractProcessor<CtSimpleType<?>>
        implements FileGenerator<CtSimpleType<?>> {

    /**
     * Extension for class files (.class).
     */
    public static final String CLASS_EXT = ".class";

    private File outputDir;

    private List<ICompilationUnit> units = new ArrayList<ICompilationUnit>();

    private List<File> printed = new ArrayList<File>();

    private List<String> printedTypes = new ArrayList<String>();

    private JavaOutputProcessor javaPrinter;

    /**
     * Creates a new processor for generating Java source files.
     *
     * @param outputDirectory
     *            the root output directory
     */
    public MyByteCodeOutputProcessor(JavaOutputProcessor javaPrinter,
            File outputDirectory) {
        outputDir = outputDirectory;
        this.javaPrinter = javaPrinter;
    }

    public List<File> getCreatedFiles() {
        return printed;

 =======================================================================
 ==src/sandbox/ok/Launcher.java
 =======================================================================
 package spoon.contrib.maven;

import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;

import spoon.processing.Builder;
import spoon.processing.Environment;
import spoon.processing.ProcessingManager;
import spoon.reflect.Factory;
import spoon.support.DefaultCoreFactory;
import spoon.support.QueueProcessingManager;
import spoon.support.builder.CtFile;
import spoon.support.builder.CtFolder;
import spoon.support.builder.CtResource;
import spoon.support.builder.SpoonBuildingManager;
import spoon.support.builder.support.CtFileFile;
import spoon.support.builder.support.CtFolderFile;
import spoon.support.builder.support.CtFolderZip;

import java.io.File;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;

/**
 * Apply a set of spoonlet and Spoon's processor.
 */
public class Launcher {

    private List<String> sources_ = new ArrayList<String>();;

    private List<String> processors_ = new ArrayList<String>();

    private Environment env_;

    private HashSet<CtResource> ctTemplates_ = new HashSet<CtResource>();

    private Factory factory_;

    /**
     * Create and initialize a Launcher.
     *
     * @param sources list of the source directories containing the sources to be processed.
     * @param processors List of processors' class to apply.
     * @param env the running environnment
     * @throws Exception
     */

 =======================================================================
 ==src/sandbox/ok/SpoonletXmlHandler.java
 =======================================================================
 /*
 * Spoon - http://spoon.gforge.inria.fr/
 * Copyright (C) 2006 INRIA Futurs <renaud.pawlak@inria.fr>
 *
 * This software is governed by the CeCILL-C License under French law and
 * abiding by the rules of distribution of free software. You can use, modify
 * and/or redistribute the software under the terms of the CeCILL-C license as
 * circulated by CEA, CNRS and INRIA at http://www.cecill.info.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL-C License for more details.
 *
 * The fact that you are presently reading this means that you have had
 * knowledge of the CeCILL-C license and that you accept its terms.
 */

package spoon.contrib.maven;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import spoon.reflect.Factory;
import spoon.support.builder.CtResource;
import spoon.support.processing.XmlProcessorProperties;

/**
 * This class defines the SAX handler to parse a Spoonlet deployment descriptor
 * file.
 */
public class SpoonletXmlHandler extends DefaultHandler {

    private List<CtResource> spoonletIndex_;

    private XmlProcessorProperties prop_;

    private String propName_;

    private List<Object> values_;

    private String buffer_;

    private Collection<CtResource> templates_;

    private List<String> processors_;

 =======================================================================
 ==src/sandbox/ok/MavenEnvironment.java
 =======================================================================
 package spoon.contrib.maven;

import org.apache.maven.plugin.logging.Log;

import spoon.processing.FileGenerator;
import spoon.processing.Processor;
import spoon.processing.Severity;
import spoon.reflect.declaration.CtElement;
import spoon.support.StandardEnvironment;

@SuppressWarnings("serial")
class MavenEnvironment extends StandardEnvironment {
    private Log logger_;

    public MavenEnvironment(Log log) {
        logger_ = log;
    }

    @Override()
    public void debugMessage(String msg) {
        logger_.debug(msg);
    }

    @Override()
    public void report(Processor processor, Severity severity, CtElement element, String message) {
        String msg = processor.getClass().getSimpleName() + ">>" + element.getPosition().getFile() + "@[" + element.getPosition().getLine() + "," + element.getPosition().getColumn() + "]:" + message;
        if (Severity.ERROR.equals(severity)) {
            logger_.error(msg);
        } else if (Severity.WARNING.equals(severity)) {
            logger_.warn(msg);
        } else {
            logger_.info(msg);
        }
    }

    public FileGenerator<? extends CtElement> getDefaultFileGenerator() {
        return (FileGenerator<? extends CtElement>) super.getDefaultFileGenerator();
    }

}

 =======================================================================
 ==src/sandbox/ok/RunProcessorsMojo.java
 =======================================================================
 package spoon.contrib.maven;

import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;

import spoon.support.JavaOutputProcessor;

import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.List;

/**
 * Apply a set of spoonlet and Spoon's processor.
 *
 * @goal run
 * @requiresDependencyResolution compile
 */
public class RunProcessorsMojo extends AbstractMojo {

    /**
     * The source directories containing the sources to be compiled.
     *
     * @parameter expression="${project.compileSourceRoots}"
     * @required
     * @readonly
     */
    private List<String> compileSourceRoots;

    /**
     * Project classpath.
     *
     * @parameter expression="${project.compileClasspathElements}"
     * @required
     * @readonly
     */
    private List<String> classpathElements;

    /**
     * The directory for compiled classes.
     *
     * @parameter expression="${project.build.directory}/generated-sources"
     * @required
     * @readonly
     */
    private File outputDirectory;

    /**
     * List of processors' class to apply.

 =======================================================================
 ==src/test/java/net/sf/alchim/spoon/contrib/launcher/artifact/DomHelperTest.java
 =======================================================================
 package net.sf.alchim.spoon.contrib.launcher.artifact;

import net.sf.alchim.spoon.contrib.launcher.artifact.DomHelper;

import org.w3c.dom.Node;


import junit.framework.TestCase;

public class DomHelperTest extends TestCase{

    public void testFindFirstValue() throws Exception {
        Node doc = DomHelper.read(this.getClass().getResourceAsStream("sample1.xml"));
        assertEquals("value1", DomHelper.findFirstValue(doc, "node1"));
        assertEquals("value3.1", DomHelper.findFirstValue(doc, "node2"));
    }
}

 =======================================================================
 ==src/test/java/net/sf/alchim/spoon/contrib/launcher/artifact/MD5HelperTest.java
 =======================================================================
 package net.sf.alchim.spoon.contrib.launcher.artifact;

import java.io.File;

import junit.framework.TestCase;

public class MD5HelperTest extends TestCase {
    public void testCheckFromExistingFile() throws Exception {
        String basefile = System.getProperty("user.home") + "/.m2/repository/fr/inria/gforge/spoon/spoon-core/1.2/spoon-core-1.2.jar";
        assertTrue(MD5Helper.checksum(new File(basefile), new File(basefile + ".md5")));
    }
}

 =======================================================================
 ==src/test/resources/net/sf/alchim/spoon/contrib/launcher/artifact/sample1.xml
 =======================================================================
 <?xml version="1.0"?>

<sample num="1">
  <node1>value1</node1>
  <node1>value2</node1>
  <node1>
    <node2>value3.1</node2>
  </node1>
</sample>

 =======================================================================
 ==src/assembly/project.xml
 =======================================================================
 <assembly>
  <id>project</id>
  <formats>
    <format>tar.bz2</format>
  </formats>
  <fileSets>
    <fileSet>
      <directory>.</directory>
      <outputDirectory></outputDirectory>
      <excludes>
        <exclude>target/**</exclude>
        <exclude>.hg/**</exclude>
        <exclude>.classpath</exclude>
        <exclude>.project</exclude>
        <exclude>.settings/**</exclude>
        <exclude>null/**</exclude>
        <exclude>test-output/**</exclude>
        <exclude>tmp/**</exclude>
        <exclude>dist/**</exclude>
        <exclude>build/**</exclude>
      </excludes>
    </fileSet>
  </fileSets>
</assembly>

 =======================================================================
 ==pom.xml
 =======================================================================
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"
>
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>net.sf.alchim</groupId>
		<artifactId>alchim-parent</artifactId>
		<version>3</version>
	</parent>
	<artifactId>spoon-maven-plugin</artifactId>
	<version>0.7.1</version>
	<packaging>maven-plugin</packaging>
	<name>Spoon Maven Plugin</name>
	<description><![CDATA[
      A maven plugin to use spoonlet(s) in a maven 2 build. Spoonlets (and dependencies) are downloaded if needed.
    ]]></description>
    <inceptionYear>2006</inceptionYear>
	<prerequisites>
		<maven>2.0.7</maven>
	</prerequisites>
	<mailingLists>
		<mailingList>
			<name>spoon-discuss</name>
			<subscribe>http://lists.gforge.inria.fr/mailman/listinfo/spoon-discuss</subscribe>
			<unsubscribe>http://lists.gforge.inria.fr/mailman/listinfo/spoon-discuss</unsubscribe>
			<archive>http://lists.gforge.inria.fr/pipermail/spoon-discuss/</archive>
		</mailingList>
	</mailingLists>
	<profiles>
		<profile>
			<id>inria</id>
			<repositories>
				<repository>
					<id>maven-repo.gforge.inria.fr</id>
					<url>http://maven-repo.gforge.inria.fr/releases/</url>
					<releases />
				</repository>
			</repositories>
		</profile>
	</profiles>
	<dependencies>
		<dependency>
			<groupId>fr.inria.gforge.spoon</groupId>
			<artifactId>spoon-core</artifactId>
			<version>1.4</version>
		</dependency>
		<dependency>
			<groupId>classworlds</groupId>
			<artifactId>classworlds</artifactId>
			<version>1.1</version>

 =======================================================================
 ==notes.txt
 =======================================================================
 * define a launcher with no CLI/JSAP, Ant, Eclipse, Maven depency, only from Environment, a launcher usable by every context
* remove getter that do indirection, or depends of other properties (getEnvironment that depend of getFactory)
* remove final on methods (like AbstractProcessor.setFactory)
* simplify and clean the API (public and private) => simplify package hierarchy
* remove from the code "e.printStackTrace()", and provide a Environment.report method that support exception
* provide a Environment.report method that support parameters (like slf4j) or format (like String.format) or replace the method by Logger (slf4j or java.logging)
* clean the usage of generics syntax (cf eclipse warning), by example in StandardEnvironment there is a mixe of FileGenerator, FileGenerator<?> and FileGenerator<? extends CtElement> (item with CtSimpleType)
* fix inconsistancy of method signature between interface and implementations (ex getDefaultFileGenerator of Environment mismatch StandardEnvironment (correct at byte code level due to type erasure) but not at source code level).
  and generate error like (when is compiled with regular sun jdk) when I try to create my own Environment that extends StandardEnvironment
    incompatible types
      found   : spoon.processing.FileGenerator<capture of ?>
      required: spoon.processing.FileGenerator<? extends spoon.reflect.declaration.CtElement>

* clean up the code (cf eclipse warning/problems, pmd/cpd reports)
* why declaring template in spoon.xml, why not search template into the classpath like class and access it like any resource?

 =======================================================================
 ==.hgtags
 =======================================================================
 fc00ada0d23f601fa401ca2dcfcfc2728a991c54 0.5
9bd6d99dada0a1e494ee42e67b9997506de6f623 0.6
7f3bdebe69df7fda2f685fdc249e3f9601fd4f54 0.6.1
dd5920ecdcb501e48fbe4ff0d39f45a8667f84c9 0.7
fcc874ef197567908b36c24105b6f8a6faa2f4ad 0.7.1

 =======================================================================
 ==.hgignore
 =======================================================================
 # use glob syntax.
syntax: glob
*.ser
*.class
*~
*.bak

# eclipse conf file
.settings
.classpath
.project

# building
target
build
null
tmp
dist

# other scm
.svn
.CVS
.git

# switch to regexp syntax.
#  syntax: regexp
#  ^\.pc/



 =======================================================================
 ==.hg/store/undo
 =======================================================================
 data/src/main/java/net/sf/alchim/spoon/contrib/launcher/artifact/Repository.java.i?1803
00manifest.i?8760
00changelog.i?6867

 =======================================================================
 ==.hg/requires
 =======================================================================
 revlogv1
store

 =======================================================================
 ==.hg/00changelog.i
 =======================================================================
 ???? dummy changelog to prevent using the old repo layout

 =======================================================================
 ==.hg/hgrc
 =======================================================================
 [paths]
default-push = ssh://dwayneb@shell.sf.net/alchim/hg/spoon-maven-plugin

[web]
style = gitweb
allow_archive = bz2 gz zip
contact = David Bernard, dwayneb@users.sf.net
push_ssl = false
allow_push = david.bernard


 =======================================================================
 ==.hg/branches.cache
 =======================================================================
 e5875bc5c8a73eb1ca7ba3d177fd4fa7e2b080b5 12

 =======================================================================
 ==.hg/branch.cache
 =======================================================================
 8906f77b66a15add6993132bf79ac8cc6ce7cec2 17
8906f77b66a15add6993132bf79ac8cc6ce7cec2 default