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