blob: cd8eef4a43a48be4e94f1fb0b11d2be498d37474 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2009 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 Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.equinox.internal.p2.touchpoint.natives;
import org.eclipse.equinox.p2.core.ProvisionException;
import java.io.File;
import java.io.IOException;
import java.util.Map;
import java.util.WeakHashMap;
import org.eclipse.core.runtime.*;
import org.eclipse.equinox.internal.p2.touchpoint.natives.actions.ActionConstants;
import org.eclipse.equinox.p2.core.IProvisioningAgent;
import org.eclipse.equinox.p2.engine.IProfile;
import org.eclipse.equinox.p2.engine.spi.Touchpoint;
import org.eclipse.equinox.p2.metadata.IArtifactKey;
import org.eclipse.equinox.p2.repository.artifact.IFileArtifactRepository;
import org.eclipse.osgi.util.NLS;
public class NativeTouchpoint extends Touchpoint {
public static final String PARM_BACKUP = "backup"; //$NON-NLS-1$
public static final String PARM_ARTIFACT = "artifact"; //$NON-NLS-1$
public static final String PARM_ARTIFACT_LOCATION = "artifact.location"; //$NON-NLS-1$
private static Map<IProfile, IBackupStore> backups = new WeakHashMap<IProfile, IBackupStore>();
public IStatus initializeOperand(IProfile profile, Map<String, Object> parameters) {
IProvisioningAgent agent = (IProvisioningAgent) parameters.get(ActionConstants.PARM_AGENT);
IArtifactKey artifactKey = (IArtifactKey) parameters.get(PARM_ARTIFACT);
if (!parameters.containsKey(PARM_ARTIFACT_LOCATION) && artifactKey != null) {
try {
IFileArtifactRepository downloadCache = Util.getDownloadCacheRepo(agent);
File fileLocation = downloadCache.getArtifactFile(artifactKey);
if (fileLocation != null && fileLocation.exists())
parameters.put(PARM_ARTIFACT_LOCATION, fileLocation.getAbsolutePath());
} catch (ProvisionException e) {
return e.getStatus();
}
}
return Status.OK_STATUS;
}
public IStatus initializePhase(IProgressMonitor monitor, IProfile profile, String phaseId, Map<String, Object> touchpointParameters) {
touchpointParameters.put(PARM_BACKUP, getBackupStore(profile));
return null;
}
public String qualifyAction(String actionId) {
return Activator.ID + "." + actionId; //$NON-NLS-1$
}
public IStatus prepare(IProfile profile) {
// does not have to do anything - everything is already in the correct place
// the commit means that the backup is discarded - if that fails it is not a
// terrible problem.
return super.prepare(profile);
}
public IStatus commit(IProfile profile) {
IBackupStore store = getBackupStore(profile);
store.discard();
return Status.OK_STATUS;
}
/**
* Converts a profile id into a string that can be used as a file name in any file system.
*/
public static String escape(String toEscape) {
StringBuffer buffer = new StringBuffer();
int length = toEscape.length();
for (int i = 0; i < length; ++i) {
char ch = toEscape.charAt(i);
switch (ch) {
case '\\' :
case '/' :
case ':' :
case '*' :
case '?' :
case '"' :
case '<' :
case '>' :
case '|' :
case '%' :
buffer.append("%" + (int) ch + ";"); //$NON-NLS-1$ //$NON-NLS-2$
break;
default :
buffer.append(ch);
}
}
return buffer.toString();
}
public IStatus rollback(IProfile profile) {
IStatus returnStatus = Status.OK_STATUS;
IBackupStore store = getBackupStore(profile);
try {
store.restore();
} catch (IOException e) {
returnStatus = new Status(IStatus.ERROR, Activator.ID, NLS.bind(Messages.failed_backup_restore, store.getBackupName()), e);
} catch (ClosedBackupStoreException e) {
returnStatus = new Status(IStatus.ERROR, Activator.ID, NLS.bind(Messages.failed_backup_restore, store.getBackupName()), e);
}
clearProfileState(profile);
return returnStatus;
}
/**
* Cleans up the transactional state associated with a profile.
*/
private static synchronized void clearProfileState(IProfile profile) {
backups.remove(profile);
}
/**
* Gets the transactional state associated with a profile. A transactional state is
* created if it did not exist.
* @param profile
* @return a lazily initialized backup store
*/
private static synchronized IBackupStore getBackupStore(IProfile profile) {
IBackupStore store = backups.get(profile);
if (store == null) {
store = new LazyBackupStore(escape(profile.getProfileId()));
backups.put(profile, store);
}
return store;
}
}