diff options
Diffstat (limited to 'update/org.eclipse.update.core/src/org/eclipse/update/internal/core/LocalSite.java')
-rw-r--r-- | update/org.eclipse.update.core/src/org/eclipse/update/internal/core/LocalSite.java | 374 |
1 files changed, 374 insertions, 0 deletions
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/internal/core/LocalSite.java b/update/org.eclipse.update.core/src/org/eclipse/update/internal/core/LocalSite.java new file mode 100644 index 000000000..c41697dc8 --- /dev/null +++ b/update/org.eclipse.update.core/src/org/eclipse/update/internal/core/LocalSite.java @@ -0,0 +1,374 @@ +/******************************************************************************* + * Copyright (c) 2000, 2008 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.update.internal.core; + +import org.eclipse.core.runtime.ListenerList; + +import java.io.File; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.Date; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.osgi.util.NLS; +import org.eclipse.update.configuration.IActivity; +import org.eclipse.update.configuration.IInstallConfiguration; +import org.eclipse.update.configuration.ILocalSite; +import org.eclipse.update.configuration.ILocalSiteChangedListener; +import org.eclipse.update.configuration.IProblemHandler; +import org.eclipse.update.configurator.ConfiguratorUtils; +import org.eclipse.update.configurator.IPlatformConfiguration; +import org.eclipse.update.core.IFeature; +import org.eclipse.update.core.Utilities; +import org.eclipse.update.internal.model.InstallConfigurationModel; +import org.eclipse.update.internal.model.SiteLocalModel; +import org.eclipse.update.internal.model.SiteLocalParser; + +/** + * This class manages the configurations. + */ + +public class LocalSite extends SiteLocalModel implements ILocalSite{ + + private ListenerList listeners = new ListenerList(ListenerList.IDENTITY); + private SiteStatusAnalyzer siteStatusAnalyzer; + private boolean isTransient = false; + + /* + * Have new features been found during reconciliation + */ + public static boolean newFeaturesFound = false; + + /* + * initialize the configurations from the persistent model. + * Set the reconciliation as non optimistic + */ + public static ILocalSite getLocalSite() throws CoreException { + return internalGetLocalSite(); + } + + /* + *Internal call is reconciliation needs to be optimistic + */ + public static ILocalSite internalGetLocalSite() throws CoreException { + + LocalSite localSite = new LocalSite(); + + // obtain platform configuration + IPlatformConfiguration currentPlatformConfiguration = ConfiguratorUtils.getCurrentPlatformConfiguration(); + localSite.isTransient(currentPlatformConfiguration.isTransient()); + + try { + URL configXML = currentPlatformConfiguration.getConfigurationLocation(); + localSite.setLocationURLString(configXML.toExternalForm()); + localSite.resolve(configXML, null); + + // Attempt to read previous state + parseLocalSiteFile(currentPlatformConfiguration, localSite); + + } catch (MalformedURLException exception) { + throw Utilities.newCoreException(NLS.bind(Messages.SiteLocal_UnableToCreateURLFor, (new String[] { localSite.getLocationURLString() + " & " + CONFIG_FILE })), exception); //$NON-NLS-1$ + } + + return localSite; + } + + /** + * Create the localSite object + */ + private static boolean parseLocalSiteFile(IPlatformConfiguration platformConfig, LocalSite localSite ) throws CoreException, MalformedURLException { + + //attempt to parse the LocalSite.xml +// URL resolvedURL = URLEncoder.encode(configXML); + try { +// InputStream in = UpdateCore.getPlugin().get(resolvedURL).getInputStream(); + new SiteLocalParser(platformConfig, localSite); + return true; + } catch (Exception exception) { + return false; + } + } + + /** + * + */ + protected LocalSite() { + } + + /** + * adds a new configuration to the LocalSite + * the newly added configuration is teh current one + */ + public void addConfiguration(IInstallConfiguration config) { + if (config != null) { + addConfigurationModel((InstallConfigurationModel) config); + + trimHistoryToCapacity(); + + // set configuration as current + if (getCurrentConfigurationModel() != null) + getCurrentConfigurationModel().setCurrent(false); + if (config instanceof InstallConfiguration) + ((InstallConfiguration) config).setCurrent(true); + + setCurrentConfigurationModel((InstallConfigurationModel) config); + ((InstallConfigurationModel) config).markReadOnly(); + + // notify listeners + Object[] siteLocalListeners = listeners.getListeners(); + for (int i = 0; i < siteLocalListeners.length; i++) { + ((ILocalSiteChangedListener) siteLocalListeners[i]).currentInstallConfigurationChanged(config); + } + } + + } + + /* + * + */ + private void trimHistoryToCapacity() { + // check if we have to remove a configuration + // the first added is #0 + while (getConfigurationHistory().length > getMaximumHistoryCount() && + getConfigurationHistory().length > 1) { + // do not remove the first element in history, this is the original config + InstallConfigurationModel removedConfig = getConfigurationHistoryModel()[1]; + if (removeConfigurationModel(removedConfig)) { + + // DEBUG: + if (UpdateCore.DEBUG && UpdateCore.DEBUG_SHOW_CONFIGURATION) { + UpdateCore.debug("Removed configuration :" + removedConfig.getLabel()); //$NON-NLS-1$ + } + + // notify listeners + Object[] siteLocalListeners = listeners.getListeners(); + for (int i = 0; i < siteLocalListeners.length; i++) { + ((ILocalSiteChangedListener) siteLocalListeners[i]).installConfigurationRemoved((IInstallConfiguration) removedConfig); + } + + //remove files + URL url = removedConfig.getURL(); + UpdateManagerUtils.removeFromFileSystem(new File(url.getFile())); + } + } + } + /* + * @see ILocalSite#addLocalSiteChangedListener(ILocalSiteChangedListener) + */ + public void addLocalSiteChangedListener(ILocalSiteChangedListener listener) { + listeners.add(listener); + } + + /* + * @see ILocalSite#removeLocalSiteChangedListener(ILocalSiteChangedListener) + */ + public void removeLocalSiteChangedListener(ILocalSiteChangedListener listener) { + listeners.add(listener); + } + + /** + * Saves the site into the config file. + * @return true if changes restart is needed + */ + public boolean save() throws CoreException { + + // Save the current configuration as + // the other are already saved + // and set runtim info for next startup + return ((InstallConfiguration) getCurrentConfiguration()).save(); + } + +// /** +// * Method createNewInstallConfiguration. +// * @return IInstallConfiguration +// */ +// private IInstallConfiguration createNewInstallConfiguration() throws CoreException { +// InstallConfiguration newInstallConfig = createConfigurationSite(null); +// newInstallConfig.setTimeline(newInstallConfig.getCreationDate().getTime()); +// return newInstallConfig; +// } + + + /** + * @since 2.0 + * @deprecated This method should not be used. The current install configuration is to be used. + */ + public IInstallConfiguration cloneCurrentConfiguration() throws CoreException { + try { + return new InstallConfiguration(getCurrentConfiguration()); + } catch (MalformedURLException e) { + throw Utilities.newCoreException(Messages.SiteLocal_cloneConfig, e); + } + } + + /** + * @since 2.0 + */ + public void revertTo(IInstallConfiguration configuration, IProgressMonitor monitor, IProblemHandler handler) throws CoreException { + + // create the activity + //Start UOW ? + ConfigurationActivity activity = new ConfigurationActivity(IActivity.ACTION_REVERT); + activity.setLabel(configuration.getLabel()); + activity.setDate(new Date()); + IInstallConfiguration newConfiguration = null; + + try { + // create a configuration + newConfiguration = cloneCurrentConfiguration(); + newConfiguration.setLabel(configuration.getLabel()); + + // add to the stack which will set up as current + addConfiguration(newConfiguration); + + // process delta + // the Configured featuresConfigured are the same as the old configuration + // the unconfigured featuresConfigured are the rest... + ((InstallConfiguration) newConfiguration).revertTo(configuration, monitor, handler); + + // everything done ok + activity.setStatus(IActivity.STATUS_OK); + } catch (CoreException e) { + // error + activity.setStatus(IActivity.STATUS_NOK); + throw e; + } catch (InterruptedException e) { + //user decided not to revert, do nothing + // because we didn't add the configuration to the history + } finally { + if (newConfiguration != null) + ((InstallConfiguration) newConfiguration).addActivity(activity); + } + + } + + /** + * @since 2.0 + * @deprecated + */ + public IInstallConfiguration addToPreservedConfigurations(IInstallConfiguration configuration) throws CoreException { + return null; + } + + /* + * @see ILocalSite#getPreservedConfigurationFor(IInstallConfiguration) + */ + public IInstallConfiguration findPreservedConfigurationFor(IInstallConfiguration configuration) { + + // based on time stamp for now + InstallConfigurationModel preservedConfig = null; + if (configuration != null) { + InstallConfigurationModel[] preservedConfigurations = getPreservedConfigurationsModel(); + if (preservedConfigurations != null) { + for (int indexPreserved = 0; indexPreserved < preservedConfigurations.length; indexPreserved++) { + if (configuration.getCreationDate().equals(preservedConfigurations[indexPreserved].getCreationDate())) { + preservedConfig = preservedConfigurations[indexPreserved]; + break; + } + } + } + } + + return (IInstallConfiguration) preservedConfig; + } + + /* + * @see ILocalSite#getCurrentConfiguration() + * LocalSiteModel#getCurrentConfigurationModel() may return null if + * we just parsed LocalSite.xml + */ + public IInstallConfiguration getCurrentConfiguration() { + if (getCurrentConfigurationModel() == null) { + int index = 0; + if ((index = getConfigurationHistoryModel().length) == 0) { + return null; + } else { + InstallConfigurationModel config = getConfigurationHistoryModel()[index - 1]; + config.setCurrent(true); + setCurrentConfigurationModel(config); + } + } + return (IInstallConfiguration) getCurrentConfigurationModel(); + } + + /* + * @see ILocalSite#getPreservedConfigurations() + */ + public IInstallConfiguration[] getPreservedConfigurations() { + if (getPreservedConfigurationsModel().length == 0) + return new IInstallConfiguration[0]; + return (IInstallConfiguration[]) getPreservedConfigurationsModel(); + } + + /* + * @see ILocalSite#removeFromPreservedConfigurations(IInstallConfiguration) + */ + public void removeFromPreservedConfigurations(IInstallConfiguration configuration) { + if (removePreservedConfigurationModel((InstallConfigurationModel) configuration)) + ((InstallConfiguration) configuration).remove(); + } + + /* + * @see ILocalSite#getConfigurationHistory() + */ + public IInstallConfiguration[] getConfigurationHistory() { + if (getConfigurationHistoryModel().length == 0) + return new IInstallConfiguration[0]; + return (IInstallConfiguration[]) getConfigurationHistoryModel(); + } + + + /** + * Gets the isTransient. + * @return Returns a boolean + */ + public boolean isTransient() { + return isTransient; + } + + /** + * Sets the isTransient. + * @param isTransient The isTransient to set + */ + private void isTransient(boolean isTransient) { + this.isTransient = isTransient; + } + + /* + * + */ + private SiteStatusAnalyzer getSiteStatusAnalyzer() { + if (siteStatusAnalyzer == null) + siteStatusAnalyzer = new SiteStatusAnalyzer(this); + return siteStatusAnalyzer; + } + + /* + * check if the Plugins of the feature are on the plugin path + * If all the plugins are on the plugin path, and the version match and there is no other version -> HAPPY + * If all the plugins are on the plugin path, and the version match and there is other version -> AMBIGUOUS + * If some of the plugins are on the plugin path, but not all -> UNHAPPY + * Check on all ConfiguredSites + */ + public IStatus getFeatureStatus(IFeature feature) throws CoreException { + return getSiteStatusAnalyzer().getFeatureStatus(feature); + } + /** + * @see org.eclipse.update.internal.model.SiteLocalModel#setMaximumHistoryCount(int) + */ + public void setMaximumHistoryCount(int history) { + super.setMaximumHistoryCount(history); + trimHistoryToCapacity(); + } + +} |