package org.archstudio.releng.pde.actions; import java.util.List; import java.util.Set; import org.archstudio.releng.pde.ui.Activator; import org.archstudio.sysutils.SystemUtils; import org.archstudio.utils.osgi.OSGiUtils; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.pde.core.project.IBundleProjectDescription; import org.eclipse.pde.core.project.IBundleProjectService; import org.eclipse.pde.core.project.IRequiredBundleDescription; import org.eclipse.pde.internal.core.feature.WorkspaceFeatureModel; import org.eclipse.pde.internal.core.ifeature.IFeature; import org.eclipse.pde.internal.core.ifeature.IFeatureImport; import org.eclipse.pde.internal.core.ifeature.IFeaturePlugin; import org.osgi.framework.BundleContext; import com.google.common.collect.Lists; import com.google.common.collect.Sets; @SuppressWarnings("restriction") public class RemoveDependencyVersionNumbers extends AbstractProjectHandler { public RemoveDependencyVersionNumbers() { } @Override protected void execute(IProject project) { try { // remove dependencies in the MANIFEST.MF file if (project.getFile("META-INF/MANIFEST.MF").exists()) { BundleContext context = Activator.getSingleton().getContext(); IBundleProjectService service = OSGiUtils.getServiceReference(context, IBundleProjectService.class); IBundleProjectDescription description = service.getDescription(project); List<IRequiredBundleDescription> requiredBundles = Lists.newArrayList(SystemUtils .emptyIfNull(description.getRequiredBundles())); List<IRequiredBundleDescription> newRequiredBundles = Lists.newArrayList(); for (IRequiredBundleDescription b : requiredBundles) { newRequiredBundles .add(service.newRequiredBundle(b.getName(), null, b.isOptional(), b.isExported())); } // the old bundles aren't getting removed, we force this by clearing the corresponding header name description.setHeader("Require-Bundle", null); description.setRequiredBundles(null); description.apply(null); // we start with a fresh bundle because we cannot unclear the header name description = service.getDescription(project); description.setRequiredBundles(newRequiredBundles.toArray(new IRequiredBundleDescription[0])); description.apply(null); } // remove dependency version numbers in the feature.xml file if (project.getFile("feature.xml").exists()) { WorkspaceFeatureModel featureModel = new WorkspaceFeatureModel(project.getFile("feature.xml")); featureModel.load(); IFeature feature = featureModel.getFeature(); Set<String> pluginIDs = Sets.newHashSet(); for (IFeaturePlugin featurePlugin : feature.getPlugins()) { pluginIDs.add(featurePlugin.getId()); } Set<String> featureIDs = Sets.newHashSet(); List<IFeatureImport> duplicates = Lists.newArrayList(); for (IFeatureImport featureImport : feature.getImports()) { featureImport.setVersion(null); featureImport.setMatch(0); if (!featureIDs.add(featureImport.getId()) || pluginIDs.contains(featureImport.getId())) { duplicates.add(featureImport); } } feature.removeImports(duplicates.toArray(new IFeatureImport[0])); featureModel.save(); } } catch (CoreException e) { e.printStackTrace(); } } }