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;
}
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;
}
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;
}
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;
}
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;
}