/* * IzPack - Copyright 2001-2009 Julien Ponge, All Rights Reserved. * * http://izpack.org/ * http://izpack.codehaus.org/ * * Copyright 2009 Matthew Inger * * 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.event; import com.izforge.izpack.Pack; import com.izforge.izpack.PackFile; import com.izforge.izpack.adaptator.IXMLElement; import com.izforge.izpack.installer.AutomatedInstallData; import com.izforge.izpack.installer.InstallerException; import com.izforge.izpack.installer.ResourceManager; import com.izforge.izpack.installer.UninstallData; import com.izforge.izpack.util.*; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.Vector; public class BSFInstallerListener extends SimpleInstallerListener { public static final String SPEC_FILE_NAME = "BSFActionsSpec.xml"; private HashMap<String, ArrayList<BSFAction>> actions = null; private ArrayList<BSFAction> uninstActions = null; private String currentPack = null; private AutomatedInstallData installdata = null; public BSFInstallerListener() { super(true); actions = new HashMap<String, ArrayList<BSFAction>>(); uninstActions = new ArrayList<BSFAction>(); } public void beforePacks(AutomatedInstallData idata, Integer npacks, AbstractUIProgressHandler handler) throws Exception { if (installdata == null) { installdata = idata; } super.beforePacks(idata, npacks, handler); getSpecHelper().readSpec(SPEC_FILE_NAME, new VariableSubstitutor(idata.getVariables())); if (getSpecHelper().getSpec() == null) { return; } Iterator iter = idata.selectedPacks.iterator(); Pack p; while (iter != null && iter.hasNext()) { p = (Pack) iter.next(); IXMLElement pack = getSpecHelper().getPackForName(p.name); if (pack == null) { continue; } ArrayList<BSFAction> packActions = new ArrayList<BSFAction>(); Vector<IXMLElement> scriptEntries = pack.getChildrenNamed("script"); if (scriptEntries != null && scriptEntries.size() >= 1) { Iterator<IXMLElement> entriesIter = scriptEntries.iterator(); while (entriesIter != null && entriesIter.hasNext()) { BSFAction action = readAction(entriesIter.next(), idata); if (action != null) { packActions.add(action); String script = action.getScript().toLowerCase(); if (script.contains(BSFAction.BEFOREDELETE) || script.contains(BSFAction.AFTERDELETE) || script.contains(BSFAction.BEFOREDELETION) || script.contains(BSFAction.AFTERDELETION)) { uninstActions.add(action); } } } if (packActions.size() > 0) { this.setProgressBarCaller(); } } actions.put(p.name, packActions); } iter = idata.availablePacks.iterator(); while (iter.hasNext()) { String currentPack = ((Pack) iter.next()).name; performAllActions(currentPack, ActionBase.BEFOREPACKS, null, new Object[]{idata, npacks, handler}); } } public void afterPack(Pack pack, Integer i, AbstractUIProgressHandler handler) throws Exception { performAllActions(pack.name, ActionBase.AFTERPACK, handler, new Object[]{pack, i, handler}); currentPack = null; } public void afterPacks(AutomatedInstallData idata, AbstractUIProgressHandler handler) throws Exception { if (informProgressBar()) { handler.nextStep(getMsg("BSFAction.pack"), getProgressBarCallerId(), getActionCount( idata)); } for (Object selectedPack : idata.selectedPacks) { String currentPack = ((Pack) selectedPack).name; performAllActions(currentPack, ActionBase.AFTERPACKS, handler, new Object[]{idata, handler}); } if (uninstActions.size() > 0) { UninstallData.getInstance().addAdditionalData("bsfActions", uninstActions); } installdata = null; } public void beforePack(Pack pack, Integer i, AbstractUIProgressHandler handler) throws Exception { currentPack = pack.name; performAllActions(pack.name, ActionBase.BEFOREPACK, handler, new Object[]{pack, i, handler}); } public void afterDir(File file, PackFile pack) throws Exception { performAllActions(currentPack, BSFAction.AFTERDIR, null, new Object[]{file, pack}); } public void afterFile(File file, PackFile pack) throws Exception { performAllActions(currentPack, BSFAction.AFTERFILE, null, new Object[]{file, pack}); } public void beforeDir(File file, PackFile pack) throws Exception { performAllActions(currentPack, BSFAction.BEFOREDIR, null, new Object[]{file, pack}); } public void beforeFile(File file, PackFile pack) throws Exception { performAllActions(currentPack, BSFAction.BEFOREFILE, null, new Object[]{file, pack}); } public boolean isFileListener() { return true; } protected ArrayList<BSFAction> getActions(String packName) { if (actions == null) { return null; } return actions.get(packName); } private int getActionCount(AutomatedInstallData idata) { int retval = 0; for (Object selectedPack : idata.selectedPacks) { String currentPack = ((Pack) selectedPack).name; ArrayList<BSFAction> actList = getActions(currentPack); if (actList != null) { retval += actList.size(); } } return (retval); } private void performAllActions(String packName, String order, AbstractUIProgressHandler handler, Object callParams[]) throws InstallerException { ArrayList<BSFAction> actList = getActions(packName); if (actList == null || actList.size() == 0) { return; } Debug.trace("******* Executing all " + order + " actions of " + packName + " ..."); for (BSFAction act : actList) { // Inform progress bar if needed. Works only // on AFTER_PACKS if (informProgressBar() && handler != null && handler instanceof ExtendedUIProgressHandler && order.equals(ActionBase.AFTERPACKS)) { ((ExtendedUIProgressHandler) handler) .progress((act.getMessageID() != null) ? getMsg(act.getMessageID()) : ""); } try { if (ActionBase.BEFOREPACKS.equalsIgnoreCase(order)) { act.init(); } act.execute(order, callParams, installdata); if (ActionBase.AFTERPACKS.equalsIgnoreCase(order)) { act.destroy(); } } catch (Exception e) { throw new InstallerException(e); } } } private BSFAction readAction(IXMLElement element, AutomatedInstallData idata) throws InstallerException { BSFAction action = new BSFAction(); String src = element.getAttribute("src"); if (src != null) { InputStream is = null; InputStream subis = null; ByteArrayOutputStream baos = new ByteArrayOutputStream(); try { byte buf[] = new byte[10 * 1024]; int read = 0; is = ResourceManager.getInstance().getInputStream(src); subis = new SpecHelper().substituteVariables(is, new VariableSubstitutor(idata.getVariables())); while ((read = subis.read(buf, 0, 10 * 1024)) != -1) { baos.write(buf, 0, read); } action.setScript(new String(baos.toByteArray())); } catch (Exception e) { throw new InstallerException(e); } finally { try { if (subis != null) { subis.close(); } } catch (java.io.IOException e) { e.printStackTrace(); } try { if (is != null) { is.close(); } } catch (java.io.IOException e) { e.printStackTrace(); } } } else { String script = element.getContent(); if (script == null) { script = ""; } action.setScript(script); } String language = element.getAttribute("language"); action.setLanguage(language); return action; } }