blob: a4bbd4dcbaa1adc36a6a9aa726b3355d6f60cf1c [file] [log] [blame]
package org.eclipse.update.internal.core;
/*
* (c) Copyright IBM Corp. 2000, 2002.
* All Rights Reserved.
*/
import java.io.File;
import java.io.PrintWriter;
import java.util.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.eclipse.core.runtime.*;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.update.configuration.*;
import org.eclipse.update.configuration.IConfiguredSite;
import org.eclipse.update.configuration.ISessionDelta;
import org.eclipse.update.core.*;
import org.eclipse.update.core.IFeatureReference;
import org.eclipse.update.core.SiteManager;
import org.eclipse.update.core.model.FeatureReferenceModel;
import org.eclipse.update.core.model.ModelObject;
import org.eclipse.update.internal.model.InstallChangeParser;
/**
*
*/
public class SessionDelta extends ModelObject implements ISessionDelta {
private Date date;
private List featureReferences;
private File file;
private int process;
private boolean deleted = false;
/**
* Constructor for SessionDelta.
*/
public SessionDelta() {
super();
process=ENABLE;
deleted = false;
}
/**
* @see ISessionDelta#getFeatureReferences()
*/
public IFeatureReference[] getFeatureReferences() {
if (featureReferences == null)
return new IFeatureReference[0];
return (IFeatureReference[]) featureReferences.toArray(
arrayTypeFor(featureReferences));
}
/**
* @see ISessionDelta#getDate()
*/
public Date getDate() {
return date;
}
/**
* @see ISessionDelta#process(IProgressMonitor)
*/
public void process(IProgressMonitor pm) throws CoreException {
createInstallConfiguration();
// process all feature references to configure
// find the configured site each feature belongs to
if (process==ENABLE) {
if (featureReferences != null && featureReferences.size() > 0) {
IInstallConfiguration currentConfig =
SiteManager.getLocalSite().getCurrentConfiguration();
if (currentConfig != null) {
IConfiguredSite[] configSites = currentConfig.getConfiguredSites();
// manage ProgressMonitor
if (pm!=null){
int nbFeatures = featureReferences.size();
pm.beginTask(Policy.bind("SessionDelta.EnableFeatures"),nbFeatures);
}
// loop through all the configured site
// find the configuredSite that maintains this featureReference
// configure the feature
for (int i = 0; i < configSites.length; i++) {
Iterator iterator = featureReferences.iterator();
while (iterator.hasNext()) {
IFeatureReference ref = (IFeatureReference) iterator.next();
ISite site = ref.getSite();
if(site!=null && site.equals(configSites[i].getSite())){
IFeature featureToConfigure = null;
try {
featureToConfigure = ref.getFeature();
} catch (CoreException e){
UpdateManagerPlugin.warn(null,e);
}
if (featureToConfigure!=null){
if (pm!=null) pm.worked(1);
try {
// make sure only the latest version of the configured features
// is configured across sites [16502]
if (enable(featureToConfigure)){
configSites[i].configure(featureToConfigure);
} else {
configSites[i].unconfigure(featureToConfigure);
}
} catch (CoreException e){
// if I cannot configure one,
//then continue with others
UpdateManagerPlugin.warn("Unable to configure feature:"+featureToConfigure,e);
}
}
}
}
}
}
}
}
delete();
saveLocalSite();
}
/*
*
*/
public void delete(){
if (deleted){
UpdateManagerPlugin.warn("Attempt to delete an already deleted session delta:"+file);
return;
}
// remove the file from the file system
if (file != null){
UpdateManagerUtils.removeFromFileSystem(file);
UpdateManagerPlugin.warn("Removing SessionDelta:"+file);
} else {
UpdateManagerPlugin.warn("Unable to remove SessionDelta. File is null");
}
deleted = true;
}
/**
* @see IAdaptable#getAdapter(Class)
*/
public Object getAdapter(Class adapter) {
return null;
}
/*
*
*/
public void addReference(IFeatureReference reference) {
if (featureReferences == null)
featureReferences = new ArrayList();
featureReferences.add(reference);
}
/*
*
*/
public void setCreationDate(Date date) {
this.date = date;
}
/*
* Sets the file.
* We will remove the file
*/
public void setFile(File file) {
this.file = file;
}
/*@
* @see ISessionDelta#getType()
*/
public int getType() {
return process;
}
private void createInstallConfiguration() throws CoreException {
ILocalSite localSite = SiteManager.getLocalSite();
IInstallConfiguration config = localSite.cloneCurrentConfiguration();
config.setLabel(Utilities.format(config.getCreationDate()));
localSite.addConfiguration(config);
}
private void saveLocalSite() throws CoreException {
ILocalSite localSite = SiteManager.getLocalSite();
localSite.save();
}
/**
* return true if this feature should be configured
* A feature should be configure if it has the highest version across
* all configured features with the same identifier
*/
private boolean enable(IFeature newlyConfiguredFeatures)
throws CoreException {
ILocalSite siteLocal = SiteManager.getLocalSite();
IInstallConfiguration currentConfiguration = siteLocal.getCurrentConfiguration();
IConfiguredSite[] configuredSites;
IFeatureReference[] configuredFeaturesRef;
IFeature feature;
configuredSites = currentConfiguration.getConfiguredSites();
for (int i = 0; i < configuredSites.length; i++) {
configuredFeaturesRef = configuredSites[i].getConfiguredFeatures();
for (int j = 0; j < configuredFeaturesRef.length; j++) {
try {
feature = configuredFeaturesRef[j].getFeature();
int result = compare(newlyConfiguredFeatures,feature);
if (result!=0){
if (result==1){
ConfiguredSite cSite = (ConfiguredSite)configuredSites[i];
cSite.unconfigure(feature);
return true;
}
if (result==2){
return false;
}
}
} catch (CoreException e) {
UpdateManagerPlugin.warn(null, e);
}
}
}
// feature not found, configure it then
return true;
}
/**
* compare two feature references
* returns 0 if the feature are different
* returns 1 if the version of feature 1 is greater than the version of feature 2
* returns 2 if opposite
*/
private int compare(
IFeature feature1,
IFeature feature2)
throws CoreException {
// TRACE
if (UpdateManagerPlugin.DEBUG
&& UpdateManagerPlugin.DEBUG_SHOW_RECONCILER) {
UpdateManagerPlugin.debug(
"Compare: "
+ feature1
+ " && "
+ feature2);
}
if (feature1 == null)
return 0;
if (feature1 == null || feature2 == null) {
return 0;
}
VersionedIdentifier id1 = feature1.getVersionedIdentifier();
VersionedIdentifier id2 = feature2.getVersionedIdentifier();
if (id1 == null || id2 == null) {
return 0;
}
if (id1.getIdentifier() != null
&& id1.getIdentifier().equals(id2.getIdentifier())) {
PluginVersionIdentifier version1 = id1.getVersion();
PluginVersionIdentifier version2 = id2.getVersion();
if (version1 != null) {
if (version1.isGreaterThan(version2)) {
return 1;
} else {
return 2;
}
} else {
return 2;
}
}
return 0;
};
}