001    /*
002     * Jpkg - Java library and tools for operating system package creation.
003     *
004     * Copyright (c) 2007 Three Rings Design, Inc.
005     * All rights reserved.
006     *
007     * Redistribution and use in source and binary forms, with or without
008     * modification, are permitted provided that the following conditions
009     * are met:
010     * 1. Redistributions of source code must retain the above copyright
011     *    notice, this list of conditions and the following disclaimer.
012     * 2. Redistributions in binary form must reproduce the above copyright
013     *    notice, this list of conditions and the following disclaimer in the
014     *    documentation and/or other materials provided with the distribution.
015     * 3. Neither the name of the copyright owner nor the names of contributors
016     *    may be used to endorse or promote products derived from this software
017     *    without specific prior written permission.
018     *
019     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
020     * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
021     * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
022     * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
023     * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
024     * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
025     * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
026     * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
027     * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
028     * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
029     * POSSIBILITY OF SUCH DAMAGE.
030     */
031    package com.threerings.jpkg.ant.dpkg.scripts.runner;
032    
033    import java.io.File;
034    import java.io.FileInputStream;
035    import java.io.FileWriter;
036    import java.io.IOException;
037    import java.io.InputStream;
038    import java.util.ArrayList;
039    import java.util.List;
040    
041    import org.apache.velocity.VelocityContext;
042    
043    import com.threerings.jpkg.ant.VelocityHelper;
044    import com.threerings.jpkg.ant.VelocityTemplate;
045    import com.threerings.jpkg.ant.dpkg.DpkgData;
046    import com.threerings.jpkg.debian.MaintainerScript;
047    
048    /**
049     * Handles compiling {@link PackageScript} maintainer scripts into a single master script which
050     * executes each individual script in turn.
051     */
052    public class ScriptRunner
053        implements MaintainerScript, VelocityTemplate
054    {
055        /**
056         * Construct a new ScriptRunner for the associated {@link Type}, using the list of
057         * {@link PackageScript} scripts. The class will verify all supplied scripts
058         * match the type given.
059         * @param type The {@link Type} of all scripts being encoded.
060         * @param scripts The list of {@link PackageScript} scripts to encode.
061         * @param data The {@link DpkgData} to pass to each script being encoded.
062         * @throws IOException If any i/o errors occur.
063         * @throws UnexpectedScriptTypeException If any script type in the supplied list does not match the type
064         * provided as the first parameter to the constructor.
065         */
066        public ScriptRunner (MaintainerScript.Type type, List<PackageScript> scripts, DpkgData data)
067            throws IOException, UnexpectedScriptTypeException
068        {
069            _type = type;
070            _file = File.createTempFile("script_runner_" + type.getFilename(), ".tmp");
071            _file.deleteOnExit();
072    
073            for (final PackageScript source : scripts) {
074                if (!source.getTypes().contains(type)) {
075                    throw new UnexpectedScriptTypeException(type);
076                }
077    
078                _encodedScripts.add(new EncodedScript(source, data));
079            }
080    
081            final FileWriter writer = new FileWriter(_file);
082            try {
083                VelocityHelper.mergeTemplate(this, writer);
084    
085            } catch (final Exception e) {
086                throw new IOException(e.getMessage());
087    
088            } finally {
089                writer.close();
090            }
091        }
092    
093        // from MaintainerScript
094        public Type getType ()
095        {
096            return _type;
097        }
098    
099        // from MaintainerScript
100        public InputStream getStream ()
101            throws IOException
102        {
103            return new FileInputStream(_file);
104        }
105    
106        // from MaintainerScript
107        public long getSize ()
108        {
109            return _file.length();
110        }
111    
112        // from VelocityTemplate
113        public String getTemplateName ()
114        {
115            return "script_runner.vm";
116        }
117    
118        // from VelocityTemplate
119        public void populateContext (VelocityContext context)
120        {
121            context.put("script_type", getType().getFilename());
122            context.put("scripts", _encodedScripts);
123        }
124    
125        /** The type of maintainer script. */
126        private final MaintainerScript.Type _type;
127    
128        /** The file backing store for the script being created. */
129        private final File _file;
130    
131        /** The list of uuencoded scripts. */
132        private final List<EncodedScript> _encodedScripts = new ArrayList<EncodedScript>();
133    }