    001    /*****************************************************************************
    002     * Copyright (C) NanoContainer Organization. All rights reserved.            *
    003     * ------------------------------------------------------------------------- *
    004     * The software in this package is published under the terms of the BSD      *
    005     * style license a copy of which has been included with this distribution in *
    006     * the LICENSE.txt file.                                                     *
    007     *                                                                           *
    008     *****************************************************************************/
    009    package org.nanocontainer.script;
    010
    011    import java.io.IOException;
    012    import java.io.InputStream;
    013    import java.io.InputStreamReader;
    014    import java.io.Reader;
    015    import java.net.URL;
    016
    017    import org.nanocontainer.integrationkit.LifecycleContainerBuilder;
    018    import org.picocontainer.MutablePicoContainer;
    019    import org.picocontainer.PicoContainer;
    020
    021    /**
    022     * Base abstract class for script-based container builders based.
    023     *
    024     * @author Aslak Helles&oslash;y
    025     * @author Obie Fernandez
    026     * @author Mauro Talevi
    027     * @version $Revision: 2164 $
    028     */
    029    public abstract class ScriptedContainerBuilder extends LifecycleContainerBuilder {
    030        private final Reader scriptReader;
    031        private final URL scriptURL;
    032        private final ClassLoader classLoader;
    033
    034        public ScriptedContainerBuilder(Reader script, ClassLoader classLoader) {
    035            this.scriptReader = script;
    036            if (script == null) {
    037                throw new NullPointerException("script");
    038            }
    039            this.scriptURL = null;
    040            this.classLoader = classLoader;
    041            if ( classLoader == null) {
    042                throw new NullPointerException("classLoader");
    043            }
    044        }
    045
    046        public ScriptedContainerBuilder(URL script, ClassLoader classLoader) {
    047            this.scriptReader = null;
    048            this.scriptURL = script;
    049            if (script == null) {
    050                throw new NullPointerException("script");
    051            }
    052            this.classLoader = classLoader;
    053            if ( classLoader == null) {
    054                throw new NullPointerException("classLoader");
    055            }
    056        }
    057
    058        protected final PicoContainer createContainer(PicoContainer parentContainer, Object assemblyScope) {
    059            try {
    060                return createContainerFromScript(parentContainer, assemblyScope);
    061            } finally {
    062                try {
    063                    Reader reader = getScriptReader();
    064                    if (reader != null) {
    065                        reader.close();
    066                    }
    067                } catch (IOException e) {
    068                    // do nothing. we've given it our best try, now get on with it
    069                }
    070            }
    071        }
    072
    073        protected final ClassLoader getClassLoader() {
    074            return classLoader;
    075        }
    076
    077        protected final InputStream getScriptInputStream() throws IOException{
    078            if ( scriptReader != null ){
    079                return new InputStream() {
    080                    public int read() throws IOException {
    081                        return scriptReader.read();
    082                    }
    083                };
    084            }
    085            return scriptURL.openStream();
    086        }
    087
    088        protected final Reader getScriptReader() throws IOException{
    089            if ( scriptReader != null ){
    090                return scriptReader;
    091            }
    092            return new InputStreamReader(scriptURL.openStream());
    093        }
    094
    095        // TODO: This should really return NanoContainer using a nano variable in the script. --Aslak
    096        protected abstract PicoContainer createContainerFromScript(PicoContainer parentContainer, Object assemblyScope);
    097
    098        protected void composeContainer(MutablePicoContainer container, Object assemblyScope) {
    099            // do nothing. assume that this is done in createContainer().
    100        }
    101    }