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    }