blob: 8d93af42e1cfcfe9b38b584c2f2bdafc24a2d782 [file] [log] [blame]
/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.felix.bundlerepository.impl;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.osgi.framework.namespace.BundleNamespace;
import org.osgi.framework.namespace.PackageNamespace;
import org.osgi.resource.Capability;
import org.osgi.resource.Resource;
public class FelixCapabilityAdapter implements Capability
{
private final org.apache.felix.bundlerepository.Capability capability;
private final Resource resource;
private volatile Map<String, Object> convertedAttributes;
public FelixCapabilityAdapter(org.apache.felix.bundlerepository.Capability capability, Resource resource)
{
if (capability == null)
throw new NullPointerException("Missing required parameter: capability");
this.capability = capability;
this.resource = resource;
}
public Map<String, Object> getAttributes()
{
if (convertedAttributes == null)
{
Map<String, Object> orgMap = capability.getPropertiesAsMap();
HashMap<String, Object> converted = new HashMap<String, Object>(orgMap.size() + 2);
for (Map.Entry<String, Object> entry : orgMap.entrySet())
{
converted.put(NamespaceTranslator.getOSGiNamespace(entry.getKey()), entry.getValue());
}
if (BundleNamespace.BUNDLE_NAMESPACE.equals(getNamespace()))
{
defaultAttribute(orgMap, converted, BundleNamespace.BUNDLE_NAMESPACE,
orgMap.get(org.apache.felix.bundlerepository.Resource.SYMBOLIC_NAME));
defaultAttribute(orgMap, converted, BundleNamespace.CAPABILITY_BUNDLE_VERSION_ATTRIBUTE,
orgMap.get(org.apache.felix.bundlerepository.Resource.VERSION));
}
else if (PackageNamespace.PACKAGE_NAMESPACE.equals(getNamespace()))
{
Capability bundleCap = getBundleCapability();
if (bundleCap != null)
{
defaultAttribute(orgMap, converted, PackageNamespace.CAPABILITY_BUNDLE_SYMBOLICNAME_ATTRIBUTE,
bundleCap.getAttributes().get(BundleNamespace.BUNDLE_NAMESPACE));
defaultAttribute(orgMap, converted, PackageNamespace.CAPABILITY_BUNDLE_VERSION_ATTRIBUTE,
bundleCap.getAttributes().get(BundleNamespace.CAPABILITY_BUNDLE_VERSION_ATTRIBUTE));
}
}
convertedAttributes = converted;
}
return convertedAttributes;
}
private void defaultAttribute(Map<String, Object> orgMap, Map<String, Object> converted, String newAttr, Object defVal)
{
if (converted.get(newAttr) == null)
converted.put(newAttr, defVal);
}
public Map<String, String> getDirectives()
{
return capability.getDirectives();
}
public String getNamespace()
{
return NamespaceTranslator.getOSGiNamespace(capability.getName());
}
public Resource getResource()
{
return resource;
}
private Capability getBundleCapability()
{
if (resource == null)
return null;
List<Capability> caps = resource.getCapabilities(BundleNamespace.BUNDLE_NAMESPACE);
if (caps.size() > 0)
return caps.get(0);
else
return null;
}
@Override
public boolean equals(Object o)
{
if (o == this)
return true;
if (!(o instanceof Capability))
return false;
Capability c = (Capability) o;
return c.getNamespace().equals(getNamespace()) && c.getAttributes().equals(getAttributes())
&& c.getDirectives().equals(getDirectives()) && c.getResource().equals(getResource());
}
@Override
public int hashCode()
{
int result = 17;
result = 31 * result + getNamespace().hashCode();
result = 31 * result + getAttributes().hashCode();
result = 31 * result + getDirectives().hashCode();
result = 31 * result + getResource().hashCode();
return result;
}
public String toString()
{
return resource + ":" + capability;
}
}