blob: aaa1b11364403abc468bd3d1169f110c17757784 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 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.service.resolver.*;
import org.osgi.framework.Constants;
import org.osgi.framework.Version;
public class GenericDescriptionImpl extends BaseDescriptionImpl implements GenericDescription {
private Dictionary<String, Object> attributes;
private volatile BundleDescription supplier;
private volatile String type = GenericDescription.DEFAULT_TYPE;
private Map<String, String> directives;
private GenericDescription fragmentDeclaration;
public GenericDescriptionImpl() {
super();
}
public GenericDescriptionImpl(BundleDescription host, GenericDescription fragmentDeclaration) {
setType(fragmentDeclaration.getType());
Dictionary<String, Object> origAttrs = fragmentDeclaration.getAttributes();
if (origAttrs != null) {
Hashtable<String, Object> copyAttrs = new Hashtable<>();
for (Enumeration<String> keys = origAttrs.keys(); keys.hasMoreElements();) {
String key = keys.nextElement();
copyAttrs.put(key, origAttrs.get(key));
}
setAttributes(copyAttrs);
}
Map<String, String> origDirectives = fragmentDeclaration.getDeclaredDirectives();
Map<String, String> copyDirectives = new HashMap<>(origDirectives);
setDirectives(copyDirectives);
setSupplier(host);
this.fragmentDeclaration = fragmentDeclaration;
}
public Dictionary<String, Object> getAttributes() {
synchronized (this.monitor) {
return attributes;
}
}
public BundleDescription getSupplier() {
return supplier;
}
void setAttributes(Dictionary<String, Object> attributes) {
synchronized (this.monitor) {
this.attributes = attributes;
}
}
void setDirectives(Map<String, String> directives) {
synchronized (this.monitor) {
this.directives = directives;
}
}
void setSupplier(BundleDescription supplier) {
this.supplier = supplier;
}
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append(Constants.PROVIDE_CAPABILITY).append(": ").append(getType()); //$NON-NLS-1$
Map<String, Object> attrs = getDeclaredAttributes();
sb.append(toString(attrs, false));
return sb.toString();
}
/**
* @deprecated
*/
public String getName() {
synchronized (this.monitor) {
Object name = attributes != null ? attributes.get(getType()) : null;
return name instanceof String ? (String) name : null;
}
}
public String getType() {
return type;
}
void setType(String type) {
if (type == null || type.equals(GenericDescription.DEFAULT_TYPE))
this.type = GenericDescription.DEFAULT_TYPE;
else
this.type = type;
}
/**
* @deprecated
*/
public Version getVersion() {
Object version = attributes != null ? attributes.get(Constants.VERSION_ATTRIBUTE) : null;
return version instanceof Version ? (Version) version : super.getVersion();
}
public Map<String, String> getDeclaredDirectives() {
synchronized (this.monitor) {
if (directives == null)
return Collections.<String, String> emptyMap();
return Collections.unmodifiableMap(directives);
}
}
public Map<String, Object> getDeclaredAttributes() {
synchronized (this.monitor) {
Map<String, Object> result = new HashMap<>(5);
if (attributes != null)
for (Enumeration<String> keys = attributes.keys(); keys.hasMoreElements();) {
String key = keys.nextElement();
Object value = attributes.get(key);
if (value instanceof List)
value = Collections.unmodifiableList((List<?>) value);
result.put(key, value);
}
return Collections.unmodifiableMap(result);
}
}
String getInternalNameSpace() {
return getType();
}
public BaseDescription getFragmentDeclaration() {
return fragmentDeclaration;
}
void setFragmentDeclaration(GenericDescription fragmentDeclaration) {
this.fragmentDeclaration = fragmentDeclaration;
}
}