| /******************************************************************************* |
| * 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.pde.internal.build; |
| |
| import java.util.*; |
| import org.eclipse.osgi.service.resolver.BundleDescription; |
| import org.eclipse.pde.internal.build.site.BuildTimeFeature; |
| import org.osgi.framework.Version; |
| |
| public class AssemblyInformation implements IPDEBuildConstants { |
| // List all the features and plugins to assemble sorted on a per config basis |
| // key: string[] representing the tuple of a config |
| // value: (AssemblyLevelConfigInfo) representing the info for the given config |
| private final Map assembleInformation = new HashMap(8); |
| private final Map bundleMap = new HashMap(); |
| private final Map rootMap = new HashMap(); |
| |
| public AssemblyInformation() { |
| // Initialize the content of the assembly information with the configurations |
| for (Iterator iter = AbstractScriptGenerator.getConfigInfos().iterator(); iter.hasNext();) { |
| assembleInformation.put(iter.next(), new AssemblyLevelConfigInfo()); |
| } |
| } |
| |
| public void addFeature(Config config, BuildTimeFeature feature) { |
| AssemblyLevelConfigInfo entry = (AssemblyLevelConfigInfo) assembleInformation.get(config); |
| entry.addFeature(feature); |
| } |
| |
| public void removeFeature(Config config, BuildTimeFeature feature) { |
| AssemblyLevelConfigInfo entry = (AssemblyLevelConfigInfo) assembleInformation.get(config); |
| entry.removeFeature(feature); |
| } |
| |
| public void addPlugin(Config config, BundleDescription plugin) { |
| AssemblyLevelConfigInfo entry = (AssemblyLevelConfigInfo) assembleInformation.get(config); |
| entry.addPlugin(plugin); |
| |
| String id = plugin.getSymbolicName(); |
| BundleDescription existing = (BundleDescription) bundleMap.get(id); |
| if (existing == null || existing.getVersion().compareTo(plugin.getVersion()) < 0) |
| bundleMap.put(id, plugin); |
| bundleMap.put(id + '_' + plugin.getVersion().toString(), plugin); |
| } |
| |
| public BundleDescription getPlugin(String id, String version) { |
| if (version != null && !GENERIC_VERSION_NUMBER.equals(version)) |
| return (BundleDescription) bundleMap.get(id + '_' + version); |
| return (BundleDescription) bundleMap.get(id); |
| } |
| |
| public BuildTimeFeature getRootProvider(String id, String version) { |
| if (version != null && !GENERIC_VERSION_NUMBER.equals(version)) |
| return (BuildTimeFeature) rootMap.get(id + '_' + version); |
| return (BuildTimeFeature) rootMap.get(id); |
| } |
| |
| public Collection getPlugins(Config config) { |
| return ((AssemblyLevelConfigInfo) assembleInformation.get(config)).getPlugins(); |
| } |
| |
| public Set getAllPlugins() { |
| Collection pluginsByConfig = assembleInformation.values(); |
| Set result = new LinkedHashSet(); |
| for (Iterator iter = pluginsByConfig.iterator(); iter.hasNext();) { |
| Collection allPlugins = ((AssemblyLevelConfigInfo) iter.next()).getPlugins(); |
| result.addAll(allPlugins); |
| } |
| return result; |
| } |
| |
| public Collection getBinaryPlugins(Config config) { |
| Collection allPlugins = getPlugins(config); |
| Set result = new LinkedHashSet(allPlugins.size()); |
| for (Iterator iter = allPlugins.iterator(); iter.hasNext();) { |
| BundleDescription bundle = (BundleDescription) iter.next(); |
| Properties bundleProperties = ((Properties) bundle.getUserObject()); |
| if (bundleProperties == null || bundleProperties.get(IS_COMPILED) == null || Boolean.FALSE == bundleProperties.get(IS_COMPILED)) |
| result.add(bundle); |
| } |
| return result; |
| } |
| |
| public Collection getCompiledPlugins(Config config) { |
| Collection allPlugins = getPlugins(config); |
| Set result = new LinkedHashSet(allPlugins.size()); |
| for (Iterator iter = allPlugins.iterator(); iter.hasNext();) { |
| BundleDescription bundle = (BundleDescription) iter.next(); |
| Properties bundleProperties = ((Properties) bundle.getUserObject()); |
| if (bundleProperties != null && Boolean.TRUE == bundleProperties.get(IS_COMPILED)) |
| result.add(bundle); |
| } |
| return result; |
| } |
| |
| public Set getAllCompiledPlugins() { |
| Collection pluginsByConfig = assembleInformation.values(); |
| Set result = new LinkedHashSet(); |
| for (Iterator iter2 = pluginsByConfig.iterator(); iter2.hasNext();) { |
| Collection allPlugins = ((AssemblyLevelConfigInfo) iter2.next()).getPlugins(); |
| for (Iterator iter = allPlugins.iterator(); iter.hasNext();) { |
| BundleDescription bundle = (BundleDescription) iter.next(); |
| if (!Utils.isBinary(bundle)) { |
| result.add(bundle); |
| } |
| } |
| } |
| return result; |
| } |
| |
| public Collection getCompiledFeatures(Config config) { |
| Collection allFeatures = getFeatures(config); |
| ArrayList result = new ArrayList(allFeatures.size()); |
| for (Iterator iter = allFeatures.iterator(); iter.hasNext();) { |
| Object tmp = iter.next(); |
| if (tmp instanceof BuildTimeFeature) { |
| if (!((BuildTimeFeature) tmp).isBinary()) |
| result.add(tmp); |
| } |
| } |
| return result; |
| } |
| |
| public Collection getBinaryFeatures(Config config) { |
| Collection allFeatures = getFeatures(config); |
| ArrayList result = new ArrayList(allFeatures.size()); |
| for (Iterator iter = allFeatures.iterator(); iter.hasNext();) { |
| Object tmp = iter.next(); |
| if (tmp instanceof BuildTimeFeature) { |
| if (((BuildTimeFeature) tmp).isBinary()) |
| result.add(tmp); |
| } else { |
| result.add(tmp); |
| } |
| } |
| return result; |
| } |
| |
| public ArrayList getFeatures(Config config) { |
| return ((AssemblyLevelConfigInfo) assembleInformation.get(config)).getFeatures(); |
| } |
| |
| public boolean copyRootFile(Config config) { |
| return ((AssemblyLevelConfigInfo) assembleInformation.get(config)).hasRootFile(); |
| } |
| |
| public Collection getRootFileProviders(Config config) { |
| return ((AssemblyLevelConfigInfo) assembleInformation.get(config)).getRootFileProvider(); |
| } |
| |
| public void addRootFileProvider(Config config, BuildTimeFeature feature) { |
| ((AssemblyLevelConfigInfo) assembleInformation.get(config)).addRootFileProvider(feature); |
| |
| String id = feature.getId(); |
| BuildTimeFeature existing = (BuildTimeFeature) rootMap.get(id); |
| if (existing == null || new Version(existing.getVersion()).compareTo(new Version(feature.getVersion())) < 0) |
| rootMap.put(id, feature); |
| rootMap.put(id + '_' + feature.getVersion(), feature); |
| } |
| |
| // All the information that will go into the assemble file for a specific info |
| protected static class AssemblyLevelConfigInfo { |
| // the plugins that are contained into this config |
| private final Collection plugins = new LinkedHashSet(20); |
| // the features that are contained into this config |
| private final ArrayList features = new ArrayList(7); |
| // indicate whether root files needs to be copied and where they are coming from |
| private final LinkedList rootFileProviders = new LinkedList(); |
| |
| public void addRootFileProvider(BuildTimeFeature feature) { |
| if (rootFileProviders.contains(feature)) |
| return; |
| for (Iterator iter = rootFileProviders.iterator(); iter.hasNext();) { |
| BuildTimeFeature featureDescriptor = (BuildTimeFeature) iter.next(); |
| if (feature == featureDescriptor) |
| return; |
| if (feature.getId().equals(featureDescriptor.getId()) && feature.getVersion().equals(featureDescriptor.getVersion())) |
| return; |
| } |
| rootFileProviders.add(feature); |
| } |
| |
| public Collection getRootFileProvider() { |
| return rootFileProviders; |
| } |
| |
| public boolean hasRootFile() { |
| return rootFileProviders.size() > 0; |
| } |
| |
| public ArrayList getFeatures() { |
| return features; |
| } |
| |
| public Collection getPlugins() { |
| return plugins; |
| } |
| |
| public void addFeature(BuildTimeFeature feature) { |
| for (Iterator iter = features.iterator(); iter.hasNext();) { |
| BuildTimeFeature featureDescriptor = (BuildTimeFeature) iter.next(); |
| if (feature.getId().equals(featureDescriptor.getId()) && (feature).getVersion().equals(featureDescriptor.getVersion())) |
| return; |
| } |
| features.add(feature); |
| } |
| |
| public void addPlugin(BundleDescription plugin) { |
| plugins.add(plugin); |
| } |
| |
| public void removeFeature(BuildTimeFeature feature) { |
| for (Iterator iter = features.iterator(); iter.hasNext();) { |
| BuildTimeFeature featureDescriptor = (BuildTimeFeature) iter.next(); |
| if (feature.getId().equals(featureDescriptor.getId()) && feature.getVersion().equals(featureDescriptor.getVersion())) { |
| features.remove(featureDescriptor); |
| return; |
| } |
| } |
| } |
| } |
| } |