blob: ef83bb17e1165268e705d3caf4bbba9c99ca0526 [file] [log] [blame]
/*******************************************************************************
* 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
* James D Miles (IBM Corp.) - bug 176250, Configurator needs to handle more platform urls
*******************************************************************************/
package org.eclipse.update.internal.configurator;
import java.io.IOException;
import java.net.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import org.eclipse.core.runtime.*;
import org.eclipse.update.configurator.*;
import org.w3c.dom.*;
public class Configuration implements IConfigurationConstants {
private HashMap sites = new HashMap();
private HashMap platformURLs = new HashMap();
private Date date;
private long lastModified; // needed to account for file system limitations
private URL url;
private boolean transientConfig;
private boolean isDirty;
private Configuration linkedConfig; // shared configuration
private URL associatedInstallURL = Utils.getInstallURL();
public Configuration() {
this(new Date());
// the config is created now or out of a platform.xml without a date
isDirty = true;
}
public Configuration(Date date) {
this.date = date;
}
public void setURL(URL url) {
this.url = url;
}
public URL getURL() {
return url;
}
public void setLinkedConfig(Configuration linkedConfig) {
this.linkedConfig = linkedConfig;
// make all the sites read-only
SiteEntry[] linkedSites = linkedConfig.getSites();
for (int i=0; i<linkedSites.length; i++)
linkedSites[i].setUpdateable(false);
}
public Configuration getLinkedConfig() {
return linkedConfig;
}
/**
* @return true if the config needs to be saved
*/
public boolean isDirty() {
return isDirty;
}
public void setDirty(boolean dirty) {
isDirty = dirty;
}
public void addSiteEntry(String url, SiteEntry site) {
url = Utils.canonicalizeURL(url);
// only add the same site once
if (sites.get(url) == null && (linkedConfig == null || linkedConfig.sites.get(url) == null)) {
site.setConfig(this);
sites.put(url, site);
if(url.startsWith("platform:")){//$NON-NLS-1$
URL pURL;
try {
URL relSite= null;
if (url != null && url.startsWith("platform:/config")) {
// url for location of configuration is relative to platform.xml
URL config_loc = getURL();
relSite = new URL(config_loc, "..");
}else{
relSite = getInstallURL();
}
pURL = new URL(url);
URL rURL = PlatformConfiguration.resolvePlatformURL(pURL, relSite);
String resolvedURL = rURL.toExternalForm();
platformURLs.put(resolvedURL, pURL);
} catch (IOException e) {
// can't resolve so can't have look up.
}
}
}
}
public void removeSiteEntry(String url) {
url =Utils.canonicalizeURL(url);
sites.remove(url);
if(url.startsWith("platform:")){ //$NON-NLS-1$
URL pURL;
try {
URL relSite= null;
if (url != null && url.startsWith("platform:/config")) {
// url for location of configuration is relative to platform.xml
URL config_loc = getURL();
relSite = new URL(config_loc, "..");
}else{
relSite = getInstallURL();
}
pURL = new URL(url);
URL rURL = PlatformConfiguration.resolvePlatformURL(pURL, relSite);
String resolvedURL = rURL.toExternalForm();
platformURLs.remove(resolvedURL);
} catch (IOException e) {
// can't resolve so can't have look up.
}
}
}
public SiteEntry getSiteEntry(String url) {
url = Utils.canonicalizeURL(url);
SiteEntry site = (SiteEntry)sites.get(url);
if (site == null && linkedConfig != null)
site = linkedConfig.getSiteEntry(url);
return site;
}
public SiteEntry[] getSites() {
if (linkedConfig == null)
return (SiteEntry[]) sites.values().toArray(new SiteEntry[sites.size()]);
ArrayList combinedSites = new ArrayList(sites.values());
combinedSites.addAll(linkedConfig.sites.values());
return (SiteEntry[]) combinedSites.toArray(new SiteEntry[combinedSites.size()]);
}
public Element toXML(Document doc) throws CoreException {
try {
Element configElement = doc.createElement(CFG);
configElement.setAttribute(CFG_VERSION, VERSION);
configElement.setAttribute(CFG_DATE, String.valueOf(date.getTime()));
String transitory = isTransient() ? "true" : "false"; //$NON-NLS-1$ //$NON-NLS-2$
configElement.setAttribute(CFG_TRANSIENT, transitory);
if (linkedConfig != null) {
// make externalized URL install relative
configElement.setAttribute(CFG_SHARED_URL, Utils.makeRelative(getInstallURL(), linkedConfig.getURL()).toExternalForm());
}
// collect site entries
SiteEntry[] list = (SiteEntry[]) sites.values().toArray(new SiteEntry[0]);
for (int i = 0; i < list.length; i++) {
if (linkedConfig != null && linkedConfig.getSiteEntry(list[i].getURL().toExternalForm()) != null)
continue;
Element siteElement = list[i].toXML(doc);
configElement.appendChild(siteElement);
}
return configElement;
} catch (Exception e) {
throw Utils.newCoreException("", e); //$NON-NLS-1$
}
}
public boolean isTransient() {
return transientConfig;
}
public void setTransient(boolean isTransient) {
this.transientConfig = isTransient;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public boolean unconfigureFeatureEntry(IPlatformConfiguration.IFeatureEntry feature) {
SiteEntry[] sites = getSites();
for (int i=0; i<sites.length; i++)
if (sites[i].unconfigureFeatureEntry(feature))
return true;
return false;
}
public void setLastModified(long lastModified) {
this.lastModified = lastModified;
}
public long lastModified() {
return (lastModified != 0) ? lastModified : date.getTime();
}
/**
* Returns the url as a platform:/ url, if possible, else leaves it unchanged
* @param url
* @return
*/
public URL asPlatformURL(URL url) {
try {
if (url.getProtocol().equals("file")) {//$NON-NLS-1$
String rUrl = url.toExternalForm();
URL pUrl = (URL)platformURLs.get(rUrl);
if(pUrl == null)
return url;
return pUrl;
}
return url;
} catch (Exception e) {
return url;
}
}
public URL getInstallURL() {
return associatedInstallURL;
}
public void setInstallLocation(URL installURL) {
associatedInstallURL = installURL;
}
}