blob: b0bbb216021a14fa7f566754fb1e966fa0c9cec4 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.Dictionary;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;
import org.apache.felix.bundlerepository.Capability;
import org.apache.felix.bundlerepository.LocalResource;
import org.apache.felix.bundlerepository.Resource;
import org.osgi.framework.Bundle;
import org.osgi.framework.Constants;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
import org.osgi.framework.wiring.BundleRevision;
public class LocalResourceImpl extends ResourceImpl implements LocalResource
{
private Bundle m_bundle = null;
LocalResourceImpl(Bundle bundle) throws InvalidSyntaxException
{
m_bundle = bundle;
initialize();
}
public boolean isLocal()
{
return true;
}
public Bundle getBundle()
{
return m_bundle;
}
private void initialize() throws InvalidSyntaxException
{
final Dictionary dict = m_bundle.getHeaders();
DataModelHelperImpl.populate(new DataModelHelperImpl.Headers()
{
public String getHeader(String name)
{
return (String) dict.get(name);
}
public void close() { }
}, this);
// Convert export service declarations and services into capabilities.
convertExportServiceToCapability(dict, m_bundle);
// For the system bundle, add a special platform capability.
if (m_bundle.getBundleId() == 0)
{
// add the alias bundle symbolic name "system.bundle"
CapabilityImpl sysBundleCap = new CapabilityImpl(Capability.BUNDLE);
sysBundleCap.addProperty(Resource.SYMBOLIC_NAME, Constants.SYSTEM_BUNDLE_SYMBOLICNAME);
addCapability(sysBundleCap);
// set the execution environment(s) as Capability ee of the
// system bundle to resolve bundles with specific requirements
String ee = m_bundle.getBundleContext().getProperty(Constants.FRAMEWORK_EXECUTIONENVIRONMENT);
if (ee != null)
{
StringTokenizer tokens = new StringTokenizer(ee, ",");
while (tokens.hasMoreTokens()) {
CapabilityImpl cap = new CapabilityImpl(Capability.EXECUTIONENVIRONMENT);
cap.addProperty(Capability.EXECUTIONENVIRONMENT, tokens.nextToken().trim());
addCapability(cap);
}
}
// Add all the OSGi capabilities from the system bundle as repo capabilities
BundleRevision br = m_bundle.adapt(BundleRevision.class);
for (org.osgi.resource.Capability cap : br.getCapabilities(null))
{
CapabilityImpl bcap = new CapabilityImpl(cap.getNamespace());
for (Map.Entry<String, Object> entry : cap.getAttributes().entrySet())
{
bcap.addProperty(new FelixPropertyAdapter(entry));
}
for (Map.Entry<String, String> entry : cap.getDirectives().entrySet())
{
bcap.addDirective(entry.getKey(), entry.getValue());
}
addCapability(bcap);
}
}
}
private void convertExportServiceToCapability(Dictionary dict, Bundle bundle)
{
Set services = new HashSet();
// add actual registered services
ServiceReference[] refs = bundle.getRegisteredServices();
for (int i = 0; refs != null && i < refs.length; i++)
{
String[] cls = (String[]) refs[i].getProperty(Constants.OBJECTCLASS);
for (int j = 0; cls != null && j < cls.length; j++)
{
CapabilityImpl cap = new CapabilityImpl();
cap.setName(Capability.SERVICE);
cap.addProperty(new PropertyImpl(Capability.SERVICE, null, cls[j]));
// TODO: add service properties
addCapability(cap);
}
}
// TODO: check duplicates with service-export properties
}
public String toString()
{
return m_bundle.toString();
}
}