Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
79f5189
Parse ServiceLoader provider files per specification
wilx Aug 6, 2026
358bc16
Use resolved wiring for ServiceLoader mediation
wilx Aug 6, 2026
f485044
Register each ServiceLoader capability decoration
wilx Aug 6, 2026
bbf1d85
Use bundle-scoped ServiceLoader provider factories
wilx Aug 6, 2026
2a2b3ef
Enforce provider REGISTER permission
wilx Aug 6, 2026
756d2f8
Reprocess dynamically attached ServiceLoader fragments
wilx Aug 6, 2026
106488f
Close mediated ServiceLoader provider views
wilx Aug 6, 2026
8720de5
Enforce ServiceLoader permissions at provisioning time
wilx Aug 6, 2026
ca9f955
Refresh consumers after late processor fragments
wilx Aug 6, 2026
75bbdd8
Make static mediation offline-only
wilx Aug 6, 2026
c01d020
Mediate all ServiceLoader entry points
wilx Aug 6, 2026
b865d87
Honor declared ServiceLoader requirements
wilx Aug 6, 2026
1f6ac35
Bind providers to local advertisements
wilx Aug 6, 2026
527d92d
Refresh consumers after late mediator start
wilx Aug 6, 2026
c26c7ae
Mediate indirect ServiceLoader calls
wilx Aug 7, 2026
81f4411
Bind provider discovery to effective wiring
wilx Aug 7, 2026
90e2173
Close ServiceLoader views with the mediator
wilx Aug 7, 2026
3a2c9fe
Refresh consumers after provider stops
wilx Aug 7, 2026
3ff096f
Stabilize fragment refresh integration test
wilx Aug 8, 2026
6244c05
Select complete provider bundles
wilx Aug 8, 2026
b55df50
Discover providers from exact bundle content
wilx Aug 8, 2026
67a4a10
Recover revision-ambiguous provider URLs
wilx Aug 8, 2026
16acb1d
Keep provider advertisements revision-local
wilx Aug 8, 2026
e1c1578
Reconstruct the effective provider bundle class path
wilx Aug 8, 2026
920d233
Honor empty Bundle-ClassPath directory shadowing
wilx Aug 9, 2026
4e76926
Honor unusable Bundle-ClassPath first matches
wilx Aug 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@
package org.apache.aries.spifly;

import org.osgi.framework.Bundle;
import org.osgi.framework.BundleEvent;
import org.osgi.framework.BundleEvent;
import org.osgi.framework.wiring.BundleRevision;
import org.osgi.util.tracker.BundleTrackerCustomizer;

public class ConsumerBundleTrackerCustomizer implements BundleTrackerCustomizer {
Expand All @@ -31,24 +32,31 @@ public ConsumerBundleTrackerCustomizer(BaseActivator baseActivator, String consu
headerName = consumerHeaderName;
}

@Override
public Object addingBundle(Bundle bundle, BundleEvent event) {
try {
activator.addConsumerWeavingData(bundle, headerName);
@Override
public Object addingBundle(Bundle bundle, BundleEvent event) {
try {
BundleRevision revision = bundle.adapt(BundleRevision.class);
if (revision != null
&& (revision.getTypes() & BundleRevision.TYPE_FRAGMENT) != 0) {
activator.fragmentAttached(bundle, headerName);
return bundle;
}
activator.addConsumerWeavingData(bundle, headerName);
} catch (Exception e) {
throw new RuntimeException(e);
}
return bundle;
}

@Override
public void modifiedBundle(Bundle bundle, BundleEvent event, Object object) {
removedBundle(bundle, event, object);
addingBundle(bundle, event);
}
@Override
public void modifiedBundle(Bundle bundle, BundleEvent event, Object object) {
activator.removeWeavingData(bundle);
addingBundle(bundle, event);
}

@Override
public void removedBundle(Bundle bundle, BundleEvent event, Object object) {
activator.removeWeavingData(bundle);
}
}
public void removedBundle(Bundle bundle, BundleEvent event, Object object) {
activator.removeWeavingData(bundle);
activator.forgetConsumerProviderUses(bundle);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,10 @@
*/
package org.apache.aries.spifly;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Dictionary;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Dictionary;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.List;
Expand Down Expand Up @@ -177,15 +178,21 @@ public static Set<WeavingData> processHeader(String consumerHeaderName, String c

weavingData.add(createWeavingData(className, methodName, methodRestriction, allowedBundles));

if (serviceLoader) {
className = ServiceLoader.class.getName();
methodName = "load";
if (serviceLoader) {
className = ServiceLoader.class.getName();
methodName = "load";
ArgRestrictions argRestrictions = new ArgRestrictions();
argRestrictions.addRestriction(0, Class.class.getName());
argRestrictions.addRestriction(1, ClassLoader.class.getName());
methodRestriction = new MethodRestriction(methodName, argRestrictions);
weavingData.add(createWeavingData(className, methodName, methodRestriction, allowedBundles));
}
methodRestriction = new MethodRestriction(methodName, argRestrictions);
weavingData.add(createWeavingData(className, methodName, methodRestriction, allowedBundles));

methodName = "loadInstalled";
argRestrictions = new ArgRestrictions();
argRestrictions.addRestriction(0, Class.class.getName());
methodRestriction = new MethodRestriction(methodName, argRestrictions);
weavingData.add(createWeavingData(className, methodName, methodRestriction, allowedBundles));
}
}
return weavingData;
}
Expand All @@ -197,8 +204,8 @@ private static Set<WeavingData> processRequireCapabilityHeader(String consumerHe
Entry<String, ? extends Map<String, String>> extenderRequirement = findRequirement(requirements, SpiFlyConstants.EXTENDER_CAPABILITY_NAMESPACE, SpiFlyConstants.PROCESSOR_EXTENDER_NAME);
Collection<Entry<String, ? extends Map<String, String>>> serviceLoaderRequirements = findAllMetadata(requirements, SpiFlyConstants.SERVICELOADER_CAPABILITY_NAMESPACE);

if (extenderRequirement != null) {
List<BundleDescriptor> allowedBundles = new ArrayList<BundleDescriptor>();
if (extenderRequirement != null) {
List<BundleDescriptor> allowedBundles = new ArrayList<BundleDescriptor>();
for (Entry<String, ? extends Map<String, String>> req : serviceLoaderRequirements) {
String slFilterString = req.getValue().get(SpiFlyConstants.FILTER_DIRECTIVE);
if (slFilterString != null) {
Expand All @@ -207,26 +214,47 @@ private static Set<WeavingData> processRequireCapabilityHeader(String consumerHe
}
}

// ServiceLoader.load(Class)
{
ArgRestrictions ar = new ArgRestrictions();
ar.addRestriction(0, Class.class.getName());
MethodRestriction mr = new MethodRestriction("load", ar);
weavingData.add(createWeavingData(ServiceLoader.class.getName(), "load", mr, allowedBundles));
}

// ServiceLoader.load(Class, ClassLoader)
{
ArgRestrictions ar = new ArgRestrictions();
ar.addRestriction(0, Class.class.getName());
ar.addRestriction(1, ClassLoader.class.getName());
MethodRestriction mr = new MethodRestriction("load", ar);
weavingData.add(createWeavingData(ServiceLoader.class.getName(), "load", mr, allowedBundles));
}
}

return weavingData;
}
weavingData.addAll(createServiceLoaderWeavingData(allowedBundles));
}

return weavingData;
}

static Set<WeavingData> createServiceLoaderWeavingData() {
return createServiceLoaderWeavingData(Collections.<BundleDescriptor>emptyList());
}

private static Set<WeavingData> createServiceLoaderWeavingData(List<BundleDescriptor> allowedBundles) {
Set<WeavingData> weavingData = new HashSet<WeavingData>();

// ServiceLoader.load(Class)
{
ArgRestrictions ar = new ArgRestrictions();
ar.addRestriction(0, Class.class.getName());
MethodRestriction mr = new MethodRestriction("load", ar);
weavingData.add(createWeavingData(ServiceLoader.class.getName(), "load", mr, allowedBundles));
}

// ServiceLoader.load(Class, ClassLoader)
{
ArgRestrictions ar = new ArgRestrictions();
ar.addRestriction(0, Class.class.getName());
ar.addRestriction(1, ClassLoader.class.getName());
MethodRestriction mr = new MethodRestriction("load", ar);
weavingData.add(createWeavingData(ServiceLoader.class.getName(), "load", mr, allowedBundles));
}

// ServiceLoader.loadInstalled(Class)
{
ArgRestrictions ar = new ArgRestrictions();
ar.addRestriction(0, Class.class.getName());
MethodRestriction mr = new MethodRestriction("loadInstalled", ar);
weavingData.add(createWeavingData(
ServiceLoader.class.getName(), "loadInstalled", mr, allowedBundles));
}

return weavingData;
}

private static WeavingData createWeavingData(String className, String methodName,
MethodRestriction methodRestriction, List<BundleDescriptor> allowedBundles) {
Expand Down
Loading