Search in sources :

Example 1 with GenericMetadata

use of org.apache.aries.util.manifest.ManifestHeaderProcessor.GenericMetadata in project aries by apache.

the class ConsumerHeaderProcessor method processRequireCapabilityHeader.

private static Set<WeavingData> processRequireCapabilityHeader(String consumerHeader) throws InvalidSyntaxException {
    Set<WeavingData> weavingData = new HashSet<WeavingData>();
    List<GenericMetadata> requirements = ManifestHeaderProcessor.parseRequirementString(consumerHeader);
    GenericMetadata extenderRequirement = findRequirement(requirements, SpiFlyConstants.EXTENDER_CAPABILITY_NAMESPACE, SpiFlyConstants.PROCESSOR_EXTENDER_NAME);
    Collection<GenericMetadata> serviceLoaderRequirements = findAllMetadata(requirements, SpiFlyConstants.SERVICELOADER_CAPABILITY_NAMESPACE);
    if (extenderRequirement != null) {
        ArgRestrictions ar = new ArgRestrictions();
        ar.addRestriction(0, Class.class.getName());
        MethodRestriction mr = new MethodRestriction("load", ar);
        List<BundleDescriptor> allowedBundles = new ArrayList<BundleDescriptor>();
        for (GenericMetadata req : serviceLoaderRequirements) {
            String slFilterString = req.getDirectives().get(SpiFlyConstants.FILTER_DIRECTIVE);
            if (slFilterString != null) {
                Filter slFilter = FrameworkUtil.createFilter(slFilterString);
                allowedBundles.add(new BundleDescriptor(slFilter));
            }
        }
        weavingData.add(createWeavingData(ServiceLoader.class.getName(), "load", mr, allowedBundles));
    }
    return weavingData;
}
Also used : ArrayList(java.util.ArrayList) GenericMetadata(org.apache.aries.util.manifest.ManifestHeaderProcessor.GenericMetadata) Filter(org.osgi.framework.Filter) HashSet(java.util.HashSet)

Example 2 with GenericMetadata

use of org.apache.aries.util.manifest.ManifestHeaderProcessor.GenericMetadata in project aries by apache.

the class ProviderBundleTrackerCustomizer method findRequirement.

private static GenericMetadata findRequirement(List<GenericMetadata> requirements, String namespace, String type) throws InvalidSyntaxException {
    Dictionary<String, String> nsAttr = new Hashtable<String, String>();
    nsAttr.put(namespace, type);
    for (GenericMetadata req : requirements) {
        if (namespace.equals(req.getNamespace())) {
            String filterString = req.getDirectives().get(SpiFlyConstants.FILTER_DIRECTIVE);
            if (filterString != null) {
                Filter filter = FrameworkUtil.createFilter(filterString);
                if (filter.match(nsAttr)) {
                    return req;
                }
            }
        }
    }
    return null;
}
Also used : GenericMetadata(org.apache.aries.util.manifest.ManifestHeaderProcessor.GenericMetadata) Filter(org.osgi.framework.Filter) Hashtable(java.util.Hashtable)

Example 3 with GenericMetadata

use of org.apache.aries.util.manifest.ManifestHeaderProcessor.GenericMetadata in project aries by apache.

the class ProviderBundleTrackerCustomizer method findServiceRegistrationProperties.

// null means don't register,
// otherwise the return value should be taken as the service registration properties
private Hashtable<String, Object> findServiceRegistrationProperties(Dictionary<?, ?> headers, String spiName, String implName) {
    Object capabilityHeader = headers.get(SpiFlyConstants.PROVIDE_CAPABILITY);
    if (capabilityHeader == null)
        return null;
    List<GenericMetadata> capabilities = ManifestHeaderProcessor.parseCapabilityString(capabilityHeader.toString());
    GenericMetadata cap = findCapability(capabilities, SpiFlyConstants.SERVICELOADER_CAPABILITY_NAMESPACE, spiName);
    Hashtable<String, Object> properties = new Hashtable<String, Object>();
    if (cap != null) {
        for (Map.Entry<String, Object> entry : cap.getAttributes().entrySet()) {
            if (SpiFlyConstants.SERVICELOADER_CAPABILITY_NAMESPACE.equals(entry.getKey()))
                continue;
            if (!entry.getKey().startsWith("."))
                properties.put(entry.getKey(), entry.getValue());
        }
    }
    String registerDirective = cap.getDirectives().get(SpiFlyConstants.REGISTER_DIRECTIVE);
    if (registerDirective == null) {
        return properties;
    } else {
        if ("".equals(registerDirective.trim()))
            return null;
        if (implName.equals(registerDirective.trim()))
            return properties;
    }
    return null;
}
Also used : GenericMetadata(org.apache.aries.util.manifest.ManifestHeaderProcessor.GenericMetadata) Hashtable(java.util.Hashtable) HashMap(java.util.HashMap) Map(java.util.Map)

Example 4 with GenericMetadata

use of org.apache.aries.util.manifest.ManifestHeaderProcessor.GenericMetadata in project aries by apache.

the class ConsumerHeaderProcessor method findRequirement.

private static GenericMetadata findRequirement(List<GenericMetadata> requirements, String namespace, String type) throws InvalidSyntaxException {
    Dictionary<String, String> nsAttr = new Hashtable<String, String>();
    nsAttr.put(namespace, type);
    for (GenericMetadata req : requirements) {
        if (namespace.equals(req.getNamespace())) {
            String filterString = req.getDirectives().get(SpiFlyConstants.FILTER_DIRECTIVE);
            if (filterString != null) {
                Filter filter = FrameworkUtil.createFilter(filterString);
                if (filter.match(nsAttr)) {
                    return req;
                }
            }
        }
    }
    return null;
}
Also used : GenericMetadata(org.apache.aries.util.manifest.ManifestHeaderProcessor.GenericMetadata) Filter(org.osgi.framework.Filter) Hashtable(java.util.Hashtable)

Example 5 with GenericMetadata

use of org.apache.aries.util.manifest.ManifestHeaderProcessor.GenericMetadata in project aries by apache.

the class ProviderBundleTrackerCustomizer method readServiceLoaderMediatorCapabilityMetadata.

// An empty list returned means 'all SPIs'
// A return value of null means no SPIs
// A populated list means: only these SPIs
private List<String> readServiceLoaderMediatorCapabilityMetadata(Bundle bundle, Map<String, Object> customAttributes) throws InvalidSyntaxException {
    String requirementHeader = getHeaderFromBundleOrFragment(bundle, SpiFlyConstants.REQUIRE_CAPABILITY, SpiFlyConstants.SERVICELOADER_CAPABILITY_NAMESPACE);
    if (requirementHeader == null)
        return null;
    List<GenericMetadata> requirements = ManifestHeaderProcessor.parseRequirementString(requirementHeader);
    GenericMetadata extenderRequirement = findRequirement(requirements, SpiFlyConstants.EXTENDER_CAPABILITY_NAMESPACE, SpiFlyConstants.REGISTRAR_EXTENDER_NAME);
    if (extenderRequirement == null)
        return null;
    List<GenericMetadata> capabilities;
    String capabilityHeader = getHeaderFromBundleOrFragment(bundle, SpiFlyConstants.PROVIDE_CAPABILITY, SpiFlyConstants.SERVICELOADER_CAPABILITY_NAMESPACE);
    if (capabilityHeader == null) {
        capabilities = Collections.emptyList();
    } else {
        capabilities = ManifestHeaderProcessor.parseCapabilityString(capabilityHeader);
    }
    List<String> serviceNames = new ArrayList<String>();
    for (GenericMetadata serviceLoaderCapability : findAllMetadata(capabilities, SpiFlyConstants.SERVICELOADER_CAPABILITY_NAMESPACE)) {
        for (Map.Entry<String, Object> entry : serviceLoaderCapability.getAttributes().entrySet()) {
            if (SpiFlyConstants.SERVICELOADER_CAPABILITY_NAMESPACE.equals(entry.getKey())) {
                serviceNames.add(entry.getValue().toString());
                continue;
            }
            customAttributes.put(entry.getKey(), entry.getValue());
        }
    }
    return serviceNames;
}
Also used : GenericMetadata(org.apache.aries.util.manifest.ManifestHeaderProcessor.GenericMetadata) ArrayList(java.util.ArrayList) HashMap(java.util.HashMap) Map(java.util.Map)

Aggregations

GenericMetadata (org.apache.aries.util.manifest.ManifestHeaderProcessor.GenericMetadata)6 Hashtable (java.util.Hashtable)3 Filter (org.osgi.framework.Filter)3 ArrayList (java.util.ArrayList)2 HashMap (java.util.HashMap)2 Map (java.util.Map)2 HashSet (java.util.HashSet)1