blob: 3788594d77a6273aeca8b5bcfc0a5620be1246f5 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2017 Cloudsmith Inc. 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:
* Cloudsmith Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.equinox.internal.p2.touchpoint.natives.actions;
import java.io.File;
import java.io.IOException;
import java.util.*;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.equinox.internal.p2.touchpoint.natives.*;
import org.eclipse.equinox.p2.engine.IProfile;
import org.eclipse.equinox.p2.engine.spi.ProvisioningAction;
import org.eclipse.equinox.p2.metadata.IInstallableUnit;
import org.eclipse.osgi.util.NLS;
public class CleanupcopyAction extends ProvisioningAction {
public static final String ACTION_CLEANUPCOPY = "cleanupcopy"; //$NON-NLS-1$
@Override
public IStatus execute(Map<String, Object> parameters) {
return cleanupcopy(parameters, true);
}
@Override
public IStatus undo(Map<String, Object> parameters) {
return CopyAction.copy(parameters, false);
}
/**
* Perform a cleanup of a previously made copy action.
* @param parameters action parameters
* @param restoreable flag indicating if the operation should be backed up
* @return status
*/
public static IStatus cleanupcopy(Map<String, Object> parameters, boolean restoreable) {
String source = (String) parameters.get(ActionConstants.PARM_SOURCE);
if (source == null)
return Util.createError(NLS.bind(Messages.param_not_set, ActionConstants.PARM_SOURCE, ACTION_CLEANUPCOPY));
String target = (String) parameters.get(ActionConstants.PARM_TARGET);
if (target == null)
return Util.createError(NLS.bind(Messages.param_not_set, ActionConstants.PARM_TARGET, ACTION_CLEANUPCOPY));
IBackupStore backupStore = (IBackupStore) parameters.get(NativeTouchpoint.PARM_BACKUP);
IInstallableUnit iu = (IInstallableUnit) parameters.get(ActionConstants.PARM_IU);
IProfile profile = (IProfile) parameters.get(ActionConstants.PARM_PROFILE);
String copied = profile.getInstallableUnitProperty(iu, "copied" + ActionConstants.PIPE + source + ActionConstants.PIPE + target); //$NON-NLS-1$
if (copied == null)
return Status.OK_STATUS;
StringTokenizer tokenizer = new StringTokenizer(copied, ActionConstants.PIPE);
List<File> directories = new ArrayList<>();
while (tokenizer.hasMoreTokens()) {
String fileName = tokenizer.nextToken();
File file = new File(fileName);
if (!file.exists())
continue;
//directories need to be deleted from the bottom-up, but directories are listed
//in traversal order during copy, so we need to reverse the directory list
if (file.isDirectory())
directories.add(0, file);
else {
if (restoreable)
try {
backupStore.backup(file);
} catch (IOException e) {
return Util.createError(NLS.bind(Messages.backup_file_failed, file));
}
else
file.delete();
}
}
for (File directory : directories) {
File[] children = directory.listFiles();
if (children == null)
return Util.createError(NLS.bind(Messages.Error_list_children_0, directory));
if (children.length == 0) {
if (restoreable)
try {
backupStore.backup(directory);
} catch (IOException e) {
return Util.createError(NLS.bind(Messages.backup_file_failed, directory));
}
else
directory.delete();
}
}
return Status.OK_STATUS;
}
}