| /* |
| * 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(); |
| } |
| } |