/******************************************************************************* * Copyright (c) 2000, 2006 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.model; import java.io.*; import java.net.*; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.eclipse.core.runtime.*; import org.eclipse.osgi.util.NLS; import org.eclipse.update.configurator.*; import org.eclipse.update.core.*; import org.eclipse.update.core.model.*; import org.eclipse.update.internal.core.*; /** * An InstallConfigurationModel is * */ public class InstallConfigurationModel extends ModelObject { // performance private URL bundleURL; private URL base; private boolean resolved = false; private boolean isCurrent = false; private URL locationURL; private String locationURLString; protected Date date; private String label; private List /* of ConfiguretionActivityModel */ activities; private List /* of configurationSiteModel */ configurationSites; protected boolean initialized = false; protected boolean lightlyInitialized = false; /** * default constructor. Create */ public InstallConfigurationModel() { } /** * @since 2.0 */ public ConfiguredSiteModel[] getConfigurationSitesModel() { if (!initialized) initialize(); if (configurationSites == null || configurationSites.size() == 0) return new ConfiguredSiteModel[0]; return (ConfiguredSiteModel[]) configurationSites.toArray(arrayTypeFor(configurationSites)); } /** * Adds the configuration to the list * is called when adding a Site or parsing the XML file * in this case we do not want to create a new activity, so we do not want t call * addConfigurationSite() */ public void addConfigurationSiteModel(ConfiguredSiteModel site) { if (configurationSites == null) { configurationSites = new ArrayList(); } if (!configurationSites.contains(site)) { configurationSites.add(site); } } public void setConfigurationSiteModel(ConfiguredSiteModel[] sites) { configurationSites = null; for (int i = 0; i < sites.length; i++) { addConfigurationSiteModel(sites[i]); } } /** * @since 2.0 */ public boolean removeConfigurationSiteModel(ConfiguredSiteModel site) { if (!initialized) initialize(); if (configurationSites != null) { return configurationSites.remove(site); } return false; } /** * @since 2.0 */ public boolean isCurrent() { if (!lightlyInitialized && !initialized ) doLightInitialization(); return isCurrent; } /** * @since 2.0 */ public void setCurrent(boolean isCurrent) { // do not check if writable as we may // set an install config as Not current this.isCurrent = isCurrent; } /** * @since 2.0 */ public ConfigurationActivityModel[] getActivityModel() { if (activities == null && !initialized) initialize(); if (activities == null || activities.size() == 0) return new ConfigurationActivityModel[0]; return (ConfigurationActivityModel[]) activities.toArray(arrayTypeFor(activities)); } /** * @since 2.0 */ public void addActivityModel(ConfigurationActivityModel activity) { if (activities == null) activities = new ArrayList(); if (!activities.contains(activity)) { activities.add(activity); activity.setInstallConfigurationModel(this); } } /** * */ public Date getCreationDate() { // if (!initialized) initialize(); if (date == null) doLightInitialization(); return date; } /** * Sets the date. * @param date The date to set */ public void setCreationDate(Date date) { assertIsWriteable(); this.date = date; } /** * @since 2.0 */ public URL getURL() { //if (!initialized) initialize(); //no need to initialize, always set delayedResolve(); return locationURL; } /** * @since 2.0 */ public String getLabel() { // if (!initialized) initialize(); if (label == null) doLightInitialization(); return label; } /** * @since 2.0.2 */ public String toString() { return getLabel(); } /** * Sets the label. * @param label The label to set */ public void setLabel(String label) { assertIsWriteable(); this.label = label; } /** * Gets the locationURLString. * @return Returns a String */ public String getLocationURLString() { if (!initialized) delayedResolve(); return locationURLString; } /** * Sets the locationURLString. * @param locationURLString The locationURLString to set */ public void setLocationURLString(String locationURLString) { assertIsWriteable(); this.locationURLString = locationURLString; this.locationURL = null; } /* * @see ModelObject#resolve(URL, ResourceBundle) */ public void resolve(URL base, URL bundleURL) throws MalformedURLException { this.base = base; this.bundleURL = bundleURL; } /** * Returns the timeline. * @return long */ public long getTimeline() { return 0; // if (!initialized) initialize(); // return timeline; } /* * initialize the configurations from the persistent model. */ private void initialize() { try { try { IPlatformConfiguration platformConfig = getPlatformConfiguration(); new InstallConfigurationParser(platformConfig, this, false); } catch (FileNotFoundException exception) { UpdateCore.warn(locationURLString + " does not exist, The local site is not in synch with the file system and is pointing to a file that doesn't exist.", exception); //$NON-NLS-1$ throw Utilities.newCoreException(NLS.bind(Messages.InstallConfiguration_ErrorDuringFileAccess, (new String[] { locationURLString })), exception); } catch (IOException exception) { throw Utilities.newCoreException(NLS.bind(Messages.InstallConfiguration_ErrorDuringFileAccess, (new String[] { locationURLString })), exception); } } catch (CoreException e) { UpdateCore.warn("Error processing configuration history:" + locationURL.toExternalForm(), e); //$NON-NLS-1$ } finally { initialized = true; } //finish resolve // PERF: try { // delegate resolveListReference(getActivityModel(), base, bundleURL); resolveListReference(getConfigurationSitesModel(), base, bundleURL); } catch (MalformedURLException e){} } private IPlatformConfiguration getPlatformConfiguration() throws IOException { IPlatformConfiguration platformConfig; if (UpdateManagerUtils.sameURL(getURL(), ConfiguratorUtils.getCurrentPlatformConfiguration().getConfigurationLocation())) platformConfig = ConfiguratorUtils.getCurrentPlatformConfiguration(); else platformConfig = ConfiguratorUtils.getPlatformConfiguration(getURL()); return platformConfig; } private void doLightInitialization() { try { try { IPlatformConfiguration platformConfig = getPlatformConfiguration(); new InstallConfigurationParser(platformConfig, this, true); } catch (FileNotFoundException exception) { UpdateCore.warn(locationURLString + " does not exist, The local site is not in synch with the file system and is pointing to a file that doesn't exist.", exception); //$NON-NLS-1$ throw Utilities.newCoreException(NLS.bind(Messages.InstallConfiguration_ErrorDuringFileAccess, (new String[] { locationURLString })), exception); } catch (IOException exception) { throw Utilities.newCoreException(NLS.bind(Messages.InstallConfiguration_ErrorDuringFileAccess, (new String[] { locationURLString })), exception); } } catch (CoreException e) { UpdateCore.warn("Error processing configuration history:" + locationURL.toExternalForm(), e); //$NON-NLS-1$ } finally { lightlyInitialized = true; } } /* * */ private void delayedResolve() { // PERF: delay resolution if (resolved) return; resolved = true; // resolve local elements try { //locationURL = resolveURL(base, bundleURL, locationURLString); locationURL = new URL(locationURLString); } catch (MalformedURLException e){ File f = new File(locationURLString); try { if (f.exists()) locationURL = f.toURL(); else locationURL = base; } catch (MalformedURLException e1) { locationURL = base; } } } public void resetActivities() { activities = null; } }