diff options
author | DJ Houghton | 2011-04-01 17:27:02 +0000 |
---|---|---|
committer | DJ Houghton | 2011-04-01 17:27:02 +0000 |
commit | 27d353691aa3e6c76116d208b4d481f527bb6bcf (patch) | |
tree | 7acea9d2e0bddb37d7f10d12c774171a88fcb857 | |
parent | b4136f528fd764b5f230ce5d361b860d267193ea (diff) | |
download | rt.equinox.p2-27d353691aa3e6c76116d208b4d481f527bb6bcf.tar.gz rt.equinox.p2-27d353691aa3e6c76116d208b4d481f527bb6bcf.tar.xz rt.equinox.p2-27d353691aa3e6c76116d208b4d481f527bb6bcf.zip |
Package was moved to new org.eclipse.equinox.p2.publisher.eclipse bundle.
26 files changed, 0 insertions, 5050 deletions
diff --git a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/AccumulateConfigDataAction.java b/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/AccumulateConfigDataAction.java deleted file mode 100644 index a1353770c..000000000 --- a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/AccumulateConfigDataAction.java +++ /dev/null @@ -1,45 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008 Code 9 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: - * Code 9 - initial API and implementation - * IBM - ongoing development - ******************************************************************************/ -package org.eclipse.equinox.p2.publisher.eclipse; - -import java.io.File; -import org.eclipse.core.runtime.*; -import org.eclipse.equinox.internal.p2.publisher.eclipse.DataLoader; -import org.eclipse.equinox.internal.provisional.frameworkadmin.ConfigData; -import org.eclipse.equinox.internal.provisional.frameworkadmin.LauncherData; -import org.eclipse.equinox.p2.publisher.*; - -public class AccumulateConfigDataAction extends AbstractPublisherAction { - - private String configSpec; - private DataLoader loader; - - public AccumulateConfigDataAction(IPublisherInfo info, String configSpec, File configurationLocation, File executableLocation) { - this.configSpec = configSpec; - loader = new DataLoader(configurationLocation, executableLocation); - } - - public IStatus perform(IPublisherInfo publisherInfo, IPublisherResult results, IProgressMonitor monitor) { - storeConfigData(publisherInfo, configSpec, results); - return Status.OK_STATUS; - } - - protected void storeConfigData(IPublisherInfo publisherInfo, String config, IPublisherResult result) { - ConfigData data = loader.getConfigData(); - if (data == null) - return; - publisherInfo.addAdvice(new ConfigAdvice(data, config)); - LauncherData launcherData = loader.getLauncherData(); - if (launcherData == null) - return; - publisherInfo.addAdvice(new LaunchingAdvice(launcherData, config)); - } -} diff --git a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/AdviceFileAdvice.java b/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/AdviceFileAdvice.java deleted file mode 100644 index d3661dfbd..000000000 --- a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/AdviceFileAdvice.java +++ /dev/null @@ -1,183 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 2009 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.p2.publisher.eclipse; - -import java.io.*; -import java.util.Map; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; -import org.eclipse.core.runtime.*; -import org.eclipse.equinox.internal.p2.core.helpers.CollectionUtils; -import org.eclipse.equinox.internal.p2.core.helpers.LogHelper; -import org.eclipse.equinox.internal.p2.publisher.Activator; -import org.eclipse.equinox.p2.metadata.*; -import org.eclipse.equinox.p2.metadata.MetadataFactory.InstallableUnitDescription; -import org.eclipse.equinox.p2.publisher.AbstractAdvice; -import org.eclipse.equinox.p2.publisher.actions.*; -import org.eclipse.equinox.p2.repository.artifact.IArtifactDescriptor; - -/** - * Publishing advice from a p2 advice file. An advice file (p2.inf) can be embedded - * in the source of a bundle, feature, or product to specify additional advice to be - * added to the {@link IInstallableUnit} corresponding to the bundle, feature, or product. - */ -public class AdviceFileAdvice extends AbstractAdvice implements ITouchpointAdvice, ICapabilityAdvice, IUpdateDescriptorAdvice, IPropertyAdvice, IAdditionalInstallableUnitAdvice { - - /** - * The location of the bundle advice file, relative to the bundle root location. - */ - public static final IPath BUNDLE_ADVICE_FILE = new Path("META-INF/p2.inf"); //$NON-NLS-1$ - - private final String id; - private final Version version; - - private Map<String, ITouchpointInstruction> touchpointInstructions; - private IProvidedCapability[] providedCapabilities; - private IRequirement[] requiredCapabilities; - private IRequirement[] metaRequiredCapabilities; - private Map<String, String> iuProperties; - private InstallableUnitDescription[] additionalIUs; - private IUpdateDescriptor updateDescriptor; - private boolean containsAdvice = false; - - /** - * Creates advice for an advice file at the given location. If <tt>basePath</tt> - * is a directory, then <tt>adviceFilePath</tt> is appended to this location to - * obtain the location of the advice file. If <tt>basePath</tt> is a file, then - * <tt>adviceFilePath</tt> is used to - * @param id The symbolic id of the installable unit this advice applies to - * @param version The version of the installable unit this advice applies to - * @param basePath The root location of the the advice file. This is either the location of - * the jar containing the advice, or a directory containing the advice file - * @param adviceFilePath The location of the advice file within the base path. This is - * either the path of a jar entry, or the path of the advice file within the directory - * specified by the base path. - */ - public AdviceFileAdvice(String id, Version version, IPath basePath, IPath adviceFilePath) { - Assert.isNotNull(id); - Assert.isNotNull(version); - Assert.isNotNull(basePath); - Assert.isNotNull(adviceFilePath); - this.id = id; - this.version = version; - - Map<String, String> advice = loadAdviceMap(basePath, adviceFilePath); - if (advice.isEmpty()) - return; - - AdviceFileParser parser = new AdviceFileParser(id, version, advice); - try { - parser.parse(); - } catch (Exception e) { - String message = "An error occured while parsing advice file: basePath=" + basePath + ", adviceFilePath=" + adviceFilePath + "."; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - IStatus status = new Status(IStatus.ERROR, Activator.ID, message, e); - LogHelper.log(status); - return; - } - touchpointInstructions = parser.getTouchpointInstructions(); - providedCapabilities = parser.getProvidedCapabilities(); - requiredCapabilities = parser.getRequiredCapabilities(); - metaRequiredCapabilities = parser.getMetaRequiredCapabilities(); - iuProperties = parser.getProperties(); - additionalIUs = parser.getAdditionalInstallableUnitDescriptions(); - updateDescriptor = parser.getUpdateDescriptor(); - containsAdvice = true; - } - - public boolean containsAdvice() { - return containsAdvice; - } - - /** - * Loads the advice file and returns it in map form. - */ - private static Map<String, String> loadAdviceMap(IPath basePath, IPath adviceFilePath) { - File location = basePath.toFile(); - if (location == null || !location.exists()) - return CollectionUtils.emptyMap(); - - ZipFile jar = null; - InputStream stream = null; - try { - if (location.isDirectory()) { - File adviceFile = new File(location, adviceFilePath.toString()); - if (!adviceFile.isFile()) - return CollectionUtils.emptyMap(); - stream = new BufferedInputStream(new FileInputStream(adviceFile)); - } else if (location.isFile()) { - jar = new ZipFile(location); - ZipEntry entry = jar.getEntry(adviceFilePath.toString()); - if (entry == null) - return CollectionUtils.emptyMap(); - - stream = new BufferedInputStream(jar.getInputStream(entry)); - } - return CollectionUtils.loadProperties(stream); - } catch (IOException e) { - String message = "An error occured while reading advice file: basePath=" + basePath + ", adviceFilePath=" + adviceFilePath + "."; //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$ - IStatus status = new Status(IStatus.ERROR, Activator.ID, message, e); - LogHelper.log(status); - return CollectionUtils.emptyMap(); - } finally { - if (stream != null) - try { - stream.close(); - } catch (IOException e) { - // ignore secondary failure - } - if (jar != null) - try { - jar.close(); - } catch (IOException e) { - // ignore secondary failure - } - } - } - - public boolean isApplicable(String configSpec, boolean includeDefault, String candidateId, Version candidateVersion) { - return id.equals(candidateId) && version.equals(candidateVersion); - } - - /*(non-Javadoc) - * @see org.eclipse.equinox.p2.publisher.eclipse.ITouchpointAdvice#getTouchpointData() - */ - public ITouchpointData getTouchpointData(ITouchpointData existing) { - return MetadataFactory.mergeTouchpointData(existing, touchpointInstructions); - } - - public IProvidedCapability[] getProvidedCapabilities(InstallableUnitDescription iu) { - return providedCapabilities; - } - - public IRequirement[] getRequiredCapabilities(InstallableUnitDescription iu) { - return requiredCapabilities; - } - - public IRequirement[] getMetaRequiredCapabilities(InstallableUnitDescription iu) { - return metaRequiredCapabilities; - } - - public InstallableUnitDescription[] getAdditionalInstallableUnitDescriptions(IInstallableUnit iu) { - return additionalIUs; - } - - public IUpdateDescriptor getUpdateDescriptor(InstallableUnitDescription iu) { - return updateDescriptor; - } - - public Map<String, String> getArtifactProperties(IInstallableUnit iu, IArtifactDescriptor descriptor) { - return null; - } - - public Map<String, String> getInstallableUnitProperties(InstallableUnitDescription iu) { - return iuProperties; - } -} diff --git a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/AdviceFileParser.java b/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/AdviceFileParser.java deleted file mode 100644 index c2d5ce782..000000000 --- a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/AdviceFileParser.java +++ /dev/null @@ -1,592 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2009 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.p2.publisher.eclipse; - -import java.net.URI; -import java.net.URISyntaxException; -import java.util.*; -import java.util.Map.Entry; -import org.eclipse.equinox.internal.p2.metadata.ArtifactKey; -import org.eclipse.equinox.p2.metadata.*; -import org.eclipse.equinox.p2.metadata.MetadataFactory.InstallableUnitDescription; -import org.eclipse.equinox.p2.metadata.MetadataFactory.InstallableUnitFragmentDescription; -import org.eclipse.equinox.spi.p2.publisher.PublisherHelper; - -public class AdviceFileParser { - - private static final String ADVICE_VERSION = "advice.version"; //$NON-NLS-1$ - - private static final String QUALIFIER_SUBSTITUTION = "$qualifier$"; //$NON-NLS-1$ - private static final String VERSION_SUBSTITUTION = "$version$"; //$NON-NLS-1$ - - private static final String UPDATE_DESCRIPTION = "update.description"; //$NON-NLS-1$ - private static final String UPDATE_SEVERITY = "update.severity"; //$NON-NLS-1$ - private static final String UPDATE_RANGE = "update.range"; //$NON-NLS-1$ - private static final String UPDATE_ID = "update.id"; //$NON-NLS-1$ - private static final String CLASSIFIER = "classifier"; //$NON-NLS-1$ - private static final String TOUCHPOINT_VERSION = "touchpoint.version"; //$NON-NLS-1$ - private static final String TOUCHPOINT_ID = "touchpoint.id"; //$NON-NLS-1$ - private static final String COPYRIGHT_LOCATION = "copyright.location"; //$NON-NLS-1$ - private static final String COPYRIGHT = "copyright"; //$NON-NLS-1$ - private static final String ID = "id"; //$NON-NLS-1$ - private static final String SINGLETON = "singleton"; //$NON-NLS-1$ - private static final String IMPORT = "import"; //$NON-NLS-1$ - private static final String RANGE = "range"; //$NON-NLS-1$ - private static final String FILTER = "filter"; //$NON-NLS-1$ - private static final String MULTIPLE = "multiple"; //$NON-NLS-1$ - private static final String OPTIONAL = "optional"; //$NON-NLS-1$ - private static final String GREEDY = "greedy"; //$NON-NLS-1$ - private static final String VERSION = "version"; //$NON-NLS-1$ - private static final String NAMESPACE = "namespace"; //$NON-NLS-1$ - private static final String NAME = "name"; //$NON-NLS-1$ - private static final String LOCATION = "location"; //$NON-NLS-1$ - private static final String VALUE = "value"; //$NON-NLS-1$ - - private static final String UNITS_PREFIX = "units."; //$NON-NLS-1$ - private static final String INSTRUCTIONS_PREFIX = "instructions."; //$NON-NLS-1$ - private static final String REQUIRES_PREFIX = "requires."; //$NON-NLS-1$ - private static final String META_REQUIREMENTS_PREFIX = "metaRequirements."; //$NON-NLS-1$ - private static final String PROVIDES_PREFIX = "provides."; //$NON-NLS-1$ - private static final String PROPERTIES_PREFIX = "properties."; //$NON-NLS-1$ - private static final String LICENSES_PREFIX = "licenses."; //$NON-NLS-1$ - private static final String ARTIFACTS_PREFIX = "artifacts."; //$NON-NLS-1$ - private static final String HOST_REQUIREMENTS_PREFIX = "hostRequirements."; //$NON-NLS-1$ - private static final String UPDATE_DESCRIPTOR_PREFIX = "update."; //$NON-NLS-1$ - - public static final Version COMPATIBLE_VERSION = Version.createOSGi(1, 0, 0); - public static final VersionRange VERSION_TOLERANCE = new VersionRange(COMPATIBLE_VERSION, true, Version.createOSGi(2, 0, 0), false); - - private Map<String, String> adviceProperties = new HashMap<String, String>(); - private List<IProvidedCapability> adviceProvides = new ArrayList<IProvidedCapability>(); - private List<IRequirement> adviceRequires = new ArrayList<IRequirement>(); - private List<IRequirement> adviceMetaRequires = new ArrayList<IRequirement>(); - private IUpdateDescriptor adviceUpdateDescriptor = null; - private Map<String, ITouchpointInstruction> adviceInstructions = new HashMap<String, ITouchpointInstruction>(); - private List<InstallableUnitDescription> adviceOtherIUs = new ArrayList<InstallableUnitDescription>(); - - private final Map<String, String> advice; - private Iterator<String> keysIterator; - private String current; - private String hostId; - private Version hostVersion; - - public AdviceFileParser(String id, Version version, Map<String, String> advice) { - this.hostId = id; - this.hostVersion = version; - this.advice = advice; - } - - public void parse() { - String adviceVersion = advice.get(ADVICE_VERSION); - if (adviceVersion != null) - checkAdviceVersion(adviceVersion); - - List<String> keys = new ArrayList<String>(advice.keySet()); - Collections.sort(keys); - - keysIterator = keys.iterator(); - next(); - - while (current != null) { - if (current.startsWith(PROPERTIES_PREFIX)) - parseProperties(PROPERTIES_PREFIX, adviceProperties); - else if (current.startsWith(UPDATE_DESCRIPTOR_PREFIX)) - this.adviceUpdateDescriptor = parseUpdateDescriptor(UPDATE_DESCRIPTOR_PREFIX, hostId); - else if (current.startsWith(PROVIDES_PREFIX)) - parseProvides(PROVIDES_PREFIX, adviceProvides); - else if (current.startsWith(REQUIRES_PREFIX)) - parseRequires(REQUIRES_PREFIX, adviceRequires); - else if (current.startsWith(META_REQUIREMENTS_PREFIX)) - parseRequires(META_REQUIREMENTS_PREFIX, adviceMetaRequires); - else if (current.startsWith(INSTRUCTIONS_PREFIX)) - parseInstructions(INSTRUCTIONS_PREFIX, adviceInstructions); - else if (current.startsWith(UNITS_PREFIX)) - parseUnits(UNITS_PREFIX, adviceOtherIUs); - else if (current.equals(ADVICE_VERSION)) { - next(); - } else { - // we ignore elements we do not understand - next(); - } - } - } - - private void checkAdviceVersion(String adviceVersion) { - Version version = Version.parseVersion(adviceVersion); - if (!VERSION_TOLERANCE.isIncluded(version)) - throw new IllegalStateException("bad version: " + version + ". Expected range was " + VERSION_TOLERANCE); //$NON-NLS-1$ //$NON-NLS-2$ - } - - private void next() { - current = keysIterator.hasNext() ? keysIterator.next() : null; - } - - private String currentValue() { - return advice.get(current).trim(); - } - - private void parseProperties(String prefix, Map<String, String> properties) { - while (current != null && current.startsWith(prefix)) { - int dotIndex = current.indexOf('.', prefix.length()); - if (dotIndex == -1) - throw new IllegalStateException("bad token: " + current); //$NON-NLS-1$ - - parseProperty(current.substring(0, dotIndex + 1), properties); - } - } - - private void parseProperty(String prefix, Map<String, String> properties) { - String propertyName = null; - String propertyValue = null; - while (current != null && current.startsWith(prefix)) { - String token = current.substring(prefix.length()); - if (token.equals(NAME)) { - propertyName = currentValue(); - } else if (token.equals(VALUE)) { - propertyValue = currentValue(); - } else { - // we ignore elements we do not understand - } - next(); - } - - properties.put(propertyName, propertyValue); - } - - private IUpdateDescriptor parseUpdateDescriptor(String prefix, String id) { - String name = id; - String description = null; - String range = "[0.0.0,$version$)"; //$NON-NLS-1$ - String severity = "0"; //$NON-NLS-1$ - - while (current != null && current.startsWith(prefix)) { - String token = current; - if (token.equals(UPDATE_ID)) { - name = currentValue(); - } else if (token.equals(UPDATE_DESCRIPTION)) { - description = currentValue(); - } else if (token.equals(UPDATE_RANGE)) { - range = currentValue(); - } else if (token.equals(UPDATE_SEVERITY)) { - severity = currentValue(); - } else { - // ignore - } - next(); - } - - range = substituteVersionAndQualifier(range); - VersionRange versionRange = new VersionRange(range); - return MetadataFactory.createUpdateDescriptor(name, versionRange, Integer.valueOf(severity), description); - } - - private void parseProvides(String prefix, List<IProvidedCapability> provides) { - while (current != null && current.startsWith(prefix)) { - int dotIndex = current.indexOf('.', prefix.length()); - if (dotIndex == -1) - throw new IllegalStateException("bad token: " + current); //$NON-NLS-1$ - - parseProvided(current.substring(0, dotIndex + 1), provides); - } - } - - private void parseProvided(String prefix, List<IProvidedCapability> provides) { - String namespace = null; - String name = null; - Version capabilityVersion = null; - while (current != null && current.startsWith(prefix)) { - String token = current.substring(prefix.length()); - if (token.equals(NAME)) { - name = currentValue(); - } else if (token.equals(NAMESPACE)) { - namespace = currentValue(); - } else if (token.equals(VERSION)) { - capabilityVersion = Version.parseVersion(substituteVersionAndQualifier(currentValue())); - } else { - // we ignore elements we do not understand - } - next(); - } - - IProvidedCapability capability = MetadataFactory.createProvidedCapability(namespace, name, capabilityVersion); - provides.add(capability); - } - - private void parseRequires(String prefix, List<IRequirement> requires) { - while (current != null && current.startsWith(prefix)) { - int dotIndex = current.indexOf('.', prefix.length()); - if (dotIndex == -1) - throw new IllegalStateException("bad token: " + current); //$NON-NLS-1$ - - parseRequired(current.substring(0, dotIndex + 1), requires); - } - } - - private void parseRequired(String prefix, List<IRequirement> requires) { - - String namespace = null; - String name = null; - VersionRange range = null; - String filter = null; - boolean optional = false; - boolean multiple = false; - boolean greedy = true; - - while (current != null && current.startsWith(prefix)) { - String token = current.substring(prefix.length()); - if (token.equals(GREEDY)) { - greedy = Boolean.valueOf(currentValue()).booleanValue(); - } else if (token.equals(OPTIONAL)) { - optional = Boolean.valueOf(currentValue()).booleanValue(); - } else if (token.equals(MULTIPLE)) { - multiple = Boolean.valueOf(currentValue()).booleanValue(); - } else if (token.equals(FILTER)) { - filter = currentValue(); - } else if (token.equals(NAME)) { - name = currentValue(); - } else if (token.equals(NAMESPACE)) { - namespace = currentValue(); - } else if (token.equals(RANGE)) { - range = new VersionRange(substituteVersionAndQualifier(currentValue())); - } else { - // we ignore elements we do not understand - } - next(); - } - IRequirement capability = MetadataFactory.createRequirement(namespace, name, range, filter, optional, multiple, greedy); - requires.add(capability); - } - - private void parseInstructions(String prefix, Map<String, ITouchpointInstruction> instructions) { - while (current != null && current.startsWith(prefix)) { - int dotIndex = current.indexOf('.', prefix.length()); - if (dotIndex != -1) - throw new IllegalStateException("bad token: " + current); //$NON-NLS-1$ - - parseInstruction(current, instructions); - } - } - - private void parseInstruction(String prefix, Map<String, ITouchpointInstruction> instructions) { - String phase = current.substring(current.lastIndexOf('.') + 1); - String body = currentValue(); - next(); - - prefix += '.'; - String importAttribute = null; - if (current != null && current.startsWith(prefix)) { - if (current.substring(prefix.length()).equals(IMPORT)) { - importAttribute = currentValue(); - } else { - // we ignore elements we do not understand - } - next(); - } - ITouchpointInstruction instruction = MetadataFactory.createTouchpointInstruction(body, importAttribute); - instructions.put(phase, instruction); - } - - private void parseUnits(String prefix, List<InstallableUnitDescription> ius) { - while (current != null && current.startsWith(prefix)) { - int dotIndex = current.indexOf('.', prefix.length()); - if (dotIndex == -1) - throw new IllegalStateException("bad token: " + current + " = " + currentValue()); //$NON-NLS-1$ //$NON-NLS-2$ - - parseUnit(current.substring(0, dotIndex + 1), ius); - } - } - - private void parseUnit(String prefix, List<InstallableUnitDescription> units) { - String unitId = null; - Version unitVersion = null; - boolean unitSingleton = false; - String unitFilter = null; - String unitCopyright = null; - String unitCopyrightLocation = null; - String unitTouchpointId = null; - Version unitTouchpointVersion = null; - - String unitUpdateId = null; - VersionRange unitUpdateRange = null; - int unitUpdateSeverity = 0; - String unitUpdateDescription = null; - - List<IArtifactKey> unitArtifacts = new ArrayList<IArtifactKey>(); - Map<String, String> unitProperties = new HashMap<String, String>(); - List<IRequirement> unitHostRequirements = new ArrayList<IRequirement>(); - List<IProvidedCapability> unitProvides = new ArrayList<IProvidedCapability>(); - List<IRequirement> unitRequires = new ArrayList<IRequirement>(); - List<IRequirement> unitMetaRequirements = new ArrayList<IRequirement>(); - List<ILicense> unitLicenses = new ArrayList<ILicense>(); - Map<String, ITouchpointInstruction> unitInstructions = new HashMap<String, ITouchpointInstruction>(); - // updatedescriptor ?? - - while (current != null && current.startsWith(prefix)) { - String token = current.substring(prefix.length()); - if (token.equals(ID)) { - unitId = currentValue(); - next(); - } else if (token.equals(VERSION)) { - unitVersion = Version.parseVersion(substituteVersionAndQualifier(currentValue())); - next(); - } else if (token.equals(SINGLETON)) { - unitSingleton = Boolean.valueOf(currentValue()).booleanValue(); - next(); - } else if (token.equals(FILTER)) { - unitFilter = currentValue(); - next(); - } else if (token.equals(COPYRIGHT)) { - unitCopyright = currentValue(); - next(); - } else if (token.equals(COPYRIGHT_LOCATION)) { - unitCopyrightLocation = currentValue(); - next(); - } else if (token.equals(TOUCHPOINT_ID)) { - unitTouchpointId = currentValue(); - next(); - } else if (token.equals(TOUCHPOINT_VERSION)) { - unitTouchpointVersion = Version.parseVersion(substituteVersionAndQualifier(currentValue())); - next(); - } else if (token.equals(UPDATE_ID)) { - unitUpdateId = currentValue(); - next(); - } else if (token.equals(UPDATE_RANGE)) { - unitUpdateRange = new VersionRange(substituteVersionAndQualifier(currentValue())); - next(); - } else if (token.equals(UPDATE_SEVERITY)) { - unitUpdateSeverity = Integer.parseInt(currentValue()); - next(); - } else if (token.equals(UPDATE_DESCRIPTION)) { - unitUpdateDescription = currentValue(); - next(); - } else if (token.startsWith(HOST_REQUIREMENTS_PREFIX)) - parseRequires(prefix + HOST_REQUIREMENTS_PREFIX, unitHostRequirements); - else if (token.startsWith(ARTIFACTS_PREFIX)) - parseArtifacts(prefix + ARTIFACTS_PREFIX, unitArtifacts); - else if (token.startsWith(LICENSES_PREFIX)) - parseLicenses(prefix + LICENSES_PREFIX, unitLicenses); - else if (token.startsWith(PROPERTIES_PREFIX)) - parseProperties(prefix + PROPERTIES_PREFIX, unitProperties); - else if (token.startsWith(PROVIDES_PREFIX)) - parseProvides(prefix + PROVIDES_PREFIX, unitProvides); - else if (token.startsWith(REQUIRES_PREFIX)) - parseRequires(prefix + REQUIRES_PREFIX, unitRequires); - else if (token.startsWith(META_REQUIREMENTS_PREFIX)) - parseRequires(prefix + META_REQUIREMENTS_PREFIX, unitMetaRequirements); - else if (token.startsWith(INSTRUCTIONS_PREFIX)) - parseInstructions(prefix + INSTRUCTIONS_PREFIX, unitInstructions); - else { - // we ignore elements we do not understand - next(); - } - } - - InstallableUnitDescription description = unitHostRequirements.isEmpty() ? new InstallableUnitDescription() : new InstallableUnitFragmentDescription(); - description.setId(unitId); - description.setVersion(unitVersion); - description.setSingleton(unitSingleton); - description.setFilter(unitFilter); - if (unitCopyright != null || unitCopyrightLocation != null) { - try { - URI uri = unitCopyrightLocation != null ? new URI(unitCopyrightLocation) : null; - description.setCopyright(MetadataFactory.createCopyright(uri, unitCopyright)); - } catch (URISyntaxException e) { - throw new IllegalStateException("bad copyright URI at token: " + current + ", " + currentValue()); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - if (unitTouchpointId != null) - description.setTouchpointType(MetadataFactory.createTouchpointType(unitTouchpointId, unitTouchpointVersion)); - - if (unitUpdateId != null) - description.setUpdateDescriptor(MetadataFactory.createUpdateDescriptor(unitUpdateId, unitUpdateRange, unitUpdateSeverity, unitUpdateDescription)); - - if (!unitLicenses.isEmpty()) - description.setLicenses(unitLicenses.toArray(new ILicense[unitLicenses.size()])); - - if (!unitArtifacts.isEmpty()) - description.setArtifacts(unitArtifacts.toArray(new IArtifactKey[unitArtifacts.size()])); - - if (!unitHostRequirements.isEmpty()) - ((InstallableUnitFragmentDescription) description).setHost(unitHostRequirements.toArray(new IRequirement[unitHostRequirements.size()])); - - if (!unitProperties.isEmpty()) { - for (Entry<String, String> entry : unitProperties.entrySet()) { - description.setProperty(entry.getKey(), entry.getValue()); - } - } - - if (!unitProvides.isEmpty()) - description.setCapabilities(unitProvides.toArray(new IProvidedCapability[unitProvides.size()])); - - if (!unitRequires.isEmpty()) - description.setRequirements(unitRequires.toArray(new IRequirement[unitRequires.size()])); - - if (!unitMetaRequirements.isEmpty()) - description.setMetaRequirements(unitMetaRequirements.toArray(new IRequirement[unitMetaRequirements.size()])); - - if (!unitInstructions.isEmpty()) - description.addTouchpointData(MetadataFactory.createTouchpointData(unitInstructions)); - - adviceOtherIUs.add(description); - } - - private void parseLicenses(String prefix, List<ILicense> licenses) { - while (current != null && current.startsWith(prefix)) { - int dotIndex = current.indexOf('.', prefix.length()); - if (dotIndex != -1) - throw new IllegalStateException("bad token: " + current + " = " + currentValue()); //$NON-NLS-1$ //$NON-NLS-2$ - - parseLicense(current, licenses); - } - } - - private void parseLicense(String prefix, List<ILicense> licenses) { - String body = currentValue(); - next(); - - prefix += '.'; - String location = null; - if (current != null && current.startsWith(prefix)) { - if (current.substring(prefix.length()).equals(LOCATION)) { - location = currentValue(); - } else { - // we ignore elements we do not understand - } - next(); - } - - try { - URI uri = location != null ? new URI(location) : null; - ILicense license = MetadataFactory.createLicense(uri, body); - licenses.add(license); - } catch (URISyntaxException e) { - throw new IllegalStateException("bad license URI at token: " + current + ", " + currentValue()); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - - private void parseArtifacts(String prefix, List<IArtifactKey> artifacts) { - while (current != null && current.startsWith(prefix)) { - int dotIndex = current.indexOf('.', prefix.length()); - if (dotIndex == -1) - throw new IllegalStateException("bad token: " + current + " = " + currentValue()); //$NON-NLS-1$ //$NON-NLS-2$ - - parseArtifact(current.substring(0, dotIndex + 1), artifacts); - } - } - - private void parseArtifact(String prefix, List<IArtifactKey> artifacts) { - String artifactClassifier = null; - String artifactId = null; - Version artifactVersion = null; - while (current != null && current.startsWith(prefix)) { - String token = current.substring(prefix.length()); - if (token.equals(CLASSIFIER)) { - artifactClassifier = currentValue(); - } else if (token.equals(ID)) { - artifactId = currentValue(); - } else if (token.equals(VERSION)) { - artifactVersion = Version.parseVersion(substituteVersionAndQualifier(currentValue())); - } else { - // we ignore elements we do not understand - } - - next(); - } - IArtifactKey artifactKey = new ArtifactKey(artifactClassifier, artifactId, artifactVersion); - artifacts.add(artifactKey); - } - - private String substituteVersionAndQualifier(String version) { - if (version.indexOf(VERSION_SUBSTITUTION) != -1) { - version = replace(version, VERSION_SUBSTITUTION, hostVersion.toString()); - } - - if (version.indexOf(QUALIFIER_SUBSTITUTION) != -1) { - try { - String qualifier = PublisherHelper.toOSGiVersion(hostVersion).getQualifier(); - if (qualifier == null) - qualifier = ""; //$NON-NLS-1$ - if (qualifier.length() == 0) { - // Note: this works only for OSGi versions and version ranges - // where the qualifier if present must be at the end of a version string - version = replace(version, "." + QUALIFIER_SUBSTITUTION, ""); //$NON-NLS-1$ //$NON-NLS-2$ - } - version = replace(version, QUALIFIER_SUBSTITUTION, qualifier); - } catch (UnsupportedOperationException e) { - // Version cannot be converted to OSGi - } - } - return version; - } - - // originally from org.eclipse.core.internal.net.StringUtil - public static String replace(String source, String from, String to) { - if (from.length() == 0) - return source; - StringBuffer buffer = new StringBuffer(); - int current = 0; - int pos = 0; - while (pos != -1) { - pos = source.indexOf(from, current); - if (pos == -1) { - buffer.append(source.substring(current)); - } else { - buffer.append(source.substring(current, pos)); - buffer.append(to); - current = pos + from.length(); - } - } - return buffer.toString(); - } - - public Map<String, String> getProperties() { - if (adviceProperties.isEmpty()) - return null; - return adviceProperties; - } - - public IRequirement[] getRequiredCapabilities() { - if (adviceRequires.isEmpty()) - return null; - - return adviceRequires.toArray(new IRequirement[adviceRequires.size()]); - } - - public IProvidedCapability[] getProvidedCapabilities() { - if (adviceProvides.isEmpty()) - return null; - - return adviceProvides.toArray(new IProvidedCapability[adviceProvides.size()]); - } - - public IUpdateDescriptor getUpdateDescriptor() { - return adviceUpdateDescriptor; - } - - public Map<String, ITouchpointInstruction> getTouchpointInstructions() { - if (adviceInstructions.isEmpty()) - return null; - - return adviceInstructions; - } - - public InstallableUnitDescription[] getAdditionalInstallableUnitDescriptions() { - if (adviceOtherIUs.isEmpty()) - return null; - - return adviceOtherIUs.toArray(new InstallableUnitDescription[adviceOtherIUs.size()]); - } - - public IRequirement[] getMetaRequiredCapabilities() { - if (adviceMetaRequires.isEmpty()) - return null; - - return adviceMetaRequires.toArray(new IRequirement[adviceMetaRequires.size()]); - } -}
\ No newline at end of file diff --git a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/ApplicationLauncherAction.java b/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/ApplicationLauncherAction.java deleted file mode 100644 index 3c5497a5a..000000000 --- a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/ApplicationLauncherAction.java +++ /dev/null @@ -1,149 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 2009 Code 9 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: - * Code 9 - initial API and implementation - * IBM - ongoing development - ******************************************************************************/ -package org.eclipse.equinox.p2.publisher.eclipse; - -import org.eclipse.equinox.p2.metadata.MetadataFactory; -import org.eclipse.equinox.p2.metadata.MetadataFactory.InstallableUnitDescription; - -import org.eclipse.equinox.p2.query.QueryUtil; - -import java.io.File; -import java.util.*; -import org.eclipse.core.runtime.*; -import org.eclipse.equinox.internal.p2.publisher.eclipse.ExecutablesDescriptor; -import org.eclipse.equinox.p2.metadata.*; -import org.eclipse.equinox.p2.publisher.*; -import org.eclipse.equinox.p2.publisher.actions.VersionAdvice; - -/** - * Create IUs and CUs that represent the entire launcher for an application. This includes - * the executable, the launcher fragments as well as the CUs required to install and configure - * these elements. - */ -public class ApplicationLauncherAction extends AbstractPublisherAction { - - private String flavor; - private String[] configSpecs; - private File location; - private String executableName; - private Version version; - private String id; - - /** - * Returns the id of the top level IU published by this action for the given id and flavor. - * @param id the id of the application being published - * @param flavor the flavor being published - * @return the if for ius published by this action - */ - public static String computeIUId(String id, String flavor) { - return flavor + id + ".application"; //$NON-NLS-1$ - } - - public ApplicationLauncherAction(String id, Version version, String flavor, String executableName, File location, String[] configSpecs) { - this.flavor = flavor; - this.configSpecs = configSpecs; - this.id = id; - this.version = version; - this.executableName = executableName; - this.location = location; - } - - public IStatus perform(IPublisherInfo publisherInfo, IPublisherResult results, IProgressMonitor monitor) { - // Create the basic actions and run them putting the IUs in a temporary result - Collection<IPublisherAction> actions = createActions(publisherInfo); - createAdvice(publisherInfo, results); - IPublisherResult innerResult = new PublisherResult(); - MultiStatus finalStatus = new MultiStatus(ApplicationLauncherAction.class.getName(), 0, "publishing result", null); //$NON-NLS-1$ - for (IPublisherAction action : actions) { - if (monitor.isCanceled()) - return Status.CANCEL_STATUS; - finalStatus.merge(action.perform(publisherInfo, innerResult, monitor)); - } - if (!finalStatus.isOK()) - return finalStatus; - // merge the IUs into the final result as non-roots and create a parent IU that captures them all - results.merge(innerResult, IPublisherResult.MERGE_ALL_NON_ROOT); - publishApplicationLauncherIU(innerResult.getIUs(null, IPublisherResult.ROOT), results); - return Status.OK_STATUS; - } - - /** - * Create advice needed by the actions related to and following this action - */ - private void createAdvice(IPublisherInfo publisherInfo, IPublisherResult results) { - createLauncherAdvice(publisherInfo, results); - } - - /** - * Create and register advice that will tell people what versions of the launcher bundle and - * fragments are in use in this particular result. - */ - private void createLauncherAdvice(IPublisherInfo publisherInfo, IPublisherResult results) { - Collection<IInstallableUnit> ius = getIUs(results.getIUs(null, null), EquinoxLauncherCUAction.ORG_ECLIPSE_EQUINOX_LAUNCHER); - VersionAdvice advice = new VersionAdvice(); - boolean found = false; - for (IInstallableUnit iu : ius) { - // skip over source bundles and fragments - // TODO should we use the source property here rather than magic name matching? - if (iu.getId().endsWith(".source") || QueryUtil.isFragment(iu)) //$NON-NLS-1$ - continue; - advice.setVersion(IInstallableUnit.NAMESPACE_IU_ID, iu.getId(), iu.getVersion()); - found = true; - } - if (found) - publisherInfo.addAdvice(advice); - } - - private Collection<IInstallableUnit> getIUs(Collection<IInstallableUnit> ius, String prefix) { - Set<IInstallableUnit> result = new HashSet<IInstallableUnit>(); - for (IInstallableUnit tmp : ius) { - if (tmp.getId().startsWith(prefix)) - result.add(tmp); - } - return result; - } - - private void publishApplicationLauncherIU(Collection<? extends IVersionedId> children, IPublisherResult result) { - InstallableUnitDescription descriptor = createParentIU(children, computeIUId(id, flavor), version); - descriptor.setSingleton(true); - IInstallableUnit rootIU = MetadataFactory.createInstallableUnit(descriptor); - if (rootIU == null) - return; - result.addIU(rootIU, IPublisherResult.ROOT); - } - - private Collection<IPublisherAction> createActions(IPublisherInfo publisherInfo) { - Collection<IPublisherAction> actions = new ArrayList<IPublisherAction>(); - actions.add(new EquinoxLauncherCUAction(flavor, configSpecs)); - actions.addAll(createExecutablesActions(configSpecs)); - return actions; - } - - protected Collection<IPublisherAction> createExecutablesActions(String[] configs) { - Collection<IPublisherAction> actions = new ArrayList<IPublisherAction>(configs.length); - for (int i = 0; i < configs.length; i++) { - ExecutablesDescriptor executables = computeExecutables(configs[i]); - IPublisherAction action = new EquinoxExecutableAction(executables, configs[i], id, version, flavor); - actions.add(action); - } - return actions; - } - - protected ExecutablesDescriptor computeExecutables(String configSpec) { - // See if we know about an executables feature then use it as the source - ExecutablesDescriptor result = ExecutablesDescriptor.createExecutablesFromFeature(location, configSpec); - if (result != null) - return result; - // otherwise, assume that we are running against an Eclipse install and do the default thing - String os = AbstractPublisherAction.parseConfigSpec(configSpec)[1]; - return ExecutablesDescriptor.createDescriptor(os, executableName, location); - } -} diff --git a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/BundleShapeAdvice.java b/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/BundleShapeAdvice.java deleted file mode 100644 index 510da514e..000000000 --- a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/BundleShapeAdvice.java +++ /dev/null @@ -1,39 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008 Code 9 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: - * Code 9 - initial API and implementation - ******************************************************************************/ -package org.eclipse.equinox.p2.publisher.eclipse; - -import org.eclipse.equinox.p2.metadata.Version; -import org.eclipse.equinox.p2.publisher.AbstractAdvice; - -public class BundleShapeAdvice extends AbstractAdvice implements IBundleShapeAdvice { - - private String shape; - private Version version; - private String id; - - public BundleShapeAdvice(String id, Version version, String shape) { - this.id = id; - this.version = version; - this.shape = shape; - } - - protected String getId() { - return id; - } - - protected Version getVersion() { - return version; - } - - public String getShape() { - return shape; - } - -} diff --git a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/BundlesAction.java b/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/BundlesAction.java deleted file mode 100644 index af9a9b82b..000000000 --- a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/BundlesAction.java +++ /dev/null @@ -1,822 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 2010 Code 9 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: - * Code 9 - initial API and implementation - * IBM - ongoing development - ******************************************************************************/ -package org.eclipse.equinox.p2.publisher.eclipse; - -import java.io.*; -import java.util.*; -import java.util.Map.Entry; -import java.util.jar.JarFile; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; -import org.eclipse.core.runtime.*; -import org.eclipse.equinox.frameworkadmin.BundleInfo; -import org.eclipse.equinox.internal.p2.core.helpers.LogHelper; -import org.eclipse.equinox.internal.p2.core.helpers.ServiceHelper; -import org.eclipse.equinox.internal.p2.metadata.ArtifactKey; -import org.eclipse.equinox.internal.p2.publisher.Activator; -import org.eclipse.equinox.internal.p2.publisher.Messages; -import org.eclipse.equinox.internal.p2.publisher.eclipse.GeneratorBundleInfo; -import org.eclipse.equinox.p2.metadata.*; -import org.eclipse.equinox.p2.metadata.MetadataFactory.InstallableUnitDescription; -import org.eclipse.equinox.p2.metadata.MetadataFactory.InstallableUnitFragmentDescription; -import org.eclipse.equinox.p2.metadata.Version; -import org.eclipse.equinox.p2.metadata.VersionRange; -import org.eclipse.equinox.p2.metadata.expression.IMatchExpression; -import org.eclipse.equinox.p2.publisher.*; -import org.eclipse.equinox.p2.publisher.actions.*; -import org.eclipse.equinox.p2.query.IQueryResult; -import org.eclipse.equinox.p2.repository.artifact.IArtifactDescriptor; -import org.eclipse.equinox.p2.repository.artifact.IArtifactRepository; -import org.eclipse.equinox.spi.p2.publisher.LocalizationHelper; -import org.eclipse.equinox.spi.p2.publisher.PublisherHelper; -import org.eclipse.osgi.service.pluginconversion.PluginConversionException; -import org.eclipse.osgi.service.pluginconversion.PluginConverter; -import org.eclipse.osgi.service.resolver.*; -import org.eclipse.osgi.util.ManifestElement; -import org.eclipse.osgi.util.NLS; -import org.osgi.framework.*; -import org.osgi.service.packageadmin.PackageAdmin; - -/** - * Publish IUs for all of the bundles in a given set of locations or described by a set of - * bundle descriptions. The locations can be actual locations of the bundles or folders - * of bundles. - * - * This action consults the following types of advice: - * </ul> - * <li>{@link IAdditionalInstallableUnitAdvice }</li> - * <li>{@link IBundleShapeAdvice}</li> - * <li>{@link ICapabilityAdvice}</li> - * <li>{@link IPropertyAdvice}</li> - * <li>{@link ITouchpointAdvice}</li> - * </ul> - */ -public class BundlesAction extends AbstractPublisherAction { - - // TODO reconsider the references to these specific ids in the action. The action should be generic - protected static final String ORG_ECLIPSE_EQUINOX_SIMPLECONFIGURATOR = "org.eclipse.equinox.simpleconfigurator"; //$NON-NLS-1$ - protected static final String ORG_ECLIPSE_UPDATE_CONFIGURATOR = "org.eclipse.update.configurator"; //$NON-NLS-1$ - /** - * A capability name in the {@link PublisherHelper#NAMESPACE_ECLIPSE_TYPE} namespace - * representing and OSGi bundle resource - * @see IProvidedCapability#getName() - */ - public static final String TYPE_ECLIPSE_BUNDLE = "bundle"; //$NON-NLS-1$ - - /** - * A capability name in the {@link PublisherHelper#NAMESPACE_ECLIPSE_TYPE} namespace - * representing a source bundle - * @see IProvidedCapability#getName() - */ - public static final String TYPE_ECLIPSE_SOURCE = "source"; //$NON-NLS-1$ - - public static final String OSGI_BUNDLE_CLASSIFIER = "osgi.bundle"; //$NON-NLS-1$ - private static final String CAPABILITY_NS_OSGI_BUNDLE = "osgi.bundle"; //$NON-NLS-1$ - private static final String CAPABILITY_NS_OSGI_FRAGMENT = "osgi.fragment"; //$NON-NLS-1$ - - public static final IProvidedCapability BUNDLE_CAPABILITY = MetadataFactory.createProvidedCapability(PublisherHelper.NAMESPACE_ECLIPSE_TYPE, TYPE_ECLIPSE_BUNDLE, Version.createOSGi(1, 0, 0)); - public static final IProvidedCapability SOURCE_BUNDLE_CAPABILITY = MetadataFactory.createProvidedCapability(PublisherHelper.NAMESPACE_ECLIPSE_TYPE, TYPE_ECLIPSE_SOURCE, Version.createOSGi(1, 0, 0)); - - static final String DEFAULT_BUNDLE_LOCALIZATION = "OSGI-INF/l10n/bundle"; //$NON-NLS-1$ - - private static final String[] BUNDLE_IU_PROPERTY_MAP = {Constants.BUNDLE_NAME, IInstallableUnit.PROP_NAME, Constants.BUNDLE_DESCRIPTION, IInstallableUnit.PROP_DESCRIPTION, Constants.BUNDLE_VENDOR, IInstallableUnit.PROP_PROVIDER, Constants.BUNDLE_CONTACTADDRESS, IInstallableUnit.PROP_CONTACT, Constants.BUNDLE_DOCURL, IInstallableUnit.PROP_DOC_URL, Constants.BUNDLE_UPDATELOCATION, IInstallableUnit.PROP_BUNDLE_LOCALIZATION, Constants.BUNDLE_LOCALIZATION, IInstallableUnit.PROP_BUNDLE_LOCALIZATION}; - public static final int BUNDLE_LOCALIZATION_INDEX = PublisherHelper.BUNDLE_LOCALIZED_PROPERTIES.length - 1; - public static final String DIR = "dir"; //$NON-NLS-1$ - public static final String JAR = "jar"; //$NON-NLS-1$ - private static final String FEATURE_FILENAME_DESCRIPTOR = "feature.xml"; //$NON-NLS-1$ - private static final String PLUGIN_FILENAME_DESCRIPTOR = "plugin.xml"; //$NON-NLS-1$ - private static final String FRAGMENT_FILENAME_DESCRIPTOR = "fragment.xml"; //$NON-NLS-1$ - public static String BUNDLE_SHAPE = "Eclipse-BundleShape"; //$NON-NLS-1$ - - private File[] locations; - private BundleDescription[] bundles; - - public static IArtifactKey createBundleArtifactKey(String bsn, String version) { - return new ArtifactKey(OSGI_BUNDLE_CLASSIFIER, bsn, Version.parseVersion(version)); - } - - public static IInstallableUnit createBundleConfigurationUnit(String hostId, Version cuVersion, boolean isBundleFragment, GeneratorBundleInfo configInfo, String configurationFlavor, IMatchExpression<IInstallableUnit> filter) { - if (configInfo == null) - return null; - - InstallableUnitFragmentDescription cu = new InstallableUnitFragmentDescription(); - String configUnitId = configurationFlavor + hostId; - cu.setId(configUnitId); - cu.setVersion(cuVersion); - - //Indicate the IU to which this CU apply - Version hostVersion = Version.parseVersion(configInfo.getVersion()); - VersionRange range = hostVersion == Version.emptyVersion ? VersionRange.emptyRange : new VersionRange(hostVersion, true, Version.MAX_VERSION, true); - cu.setHost(new IRequirement[] { // - MetadataFactory.createRequirement(CAPABILITY_NS_OSGI_BUNDLE, hostId, range, null, false, false, true), // - MetadataFactory.createRequirement(PublisherHelper.NAMESPACE_ECLIPSE_TYPE, TYPE_ECLIPSE_BUNDLE, new VersionRange(Version.createOSGi(1, 0, 0), true, Version.createOSGi(2, 0, 0), false), null, false, false, false)}); - - //Adds capabilities for fragment, self, and describing the flavor supported - cu.setProperty(InstallableUnitDescription.PROP_TYPE_FRAGMENT, Boolean.TRUE.toString()); - cu.setCapabilities(new IProvidedCapability[] {PublisherHelper.createSelfCapability(configUnitId, cuVersion), MetadataFactory.createProvidedCapability(PublisherHelper.NAMESPACE_FLAVOR, configurationFlavor, Version.createOSGi(1, 0, 0))}); - - Map<String, String> touchpointData = new HashMap<String, String>(); - touchpointData.put("install", "installBundle(bundle:${artifact})"); //$NON-NLS-1$ //$NON-NLS-2$ - touchpointData.put("uninstall", "uninstallBundle(bundle:${artifact})"); //$NON-NLS-1$ //$NON-NLS-2$ - touchpointData.put("configure", createConfigScript(configInfo, isBundleFragment)); //$NON-NLS-1$ - touchpointData.put("unconfigure", createUnconfigScript(configInfo, isBundleFragment)); //$NON-NLS-1$ - cu.addTouchpointData(MetadataFactory.createTouchpointData(touchpointData)); - cu.setFilter(filter); - return MetadataFactory.createInstallableUnit(cu); - } - - public static IInstallableUnit createBundleIU(BundleDescription bd, IArtifactKey key, IPublisherInfo info) { - @SuppressWarnings("unchecked") - Map<String, String> manifest = (Map<String, String>) bd.getUserObject(); - Map<Locale, Map<String, String>> manifestLocalizations = null; - if (manifest != null && bd.getLocation() != null) - manifestLocalizations = getManifestLocalizations(manifest, new File(bd.getLocation())); - InstallableUnitDescription iu = new MetadataFactory.InstallableUnitDescription(); - iu.setSingleton(bd.isSingleton()); - iu.setId(bd.getSymbolicName()); - iu.setVersion(PublisherHelper.fromOSGiVersion(bd.getVersion())); - iu.setFilter(bd.getPlatformFilter()); - iu.setUpdateDescriptor(MetadataFactory.createUpdateDescriptor(bd.getSymbolicName(), computeUpdateRange(bd.getVersion()), IUpdateDescriptor.NORMAL, null)); - iu.setArtifacts(new IArtifactKey[] {key}); - iu.setTouchpointType(PublisherHelper.TOUCHPOINT_OSGI); - - boolean isFragment = bd.getHost() != null; - // boolean requiresAFragment = isFragment ? false : requireAFragment(bd, manifest); - - //Process the required bundles - BundleSpecification requiredBundles[] = bd.getRequiredBundles(); - ArrayList<IRequirement> reqsDeps = new ArrayList<IRequirement>(); - // if (requiresAFragment) - // reqsDeps.add(MetadataFactory.createRequiredCapability(CAPABILITY_TYPE_OSGI_FRAGMENTS, bd.getSymbolicName(), VersionRange.emptyRange, null, false, false)); - if (isFragment) - reqsDeps.add(MetadataFactory.createRequirement(CAPABILITY_NS_OSGI_BUNDLE, bd.getHost().getName(), PublisherHelper.fromOSGiVersionRange(bd.getHost().getVersionRange()), null, false, false)); - for (int j = 0; j < requiredBundles.length; j++) - reqsDeps.add(MetadataFactory.createRequirement(CAPABILITY_NS_OSGI_BUNDLE, requiredBundles[j].getName(), PublisherHelper.fromOSGiVersionRange(requiredBundles[j].getVersionRange()), null, requiredBundles[j].isOptional(), false)); - - // Process the import packages - ImportPackageSpecification osgiImports[] = bd.getImportPackages(); - for (int i = 0; i < osgiImports.length; i++) { - // TODO we need to sort out how we want to handle wild-carded dynamic imports - for now we ignore them - ImportPackageSpecification importSpec = osgiImports[i]; - String importPackageName = importSpec.getName(); - if (importPackageName.indexOf('*') != -1) - continue; - VersionRange versionRange = PublisherHelper.fromOSGiVersionRange(importSpec.getVersionRange()); - //TODO this needs to be refined to take into account all the attribute handled by imports - reqsDeps.add(MetadataFactory.createRequirement(PublisherHelper.CAPABILITY_NS_JAVA_PACKAGE, importPackageName, versionRange, null, isOptional(importSpec), false)); - } - iu.setRequirements(reqsDeps.toArray(new IRequirement[reqsDeps.size()])); - - // Create set of provided capabilities - ArrayList<IProvidedCapability> providedCapabilities = new ArrayList<IProvidedCapability>(); - providedCapabilities.add(PublisherHelper.createSelfCapability(bd.getSymbolicName(), PublisherHelper.fromOSGiVersion(bd.getVersion()))); - providedCapabilities.add(MetadataFactory.createProvidedCapability(CAPABILITY_NS_OSGI_BUNDLE, bd.getSymbolicName(), PublisherHelper.fromOSGiVersion(bd.getVersion()))); - - // Process the export package - ExportPackageDescription exports[] = bd.getExportPackages(); - for (int i = 0; i < exports.length; i++) { - //TODO make sure that we support all the refinement on the exports - providedCapabilities.add(MetadataFactory.createProvidedCapability(PublisherHelper.CAPABILITY_NS_JAVA_PACKAGE, exports[i].getName(), PublisherHelper.fromOSGiVersion(exports[i].getVersion()))); - } - // Here we add a bundle capability to identify bundles - if (manifest != null && manifest.containsKey("Eclipse-SourceBundle")) //$NON-NLS-1$ - providedCapabilities.add(SOURCE_BUNDLE_CAPABILITY); - else - providedCapabilities.add(BUNDLE_CAPABILITY); - if (isFragment) - providedCapabilities.add(MetadataFactory.createProvidedCapability(CAPABILITY_NS_OSGI_FRAGMENT, bd.getHost().getName(), PublisherHelper.fromOSGiVersion(bd.getVersion()))); - - if (manifestLocalizations != null) { - for (Entry<Locale, Map<String, String>> locEntry : manifestLocalizations.entrySet()) { - Locale locale = locEntry.getKey(); - Map<String, String> translatedStrings = locEntry.getValue(); - for (Entry<String, String> entry : translatedStrings.entrySet()) { - iu.setProperty(locale.toString() + '.' + entry.getKey(), entry.getValue()); - } - providedCapabilities.add(PublisherHelper.makeTranslationCapability(bd.getSymbolicName(), locale)); - } - } - iu.setCapabilities(providedCapabilities.toArray(new IProvidedCapability[providedCapabilities.size()])); - processUpdateDescriptorAdvice(iu, info); - processCapabilityAdvice(iu, info); - - // Set certain properties from the manifest header attributes as IU properties. - // The values of these attributes may be localized (strings starting with '%') - // with the translated values appearing in the localization IU fragments - // associated with the bundle IU. - if (manifest != null) { - int i = 0; - while (i < BUNDLE_IU_PROPERTY_MAP.length) { - if (manifest.containsKey(BUNDLE_IU_PROPERTY_MAP[i])) { - String value = manifest.get(BUNDLE_IU_PROPERTY_MAP[i]); - if (value != null && value.length() > 0) { - iu.setProperty(BUNDLE_IU_PROPERTY_MAP[i + 1], value); - } - } - i += 2; - } - } - - // Define the immutable metadata for this IU. In this case immutable means - // that this is something that will not impact the configuration. - Map<String, String> touchpointData = new HashMap<String, String>(); - touchpointData.put("manifest", toManifestString(manifest)); //$NON-NLS-1$ - if (isDir(bd, info)) - touchpointData.put("zipped", "true"); //$NON-NLS-1$ //$NON-NLS-2$ - processTouchpointAdvice(iu, touchpointData, info); - - processInstallableUnitPropertiesAdvice(iu, info); - return MetadataFactory.createInstallableUnit(iu); - } - - static VersionRange computeUpdateRange(org.osgi.framework.Version base) { - VersionRange updateRange = null; - if (!base.equals(org.osgi.framework.Version.emptyVersion)) { - updateRange = new VersionRange(Version.emptyVersion, true, PublisherHelper.fromOSGiVersion(base), false); - } else { - updateRange = VersionRange.emptyRange; - } - return updateRange; - } - - private IInstallableUnitFragment createHostLocalizationFragment(IInstallableUnit bundleIU, BundleDescription bd, String hostId, String[] hostBundleManifestValues) { - Map<Locale, Map<String, String>> hostLocalizations = getHostLocalizations(new File(bd.getLocation()), hostBundleManifestValues); - if (hostLocalizations == null || hostLocalizations.isEmpty()) - return null; - return createLocalizationFragmentOfHost(bd, hostId, hostBundleManifestValues, hostLocalizations); - } - - /* - * @param hostId - * @param bd - * @param locale - * @param localizedStrings - * @return installableUnitFragment - */ - private static IInstallableUnitFragment createLocalizationFragmentOfHost(BundleDescription bd, String hostId, String[] hostManifestValues, Map<Locale, Map<String, String>> hostLocalizations) { - InstallableUnitFragmentDescription fragment = new MetadataFactory.InstallableUnitFragmentDescription(); - String fragmentId = makeHostLocalizationFragmentId(bd.getSymbolicName()); - fragment.setId(fragmentId); - fragment.setVersion(PublisherHelper.fromOSGiVersion(bd.getVersion())); // TODO: is this a meaningful version? - - HostSpecification hostSpec = bd.getHost(); - IRequirement[] hostReqs = new IRequirement[] {MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, hostSpec.getName(), PublisherHelper.fromOSGiVersionRange(hostSpec.getVersionRange()), null, false, false, false)}; - fragment.setHost(hostReqs); - - fragment.setSingleton(true); - fragment.setProperty(InstallableUnitDescription.PROP_TYPE_FRAGMENT, Boolean.TRUE.toString()); - - // Create a provided capability for each locale and add the translated properties. - ArrayList<IProvidedCapability> providedCapabilities = new ArrayList<IProvidedCapability>(hostLocalizations.keySet().size()); - providedCapabilities.add(PublisherHelper.createSelfCapability(fragmentId, fragment.getVersion())); - for (Entry<Locale, Map<String, String>> localeEntry : hostLocalizations.entrySet()) { - Locale locale = localeEntry.getKey(); - Map<String, String> translatedStrings = localeEntry.getValue(); - for (Entry<String, String> entry : translatedStrings.entrySet()) { - fragment.setProperty(locale.toString() + '.' + entry.getKey(), entry.getValue()); - } - providedCapabilities.add(PublisherHelper.makeTranslationCapability(hostId, locale)); - } - fragment.setCapabilities(providedCapabilities.toArray(new IProvidedCapability[providedCapabilities.size()])); - - return MetadataFactory.createInstallableUnitFragment(fragment); - } - - /** - * @param id - * @return the id for the iu fragment containing localized properties - * for the fragment with the given id. - */ - private static String makeHostLocalizationFragmentId(String id) { - return id + ".translated_host_properties"; //$NON-NLS-1$ - } - - private static String createConfigScript(GeneratorBundleInfo configInfo, boolean isBundleFragment) { - if (configInfo == null) - return ""; //$NON-NLS-1$ - - String configScript = "";//$NON-NLS-1$ - if (!isBundleFragment && configInfo.getStartLevel() != BundleInfo.NO_LEVEL) { - configScript += "setStartLevel(startLevel:" + configInfo.getStartLevel() + ");"; //$NON-NLS-1$ //$NON-NLS-2$ - } - if (!isBundleFragment && configInfo.isMarkedAsStarted()) { - configScript += "markStarted(started: true);"; //$NON-NLS-1$ - } - - if (configInfo.getSpecialConfigCommands() != null) { - configScript += configInfo.getSpecialConfigCommands(); - } - - return configScript; - } - - private static String createDefaultBundleConfigScript(GeneratorBundleInfo configInfo) { - return createConfigScript(configInfo, false); - } - - public static IInstallableUnit createDefaultBundleConfigurationUnit(GeneratorBundleInfo configInfo, GeneratorBundleInfo unconfigInfo, String configurationFlavor) { - InstallableUnitFragmentDescription cu = new InstallableUnitFragmentDescription(); - String configUnitId = PublisherHelper.createDefaultConfigUnitId(OSGI_BUNDLE_CLASSIFIER, configurationFlavor); - cu.setId(configUnitId); - Version configUnitVersion = Version.createOSGi(1, 0, 0); - cu.setVersion(configUnitVersion); - - // Add capabilities for fragment, self, and describing the flavor supported - cu.setProperty(InstallableUnitDescription.PROP_TYPE_FRAGMENT, Boolean.TRUE.toString()); - cu.setCapabilities(new IProvidedCapability[] {PublisherHelper.createSelfCapability(configUnitId, configUnitVersion), MetadataFactory.createProvidedCapability(PublisherHelper.NAMESPACE_FLAVOR, configurationFlavor, Version.createOSGi(1, 0, 0))}); - - // Create a required capability on bundles - IRequirement[] reqs = new IRequirement[] {MetadataFactory.createRequirement(PublisherHelper.NAMESPACE_ECLIPSE_TYPE, TYPE_ECLIPSE_BUNDLE, VersionRange.emptyRange, null, false, true, false)}; - cu.setHost(reqs); - Map<String, String> touchpointData = new HashMap<String, String>(); - - touchpointData.put("install", "installBundle(bundle:${artifact})"); //$NON-NLS-1$ //$NON-NLS-2$ - touchpointData.put("uninstall", "uninstallBundle(bundle:${artifact})"); //$NON-NLS-1$ //$NON-NLS-2$ - touchpointData.put("configure", createDefaultBundleConfigScript(configInfo)); //$NON-NLS-1$ - touchpointData.put("unconfigure", createDefaultBundleUnconfigScript(unconfigInfo)); //$NON-NLS-1$ - - cu.addTouchpointData(MetadataFactory.createTouchpointData(touchpointData)); - return MetadataFactory.createInstallableUnit(cu); - } - - private static String createDefaultBundleUnconfigScript(GeneratorBundleInfo unconfigInfo) { - return createUnconfigScript(unconfigInfo, false); - } - - private static String createUnconfigScript(GeneratorBundleInfo unconfigInfo, boolean isBundleFragment) { - if (unconfigInfo == null) - return ""; //$NON-NLS-1$ - String unconfigScript = "";//$NON-NLS-1$ - if (!isBundleFragment && unconfigInfo.getStartLevel() != BundleInfo.NO_LEVEL) { - unconfigScript += "setStartLevel(startLevel:" + BundleInfo.NO_LEVEL + ");"; //$NON-NLS-1$ //$NON-NLS-2$ - } - if (!isBundleFragment && unconfigInfo.isMarkedAsStarted()) { - unconfigScript += "markStarted(started: false);"; //$NON-NLS-1$ - } - - if (unconfigInfo.getSpecialUnconfigCommands() != null) { - unconfigScript += unconfigInfo.getSpecialUnconfigCommands(); - } - return unconfigScript; - } - - private static boolean isOptional(ImportPackageSpecification importedPackage) { - if (importedPackage.getDirective(Constants.RESOLUTION_DIRECTIVE).equals(ImportPackageSpecification.RESOLUTION_DYNAMIC) || importedPackage.getDirective(Constants.RESOLUTION_DIRECTIVE).equals(ImportPackageSpecification.RESOLUTION_OPTIONAL)) - return true; - return false; - } - - private static String toManifestString(Map<String, String> p) { - if (p == null) - return null; - StringBuffer result = new StringBuffer(); - // See https://bugs.eclipse.org/329386. We are trying to reduce the size of the manifest data in - // the eclipse touchpoint. We've removed the code that requires it but in order for old clients - // to still be able to use recent repositories, we're going to keep around the manifest properties - // they need. - final String[] interestingKeys = new String[] {Constants.BUNDLE_SYMBOLICNAME, Constants.BUNDLE_VERSION, Constants.FRAGMENT_HOST}; - for (String key : interestingKeys) { - String value = p.get(key); - if (value != null) - result.append(key).append(": ").append(value).append('\n'); //$NON-NLS-1$ - } - return result.length() == 0 ? null : result.toString(); - } - - // Return a map from locale to property set for the manifest localizations - // from the given bundle directory and given bundle localization path/name - // manifest property value. - private static Map<Locale, Map<String, String>> getManifestLocalizations(Map<String, String> manifest, File bundleLocation) { - Map<Locale, Map<String, String>> localizations; - Locale defaultLocale = null; // = Locale.ENGLISH; // TODO: get this from GeneratorInfo - String[] bundleManifestValues = getManifestCachedValues(manifest); - String bundleLocalization = bundleManifestValues[BUNDLE_LOCALIZATION_INDEX]; // Bundle localization is the last one in the list - - if ("jar".equalsIgnoreCase(new Path(bundleLocation.getName()).getFileExtension()) && //$NON-NLS-1$ - bundleLocation.isFile()) { - localizations = LocalizationHelper.getJarPropertyLocalizations(bundleLocation, bundleLocalization, defaultLocale, bundleManifestValues); - //localizations = getJarManifestLocalization(bundleLocation, bundleLocalization, defaultLocale, bundleManifestValues); - } else { - localizations = LocalizationHelper.getDirPropertyLocalizations(bundleLocation, bundleLocalization, defaultLocale, bundleManifestValues); - // localizations = getDirManifestLocalization(bundleLocation, bundleLocalization, defaultLocale, bundleManifestValues); - } - - return localizations; - } - - public static String[] getExternalizedStrings(IInstallableUnit iu) { - String[] result = new String[PublisherHelper.BUNDLE_LOCALIZED_PROPERTIES.length]; - int j = 0; - for (int i = 1; i < BUNDLE_IU_PROPERTY_MAP.length - 1; i += 2) { - if (iu.getProperty(BUNDLE_IU_PROPERTY_MAP[i]) != null && iu.getProperty(BUNDLE_IU_PROPERTY_MAP[i]).length() > 0 && iu.getProperty(BUNDLE_IU_PROPERTY_MAP[i]).charAt(0) == '%') - result[j++] = iu.getProperty(BUNDLE_IU_PROPERTY_MAP[i]).substring(1); - else - j++; - } - // The last string is the location - result[BUNDLE_LOCALIZATION_INDEX] = iu.getProperty(IInstallableUnit.PROP_BUNDLE_LOCALIZATION); - - return result; - } - - public static String[] getManifestCachedValues(Map<String, String> manifest) { - String[] cachedValues = new String[PublisherHelper.BUNDLE_LOCALIZED_PROPERTIES.length]; - for (int j = 0; j < PublisherHelper.BUNDLE_LOCALIZED_PROPERTIES.length; j++) { - String value = manifest.get(PublisherHelper.BUNDLE_LOCALIZED_PROPERTIES[j]); - if (PublisherHelper.BUNDLE_LOCALIZED_PROPERTIES[j].equals(Constants.BUNDLE_LOCALIZATION)) { - if (value == null) - value = DEFAULT_BUNDLE_LOCALIZATION; - cachedValues[j] = value; - } else if (value != null && value.length() > 1 && value.charAt(0) == '%') { - cachedValues[j] = value.substring(1); - } - } - return cachedValues; - } - - // Return a map from locale to property set for the manifest localizations - // from the given bundle directory and given bundle localization path/name - // manifest property value. - public static Map<Locale, Map<String, String>> getHostLocalizations(File bundleLocation, String[] hostBundleManifestValues) { - Map<Locale, Map<String, String>> localizations; - Locale defaultLocale = null; // = Locale.ENGLISH; // TODO: get this from GeneratorInfo - String hostBundleLocalization = hostBundleManifestValues[BUNDLE_LOCALIZATION_INDEX]; - if (hostBundleLocalization == null) - return null; - - if ("jar".equalsIgnoreCase(new Path(bundleLocation.getName()).getFileExtension()) && //$NON-NLS-1$ - bundleLocation.isFile()) { - localizations = LocalizationHelper.getJarPropertyLocalizations(bundleLocation, hostBundleLocalization, defaultLocale, hostBundleManifestValues); - //localizations = getJarManifestLocalization(bundleLocation, hostBundleLocalization, defaultLocale, hostBundleManifestValues); - } else { - localizations = LocalizationHelper.getDirPropertyLocalizations(bundleLocation, hostBundleLocalization, defaultLocale, hostBundleManifestValues); - // localizations = getDirManifestLocalization(bundleLocation, hostBundleLocalization, defaultLocale, hostBundleManifestValues); - } - - return localizations; - } - - private static PluginConverter acquirePluginConverter() { - return (PluginConverter) ServiceHelper.getService(Activator.getContext(), PluginConverter.class.getName()); - } - - private static Dictionary<String, String> convertPluginManifest(File bundleLocation, boolean logConversionException) { - PluginConverter converter; - try { - converter = acquirePluginConverter(); - if (converter == null) { - String message = NLS.bind(Messages.exception_noPluginConverter, bundleLocation); - LogHelper.log(new Status(IStatus.ERROR, Activator.ID, message)); - return null; - } - return converter.convertManifest(bundleLocation, false, null, true, null); - } catch (PluginConversionException convertException) { - // only log the exception if we had a plugin.xml or fragment.xml and we failed conversion - if (bundleLocation.getName().equals(FEATURE_FILENAME_DESCRIPTOR)) - return null; - if (!new File(bundleLocation, PLUGIN_FILENAME_DESCRIPTOR).exists() && !new File(bundleLocation, FRAGMENT_FILENAME_DESCRIPTOR).exists()) - return null; - if (logConversionException) { - IStatus status = new Status(IStatus.WARNING, Activator.ID, 0, NLS.bind(Messages.exception_errorConverting, bundleLocation.getAbsolutePath()), convertException); - LogHelper.log(status); - } - return null; - } - } - - public static BundleDescription createBundleDescription(Dictionary<String, String> enhancedManifest, File bundleLocation) { - try { - BundleDescription descriptor = StateObjectFactory.defaultFactory.createBundleDescription(null, enhancedManifest, bundleLocation == null ? null : bundleLocation.getAbsolutePath(), 1); //TODO Do we need to have a real bundle id - descriptor.setUserObject(enhancedManifest); - return descriptor; - } catch (BundleException e) { - String message = NLS.bind(Messages.exception_stateAddition, bundleLocation == null ? null : bundleLocation.getAbsoluteFile()); - IStatus status = new Status(IStatus.WARNING, Activator.ID, message, e); - LogHelper.log(status); - return null; - } - } - - public static BundleDescription createBundleDescription(File bundleLocation) { - Dictionary<String, String> manifest = loadManifest(bundleLocation); - if (manifest == null) - return null; - return createBundleDescription(manifest, bundleLocation); - } - - public static Dictionary<String, String> loadManifest(File bundleLocation) { - Dictionary<String, String> manifest = basicLoadManifest(bundleLocation); - if (manifest == null) - return null; - // if the bundle itself does not define its shape, infer the shape from the current form - if (manifest.get(BUNDLE_SHAPE) == null) - manifest.put(BUNDLE_SHAPE, bundleLocation.isDirectory() ? DIR : JAR); - return manifest; - } - - public static Dictionary<String, String> basicLoadManifest(File bundleLocation) { - InputStream manifestStream = null; - ZipFile jarFile = null; - try { - if ("jar".equalsIgnoreCase(new Path(bundleLocation.getName()).getFileExtension()) && bundleLocation.isFile()) { //$NON-NLS-1$ - jarFile = new ZipFile(bundleLocation, ZipFile.OPEN_READ); - ZipEntry manifestEntry = jarFile.getEntry(JarFile.MANIFEST_NAME); - if (manifestEntry != null) { - manifestStream = jarFile.getInputStream(manifestEntry); - } - } else { - File manifestFile = new File(bundleLocation, JarFile.MANIFEST_NAME); - if (manifestFile.exists()) - manifestStream = new BufferedInputStream(new FileInputStream(manifestFile)); - } - } catch (IOException e) { - String message = NLS.bind(Messages.exception_errorLoadingManifest, bundleLocation); - LogHelper.log(new Status(IStatus.WARNING, Activator.ID, message, e)); - } - Dictionary<String, String> manifest = null; - try { - if (manifestStream != null) { - try { - Map<String, String> manifestMap = ManifestElement.parseBundleManifest(manifestStream, null); - // TODO temporary hack. We are reading a Map but everyone wants a Dictionary so convert. - // real answer is to have people expect a Map but that is a wider change. - manifest = new Hashtable<String, String>(manifestMap); - } catch (IOException e) { - String message = NLS.bind(Messages.exception_errorReadingManifest, bundleLocation, e.getMessage()); - LogHelper.log(new Status(IStatus.ERROR, Activator.ID, message, e)); - return null; - } catch (BundleException e) { - String message = NLS.bind(Messages.exception_errorReadingManifest, bundleLocation, e.getMessage()); - LogHelper.log(new Status(IStatus.ERROR, Activator.ID, message, e)); - return null; - } - } else { - manifest = convertPluginManifest(bundleLocation, true); - } - } finally { - try { - if (jarFile != null) - jarFile.close(); - } catch (IOException e2) { - //Ignore - } - } - - if (manifest == null) - return null; - - //Deal with the pre-3.0 plug-in shape who have a default jar manifest.mf - if (manifest.get(org.osgi.framework.Constants.BUNDLE_SYMBOLICNAME) == null) - manifest = convertPluginManifest(bundleLocation, true); - return manifest; - - } - - public BundlesAction(File[] locations) { - this.locations = locations; - } - - public BundlesAction(BundleDescription[] bundles) { - this.bundles = bundles; - } - - public IStatus perform(IPublisherInfo publisherInfo, IPublisherResult results, IProgressMonitor monitor) { - if (bundles == null && locations == null) - throw new IllegalStateException(Messages.exception_noBundlesOrLocations); - - setPublisherInfo(publisherInfo); - - try { - if (bundles == null) - bundles = getBundleDescriptions(expandLocations(locations), monitor); - generateBundleIUs(bundles, publisherInfo, results, monitor); - bundles = null; - } catch (OperationCanceledException e) { - return Status.CANCEL_STATUS; - } - return Status.OK_STATUS; - } - - protected void publishArtifact(IArtifactDescriptor descriptor, File base, File[] inclusions, IPublisherInfo publisherInfo) { - IArtifactRepository destination = publisherInfo.getArtifactRepository(); - if (descriptor == null || destination == null) - return; - - // publish the given files - publishArtifact(descriptor, inclusions, null, publisherInfo, createRootPrefixComputer(base)); - } - - protected void publishArtifact(IArtifactDescriptor descriptor, File jarFile, IPublisherInfo publisherInfo) { - // no files to publish so this is done. - if (jarFile == null || publisherInfo == null) - return; - - // if the destination already contains the descriptor, there is nothing to do. - IArtifactRepository destination = publisherInfo.getArtifactRepository(); - if (destination == null || destination.contains(descriptor)) - return; - - super.publishArtifact(descriptor, jarFile, publisherInfo); - - // if we are assimilating pack200 files then add the packed descriptor - // into the repo assuming it does not already exist. - boolean reuse = "true".equals(destination.getProperties().get(AbstractPublisherApplication.PUBLISH_PACK_FILES_AS_SIBLINGS)); //$NON-NLS-1$ - if (reuse && (publisherInfo.getArtifactOptions() & IPublisherInfo.A_PUBLISH) > 0) { - File packFile = new Path(jarFile.getAbsolutePath()).addFileExtension("pack.gz").toFile(); //$NON-NLS-1$ - if (packFile.exists()) { - IArtifactDescriptor ad200 = createPack200ArtifactDescriptor(descriptor.getArtifactKey(), packFile, descriptor.getProperty(IArtifactDescriptor.ARTIFACT_SIZE)); - publishArtifact(ad200, packFile, publisherInfo); - } - } - } - - private File[] expandLocations(File[] list) { - ArrayList<File> result = new ArrayList<File>(); - expandLocations(list, result); - return result.toArray(new File[result.size()]); - } - - private void expandLocations(File[] list, ArrayList<File> result) { - if (list == null) - return; - for (int i = 0; i < list.length; i++) { - File location = list[i]; - if (location.isDirectory()) { - // if the location is itself a bundle, just add it. Otherwise r down - if (new File(location, JarFile.MANIFEST_NAME).exists()) - result.add(location); - else if (new File(location, "plugin.xml").exists() || new File(location, "fragment.xml").exists()) //$NON-NLS-1$ //$NON-NLS-2$ - result.add(location); //old style bundle without manifest - else - expandLocations(location.listFiles(), result); - } else { - result.add(location); - } - } - } - - //TODO remove this method - protected void generateBundleIUs(BundleDescription[] bundleDescriptions, IPublisherResult result, IProgressMonitor monitor) { - generateBundleIUs(bundleDescriptions, null, result, monitor); - } - - protected void generateBundleIUs(BundleDescription[] bundleDescriptions, IPublisherInfo info, IPublisherResult result, IProgressMonitor monitor) { - - // This assumes that hosts are processed before fragments because for each fragment the host - // is queried for the strings that should be translated. - for (int i = 0; i < bundleDescriptions.length; i++) { - if (monitor.isCanceled()) - throw new OperationCanceledException(); - - BundleDescription bd = bundleDescriptions[i]; - if (bd != null && bd.getSymbolicName() != null && bd.getVersion() != null) { - //First check to see if there is already an IU around for this - IInstallableUnit bundleIU = queryForIU(result, bundleDescriptions[i].getSymbolicName(), PublisherHelper.fromOSGiVersion(bd.getVersion())); - IArtifactKey key = createBundleArtifactKey(bd.getSymbolicName(), bd.getVersion().toString()); - if (bundleIU == null) { - createAdviceFileAdvice(bundleDescriptions[i], info); - // Create the bundle IU according to any shape advice we have - bundleIU = createBundleIU(bd, key, info); - } - - File location = new File(bd.getLocation()); - IArtifactDescriptor ad = PublisherHelper.createArtifactDescriptor(info, key, location); - processArtifactPropertiesAdvice(bundleIU, ad, info); - - // Publish according to the shape on disk - File bundleLocation = new File(bd.getLocation()); - if (bundleLocation.isDirectory()) - publishArtifact(ad, bundleLocation, bundleLocation.listFiles(), info); - else - publishArtifact(ad, bundleLocation, info); - - IInstallableUnit fragment = null; - if (isFragment(bd)) { - // TODO: Need a test case for multiple hosts - String hostId = bd.getHost().getName(); - VersionRange hostVersionRange = PublisherHelper.fromOSGiVersionRange(bd.getHost().getVersionRange()); - IQueryResult<IInstallableUnit> hosts = queryForIUs(result, hostId, hostVersionRange); - - for (Iterator<IInstallableUnit> itor = hosts.iterator(); itor.hasNext();) { - IInstallableUnit host = itor.next(); - String fragmentId = makeHostLocalizationFragmentId(bd.getSymbolicName()); - fragment = queryForIU(result, fragmentId, PublisherHelper.fromOSGiVersion(bd.getVersion())); - if (fragment == null) { - String[] externalizedStrings = getExternalizedStrings(host); - fragment = createHostLocalizationFragment(bundleIU, bd, hostId, externalizedStrings); - } - } - - } - - result.addIU(bundleIU, IPublisherResult.ROOT); - if (fragment != null) - result.addIU(fragment, IPublisherResult.NON_ROOT); - - InstallableUnitDescription[] others = processAdditionalInstallableUnitsAdvice(bundleIU, info); - for (int iuIndex = 0; others != null && iuIndex < others.length; iuIndex++) { - result.addIU(MetadataFactory.createInstallableUnit(others[iuIndex]), IPublisherResult.ROOT); - } - } - } - } - - /** - * Adds advice for any p2.inf file found in this bundle. - */ - private void createAdviceFileAdvice(BundleDescription bundleDescription, IPublisherInfo publisherInfo) { - String location = bundleDescription.getLocation(); - if (location == null) - return; - - AdviceFileAdvice advice = new AdviceFileAdvice(bundleDescription.getSymbolicName(), PublisherHelper.fromOSGiVersion(bundleDescription.getVersion()), new Path(location), AdviceFileAdvice.BUNDLE_ADVICE_FILE); - if (advice.containsAdvice()) - publisherInfo.addAdvice(advice); - - } - - private static boolean isDir(BundleDescription bundle, IPublisherInfo info) { - Collection<IBundleShapeAdvice> advice = info.getAdvice(null, true, bundle.getSymbolicName(), PublisherHelper.fromOSGiVersion(bundle.getVersion()), IBundleShapeAdvice.class); - // if the advice has a shape, use it - if (advice != null && !advice.isEmpty()) { - // we know there is some advice but if there is more than one, take the first. - String shape = advice.iterator().next().getShape(); - if (shape != null) - return shape.equals(IBundleShapeAdvice.DIR); - } - // otherwise go with whatever we figured out from the manifest or the shape on disk - @SuppressWarnings("unchecked") - Map<String, String> manifest = (Map<String, String>) bundle.getUserObject(); - String format = manifest.get(BUNDLE_SHAPE); - return DIR.equals(format); - } - - private boolean isFragment(BundleDescription bd) { - return (bd.getHost() != null ? true : false); - } - - // TODO reconsider the special cases here for the configurators. Perhaps these should be in their own actions. - protected BundleDescription[] getBundleDescriptions(File[] bundleLocations, IProgressMonitor monitor) { - if (bundleLocations == null) - return new BundleDescription[0]; - boolean addSimpleConfigurator = false; - boolean scIn = false; - for (int i = 0; i < bundleLocations.length; i++) { - if (!addSimpleConfigurator) - addSimpleConfigurator = bundleLocations[i].toString().indexOf(ORG_ECLIPSE_UPDATE_CONFIGURATOR) > 0; - if (!scIn) { - scIn = bundleLocations[i].toString().indexOf(ORG_ECLIPSE_EQUINOX_SIMPLECONFIGURATOR) > 0; - if (scIn) - break; - } - } - if (scIn) - addSimpleConfigurator = false; - BundleDescription[] result = new BundleDescription[bundleLocations.length + (addSimpleConfigurator ? 1 : 0)]; - for (int i = 0; i < bundleLocations.length; i++) { - if (monitor.isCanceled()) - throw new OperationCanceledException(); - result[i] = createBundleDescription(bundleLocations[i]); - } - if (addSimpleConfigurator) { - // Add simple configurator to the list of bundles - try { - Bundle simpleConfigBundle = getBundle(ORG_ECLIPSE_EQUINOX_SIMPLECONFIGURATOR); - if (simpleConfigBundle == null) - LogHelper.log(new Status(IStatus.INFO, Activator.ID, Messages.message_noSimpleconfigurator)); - else { - File location = FileLocator.getBundleFile(simpleConfigBundle); - result[result.length - 1] = createBundleDescription(location); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - return result; - } - - // This method is based on core.runtime's InternalPlatform.getBundle(...) with a difference just in how we get PackageAdmin - private static Bundle getBundle(String symbolicName) { - PackageAdmin packageAdmin = ServiceHelper.getService(Activator.getContext(), PackageAdmin.class); - if (packageAdmin == null) - return null; - Bundle[] matchingBundles = packageAdmin.getBundles(symbolicName, null); - if (matchingBundles == null) - return null; - //Return the first bundle that is not installed or uninstalled - for (int i = 0; i < matchingBundles.length; i++) { - if ((matchingBundles[i].getState() & (Bundle.INSTALLED | Bundle.UNINSTALLED)) == 0) { - return matchingBundles[i]; - } - } - return null; - } -} diff --git a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/ConfigAdvice.java b/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/ConfigAdvice.java deleted file mode 100644 index a095a5556..000000000 --- a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/ConfigAdvice.java +++ /dev/null @@ -1,40 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008 Code 9 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: - * Code 9 - initial API and implementation - ******************************************************************************/ -package org.eclipse.equinox.p2.publisher.eclipse; - -import java.util.Map; -import org.eclipse.equinox.frameworkadmin.BundleInfo; -import org.eclipse.equinox.internal.p2.core.helpers.CollectionUtils; -import org.eclipse.equinox.internal.provisional.frameworkadmin.ConfigData; -import org.eclipse.equinox.p2.publisher.AbstractAdvice; - -public class ConfigAdvice extends AbstractAdvice implements IConfigAdvice { - - private ConfigData data; - private String configSpec; - - public ConfigAdvice(ConfigData data, String configSpec) { - this.data = data; - this.configSpec = configSpec; - } - - public BundleInfo[] getBundles() { - return data.getBundles(); - } - - protected String getConfigSpec() { - return configSpec; - } - - public Map<String, String> getProperties() { - return CollectionUtils.toMap(data.getProperties()); - } - -} diff --git a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/ConfigCUsAction.java b/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/ConfigCUsAction.java deleted file mode 100644 index 3d77fdebf..000000000 --- a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/ConfigCUsAction.java +++ /dev/null @@ -1,398 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 2009 Code 9 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: - * Code 9 - initial API and implementation - * IBM - ongoing development - ******************************************************************************/ -package org.eclipse.equinox.p2.publisher.eclipse; - -import java.io.File; -import java.util.*; -import java.util.Map.Entry; -import org.eclipse.core.runtime.*; -import org.eclipse.equinox.frameworkadmin.BundleInfo; -import org.eclipse.equinox.internal.p2.metadata.TouchpointInstruction; -import org.eclipse.equinox.internal.p2.publisher.eclipse.GeneratorBundleInfo; -import org.eclipse.equinox.p2.metadata.*; -import org.eclipse.equinox.p2.metadata.MetadataFactory.InstallableUnitDescription; -import org.eclipse.equinox.p2.metadata.expression.IMatchExpression; -import org.eclipse.equinox.p2.publisher.*; -import org.eclipse.equinox.spi.p2.publisher.PublisherHelper; -import org.eclipse.osgi.util.ManifestElement; -import org.osgi.framework.BundleException; -import org.osgi.framework.Constants; - -/** - * Publish CUs for all the configuration data in the current result. - * This adds config-specific CUs to capture start levels etc found in the config.ini - * etc for is os, ws, arch combination seen so far. - */ -public class ConfigCUsAction extends AbstractPublisherAction { - - protected static final String ORG_ECLIPSE_UPDATE_CONFIGURATOR = "org.eclipse.update.configurator"; //$NON-NLS-1$ - protected static final String DEFAULT_START_LEVEL = "osgi.bundles.defaultStartLevel"; //$NON-NLS-1$ - private static Collection<String> PROPERTIES_TO_SKIP; - private static HashSet<String> PROGRAM_ARGS_TO_SKIP; - protected Version version; - protected String id; - protected String flavor; - IPublisherResult outerResults = null; - - // TODO consider moving this filtering to the LaunchingAdvice and ConfigAdvice so - // it is not hardcoded in the action. - static { - PROPERTIES_TO_SKIP = new HashSet<String>(); - PROPERTIES_TO_SKIP.add("osgi.frameworkClassPath"); //$NON-NLS-1$ - PROPERTIES_TO_SKIP.add("osgi.framework"); //$NON-NLS-1$ - PROPERTIES_TO_SKIP.add("osgi.bundles"); //$NON-NLS-1$ - PROPERTIES_TO_SKIP.add("eof"); //$NON-NLS-1$ - PROPERTIES_TO_SKIP.add("eclipse.p2.profile"); //$NON-NLS-1$ - PROPERTIES_TO_SKIP.add("eclipse.p2.data.area"); //$NON-NLS-1$ - PROPERTIES_TO_SKIP.add("org.eclipse.update.reconcile"); //$NON-NLS-1$ - PROPERTIES_TO_SKIP.add("org.eclipse.equinox.simpleconfigurator.configUrl"); //$NON-NLS-1$ - - PROGRAM_ARGS_TO_SKIP = new HashSet<String>(); - PROGRAM_ARGS_TO_SKIP.add("--launcher.library"); //$NON-NLS-1$ - PROGRAM_ARGS_TO_SKIP.add("-startup"); //$NON-NLS-1$ - PROGRAM_ARGS_TO_SKIP.add("-configuration"); //$NON-NLS-1$ - } - - public static String getAbstractCUCapabilityNamespace(String id, String type, String flavor, String configSpec) { - return flavor + id; - } - - public static String getAbstractCUCapabilityId(String id, String type, String flavor, String configSpec) { - return id + "." + type; //$NON-NLS-1$ - } - - /** - * Returns the id of the top level IU published by this action for the given id and flavor. - * @param id the id of the application being published - * @param flavor the flavor being published - * @return the if for ius published by this action - */ - public static String computeIUId(String id, String flavor) { - return flavor + id + ".configuration"; //$NON-NLS-1$ - } - - public ConfigCUsAction(IPublisherInfo info, String flavor, String id, Version version) { - this.flavor = flavor; - this.id = id; - this.version = version; - } - - public IStatus perform(IPublisherInfo publisherInfo, IPublisherResult results, IProgressMonitor monitor) { - IPublisherResult innerResult = new PublisherResult(); - this.outerResults = results; - this.info = publisherInfo; - // we have N platforms, generate a CU for each - // TODO try and find common properties across platforms - String[] configSpecs = publisherInfo.getConfigurations(); - for (int i = 0; i < configSpecs.length; i++) { - if (monitor.isCanceled()) - return Status.CANCEL_STATUS; - String configSpec = configSpecs[i]; - Collection<IConfigAdvice> configAdvice = publisherInfo.getAdvice(configSpec, false, id, version, IConfigAdvice.class); - BundleInfo[] bundles = fillInBundles(configAdvice, results); - publishBundleCUs(publisherInfo, bundles, configSpec, innerResult); - publishConfigIUs(configAdvice, innerResult, configSpec); - Collection<IExecutableAdvice> launchingAdvice = publisherInfo.getAdvice(configSpec, false, id, version, IExecutableAdvice.class); - publishIniIUs(launchingAdvice, innerResult, configSpec); - } - // merge the IUs into the final result as non-roots and create a parent IU that captures them all - results.merge(innerResult, IPublisherResult.MERGE_ALL_NON_ROOT); - publishTopLevelConfigurationIU(innerResult.getIUs(null, IPublisherResult.ROOT), results); - return Status.OK_STATUS; - } - - private void publishTopLevelConfigurationIU(Collection<? extends IVersionedId> children, IPublisherResult result) { - InstallableUnitDescription descriptor = createParentIU(children, computeIUId(id, flavor), version); - descriptor.setSingleton(true); - IInstallableUnit rootIU = MetadataFactory.createInstallableUnit(descriptor); - if (rootIU == null) - return; - result.addIU(rootIU, IPublisherResult.ROOT); - } - - // there seem to be cases where the bundle infos are not filled in with symbolic name and version. - // fill in the missing data. - private BundleInfo[] fillInBundles(Collection<IConfigAdvice> configAdvice, IPublisherResult results) { - ArrayList<BundleInfo> result = new ArrayList<BundleInfo>(); - for (IConfigAdvice advice : configAdvice) { - - int defaultStart = BundleInfo.NO_LEVEL; - Map<String, String> adviceProperties = advice.getProperties(); - if (adviceProperties.containsKey(DEFAULT_START_LEVEL)) { - try { - defaultStart = Integer.parseInt(adviceProperties.get(DEFAULT_START_LEVEL)); - } catch (NumberFormatException e) { - //don't know default - } - } - - BundleInfo[] bundles = advice.getBundles(); - for (int i = 0; i < bundles.length; i++) { - BundleInfo bundleInfo = bundles[i]; - - if (bundleInfo.getStartLevel() != BundleInfo.NO_LEVEL && bundleInfo.getStartLevel() == defaultStart) { - bundleInfo.setStartLevel(BundleInfo.NO_LEVEL); - } - - // prime the result with the current info. This will be replaced if there is more info... - if ((bundleInfo.getSymbolicName() != null && bundleInfo.getVersion() != null) || bundleInfo.getLocation() == null) - result.add(bundles[i]); - else { - try { - File location = new File(bundleInfo.getLocation()); - Dictionary<String, String> manifest = BundlesAction.loadManifest(location); - if (manifest == null) - continue; - GeneratorBundleInfo newInfo = new GeneratorBundleInfo(bundleInfo); - ManifestElement[] element = ManifestElement.parseHeader("dummy-bsn", manifest.get(Constants.BUNDLE_SYMBOLICNAME)); //$NON-NLS-1$ - newInfo.setSymbolicName(element[0].getValue()); - newInfo.setVersion(manifest.get(Constants.BUNDLE_VERSION)); - result.add(newInfo); - } catch (BundleException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - } - } - return result.toArray(new BundleInfo[result.size()]); - } - - /** - * Publish the IUs that capture the eclipse.ini information such as vmargs and program args, etc - */ - private void publishIniIUs(Collection<IExecutableAdvice> launchingAdvice, IPublisherResult results, String configSpec) { - if (launchingAdvice.isEmpty()) - return; - - String configureData = ""; //$NON-NLS-1$ - String unconfigureData = ""; //$NON-NLS-1$ - if (!launchingAdvice.isEmpty()) { - String[] dataStrings = getLauncherConfigStrings(launchingAdvice); - configureData += dataStrings[0]; - unconfigureData += dataStrings[1]; - } - // if there is nothing to configure or unconfigure, then don't even bother generating this IU - if (configureData.length() == 0 && unconfigureData.length() == 0) - return; - - Map<String, String> touchpointData = new HashMap<String, String>(); - touchpointData.put("configure", configureData); //$NON-NLS-1$ - touchpointData.put("unconfigure", unconfigureData); //$NON-NLS-1$ - IInstallableUnit cu = createCU(id, version, "ini", flavor, configSpec, touchpointData); //$NON-NLS-1$ - results.addIU(cu, IPublisherResult.ROOT); - } - - /** - * Publish the IUs that capture the config.ini information such as properties etc - */ - private void publishConfigIUs(Collection<IConfigAdvice> configAdvice, IPublisherResult results, String configSpec) { - if (configAdvice.isEmpty()) - return; - - String configureData = ""; //$NON-NLS-1$ - String unconfigureData = ""; //$NON-NLS-1$ - if (!configAdvice.isEmpty()) { - String[] dataStrings = getConfigurationStrings(configAdvice); - configureData += dataStrings[0]; - unconfigureData += dataStrings[1]; - } - // if there is nothing to configure or unconfigure, then don't even bother generating this IU - if (configureData.length() == 0 && unconfigureData.length() == 0) - return; - - Map<String, String> touchpointData = new HashMap<String, String>(); - touchpointData.put("configure", configureData); //$NON-NLS-1$ - touchpointData.put("unconfigure", unconfigureData); //$NON-NLS-1$ - IInstallableUnit cu = createCU(id, version, "config", flavor, configSpec, touchpointData); //$NON-NLS-1$ - results.addIU(cu, IPublisherResult.ROOT); - } - - /** - * Create a CU whose id is flavor+id.type.configspec with the given version. - * The resultant IU has the self capability and an abstract capabilty in the flavor+id namespace - * with the name id.type and the given version. This allows others to create an abstract - * dependency on having one of these things around but not having to list out the configs. - */ - private IInstallableUnit createCU(String cuId, Version cuVersion, String cuType, String cuFlavor, String configSpec, Map<String, String> touchpointData) { - InstallableUnitDescription cu = new InstallableUnitDescription(); - String resultId = createCUIdString(cuId, cuType, cuFlavor, configSpec); - cu.setId(resultId); - cu.setVersion(cuVersion); - cu.setFilter(createFilterSpec(configSpec)); - IProvidedCapability selfCapability = PublisherHelper.createSelfCapability(resultId, cuVersion); - String namespace = getAbstractCUCapabilityNamespace(cuId, cuType, cuFlavor, configSpec); - String abstractId = getAbstractCUCapabilityId(cuId, cuType, cuFlavor, configSpec); - IProvidedCapability abstractCapability = MetadataFactory.createProvidedCapability(namespace, abstractId, cuVersion); - cu.setCapabilities(new IProvidedCapability[] {selfCapability, abstractCapability}); - cu.addTouchpointData(MetadataFactory.createTouchpointData(touchpointData)); - cu.setTouchpointType(PublisherHelper.TOUCHPOINT_OSGI); - return MetadataFactory.createInstallableUnit(cu); - } - - protected String[] getConfigurationStrings(Collection<IConfigAdvice> configAdvice) { - String configurationData = ""; //$NON-NLS-1$ - String unconfigurationData = ""; //$NON-NLS-1$ - Set<String> properties = new HashSet<String>(); - for (IConfigAdvice advice : configAdvice) { - for (Entry<String, String> aProperty : advice.getProperties().entrySet()) { - String key = aProperty.getKey(); - if (shouldPublishProperty(key) && !properties.contains(key)) { - properties.add(key); - Map<String, String> parameters = new LinkedHashMap<String, String>(); - parameters.put("propName", key); //$NON-NLS-1$ - parameters.put("propValue", aProperty.getValue()); //$NON-NLS-1$ - configurationData += TouchpointInstruction.encodeAction("setProgramProperty", parameters); //$NON-NLS-1$ - parameters.put("propValue", ""); //$NON-NLS-1$//$NON-NLS-2$ - unconfigurationData += TouchpointInstruction.encodeAction("setProgramProperty", parameters); //$NON-NLS-1$ - } - } - } - return new String[] {configurationData, unconfigurationData}; - } - - private boolean shouldPublishProperty(String key) { - return !PROPERTIES_TO_SKIP.contains(key); - } - - private boolean shouldPublishJvmArg(String key) { - return true; - } - - private boolean shouldPublishProgramArg(String key) { - return !PROGRAM_ARGS_TO_SKIP.contains(key); - } - - protected String[] getLauncherConfigStrings(Collection<IExecutableAdvice> launchingAdvice) { - String configurationData = ""; //$NON-NLS-1$ - String unconfigurationData = ""; //$NON-NLS-1$ - - Map<String, String> touchpointParameters = new LinkedHashMap<String, String>(); - Set<String> jvmSet = new HashSet<String>(); - Set<String> programSet = new HashSet<String>(); - for (IExecutableAdvice advice : launchingAdvice) { - String[] jvmArgs = advice.getVMArguments(); - for (int i = 0; i < jvmArgs.length; i++) - if (shouldPublishJvmArg(jvmArgs[i]) && !jvmSet.contains(jvmArgs[i])) { - jvmSet.add(jvmArgs[i]); - touchpointParameters.clear(); - touchpointParameters.put("jvmArg", jvmArgs[i]); //$NON-NLS-1$ - configurationData += TouchpointInstruction.encodeAction("addJvmArg", touchpointParameters); //$NON-NLS-1$ - unconfigurationData += TouchpointInstruction.encodeAction("removeJvmArg", touchpointParameters); //$NON-NLS-1$ - } - String[] programArgs = advice.getProgramArguments(); - for (int i = 0; i < programArgs.length; i++) - if (shouldPublishProgramArg(programArgs[i]) && !programSet.contains(programArgs[i])) { - if (programArgs[i].startsWith("-")) //$NON-NLS-1$ - programSet.add(programArgs[i]); - touchpointParameters.clear(); - touchpointParameters.put("programArg", programArgs[i]); //$NON-NLS-1$ - configurationData += TouchpointInstruction.encodeAction("addProgramArg", touchpointParameters); //$NON-NLS-1$ - unconfigurationData += TouchpointInstruction.encodeAction("removeProgramArg", touchpointParameters); //$NON-NLS-1$ - } else if (i + 1 < programArgs.length && !programArgs[i + 1].startsWith("-")) { //$NON-NLS-1$ - // if we are not publishing then skip over the following arg as it is assumed to be a parameter - // to this command line arg. - i++; - } - } - return new String[] {configurationData, unconfigurationData}; - } - - /** - * Publish the CUs related to the given set of bundles. This generally covers the start-level and - * and whether or not the bundle is to be started. - */ - protected void publishBundleCUs(IPublisherInfo publisherInfo, BundleInfo[] bundles, String configSpec, IPublisherResult result) { - if (bundles == null) - return; - - String cuIdPrefix = ""; //$NON-NLS-1$ - IMatchExpression<IInstallableUnit> filter = null; - if (configSpec != null) { - cuIdPrefix = createIdString(configSpec); - filter = createFilterSpec(configSpec); - } - - for (int i = 0; i < bundles.length; i++) { - GeneratorBundleInfo bundle = createGeneratorBundleInfo(bundles[i], result); - if (bundle == null) - continue; - - IInstallableUnit iu = bundle.getIU(); - - // If there is no host, or the filters don't match, skip this one. - if (iu == null || !filterMatches(iu.getFilter(), configSpec)) - continue; - - // TODO need to factor this out into its own action - if (bundle.getSymbolicName().equals(ORG_ECLIPSE_UPDATE_CONFIGURATOR)) { - bundle.setStartLevel(BundleInfo.NO_LEVEL); - bundle.setMarkedAsStarted(false); - bundle.setSpecialConfigCommands("setProgramProperty(propName:org.eclipse.update.reconcile, propValue:false);"); //$NON-NLS-1$ - bundle.setSpecialUnconfigCommands("setProgramProperty(propName:org.eclipse.update.reconcile, propValue:);"); //$NON-NLS-1$ - } else if (bundle.getStartLevel() == BundleInfo.NO_LEVEL && !bundle.isMarkedAsStarted()) { - // this bundle does not require any particular configuration, the plug-in default IU will handle installing it - continue; - } - - IInstallableUnit cu = null; - if (this.version != null && !this.version.equals(Version.emptyVersion)) - cu = BundlesAction.createBundleConfigurationUnit(bundle.getSymbolicName(), this.version, false, bundle, flavor + cuIdPrefix, filter); - else - cu = BundlesAction.createBundleConfigurationUnit(bundle.getSymbolicName(), Version.parseVersion(bundle.getVersion()), false, bundle, flavor + cuIdPrefix, filter); - - if (cu != null) { - // Product Query will run against the repo, make sure these CUs are in before then - // TODO review the aggressive addition to the metadata repo. perhaps the query can query the result as well. - // IMetadataRepository metadataRepository = info.getMetadataRepository(); - // if (metadataRepository != null) { - // metadataRepository.addInstallableUnits(new IInstallableUnit[] {cu}); - // } - result.addIU(cu, IPublisherResult.ROOT); - } - } - } - - protected GeneratorBundleInfo createGeneratorBundleInfo(BundleInfo bundleInfo, IPublisherResult result) { - String name = bundleInfo.getSymbolicName(); - - //query for a matching IU - IInstallableUnit iu = queryForIU(outerResults, name, Version.create(bundleInfo.getVersion())); - if (iu != null) { - if (iu.getVersion() == null) - bundleInfo.setVersion("0.0.0"); //$NON-NLS-1$ - else - bundleInfo.setVersion(iu.getVersion().toString()); - GeneratorBundleInfo newInfo = new GeneratorBundleInfo(bundleInfo); - newInfo.setIU(iu); - return newInfo; - } - - if (bundleInfo.getLocation() != null || bundleInfo.getVersion() != null) - return new GeneratorBundleInfo(bundleInfo); - //harder: try id_version - int i = name.indexOf('_'); - while (i > -1) { - try { - Version bundleVersion = Version.parseVersion(name.substring(i)); - bundleInfo.setSymbolicName(name.substring(0, i)); - bundleInfo.setVersion(bundleVersion.toString()); - return new GeneratorBundleInfo(bundleInfo); - } catch (IllegalArgumentException e) { - // the '_' found was probably part of the symbolic id - i = name.indexOf('_', i); - } - } - - return null; - } - -} diff --git a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/DefaultCUsAction.java b/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/DefaultCUsAction.java deleted file mode 100644 index 30734f329..000000000 --- a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/DefaultCUsAction.java +++ /dev/null @@ -1,70 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008 Code 9 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: - * Code 9 - initial API and implementation - * IBM - ongoing development - ******************************************************************************/ -package org.eclipse.equinox.p2.publisher.eclipse; - -import org.eclipse.core.runtime.*; -import org.eclipse.equinox.internal.p2.publisher.eclipse.GeneratorBundleInfo; -import org.eclipse.equinox.p2.publisher.*; -import org.eclipse.equinox.spi.p2.publisher.PublisherHelper; - -/** - * Publish IUs that install/configure the standard things like bundles, features and source bundles - */ -public class DefaultCUsAction extends AbstractPublisherAction { - - private String flavor; - private int startLevel; - private boolean start; - - public DefaultCUsAction(IPublisherInfo info, String flavor, int startLevel, boolean start) { - this.flavor = flavor; - this.startLevel = startLevel; - this.start = start; - } - - public IStatus perform(IPublisherInfo publisherInfo, IPublisherResult results, IProgressMonitor monitor) { - setPublisherInfo(publisherInfo); - generateDefaultConfigIU(results); - return Status.OK_STATUS; - } - - protected void generateDefaultConfigIU(IPublisherResult result) { - // TODO this is a bit of a hack. We need to have the default IU fragment generated with code that configures - // and unconfigures. The Generator should be decoupled from any particular provider but it is not clear - // that we should add the create* methods to IGeneratorInfo... - // MockBundleDescription bd1 = new MockBundleDescription("defaultConfigure"); - // MockBundleDescription bd2 = new MockBundleDescription("defaultUnconfigure"); - result.addIU(BundlesAction.createDefaultBundleConfigurationUnit(createDefaultConfigurationBundleInfo(), createDefaultUnconfigurationBundleInfo(), flavor), IPublisherResult.ROOT); - result.addIU(PublisherHelper.createDefaultFeatureConfigurationUnit(flavor), IPublisherResult.ROOT); - result.addIU(PublisherHelper.createDefaultConfigurationUnitForSourceBundles(flavor), IPublisherResult.ROOT); - } - - protected GeneratorBundleInfo createDefaultConfigurationBundleInfo() { - GeneratorBundleInfo result = new GeneratorBundleInfo(); - result.setSymbolicName("defaultConfigure"); //$NON-NLS-1$ - result.setVersion("1.0.0"); //$NON-NLS-1$ - result.setStartLevel(startLevel); - result.setMarkedAsStarted(start); - // These should just be in the install section now - // result.setSpecialConfigCommands("installBundle(bundle:${artifact});"); - return result; - } - - protected GeneratorBundleInfo createDefaultUnconfigurationBundleInfo() { - GeneratorBundleInfo result = new GeneratorBundleInfo(); - result.setSymbolicName("defaultUnconfigure"); //$NON-NLS-1$ - result.setVersion("1.0.0"); //$NON-NLS-1$ - // These should just be in the uninstall section now - // result.setSpecialConfigCommands("uninstallBundle(bundle:${artifact});"); - return result; - } - -} diff --git a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/EclipseInstallAction.java b/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/EclipseInstallAction.java deleted file mode 100644 index 184714a01..000000000 --- a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/EclipseInstallAction.java +++ /dev/null @@ -1,219 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 2009 Code 9 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: - * Code 9 - initial API and implementation - * IBM - ongoing development - ******************************************************************************/ -package org.eclipse.equinox.p2.publisher.eclipse; - -import java.io.File; -import java.util.*; -import org.eclipse.core.runtime.*; -import org.eclipse.equinox.internal.p2.publisher.eclipse.ExecutablesDescriptor; -import org.eclipse.equinox.p2.metadata.IVersionedId; -import org.eclipse.equinox.p2.metadata.Version; -import org.eclipse.equinox.p2.publisher.*; -import org.eclipse.equinox.p2.publisher.actions.*; - -public class EclipseInstallAction extends AbstractPublisherAction { - protected String source; - protected String id; - protected Version version; - protected String name; - protected String executableName; - protected String flavor; - protected IVersionedId[] topLevel; - protected String[] nonRootFiles; - protected boolean start = false; - - protected EclipseInstallAction() { - //hidden - } - - public EclipseInstallAction(String source, String id, Version version, String name, String executableName, String flavor, IVersionedId[] topLevel, String[] nonRootFiles, boolean start) { - this.source = source; - this.id = id; - this.version = version; - this.name = name == null ? id : name; - this.executableName = executableName == null ? "eclipse" : executableName; //$NON-NLS-1$ - this.flavor = flavor; - this.topLevel = topLevel; - this.nonRootFiles = nonRootFiles; - this.start = start; - } - - public IStatus perform(IPublisherInfo publisherInfo, IPublisherResult results, IProgressMonitor monitor) { - monitor = SubMonitor.convert(monitor); - this.info = publisherInfo; - IPublisherAction[] actions = createActions(); - MultiStatus finalStatus = new MultiStatus(EclipseInstallAction.class.getName(), 0, "publishing result", null); //$NON-NLS-1$ - for (int i = 0; i < actions.length; i++) { - if (monitor.isCanceled()) - return Status.CANCEL_STATUS; - finalStatus.merge(actions[i].perform(publisherInfo, results, monitor)); - } - if (!finalStatus.isOK()) - return finalStatus; - return Status.OK_STATUS; - } - - protected IPublisherAction[] createActions() { - createAdvice(); - ArrayList<IPublisherAction> actions = new ArrayList<IPublisherAction>(); - // create an action that just publishes the raw bundles and features - IPublisherAction action = new MergeResultsAction(new IPublisherAction[] {createFeaturesAction(), createBundlesAction()}, IPublisherResult.MERGE_ALL_ROOT); - actions.add(action); - actions.add(createApplicationExecutableAction(info.getConfigurations())); - actions.add(createRootFilesAction()); - actions.addAll(createAccumulateConfigDataActions(info.getConfigurations())); - actions.add(createJREAction()); - actions.add(createConfigCUsAction()); - actions.add(createDefaultCUsAction()); - actions.add(createRootIUAction()); - return actions.toArray(new IPublisherAction[actions.size()]); - } - - private void createAdvice() { - createRootFilesAdvice(); - createRootAdvice(); - } - - protected void createRootAdvice() { - if (topLevel != null) - info.addAdvice(new RootIUAdvice(getTopLevel())); - info.addAdvice(new RootIUResultFilterAdvice(null)); - } - - protected IPublisherAction createDefaultCUsAction() { - return new DefaultCUsAction(info, flavor, 4, start); - } - - protected IPublisherAction createRootIUAction() { - return new RootIUAction(id, version, name); - } - - protected Collection<IVersionedId> getTopLevel() { - return Arrays.asList(topLevel); - } - - protected IPublisherAction createJREAction() { - return new JREAction((File) null); - } - - protected IPublisherAction createApplicationExecutableAction(String[] configSpecs) { - return new ApplicationLauncherAction(id, version, flavor, executableName, getExecutablesLocation(), configSpecs); - } - - protected Collection<IPublisherAction> createAccumulateConfigDataActions(String[] configs) { - File configuration = new File(source, "configuration/config.ini"); //$NON-NLS-1$ - if (!configuration.exists()) - configuration = null; - - Collection<IPublisherAction> result = new ArrayList<IPublisherAction>(configs.length); - for (int i = 0; i < configs.length; i++) { - String configSpec = configs[i]; - String os = AbstractPublisherAction.parseConfigSpec(configSpec)[1]; - File executable = ExecutablesDescriptor.findExecutable(os, computeExecutableLocation(configSpec), "eclipse"); //$NON-NLS-1$ - if (!executable.exists()) - executable = null; - IPublisherAction action = new AccumulateConfigDataAction(info, configSpec, configuration, executable); - result.add(action); - } - - return result; - } - - protected IPublisherAction createConfigCUsAction() { - return new ConfigCUsAction(info, flavor, id, version); - } - - protected IPublisherAction createFeaturesAction() { - return new FeaturesAction(new File[] {new File(source, "features")}); //$NON-NLS-1$ - } - - protected Collection<IPublisherAction> createExecutablesActions(String[] configSpecs) { - Collection<IPublisherAction> result = new ArrayList<IPublisherAction>(configSpecs.length); - for (int i = 0; i < configSpecs.length; i++) { - ExecutablesDescriptor executables = computeExecutables(configSpecs[i]); - IPublisherAction action = new EquinoxExecutableAction(executables, configSpecs[i], id, version, flavor); - result.add(action); - } - return result; - } - - protected IPublisherAction createRootFilesAction() { - return new RootFilesAction(info, id, version, flavor); - } - - protected void createRootFilesAdvice() { - File[] baseExclusions = computeRootFileExclusions(); - if (baseExclusions != null) - info.addAdvice(new RootFilesAdvice(null, null, baseExclusions, null)); - String[] configs = info.getConfigurations(); - for (int i = 0; i < configs.length; i++) - info.addAdvice(computeRootFileAdvice(configs[i])); - } - - protected IPublisherAdvice computeRootFileAdvice(String configSpec) { - File root = computeRootFileRoot(configSpec); - File[] inclusions = computeRootFileInclusions(configSpec); - File[] exclusions = computeRootFileExclusions(configSpec); - return new RootFilesAdvice(root, inclusions, exclusions, configSpec); - } - - protected File[] computeRootFileExclusions(String configSpec) { - ExecutablesDescriptor executables = computeExecutables(configSpec); - File[] files = executables.getFiles(); - File[] result = new File[files.length + 1]; - System.arraycopy(files, 0, result, 0, files.length); - result[files.length] = executables.getIniLocation(); - return result; - } - - protected File[] computeRootFileExclusions() { - if (nonRootFiles == null || nonRootFiles.length == 0) - return null; - ArrayList<File> result = new ArrayList<File>(); - for (int i = 0; i < nonRootFiles.length; i++) { - String filename = nonRootFiles[i]; - File file = new File(filename); - if (file.isAbsolute()) - result.add(file); - else - result.add(new File(source, filename)); - } - return result.toArray(new File[result.size()]); - } - - protected ExecutablesDescriptor computeExecutables(String configSpec) { - String os = AbstractPublisherAction.parseConfigSpec(configSpec)[1]; - // TODO here we should not assume that the executable is called "eclipse" - return ExecutablesDescriptor.createDescriptor(os, "eclipse", computeExecutableLocation(configSpec)); //$NON-NLS-1$ - } - - protected File computeRootFileRoot(String configSpec) { - return new File(source); - } - - protected File[] computeRootFileInclusions(String configSpec) { - return new File[] {new File(source)}; - } - - protected File computeExecutableLocation(String configSpec) { - return new File(source); - } - - protected File getExecutablesLocation() { - return new File(source); - } - - protected IPublisherAction createBundlesAction() { - // TODO need to add in the simple configorator and reconciler bundle descriptions. - // TODO bundles action needs to take bundleDescriptions directly rather than just files. - return new BundlesAction(new File[] {new File(source, "plugins")}); //$NON-NLS-1$ - } -} diff --git a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/EquinoxExecutableAction.java b/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/EquinoxExecutableAction.java deleted file mode 100644 index 7f9a4db2c..000000000 --- a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/EquinoxExecutableAction.java +++ /dev/null @@ -1,258 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 2009 Code 9 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: - * Code 9 - initial API and implementation - * IBM - ongoing development - ******************************************************************************/ -package org.eclipse.equinox.p2.publisher.eclipse; - -import java.io.File; -import java.util.*; -import org.eclipse.core.runtime.*; -import org.eclipse.equinox.internal.p2.core.helpers.FileUtils; -import org.eclipse.equinox.internal.p2.publisher.eclipse.BrandingIron; -import org.eclipse.equinox.internal.p2.publisher.eclipse.ExecutablesDescriptor; -import org.eclipse.equinox.p2.metadata.*; -import org.eclipse.equinox.p2.metadata.MetadataFactory.InstallableUnitDescription; -import org.eclipse.equinox.p2.metadata.MetadataFactory.InstallableUnitFragmentDescription; -import org.eclipse.equinox.p2.metadata.expression.IMatchExpression; -import org.eclipse.equinox.p2.publisher.*; -import org.eclipse.equinox.p2.repository.artifact.IArtifactDescriptor; -import org.eclipse.equinox.spi.p2.publisher.PublisherHelper; -import org.eclipse.osgi.service.environment.Constants; - -/** - * Given the description of an executable, this action publishes optionally - * non-destructively brands the executable, publishes the resultant artifacts - * and publishes the required IUs to identify the branded executable, configure - * the executable and set it up as the launcher for a profile. - * <p> - * This action works on one platform configuration only. - * <p> - * This action consults the following types of advice: - * </ul> - * <li>{@link IBrandingAdvice}</li> - * </ul> - */ -public class EquinoxExecutableAction extends AbstractPublisherAction { - private static String TYPE = "executable"; //$NON-NLS-1$ - - protected String configSpec; - protected String idBase; - protected Version version; - protected ExecutablesDescriptor executables; - protected String flavor; - - protected EquinoxExecutableAction() { - //hidden - } - - public EquinoxExecutableAction(ExecutablesDescriptor executables, String configSpec, String idBase, Version version, String flavor) { - this.executables = executables; - this.configSpec = configSpec; - this.idBase = idBase == null ? "org.eclipse" : idBase; //$NON-NLS-1$ - this.version = version; - this.flavor = flavor; - } - - public IStatus perform(IPublisherInfo publisherinfo, IPublisherResult result, IProgressMonitor monitor) { - setPublisherInfo(publisherinfo); - ExecutablesDescriptor brandedExecutables = brandExecutables(executables); - try { - if (publishExecutableIU(brandedExecutables, result)) - publishExecutableCU(brandedExecutables, result); - publishExecutableSetter(brandedExecutables, result); - } finally { - if (brandedExecutables.isTemporary()) - FileUtils.deleteAll(brandedExecutables.getLocation()); - } - return Status.OK_STATUS; - } - - /** - * Publishes the IUs that cause the executable to be actually set as the launcher for - * the profile - */ - private void publishExecutableSetter(ExecutablesDescriptor brandedExecutables, IPublisherResult result) { - InstallableUnitDescription iud = new MetadataFactory.InstallableUnitDescription(); - String executableName = brandedExecutables.getExecutableName(); - String id = getExecutableId() + '.' + executableName; - iud.setId(id); - iud.setVersion(version); - iud.setTouchpointType(PublisherHelper.TOUCHPOINT_OSGI); - iud.setCapabilities(new IProvidedCapability[] {createSelfCapability(id, version)}); - iud.setFilter(createFilterSpec(configSpec)); - Map<String, String> touchpointData = new HashMap<String, String>(); - touchpointData.put("configure", "setLauncherName(name:" + executableName + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - touchpointData.put("unconfigure", "setLauncherName()"); //$NON-NLS-1$ //$NON-NLS-2$ - iud.addTouchpointData(MetadataFactory.createTouchpointData(touchpointData)); - result.addIU(MetadataFactory.createInstallableUnit(iud), IPublisherResult.ROOT); - } - - /** - * Publishes IUs and CUs for the files that make up the launcher for a given - * ws/os/arch combination. - */ - protected boolean publishExecutableIU(ExecutablesDescriptor execDescriptor, IPublisherResult result) { - String[] config = parseConfigSpec(configSpec); - if (execDescriptor.getFiles().length == 0 && (config.length == 0 || CONFIG_ANY.equalsIgnoreCase(config[0]))) { - return false; //no cu required - } - boolean publishCU = true; - - // Create the IU for the executable - InstallableUnitDescription iu = new MetadataFactory.InstallableUnitDescription(); - String id = getExecutableId(); - iu.setId(id); - iu.setVersion(version); - IMatchExpression<IInstallableUnit> filter = createFilterSpec(configSpec); - iu.setFilter(filter); - iu.setSingleton(true); - iu.setTouchpointType(PublisherHelper.TOUCHPOINT_NATIVE); - String namespace = ConfigCUsAction.getAbstractCUCapabilityNamespace(idBase, TYPE, flavor, configSpec); - String capabilityId = ConfigCUsAction.getAbstractCUCapabilityId(idBase, TYPE, flavor, configSpec); - IProvidedCapability executableCapability = MetadataFactory.createProvidedCapability(namespace, capabilityId, version); - IProvidedCapability selfCapability = createSelfCapability(id, version); - iu.setCapabilities(new IProvidedCapability[] {selfCapability, executableCapability}); - - //Create the artifact descriptor. we have several files so no path on disk - if (execDescriptor.getFiles().length == 0) { - publishCU = false; - } else { - IArtifactKey key = PublisherHelper.createBinaryArtifactKey(id, version); - iu.setArtifacts(new IArtifactKey[] {key}); - IArtifactDescriptor descriptor = PublisherHelper.createArtifactDescriptor(info, key, null); - publishArtifact(descriptor, execDescriptor.getFiles(), null, info, createRootPrefixComputer(execDescriptor.getLocation())); - if (execDescriptor.isTemporary()) - FileUtils.deleteAll(execDescriptor.getLocation()); - } - // setup a requirement between the executable and the launcher fragment that has the shared library - if (config.length > 0 && !CONFIG_ANY.equalsIgnoreCase(config[0])) { - String ws = config[0]; - String os = config[1]; - String arch = config[2]; - String launcherFragment = EquinoxLauncherCUAction.ORG_ECLIPSE_EQUINOX_LAUNCHER + '.' + ws + '.' + os; - if (!(Constants.OS_MACOSX.equals(os) && !Constants.ARCH_X86_64.equals(arch))) - launcherFragment += '.' + arch; - iu.setRequirements(new IRequirement[] {MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, launcherFragment, VersionRange.emptyRange, filter, false, false)}); - } - result.addIU(MetadataFactory.createInstallableUnit(iu), IPublisherResult.ROOT); - return publishCU; - } - - private String getExecutableId() { - return createCUIdString(idBase, TYPE, "", configSpec); //$NON-NLS-1$ - } - - // Create the CU that installs (e.g., unzips) the executable - private void publishExecutableCU(ExecutablesDescriptor execDescriptor, IPublisherResult result) { - InstallableUnitFragmentDescription cu = new InstallableUnitFragmentDescription(); - String id = createCUIdString(idBase, TYPE, flavor, configSpec); - cu.setId(id); - cu.setVersion(version); - cu.setFilter(createFilterSpec(configSpec)); - String executableId = getExecutableId(); - cu.setHost(new IRequirement[] {MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, executableId, new VersionRange(version, true, version, true), null, false, false)}); - cu.setProperty(InstallableUnitDescription.PROP_TYPE_FRAGMENT, Boolean.TRUE.toString()); - //TODO bug 218890, would like the fragment to provide the launcher capability as well, but can't right now. - cu.setCapabilities(new IProvidedCapability[] {PublisherHelper.createSelfCapability(id, version)}); - cu.setTouchpointType(PublisherHelper.TOUCHPOINT_NATIVE); - String[] config = parseConfigSpec(configSpec); - String os = config[1]; - Map<String, String> touchpointData = computeInstallActions(execDescriptor, os); - cu.addTouchpointData(MetadataFactory.createTouchpointData(touchpointData)); - IInstallableUnit unit = MetadataFactory.createInstallableUnit(cu); - result.addIU(unit, IPublisherResult.ROOT); - } - - private Map<String, String> computeInstallActions(ExecutablesDescriptor execDescriptor, String os) { - Map<String, String> touchpointData = new HashMap<String, String>(); - String configurationData = "unzip(source:@artifact, target:${installFolder});"; //$NON-NLS-1$ - if (Constants.OS_MACOSX.equals(os)) { - String execName = execDescriptor.getExecutableName(); - configurationData += " chmod(targetDir:${installFolder}/" + execName + ".app/Contents/MacOS/, targetFile:" + execName + ", permissions:755);"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } else if (!Constants.OS_WIN32.equals(os)) { - // We are on linux/unix. by default set all of the files to be executable. - File[] fileList = execDescriptor.getFiles(); - for (int i = 0; i < fileList.length; i++) - configurationData += " chmod(targetDir:${installFolder}, targetFile:" + fileList[i].getName() + ", permissions:755);"; //$NON-NLS-1$ //$NON-NLS-2$ - } - touchpointData.put("install", configurationData); //$NON-NLS-1$ - String unConfigurationData = "cleanupzip(source:@artifact, target:${installFolder});"; //$NON-NLS-1$ - touchpointData.put("uninstall", unConfigurationData); //$NON-NLS-1$ - return touchpointData; - } - - /** - * Brands a copy of the given executable descriptor with the information in the - * current product definition. The files described in the descriptor are also copied - * to a temporary location to avoid destructive modification. - * - * @param descriptor the executable descriptor to brand. - * @return the new descriptor - */ - protected ExecutablesDescriptor brandExecutables(ExecutablesDescriptor descriptor) { - ExecutablesDescriptor result = new ExecutablesDescriptor(descriptor); - result.makeTemporaryCopy(); - IBrandingAdvice advice = getBrandingAdvice(); - if (advice == null) - partialBrandExecutables(result); - else - fullBrandExecutables(result, advice); - return result; - } - - private IBrandingAdvice getBrandingAdvice() { - // there is expected to only be one branding advice for a given configspec so - // just return the first one we find. - Collection<IBrandingAdvice> advice = info.getAdvice(configSpec, true, null, null, IBrandingAdvice.class); - for (Iterator<IBrandingAdvice> i = advice.iterator(); i.hasNext();) - return i.next(); - return null; - } - - protected void fullBrandExecutables(ExecutablesDescriptor descriptor, IBrandingAdvice advice) { - BrandingIron iron = new BrandingIron(); - iron.setIcons(advice.getIcons()); - String name = advice.getExecutableName(); - if (name == null) - name = "eclipse"; //$NON-NLS-1$ - iron.setName(name); - iron.setOS(advice.getOS()); - iron.setRoot(descriptor.getLocation().getAbsolutePath()); - try { - iron.brand(); - descriptor.setExecutableName(name, true); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - - protected void partialBrandExecutables(ExecutablesDescriptor descriptor) { - File[] list = descriptor.getFiles(); - for (int i = 0; i < list.length; i++) - mungeExecutableFileName(list[i], descriptor); - descriptor.setExecutableName("eclipse", true); //$NON-NLS-1$ - } - - // TODO This method is a temporary hack to rename the launcher.exe files - // to eclipse.exe (or "launcher" to "eclipse"). Eventually we will either hand-craft - // metadata/artifacts for launchers, or alter the delta pack to contain eclipse-branded - // launchers. - private void mungeExecutableFileName(File file, ExecutablesDescriptor descriptor) { - if (file.getName().equals("launcher")) { //$NON-NLS-1$ - File newFile = new File(file.getParentFile(), "eclipse"); //$NON-NLS-1$ - file.renameTo(newFile); - descriptor.replace(file, newFile); - } else if (file.getName().equals("launcher.exe")) { //$NON-NLS-1$ - File newFile = new File(file.getParentFile(), "eclipse.exe"); //$NON-NLS-1$ - file.renameTo(newFile); - descriptor.replace(file, newFile); - } - } -} diff --git a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/EquinoxLauncherCUAction.java b/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/EquinoxLauncherCUAction.java deleted file mode 100644 index abcafe7ef..000000000 --- a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/EquinoxLauncherCUAction.java +++ /dev/null @@ -1,100 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008 Code 9 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: - * Code 9 - initial API and implementation - * IBM - ongoing development - ******************************************************************************/ -package org.eclipse.equinox.p2.publisher.eclipse; - -import java.util.Collection; -import org.eclipse.core.runtime.*; -import org.eclipse.equinox.internal.frameworkadmin.utils.Utils; -import org.eclipse.equinox.internal.p2.publisher.eclipse.GeneratorBundleInfo; -import org.eclipse.equinox.p2.metadata.IInstallableUnit; -import org.eclipse.equinox.p2.metadata.Version; -import org.eclipse.equinox.p2.metadata.expression.IMatchExpression; -import org.eclipse.equinox.p2.publisher.*; -import org.eclipse.equinox.p2.publisher.actions.IVersionAdvice; -import org.eclipse.osgi.service.environment.Constants; - -/** - * Create CUs for all Equinox launcher related IUs for the given set of configurations - * such that the launcher is configured as the startup code and the fragments - * are configured as the launcher.library. - * <p> - * This action expects to have find the versions of the launcher and launcher fragments - * via IVersionAdvice in the supplied info object. - * </p> - */ -public class EquinoxLauncherCUAction extends AbstractPublisherAction { - - public static final String ORG_ECLIPSE_EQUINOX_LAUNCHER = "org.eclipse.equinox.launcher"; //$NON-NLS-1$ - - private String flavor; - private String[] configSpecs; - - public EquinoxLauncherCUAction(String flavor, String[] configSpecs) { - this.flavor = flavor; - this.configSpecs = configSpecs; - } - - public IStatus perform(IPublisherInfo publisherInfo, IPublisherResult results, IProgressMonitor monitor) { - setPublisherInfo(publisherInfo); - publishCU(ORG_ECLIPSE_EQUINOX_LAUNCHER, null, results); - publishLauncherFragmentCUs(results); - return Status.OK_STATUS; - } - - /** - * For each of the configurations we are publishing, create a launcher fragment - * CU if there is version advice for the fragment. - */ - private void publishLauncherFragmentCUs(IPublisherResult results) { - String id = null; - for (int i = 0; i < configSpecs.length; i++) { - String configSpec = configSpecs[i]; - String[] specs = Utils.getTokens(configSpec, "."); //$NON-NLS-1$ - if (specs.length > 0 && !AbstractPublisherAction.CONFIG_ANY.equalsIgnoreCase(specs[0])) { - if (specs.length > 2 && Constants.OS_MACOSX.equals(specs[1]) && !Constants.ARCH_X86_64.equals(specs[2])) { - //launcher fragment for mac only has arch for x86_64 - id = ORG_ECLIPSE_EQUINOX_LAUNCHER + '.' + specs[0] + '.' + specs[1]; - } else { - id = ORG_ECLIPSE_EQUINOX_LAUNCHER + '.' + configSpec; - } - publishCU(id, configSpec, results); - } - } - } - - /** - * Publish a CU for the IU of the given id in the given config spec. If the IU is the - * launcher bundle iu then set it up as the startup JAR. If it is a launcher fragment then - * configure it in as the launcher.library for this configuration. - */ - private void publishCU(String id, String configSpec, IPublisherResult results) { - Collection<IVersionAdvice> advice = info.getAdvice(configSpec, true, id, null, IVersionAdvice.class); - for (IVersionAdvice versionSpec : advice) { - Version version = versionSpec.getVersion(IInstallableUnit.NAMESPACE_IU_ID, id); - if (version == null) - continue; - GeneratorBundleInfo bundle = new GeneratorBundleInfo(); - bundle.setSymbolicName(id); - bundle.setVersion(version.toString()); - if (id.equals(ORG_ECLIPSE_EQUINOX_LAUNCHER)) { - bundle.setSpecialConfigCommands("addProgramArg(programArg:-startup);addProgramArg(programArg:@artifact);"); //$NON-NLS-1$ - bundle.setSpecialUnconfigCommands("removeProgramArg(programArg:-startup);removeProgramArg(programArg:@artifact);"); //$NON-NLS-1$ - } else { - bundle.setSpecialConfigCommands("addProgramArg(programArg:--launcher.library);addProgramArg(programArg:@artifact);"); //$NON-NLS-1$ - bundle.setSpecialUnconfigCommands("removeProgramArg(programArg:--launcher.library);removeProgramArg(programArg:@artifact);"); //$NON-NLS-1$ - } - IMatchExpression<IInstallableUnit> filter = configSpec == null ? null : createFilterSpec(configSpec); - IInstallableUnit cu = BundlesAction.createBundleConfigurationUnit(id, version, false, bundle, flavor, filter); - if (cu != null) - results.addIU(cu, IPublisherResult.ROOT); - } - } -} diff --git a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/Feature.java b/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/Feature.java deleted file mode 100644 index b57f0eafa..000000000 --- a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/Feature.java +++ /dev/null @@ -1,326 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2009 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.p2.publisher.eclipse; - -import java.util.*; - -/** - * - * Feature information - */ -public class Feature { - - private final String id; - private String version; - private String label; - private String image; - private String pluginId; - private boolean primary = false; - private boolean exclusive = false; - private String application; - private String colocationAffinity; - - private URLEntry description; - private URLEntry license; - private URLEntry copyright; - - private String installHandler; - private String installHandlerURL; - private String installHandlerLibrary; - - private URLEntry updateSite; - private ArrayList<URLEntry> discoverySites; - - private ArrayList<FeatureEntry> entries; - private String providerName; - private String os; - private String ws; - private String arch; - private String nl; - - private String location; - - private Map<Locale, Map<String, String>> localizations; - - public Feature(String id, String version) { - if (id == null) - throw new IllegalArgumentException(); - this.id = id; - this.version = version; - } - - public void addDiscoverySite(String siteLabel, String url) { - if (siteLabel == null && url == null) - return; - - if (this.discoverySites == null) - this.discoverySites = new ArrayList<URLEntry>(); - - URLEntry entry = new URLEntry(url, siteLabel); - this.discoverySites.add(entry); - } - - public void addEntry(FeatureEntry plugin) { - if (entries == null) - entries = new ArrayList<FeatureEntry>(); - entries.add(plugin); - } - - public String getApplication() { - return application; - } - - public String getArch() { - return arch; - } - - public String getColocationAffinity() { - return colocationAffinity; - } - - public String getCopyright() { - if (copyright != null) - return copyright.getAnnotation(); - return null; - } - - public String getCopyrightURL() { - if (copyright != null) - return copyright.getURL(); - return null; - } - - public String getDescription() { - if (description != null) - return description.getAnnotation(); - return null; - } - - public String getDescriptionURL() { - if (description != null) - return description.getURL(); - return null; - } - - public URLEntry[] getDiscoverySites() { - if (discoverySites == null) - return new URLEntry[0]; - return discoverySites.toArray(new URLEntry[discoverySites.size()]); - } - - public FeatureEntry[] getEntries() { - if (entries == null) - return new FeatureEntry[0]; - return entries.toArray(new FeatureEntry[entries.size()]); - } - - public String getId() { - return id; - } - - public String getImage() { - return image; - } - - public String getInstallHandler() { - return installHandler; - } - - public String getInstallHandlerLibrary() { - return installHandlerLibrary; - } - - public String getInstallHandlerURL() { - return installHandlerURL; - } - - public String getLabel() { - return label; - } - - public String getLicense() { - if (license != null) - return license.getAnnotation(); - return null; - } - - public String getLicenseURL() { - if (license != null) - return license.getURL(); - return null; - } - - public Map<Locale, Map<String, String>> getLocalizations() { - return this.localizations; - } - - public String getLocation() { - return this.location; - } - - public String getNL() { - return nl; - } - - public String getOS() { - return os; - } - - public String getPlugin() { - return pluginId; - } - - public String getProviderName() { - return providerName; - } - - public URLEntry getUpdateSite() { - return updateSite; - } - - public String getVersion() { - return version; - } - - public String getWS() { - return ws; - } - - public boolean isExclusive() { - return exclusive; - } - - public boolean isPrimary() { - return primary; - } - - public void setApplication(String application) { - this.application = application; - } - - public void setColocationAffinity(String colocationAffinity) { - this.colocationAffinity = colocationAffinity; - } - - public void setCopyright(String copyright) { - if (this.copyright == null) - this.copyright = new URLEntry(); - this.copyright.setAnnotation(copyright); - } - - public void setCopyrightURL(String copyrightURL) { - if (this.copyright == null) - this.copyright = new URLEntry(); - this.copyright.setURL(copyrightURL); - } - - public void setDescription(String description) { - if (this.description == null) - this.description = new URLEntry(); - this.description.setAnnotation(description); - } - - public void setDescriptionURL(String descriptionURL) { - if (this.description == null) - this.description = new URLEntry(); - this.description.setURL(descriptionURL); - } - - public void setEnvironment(String os, String ws, String arch, String nl) { - this.os = os; - this.ws = ws; - this.arch = arch; - this.nl = nl; - } - - public void setExclusive(boolean exclusive) { - this.exclusive = exclusive; - } - - public void setImage(String image) { - this.image = image; - } - - public void setInstallHandler(String installHandler) { - this.installHandler = installHandler; - } - - public void setInstallHandlerLibrary(String installHandlerLibrary) { - this.installHandlerLibrary = installHandlerLibrary; - } - - public void setInstallHandlerURL(String installHandlerURL) { - this.installHandlerURL = installHandlerURL; - } - - public void setLabel(String label) { - this.label = label; - } - - public void setLicense(String license) { - if (this.license == null) - this.license = new URLEntry(); - this.license.setAnnotation(license); - } - - public void setLicenseURL(String licenseURL) { - if (this.license == null) - this.license = new URLEntry(); - this.license.setURL(licenseURL); - } - - public void setLocalizations(Map<Locale, Map<String, String>> localizations) { - this.localizations = localizations; - } - - public void setLocation(String location) { - this.location = location; - } - - public void setPlugin(String pluginId) { - this.pluginId = pluginId; - } - - public void setPrimary(boolean primary) { - this.primary = primary; - } - - public void setProviderName(String value) { - providerName = value; - } - - public void setUpdateSiteLabel(String updateSiteLabel) { - if (this.updateSite == null) - this.updateSite = new URLEntry(); - this.updateSite.setAnnotation(updateSiteLabel); - } - - public void setUpdateSiteURL(String updateSiteURL) { - if (this.updateSite == null) - this.updateSite = new URLEntry(); - this.updateSite.setURL(updateSiteURL); - } - - public void setURL(String value) { - // - } - - public void setVersion(String version) { - this.version = version; - } - - /** - * For debugging purposes only. - */ - public String toString() { - return "Feature " + id + " version: " + version; //$NON-NLS-1$ //$NON-NLS-2$ - } -} diff --git a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/FeatureEntry.java b/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/FeatureEntry.java deleted file mode 100644 index 53c865604..000000000 --- a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/FeatureEntry.java +++ /dev/null @@ -1,189 +0,0 @@ -/******************************************************************************* - * 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.equinox.p2.publisher.eclipse; - -import org.eclipse.equinox.p2.metadata.Version; - -/** - */ -public class FeatureEntry { - private final String id; - private String version; - private String url; - private String os; - private String ws; - private String arch; - private String nl; - private String match; - private final boolean isPlugin; - private boolean isFragment = false; - private boolean isRequires = false; - private boolean unpack = true; - private boolean optional = false; - private boolean isPatch = false; - private String filter; - - public static FeatureEntry createRequires(String id, String version, String match, String filter, boolean isPlugin) { - FeatureEntry result = new FeatureEntry(id, version, isPlugin); - result.match = match; - result.isRequires = true; - // for requires we don't care what the form is so leave it as false (JAR'd) - result.unpack = false; - if (filter != null) - result.setFilter(filter); - return result; - } - - public FeatureEntry(String id, String version, boolean isPlugin) { - this.id = id; - this.version = Version.parseVersion(version).toString(); - this.isPlugin = isPlugin; - } - - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - final FeatureEntry other = (FeatureEntry) obj; - if (id == null) { - if (other.id != null) - return false; - } else if (!id.equals(other.id)) - return false; - if (version == null) { - if (other.version != null) - return false; - } else if (!version.equals(other.version)) - return false; - - if (isPlugin() != other.isPlugin()) - return false; - if (isRequires() != other.isRequires()) - return false; - return true; - } - - public String getArch() { - return arch; - } - - public String getFilter() { - return filter; - } - - public String getId() { - return id; - } - - public String getMatch() { - return match; - } - - public String getNL() { - return nl; - } - - public String getOS() { - return os; - } - - public String getURL() { - return url; - } - - public String getVersion() { - return version; - } - - public String getWS() { - return ws; - } - - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((id == null) ? 0 : id.hashCode()); - result = prime * result + ((version == null) ? 0 : version.hashCode()); - return result; - } - - public boolean isFragment() { - return isFragment; - } - - public boolean isOptional() { - return optional; - } - - public boolean isPlugin() { - return isPlugin; - } - - public boolean isRequires() { - return isRequires; - } - - public boolean isUnpack() { - return unpack; - } - - public void setEnvironment(String os, String ws, String arch, String nl) { - this.os = os; - this.ws = ws; - this.arch = arch; - this.nl = nl; - } - - public void setFilter(String filter) { - this.filter = filter; - - } - - public void setFragment(boolean value) { - isFragment = value; - } - - public void setOptional(boolean value) { - optional = value; - } - - public void setUnpack(boolean value) { - unpack = value; - } - - public void setURL(String value) { - url = value; - } - - public void setVersion(String value) { - version = Version.parseVersion(value).toString(); - } - - public String toString() { - StringBuffer result = new StringBuffer(); - result.append(isRequires ? "Requires: " : ""); //$NON-NLS-1$ //$NON-NLS-2$ - result.append(isPlugin ? "Plugin: " : "Feature: "); //$NON-NLS-1$ //$NON-NLS-2$ - result.append(id != null ? id.toString() : ""); //$NON-NLS-1$ - result.append(version != null ? " " + version.toString() : ""); //$NON-NLS-1$ //$NON-NLS-2$ - return result.toString(); - } - - public boolean isPatch() { - return isPatch; - } - - public void setPatch(boolean patch) { - this.isPatch = patch; - } -} diff --git a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/FeaturesAction.java b/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/FeaturesAction.java deleted file mode 100644 index 8467d1a5c..000000000 --- a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/FeaturesAction.java +++ /dev/null @@ -1,659 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 2010 Code 9 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: - * Code 9 - initial API and implementation - * IBM - ongoing development - ******************************************************************************/ -package org.eclipse.equinox.p2.publisher.eclipse; - -import java.io.File; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.*; -import java.util.Map.Entry; -import org.eclipse.core.runtime.*; -import org.eclipse.equinox.internal.p2.core.helpers.*; -import org.eclipse.equinox.internal.p2.core.helpers.FileUtils.IPathComputer; -import org.eclipse.equinox.internal.p2.metadata.ArtifactKey; -import org.eclipse.equinox.internal.p2.metadata.InstallableUnit; -import org.eclipse.equinox.internal.p2.publisher.*; -import org.eclipse.equinox.internal.p2.publisher.Messages; -import org.eclipse.equinox.internal.p2.publisher.eclipse.FeatureParser; -import org.eclipse.equinox.p2.metadata.*; -import org.eclipse.equinox.p2.metadata.MetadataFactory.InstallableUnitDescription; -import org.eclipse.equinox.p2.metadata.MetadataFactory.InstallableUnitPatchDescription; -import org.eclipse.equinox.p2.metadata.expression.IMatchExpression; -import org.eclipse.equinox.p2.publisher.*; -import org.eclipse.equinox.p2.publisher.actions.IFeatureRootAdvice; -import org.eclipse.equinox.p2.repository.IRepository; -import org.eclipse.equinox.p2.repository.IRepositoryReference; -import org.eclipse.equinox.p2.repository.artifact.IArtifactDescriptor; -import org.eclipse.equinox.p2.repository.artifact.spi.ArtifactDescriptor; -import org.eclipse.equinox.p2.repository.spi.RepositoryReference; -import org.eclipse.equinox.spi.p2.publisher.PublisherHelper; -import org.eclipse.osgi.util.NLS; - -/** - * Publish IUs for all of the features in the given set of locations. The locations can - * be actual locations of the features or folders of features. - */ -public class FeaturesAction extends AbstractPublisherAction { - public static final String INSTALL_FEATURES_FILTER = "(org.eclipse.update.install.features=true)"; //$NON-NLS-1$ - private static final String UPDATE_FEATURE_APPLICATION_PROP = "org.eclipse.update.feature.application"; //$NON-NLS-1$ - private static final String UPDATE_FEATURE_PLUGIN_PROP = "org.eclipse.update.feature.plugin"; //$NON-NLS-1$ - private static final String UPDATE_FEATURE_EXCLUSIVE_PROP = "org.eclipse.update.feature.exclusive"; //$NON-NLS-1$ - private static final String UPDATE_FEATURE_PRIMARY_PROP = "org.eclipse.update.feature.primary"; //$NON-NLS-1$ - - protected Feature[] features; - private File[] locations; - - public static IArtifactKey createFeatureArtifactKey(String id, String version) { - return new ArtifactKey(PublisherHelper.ECLIPSE_FEATURE_CLASSIFIER, id, Version.parseVersion(version)); - } - - public static IInstallableUnit createFeatureJarIU(Feature feature, IPublisherInfo info) { - InstallableUnitDescription iu = new MetadataFactory.InstallableUnitDescription(); - String id = getTransformedId(feature.getId(), /*isPlugin*/false, /*isGroup*/false); - iu.setId(id); - Version version = Version.parseVersion(feature.getVersion()); - iu.setVersion(version); - - // set properties for other feature attributes - iu.setProperty(IInstallableUnit.PROP_NAME, feature.getLabel()); - if (feature.getDescription() != null) - iu.setProperty(IInstallableUnit.PROP_DESCRIPTION, feature.getDescription()); - if (feature.getDescriptionURL() != null) - iu.setProperty(IInstallableUnit.PROP_DESCRIPTION_URL, feature.getDescriptionURL()); - if (feature.getProviderName() != null) - iu.setProperty(IInstallableUnit.PROP_PROVIDER, feature.getProviderName()); - if (feature.getLicense() != null) - iu.setLicenses(new ILicense[] {MetadataFactory.createLicense(toURIOrNull(feature.getLicenseURL()), feature.getLicense())}); - if (feature.getCopyright() != null) - iu.setCopyright(MetadataFactory.createCopyright(toURIOrNull(feature.getCopyrightURL()), feature.getCopyright())); - if (feature.getApplication() != null) - iu.setProperty(UPDATE_FEATURE_APPLICATION_PROP, feature.getApplication()); - if (feature.getPlugin() != null) - iu.setProperty(UPDATE_FEATURE_PLUGIN_PROP, feature.getPlugin()); - if (feature.isExclusive()) - iu.setProperty(UPDATE_FEATURE_EXCLUSIVE_PROP, Boolean.TRUE.toString()); - if (feature.isPrimary()) - iu.setProperty(UPDATE_FEATURE_PRIMARY_PROP, Boolean.TRUE.toString()); - - // The required capabilities are not specified at this level because we don't want the feature jar to be attractive to install. - iu.setTouchpointType(PublisherHelper.TOUCHPOINT_OSGI); - iu.setFilter(INSTALL_FEATURES_FILTER); - iu.setSingleton(true); - - if (feature.getInstallHandler() != null && feature.getInstallHandler().trim().length() > 0) { - String installHandlerProperty = "handler=" + feature.getInstallHandler(); //$NON-NLS-1$ - - if (feature.getInstallHandlerLibrary() != null) - installHandlerProperty += ", library=" + feature.getInstallHandlerLibrary(); //$NON-NLS-1$ - - if (feature.getInstallHandlerURL() != null) - installHandlerProperty += ", url=" + feature.getInstallHandlerURL(); //$NON-NLS-1$ - - iu.setProperty(PublisherHelper.ECLIPSE_INSTALL_HANDLER_PROP, installHandlerProperty); - } - - ArrayList<IProvidedCapability> providedCapabilities = new ArrayList<IProvidedCapability>(); - providedCapabilities.add(PublisherHelper.createSelfCapability(id, version)); - providedCapabilities.add(PublisherHelper.FEATURE_CAPABILITY); - providedCapabilities.add(MetadataFactory.createProvidedCapability(PublisherHelper.CAPABILITY_NS_UPDATE_FEATURE, feature.getId(), version)); - - iu.setCapabilities(new IProvidedCapability[] {PublisherHelper.createSelfCapability(id, version), PublisherHelper.FEATURE_CAPABILITY, MetadataFactory.createProvidedCapability(PublisherHelper.CAPABILITY_NS_UPDATE_FEATURE, feature.getId(), version)}); - iu.setArtifacts(new IArtifactKey[] {createFeatureArtifactKey(feature.getId(), version.toString())}); - - Map<String, String> touchpointData = new HashMap<String, String>(); - touchpointData.put("zipped", "true"); //$NON-NLS-1$ //$NON-NLS-2$ - iu.addTouchpointData(MetadataFactory.createTouchpointData(touchpointData)); - - Map<Locale, Map<String, String>> localizations = feature.getLocalizations(); - if (localizations != null) { - for (Entry<Locale, Map<String, String>> locEntry : localizations.entrySet()) { - Locale locale = locEntry.getKey(); - Map<String, String> translatedStrings = locEntry.getValue(); - for (Entry<String, String> entry : translatedStrings.entrySet()) { - iu.setProperty(locale.toString() + '.' + entry.getKey(), entry.getValue()); - } - providedCapabilities.add(PublisherHelper.makeTranslationCapability(id, locale)); - } - } - - processInstallableUnitPropertiesAdvice(iu, info); - return MetadataFactory.createInstallableUnit(iu); - } - - private static String getTransformedId(String original, boolean isPlugin, boolean isGroup) { - return (isPlugin ? original : original + (isGroup ? ".feature.group" : ".feature.jar")); //$NON-NLS-1$//$NON-NLS-2$ - } - - /** - * Returns a URI corresponding to the given URL in string form, or null - * if a well formed URI could not be created. - */ - private static URI toURIOrNull(String url) { - if (url == null) - return null; - try { - return URIUtil.fromString(url); - } catch (URISyntaxException e) { - return null; - } - } - - public FeaturesAction(Feature[] features) { - this.features = features; - } - - public FeaturesAction(File[] locations) { - this.locations = locations; - } - - /** - * Looks for advice in a p2.inf file inside the feature location. - */ - private void createAdviceFileAdvice(Feature feature, IPublisherInfo publisherInfo) { - //assume p2.inf is co-located with feature.xml - String location = feature.getLocation(); - if (location != null) { - String groupId = getTransformedId(feature.getId(), /*isPlugin*/false, /*isGroup*/true); - AdviceFileAdvice advice = new AdviceFileAdvice(groupId, Version.parseVersion(feature.getVersion()), new Path(location), new Path("p2.inf")); //$NON-NLS-1$ - if (advice.containsAdvice()) - publisherInfo.addAdvice(advice); - } - } - - /** - * Gather any advice we can from the given feature. In particular, it may have - * information about the shape of the bundles it includes. The discovered advice is - * added to the given result. - * @param feature the feature to process - * @param publisherInfo the publishing info to update - */ - private void createBundleShapeAdvice(Feature feature, IPublisherInfo publisherInfo) { - FeatureEntry entries[] = feature.getEntries(); - for (int i = 0; i < entries.length; i++) { - FeatureEntry entry = entries[i]; - if (entry.isUnpack() && entry.isPlugin() && !entry.isRequires()) - publisherInfo.addAdvice(new BundleShapeAdvice(entry.getId(), Version.parseVersion(entry.getVersion()), IBundleShapeAdvice.DIR)); - } - } - - protected IInstallableUnit createFeatureRootFileIU(String featureId, String featureVersion, File location, FileSetDescriptor descriptor) { - InstallableUnitDescription iu = new MetadataFactory.InstallableUnitDescription(); - iu.setSingleton(true); - String id = featureId + '_' + descriptor.getKey(); - iu.setId(id); - Version version = Version.parseVersion(featureVersion); - iu.setVersion(version); - iu.setCapabilities(new IProvidedCapability[] {PublisherHelper.createSelfCapability(id, version)}); - iu.setTouchpointType(PublisherHelper.TOUCHPOINT_NATIVE); - String configSpec = descriptor.getConfigSpec(); - if (configSpec != null && configSpec.length() > 0) - iu.setFilter(createFilterSpec(configSpec)); - - Map<String, String> touchpointData = new HashMap<String, String>(2); - String configurationData = "unzip(source:@artifact, target:${installFolder});"; //$NON-NLS-1$ - touchpointData.put("install", configurationData); //$NON-NLS-1$ - String unConfigurationData = "cleanupzip(source:@artifact, target:${installFolder});"; //$NON-NLS-1$ - touchpointData.put("uninstall", unConfigurationData); //$NON-NLS-1$ - iu.addTouchpointData(MetadataFactory.createTouchpointData(touchpointData)); - - // prime the IU with an artifact key that will correspond to the zipped up root files. - IArtifactKey key = new ArtifactKey(PublisherHelper.BINARY_ARTIFACT_CLASSIFIER, iu.getId(), iu.getVersion()); - iu.setArtifacts(new IArtifactKey[] {key}); - setupLinks(iu, descriptor); - setupPermissions(iu, descriptor); - - IInstallableUnit iuResult = MetadataFactory.createInstallableUnit(iu); - // need to return both the iu and any files. - return iuResult; - } - - protected IInstallableUnit createGroupIU(Feature feature, List<IInstallableUnit> childIUs, IPublisherInfo publisherInfo) { - if (isPatch(feature)) - return createPatchIU(feature, childIUs, publisherInfo); - InstallableUnitDescription iu = new MetadataFactory.InstallableUnitDescription(); - String id = getGroupId(feature.getId()); - iu.setId(id); - Version version = PublisherHelper.fromOSGiVersion(new org.osgi.framework.Version(feature.getVersion())); - iu.setVersion(version); - - iu.setProperty(IInstallableUnit.PROP_NAME, feature.getLabel()); - if (feature.getDescription() != null) - iu.setProperty(IInstallableUnit.PROP_DESCRIPTION, feature.getDescription()); - if (feature.getDescriptionURL() != null) - iu.setProperty(IInstallableUnit.PROP_DESCRIPTION_URL, feature.getDescriptionURL()); - if (feature.getProviderName() != null) - iu.setProperty(IInstallableUnit.PROP_PROVIDER, feature.getProviderName()); - if (feature.getLicense() != null) - iu.setLicenses(new ILicense[] {MetadataFactory.createLicense(toURIOrNull(feature.getLicenseURL()), feature.getLicense())}); - if (feature.getCopyright() != null) - iu.setCopyright(MetadataFactory.createCopyright(toURIOrNull(feature.getCopyrightURL()), feature.getCopyright())); - iu.setUpdateDescriptor(MetadataFactory.createUpdateDescriptor(id, BundlesAction.computeUpdateRange(new org.osgi.framework.Version(feature.getVersion())), IUpdateDescriptor.NORMAL, null)); - - FeatureEntry entries[] = feature.getEntries(); - List<IRequirement> required = new ArrayList<IRequirement>(entries.length + (childIUs == null ? 0 : childIUs.size())); - for (int i = 0; i < entries.length; i++) { - VersionRange range = getVersionRange(entries[i]); - String requiredId = getTransformedId(entries[i].getId(), entries[i].isPlugin(), /*isGroup*/true); - required.add(MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, requiredId, range, getFilter(entries[i]), entries[i].isOptional(), false)); - } - - // link in all the children (if any) as requirements. - // TODO consider if these should be linked as exact version numbers. Should be ok but may be brittle. - if (childIUs != null) { - for (int i = 0; i < childIUs.size(); i++) { - IInstallableUnit child = childIUs.get(i); - IMatchExpression<IInstallableUnit> filter = child.getFilter(); - required.add(MetadataFactory.createRequirement(PublisherHelper.IU_NAMESPACE, child.getId(), new VersionRange(child.getVersion(), true, child.getVersion(), true), filter, false, false)); - } - } - iu.setRequirements(required.toArray(new IRequirement[required.size()])); - iu.setTouchpointType(ITouchpointType.NONE); - iu.setProperty(InstallableUnitDescription.PROP_TYPE_GROUP, Boolean.TRUE.toString()); - processTouchpointAdvice(iu, null, publisherInfo); - processInstallableUnitPropertiesAdvice(iu, publisherInfo); - - //Create a fake entry to reuse the logic to create the filters - FeatureEntry entry = new FeatureEntry("fake", "0.0.0", false); //$NON-NLS-1$ //$NON-NLS-2$ - entry.setEnvironment(feature.getOS(), feature.getWS(), feature.getArch(), feature.getNL()); - iu.setFilter(getFilter(entry)); - - // Create set of provided capabilities - ArrayList<IProvidedCapability> providedCapabilities = new ArrayList<IProvidedCapability>(); - providedCapabilities.add(createSelfCapability(id, version)); - - Map<Locale, Map<String, String>> localizations = feature.getLocalizations(); - if (localizations != null) { - for (Entry<Locale, Map<String, String>> locEntry : localizations.entrySet()) { - Locale locale = locEntry.getKey(); - Map<String, String> translatedStrings = locEntry.getValue(); - for (Entry<String, String> e : translatedStrings.entrySet()) { - iu.setProperty(locale.toString() + '.' + e.getKey(), e.getValue()); - } - providedCapabilities.add(PublisherHelper.makeTranslationCapability(id, locale)); - } - } - - iu.setCapabilities(providedCapabilities.toArray(new IProvidedCapability[providedCapabilities.size()])); - processUpdateDescriptorAdvice(iu, info); - processCapabilityAdvice(iu, publisherInfo); - return MetadataFactory.createInstallableUnit(iu); - } - - protected String getGroupId(String featureId) { - return getTransformedId(featureId, /*isPlugin*/false, /*isGroup*/true); - } - - private IInstallableUnit createPatchIU(Feature feature, List<IInstallableUnit> childIUs, IPublisherInfo publisherInfo) { - InstallableUnitPatchDescription iu = new MetadataFactory.InstallableUnitPatchDescription(); - String id = getTransformedId(feature.getId(), /*isPlugin*/false, /*isGroup*/true); - iu.setId(id); - Version version = Version.parseVersion(feature.getVersion()); - iu.setVersion(version); - iu.setProperty(IInstallableUnit.PROP_NAME, feature.getLabel()); - if (feature.getDescription() != null) - iu.setProperty(IInstallableUnit.PROP_DESCRIPTION, feature.getDescription()); - if (feature.getDescriptionURL() != null) - iu.setProperty(IInstallableUnit.PROP_DESCRIPTION_URL, feature.getDescriptionURL()); - if (feature.getProviderName() != null) - iu.setProperty(IInstallableUnit.PROP_PROVIDER, feature.getProviderName()); - if (feature.getLicense() != null) - iu.setLicenses(new ILicense[] {MetadataFactory.createLicense(toURIOrNull(feature.getLicenseURL()), feature.getLicense())}); - if (feature.getCopyright() != null) - iu.setCopyright(MetadataFactory.createCopyright(toURIOrNull(feature.getCopyrightURL()), feature.getCopyright())); - iu.setUpdateDescriptor(MetadataFactory.createUpdateDescriptor(id, BundlesAction.computeUpdateRange(new org.osgi.framework.Version(feature.getVersion())), IUpdateDescriptor.NORMAL, null)); - - FeatureEntry entries[] = feature.getEntries(); - ArrayList<IRequirement> applicabilityScope = new ArrayList<IRequirement>(); - ArrayList<IRequirement> patchRequirements = new ArrayList<IRequirement>(); - ArrayList<IRequirementChange> requirementChanges = new ArrayList<IRequirementChange>(); - for (int i = 0; i < entries.length; i++) { - VersionRange range = getVersionRange(entries[i]); - IRequirement req = MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, getTransformedId(entries[i].getId(), entries[i].isPlugin(), /*isGroup*/true), range, getFilter(entries[i]), entries[i].isOptional(), false); - if (entries[i].isRequires()) { - applicabilityScope.add(req); - if (applicabilityScope.size() == 1) { - iu.setLifeCycle(MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, getTransformedId(entries[i].getId(), entries[i].isPlugin(), /*isGroup*/true), range, null, false, false, false)); - } - continue; - } - if (entries[i].isPlugin()) { - IRequirement from = MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, getTransformedId(entries[i].getId(), entries[i].isPlugin(), /*isGroup*/true), VersionRange.emptyRange, getFilter(entries[i]), entries[i].isOptional(), false); - requirementChanges.add(MetadataFactory.createRequirementChange(from, req)); - continue; - } - patchRequirements.add(req); - } - - //Always add a requirement on the IU containing the feature jar - if (childIUs != null) { - for (int i = 0; i < childIUs.size(); i++) { - IInstallableUnit child = childIUs.get(i); - patchRequirements.add(MetadataFactory.createRequirement(PublisherHelper.IU_NAMESPACE, child.getId(), new VersionRange(child.getVersion(), true, child.getVersion(), true), child.getFilter(), false, false)); - } - } - iu.setRequirements(patchRequirements.toArray(new IRequirement[patchRequirements.size()])); - iu.setApplicabilityScope(new IRequirement[][] {applicabilityScope.toArray(new IRequirement[applicabilityScope.size()])}); - iu.setRequirementChanges(requirementChanges.toArray(new IRequirementChange[requirementChanges.size()])); - - iu.setTouchpointType(ITouchpointType.NONE); - processTouchpointAdvice(iu, null, publisherInfo); - processInstallableUnitPropertiesAdvice(iu, publisherInfo); - iu.setProperty(InstallableUnitDescription.PROP_TYPE_GROUP, Boolean.TRUE.toString()); - iu.setProperty(InstallableUnitDescription.PROP_TYPE_PATCH, Boolean.TRUE.toString()); - // TODO: shouldn't the filter for the group be constructed from os, ws, arch, nl - // of the feature? - // iu.setFilter(filter); - - // Create set of provided capabilities - ArrayList<IProvidedCapability> providedCapabilities = new ArrayList<IProvidedCapability>(); - providedCapabilities.add(createSelfCapability(id, version)); - - Map<Locale, Map<String, String>> localizations = feature.getLocalizations(); - if (localizations != null) { - for (Entry<Locale, Map<String, String>> locEntry : localizations.entrySet()) { - Locale locale = locEntry.getKey(); - Map<String, String> translatedStrings = locEntry.getValue(); - for (Entry<String, String> e : translatedStrings.entrySet()) { - iu.setProperty(locale.toString() + '.' + e.getKey(), e.getValue()); - } - providedCapabilities.add(PublisherHelper.makeTranslationCapability(id, locale)); - } - } - - iu.setCapabilities(providedCapabilities.toArray(new IProvidedCapability[providedCapabilities.size()])); - processUpdateDescriptorAdvice(iu, info); - processCapabilityAdvice(iu, publisherInfo); - return MetadataFactory.createInstallableUnitPatch(iu); - } - - private File[] expandLocations(File[] list) { - ArrayList<File> result = new ArrayList<File>(); - expandLocations(list, result); - return result.toArray(new File[result.size()]); - } - - private void expandLocations(File[] list, ArrayList<File> result) { - if (list == null) - return; - for (int i = 0; i < list.length; i++) { - File location = list[i]; - if (location.isDirectory()) { - // if the location is itself a feature, just add it. Otherwise r down - if (new File(location, "feature.xml").exists()) //$NON-NLS-1$ - result.add(location); - else - expandLocations(location.listFiles(), result); - } else { - result.add(location); - } - } - } - - protected void generateFeatureIUs(Feature[] featureList, IPublisherResult result) { - // Build Feature IUs, and add them to any corresponding categories - for (int i = 0; i < featureList.length; i++) { - Feature feature = featureList[i]; - //first gather any advice that might help us - createBundleShapeAdvice(feature, info); - createAdviceFileAdvice(feature, info); - - ArrayList<IInstallableUnit> childIUs = new ArrayList<IInstallableUnit>(); - - IInstallableUnit featureJarIU = queryForIU(result, getTransformedId(feature.getId(), false, false), Version.parseVersion(feature.getVersion())); - if (featureJarIU == null) - featureJarIU = generateFeatureJarIU(feature, info); - - if (featureJarIU != null) { - publishFeatureArtifacts(feature, featureJarIU, info); - result.addIU(featureJarIU, IPublisherResult.NON_ROOT); - childIUs.add(featureJarIU); - } - - IInstallableUnit groupIU = queryForIU(result, getGroupId(feature.getId()), Version.parseVersion(feature.getVersion())); - if (groupIU == null) { - childIUs.addAll(generateRootFileIUs(feature, result, info)); - groupIU = createGroupIU(feature, childIUs, info); - } - if (groupIU != null) { - result.addIU(groupIU, IPublisherResult.ROOT); - InstallableUnitDescription[] others = processAdditionalInstallableUnitsAdvice(groupIU, info); - for (int iuIndex = 0; others != null && iuIndex < others.length; iuIndex++) { - result.addIU(MetadataFactory.createInstallableUnit(others[iuIndex]), IPublisherResult.ROOT); - } - } - generateSiteReferences(feature, result, info); - } - } - - protected IInstallableUnit generateFeatureJarIU(Feature feature, IPublisherInfo publisherInfo) { - return createFeatureJarIU(feature, publisherInfo); - } - - protected ArrayList<IInstallableUnit> generateRootFileIUs(Feature feature, IPublisherResult result, IPublisherInfo publisherInfo) { - ArrayList<IInstallableUnit> ius = new ArrayList<IInstallableUnit>(); - - Collection<IFeatureRootAdvice> collection = publisherInfo.getAdvice(null, false, feature.getId(), Version.parseVersion(feature.getVersion()), IFeatureRootAdvice.class); - if (collection.size() == 0) - return ius; - - IFeatureRootAdvice advice = collection.iterator().next(); - String[] configs = advice.getConfigurations(); - for (int i = 0; i < configs.length; i++) { - String config = configs[i]; - - FileSetDescriptor descriptor = advice.getDescriptor(config); - if (descriptor != null && descriptor.size() > 0) { - IInstallableUnit iu = createFeatureRootFileIU(feature.getId(), feature.getVersion(), null, descriptor); - - File[] files = descriptor.getFiles(); - IArtifactKey artifactKey = iu.getArtifacts().iterator().next(); - ArtifactDescriptor artifactDescriptor = new ArtifactDescriptor(artifactKey); - IPathComputer computer = advice.getRootFileComputer(config); - if (computer == null) - computer = FileUtils.createDynamicPathComputer(1); - publishArtifact(artifactDescriptor, files, null, publisherInfo, computer); - - result.addIU(iu, IPublisherResult.NON_ROOT); - ius.add(iu); - } - } - - return ius; - } - - /** - * Generates and publishes a reference to an update site location - * @param location The update site location - * @param nickname The update site label - * @param featureId the identifier of the feature where the error occurred, or null - * @param collector The list into which the references are added - */ - private void generateSiteReference(String location, String nickname, String featureId, List<IRepositoryReference> collector) { - if (location == null) { - String message = featureId == null ? NLS.bind(Messages.exception_invalidSiteReference, location) : NLS.bind(Messages.exception_invalidSiteReferenceInFeature, location, featureId); - LogHelper.log(new Status(IStatus.ERROR, Activator.ID, message)); - return; - } - - try { - URI associateLocation = new URI(location); - collector.add(new RepositoryReference(associateLocation, nickname, IRepository.TYPE_METADATA, IRepository.NONE)); - collector.add(new RepositoryReference(associateLocation, nickname, IRepository.TYPE_ARTIFACT, IRepository.NONE)); - } catch (URISyntaxException e) { - String message = featureId == null ? NLS.bind(Messages.exception_invalidSiteReference, location) : NLS.bind(Messages.exception_invalidSiteReferenceInFeature, location, featureId); - LogHelper.log(new Status(IStatus.ERROR, Activator.ID, message)); - } - } - - protected void generateSiteReferences(Feature feature, IPublisherResult result, IPublisherInfo publisherInfo) { - if (publisherInfo.getMetadataRepository() == null) - return; - - //publish feature site references - URLEntry updateURL = feature.getUpdateSite(); - //don't enable feature update sites by default since this results in too many - //extra sites being loaded and searched (Bug 234177) - List<IRepositoryReference> collector = new ArrayList<IRepositoryReference>(); - if (updateURL != null) - generateSiteReference(updateURL.getURL(), updateURL.getAnnotation(), feature.getId(), collector); - URLEntry[] discoverySites = feature.getDiscoverySites(); - for (int i = 0; i < discoverySites.length; i++) - generateSiteReference(discoverySites[i].getURL(), discoverySites[i].getAnnotation(), feature.getId(), collector); - if (!collector.isEmpty()) - publisherInfo.getMetadataRepository().addReferences(collector); - } - - protected Feature[] getFeatures(File[] featureLocations) { - ArrayList<Feature> result = new ArrayList<Feature>(featureLocations.length); - for (int i = 0; i < featureLocations.length; i++) { - Feature feature = new FeatureParser().parse(featureLocations[i]); - if (feature != null) { - feature.setLocation(featureLocations[i].getAbsolutePath()); - result.add(feature); - } - } - return result.toArray(new Feature[result.size()]); - } - - private IMatchExpression<IInstallableUnit> getFilter(FeatureEntry entry) { - StringBuffer result = new StringBuffer(); - result.append("(&"); //$NON-NLS-1$ - if (entry.getFilter() != null) - result.append(entry.getFilter()); - expandFilter(entry.getOS(), "osgi.os", result); //$NON-NLS-1$ - expandFilter(entry.getWS(), "osgi.ws", result); //$NON-NLS-1$ - expandFilter(entry.getArch(), "osgi.arch", result);//$NON-NLS-1$ - expandFilter(entry.getNL(), "osgi.nl", result); //$NON-NLS-1$ - if (result.length() == 2) - return null; - result.append(')'); - return InstallableUnit.parseFilter(result.toString()); - } - - private void expandFilter(String filter, String osgiFilterValue, StringBuffer result) { - if (filter != null && filter.length() != 0) { - StringTokenizer token = new StringTokenizer(filter, ","); //$NON-NLS-1$ - if (token.countTokens() == 1) - result.append('(' + osgiFilterValue + '=' + filter + ')'); - else { - result.append("(|"); //$NON-NLS-1$ - while (token.hasMoreElements()) { - result.append('(' + osgiFilterValue + '=' + token.nextToken() + ')'); - } - result.append(')'); - } - } - } - - protected VersionRange getVersionRange(FeatureEntry entry) { - String versionSpec = entry.getVersion(); - if (versionSpec == null) - return VersionRange.emptyRange; - Version version = Version.parseVersion(versionSpec); - if (version.equals(Version.emptyVersion)) - return VersionRange.emptyRange; - if (!entry.isRequires()) - return new VersionRange(version, true, version, true); - String match = entry.getMatch(); - if (match == null) - // TODO should really be returning VersionRange.emptyRange here... - return null; - if (match.equals("perfect")) //$NON-NLS-1$ - return new VersionRange(version, true, version, true); - - org.osgi.framework.Version osgiVersion = PublisherHelper.toOSGiVersion(version); - if (match.equals("equivalent")) { //$NON-NLS-1$ - Version upper = Version.createOSGi(osgiVersion.getMajor(), osgiVersion.getMinor() + 1, 0); - return new VersionRange(version, true, upper, false); - } - if (match.equals("compatible")) { //$NON-NLS-1$ - Version upper = Version.createOSGi(osgiVersion.getMajor() + 1, 0, 0); - return new VersionRange(version, true, upper, false); - } - if (match.equals("greaterOrEqual")) //$NON-NLS-1$ - return new VersionRange(version, true, new VersionRange(null).getMaximum(), true); - return null; - } - - private boolean isPatch(Feature feature) { - FeatureEntry[] entries = feature.getEntries(); - for (int i = 0; i < entries.length; i++) { - if (entries[i].isPatch()) - return true; - } - return false; - } - - public IStatus perform(IPublisherInfo publisherInfo, IPublisherResult results, IProgressMonitor monitor) { - if (features == null && locations == null) - throw new IllegalStateException(Messages.exception_noFeaturesOrLocations); - this.info = publisherInfo; - if (features == null) - features = getFeatures(expandLocations(locations)); - generateFeatureIUs(features, results); - return Status.OK_STATUS; - } - - protected void publishFeatureArtifacts(Feature feature, IInstallableUnit featureIU, IPublisherInfo publisherInfo) { - // add all the artifacts associated with the feature - // TODO this is a little strange. If there are several artifacts, how do we know which files go with - // which artifacts when we publish them? For now it would be surprising to have more than one - // artifact per feature IU. - Collection<IArtifactKey> artifacts = featureIU.getArtifacts(); - for (IArtifactKey artifactKey : artifacts) { - File file = new File(feature.getLocation()); - ArtifactDescriptor ad = (ArtifactDescriptor) PublisherHelper.createArtifactDescriptor(info, artifactKey, file); - processArtifactPropertiesAdvice(featureIU, ad, publisherInfo); - ad.setProperty(IArtifactDescriptor.DOWNLOAD_CONTENTTYPE, IArtifactDescriptor.TYPE_ZIP); - // if the artifact is a dir then zip it up. - if (file.isDirectory()) - publishArtifact(ad, new File[] {file}, null, publisherInfo, createRootPrefixComputer(file)); - else - publishArtifact(ad, file, publisherInfo); - } - } - - private void setupLinks(InstallableUnitDescription iu, FileSetDescriptor descriptor) { - String[] links = getArrayFromString(descriptor.getLinks(), ","); //$NON-NLS-1$ - StringBuffer linkActions = new StringBuffer(); - - int i = 0; - while (i < links.length) { - //format is [target,name]* - String target = links[i++]; - if (i < links.length) { - String name = links[i++]; - linkActions.append("ln(linkTarget:" + target); //$NON-NLS-1$ - linkActions.append(",targetDir:${installFolder},linkName:" + name); //$NON-NLS-1$ - linkActions.append(");"); //$NON-NLS-1$ - } - - } - - if (linkActions.length() > 0) { - Map<String, String> touchpointData = new HashMap<String, String>(); - //we do ln during configure to avoid complicating branding which uses the install phase - touchpointData.put("configure", linkActions.toString()); //$NON-NLS-1$ - iu.addTouchpointData(MetadataFactory.createTouchpointData(touchpointData)); - } - } - - private void setupPermissions(InstallableUnitDescription iu, FileSetDescriptor descriptor) { - Map<String, String> touchpointData = new HashMap<String, String>(); - String[][] permsList = descriptor.getPermissions(); - for (int i = 0; i < permsList.length; i++) { - String[] permSpec = permsList[i]; - String configurationData = " chmod(targetDir:${installFolder}, targetFile:" + permSpec[1] + ", permissions:" + permSpec[0] + ");"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - touchpointData.put("install", configurationData); //$NON-NLS-1$ - iu.addTouchpointData(MetadataFactory.createTouchpointData(touchpointData)); - } - } -} diff --git a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/FeaturesAndBundlesPublisherApplication.java b/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/FeaturesAndBundlesPublisherApplication.java deleted file mode 100644 index 516cb99b8..000000000 --- a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/FeaturesAndBundlesPublisherApplication.java +++ /dev/null @@ -1,82 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008 Code 9 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: - * Code 9 - initial API and implementation - ******************************************************************************/ -package org.eclipse.equinox.p2.publisher.eclipse; - -import java.io.File; -import java.net.URISyntaxException; -import java.util.ArrayList; -import org.eclipse.equinox.p2.metadata.Version; -import org.eclipse.equinox.p2.publisher.*; -import org.eclipse.equinox.p2.publisher.actions.RootIUAction; -import org.eclipse.equinox.p2.publisher.actions.RootIUResultFilterAdvice; - -/** - * <p> - * This application generates meta-data and artifact repositories from a set of features and bundles. - * If -source <localdir> parameter is given, it specifies the directory under which to find the features - * and bundles (in the standard "features" and "plugins" sub-directories). - * </p><p> - * Optionally, the -features <csv of file locations> and -bundles <csv of file locations> arguments can - * be specified. If given, these override the defaults derived from a supplied -source parameter. - * </p> - */ -public class FeaturesAndBundlesPublisherApplication extends AbstractPublisherApplication { - - protected File[] features = null; - protected File[] bundles = null; - - protected String rootIU = null; - protected String rootVersion = null; - - public FeaturesAndBundlesPublisherApplication() { - // nothing to do - } - - protected void processParameter(String arg, String parameter, PublisherInfo pinfo) throws URISyntaxException { - super.processParameter(arg, parameter, pinfo); - - if (arg.equalsIgnoreCase("-features")) //$NON-NLS-1$ - features = createFiles(parameter); - - if (arg.equalsIgnoreCase("-bundles")) //$NON-NLS-1$ - bundles = createFiles(parameter); - - if (arg.equalsIgnoreCase("-iu")) //$NON-NLS-1$ - rootIU = parameter; - - if (arg.equalsIgnoreCase("-version")) //$NON-NLS-1$ - rootVersion = parameter; - } - - private File[] createFiles(String parameter) { - String[] filespecs = AbstractPublisherAction.getArrayFromString(parameter, ","); //$NON-NLS-1$ - File[] result = new File[filespecs.length]; - for (int i = 0; i < filespecs.length; i++) - result[i] = new File(filespecs[i]); - return result; - } - - protected IPublisherAction[] createActions() { - ArrayList<IPublisherAction> result = new ArrayList<IPublisherAction>(); - if (features == null) - features = new File[] {new File(source, "features")}; //$NON-NLS-1$ - result.add(new FeaturesAction(features)); - if (bundles == null) - bundles = new File[] {new File(source, "plugins")}; //$NON-NLS-1$ - result.add(new BundlesAction(bundles)); - - if (rootIU != null) { - result.add(new RootIUAction(rootIU, Version.parseVersion(rootVersion), rootIU)); - info.addAdvice(new RootIUResultFilterAdvice(null)); - } - - return result.toArray(new IPublisherAction[result.size()]); - } -} diff --git a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/IBrandingAdvice.java b/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/IBrandingAdvice.java deleted file mode 100644 index 6f4952079..000000000 --- a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/IBrandingAdvice.java +++ /dev/null @@ -1,40 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2009 EclipseSource 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: - * EclipseSource - initial API and implementation - ******************************************************************************/ -package org.eclipse.equinox.p2.publisher.eclipse; - -import org.eclipse.equinox.p2.publisher.IPublisherAdvice; - -/** - * Advice for branding executables and other element while publishing. - */ -public interface IBrandingAdvice extends IPublisherAdvice { - - /** - * Returns the OS that this branding advice is relevant for. - */ - public String getOS(); - - /** - * Returns the list of icon files to be used in branding an executable. - * The nature of the returned values and the images they represent is - * platform-specific. - * - * @return the list of icons used in branding an executable or <code>null</code> if none. - */ - public String[] getIcons(); - - /** - * Returns the name of the launcher. This should be the OS-independent - * name. That is, ".exe" etc. should not be included. - * - * @return the name of the branded launcher or <code>null</code> if none. - */ - public String getExecutableName(); -} diff --git a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/IBundleShapeAdvice.java b/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/IBundleShapeAdvice.java deleted file mode 100644 index 8ad1badd5..000000000 --- a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/IBundleShapeAdvice.java +++ /dev/null @@ -1,19 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008 Code 9 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: - * Code 9 - initial API and implementation - ******************************************************************************/ -package org.eclipse.equinox.p2.publisher.eclipse; - -import org.eclipse.equinox.p2.publisher.IPublisherAdvice; - -public interface IBundleShapeAdvice extends IPublisherAdvice { - public static final String DIR = BundlesAction.DIR; - public static final String JAR = BundlesAction.JAR; - - public String getShape(); -} diff --git a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/IConfigAdvice.java b/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/IConfigAdvice.java deleted file mode 100644 index 6c8eefd6a..000000000 --- a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/IConfigAdvice.java +++ /dev/null @@ -1,21 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008 Code 9 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: - * Code 9 - initial API and implementation - ******************************************************************************/ -package org.eclipse.equinox.p2.publisher.eclipse; - -import java.util.Map; -import org.eclipse.equinox.frameworkadmin.BundleInfo; -import org.eclipse.equinox.p2.publisher.IPublisherAdvice; - -public interface IConfigAdvice extends IPublisherAdvice { - - public BundleInfo[] getBundles(); - - public Map<String, String> getProperties(); -} diff --git a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/IExecutableAdvice.java b/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/IExecutableAdvice.java deleted file mode 100644 index 7d46675f3..000000000 --- a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/IExecutableAdvice.java +++ /dev/null @@ -1,40 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 2009 Code 9 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: - * Code 9 - initial API and implementation - * EclipseSource - ongoing development - ******************************************************************************/ -package org.eclipse.equinox.p2.publisher.eclipse; - -import org.eclipse.equinox.p2.publisher.IPublisherAdvice; - -/** - * Advice for executables while publishing. - */ -public interface IExecutableAdvice extends IPublisherAdvice { - - /** - * Returns the VM arguments for this executable. - * @return The list of VM Arguments for this executable or empty array for none - */ - public String[] getVMArguments(); - - /** - * Returns the program arguments for this executable. - * - * @return The list of program arguments for tihs executable or empty array for none - */ - public String[] getProgramArguments(); - - /** - * Returns the name of the launcher. This should be the OS-independent - * name. That is, ".exe" etc. should not be included. - * - * @return the name of the branded launcher or <code>null</code> if none. - */ - public String getExecutableName(); -} diff --git a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/InstallPublisherApplication.java b/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/InstallPublisherApplication.java deleted file mode 100644 index ae180c257..000000000 --- a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/InstallPublisherApplication.java +++ /dev/null @@ -1,101 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 2009 Code 9 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: - * Code 9 - initial API and implementation - * IBM - ongoing development - ******************************************************************************/ -package org.eclipse.equinox.p2.publisher.eclipse; - -import java.net.URISyntaxException; -import java.util.ArrayList; -import org.eclipse.equinox.p2.core.ProvisionException; -import org.eclipse.equinox.p2.metadata.*; -import org.eclipse.equinox.p2.publisher.*; - -public class InstallPublisherApplication extends AbstractPublisherApplication { - - protected String id; - protected Version version = Version.parseVersion("1.0.0"); //$NON-NLS-1$ - protected String name; - protected String executableName; - protected String flavor; - protected IVersionedId[] topLevel; - protected boolean start; - protected String[] rootExclusions; - - public InstallPublisherApplication() { - //hidden - } - - protected void processFlag(String arg, PublisherInfo publisherInfo) { - super.processFlag(arg, publisherInfo); - - if (arg.equalsIgnoreCase("-startAll")) //$NON-NLS-1$ - start = true; - } - - protected void initialize(PublisherInfo publisherInfo) throws ProvisionException { - super.initialize(publisherInfo); - - if (publisherInfo.getConfigurations().length == 0) - publisherInfo.setConfigurations(new String[] {""}); //$NON-NLS-1$ - } - - protected void processParameter(String arg, String parameter, PublisherInfo publisherInfo) throws URISyntaxException { - super.processParameter(arg, parameter, publisherInfo); - - if (arg.equalsIgnoreCase("-id")) //$NON-NLS-1$ - id = parameter; - - if (arg.equalsIgnoreCase("-version")) //$NON-NLS-1$ - version = Version.parseVersion(parameter); - - if (arg.equalsIgnoreCase("-name")) //$NON-NLS-1$ - name = parameter; - - if (arg.equalsIgnoreCase("-executable")) //$NON-NLS-1$ - executableName = parameter; - - if (arg.equalsIgnoreCase("-flavor")) //$NON-NLS-1$ - flavor = parameter; - - if (arg.equalsIgnoreCase("-top")) //$NON-NLS-1$ - topLevel = createVersionedIdList(parameter); - - if (arg.equalsIgnoreCase("-rootExclusions")) //$NON-NLS-1$ - rootExclusions = AbstractPublisherAction.getArrayFromString(parameter, ","); //$NON-NLS-1$ - } - - private IVersionedId[] createVersionedIdList(String parameter) { - String[] list = AbstractPublisherAction.getArrayFromString(parameter, ","); //$NON-NLS-1$ - IVersionedId[] result = new IVersionedId[list.length]; - for (int i = 0; i < result.length; i++) - result[i] = VersionedId.parse(list[i]); - return result; - } - - protected IPublisherAction[] createActions() { - ArrayList<IPublisherAction> result = new ArrayList<IPublisherAction>(); - result.add(createEclipseInstallAction()); - return result.toArray(new IPublisherAction[result.size()]); - } - - private IPublisherAction createEclipseInstallAction() { - String[] exclusions = getBaseExclusions(); - if (rootExclusions != null) { - String[] result = new String[exclusions.length + rootExclusions.length]; - System.arraycopy(exclusions, 0, result, 0, exclusions.length); - System.arraycopy(rootExclusions, 0, result, exclusions.length, rootExclusions.length); - exclusions = result; - } - return new EclipseInstallAction(source, id, version, name, executableName, flavor, topLevel, exclusions, start); - } - - protected String[] getBaseExclusions() { - return new String[] {"plugins", "features", "configuration", "p2", "artifacts.xml"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ - } -} diff --git a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/LaunchingAdvice.java b/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/LaunchingAdvice.java deleted file mode 100644 index 72647823e..000000000 --- a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/LaunchingAdvice.java +++ /dev/null @@ -1,43 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 2009 Code 9 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: - * Code 9 - initial API and implementation - * IBM - ongoing development - ******************************************************************************/ -package org.eclipse.equinox.p2.publisher.eclipse; - - -import org.eclipse.equinox.internal.provisional.frameworkadmin.LauncherData; -import org.eclipse.equinox.p2.publisher.AbstractAdvice; - -public class LaunchingAdvice extends AbstractAdvice implements IExecutableAdvice { - - private LauncherData data; - private String configSpec; - - public LaunchingAdvice(LauncherData data, String configSpec) { - this.data = data; - this.configSpec = configSpec; - } - - protected String getConfigSpec() { - return configSpec; - } - - public String[] getProgramArguments() { - return data.getProgramArgs(); - } - - public String[] getVMArguments() { - return data.getJvmArgs(); - } - - public String getExecutableName() { - return data.getLauncherName(); - } - -} diff --git a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/ProductAction.java b/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/ProductAction.java deleted file mode 100644 index a5ad2675c..000000000 --- a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/ProductAction.java +++ /dev/null @@ -1,187 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 2009 Code 9 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: - * Code 9 - initial API and implementation - * IBM - ongoing development - ******************************************************************************/ -package org.eclipse.equinox.p2.publisher.eclipse; - -import java.io.File; -import java.util.*; -import org.eclipse.core.runtime.*; -import org.eclipse.equinox.p2.metadata.VersionedId; -import org.eclipse.equinox.internal.p2.publisher.eclipse.IProductDescriptor; -import org.eclipse.equinox.p2.metadata.*; -import org.eclipse.equinox.p2.publisher.*; -import org.eclipse.equinox.p2.publisher.actions.*; - -public class ProductAction extends AbstractPublisherAction { - protected String source; - protected String id; - protected Version version; - protected String name; - protected String executableName; - protected String flavor; - protected boolean start = false; - //protected String productLocation; - protected File executablesFeatureLocation; - protected IProductDescriptor product; - protected IPublisherResult publisherResults; - - public ProductAction(String source, IProductDescriptor product, String flavor, File executablesFeatureLocation) { - super(); - this.source = source; - this.flavor = flavor; - this.executablesFeatureLocation = executablesFeatureLocation; - this.product = product; - //this.productLocation = productLocation; - } - - protected IPublisherAction[] createActions(IPublisherResult results) { - // generate the advice we can up front. - createAdvice(); - - // create all the actions needed to publish a product - ArrayList<IPublisherAction> actions = new ArrayList<IPublisherAction>(); - // products include the executable so add actions to publish them - if (getExecutablesLocation() != null && this.product.includeLaunchers()) - actions.add(createApplicationExecutableAction(info.getConfigurations())); - // add the actions that just configure things. - actions.add(createConfigCUsAction()); - actions.add(createJREAction()); - actions.add(createDefaultCUsAction()); - actions.add(createRootIUAction()); - return actions.toArray(new IPublisherAction[actions.size()]); - } - - protected IPublisherAction createApplicationExecutableAction(String[] configSpecs) { - return new ApplicationLauncherAction(id, version, flavor, executableName, getExecutablesLocation(), configSpecs); - } - - protected IPublisherAction createDefaultCUsAction() { - return new DefaultCUsAction(info, flavor, 4, false); - } - - protected IPublisherAction createRootIUAction() { - return new RootIUAction(id, version, name); - } - - protected IPublisherAction createConfigCUsAction() { - return new ConfigCUsAction(info, flavor, id, version); - } - - protected IPublisherAction createJREAction() { - //TODO set a proper execution environment - return new JREAction((String) null); - } - - public IStatus perform(IPublisherInfo publisherInfo, IPublisherResult results, IProgressMonitor monitor) { - monitor = SubMonitor.convert(monitor); - this.info = publisherInfo; - publisherResults = results; - IPublisherAction[] actions = createActions(results); - MultiStatus finalStatus = new MultiStatus(EclipseInstallAction.class.getName(), 0, "publishing result", null); //$NON-NLS-1$ - for (int i = 0; i < actions.length; i++) { - if (monitor.isCanceled()) - return Status.CANCEL_STATUS; - finalStatus.merge(actions[i].perform(publisherInfo, results, monitor)); - } - if (!finalStatus.isOK()) - return finalStatus; - - return Status.OK_STATUS; - } - - private void createAdvice() { - executableName = product.getLauncherName(); - createProductAdvice(); - createAdviceFileAdvice(); - createRootAdvice(); - info.addAdvice(new RootIUResultFilterAdvice(null)); - } - - /** - * Create advice for a p2.inf file co-located with the product file, if any. - */ - private void createAdviceFileAdvice() { - File productFileLocation = product.getLocation(); - if (productFileLocation == null) - return; - - AdviceFileAdvice advice = new AdviceFileAdvice(product.getId(), Version.parseVersion(product.getVersion()), new Path(productFileLocation.getParent()), new Path("p2.inf")); //$NON-NLS-1$ - if (advice.containsAdvice()) - info.addAdvice(advice); - } - - private void createRootAdvice() { - Collection<IVersionedId> list; - if (product.useFeatures()) - // TODO: We need a real namespace here - list = versionElements(listElements(product.getFeatures(), ".feature.group"), IInstallableUnit.NAMESPACE_IU_ID); //$NON-NLS-1$ - else - //TODO: We need a real namespace here - list = versionElements(listElements(product.getBundles(true), null), IInstallableUnit.NAMESPACE_IU_ID); - info.addAdvice(new RootIUAdvice(list)); - } - - private void createProductAdvice() { - id = product.getId(); - version = Version.parseVersion(product.getVersion()); - name = product.getProductName(); - if (name == null || name.length() == 0) // If the name is not defined, use the ID - name = product.getId(); - - String[] configSpecs = info.getConfigurations(); - for (int i = 0; i < configSpecs.length; i++) - info.addAdvice(new ProductFileAdvice(product, configSpecs[i])); - } - - private Collection<IVersionedId> versionElements(Collection<IVersionedId> elements, String namespace) { - Collection<IVersionAdvice> versionAdvice = info.getAdvice(null, true, null, null, IVersionAdvice.class); - List<IVersionedId> result = new ArrayList<IVersionedId>(); - for (IVersionedId element : elements) { - Version elementVersion = element.getVersion(); - if (elementVersion == null || Version.emptyVersion.equals(elementVersion)) { - Iterator<IVersionAdvice> advice = versionAdvice.iterator(); - while (advice.hasNext()) { - elementVersion = advice.next().getVersion(namespace, element.getId()); - break; - } - } - - // if advisedVersion is null, we get the highest version - IInstallableUnit unit = queryForIU(publisherResults, element.getId(), elementVersion); - if (unit != null) { - result.add(unit); - } else if (elementVersion != null) { - //best effort - result.add(new VersionedId(element.getId(), elementVersion)); - } - //TODO we could still add a requirement on version 0.0.0 to get any version, but if the - //bundle is platform specific we will have broken metadata due to a missing filter - } - return result; - } - - private Collection<IVersionedId> listElements(List<IVersionedId> elements, String suffix) { - if (suffix == null || suffix.length() == 0) - return elements; - ArrayList<IVersionedId> result = new ArrayList<IVersionedId>(elements.size()); - for (IVersionedId elementName : elements) { - result.add(new VersionedId(elementName.getId() + suffix, elementName.getVersion())); - } - return result; - } - - protected File getExecutablesLocation() { - if (executablesFeatureLocation != null) - return executablesFeatureLocation; - if (source != null) - return new File(source); - return null; - } -} diff --git a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/ProductFileAdvice.java b/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/ProductFileAdvice.java deleted file mode 100644 index e054e7fc5..000000000 --- a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/ProductFileAdvice.java +++ /dev/null @@ -1,315 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 2009 Code 9 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: - * Code 9 - initial API and implementation - * EclipseSource - ongoing development - * IBM Corporation - ongoing development - ******************************************************************************/ -package org.eclipse.equinox.p2.publisher.eclipse; - -import java.io.File; -import java.util.*; -import org.eclipse.equinox.frameworkadmin.BundleInfo; -import org.eclipse.equinox.internal.p2.core.helpers.CollectionUtils; -import org.eclipse.equinox.internal.p2.publisher.eclipse.DataLoader; -import org.eclipse.equinox.internal.p2.publisher.eclipse.IProductDescriptor; -import org.eclipse.equinox.internal.provisional.frameworkadmin.ConfigData; -import org.eclipse.equinox.p2.metadata.IVersionedId; -import org.eclipse.equinox.p2.metadata.Version; -import org.eclipse.equinox.p2.publisher.AbstractAdvice; -import org.eclipse.equinox.p2.publisher.AbstractPublisherAction; -import org.eclipse.equinox.p2.publisher.actions.ILicenseAdvice; - -/** - * Provide advice derived from the .product file. The product can give some info on - * launching as well as the configuration (bundles, properties, ...) - */ -public class ProductFileAdvice extends AbstractAdvice implements ILicenseAdvice, IExecutableAdvice, IConfigAdvice, IBrandingAdvice { - private final static String OSGI_SPLASH_PATH = "osgi.splashPath"; //$NON-NLS-1$ - private final static String SPLASH_PREFIX = "platform:/base/plugins/"; //$NON-NLS-1$ - private IProductDescriptor product; - private String configSpec; - private String ws; - private String os; - private String arch; - private ConfigData configData = null; - - protected String getId() { - return product.getId(); - } - - protected Version getVersion() { - return Version.parseVersion(product.getVersion()); - } - - /** - * Constructs a new ProductFileAdvice for a given product file and a - * particular configuration. Configurations are - * specified as: ws.os.arch where: - * ws is the windowing system - * os is the operating system - * arch is the architecture - */ - public ProductFileAdvice(IProductDescriptor product, String configSpec) { - this.product = product; - this.configSpec = configSpec; - - String[] config = AbstractPublisherAction.parseConfigSpec(configSpec); - ws = config[0]; - if (ws == null) - ws = AbstractPublisherAction.CONFIG_ANY; - os = config[1]; - if (os == null) - os = AbstractPublisherAction.CONFIG_ANY; - arch = config[2]; - if (arch == null) - arch = AbstractPublisherAction.CONFIG_ANY; - - configData = getConfigData(); - } - - /** - * Returns the program arguments for this product. - */ - public String[] getProgramArguments() { - String line = product.getProgramArguments(os); - return AbstractPublisherAction.getArrayFromString(line, " "); //$NON-NLS-1$ - } - - /** - * Returns the VM arguments for this product. - */ - public String[] getVMArguments() { - String line = product.getVMArguments(os); - return AbstractPublisherAction.getArrayFromString(line, " "); //$NON-NLS-1$ - } - - /** - * Returns the Bundles that constitute this product. These - * bundles may be specified in the .product file, .product file configuration - * area, config.ini file, or a combination of these three places. - */ - public BundleInfo[] getBundles() { - return configData.getBundles(); - } - - /** - * Returns the properties associated with this product. These - * properties may be defined in the .product file, the config.ini - * file, or both. - */ - public Map<String, String> getProperties() { - Map<String, String> result = new HashMap<String, String>(); - CollectionUtils.putAll(configData.getProperties(), result); - result.putAll(product.getConfigurationProperties()); - return result; - } - - /** - * Returns the name of the launcher. This should be the OS-independent - * name. That is, ".exe" etc. should not be included. - * - * @return the name of the branded launcher or <code>null</code> if none. - */ - public String getExecutableName() { - return product.getLauncherName(); - } - - /** - * Returns the product file parser that this advice is working on - */ - public IProductDescriptor getProductFile() { - return product; - } - - /** - * Returns the icons defined for this product - */ - public String[] getIcons() { - return product.getIcons(os); - } - - /** - * Returns the operating system that this advice is configured to work with. - */ - public String getOS() { - return this.os; - } - - /** - * Returns the license text for this product - */ - public String getLicenseURL() { - return product.getLicenseURL(); - } - - /** - * Returns the license URL for this product - */ - public String getLicenseText() { - return product.getLicenseText(); - } - - private ConfigData getConfigData() { - DataLoader loader = createDataLoader(); - ConfigData result; - if (loader != null) { - result = loader.getConfigData(); - } else - result = generateConfigData(); - - addProductFileBundles(result); // these are the bundles specified in the <plugins/> tag - addProductFileConfigBundles(result); // these are the bundles specified in the <configurations> tag in the product file - - if (product.getProductId() != null) - result.setProperty("eclipse.product", product.getProductId()); //$NON-NLS-1$ - if (product.getApplication() != null) - result.setProperty("eclipse.application", product.getApplication()); //$NON-NLS-1$ - String location = getSplashLocation(); - if (location != null) - result.setProperty(OSGI_SPLASH_PATH, SPLASH_PREFIX + location); - return result; - } - - private void addProductFileConfigBundles(ConfigData data) { - Set<BundleInfo> versionBoundBundles = new HashSet<BundleInfo>(); - Map<String, List<BundleInfo>> unboundedBundles = new HashMap<String, List<BundleInfo>>(); - - BundleInfo[] bundles = data.getBundles(); - for (int i = 0; i < bundles.length; i++) { - // For each bundle we know about, cache it. If the bundle doesn't have a version - // add it to a list of bundles by name - BundleInfo bundleInfo = bundles[i]; - if (bundleInfo.getVersion().equals(BundleInfo.EMPTY_VERSION)) { - addUnboundedBundle(unboundedBundles, bundleInfo); - } else { - versionBoundBundles.add(bundleInfo); - addUnboundedBundle(unboundedBundles, bundleInfo); - } - } - - List<BundleInfo> bundleInfos = product.getBundleInfos(); - for (BundleInfo bundleInfo : bundleInfos) { - // For each bundle that has configuration information, if the bundle is in the - // bundles bound by version, add the "configured" bundle instead - // If the bundle is not bound to a version, then replace all bounded versions - // with this one. Otherwise, just add this one (don't replace) - if (versionBoundBundles.contains(bundleInfo)) { - // If we found a version with the same name and version, replace it with the "configured" bundle - data.removeBundle(bundleInfo); - data.addBundle(bundleInfo); - } else if (bundleInfo.getVersion().equals(BundleInfo.EMPTY_VERSION)) { - // If we don't have a version number, look for all bundles that match by name - List<BundleInfo> list = unboundedBundles.get(bundleInfo.getSymbolicName()); - if (list == null) - data.addBundle(bundleInfo); - else - for (BundleInfo target : list) { - target.setStartLevel(bundleInfo.getStartLevel()); - target.setMarkedAsStarted(bundleInfo.isMarkedAsStarted()); - } - } else { - // Otherwise we have a version, but we could not match it, so just add this one. - data.addBundle(bundleInfo); - } - - } - } - - private void addUnboundedBundle(Map<String, List<BundleInfo>> data, BundleInfo bundleInfo) { - if (!data.containsKey(bundleInfo.getSymbolicName())) - data.put(bundleInfo.getSymbolicName(), new LinkedList<BundleInfo>()); - data.get(bundleInfo.getSymbolicName()).add(bundleInfo); - } - - private void addProductFileBundles(ConfigData data) { - List<IVersionedId> bundles = product.getBundles(true); - Set<BundleInfo> set = new HashSet<BundleInfo>(); - set.addAll(Arrays.asList(data.getBundles())); - - for (IVersionedId vid : bundles) { - BundleInfo bundleInfo = new BundleInfo(); - bundleInfo.setSymbolicName(vid.getId()); - bundleInfo.setVersion(vid.getVersion().toString()); - if (!set.contains(bundleInfo)) - data.addBundle(bundleInfo); - } - } - - private ConfigData generateConfigData() { - ConfigData result = new ConfigData(null, null, null, null); - if (product.useFeatures()) - return result; - - // Add all the bundles here. We replace / update them later - // if we find configuration information - List<IVersionedId> bundles = product.getBundles(true); - for (IVersionedId vid : bundles) { - BundleInfo bundleInfo = new BundleInfo(); - bundleInfo.setSymbolicName(vid.getId()); - bundleInfo.setVersion(vid.getVersion().toString()); - result.addBundle(bundleInfo); - } - return result; - } - - private String getSplashLocation() { - return product.getSplashLocation(); - } - - protected String getConfigSpec() { - return configSpec; - } - - protected boolean matchConfig(String spec, boolean includeDefault) { - if (spec != null) { - String targetWS = AbstractPublisherAction.parseConfigSpec(spec)[0]; - if (targetWS == null) - targetWS = AbstractPublisherAction.CONFIG_ANY; - if (!ws.equals(targetWS) && !ws.equals(AbstractPublisherAction.CONFIG_ANY) && !targetWS.equals(AbstractPublisherAction.CONFIG_ANY)) { - return false; - } - - String targetOS = AbstractPublisherAction.parseConfigSpec(spec)[1]; - if (targetOS == null) - targetOS = AbstractPublisherAction.CONFIG_ANY; - if (!os.equals(targetOS) && !os.equals(AbstractPublisherAction.CONFIG_ANY) && !targetOS.equals(AbstractPublisherAction.CONFIG_ANY)) { - return false; - } - - String targetArch = AbstractPublisherAction.parseConfigSpec(spec)[2]; - if (targetArch == null) - targetArch = AbstractPublisherAction.CONFIG_ANY; - if (!arch.equals(targetArch) && !arch.equals(AbstractPublisherAction.CONFIG_ANY) && !targetArch.equals(AbstractPublisherAction.CONFIG_ANY)) { - return false; - } - } - return true; - } - - private DataLoader createDataLoader() { - String location = product.getConfigIniPath(os); - if (location == null) - location = product.getConfigIniPath(null); - if (location == null) - return null; - - File configFile = new File(location); - // We are assuming we are always relative from the product file - // However PDE tooling puts us relative from the workspace, that "relative" path also looks like an absolute path on linux - // Build may have copied the file to the correct place for us - if (!configFile.isAbsolute() || !configFile.exists()) - configFile = new File(product.getLocation().getParentFile(), location); - - //We don't really have an executable location, get something reasonable based on the config.ini location - File parent = configFile.getParentFile(); - if (parent.getName().equals("configuration") && parent.getParentFile() != null) //$NON-NLS-1$ - parent = parent.getParentFile(); - return new DataLoader(configFile, parent); - } - -} diff --git a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/ProductPublisherApplication.java b/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/ProductPublisherApplication.java deleted file mode 100644 index eba846360..000000000 --- a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/ProductPublisherApplication.java +++ /dev/null @@ -1,71 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 2009 Code 9 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: - * Code 9 - initial API and implementation - * IBM - ongoing development - ******************************************************************************/ -package org.eclipse.equinox.p2.publisher.eclipse; - -import java.io.File; -import java.net.URISyntaxException; -import java.util.ArrayList; -import org.eclipse.equinox.internal.p2.publisher.Messages; -import org.eclipse.equinox.internal.p2.publisher.eclipse.IProductDescriptor; -import org.eclipse.equinox.internal.p2.publisher.eclipse.ProductFile; -import org.eclipse.equinox.p2.metadata.IInstallableUnit; -import org.eclipse.equinox.p2.publisher.*; -import org.eclipse.equinox.p2.publisher.actions.VersionAdvice; -import org.eclipse.osgi.util.NLS; - -public class ProductPublisherApplication extends AbstractPublisherApplication { - - private String product; - private String executables; - private String flavor; - - public ProductPublisherApplication() { - //hidden - } - - protected IPublisherAction[] createActions() { - ArrayList<IPublisherAction> result = new ArrayList<IPublisherAction>(); - result.add(createProductAction()); - return result.toArray(new IPublisherAction[result.size()]); - } - - private IPublisherAction createProductAction() { - IProductDescriptor productDescriptor = null; - try { - productDescriptor = new ProductFile(product); - } catch (Exception e) { - throw new IllegalArgumentException(NLS.bind(Messages.exception_errorLoadingProductFile, product, e.toString())); - } - File executablesFeature = executables == null ? null : new File(executables); - return new ProductAction(source, productDescriptor, flavor, executablesFeature); - } - - protected void processParameter(String arg, String parameter, PublisherInfo publisherInfo) throws URISyntaxException { - super.processParameter(arg, parameter, publisherInfo); - - if (arg.equalsIgnoreCase("-productFile")) //$NON-NLS-1$ - product = parameter; - if (arg.equalsIgnoreCase("-executables")) //$NON-NLS-1$ - executables = parameter; - if (arg.equalsIgnoreCase("-flavor")) //$NON-NLS-1$ - flavor = parameter; - if (arg.equalsIgnoreCase("-pluginVersionsAdvice")) { //$NON-NLS-1$ - VersionAdvice versionAdvice = new VersionAdvice(); - versionAdvice.load(IInstallableUnit.NAMESPACE_IU_ID, parameter, null); - info.addAdvice(versionAdvice); - } - if (arg.equalsIgnoreCase("-featureVersionsAdvice")) { //$NON-NLS-1$ - VersionAdvice versionAdvice = new VersionAdvice(); - versionAdvice.load(IInstallableUnit.NAMESPACE_IU_ID, parameter, ".feature.group"); //$NON-NLS-1$ - info.addAdvice(versionAdvice); - } - } -}
\ No newline at end of file diff --git a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/URLEntry.java b/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/URLEntry.java deleted file mode 100644 index b9566e8a8..000000000 --- a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/eclipse/URLEntry.java +++ /dev/null @@ -1,42 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007, 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.equinox.p2.publisher.eclipse; - -public class URLEntry { - private String annotation; - private String url; - - public URLEntry() { - //empty - } - - public URLEntry(String url, String annotation) { - this.url = url; - this.annotation = annotation; - } - - public void setAnnotation(String annotation) { - this.annotation = annotation; - } - - public String getAnnotation() { - return annotation; - } - - public void setURL(String url) { - this.url = url; - } - - public String getURL() { - return url; - } -} |