blob: 1ed37973995b77f7897d9171852539ed1380db3e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2016 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
* Rob Harrop - SpringSource Inc. (bug 247522)
*******************************************************************************/
package org.eclipse.osgi.internal.resolver;
import java.util.*;
import org.eclipse.osgi.internal.framework.EquinoxContainer;
import org.eclipse.osgi.service.resolver.*;
import org.osgi.framework.Constants;
import org.osgi.framework.Version;
import org.osgi.framework.wiring.BundleRevision;
public class ExportPackageDescriptionImpl extends BaseDescriptionImpl implements ExportPackageDescription {
public static final String EQUINOX_EE = "x-equinox-ee"; //$NON-NLS-1$
private static final Integer EQUINOX_EE_DEFAULT = new Integer(-1);
private String[] uses;
private Map<String, Object> attributes;
private Map<String, String> arbitraryDirectives;
private volatile BundleDescription exporter;
private String exclude;
private String include;
private String[] friends;
private String[] mandatory;
private Boolean internal = Boolean.FALSE;
private int equinox_ee = -1;
private ExportPackageDescription fragmentDeclaration = null;
public ExportPackageDescriptionImpl() {
super();
}
public ExportPackageDescriptionImpl(BundleDescription host, ExportPackageDescription fragmentDeclaration) {
setName(fragmentDeclaration.getName());
setVersion(fragmentDeclaration.getVersion());
setDirectives(fragmentDeclaration.getDirectives());
setArbitraryDirectives(((ExportPackageDescriptionImpl) fragmentDeclaration).getArbitraryDirectives());
setAttributes(fragmentDeclaration.getAttributes());
setExporter(host);
this.fragmentDeclaration = fragmentDeclaration;
}
public Map<String, Object> getDirectives() {
synchronized (this.monitor) {
Map<String, Object> result = new HashMap<>(7);
if (uses != null)
result.put(Constants.USES_DIRECTIVE, uses);
if (exclude != null)
result.put(Constants.EXCLUDE_DIRECTIVE, exclude);
if (include != null)
result.put(Constants.INCLUDE_DIRECTIVE, include);
if (mandatory != null)
result.put(Constants.MANDATORY_DIRECTIVE, mandatory);
if (friends != null)
result.put(StateImpl.FRIENDS_DIRECTIVE, friends);
result.put(StateImpl.INTERNAL_DIRECTIVE, internal);
result.put(EQUINOX_EE, equinox_ee == -1 ? EQUINOX_EE_DEFAULT : new Integer(equinox_ee));
return result;
}
}
public Map<String, String> getDeclaredDirectives() {
Map<String, String> result = new HashMap<>(6);
synchronized (this.monitor) {
Map<String, String> arbitrary = getArbitraryDirectives();
if (arbitrary != null)
result.putAll(arbitrary);
if (uses != null)
result.put(Constants.USES_DIRECTIVE, toString(uses));
if (exclude != null)
result.put(Constants.EXCLUDE_DIRECTIVE, exclude);
if (include != null)
result.put(Constants.INCLUDE_DIRECTIVE, include);
if (mandatory != null)
result.put(Constants.MANDATORY_DIRECTIVE, toString(mandatory));
if (friends != null)
result.put(StateImpl.FRIENDS_DIRECTIVE, toString(friends));
if (internal != null)
result.put(StateImpl.INTERNAL_DIRECTIVE, internal.toString());
return Collections.unmodifiableMap(result);
}
}
public Map<String, Object> getDeclaredAttributes() {
Map<String, Object> result = new HashMap<>(2);
synchronized (this.monitor) {
if (attributes != null)
result.putAll(attributes);
result.put(BundleRevision.PACKAGE_NAMESPACE, getName());
result.put(Constants.VERSION_ATTRIBUTE, getVersion());
Version bundleVersion = getSupplier().getVersion();
if (bundleVersion != null)
result.put(Constants.BUNDLE_VERSION_ATTRIBUTE, bundleVersion);
String symbolicName = getSupplier().getSymbolicName();
if (symbolicName != null) {
if (symbolicName.equals(EquinoxContainer.NAME))
result.put(Constants.BUNDLE_SYMBOLICNAME_ATTRIBUTE, Arrays.asList(Constants.SYSTEM_BUNDLE_SYMBOLICNAME, symbolicName));
else
result.put(Constants.BUNDLE_SYMBOLICNAME_ATTRIBUTE, symbolicName);
}
return Collections.unmodifiableMap(result);
}
}
static String toString(String[] list) {
StringBuffer buffer = new StringBuffer();
for (String string : list)
buffer.append(string).append(',');
if (buffer.length() > 0)
buffer.setLength(buffer.length() - 1);
return buffer.toString();
}
public Object getDirective(String key) {
synchronized (this.monitor) {
if (key.equals(Constants.USES_DIRECTIVE))
return uses;
if (key.equals(Constants.EXCLUDE_DIRECTIVE))
return exclude;
if (key.equals(Constants.INCLUDE_DIRECTIVE))
return include;
if (key.equals(Constants.MANDATORY_DIRECTIVE))
return mandatory;
if (key.equals(StateImpl.FRIENDS_DIRECTIVE))
return friends;
if (key.equals(StateImpl.INTERNAL_DIRECTIVE))
return internal;
if (key.equals(EQUINOX_EE))
return equinox_ee == -1 ? EQUINOX_EE_DEFAULT : new Integer(equinox_ee);
return null;
}
}
public Object setDirective(String key, Object value) {
synchronized (this.monitor) {
if (key.equals(Constants.USES_DIRECTIVE))
return uses = (String[]) value;
if (key.equals(Constants.EXCLUDE_DIRECTIVE))
return exclude = (String) value;
if (key.equals(Constants.INCLUDE_DIRECTIVE))
return include = (String) value;
if (key.equals(Constants.MANDATORY_DIRECTIVE))
return mandatory = (String[]) value;
if (key.equals(StateImpl.FRIENDS_DIRECTIVE))
return friends = (String[]) value;
if (key.equals(StateImpl.INTERNAL_DIRECTIVE))
return internal = (Boolean) value;
if (key.equals(EQUINOX_EE)) {
equinox_ee = ((Integer) value).intValue();
return value;
}
return null;
}
}
public void setDirectives(Map<String, ?> directives) {
synchronized (this.monitor) {
if (directives == null)
return;
uses = (String[]) directives.get(Constants.USES_DIRECTIVE);
exclude = (String) directives.get(Constants.EXCLUDE_DIRECTIVE);
include = (String) directives.get(Constants.INCLUDE_DIRECTIVE);
mandatory = (String[]) directives.get(Constants.MANDATORY_DIRECTIVE);
friends = (String[]) directives.get(StateImpl.FRIENDS_DIRECTIVE);
internal = (Boolean) directives.get(StateImpl.INTERNAL_DIRECTIVE);
equinox_ee = ((Integer) directives.get(EQUINOX_EE)).intValue();
}
}
@SuppressWarnings("unchecked")
void setArbitraryDirectives(Map<String, ?> directives) {
synchronized (this.monitor) {
this.arbitraryDirectives = (Map<String, String>) directives;
}
}
Map<String, String> getArbitraryDirectives() {
synchronized (this.monitor) {
return arbitraryDirectives;
}
}
public Map<String, Object> getAttributes() {
synchronized (this.monitor) {
return attributes;
}
}
public BundleDescription getSupplier() {
return getExporter();
}
public BundleDescription getExporter() {
return exporter;
}
/**
* @deprecated
*/
public boolean isRoot() {
return true;
}
@SuppressWarnings("unchecked")
protected void setAttributes(Map<String, ?> attributes) {
synchronized (this.monitor) {
this.attributes = (Map<String, Object>) attributes;
}
}
protected void setExporter(BundleDescription exporter) {
this.exporter = exporter;
}
public BaseDescription getFragmentDeclaration() {
return fragmentDeclaration;
}
void setFragmentDeclaration(ExportPackageDescription fragmentDeclaration) {
this.fragmentDeclaration = fragmentDeclaration;
}
public String toString() {
return "Export-Package: " + getName() + "; version=\"" + getVersion() + "\""; //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
}
String getInternalNameSpace() {
return BundleRevision.PACKAGE_NAMESPACE;
}
}