blob: 1d30dd866e755060f65a81758990ab4359b26b58 [file] [log] [blame]
/*******************************************************************************
* 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$
}
}