1 /******************************************************************************* 2 * Copyright (c) 2005, 2015 IBM Corporation and others. 3 * 4 * This program and the accompanying materials 5 * are made available under the terms of the Eclipse Public License 2.0 6 * which accompanies this distribution, and is available at 7 * https://www.eclipse.org/legal/epl-2.0/ 8 * 9 * SPDX-License-Identifier: EPL-2.0 10 * 11 * Contributors: 12 * IBM Corporation - initial API and implementation 13 *******************************************************************************/ 14 package org.eclipse.pde.internal.core.text.bundle; 15 16 import java.io.PrintWriter; 17 import java.util.Arrays; 18 import org.eclipse.osgi.service.resolver.ExportPackageDescription; 19 import org.eclipse.osgi.service.resolver.VersionRange; 20 import org.eclipse.osgi.util.ManifestElement; 21 import org.eclipse.pde.internal.core.ICoreConstants; 22 import org.eclipse.pde.internal.core.PDECore; 23 import org.eclipse.pde.internal.core.PDEState; 24 import org.eclipse.pde.internal.core.bundle.BundlePluginBase; 25 import org.eclipse.pde.internal.core.ibundle.IBundleModel; 26 import org.osgi.framework.Constants; 27 import org.osgi.framework.Version; 28 29 public class ImportPackageObject extends PackageObject { 30 31 private static final long serialVersionUID = 1L; 32 getVersion(ExportPackageDescription desc)33 private static String getVersion(ExportPackageDescription desc) { 34 String version = desc.getVersion().toString(); 35 if (!version.equals(Version.emptyVersion.toString())) { 36 return desc.getVersion().toString(); 37 } 38 return null; 39 } 40 ImportPackageObject(ManifestHeader header, ManifestElement element, String versionAttribute)41 public ImportPackageObject(ManifestHeader header, ManifestElement element, String versionAttribute) { 42 super(header, element, versionAttribute); 43 } 44 ImportPackageObject(ManifestHeader header, ExportPackageDescription desc, String versionAttribute)45 public ImportPackageObject(ManifestHeader header, ExportPackageDescription desc, String versionAttribute) { 46 super(header, desc.getName(), getVersion(desc), versionAttribute); 47 } 48 ImportPackageObject(ManifestHeader header, String id, String version, String versionAttribute)49 public ImportPackageObject(ManifestHeader header, String id, String version, String versionAttribute) { 50 super(header, id, version, versionAttribute); 51 } 52 isOptional()53 public boolean isOptional() { 54 int manifestVersion = BundlePluginBase.getBundleManifestVersion(getHeader().getBundle()); 55 if (manifestVersion > 1) { 56 return Constants.RESOLUTION_OPTIONAL.equals(getDirective(Constants.RESOLUTION_DIRECTIVE)); 57 } 58 return "true".equals(getAttribute(ICoreConstants.OPTIONAL_ATTRIBUTE)); //$NON-NLS-1$ 59 } 60 setOptional(boolean optional)61 public void setOptional(boolean optional) { 62 boolean old = isOptional(); 63 int manifestVersion = BundlePluginBase.getBundleManifestVersion(getHeader().getBundle()); 64 if (optional) { 65 if (manifestVersion > 1) { 66 setDirective(Constants.RESOLUTION_DIRECTIVE, Constants.RESOLUTION_OPTIONAL); 67 } 68 else { 69 setAttribute(ICoreConstants.OPTIONAL_ATTRIBUTE, "true"); //$NON-NLS-1$ 70 } 71 } else { 72 setDirective(Constants.RESOLUTION_DIRECTIVE, null); 73 setAttribute(ICoreConstants.OPTIONAL_ATTRIBUTE, null); 74 } 75 fHeader.update(); 76 firePropertyChanged(this, Constants.RESOLUTION_DIRECTIVE, Boolean.toString(old), Boolean.toString(optional)); 77 } 78 79 /** 80 * @param model 81 * @param header 82 * @param versionAttribute 83 */ reconnect(IBundleModel model, ImportPackageHeader header, String versionAttribute)84 public void reconnect(IBundleModel model, ImportPackageHeader header, String versionAttribute) { 85 super.reconnect(model, header, versionAttribute); 86 // No transient fields 87 } 88 89 @Override write(String indent, PrintWriter writer)90 public void write(String indent, PrintWriter writer) { 91 // Used for text transfers for copy, cut, paste operations 92 writer.write(write()); 93 } 94 restoreProperty(String propertyName, Object oldValue, Object newValue)95 public void restoreProperty(String propertyName, Object oldValue, Object newValue) { 96 if (Constants.RESOLUTION_DIRECTIVE.equalsIgnoreCase(propertyName)) { 97 setOptional(Boolean.parseBoolean(newValue.toString())); 98 } else if (fVersionAttribute != null && fVersionAttribute.equalsIgnoreCase(propertyName)) { 99 setVersion(newValue.toString()); 100 } 101 } 102 isResolved()103 public boolean isResolved() { 104 PDEState pdeState = PDECore.getDefault().getModelManager().getState(); 105 ExportPackageDescription[] exportedPackages = pdeState.getState().getExportedPackages(); 106 107 VersionRange versionRange = new VersionRange(getVersion()); 108 return Arrays.stream(exportedPackages) 109 .filter(p -> p.getName().equals(getName())) 110 .anyMatch(p -> versionRange.isIncluded(p.getVersion())); 111 } 112 113 } 114