    001    package org.nanocontainer.script.groovy;
    002
    003    import org.picocontainer.ComponentAdapter;
    004    import org.picocontainer.MutablePicoContainer;
    005
    006    import java.util.Collection;
    007    import java.util.Iterator;
    008
    009    /**
    010     * This class can generate a Groovy script from a preconfigured container.
    011     * This script can be passed to {@link GroovyContainerBuilder} to recreate
    012     * a new container with the same configuration.
    013     * <p/>
    014     * This is practical in situations where a container configuration needs
    015     * to be saved.
    016     *
    017     * @author Aslak Helles&oslash;y
    018     * @version $Revision: 3144 $
    019     */
    020    public class GroovyScriptGenerator {
    021        // This implementation is ugly and naive. But it's all I need for now.
    022        // When there are more requirements (in the form of tests), we can improve this.
    023        public String generateScript(MutablePicoContainer pico) {
    024            StringBuffer groovy = new StringBuffer();
    025            groovy.append("pico = new org.nanocontainer.reflection.DefaultNanoPicoContainer()\n");
    026
    027            Collection componentAdapters = pico.getComponentAdapters();
    028            for (Iterator iterator = componentAdapters.iterator(); iterator.hasNext();) {
    029                ComponentAdapter componentAdapter = (ComponentAdapter) iterator.next();
    030
    031                Object componentKey = componentAdapter.getComponentKey();
    032                String groovyKey = null;
    033                if (componentKey instanceof Class) {
    034                    groovyKey = ((Class) componentKey).getName();
    035                } else if (componentKey instanceof String) {
    036                    groovyKey = "\"" + componentKey + "\"";
    037                }
    038
    039                Object componentInstance = componentAdapter.getComponentInstance(pico);
    040
    041                if (componentInstance instanceof String) {
    042                    groovy.append("pico.registerComponentInstance(" + groovyKey + ", \"" + componentInstance + "\")\n");
    043                } else {
    044                    groovy.append("pico.registerComponentImplementation(" + groovyKey + ", " + componentInstance.getClass().getName() + ")\n");
    045                }
    046            }
    047            return groovy.toString();
    048        }
    049    }