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 }