Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
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.java374
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();
+ }
+
+}

Back to the top