| /******************************************************************************* |
| * Copyright (c) 2007, 2010 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.equinox.internal.p2.touchpoint.eclipse; |
| |
| import java.io.File; |
| import java.net.*; |
| import java.util.List; |
| import org.eclipse.core.runtime.*; |
| import org.eclipse.equinox.frameworkadmin.BundleInfo; |
| import org.eclipse.equinox.internal.p2.update.*; |
| import org.eclipse.equinox.internal.provisional.frameworkadmin.Manipulator; |
| import org.eclipse.equinox.p2.core.ProvisionException; |
| import org.eclipse.osgi.util.NLS; |
| |
| /** |
| * This class provides a wrapper for reading and writing platform.xml. |
| * |
| * Only a minimal set of operations is exposed. |
| */ |
| public class PlatformConfigurationWrapper { |
| |
| private Configuration configuration = null; |
| private Site poolSite = null; |
| private File configFile; |
| private URI poolURI; |
| private Manipulator manipulator; |
| |
| private static String FEATURES = "features/"; //$NON-NLS-1$ |
| |
| private static URL getOSGiInstallArea(Manipulator manipulator) { |
| final String OSGI = "org.eclipse.osgi"; //$NON-NLS-1$ |
| BundleInfo[] bis = manipulator.getConfigData().getBundles(); |
| String searchFor = "org.eclipse.equinox.launcher"; //$NON-NLS-1$ |
| for (int i = 0; i < bis.length; i++) { |
| if (bis[i].getSymbolicName().equals(searchFor)) { |
| if (bis[i].getLocation() != null) { |
| try { |
| if (bis[i].getLocation().getScheme().equals("file")) //$NON-NLS-1$ |
| return fromOSGiJarToOSGiInstallArea(bis[i].getLocation().getPath()).toURL(); |
| } catch (MalformedURLException e) { |
| //do nothing |
| } |
| } |
| if (searchFor.equals(OSGI)) |
| return null; |
| searchFor = OSGI; |
| i = -1; |
| } |
| } |
| return null; |
| } |
| |
| private static File fromOSGiJarToOSGiInstallArea(String path) { |
| IPath parentFolder = new Path(path).removeLastSegments(1); |
| if (parentFolder.lastSegment().equals("plugins")) //$NON-NLS-1$ |
| return parentFolder.removeLastSegments(1).toFile(); |
| return parentFolder.toFile(); |
| } |
| |
| public PlatformConfigurationWrapper(File configDir, URI featurePool, Manipulator manipulator) { |
| this.configuration = null; |
| this.configFile = new File(configDir, "/org.eclipse.update/platform.xml"); //$NON-NLS-1$ |
| this.poolURI = featurePool; |
| this.manipulator = manipulator; |
| } |
| |
| private void loadDelegate() { |
| if (configuration != null) |
| return; |
| |
| try { |
| if (configFile.exists()) { |
| configuration = Configuration.load(configFile, getOSGiInstallArea(manipulator)); |
| } else { |
| configuration = new Configuration(); |
| } |
| } catch (ProvisionException pe) { |
| // TODO: Make this a real message |
| throw new IllegalStateException(Messages.error_parsing_configuration); |
| } |
| if (poolURI == null) |
| throw new IllegalStateException("Error creating platform configuration. No bundle pool defined."); //$NON-NLS-1$ |
| |
| poolSite = getSite(poolURI); |
| if (poolSite == null) { |
| poolSite = createSite(poolURI, getDefaultPolicy()); |
| configuration.add(poolSite); |
| } |
| } |
| |
| /* |
| * Return the default policy to use when creating a new site. If there are |
| * any sites with the MANAGED-ONLY policy, then that is the default. |
| * Otherwise the default is USER-EXCLUDE. |
| */ |
| private String getDefaultPolicy() { |
| for (Site site : configuration.getSites()) { |
| if (Site.POLICY_MANAGED_ONLY.equals(site.getPolicy())) |
| return Site.POLICY_MANAGED_ONLY; |
| } |
| return Site.POLICY_USER_EXCLUDE; |
| } |
| |
| /* |
| * Create and return a site object based on the given location. |
| */ |
| private Site createSite(URI location, String policy) { |
| Site result = new Site(); |
| result.setUrl(location.toString()); |
| result.setPolicy(policy); |
| result.setEnabled(true); |
| return result; |
| } |
| |
| /* |
| * Look in the configuration and return the site object whose location matches |
| * the given URL. Return null if there is no match. |
| */ |
| private Site getSite(URI url) { |
| List<Site> sites = configuration.getSites(); |
| File file = URIUtil.toFile(url); |
| for (Site nextSite : sites) { |
| try { |
| File nextFile = URIUtil.toFile(new URI(nextSite.getUrl())); |
| if (nextFile == null) |
| continue; |
| if (nextFile.equals(file)) |
| return nextSite; |
| } catch (URISyntaxException e) { |
| //ignore incorrectly formed site |
| } |
| } |
| return null; |
| } |
| |
| /* |
| * Look in the configuration and return the site which contains the feature |
| * with the given identifier and version. Return null if there is none. |
| */ |
| private Site getSite(String id, String version) { |
| List<Site> sites = configuration.getSites(); |
| for (Site site : sites) { |
| Feature[] features = site.getFeatures(); |
| for (int i = 0; i < features.length; i++) { |
| if (id.equals(features[i].getId()) && version.equals(features[i].getVersion())) |
| return site; |
| } |
| } |
| return null; |
| } |
| |
| /* |
| * @see org.eclipse.update.configurator.IPlatformConfiguration#createFeatureEntry(java.lang.String, java.lang.String, java.lang.String, java.lang.String, boolean, java.lang.String, java.net.URL[]) |
| */ |
| public IStatus addFeatureEntry(File file, String id, String version, String pluginIdentifier, String pluginVersion, boolean primary, String application, URL[] root, String linkFile) { |
| loadDelegate(); |
| if (configuration == null) |
| return new Status(IStatus.WARNING, Activator.ID, Messages.platform_config_unavailable, null); |
| |
| URI fileURL = null; |
| File featureDir = file.getParentFile(); |
| if (featureDir == null || !featureDir.getName().equals("features")) //$NON-NLS-1$ |
| return new Status(IStatus.ERROR, Activator.ID, NLS.bind(Messages.parent_dir_features, file.getAbsolutePath()), null); |
| File locationDir = featureDir.getParentFile(); |
| if (locationDir == null) |
| return new Status(IStatus.ERROR, Activator.ID, NLS.bind(Messages.cannot_calculate_extension_location, file.getAbsolutePath()), null); |
| |
| fileURL = locationDir.toURI(); |
| Site site = getSite(fileURL); |
| if (site == null) { |
| site = createSite(fileURL, getDefaultPolicy()); |
| if (linkFile != null) |
| site.setLinkFile(linkFile); |
| configuration.add(site); |
| } else { |
| // check to see if the feature already exists in this site |
| if (site.getFeature(id, version) != null) |
| return Status.OK_STATUS; |
| } |
| Feature addedFeature = new Feature(site); |
| addedFeature.setId(id); |
| addedFeature.setVersion(version); |
| addedFeature.setUrl(makeFeatureURL(id, version)); |
| addedFeature.setApplication(application); |
| addedFeature.setPluginIdentifier(pluginIdentifier); |
| addedFeature.setPluginVersion(pluginVersion); |
| addedFeature.setRoots(root); |
| addedFeature.setPrimary(primary); |
| site.addFeature(addedFeature); |
| return Status.OK_STATUS; |
| } |
| |
| /* |
| * @see org.eclipse.update.configurator.IPlatformConfiguration#findConfiguredFeatureEntry(java.lang.String) |
| */ |
| public IStatus removeFeatureEntry(String id, String version) { |
| loadDelegate(); |
| if (configuration == null) |
| return new Status(IStatus.WARNING, Activator.ID, Messages.platform_config_unavailable, null); |
| |
| Site site = getSite(id, version); |
| if (site == null) |
| site = poolSite; |
| site.removeFeature(makeFeatureURL(id, version)); |
| // if we weren't able to remove the feature from the site because it |
| // didn't exist, then someone already did our job for us and it is ok. |
| return Status.OK_STATUS; |
| } |
| |
| public boolean containsFeature(URI siteURI, String featureId, String featureVersion) { |
| loadDelegate(); |
| if (configuration == null) |
| return false; |
| |
| Site site = getSite(siteURI); |
| if (site == null) |
| return false; |
| |
| return site.getFeature(featureId, featureVersion) != null; |
| } |
| |
| /* |
| * @see org.eclipse.update.configurator.IPlatformConfiguration#save() |
| */ |
| public void save() throws ProvisionException { |
| if (configuration != null) { |
| configFile.getParentFile().mkdirs(); |
| configuration.save(configFile, getOSGiInstallArea(manipulator)); |
| } |
| } |
| |
| private static String makeFeatureURL(String id, String version) { |
| return FEATURES + id + "_" + version + "/"; //$NON-NLS-1$ //$NON-NLS-2$; |
| } |
| |
| // } |
| |
| } |