/* * $Id:$ * IzPack - Copyright 2001-2008 Julien Ponge, All Rights Reserved. * * http://izpack.org/ * http://izpack.codehaus.org/ * * Copyright 2007 Klaus Bartz * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.izforge.izpack.compiler; import com.izforge.izpack.CustomData; import com.izforge.izpack.GUIPrefs; import com.izforge.izpack.IPSPack; import com.izforge.izpack.Info; import com.izforge.izpack.Panel; import com.izforge.izpack.compressor.PackCompressor; import com.izforge.izpack.compressor.PackCompressorFactory; import com.izforge.izpack.installer.InstallerRequirement; import com.izforge.izpack.rules.Condition; import java.io.File; import java.io.FilterOutputStream; import java.io.IOException; import java.net.URL; import java.util.*; /** * The packager base class. The packager interface <code>IPackager</code> is used by the compiler to put files into an installer, and * create the actual installer files. The packager implementation depends on different requirements (e.g. normal packager versus multi volume packager). * This class implements the common used method which can also be overload as needed. * * @author Klaus Bartz */ public abstract class PackagerBase implements IPackager { /** * Path to the skeleton installer. */ public static final String SKELETON_SUBPATH = "lib/installer.jar"; /** * Base file name of all jar files. This has no ".jar" suffix. */ protected File baseFile = null; /** * Basic installer info. */ protected Info info = null; /** * Gui preferences of instatller. */ protected GUIPrefs guiPrefs = null; /** * The variables used in the project */ protected Properties variables = new Properties(); /** * The ordered panels informations. */ protected List<Panel> panelList = new ArrayList<Panel>(); /** * The ordered packs informations (as PackInfo objects). */ protected List<PackInfo> packsList = new ArrayList<PackInfo>(); /** * The IPS Packs informations. */ protected List<IPSPack> ipsPacksList = new ArrayList<IPSPack>(); /** * The ordered langpack locale names. */ protected List<String> langpackNameList = new ArrayList<String>(); /** * The ordered custom actions informations. */ protected List<CustomData> customDataList = new ArrayList<CustomData>(); /** * The langpack URLs keyed by locale name (e.g. de_CH). */ protected Map<String, URL> installerResourceURLMap = new HashMap<String, URL>(); /** * the conditions */ protected Map<String, Condition> rules = new HashMap<String, Condition>(); /** * dynamic variables */ protected Map<String, List<DynamicVariable>> dynamicvariables = new HashMap<String, List<DynamicVariable>>(); /** * Jar file URLs who's contents will be copied into the installer. */ protected Set<Object[]> includedJarURLs = new HashSet<Object[]>(); /** * Each pack is created in a separte jar if webDirURL is non-null. */ protected boolean packJarsSeparate = false; /** * The listeners. */ protected PackagerListener listener; /** * The compression format to be used for pack compression */ protected PackCompressor compressor; /** * Files which are always written into the container file */ protected HashMap<FilterOutputStream, HashSet<String>> alreadyWrittenFiles = new HashMap<FilterOutputStream, HashSet<String>>(); private List<InstallerRequirement> installerrequirements; /** * Dispatches a message to the listeners. * * @param job The job description. */ protected void sendMsg(String job) { sendMsg(job, PackagerListener.MSG_INFO); } /** * Dispatches a message to the listeners at specified priority. * * @param job The job description. * @param priority The message priority. */ protected void sendMsg(String job, int priority) { if (listener != null) { listener.packagerMsg(job, priority); } } /** * Dispatches a start event to the listeners. */ protected void sendStart() { if (listener != null) { listener.packagerStart(); } } /** * Dispatches a stop event to the listeners. */ protected void sendStop() { if (listener != null) { listener.packagerStop(); } } /* (non-Javadoc) * @see com.izforge.izpack.compiler.IPackager#addCustomJar(com.izforge.izpack.CustomData, java.net.URL) */ public void addCustomJar(CustomData ca, URL url) { customDataList.add(ca); // serialized to keep order/variables correct if ( url != null ) { addJarContent(url); // each included once, no matter how many times added } } /* (non-Javadoc) * @see com.izforge.izpack.compiler.IPackager#addJarContent(java.net.URL) */ public void addJarContent(URL jarURL) { addJarContent(jarURL, null); } /* (non-Javadoc) * @see com.izforge.izpack.compiler.IPackager#addJarContent(java.net.URL, java.util.List) */ public void addJarContent(URL jarURL, List<String> files) { Object[] cont = {jarURL, files}; sendMsg("Adding content of jar: " + jarURL.getFile(), PackagerListener.MSG_VERBOSE); includedJarURLs.add(cont); } /* (non-Javadoc) * @see com.izforge.izpack.compiler.IPackager#addLangPack(java.lang.String, java.net.URL, java.net.URL) */ public void addLangPack(String iso3, URL xmlURL, URL flagURL) { sendMsg("Adding langpack: " + iso3, PackagerListener.MSG_VERBOSE); // put data & flag as entries in installer, and keep array of iso3's // names langpackNameList.add(iso3); addResource("flag." + iso3, flagURL); installerResourceURLMap.put("langpacks/" + iso3 + ".xml", xmlURL); } /* (non-Javadoc) * @see com.izforge.izpack.compiler.IPackager#addNativeLibrary(java.lang.String, java.net.URL) */ public void addNativeLibrary(String name, URL url) throws Exception { sendMsg("Adding native library: " + name, PackagerListener.MSG_VERBOSE); installerResourceURLMap.put("native/" + name, url); } /* (non-Javadoc) * @see com.izforge.izpack.compiler.IPackager#addNativeUninstallerLibrary(com.izforge.izpack.CustomData) */ public void addNativeUninstallerLibrary(CustomData data) { customDataList.add(data); // serialized to keep order/variables // correct } /* (non-Javadoc) * @see com.izforge.izpack.compiler.IPackager#addPack(com.izforge.izpack.compiler.PackInfo) */ public void addPack(PackInfo pack) { packsList.add(pack); } /** * {@inheritDoc} */ public void addIPSPack (IPSPack pack) { ipsPacksList.add(pack); } /* (non-Javadoc) * @see com.izforge.izpack.compiler.IPackager#addPanelJar(com.izforge.izpack.Panel, java.net.URL) */ public void addPanelJar(Panel panel, URL jarURL) { panelList.add(panel); // serialized to keep order/variables correct if ( jarURL != null ) { addJarContent(jarURL); // each included once, no matter how many times added } } /* (non-Javadoc) * @see com.izforge.izpack.compiler.IPackager#addResource(java.lang.String, java.net.URL) */ public void addResource(String resId, URL url) { sendMsg("Adding resource: " + resId, PackagerListener.MSG_VERBOSE); installerResourceURLMap.put("res/" + resId, url); } /* (non-Javadoc) * @see com.izforge.izpack.compiler.IPackager#getCompressor() */ public PackCompressor getCompressor() { return compressor; } /* (non-Javadoc) * @see com.izforge.izpack.compiler.IPackager#getPackagerListener() */ public PackagerListener getPackagerListener() { return listener; } /* (non-Javadoc) * @see com.izforge.izpack.compiler.IPackager#getPacksList() */ public List<PackInfo> getPacksList() { return packsList; } /* (non-Javadoc) * @see com.izforge.izpack.compiler.IPackager#getVariables() */ public Properties getVariables() { return variables; } /* (non-Javadoc) * @see com.izforge.izpack.compiler.IPackager#initPackCompressor(java.lang.String, int) */ public void initPackCompressor(String compr_format, int compr_level) throws CompilerException { compressor = PackCompressorFactory.get(compr_format); compressor.setCompressionLevel(compr_level); } /* (non-Javadoc) * @see com.izforge.izpack.compiler.IPackager#setGUIPrefs(com.izforge.izpack.GUIPrefs) */ public void setGUIPrefs(GUIPrefs prefs) { sendMsg("Setting the GUI preferences", PackagerListener.MSG_VERBOSE); guiPrefs = prefs; } /* (non-Javadoc) * @see com.izforge.izpack.compiler.IPackager#setInfo(com.izforge.izpack.Info) */ public void setInfo(Info info) throws Exception { sendMsg("Setting the installer information", PackagerListener.MSG_VERBOSE); this.info = info; if (!getCompressor().useStandardCompression() && getCompressor().getDecoderMapperName() != null) { this.info.setPackDecoderClassName(getCompressor().getDecoderMapperName()); } } /* (non-Javadoc) * @see com.izforge.izpack.compiler.IPackager#setPackagerListener(com.izforge.izpack.compiler.PackagerListener) */ public void setPackagerListener(PackagerListener listener) { this.listener = listener; } /** * @return the rules */ public Map<String, Condition> getRules() { return this.rules; } /** * @param rules the rules to set */ public void setRules(Map<String, Condition> rules) { this.rules = rules; } protected void writeInstaller() throws Exception { // write the primary jar. MUST be first so manifest is not overwritten // by // an included jar writeSkeletonInstaller(); writeInstallerObject("info", info); writeInstallerObject("vars", variables); writeInstallerObject("GUIPrefs", guiPrefs); writeInstallerObject("panelsOrder", panelList); writeInstallerObject("customData", customDataList); writeInstallerObject("langpacks.info", langpackNameList); writeInstallerObject("rules", rules); writeInstallerObject("dynvariables", dynamicvariables); writeInstallerObject("installerrequirements",installerrequirements); writeInstallerResources(); writeIncludedJars(); // Pack File Data may be written to separate jars writePacks(); writeIPSPacks(); } protected abstract void writeInstallerObject(String entryName, Object object) throws IOException; protected abstract void writeSkeletonInstaller() throws IOException; protected abstract void writeInstallerResources() throws IOException; protected abstract void writeIncludedJars() throws IOException; protected abstract void writePacks() throws Exception; /** * Serialize the list containing the IPS packs and write it into the * installer. * * @throws IOException When the pack list can't be written into the * installer for some reason. */ protected void writeIPSPacks () throws IOException { final int num = ipsPacksList.size(); sendMsg(String.format("Writing %d IPS Pack%s into installer.", num, num > 1 ? "s" : "")); /* * Each IPS pack information is added to the installer. */ writeInstallerObject("ips-packs.info", ipsPacksList); } /** * @return the dynamicvariables */ public Map<String, List<DynamicVariable>> getDynamicVariables() { return this.dynamicvariables; } /** * @param dynamicvariables the dynamicvariables to set */ public void setDynamicVariables(Map<String, List<DynamicVariable>> dynamicvariables) { this.dynamicvariables = dynamicvariables; } public void addInstallerRequirements(List<InstallerRequirement> conditions) { this.installerrequirements = conditions; } }