/******************************************************************************* * Copyright (c) 2006 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM - Initial API and implementation *******************************************************************************/ package org.eclipse.update.internal.jarprocessor; import java.io.File; import java.io.IOException; import java.util.List; import java.util.Properties; /** * @author aniefer * */ public class UnpackStep extends CommandStep { public static final String UNPACKER_PROPERTY = "org.eclipse.update.jarprocessor.Unpacker"; //$NON-NLS-1$ private static Boolean canUnpack = null; private static String unpackCommand = null; public static boolean canUnpack() { if (canUnpack != null) return canUnpack.booleanValue(); String[] locations = Utils.getPack200Commands("unpack200"); //$NON-NLS-1$ if (locations == null) { canUnpack = Boolean.FALSE; unpackCommand = null; return false; } int result; for (int i = 0; i < locations.length; i++) { if (locations[i] == null) continue; result = execute(new String[] {locations[i], "-V"}); //$NON-NLS-1$ if (result == 0) { unpackCommand = locations[i]; canUnpack = Boolean.TRUE; return true; } } canUnpack = Boolean.FALSE; return false; } public UnpackStep(Properties options) { super(options, null, null, false); } public UnpackStep(Properties options, boolean verbose) { super(options, null, null, verbose); } /* (non-Javadoc) * @see org.eclipse.update.jarprocessor.IProcessStep#recursionEffect(java.lang.String) */ public String recursionEffect(String entryName) { if (canUnpack() && entryName.endsWith(Utils.PACKED_SUFFIX)) { return entryName.substring(0, entryName.length() - Utils.PACKED_SUFFIX.length()); } return null; } /* (non-Javadoc) * @see org.eclipse.update.jarprocessor.IProcessStep#preProcess(java.io.File, java.io.File) */ public File preProcess(File input, File workingDirectory, List containers) { if (canUnpack() && unpackCommand != null) { String name = input.getName(); if (name.endsWith(Utils.PACKED_SUFFIX)) { name = name.substring(0, name.length() - Utils.PACKED_SUFFIX.length()); File unpacked = new File(workingDirectory, name); File parent = unpacked.getParentFile(); if (!parent.exists()) parent.mkdirs(); try { String options = getOptions().getProperty(input.getName() + ".unpack.args"); //$NON-NLS-1$ String[] cmd = null; if (options != null) { cmd = new String[] {unpackCommand, options, input.getCanonicalPath(), unpacked.getCanonicalPath()}; } else { cmd = new String[] {unpackCommand, input.getCanonicalPath(), unpacked.getCanonicalPath()}; } int result = execute(cmd, verbose); if (result != 0 && verbose) System.out.println("Error: " + result + " was returned from command: " + Utils.concat(cmd)); //$NON-NLS-1$ //$NON-NLS-2$ } catch (IOException e) { if (verbose) e.printStackTrace(); return null; } return unpacked; } } return null; } /* (non-Javadoc) * @see org.eclipse.update.jarprocessor.IProcessStep#postProcess(java.io.File, java.io.File) */ public File postProcess(File input, File workingDirectory, List containers) { return null; } public String getStepName() { return "Unpack"; //$NON-NLS-1$ } }